Compare commits

...

467 Commits

Author SHA1 Message Date
Anoop M D
28d781a52d chore: bump release version 2024-01-30 00:17:49 +05:30
Anoop M D
3843cf8ee3 fix: fixed prettier issue 2024-01-30 00:05:55 +05:30
Anoop M D
34ede8a33f fix: fixed lint issues 2024-01-29 23:59:55 +05:30
Julian Silden Langlo
0e24efbd88 Include the filename of a bruno request in the results. (#1164) 2024-01-29 23:49:32 +05:30
Jeff Edmondson
555387598a Feature: Add an optional param to cli to only run requests that have tests (#1314)
* Add an optional param to cli to only run requests that have tests

* Added to recrusive run

* added asserts to test only flag

---------

Co-authored-by: Anoop M D <anoop.md1421@gmail.com>
2024-01-29 23:36:24 +05:30
Adarsh Lilha
0dd8154d8b add query param even when value is missing (#1370) 2024-01-29 23:34:35 +05:30
Anton Ödman
467e63d6fa feat: correctly format json when importing from curl (#1472) 2024-01-29 23:29:31 +05:30
Rafael X
d999366a16 docs: Make german and spanish readme link to the same set of languages as the english readme (#1250)
* docs: Fix links in german readme

* docs: Add links to the spanish readme
2024-01-29 20:26:41 +05:30
Tuyen Pham
acc646a05d feat: add response filter placeholder (#1293) 2024-01-29 20:25:36 +05:30
Romain Eggermont
969c44023f feat(#1352): add collection headers to introspection query (#1353)
Co-authored-by: Anoop M D <anoop.md1421@gmail.com>
2024-01-29 20:23:32 +05:30
mj-h
abeccbb182 [feat] Add option "--bail" to cli (#1390)
* add bail option to cli
* change --bail so that is also bails on request errors (e.g., ECONNREFUSED)
* update cli help regarding the ---bail option
---------

Co-authored-by: Martin Hoecker <martin.hoecker@sap.com>
2024-01-29 20:21:37 +05:30
CodeShakingSheep
c0b5136359 Update readme.md (#1407)
Add flatpak to installation package managers
2024-01-29 20:20:35 +05:30
Martin Sefcik
d31147961d fix(#1417): fixed selecting SOCKS4 proxy option (#1418) 2024-01-29 20:20:02 +05:30
Martin Sefcik
a077d65a3e fix(#1419): fixed ignored SSL verification and client certificates configuration when using SOCKS proxy (#1420) 2024-01-29 20:19:08 +05:30
Rinku Chaudhari
c3f6318d69 style: overflow of environment name fix (#1464) 2024-01-29 19:56:51 +05:30
Tuvix Shih
58dfdd8157 docs: add Traditional Chinese language docs (#1465) 2024-01-29 19:55:25 +05:30
Anoop M D
4917f24b7c fix(#1436): fixed inconsistent beheviour of res.getHeaders() api 2024-01-29 19:46:41 +05:30
Anoop M D
00e11e3177 fix: fixed ui module loading issue 2024-01-29 19:25:43 +05:30
Anoop M D
54d4a74355 fix: fixed failing test 2024-01-29 19:02:39 +05:30
Anoop M D
65b76b7281 fix: fixed github test workflow issues 2024-01-29 17:42:27 +05:30
Anoop M D
ad1b0950bc chore: updated package-lock 2024-01-29 17:31:06 +05:30
Anoop M D
775809f59e chore: updated package-lock 2024-01-29 17:29:21 +05:30
Anoop M D
7ba9b839da feat(#1460): use new interpolation lib in app, electron, cli 2024-01-29 17:17:24 +05:30
Anoop M D
c5986896d1 chore: added names in github tests workflow 2024-01-29 16:03:18 +05:30
Anoop M D
f5a1213e0f fix: fixed junit reporter issue 2024-01-29 14:03:31 +05:30
Anoop M D
de96076de7 fix: fixed tests workflow 2024-01-29 13:57:34 +05:30
Anoop M D
8ada457bfc fix: fixed tests workflow 2024-01-29 13:51:37 +05:30
Anoop M D
a7253f1579 fix: fixed tests workflow 2024-01-29 13:48:51 +05:30
Anoop M D
a0beefa9bc feat: added cli tests to testing github workflow 2024-01-29 13:45:25 +05:30
Anoop M D
1bc2c8d0a6 chore: deleted orphan package 2024-01-29 13:36:45 +05:30
Anoop M D
80806fef30 feat: bruno-tests package 2024-01-29 13:34:55 +05:30
Anoop M D
2a6bfabc30 pr(#1461): addressed review comments 2024-01-28 18:12:17 +05:30
Anoop M D
f2a187d5fe feat(#1460): string interpolation (#1461)
* feat(#1460): string interpolation

* chore: deleted file commited accidentally
2024-01-28 18:07:25 +05:30
Tathagata Chakraborty
aed1b41da6 fixed misspelling (global, collection) (#1299)
Co-authored-by: Tathagata Chakraborty <tathagata.chakraborty97@gmail.com>
2024-01-26 22:25:39 +05:30
Anoop M D
d8354dca14 chore(#1441): updated codemirrot hint: bru.setNextRequest(requestName) 2024-01-25 23:40:40 +05:30
Felipe Vidal
e375ffbed1 Added bru.setNextRequest into the hint words list (#1441) 2024-01-25 23:38:04 +05:30
Nelu Platonov
7de5bbbdf6 fix(#1143): Fix PR #971 - Use literal segments only for env/collection variables + Add to CLI (#1154)
* fix(#1143): Fix PR #971 - Add literal-segment notation in string only to variables that are not process env vars
* fix(#1143): Fix PR #971 - Add to CLI as well
* fix(#1143): Fix PR #971 - Use improved Regex after CR + add test case for escaped vars
2024-01-25 19:36:32 +05:30
Timon
dbb5e912eb fix(#1000): Convert too long numbers into String for collection vars (#1405) 2024-01-18 03:38:57 +05:30
Timon
4e34aba1ca fix(#263): Replace vm2 with fork of vm2 to fix security issues (#1400) 2024-01-17 04:01:00 +05:30
Rinku Chaudhari
b5fccef417 style: fix dark mode colors of golden edition modal (#1358) 2024-01-10 15:46:05 +05:30
Anoop M D
db9aeec498 feat: improved handling logic while closing unsaved tabs/requests 2024-01-09 22:12:40 +05:30
Anoop M D
3e627522b7 feat(#1162): warn if there are unsaved requests when quitting 2024-01-09 14:01:04 +05:30
Ricardo Silverio
85f24eec77 [Feature] Prompt user to save requests before exiting app (#1317)
* Starting quit flow and focusing in draft
* Finishing app if there is no draft to save
* Automatically opening request after creation through event queue
* Fix remove events from queue using pathname to find item
* Removing updateNextAction
* Listening via predicate
* Confirm close dialog toggle moved to store
* Draft operations as tab actions
* Complete quit flow
* Fixing close app/window hooks
* Breaking the chain when dismissing dialog
* Displaying request name in ConfirmRequestClose modal
* Added disableEscapeKey and disableCloseOnOutsideClick props to Modal (passed in ConfirmRequestClose)
* Removing logs
* Refactor
* listenerMiddleware module
* ipc events listeners names
* Update next action
* Helpful comments
* Eventually handle events to close request even if is no draft
* Request name in bold
2024-01-08 17:21:55 +05:30
Anoop M D
bdfcd78f3a chore: reorganized readme sections 2024-01-07 15:39:59 +05:30
Anoop M D
fce164001b chore: added golden edition signup form 2024-01-07 15:24:32 +05:30
Anoop M D
814d31e638 chore: bumped version to 1.6.1 2024-01-05 16:17:59 +05:30
Anoop M D
51d4dbd69b fix(#1214): fixed code mirror lint issues 2024-01-05 16:11:33 +05:30
Anoop M D
05cab18e18 fix(#1330): fixed graphql syntax highlighting issue 2024-01-05 14:52:29 +05:30
Anoop M D
fcc3a1e944 fix(#1329): fix code generation issue 2024-01-05 14:28:02 +05:30
Anoop M D
45395754bf chore: bumped version 2024-01-05 03:24:15 +05:30
Anoop M D
0db6103b69 feat: golden edition modal 2024-01-05 03:17:55 +05:30
Anoop M D
2608ec035e Merge pull request #1155 from BrandonGillis/feat/custom-ca-certificate
feat: add custom CA Certificate preference
2024-01-04 22:54:29 +05:30
Gustavo Fior
d0c25d46c9 fix #1208: add collection headers to code generated (#1316)
* fix collection headers in code generator
* remove logs
2024-01-04 13:55:13 +05:30
Doğukan Ürker
d62982d52d Wrong URL syntax and translation fixed for Turkish docs. (#1312)
* Wrong translation fixed.
* Wrong URL syntax fixed.
2024-01-03 21:37:41 +05:30
Anoop M D
2810c6758d Merge pull request #1304 from DogukanUrker/main
Turkish docs updated.
2024-01-03 15:34:53 +05:30
Anoop M D
3967859c51 chore: deleted unused vscode package as it is being tracked in a seperate repo 2024-01-03 00:17:14 +05:30
Doğukan Ürker
ef5df9e114 Update publishing_bn.md 2024-01-01 19:19:51 +03:00
Doğukan Ürker
75e19574ac Update publishing_fr.md 2024-01-01 19:19:47 +03:00
Doğukan Ürker
b15ad5ca71 Update publishing_pl.md 2024-01-01 19:19:44 +03:00
Doğukan Ürker
0bd3ba493f Update publishing_pt_br.md 2024-01-01 19:19:41 +03:00
Doğukan Ürker
d2d1994546 Update publishing_ro.md 2024-01-01 19:19:14 +03:00
Doğukan Ürker
e4ae0c0357 added other languages 2024-01-01 19:17:55 +03:00
Doğukan Ürker
52cec963a3 Update publishing_ro.md 2024-01-01 19:16:28 +03:00
Doğukan Ürker
f797c5d06b Update publishing_pl.md 2024-01-01 19:16:25 +03:00
Doğukan Ürker
65879c8994 Update publishing_fr.md 2024-01-01 19:16:23 +03:00
Doğukan Ürker
2e544183db Update publishing_bn.md 2024-01-01 19:16:21 +03:00
Doğukan Ürker
ceccddf7f1 Create publishing_tr.md 2024-01-01 19:14:40 +03:00
Doğukan Ürker
c1f5da1280 Update readme_tr.md 2024-01-01 19:11:44 +03:00
Doğukan Ürker
63aa3ded1c Update readme_tr.md 2024-01-01 19:11:06 +03:00
Doğukan Ürker
26c7d4f532 Update contributing_tr.md 2024-01-01 19:10:36 +03:00
Doğukan Ürker
b7b4453278 Update readme_tr.md 2024-01-01 19:00:01 +03:00
Doğukan Ürker
49a51d6028 Update readme_tr.md 2024-01-01 18:59:24 +03:00
Anoop M D
abb24c93c5 feat(#1303): toml parser for scripts and tests 2023-12-31 02:52:41 +05:30
Anoop M D
5ba2c98e1d feat(#1303): toml handle reserved header names 2023-12-30 21:53:37 +05:30
Anoop M D
bc01188c98 feat(#1303): toml handle duplicate headers 2023-12-30 21:27:15 +05:30
Anoop M D
1754ea9f59 feat(#1296): toml tests: different kinds of headers 2023-12-30 20:29:31 +05:30
Anoop M D
2aa073c69a feat(#1296): toml tests: simple header 2023-12-30 19:09:17 +05:30
Anoop M D
48ec87ec8c Merge branch 'main' of github.com:usebruno/bruno 2023-12-30 17:14:00 +05:30
Anoop M D
35b6f7bb0a feat(#1296): restructured toml json test setup 2023-12-30 17:13:15 +05:30
Anoop M D
fff0293600 Merge pull request #1282 from csbde/main
docs: add Simplified Chinese language docs translation
2023-12-29 23:48:33 +05:30
Anoop M D
41d0698a87 feat(#1296): toml stringify simple get request 2023-12-28 22:52:30 +05:30
Anoop M D
f7ea8c93a6 chore: updated .gitignore to ignore bun lock files 2023-12-28 21:15:00 +05:30
Anoop M D
83c9629820 chore: deleted bun lock file 2023-12-28 21:14:05 +05:30
Anoop M D
d6f6032c6f Merge pull request #1285 from nguyenbavinh-decathlon/bugfix/914_crash_app_when_set_env
fix(#914): Issue crash app when update environment variable
2023-12-27 21:26:28 +05:30
nguyenbavinh-decathlon
e49999bb56 Fix issue crash app when edit environment 2023-12-27 15:11:41 +07:00
Simon CHEN
8b92055413 docs: add Simplified Chinese language docs translation 2023-12-27 01:15:28 +08:00
Anoop M D
5ca7f6b7ad Merge branch 'main' of github.com:usebruno/bruno 2023-12-25 01:57:59 +05:30
Anoop M D
83f5763e01 Merge pull request #1263 from tobiasbrandstaedter/feature/font-preferences-collection-level
feat(#1224): use font preferences in collections
2023-12-25 01:57:28 +05:30
Anoop M D
4a5196c8f5 chore: updated package deps 2023-12-25 01:55:56 +05:30
Anoop M D
eba065aa7e Merge pull request #1272 from rsilvr/fix/runner-response-pane-height
[Fix] Runner response pane height
2023-12-25 01:51:12 +05:30
Anoop M D
10dc1d95b0 Merge pull request #1270 from quentinlegay/fix-typo-readme_fr
fix typo in readme fr
2023-12-24 16:31:04 +05:30
Ricardo Silverio
00c7b40593 Fix relative position 2023-12-23 22:04:30 -03:00
Quentin LEGAY
b0ee137277 fix typo in readme fr 2023-12-23 20:30:45 +01:00
Quentin LEGAY
887c65b0d8 fix typo in readme fr 2023-12-23 20:29:13 +01:00
Anoop M D
84905ed80f Merge pull request #1269 from DeJayDev/bug/gh-1268
bugfix: bump codemirror dep
2023-12-23 23:28:16 +05:30
Dj Isaac
1f4ab3b5bd bugfix: bump codemirror dep 2023-12-22 15:49:31 -06:00
Anoop M D
da983599ab Merge pull request #1266 from rsilvr/fix/confirm-close-typo
Fixed typo in modal
2023-12-22 12:41:36 +05:30
Ricardo Silverio
fe11e45703 Fixed typo in modal 2023-12-21 22:55:15 -03:00
tobiasbrandstaedter
a08fd7eb52 feat(#1224): use font preferences in collections 2023-12-21 20:29:30 +01:00
Anoop M D
d268b4786a Merge pull request #1243 from chrisnagel/feat/bruno-cli/commands/description
Update bruno-cli/options-description
2023-12-20 04:24:46 +05:30
Anoop M D
4b76bf85f4 Merge pull request #1213 from bpoulaindev/bugfix/delete_running_api
bugfix(#1210): prevent collection run mapping on deleted items
2023-12-20 00:28:44 +05:30
Anoop M D
ed6f91533b Merge pull request #1176 from bpoulaindev/bugfix/docs_links
bugfix(docs_links): open external URL in browser window, remove depre…
2023-12-20 00:23:02 +05:30
Chris Nagel
7899b04c40 Update bruno-cli/options-description
- Update of the options description due to the new available formats (json/junit)
2023-12-19 08:04:56 +01:00
Anoop M D
cdddf8af76 Merge branch 'main' of github.com:usebruno/bruno 2023-12-18 22:45:19 +05:30
Anoop M D
9e44c4a95f Merge pull request #952 from amstiel/feature/system-theme
feat(#731): support theme sync with system
2023-12-18 22:34:27 +05:30
Anoop M D
3982f9c3c3 chore: bumped version to v1.5.1 2023-12-18 17:38:19 +05:30
Anoop M D
46dda28c3a Merge pull request #1233 from gyunseo/bugfix/saving-and-opening-wsl2-fs
set the polling mode based on path type to resolve wsl2 file system issue.
2023-12-18 17:34:59 +05:30
Gyunseo Lee
9f6890b769 feat: set the polling mode based on path type 2023-12-18 17:56:12 +09:00
Anoop M D
eb340d4ace chore: updated bru cli changelog 2023-12-18 04:56:25 +05:30
Anoop M D
66f917ecec chore: bumped version to v1.5.0 2023-12-18 04:22:10 +05:30
Anoop M D
e3865d4710 Merge pull request #1187 from awinder/feature/junit-reporter
Feature/junit reporter
2023-12-18 04:05:37 +05:30
Anoop M D
983fb2c4fd fix(#1215): fixed issue where runner was not displaying test results 2023-12-18 03:58:40 +05:30
Anoop M D
cb6513c580 Merge pull request #1202 from akshat-khosya/feature/clone-collection
clone functionality in collection
2023-12-18 01:26:26 +05:30
Akshat Khosya
b8451d01ca removed promise from clone collection action 2023-12-16 23:19:17 +05:30
Akshat Khosya
a15a4e4a2d corrected typo error in comments 2023-12-16 13:18:52 +05:30
Akshat Khosya
cada4f201a removed try catch from clone collection 2023-12-16 13:16:03 +05:30
Akshat Khosya
93661bd0d2 handle dir of files, comments in code 2023-12-16 13:07:51 +05:30
Anoop M D
454e0e5260 Merge pull request #1227 from TheZalRevolt/main
doc: fixed typo on italian documentation
2023-12-16 00:59:39 +05:30
Andrew Winder
647a819051 remove extraneous import 2023-12-15 12:06:36 -05:00
Andrew Winder
99c2dd9030 test updates 2023-12-15 12:04:52 -05:00
Andrew Winder
ab37e53346 refactor for reporters directory 2023-12-15 12:04:41 -05:00
Riccardo Solazzi
8ace37848b Merge pull request #1 from TheZalRevolt/bugfix/it-readme-fix-typo
bugfix: fixed typo on italian readme
2023-12-15 16:28:33 +01:00
thezal
447f40053d bugfix: fixed typo on italian readme 2023-12-15 16:25:37 +01:00
Andrew
de530a889c adding request-level error reporting 2023-12-15 10:09:20 -05:00
Andrew
882341c35b remove duplicated test suite 2023-12-15 10:09:20 -05:00
Andrew
174f99f9fb test coverage for junit reporter 2023-12-15 10:09:20 -05:00
Andrew
2103ab20bf implements a reporter flag w/ junit reporter type 2023-12-15 10:09:20 -05:00
Andrew
f0e22cb5df adds xmlwriter dependency for writing junit files 2023-12-15 10:09:20 -05:00
Anoop M D
ee2295aec1 pr #1184: addressed review comments 2023-12-15 00:55:21 +05:30
Anoop M D
2d16e07747 Merge pull request #1184 from smebberson/feature/clear-response
You can now clear a response.
2023-12-15 00:47:02 +05:30
Anoop M D
a839d311dc Merge pull request #1206 from arnaduga/main
doc: updated French doc
2023-12-15 00:30:27 +05:30
Anoop M D
82bafd5268 chore: adjusted copy icon position in code generator 2023-12-15 00:29:01 +05:30
Anoop M D
fc09697404 Merge branch 'main' of github.com:usebruno/bruno 2023-12-15 00:22:45 +05:30
Anoop M D
ee2d7a187a Merge pull request #1200 from survivant/feature/-feature/1198-copy-to-clipboard-codegen-main
Add copy to clipboard icon
2023-12-15 00:20:13 +05:30
Sebastien Dionne
f8ff305cf4 And adding style to GenCode 2023-12-12 19:54:27 -05:00
Sebastien Dionne
c2c2ef6e2b Use tabler icon 2023-12-12 17:53:37 -05:00
Baptiste POULAIN
aa18f17fb9 bugfix(#1210): prevent mapping on deleted items 2023-12-12 15:37:34 +01:00
Arnaud
baeeeb2bb0 doc: updated French doc 2023-12-11 20:09:20 +01:00
Akshat Khosya
fff3e6d88a clone functionality in collection 2023-12-11 15:57:28 +05:30
Sebastien Dionne
7953863b9d forgot to commit package-lock.json 2023-12-10 15:20:47 -05:00
Sebastien Dionne
10183319c4 forgot to commit package-lock.json 2023-12-10 15:18:01 -05:00
Sebastien Dionne
89c5fc2f03 Add copy to clipboard icon 2023-12-10 15:12:04 -05:00
Anoop M D
8ddec6bf0c Merge pull request #1172 from Zomzog/1117_sort_env
fix(#1117): Sort env alphabetically
2023-12-09 19:13:04 +05:30
Baptiste Poulain
d257db27b8 Update packages/bruno-app/src/components/MarkDown/index.jsx
Co-authored-by: Timon <39559178+Its-treason@users.noreply.github.com>
2023-12-08 16:12:22 +01:00
Scott Mebberson
08935c64bb You can now clear a response. 2023-12-08 08:35:35 +10:30
Baptiste POULAIN
8e1d04f5c1 bugfix(docs_links): reverse tsx to jsx 2023-12-07 18:09:30 +01:00
Anoop M D
da3bd95add Merge pull request #1179 from CRAZy-Monk3Y/docs-fix
docs: Add Bengali publishing.md , refactor and clean Readme.md
2023-12-07 22:07:32 +05:30
Tathagata Chakraborty
cc89e34b4c fix for #1177 2023-12-07 20:29:29 +05:30
Baptiste POULAIN
56a456a9b6 bugfix(docs_links): open external URL in browser window, remove deprecated method in electron, refactor to index.tsx 2023-12-07 14:33:42 +01:00
Zomzog
eaa448306b fix(#1117): Sort env alphabetically 2023-12-07 12:00:37 +01:00
Anoop M D
9f8dba0fb2 Merge pull request #838 from Joschasa/feature/always-indent-json-in-queryresult
Feature/always indent json in queryresult
2023-12-07 01:01:11 +05:30
Anoop M D
784f63ca5b chore: updated deps 2023-12-07 00:57:45 +05:30
André Glüpker
77cdc2179d Merge branch 'main' into feature/always-indent-json-in-queryresult 2023-12-06 17:41:17 +01:00
Anoop M D
d749e4b848 Merge pull request #1159 from fgreinacher/docs/german-readme-improvements
docs: improve german readme
2023-12-06 15:49:33 +05:30
Florian Greinacher
bb729b5793 docs: improve german readme 2023-12-06 09:20:58 +01:00
Brandon Gillis
a60f351736 feat: add custom CA Certificate preference 2023-12-06 01:04:35 +01:00
Anoop M D
0d0c4166c1 chore: release bruno cli v1.2.0 2023-12-06 02:24:13 +05:30
Anoop M D
567744c2ce chore: bumped version to 1.4.0 2023-12-06 01:49:35 +05:30
Anoop M D
cb47b7be5f Merge pull request #1135 from jaktestowac/main
fix(#1134): images paths in polish readme
2023-12-06 01:43:48 +05:30
Anoop M D
3061507284 Merge pull request #619 from mj-h/feature/add-bru-setNextRequest
feat: bru.setNextRequest()
2023-12-06 01:37:44 +05:30
Anoop M D
d3bec5631e Merge pull request #1153 from grahamwhiteuk/match-protocolregex-with-axios
refactor: protocol regex matches axios
2023-12-05 23:32:54 +05:30
Graham White
98b45a2fd4 refactor: protocol regex matches axios
Since axios is used for requests, it makes sense to match the protocol parsing
with their code at
https://github.com/axios/axios/blob/main/lib/helpers/parseProtocol.js

Closes: #1152

Signed-off-by: Graham White <graham_alton@hotmail.com>
2023-12-05 17:22:56 +00:00
Anoop M D
dc39538d02 chore: release 1.3.2 2023-12-04 19:23:39 +05:30
Anoop M D
6d3a518043 Merge pull request #1136 from BrandonGillis/main
fix(#124): Improve localhost handling, add cache for ipv6 & ipv4 check
2023-12-04 19:21:13 +05:30
Brandon Gillis
e24b75e7d8 fix(#124): Improve localhost handling, add cache for ipv6 & ipv4 check 2023-12-04 13:36:32 +01:00
Anoop M D
318036a279 chore: bumped version to 1.3.1 2023-12-04 14:46:26 +05:30
Anoop M D
b482dd68a5 temporarily disabling fix related to pr #1114 2023-12-04 14:34:26 +05:30
jaktestowac.pl
1c83f5c885 fix: images path in readme 2023-12-04 08:54:37 +01:00
Anoop M D
e0969d6aab Merge pull request #1114 from BrandonGillis/main
fix(#124): resolve all *.localhost to localhost, and fix ipv6 issue
2023-12-04 12:36:12 +05:30
Anoop M D
07eee055d4 Merge pull request #1122 from maticrivo/fix/remove-console-log
fix: remove debug console.logs
2023-12-04 12:32:20 +05:30
Anoop M D
19efa2fd35 Merge pull request #1132 from flerouwu/bugfix/doc-editor-font
fix(web): documentation editor font not following preferences value
2023-12-04 10:45:16 +05:30
Flero
480f8cf877 fix(web): set documentation editor font to preferences value 2023-12-04 09:47:10 +10:30
Matias Crivolotti
9246bf4fcb fix: remove debug console.logs 2023-12-03 15:25:33 +02:00
Anoop M D
11d0bc01d2 Merge pull request #1115 from jaktestowac/main
docs(#1113): add polish translation
2023-12-03 13:43:18 +05:30
Brandon Gillis
06d62175bf Add support for ipv6 localhost & refactor *.localhost handling 2023-12-02 02:50:44 +01:00
Brandon Gillis
96d50ebd93 fix(#124): resolve all *.localhost to localhost 2023-12-01 23:51:01 +01:00
jaktestowac.pl
06ccbc8dc2 fix: highlighting language 2023-12-01 23:21:38 +01:00
jaktestowac.pl
cf329e58e7 fix: highlighting language 2023-12-01 23:20:10 +01:00
jaktestowac.pl
85d55393ef docs: add polish translation 2023-12-01 23:17:35 +01:00
jaktestowac.pl
f84933553f docs: add polish translation 2023-12-01 23:15:19 +01:00
Anoop M D
6632ae1dcb fix: dummy test to pass the build 2023-12-02 03:00:26 +05:30
Anoop M D
40406b96a2 fix: pass when no tests are found in spec file 2023-12-02 02:55:15 +05:30
Anoop M D
832810cacd chore: temporarily disabling failing test 2023-12-02 02:23:53 +05:30
Anoop M D
2c618cb08b chore: updated deps 2023-12-02 02:11:40 +05:30
Anoop M D
95197098af chore: updated documentation 2023-12-02 02:07:30 +05:30
Anoop M D
06893bf3c3 chore: bump version to 1.3.0 2023-12-02 01:55:34 +05:30
Anoop M D
861d76f7b7 chore: bump @usebruno/js to 0.9.3 2023-12-02 01:50:32 +05:30
Anoop M D
33f780fb76 fix(#295): bru.setEnvVar() should dynamically create a env var if not found 2023-12-02 01:45:55 +05:30
Anoop M D
bacb70ea7e feat(#931): relax var name strictness 2023-12-02 01:27:18 +05:30
Anoop M D
2aa876e526 Merge pull request #971 from nelup20/bugfix/964-env_var_dot_validation
fix(#964): Allow "." in variable names + make error message more consistent
2023-12-02 01:06:27 +05:30
Anoop M D
2240acb272 fix(#1042): fixed setCookie issue when cookie is not a string 2023-12-02 00:58:19 +05:30
Anoop M D
752d4ae79e feat(#1094): deleting all cookies for a domain 2023-12-02 00:49:46 +05:30
Anoop M D
32c8bf296a #968, #1023: support for disabling sending and storing of cookies 2023-12-01 23:56:19 +05:30
Anoop M D
ba994cb5a0 Merge pull request #1108 from and-rose/bugfix/nextAction-not-being-reset
fix(#1077): Fix params to updateNextAction
2023-12-01 23:03:37 +05:30
Androse
f4b27afb8d fix params to updateNextAction 2023-12-02 00:24:16 +10:00
Anoop M D
d23bd85cc6 Merge pull request #1102 from nelup20/feature/946-fix_prepend_after_interpolation_and_add_to_cli
feat(#946): Fix PR #1070 - Add feature to CLI & prepend after interpolation
2023-12-01 14:05:38 +05:30
Anoop M D
a1f2e9336d Merge branch 'main' into feature/946-fix_prepend_after_interpolation_and_add_to_cli 2023-12-01 14:04:40 +05:30
Anoop M D
d13b4d1a6b Merge pull request #1104 from nickheniser/feature/remove-tauri
Remove Tauri.
2023-12-01 14:00:55 +05:30
Anoop M D
161b5eed10 Merge pull request #1106 from Its-treason/bugfix/csp-posthog
Fix: Update CSP to allow posthog
2023-12-01 11:38:24 +05:30
Its-treason
41e922544c Fix: Update CSP to allow posthog 2023-11-30 19:36:15 +01:00
Nick Heniser
669a9fad69 Remove Tauri.
It seems Tauri will not be supported, so removing it.

See: https://github.com/usebruno/bruno/issues/20#issuecomment-1488185033

closes #1099
2023-11-30 11:29:25 -06:00
Nelu Platonov
3c5a8b32be feat(#946): Fix PR #1070 - Update package-lock.json 2023-11-30 15:48:37 +01:00
Nelu Platonov
d0f858681d feat(#946): Fix PR #1070 - Add feature to CLI & prepend 'http://' to URL after interpolation 2023-11-30 01:23:27 +01:00
Anoop M D
bb852c5f80 Merge pull request #995 from gianpo86/main
Update openapi-collection.js to change the order of the source for the operationName
2023-11-30 02:10:12 +05:30
Anoop M D
6c73362ff2 temporarily reverting pr #1070 2023-11-30 01:56:01 +05:30
Anoop M D
e307c12fc8 chore: updated package-lock.json 2023-11-30 00:29:29 +05:30
Anoop M D
b7e84f3623 Merge pull request #887 from Andreas-Schoenefeldt/bugfix/bug-884
#884: Made sure graphql variables are only parsed after interpolation
2023-11-30 00:22:08 +05:30
Anoop M D
8e78c1b4e4 Merge pull request #913 from Oryss/feature/jsonpath-filtering
[Feature] Add JSONPath response filtering
2023-11-30 00:19:07 +05:30
Anoop M D
64bdda6f90 Merge branch 'main' into feature/jsonpath-filtering 2023-11-30 00:18:45 +05:30
Anoop M D
a6a59ddbd7 Merge pull request #1028 from StonyTV/feature/clone-option-for-folders
feat(#1017) Added ability to clone a folder
2023-11-30 00:06:47 +05:30
Anoop M D
b715e917fe Merge pull request #1047 from n00o/bugfix/Digest_toUpperCase_Error
Fix(#1002): Digest Error
2023-11-30 00:00:36 +05:30
Anoop M D
78c5392675 Merge pull request #1052 from nelup20/docs/1051-add_romanian_translation_for_docs
docs(#1051): Add Romanian translation
2023-11-29 23:59:27 +05:30
Anoop M D
4e02f8ad45 Merge pull request #1070 from nelup20/feature/946-send_request_without_specifying_http
feat(#946): Send request even when protocol isn't specified in URL
2023-11-29 23:58:30 +05:30
Anoop M D
ffe4f7dba8 Merge pull request #1060 from ayndqy/feature/macos-style-icon
Update MacOS icon
2023-11-29 23:54:43 +05:30
Anoop M D
e31b601cef Merge pull request #1061 from Its-treason/bugfix/docs-table-styles
fix(RequestPane): Fix Mardown Table styling
2023-11-29 23:53:02 +05:30
Anoop M D
7d3d543f24 Merge pull request #1078 from nelup20/bugfix/1024-importing_from_a_insomnia_collection
fix(#1024): Fix validation error on GraphQL request when importing Insomnia collection
2023-11-29 23:51:09 +05:30
Anoop M D
8d372fcdbc Merge pull request #1086 from tech189/tech189-scoop-patch
docs: Add Scoop installation info to README
2023-11-29 23:49:04 +05:30
Anoop M D
d00e3479cb Merge pull request #1091 from bpoulaindev/feature/contributing_fr
feat(contributing_fr): fix translation errors and syntax within french contributing guidelines
2023-11-29 23:48:03 +05:30
Anoop M D
d7eca52473 Merge pull request #1090 from maticrivo/bugfix/generate-filter-disabled-params
fix(GenerateCode): filter out disabled query params
2023-11-29 22:42:38 +05:30
Baptiste POULAIN
cf767165e6 feat(contributing_fr): fix translation errors and syntax within french contributing guidelines 2023-11-29 11:35:56 +01:00
Matias Crivolotti
3bc774bf55 fix(CodeGenerate): filter out disabled query params 2023-11-29 11:01:53 +02:00
tech189
0d9b5451fe Add Scoop installation to README 2023-11-28 17:22:31 +00:00
Nelu Platonov
0fe657d0fc fix(#1024): Return "variables" as a string for Yup schema validation when there's an exception 2023-11-28 14:54:12 +01:00
Nelu Platonov
ce545724bd feat(#946): Use Regex to check if URL has protocol 2023-11-28 13:39:55 +01:00
Nelu Platonov
2b08468581 feat(#946): Prepend 'http://' to URL if no protocol is specified 2023-11-27 22:13:28 +01:00
Anoop M D
0e320535a8 Merge pull request #1062 from n00o/feature/JSON_Handle_Variables
Fix (#1038): Handle unquoted variables in JSON Lint
2023-11-27 16:57:46 +05:30
n00o
746c5e825e Fix (#1038): Handle unquoted variables in JSON Lint
Convert unquoted variables in JSON body to 1 in JSON linter. This allows for putting multiple environment/collection variables next to each other and still be unquoted.
2023-11-26 16:57:31 -05:00
Its-treason
6a55a8d6ea fix(RequestPane): Fix Mardown Table styling 2023-11-26 22:41:30 +01:00
ayndqy
8a48797e00 Update MacOS icon 2023-11-26 20:06:34 +00:00
Anoop M D
fad71e936c Merge pull request #1055 from adarshlilha/bugfix/boolean-falsy-response-missing
fix(#1035): fix falsy check of response
2023-11-26 13:14:27 +05:30
Anoop M D
61f3e64751 Merge pull request #1057 from n00o/JSON_Linting_Comments
Fix (#1008) by removing comments from JSON linter.
2023-11-26 13:10:00 +05:30
n00o
fc6ba4641a Add Ability to ignore comments in JSON body
Replace comments with spaces for the JSON linter.
2023-11-26 02:05:11 -05:00
StonyTV
e7d2aa3599 Merge branch 'feature/clone-option-for-folders' of https://github.com/StonyTV/bruno into feature/clone-option-for-folders 2023-11-25 23:39:20 +01:00
StonyTV
aa1cef9e70 Fixed an oversight when cloning from the parent 2023-11-25 23:36:52 +01:00
Anoop M D
3b77cfb8d6 Merge pull request #1054 from shourav9884/feature/response-time-in-response
feat(#1050): Response time in res
2023-11-25 23:22:57 +05:30
Adarsh Lilha
fb8277f03e fix falsy check of response 2023-11-25 14:20:27 +05:30
Shourav Nath
fa7afd4237 feat(#1050): Response time in res 2023-11-25 13:00:59 +06:00
Nelu Platonov
2b19ef0c2d docs(#1051): Add Romanian translation 2023-11-25 00:23:35 +01:00
Anoop M D
f0d5cdecb7 chore: added github sponsors link 2023-11-24 15:53:43 +05:30
n00o
be58497ba9 Fix(#1002): Digest Error
This is to fix toUpperCase() error and uri path not being correct.
2023-11-24 04:39:25 -05:00
Jérôme Dathueyt
db1883536e Fixed an oversight when cloning from the parent 2023-11-22 21:40:28 +01:00
Jérôme Dathueyt
c018bfc044 Removed unused import 2023-11-22 21:14:37 +01:00
Jérôme Dathueyt
379697a02d Remove missing argument & moving parseCollectionItems 2023-11-22 21:12:26 +01:00
Jérôme Dathueyt
c62f96c96e New clone option for folders 2023-11-22 20:57:11 +01:00
Anoop M D
e1e0696e3c revert: chore: pr #993 review 2023-11-23 00:34:44 +05:30
Anoop M D
98ea1aa548 Merge pull request #1016 from StonyTV/feature/new-run-item-action-in-sidebar
feat(#1017) Added ability to run a single request from sidebar
2023-11-22 23:07:59 +05:30
Anoop M D
553d1c062e chore: pr #993 review 2023-11-22 22:42:45 +05:30
Anoop M D
2ec343a95b Merge pull request #993 from Jofresh/feature/handle-import-postman-folder-same-name
feat: handle postman import with same folder names (#955)
2023-11-22 22:30:36 +05:30
Anoop M D
2ddf79ed3f Merge pull request #1014 from therealrinku/feat/response_header_count
feat: added response headers count
2023-11-22 22:23:11 +05:30
Anoop M D
ef98eb707c Merge pull request #1015 from rbideau/bugfix/silently-ignore-invalid-cookie
fix(#1012): silently ignore invalid cookie
2023-11-22 22:10:18 +05:30
Jérôme Dathueyt
fd1e8f6aa8 Added missing import 2023-11-22 09:05:23 +01:00
Jérôme Dathueyt
738c6af797 Added ability to run a single item 2023-11-22 08:49:37 +01:00
therealrinku
4c83dff96c feat: added response headers count 2023-11-22 08:50:30 +05:45
r.bideau
531426b0a6 fix(1102): silently ignore invalid cookie 2023-11-21 20:59:51 +01:00
Gianluca
4d9549d2cc Update openapi-collection.js
Swap order for the source of the operationName when importing from openApi with a summary
2023-11-20 11:00:54 +01:00
Geoffray Gaborit
7980b726f6 feat: handle postman import with same folder names (#955) 2023-11-20 09:34:24 +01:00
Anoop M D
3f80a4dfa2 chore: bumped version to v1.2.0 2023-11-20 13:42:56 +05:30
Anoop M D
e1a96e0f23 feat(#968): cookie support 2023-11-20 13:41:47 +05:30
Andreas Schönefeldt
49be0b243b Merge branch 'main' into bugfix/bug-884 2023-11-19 21:45:11 +01:00
Anoop M D
9f535aeba7 feat(#989): show collection location inside collection settings 2023-11-19 15:06:13 +05:30
Anoop M D
bd71adebe0 chore(#718): collcetion presets pr review 2023-11-19 13:13:31 +05:30
Anoop M D
7367972d56 Merge pull request #718 from thehorse2000/feature/add-properties-to-collections
Added properties to collections
2023-11-19 12:23:24 +05:30
Anoop M D
f345155a94 Merge branch 'main' into feature/add-properties-to-collections 2023-11-19 12:21:48 +05:30
Anoop M D
8f4ce9c13b chore: added null check before trimming request url 2023-11-19 00:01:29 +05:30
Anoop M D
7a4d59d50c chore: updated package-lock 2023-11-18 10:46:39 +05:30
Anoop M D
a7e2f08efc Merge pull request #920 from adarshlilha/bugfix/environment-save-empty-secret
fix(#904): fix environment save when empty secret exists
2023-11-18 10:43:13 +05:30
Anoop M D
30a2eb5ee7 Merge pull request #925 from n00o/feature/CodeMirror_AutoComplete
feat (#861): Add Autocomplete + JSON/JavaScript Linting
2023-11-18 10:42:24 +05:30
Anoop M D
7b40432195 Merge pull request #916 from rickyl3aks/italianLang
feat: add italian readME translation, link and contributing
2023-11-18 10:21:48 +05:30
Anoop M D
699f6ba97d Merge branch 'main' into italianLang 2023-11-18 10:21:37 +05:30
Anoop M D
9486d0c829 Merge pull request #738 from PChaparro/docs/#735-spanish-translation
docs: Spanish translation of documentation files
2023-11-18 10:18:53 +05:30
Anoop M D
1f0370c422 Merge branch 'main' into docs/#735-spanish-translation 2023-11-18 10:18:37 +05:30
Anoop M D
10fb06eb97 Merge pull request #878 from CRAZy-Monk3Y/add-documentaion-bengali
docs: add Bengali translation
2023-11-18 10:17:14 +05:30
Anoop M D
a11247d359 Merge branch 'main' into add-documentaion-bengali 2023-11-18 10:17:07 +05:30
Anoop M D
61f70b3e6a Merge pull request #864 from szto/main
docs: add korean transation readme.md
2023-11-18 10:15:27 +05:30
Anoop M D
75bbb6d66a Merge branch 'main' into main 2023-11-18 10:15:14 +05:30
Anoop M D
11ce057310 Merge pull request #951 from mirkogolze/bugfix/correct-proxy-settings-evaluation
#937, #921 improve evaluation of proxy configuration, allow empty port
2023-11-18 09:34:43 +05:30
Anoop M D
42f6353ec8 Merge pull request #938 from adarshlilha/bugfix/code-generator-headers
fix(#901): fix headers in code generator
2023-11-18 09:32:19 +05:30
Anoop M D
3bd7bc75a8 Merge pull request #965 from Art051/bugfix/openapi-import-selfref-infinite-loop
Fix inifinite loop in openapi-spec import with self-references
2023-11-18 09:24:02 +05:30
Anoop M D
d2a99b0221 fix(#962): improved error label when name is not defined while setting env var 2023-11-18 09:18:40 +05:30
Anoop M D
4abb4009e6 Merge pull request #963 from mikaoelitiana/962-empty-vars
Improve error message when an empty var is set
2023-11-18 09:01:55 +05:30
Anoop M D
f8c23ed6da chore: save icon should use yellow color to indicate draft 2023-11-18 08:29:53 +05:30
Anoop M D
e96da632b2 chore: version bump @usebruno/js @usebruno/cli 2023-11-18 08:29:18 +05:30
Anoop M D
cef8094709 Merge pull request #972 from bennieboj/bugfix/961_trim_url
fix #961 by using trim
2023-11-18 08:26:20 +05:30
n00o
353386b4da Add dependencies 2023-11-17 09:18:14 -05:00
n00o
4f56506dac Merge branch 'main' into feature/CodeMirror_AutoComplete 2023-11-17 08:51:55 -05:00
Anoop M D
722fbdb474 Merge pull request #926 from Andreas-Schoenefeldt/feature/stackoverflow-tag
Added a hint of the stackoverflow tag to the readme
2023-11-17 09:29:50 +05:30
Anoop M D
ae689a8615 Merge pull request #982 from n00o/feature/PDF-Preview
feat(#970): Add PDF Preview
2023-11-17 08:10:44 +05:30
n00o
52baa69b70 Fix formatting
Pass prettier tests
2023-11-16 18:55:43 -05:00
n00o
b68e622695 feat(#970): Add PDF Preview
Any PDF response can be now be previewed. There is no UI fancy UI interface for it for simplicity. This makes it look very similar to Postman.
2023-11-16 18:19:25 -05:00
Nelu Platonov
005a936a61 fix(#964): Use const 2023-11-15 21:42:38 +01:00
Nelu Platonov
bad9d0a3ef fix(#964): Fix Handlebars interpolation when env var has "." in name 2023-11-15 20:29:40 +01:00
Bennieboj
fff6870002 fix #961 by using trim 2023-11-15 19:42:53 +01:00
Nelu Platonov
2ee6c5effc fix(#964): Allow "." in variable names + make error message more consistent 2023-11-15 16:27:14 +01:00
Andreas Schönefeldt
d3c854a9da Update readme.md
Co-authored-by: Jérémy Benoist <j0k3r@users.noreply.github.com>
2023-11-15 10:22:05 +01:00
Art051
f39d985877 Problem: Issue relates to OpenAPI specs which have self referencing components, resulting in infinite loops being made within resolveRefs.
Solution: Added basic use of Set to store already-traversed items within the OpenAPI spec.
Linked to personal use having import problems as well as this issue raised: https://github.com/usebruno/bruno/issues/939#issue-1986513743

Tested against the API Spec mentioned in the issue both as JSON and YAML.
2023-11-14 18:28:35 +00:00
Mika Andrianarijaona
500e3853a5 Improve error message when an empty var is set
Fixes #962
2023-11-14 16:33:27 +01:00
Alexey Kunitsky
1ee6b5f974 fix: wrap watcher into useEffect 2023-11-14 11:00:44 +01:00
Riccardo Consolandi
d76793e74d Merge branch 'main' into italianLang 2023-11-13 18:44:58 +01:00
mirkogolze
d17c2f8ebd Merge branch 'usebruno:main' into bugfix/correct-proxy-settings-evaluation 2023-11-12 21:42:19 +01:00
Mirko Golze
a5ce7e9c9c #937, #921 improve evaluation of proxy configuration, allow empty proxy port 2023-11-12 21:41:25 +01:00
Anoop M D
f617504cd6 Merge pull request #953 from MrLuje/fix/openapi-import
fix(openapi-import): root security should be optional
2023-11-12 23:56:19 +05:30
Andreas Schönefeldt
924bf1217f Merge branch 'main' into bugfix/bug-884 2023-11-12 16:53:16 +01:00
Anoop M D
0c51e77d6c Merge pull request #930 from notfounnd/main
feat: add portuguese brazilian docs translation
2023-11-12 20:19:49 +05:30
Alexey Kunitsky
8130de23ff feat: support auto theme change according to system 2023-11-11 20:44:44 +01:00
MrLuje
a0b2f80508 fix(openapi-import): spec security should be optional 2023-11-11 14:59:57 +00:00
Mirko Golze
e1a74d0652 #937, #921 improve evaluation of proxy configuration, allow empty proxy port 2023-11-10 21:20:30 +01:00
Riccardo Consolandi
a5523967f6 Merge branch 'usebruno:main' into main 2023-11-10 17:34:33 +01:00
Júnior Sbrissa
c3895d65e1 Merge branch 'usebruno:main' into main 2023-11-10 10:30:36 -03:00
n00o
8ed88d42c0 Fix Crashes and improve AutoComplete logic
Fix crash when autocomplete pops up and then is deleted. Fix autocomplete from appearing inside interpolation or strings. Fix JSON linting when its empty and not lint when mode is undefined (Code Generation). Improve tab to indent on full line or multiple lines selected.
2023-11-10 00:28:17 -05:00
Adarsh Lilha
043b80171e fix headers in code generator 2023-11-10 03:27:17 +05:30
Anoop M D
ba761098be chore(#827): bumped bruno cli version to 1.1.0 2023-11-09 16:12:33 +05:30
Boris Baskovec
7b9a4f457e Merge remote-tracking branch 'upstream/main' into feature/jsonpath-filtering 2023-11-09 10:01:36 +01:00
Anoop M D
3e137ac6b4 fix: fixed failing test 2023-11-09 13:47:33 +05:30
Anoop M D
a0196a01b3 chore: bumped release version 2023-11-09 13:39:24 +05:30
Anoop M D
aab591cb12 feat(#338): switch to curl mode if a curl cmd is pasted in new request modal 2023-11-09 13:20:07 +05:30
Júnior Sbrissa
07a9d4645f docs: review pt br translation and add reference links 2023-11-08 21:57:43 -03:00
Boris Baskovec
bab12d7894 Changes from review 2023-11-08 22:45:45 +01:00
Boris Baskovec
25af7a211a Merge branch 'main' into feature/jsonpath-filtering 2023-11-08 22:43:44 +01:00
Andreas Schönefeldt
86553464cc https://github.com/usebruno/bruno/discussions/865: Added ahint to the stackoverflow tag to teh readme 2023-11-08 22:19:09 +01:00
Júnior Sbrissa
35a4d46dc5 docs: add publishing pt br translation 2023-11-08 17:35:49 -03:00
Júnior Sbrissa
159f39dd18 docs: add contributing pt br translation 2023-11-08 17:22:26 -03:00
Júnior Sbrissa
50d8577298 docs: add readme pt br translation 2023-11-08 14:23:19 -03:00
n00o
af0d4d26bb Add Autocomplete + JSON/JavaScript Linting
Add JavaScript Autocomplete with all built-in Bruno functions. Add code linting markers for JSON and JavaScript CodeMirror sections. Add a few hotkeys to improve code editing.
2023-11-08 08:53:57 -05:00
Adarsh Lilha
435847081d make value field nullable 2023-11-08 15:47:46 +05:30
Riccardo Consolandi
b8f4236c1a feat: add italian readME translation, link and contributing 2023-11-07 22:51:46 +01:00
Anoop M D
ce91812ce5 feat(#338): curl parser based in curlconverter 2023-11-08 01:36:37 +05:30
Boris Baskovec
04aa921099 Add jsonpath response filtering 2023-11-07 13:35:48 +01:00
Anoop M D
08fbb91667 Merge pull request #903 from Its-treason/bugfix/csp
fix: Fix Content-Security-Policy config
2023-11-06 22:07:44 +05:30
Its-treason
5be12543e5 fix: Fix Content-Security-Policy config 2023-11-06 17:13:24 +01:00
Anoop M D
1e6c85eb01 Merge pull request #827 from martinsefcik/fix-axios-versions-inconsistency
fix (#759): fixed axios versions inconsistency
2023-11-06 21:16:58 +05:30
Andreas Schönefeldt
a3125605f3 #884: Made sure graphql variables are only parsed after interpolation 2023-11-04 21:50:55 +01:00
Tathagata Chakraborty
3ed86acb46 #876 fix- Bengali translation required 2023-11-03 22:30:00 +05:30
Anoop M D
8fb8eee5ef chore: bump version 1.1.0 2023-11-03 20:42:49 +05:30
Anoop M D
4a23e75dee Merge pull request #863 from mikaoelitiana/849-collection-item-dnd-hovered
feat: add class when collection name is hovered during drag and drop
2023-11-03 20:28:01 +05:30
Anoop M D
64923e47a2 Merge pull request #817 from drinkbird/feature/digestauth
Add Digest Auth Support #119
2023-11-03 20:26:24 +05:30
Anoop M D
0ce3deea86 Merge pull request #866 from Its-treason/bugfix/variable-name-validation
fix(#853): Allow - in variable names & small refactor
2023-11-03 20:25:31 +05:30
Anoop M D
56ac0eefb8 Merge pull request #873 from Oryss/add-vault-library
Add node-vault as an inbuilt library in script runtime
2023-11-03 20:24:36 +05:30
Boris Baskovec
fdb9b10353 Add node-vault library 2023-11-03 12:25:43 +01:00
Its-treason
44d90c42ed fix(#853): Allow - in variable names & small refactor 2023-11-02 18:17:21 +01:00
Anoop M D
9271c67d7f Merge branch 'main' of github.com:usebruno/bruno 2023-11-02 22:37:03 +05:30
Anoop M D
1f709c6faa chore: cli release 1.0.0 2023-11-02 22:36:48 +05:30
szto
741718ede6 feat: korean transation 2023-11-03 00:37:08 +09:00
Mika Andrianarijaona
c46fbfbde3 feat: add class when collection name is hovered during drag and drop
Resolves #849
2023-11-02 15:52:25 +01:00
Anoop M D
b633fc58d2 Merge pull request #857 from snippetkid/855-fix-yup-schema-validation
Address validation issue in Yup schema
2023-11-02 13:39:29 +05:30
Martin Hoecker
8183ce03c5 feat: bru.setNextRequest(null) breaks execution without error 2023-11-01 23:53:15 +01:00
Martin Hoecker
129d659628 Count the number of jumps to break out of infinite loops.
This is especially useful for the bru cli, to make sure that test-runners
that are accidentally stuck in an infinite loop still terminate in a
reasonable amount of time and don't hog up resources.
2023-11-01 23:15:54 +01:00
Martin Hoecker
db0de68987 Merge branch 'main' into feature/add-bru-setNextRequest 2023-11-01 22:59:39 +01:00
Dipin Jagadish
09d6bc8169 fix: address validation issue in schema 2023-11-01 18:36:39 +00:00
André Glüpker
631e436079 Revert "JSON in QueryResult should always be indented"
This reverts commit 76a26b634d.
2023-11-01 17:32:57 +01:00
André Glüpker
dc32d7246c Use the body to check for a json content type 2023-11-01 16:32:20 +01:00
Anoop M D
9cf8a584a0 chore: added foss 3.0 talk link 2023-11-01 18:25:25 +05:30
Anoop M D
cd9276f4d2 chore: added installation instructions 2023-11-01 18:23:27 +05:30
Anoop M D
87b34122c2 Merge pull request #616 from max-wittig/patch-1
docs(readme): add simple installation instructions
2023-11-01 18:18:14 +05:30
Anoop M D
0e0f04c5ad Merge pull request #840 from snippetkid/338-curl-to-request
Add new request from cURL command
2023-11-01 17:43:29 +05:30
Dipin Jagadish
dbd3ab6064 fix: validate curl command before submit 2023-11-01 10:58:07 +00:00
Anoop M D
e8f88d8a13 Merge pull request #832 from martinsefcik/bug/680
fix (#680): fixed non-string variables to be displayed correctly in code editor
2023-11-01 14:56:46 +05:30
Anoop M D
c1f5d474b1 Merge pull request #818 from DaPutzy/main
fix links and images in translated readme's
2023-11-01 14:55:33 +05:30
Anoop M D
c04b83bcaa Merge pull request #809 from mheidinger/fix-gql-schema-interpolation
fix graphql schema interpolation
2023-11-01 14:54:16 +05:30
Anoop M D
f8b5a48076 Merge pull request #831 from BandhiyaHardik/main
fix: In README.md in Stay in touch section the Twitter changed to it's new name 𝕏
2023-11-01 14:51:49 +05:30
Anoop M D
6fd84fcec3 Merge pull request #833 from n00o/bugfix/Adjust_Divider_Offset
fix (#402): response/body cursor offset on resize
2023-11-01 14:51:09 +05:30
Anoop M D
6687a20835 Merge pull request #834 from psqaure11/new
capitalize git to Git for clarity
2023-11-01 14:49:13 +05:30
Anoop M D
68a508e26a Merge pull request #844 from panda7789/bugfix/multipart-form
fix: Multipart Form
2023-11-01 14:48:35 +05:30
Anoop M D
05bf40fa82 chore: bumped version to 1.0.1 2023-11-01 14:38:33 +05:30
Anoop M D
49f29fa2af fix(#836): Fix graphql blank screen issue 2023-11-01 14:36:28 +05:30
Linhart Lukáš
89e0d3ae7e Fix Multipart Form 2023-11-01 07:05:05 +01:00
Dipin Jagadish
bbcab8d338 feat: add new request from curl feature 2023-10-31 19:32:31 +00:00
André Glüpker
76a26b634d JSON in QueryResult should always be indented
Some APIs return the wrong Content-Type 'application/html', but valid
JSON as payload. In this cases the data is still typeof object and a
indented JSON makes it easier to work with.

However JSON folding and highlighting will still be off in this case.
2023-10-31 11:58:09 +01:00
André Glüpker
820e3033ea Remove unused conditions in QueryResult
The mode is returned by getCodeMirrorModeBasedOnContentType(),
which always prefixes the returned values with 'application/'.

However returning data on those application/html or application/text
break Bruno.
2023-10-31 11:55:45 +01:00
unknown
2d4f337f03 capitalize git to Git for clarity 2023-10-31 09:49:38 +05:30
n00o
fb4ad848d6 Update index.js
Pass prettier test.
2023-10-30 20:59:40 -04:00
n00o
31ecc281a8 Fix response/body cursor offset on resize
Now response/body will be refresh each time it gets resized so the cursor always stays in the right place.
2023-10-30 20:10:36 -04:00
Martin Sefcik
745cb85f95 fix (#680): fixed defined non-string variables to be displayed correctly in code editor 2023-10-30 23:43:44 +01:00
HardikBandhiya
aac4a33c92 Update readme.md
changed Twitter's old name to new 𝕏
2023-10-31 01:59:43 +05:30
Anoop M D
32d9c4833e chore: bump version to 1.0.0 2023-10-30 23:33:29 +05:30
Martin Sefcik
ff63cea108 fix (#759): fixed axios versions inconsistency 2023-10-30 18:03:32 +01:00
DaPutzy
65f688dbc2 chrore: fix logo's in translated readme's 2023-10-29 13:49:44 +00:00
DaPutzy
3f6f4ccd12 chore: fix links and images in translated readme's 2023-10-29 13:04:11 +00:00
Anoop M D
fa8ec4267f Merge pull request #807 from vaugenwake/feature/import-graphql-collection
feat: Adding ability to import postman graphql collections
2023-10-29 11:40:39 +05:30
Tasos Piotopoulos
3838848b03 Add Digest Auth Support (MD5) 2023-10-29 02:36:34 +00:00
Pedro Andrés Chaparro Quintero
915b227ede docs: Fix broken images in Spanish readme 2023-10-28 10:26:22 -05:00
Pedro Andrés Chaparro Quintero
206098a216 Merge branch 'main' into docs/#735-spanish-translation 2023-10-28 10:20:16 -05:00
Vaugen Wakeling
99b25fc5b2 feat: Remove unneeded formatting 2023-10-27 17:21:16 +01:00
Max Heidinger
a0fe80604e fix: fix graphql schema interpolation 2023-10-27 14:59:09 +02:00
Anoop M D
7ac39bcf5c fix(#777): fixing snap issue 2023-10-27 16:18:49 +05:30
Vaugen Wakeling
5df9981e20 feat: Adding ability to import postman graphql collections
Fixes: #790
2023-10-27 00:34:16 +01:00
Anoop M D
03184fa1e8 Merge pull request #803 from Makar8000/postman-import-auth
feature/Auth support for postman collection imports
2023-10-27 03:15:12 +05:30
Brian Dentino
d76253ea04 Fixes for getNextRequest in UI 2023-10-26 22:46:35 +02:00
Martin Hoecker
4a1d45f458 Merge branch 'main' into feature/add-bru-setNextRequest 2023-10-26 22:34:05 +02:00
Makar
e4b2b651f5 Auth support for postman collection imports 2023-10-26 13:23:43 -05:00
Anoop M D
fd6b083ae5 chore: fixed broken links in documentation 2023-10-26 22:55:00 +05:30
Anoop M D
91d9e81da4 Merge pull request #788 from areebniyas/feature/restructure-folders
Restructure and merge documentation files
2023-10-26 22:27:56 +05:30
Anoop M D
1e435b8e10 Merge pull request #791 from Its-treason/feature/variable-name-validation
Enforce variable strictness & validation
2023-10-26 22:19:57 +05:30
Anoop M D
834014b5d1 Merge pull request #797 from mheidinger/local-gql-schema
feat: add loading local graphql schema file
2023-10-26 22:15:34 +05:30
Anoop M D
85b22b53aa Merge pull request #795 from DaPutzy/feature/additional-script-context-roots
[feature] allow multiple script context roots
2023-10-26 22:06:23 +05:30
Pedro Andrés Chaparro Quintero
769e48706d Merge branch 'main' into docs/#735-spanish-translation 2023-10-26 09:18:30 -05:00
Anoop M D
24f92d2b4e Merge pull request #794 from survivant/feature/add-comment-by-line
Fix the issue when only the first line was imported
2023-10-26 10:09:27 +05:30
Anoop M D
5f5ad288dc Merge pull request #796 from usebruno/revert-779-feature/close-tabs-with-mouse
Revert "Make Tabs closable by mouseclick. Closes #778"
2023-10-26 09:54:55 +05:30
Anoop M D
e274aedb9a Revert "Make Tabs closable by mouseclick. Closes #778" 2023-10-26 09:54:32 +05:30
DaPutzy
7fa68731d2 feat: allow multiple script context roots 2023-10-25 23:16:28 +00:00
Sebastien Dionne
c6440ab849 Fix import error 2023-10-25 17:54:04 -04:00
Its-treason
d52163ceb3 test: Fix failing test 'should parse the json file' 2023-10-25 23:30:31 +02:00
Its-treason
827df18c62 feat(#682): Add validation for request vars & dynamic vars 2023-10-25 23:13:37 +02:00
areebniyas
3c9e913349 merge development and contributing doc 2023-10-26 00:48:05 +05:30
Anoop M D
7f7b3f479a feat: nudge users to view docs on managing secrets 2023-10-26 00:38:44 +05:30
Its-treason
3a5a213242 Merge branch 'main' into feature/variable-name-validation 2023-10-25 21:00:18 +02:00
Anoop M D
1f0bde4a12 feat: nudge users how to disable ssl cert vaidation 2023-10-26 00:12:38 +05:30
Anoop M D
2e38300a67 chore: updated package lock file 2023-10-25 23:55:07 +05:30
Anoop M D
b731aa28be Merge pull request #763 from grubersjoe/feat(#762)/preferences
Add menu entry for preferences and add shortcut for it
2023-10-25 23:47:50 +05:30
Anoop M D
ddfd3bdf15 Merge pull request #757 from survivant/feature/cleanup-docs-typo
Fix some typo in documentation
2023-10-25 23:31:26 +05:30
Anoop M D
32b696da57 chore: pr #766 ux polish 2023-10-25 23:29:59 +05:30
Anoop M D
36f19ec7bc Merge pull request #766 from martinsefcik/feature/save-response-to-file
Added possibility to save response to file
2023-10-25 23:12:38 +05:30
Anoop M D
53e85f4568 chore: added styles to "ipcRenderer not found" error notification 2023-10-25 23:08:05 +05:30
Anoop M D
4607814c09 Merge pull request #768 from Its-treason/feat/dev-hints
feat(#740): Add hints for local bruno setup
2023-10-25 22:57:50 +05:30
Anoop M D
c40f8e654c Merge pull request #771 from n00o/feature/Tree-View
Add better CodeMirror folding options
2023-10-25 22:52:19 +05:30
Anoop M D
7fbd8f0a8a Merge pull request #779 from frixxx/feature/close-tabs-with-mouse
Make Tabs closable by mouseclick. Closes #778
2023-10-25 22:40:33 +05:30
Anoop M D
c5a47ba7ec Merge pull request #774 from jwetzell/main
fix cert/key loading in electron for relative path
2023-10-25 22:38:23 +05:30
Anoop M D
13a7e4538e Merge pull request #782 from arnaduga/feat/frenchDocTranslation
Feat/french doc translation
2023-10-25 22:35:10 +05:30
Arnaud
36443edca3 feat: fixes after review 2023-10-25 18:57:34 +02:00
Arnaud
5e94ea0e83 feat: fixes after review 2023-10-25 18:56:28 +02:00
Arnaud
fbeaa96419 feat: fixes after review 2023-10-25 18:51:51 +02:00
Arnaud
8e5234d76a feat: fixes after review 2023-10-25 18:50:06 +02:00
Arnaud
f4b9b53922 feat: update readme to get French link 2023-10-25 18:41:45 +02:00
Arnaud
3f1b4dc628 feat: add doc French translation 2023-10-25 18:38:50 +02:00
Matthias Vöpel
7cd46c3a6c Make Tabs closable by mouseclick.
Make Tabs closable by mouseclick.
2023-10-25 10:59:53 +02:00
Joel Wetzell
3300e67900 fix cert/key loading in electron for relative path 2023-10-24 18:24:52 -05:00
Martin Hoecker
3374db1ac8 Merge branch 'main' into feature/add-bru-setNextRequest 2023-10-24 22:38:44 +02:00
Sebastien Dionne
abd7edf1db Update publishing.md
Co-authored-by: mj-h <martinjhoecker@gmail.com>
2023-10-24 16:31:19 -04:00
Its-treason
7b1223d2c5 feat(#740): Add hints for local bruno setup
- Custom error when opening bruno in the browser
- Custom error when starting electron without the web server running
- Force Next dev server to use port 3000
2023-10-24 18:59:35 +02:00
n00o
a3e6ecddbb Add better CodeMirror folding options
Add XML fold to Response and Body. Add count of object directly inside of fold.  Include hotkeys Ctrl-Y to fold and Ctrl-I to unfold all XML/JSON data.
2023-10-24 11:21:47 -04:00
Martin Sefcik
276c9ce1b0 added possibility to save response to file 2023-10-24 17:08:43 +02:00
Jonathan Gruber
3687594cc4 feat(#762): Add menu entry for preferences and add shortcut fora it 2023-10-24 13:17:47 +02:00
Anoop M D
5274d77660 Merge pull request #758 from aviskase/main
[bugfix] fix OpenAPI method filtering predicate
2023-10-24 09:14:32 +05:30
Yuliya Bagriy
ba3db06ac6 fix prettier error 2023-10-24 09:16:30 +06:00
Yuliya Bagriy
2f9762da0e fix OpenAPI method filtering predicate 2023-10-24 08:02:21 +06:00
Sebastien Dionne
766d103e20 Fix some typo in documentation 2023-10-23 21:24:42 -04:00
Pedro Andrés Chaparro Quintero
c7fa5c5608 Merge branch 'main' into docs/#735-spanish-translation 2023-10-23 18:59:29 -05:00
Anoop M D
8f398bacb2 Merge pull request #748 from x0vr/feature/de-translations-for-docs
Add german translation to documentation files
2023-10-24 05:09:15 +05:30
Anoop M D
e0afbdbb74 chore: release v0.27.2 2023-10-24 03:53:31 +05:30
Anoop M D
d90cb91a19 Merge pull request #754 from survivant/feature/add-yaml-support-insomnia
[feature] Can import Insomnia Yaml file
2023-10-24 03:51:46 +05:30
Anoop M D
1026addc8f Merge pull request #745 from aviskase/main
OpenAPI import - filter out non-methods on path item objects parsing
2023-10-24 03:50:53 +05:30
Anoop M D
ecf849b207 Merge pull request #753 from survivant/feature/add-comment-by-line
Postman import : Each line will start by a comment
2023-10-24 03:49:51 +05:30
Anoop M D
98a87dcc00 Merge pull request #752 from jwetzell/main
fix: update @usebruno/js to a working version in bruno-electron
2023-10-24 03:48:33 +05:30
Sebastien Dionne
973f8e036d Can import Insomnia Yaml file 2023-10-23 17:32:04 -04:00
Sebastien Dionne
da9afcabe8 Each line will start by a comment 2023-10-23 17:21:52 -04:00
Joel Wetzell
177f23e19f update @usebruno/js version 2023-10-23 15:59:20 -05:00
x0v3rR
97b634f608 add further improvements 2023-10-23 21:43:12 +02:00
x0v3rR
c572ba574f improve translation 2023-10-23 21:31:48 +02:00
x0v3rR
84c8676804 fix some translations 2023-10-23 20:43:36 +02:00
Anoop M D
586e26fa2e Merge pull request #746 from flof/bugfix/misleading-collection-remove-message
fix misleading message
2023-10-24 00:08:14 +05:30
x0v3rR
83779dd2e1 add german translation 2023-10-23 20:33:50 +02:00
Yuliya Bagriy
e77a9adebd handle non-methods on OpenAPI import 2023-10-24 00:20:30 +06:00
Florian Fankhauser
e8156c5611 fix misleading message 2023-10-23 20:19:05 +02:00
Pedro Andrés Chaparro Quintero
9602f42a71 docs(i18n): Update link to Spanish translation of contributing file 2023-10-23 08:45:07 -05:00
Pedro Andrés Chaparro Quintero
3bfc966e10 docs(i18n): Add link to Spanish translation in readme files 2023-10-23 08:43:05 -05:00
Pedro Andrés Chaparro Quintero
d4b8caeedc docs(i18n): Translate development file to Spanish 2023-10-23 08:42:48 -05:00
Pedro Andrés Chaparro Quintero
fcaf3a8e85 docs(i18n): Add link to Spanish translation in contributing files 2023-10-23 08:32:27 -05:00
Pedro Andrés Chaparro Quintero
62295e7a23 docs(i18n): Translate contributing file to Spanish 2023-10-23 08:31:26 -05:00
Pedro Andrés Chaparro Quintero
5e5b00e487 docs(i18n): Add link to Spanish translation in readme files 2023-10-23 08:17:15 -05:00
Pedro Andrés Chaparro Quintero
36d0db43b2 docs(i18n): Translate readme file to Spanish 2023-10-23 08:16:38 -05:00
Max Heidinger
45126c99ab feat: add loading local graphql schema file 2023-10-23 11:22:21 +02:00
Amr osama
03460c592a Changed Presets Tab positioning 2023-10-23 11:13:27 +03:00
Amr osama
e658629482 removed custom ipc event 2023-10-23 11:11:31 +03:00
Its-treason
7267ba6485 feat(#682): Enforce environment variable strictness 2023-10-22 21:54:17 +02:00
Amr osama
cbfd7fa5f4 Added presets to collection settings 2023-10-22 15:32:27 +03:00
Amr osama
36d6d115d4 Added properties to collections 2023-10-21 20:51:13 +03:00
Martin Hoecker
d4c0207545 feat: bru.setNextRequest() 2023-10-16 17:29:26 +02:00
Max Wittig
4258e031c6 docs(readme): add simple installation instructions
Many people just want to know how to get it directly
from the Github readme
2023-10-16 14:05:44 +02:00
324 changed files with 13530 additions and 6812 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: helloanoop

View File

@@ -30,6 +30,7 @@ jobs:
run: |
npm run build:bruno-query
npm run build:graphql-docs
npm run build:web
npm run build:electron:snap
- name: Install Snapcraft

View File

@@ -1,11 +1,12 @@
name: Unit Tests
name: Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
tests:
unit-test:
name: Unit Tests
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
@@ -15,10 +16,16 @@ jobs:
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci --legacy-peer-deps
# build libraries
- name: Build libraries
run: |
npm run build --workspace=packages/bruno-common
npm run build --workspace=packages/bruno-query
# test
- name: Test Package bruno-query
run: npm run test --workspace=packages/bruno-query
- name: Build Package bruno-query
run: npm run build --workspace=packages/bruno-query
- name: Test Package bruno-lang
run: npm run test --workspace=packages/bruno-lang
- name: Test Package bruno-schema
@@ -27,12 +34,45 @@ jobs:
run: npm run test --workspace=packages/bruno-app
- name: Test Package bruno-js
run: npm run test --workspace=packages/bruno-js
- name: Test Package bruno-common
run: npm run test --workspace=packages/bruno-common
- name: Test Package bruno-cli
run: npm run test --workspace=packages/bruno-cli
- name: Test Package bruno-electron
run: npm run test --workspace=packages/bruno-electron
cli-test:
name: CLI Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci --legacy-peer-deps
- name: Build Libraries
run: |
npm run build --workspace=packages/bruno-query
npm run build --workspace=packages/bruno-common
- name: Run tests
run: |
cd packages/bruno-tests/collection
node ../../bruno-cli/bin/bru.js run --env Prod --output junit.xml --format junit
- name: Publish Test Report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: Test Report
path: packages/bruno-tests/collection/junit.xml
reporter: java-junit
prettier:
name: Prettier
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

2
.gitignore vendored
View File

@@ -6,6 +6,8 @@ yarn.lock
pnpm-lock.yaml
.pnp
.pnp.js
bun.lockb
bun.lock
# testing
coverage

View File

@@ -1,12 +1,13 @@
**English** | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md)
**English** | [Українська](docs/contributing/contributing_ua.md) | [Русский](docs/contributing/contributing_ru.md) | [Türkçe](docs/contributing/contributing_tr.md) | [Deutsch](docs/contributing/contributing_de.md) | [Français](docs/contributing/contributing_fr.md) | [Português (BR)](docs/contributing/contributing_pt_br.md) | [বাংলা](docs/contributing/contributing_bn.md) | [Español](docs/contributing/contributing_es.md) | [Română](docs/contributing/contributing_ro.md) | [Polski](docs/contributing/contributing_pl.md)
| [简体中文](docs/contributing/contributing_cn.md) | [正體中文](docs/contributing/contributing_zhtw.md)
## Lets make bruno better, together !!
## Let's make bruno better, together !!
I am happy that you are looking to improve bruno. Below are the guidelines to get started bringing up bruno on your computer.
We are happy that you are looking to improve bruno. Below are the guidelines to get started bringing up bruno on your computer.
### Technology Stack
Bruno is built using NextJs and React. We also use electron to ship a desktop version (that supports local collections)
Bruno is built using Next.js and React. We also use electron to ship a desktop version (that supports local collections)
Libraries we use
@@ -23,9 +24,58 @@ Libraries we use
You would need [Node v18.x or the latest LTS version](https://nodejs.org/en/) and npm 8.x. We use npm workspaces in the project
### Lets start coding
## Development
Please reference [development.md](docs/development.md) for instructions on running the local development environment.
Bruno is being developed as a desktop app. You need to load the app by running the Next.js app in one terminal and then run the electron app in another terminal.
### Dependencies
- NodeJS v18
### Local Development
```bash
# use nodejs 18 version
nvm use
# install deps
npm i --legacy-peer-deps
# build packages
npm run build:graphql-docs
npm run build:bruno-query
npm run build:bruno-common
# run next app (terminal 1)
npm run dev:web
# run electron app (terminal 2)
npm run dev:electron
```
### Troubleshooting
You might encounter a `Unsupported platform` error when you run `npm install`. To fix this, you will need to delete `node_modules` and `package-lock.json` and run `npm install`. This should install all the necessary packages needed to run the app.
```shell
# Delete node_modules in sub-directories
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Delete package-lock in sub-directories
find . -type f -name "package-lock.json" -delete
```
### Testing
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Raising Pull Request

View File

@@ -1,37 +0,0 @@
[English](/contributing.md) | [Українська](/contributing_ua.md) | **Русский** | [Türkçe](/contributing_tr.md)
## Давайте вместе сделаем Бруно лучше!!!
Я рад, что Вы хотите усовершенствовать bruno. Ниже приведены рекомендации по запуску bruno на вашем компьютере.
### Стек
Bruno построен с использованием NextJs и React. Мы также используем electron для поставки десктопной версии ( которая поддерживает локальные коллекции )
Библиотеки, которые мы используем
- CSS - Tailwind
- Редакторы кода - Codemirror
- Управление состоянием - Redux
- Иконки - Tabler Icons
- Формы - formik
- Валидация схем - Yup
- Запросы клиента - axios
- Наблюдатель за файловой системой - chokidar
### Зависимости
Вам потребуется [Node v18.x или последняя версия LTS](https://nodejs.org/en/) и npm 8.x. В проекте мы используем рабочие пространства npm
### Приступим к коду
Пожалуйста, обратитесь к [development_ru.md](docs/development_ru.md) для получения инструкций по запуску локальной среды разработки.
### Создание Pull Request
- Пожалуйста, пусть PR будет небольшим и сфокусированным на одной вещи
- Пожалуйста, соблюдайте формат создания веток
- feature/[название функции]: Эта ветка должна содержать изменения для конкретной функции
- Пример: feature/dark-mode
- bugfix/[название ошибки]: Эта ветка должна содержать только исправления для конкретной ошибки
- Пример bugfix/bug-1

View File

@@ -1,37 +0,0 @@
[English](/readme.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | **Türkçe**
## Bruno'yu birlikte daha iyi hale getirelim !!
Bruno'yu geliştirmek istemenizden mutluluk duyuyorum. Aşağıda, bruno'yu bilgisayarınıza getirmeye başlamak için yönergeler bulunmaktadır.
### Kullanılan Teknolojiler
Bruno, NextJs ve React kullanılarak oluşturulmuştur. Ayrıca bir masaüstü sürümü (yerel koleksiyonları destekleyen) göndermek için electron kullanıyoruz
Kullandığımız kütüphaneler
- CSS - Tailwind
- Kod Düzenleyiciler - Codemirror
- Durum Yönetimi - Redux
- Iconlar - Tabler Simgeleri
- Formlar - formik
- Şema Doğrulama - Yup
- İstek İstemcisi - axios
- Dosya Sistemi İzleyicisi - chokidar
### Bağımlılıklar
[Node v18.x veya en son LTS sürümüne](https://nodejs.org/en/) ve npm 8.x'e ihtiyacınız olacaktır. Projede npm çalışma alanlarını kullanıyoruz
### Kodlamaya başlayalım
Yerel geliştirme ortamının çalıştırılmasına ilişkin talimatlar için lütfen [development.md](docs/development.md) adresine başvurun.
### Pull Request Oluşturma
- Lütfen PR'ları küçük tutun ve tek bir şeye odaklanın
- Lütfen şube oluşturma formatını takip edin
- feature/[özellik adı]: Bu dal belirli bir özellik için değişiklikler içermelidir
- Örnek: feature/dark-mode
- bugfix/[hata adı]: Bu dal yalnızca belirli bir hata için hata düzeltmelerini içermelidir
- Örnek bugfix/bug-1

View File

@@ -1,37 +0,0 @@
[English](/contributing.md) | **Українська** | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md)
## Давайте зробимо Bruno краще, разом !!
Я дуже радий що Ви бажаєте покращити Bruno. Нижче наведені вказівки як розпочати розробку Bruno на Вашому комп'ютері.
### Стек технологій
Bruno побудований на NextJs та React. Також для десктопної версії (яка підтримує локальні колекції) використовується Electron
Бібліотеки, які ми використовуємо
- CSS - Tailwind
- Редактори коду - Codemirror
- Керування станом - Redux
- Іконки - Tabler Icons
- Форми - formik
- Валідація по схемі - Yup
- Клієнт запитів - axios
- Спостерігач за файловою системою - chokidar
### Залежності
Вам знадобиться [Node v18.x або остання LTS версія](https://nodejs.org/en/) та npm 8.x. Ми використовуєм npm workspaces в цьому проекті
### Починаєм писати код
Будь ласка, зверніться до [development_ua.md](docs/development_ua.md) за інструкціями щодо запуску локального середовища розробки.
### Створення Pull Request-ів
- Будь ласка, робіть PR-и маленькими і сфокусованими на одній речі
- Будь ласка, слідуйте формату назв гілок
- feature/[назва feature]: Така гілка має містити зміни лише щодо конкретної feature
- Приклад: feature/dark-mode
- bugfix/[назва баґу]: Така гілка має містити лише виправлення конкретного багу
- Приклад: bugfix/bug-1

View File

@@ -0,0 +1,87 @@
[English](/contributing.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | [Deutsch](docs/contributing/contributing_de.md) | [Français](/contributing_fr.md) | **বাংলা**
## আসুন ব্রুনোকে আরও ভালো করি, একসাথে!!
আমরা খুশি যে আপনি ব্রুনোর উন্নতি করতে চাইছেন। নীচে আপনার কম্পিউটারে ব্রুনো ইনষ্টল করার নির্দেশিকা রয়েছে৷।
### Technology Stack (প্রযুক্তি স্ট্যাক)
ব্রুনো Next.js এবং React ব্যবহার করে নির্মিত। এছাড়াও আমরা একটি ডেস্কটপ সংস্করণ পাঠাতে ইলেক্ট্রন ব্যবহার করি (যা স্থানীয় সংগ্রহ সমর্থন করে)
নিম্ন লিখিত লাইব্রেরি আমরা ব্যবহার করি -
- CSS - Tailwind
- Code Editors - Codemirror
- State Management - Redux
- Icons - Tabler Icons
- Forms - formik
- Schema Validation - Yup
- Request Client - axios
- Filesystem Watcher - chokidar
### Dependencies (নির্ভরতা)
আপনার প্রয়োজন হবে [নোড v18.x বা সর্বশেষ LTS সংস্করণ](https://nodejs.org/en/) এবং npm 8.x। আমরা প্রকল্পে npm ওয়ার্কস্পেস ব্যবহার করি ।
## Development
ব্রুনো একটি ডেস্কটপ অ্যাপ হিসেবে তৈরি করা হচ্ছে। আপনাকে একটি টার্মিনালে Next.js অ্যাপটি চালিয়ে অ্যাপটি লোড করতে হবে এবং তারপরে অন্য টার্মিনালে ইলেক্ট্রন অ্যাপটি চালাতে হবে।
### Dependencies (নির্ভরতা)
- NodeJS v18
### Local Development
```bash
# nodejs 18 সংস্করণ ব্যবহার করুন
nvm use
# নির্ভরতা ইনস্টল করুন
npm i --legacy-peer-deps
# গ্রাফকিউএল ডক্স তৈরি করুন
npm run build:graphql-docs
# ব্রুনো কোয়েরি তৈরি করুন
npm run build:bruno-query
# NextJs অ্যাপ চালান (টার্মিনাল 1)
npm run dev:web
# ইলেক্ট্রন অ্যাপ চালান (টার্মিনাল 2)
npm run dev:electron
```
### Troubleshooting (সমস্যা সমাধান)
আপনি যখন 'npm install' চালান তখন আপনি একটি 'অসমর্থিত প্ল্যাটফর্ম' ত্রুটির সম্মুখীন হতে পারেন৷ এটি ঠিক করতে, আপনাকে `node_modules` এবং `package-lock.json` মুছে ফেলতে হবে এবং `npm install` চালাতে হবে। এটি অ্যাপটি চালানোর জন্য প্রয়োজনীয় সমস্ত প্যাকেজ ইনস্টল করবে যাতে এই ত্রুটি ঠিক হয়ে যেতে পারে ।
```shell
# সাব-ডিরেক্টরিতে নোড_মডিউল মুছুন
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# সাব-ডিরেক্টরিতে প্যাকেজ-লক মুছুন
find . -type f -name "package-lock.json" -delete
```
### Testing (পরীক্ষা)
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Raising Pull Request (পুল অনুরোধ উত্থাপন)
- অনুগ্রহ করে PR এর আকার ছোট রাখুন এবং একটি বিষয়ে ফোকাস করুন।
- অনুগ্রহ করে শাখা তৈরির বিন্যাস অনুসরণ করুন।
- বৈশিষ্ট্য/[ফিচারের নাম]: এই শাখায় একটি নির্দিষ্ট বৈশিষ্ট্যের জন্য পরিবর্তন থাকতে হবে।
- উদাহরণ: বৈশিষ্ট্য/ডার্ক-মোড।
- বাগফিক্স/[বাগ নাম]: এই শাখায় একটি নির্দিষ্ট বাগ-এর জন্য শুধুমাত্র বাগ ফিক্স থাকা উচিত।
- উদাহরণ বাগফিক্স/বাগ-1।

View File

@@ -0,0 +1,90 @@
[English](/contributing.md) | [Українська](./contributing_ua.md) | [Русский](./contributing_ru.md) | [Türkçe](./contributing_tr.md) | [Deutsch](./contributing_de.md) | [Français](./contributing_fr.md) | [Português (BR)](./contributing_pt_br.md) | [বাংলা](./contributing_bn.md) | [Español](./contributing_es.md) | [Română](./contributing_ro.md) | [Polski](./contributing_pl.md) | **简体中文**
## 让我们一起改进 Bruno
很高兴看到您考虑改进 Bruno。以下是获取 Bruno 并在您的电脑上运行它的规则和指南。
### 使用的技术
Bruno 基于 NextJs 和 React 构建。我们使用 Electron 来封装桌面版本。
我们使用的库包括:
- CSS - Tailwind
- 代码编辑器 - Codemirror
- 状态管理 - Redux
- 图标 - Tabler Icons
- 表单 - formik
- 模式验证 - Yup
- 请求客户端 - axios
- 文件系统监视器 - chokidar
### 依赖项
您需要 [Node v18.x 或最新的 LTS 版本](https://nodejs.org/en/) 和 npm 8.x。我们在这个项目中也使用 npm 工作区_npm workspaces_
## 开发
Bruno 是作为一个 _client lourd重客户端_ 应用程序开发的。您需要在一个终端中启动 nextjs 来加载应用程序,然后在另一个终端中启动 Electron 应用程序。
### 依赖项
- NodeJS v18
### 本地开发
```bash
# 使用 node 版本 18
nvm use
# 安装依赖项
npm i --legacy-peer-deps
# 构建 graphql 文档
npm run build:graphql-docs
# 构建 bruno 查询
npm run build:bruno-query
# 启动 next终端 1
npm run dev:web
# 启动重客户端(终端 2
npm run dev:electron
```
### 故障排除
在运行 npm install 时,您可能会遇到 Unsupported platform 错误。为了解决这个问题,请删除 node_modules 目录和 package-lock.json 文件,然后再次运行 npm install。这应该会安装运行应用程序所需的所有包。
```shell
# 删除子目录中的 node_modules 目录
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# 删除子目录中的 package-lock.json 文件
find . -type f -name "package-lock.json" -delete
```
### 测试
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### 提交 Pull Request
- 请保持 PR 精简并专注于单一目标
- 请遵循分支命名格式:
- feature/[feature name]:该分支应包含特定功能
- 例如feature/dark-mode
- bugfix/[bug name]:该分支应仅包含特定 bug 的修复
- 例如bugfix/bug-1

View File

@@ -0,0 +1,91 @@
[English](/contributing.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | **Deutsch** | [Français](/contributing_fr.md) | [বাংলা](docs/contributing/contributing_bn.md)
## Lass uns Bruno noch besser machen, gemeinsam !!
Ich freue mich, dass Du Bruno verbessern möchtest. Hier findest Du eine Anleitung, mit der Du Bruno auf Deinem Computer einrichten kannst.
### Technologie Stack
Bruno ist mit Next.js und React erstellt. Außerdem benötigen wir electron für die Desktop Version (die lokale Sammlungen unterstützt).
Bibliotheken die wir benutzen
- CSS - Tailwind
- Code Editoren - Codemirror
- State Management - Redux
- Icons - Tabler Icons
- Formulare - formik
- Schema Validierung - Yup
- Request Client - axios
- Dateisystem Watcher - chokidar
### Abhängigkeiten
Du benötigst [Node v18.x oder die neuste LTS Version](https://nodejs.org/en/) und npm 8.x. Wir benutzen npm workspaces in dem Projekt.
### Lass uns coden
Eine Anleitung zum Ausführen einer lokalen Entwicklungsumgebung findest Du in [development.md](docs/development_de.md).
### Pull Request erstellen
- Bitte halte die PRs klein und begrenzt auf eine Sache
- Bitte halte Dich beim Erstellen eines Branches an das folgende Format
- feature/[feature name]: Dieser Branch soll Änderungen für ein bestimmtes Feature enthalten
- Beispiel: feature/dark-mode
- bugfix/[bug name]: Dieser Branch soll ausschließlich Bugfixes für einen bestimmten Bug enthalten
- Beispiel: bugfix/bug-1
## Entwicklung
Bruno wird als Desktop-Anwendung entwickelt. Um die App zu starten, musst Du zuerst die Next.js App in einem Terminal ausführen und anschließend in einem anderen Terminal die Electron-App.
### Abhängigkeiten
- NodeJS v18
### Lokales Entwickeln
```bash
# use nodejs 18 version
nvm use
# install deps
npm i --legacy-peer-deps
# build graphql docs
npm run build:graphql-docs
# build bruno query
npm run build:bruno-query
# run next app (terminal 1)
npm run dev:web
# run electron app (terminal 2)
npm run dev:electron
```
### Troubleshooting
Es kann sein, dass Du einen `Unsupported platform`-Fehler bekommst, wenn Du `npm install` ausführst. Um dies zu beheben, musst Du `node_modules` und `package-lock.json` löschen und `npm install` erneut ausführen. Dies sollte alle notwendigen Pakete installieren, die zum Ausführen der Anwendung benötigt werden.
```shell
# Delete node_modules in sub-directories
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Delete package-lock in sub-directories
find . -type f -name "package-lock.json" -delete
```
### Testen
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -0,0 +1,85 @@
## ¡Juntos, hagamos a Bruno mejor!
Estamos encantados de que quieras ayudar a mejorar Bruno. A continuación encontrarás las instrucciones para empezar a trabajar con Bruno en tu computadora.
### Tecnologías utilizadas
Bruno está construido con NextJs y React. También usamos electron para distribuir una versión de escritorio (que soporta colecciones locales).
Librerías que utilizamos:
- CSS - Tailwind
- Editores de código - Codemirror
- Manejo del estado - Redux
- Íconos - Tabler Icons
- Formularios - formik
- Validación de esquemas - Yup
- Cliente de peticiones - axios
- Monitor del sistema de archivos - chokidar
### Dependencias
Necesitarás [Node v18.x o la última versión LTS](https://nodejs.org/es) y npm 8.x. Ten en cuenta que utilizamos espacios de trabajo de npm en el proyecto.
## Desarrollo
Bruno está siendo desarrollado como una aplicación de escritorio. Para ejecutarlo, primero debes ejecutar la aplicación de nextjs en una terminal y luego ejecutar la aplicación de electron en otra terminal.
### Dependencias
- NodeJS v18
### Desarrollo local
```bash
# Utiliza la versión 18 de nodejs
nvm use
# Instala las dependencias
npm i --legacy-peer-deps
# Construye la documentación de graphql
npm run build:graphql-docs
# Construye bruno-query
npm run build:bruno-query
# Ejecuta la aplicación de nextjs (terminal 1)
npm run dev:web
# Ejecuta la aplicación de electron (terminal 2)
npm run dev:electron
```
### Solución de problemas
Es posible que encuentres un error de `Unsupported platform` cuando ejecutes `npm install`. Para solucionarlo, debes eliminar la carpeta `node_modules` y el archivo `package-lock.json`, luego, ejecuta `npm install`. Lo anterior debería instalar todos los paquetes necesarios para ejecutar la aplicación.
```shell
# Elimina la carpeta node_modules en los subdirectorios
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Elimina el archivo package-lock en los subdirectorios
find . -type f -name "package-lock.json" -delete
```
### Pruebas
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Crea un Pull Request
- Por favor, mantén los Pull Request pequeños y enfocados en una sola cosa.
- Por favor, sigue el siguiente formato para la creación de ramas:
- feature/[nombre de la funcionalidad]: Esta rama debe contener los cambios para una funcionalidad específica.
- Ejemplo: feature/dark-mode
- bugfix/[nombre del error]: Esta rama debe contener solo correcciones de errores para un error específico.
- Ejemplo: bugfix/bug-1

View File

@@ -0,0 +1,90 @@
[English](/contributing.md) | [Українська](docs/contributing/contributing_ua.md) | [Русский](docs/contributing/contributing_ru.md) | [Türkçe](docs/contributing/contributing_tr.md) | [Deutsch](docs/contributing/contributing_de.md) | **Français** | [Português (BR)](docs/contributing/contributing_pt_br.md) | [বাংলা](docs/contributing/contributing_bn.md) | [Español](docs/contributing/contributing_es.md) | [Română](docs/contributing/contributing_ro.md) | [Polski](docs/contributing/contributing_pl.md)
## Ensemble, améliorons Bruno !
Je suis content de voir que vous envisagez d'améliorer Bruno. Vous trouverez ci-dessous les règles et guides pour récupérer Bruno sur votre ordinateur.
### Technologies utilisées
Bruno est basé sur NextJs et React. Nous utilisons aussi Electron pour embarquer la version ordinateur (ce qui permet les collections locales).
Les librairies que nous utilisons :
- CSS - Tailwind
- Code Editors - Codemirror
- State Management - Redux
- Icons - Tabler Icons
- Forms - formik
- Schema Validation - Yup
- Request Client - axios
- Filesystem Watcher - chokidar
### Dépendances
Vous aurez besoin de [Node v18.x ou la dernière version LTS](https://nodejs.org/en/) et npm 8.x. Nous utilisons aussi les espaces de travail npm (_npm workspaces_) dans ce projet.
## Développement
Bruno est développé comme une application _client lourd_. Vous devrez charger l'application en démarrant nextjs dans un premier terminal, puis démarre l'application Electron dans un second.
### Dépendances
- NodeJS v18
### Développement local
```bash
# utiliser node en version 18
nvm use
# installation des dépendances
npm i --legacy-peer-deps
# construction des docs graphql
npm run build:graphql-docs
# construction de bruno query
npm run build:bruno-query
# démarrage de next (terminal 1)
npm run dev:web
# démarrage du client lourd (terminal 2)
npm run dev:electron
```
### Dépannage
Vous pourriez rencontrer une erreur `Unsupported platform` durant le lancement de `npm install`. Pour résoudre cela, veuillez supprimer le répertoire `node_modules` ainsi que le fichier `package-lock.json` et lancez à nouveau `npm install`. Cela devrait isntaller tous les paquets nécessaires pour lancer l'application.
```shell
# Efface les répertoires node_modules dans les sous-répertoires
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Efface les fichiers package-lock.json dans les sous-répertoires
find . -type f -name "package-lock.json" -delete
```
### Tests
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Ouvrir une Pull Request
- Merci de conserver les PR minimes et focalisées sur un seul objectif
- Merci de suivre le format de nom des branches :
- feature/[feature name]: Cette branche doit contenir une fonctionnalité spécifique
- Exemple: feature/dark-mode
- bugfix/[bug name]: Cette branche doit contenir seulement une solution pour un bug spécifique
- Exemple: bugfix/bug-1

View File

@@ -0,0 +1,89 @@
## Insieme, miglioriamo Bruno!
Sono felice di vedere che hai intenzione di migliorare Bruno. Di seguito, troverai le regole e le guide per ripristinare Bruno sul tuo computer.
### Tecnologie utilizzate
Bruno è costruito utilizzando Next.js e React. Utilizziamo anche Electron per incorporare la versione desktop (che consente raccolte locali).
Le librerie che utilizziamo sono:
- CSS - Tailwind
- Code Editors - Codemirror
- State Management - Redux
- Icons - Tabler Icons
- Forms - formik
- Schema Validation - Yup
- Request Client - axios
- Filesystem Watcher - chokidar
### Dependences
Hai bisogno di [Node v18.x o dell'ultima versione LTS](https://nodejs.org/en/) di npm 8.x. Utilizziamo gli spazi di lavoro npm (_npm workspaces_) in questo progetto.
### Iniziamo a codificare
Si prega di fare riferimento alla [documentazione di sviluppo](docs/development_it.md) per le istruzioni su come avviare l'ambiente di sviluppo locale.
### Aprire una richiesta di pull (Pull Request)
- Si prega di mantenere le Pull Request (PR) brevi e concentrate su un singolo obiettivo.
- Si prega di seguire il formato di denominazione dei rami.
- feature/[feature name]: Questo ramo dovrebbe contenere una specifica funzionalità.
- Esempio: feature/dark-mode
- bugfix/[bug name]: Questo ramo dovrebbe contenere solo una soluzione per un bug specifico.
- Esempio: bugfix/bug-1
## Sviluppo
Bruno è sviluppato come un'applicazione "heavy". È necessario caricare l'applicazione avviando Next.js in una finestra del terminale e quindi avviare l'applicazione Electron in un altro terminale.
### Sviluppo
- NodeJS v18
### Sviluppo locale
```bash
# use nodejs 18 version
nvm use
# install deps
npm i --legacy-peer-deps
# build graphql docs
npm run build:graphql-docs
# build bruno query
npm run build:bruno-query
# run next app (terminal 1)
npm run dev:web
# run electron app (terminal 2)
npm run dev:electron
```
### Risoluzione dei problemi
Potresti trovare un errore `Unsupported platform` durante l'esecuzione di `npm install`. Per risolvere questo problema, ti preghiamo di eliminare la cartella `node_modules`, il file `package-lock.json` e di seguito nuovamente `npm install`. Qeusto dovrebbe installare tutti i pacchetti necessari per avviare l'applicazione.
```shell
# delete node_modules in sub-directories
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# delete package-lock in sub-directories
find . -type f -name "package-lock.json" -delete
```
### Tests
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -0,0 +1,88 @@
[English](/contributing.md) | [Українська](docs/contributing/contributing_ua.md) | [Русский](docs/contributing/contributing_ru.md) | [Türkçe](docs/contributing/contributing_tr.md) | [Deutsch](docs/contributing/contributing_de.md) | [Français](docs/contributing/contributing_fr.md) | [Português (BR)](docs/contributing/contributing_pt_br.md) | [বাংলা](docs/contributing/contributing_bn.md) | [Español](docs/contributing/contributing_es.md) | [Română](docs/contributing/contributing_ro.md) | **Polski**
## Wspólnie uczynijmy Bruno lepszym !!
Cieszymy się, że chcesz udoskonalić Bruno. Poniżej znajdziesz wskazówki, jak rozpocząć pracę z Bruno na Twoim komputerze.
### Stos Technologiczny
Bruno jest zbudowane przy użyciu Next.js i React. Używamy również electron do stworzenia wersji desktopowej (która obsługuje lokalne kolekcje)
Biblioteki, których używamy
- CSS - Tailwind
- Edytory Kodu - Codemirror
- Zarządzanie Stanem - Redux
- Ikony - Tabler Icons
- Formularze - formik
- Walidacja Schematu - Yup
- Klient Zapytań - axios
- Obserwator Systemu Plików - chokidar
### Zależności
Będziesz potrzebować [Node v18.x lub najnowszej wersji LTS](https://nodejs.org/en/) oraz npm 8.x. W projekcie używamy npm workspaces
## Rozwój
Bruno jest rozwijane jako aplikacja desktopowa. Musisz załadować aplikację, uruchamiając aplikację Next.js w jednym terminalu, a następnie uruchomić aplikację electron w innym terminalu.
### Zależności
- NodeJS v18
### Lokalny Rozwój
```bash
# użyj wersji nodejs 18
nvm use
# zainstaluj zależności
npm i --legacy-peer-deps
# zbuduj dokumentację graphql
npm run build:graphql-docs
# zbuduj zapytanie bruno
npm run build:bruno-query
# uruchom aplikację next (terminal 1)
npm run dev:web
# uruchom aplikację electron (terminal 2)
npm run dev:electron
### Rozwiązywanie Problemów
Możesz napotkać błąd `Unsupported platform` podczas uruchamiania `npm install`. Aby to naprawić, będziesz musiał usunąć `node_modules` i `package-lock.json`, a następnie uruchomić `npm install`. Powinno to zainstalować wszystkie niezbędne pakiety potrzebne do uruchomienia aplikacji.
```shell
# Usuń node_modules w podkatalogach
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Usuń package-lock w podkatalogach
find . -type f -name "package-lock.json" -delete
```
### Testowanie
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Tworzenie Pull Request
- Prosimy, aby PR były małe i skoncentrowane na jednej rzeczy
- Prosimy przestrzegać formatu tworzenia gałęzi
- feature/[nazwa funkcji]: Ta gałąź powinna zawierać zmiany dotyczące konkretnej funkcji
- Przykład: feature/dark-mode
- bugfix/[nazwa błędu]: Ta gałąź powinna zawierać tylko poprawki dla konkretnego błędu
- Przykład bugfix/bug-1

View File

@@ -0,0 +1,85 @@
## Vamos tornar o Bruno melhor, juntos!!
Estamos felizes que você queira ajudar a melhorar o Bruno. Abaixo estão as diretrizes e orientações para começar a executar o Bruno no seu computador.
### Stack de Tecnologias
O Bruno é construído usando Next.js e React. Também usamos o Electron para disponibilizar uma versão para desktop (que suporta coleções locais).
Bibliotecas que utilizamos:
- CSS - Tailwind
- Editor de Código - Codemirror
- Gerenciador de Estado - Redux
- Ícones - Tabler Icons
- Formulários - formik
- Validador de Schema - Yup
- Cliente de Requisições - axios
- Monitor de Arquivos - chokidar
### Dependências
Você precisará do [Node v18.x (ou da versão LTS mais recente)](https://nodejs.org/en/) e do npm na versão 8.x. Nós utilizamos npm workspaces no projeto.
## Desenvolvimento
Bruno está sendo desenvolvido como um aplicativo de desktop. Você precisa carregar o programa executando o aplicativo Next.js em um terminal e, em seguida, executar o aplicativo Electron em outro terminal.
### Dependências
- NodeJS v18
### Desenvolvimento Local
```bash
# use nodejs 18 version
nvm use
# install deps
npm i --legacy-peer-deps
# build graphql docs
npm run build:graphql-docs
# build bruno query
npm run build:bruno-query
# run next app (terminal 1)
npm run dev:web
# run electron app (terminal 2)
npm run dev:electron
```
### Troubleshooting
Você pode se deparar com o erro `Unsupported platform` ao executar o comando `npm install`. Para corrigir isso, você precisará excluir a pasta `node_modules` e o arquivo `package-lock.json` e, em seguida, executar o comando `npm install` novamente. Isso deve instalar todos os pacotes necessários para executar o aplicativo.
```shell
# delete node_modules in sub-directories
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# delete package-lock in sub-directories
find . -type f -name "package-lock.json" -delete
```
### Testando
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Envio de Pull Request
- Por favor, mantenha os PRs pequenos e focados em uma única coisa.
- Siga o formato de criação de branches.
- feature/[nome da funcionalidade]: Esta branch deve conter alterações para uma funcionalidade específica.
- Exemplo: feature/dark-mode
- bugfix/[nome do bug]: Esta branch deve conter apenas correções para um bug específico.
- Exemplo: bugfix/bug-1

View File

@@ -0,0 +1,81 @@
[English](/contributing.md) | [Українська](/docs/contributing/contributing_ua.md) | [Русский](/docs/contributing/contributing_ru.md) | [Türkçe](/docs/contributing/contributing_tr.md) | [Deutsch](/docs/contributing/contributing_de.md) | [Français](/docs/contributing/contributing_fr.md) | [Português (BR)](/docs/contributing/contributing_pt_br.md) | [বাংলা](/docs/contributing/contributing_bn.md) | [Español](/docs/contributing/contributing_es.md) | [Italiano](/docs/contributing/contributing_it.md) | **Română**
## Haideţi să îmbunătățim Bruno, împreună!!
Ne bucurăm că doriți să îmbunătățiți bruno. Mai jos sunt instrucțiunile pentru ca să porniți bruno pe calculatorul dvs.
### Stack-ul tehnologic
Bruno este construit cu Next.js și React. De asemenea, folosim electron pentru a livra o versiune desktop (care poate folosi colecții locale)
Bibliotecile pe care le folosim
- CSS - Tailwind
- Editori de cod - Codemirror
- Management de condiție - Redux
- Icoane - Tabler Icons
- Formulare - formik
- Validarea schemelor - Yup
- Cererile client - axios
- Observatorul sistemului de fișiere - chokidar
### Dependențele
Veți avea nevoie de [Node v18.x sau cea mai recentă versiune LTS](https://nodejs.org/en/) și npm 8.x. Noi folosim spații de lucru npm în proiect
## Dezvoltarea
Bruno este dezvoltat ca o aplicație desktop. Ca să porniți aplicatia trebuie să rulați aplicația Next.js într-un terminal și apoi să rulați aplicația electron într-un alt terminal.
```shell
# folosiți nodejs versiunea 18
nvm use
# instalați dependențele
npm i --legacy-peer-deps
# construiți documente graphql
npm run build:graphql-docs
# construiți bruno query
npm run build:bruno-query
# rulați aplicația next (terminal 1)
npm run dev:web
# rulați aplicația electron (terminal 2)
npm run dev:electron
```
### Depanare
Este posibil să întâmpinați o eroare `Unsupported platform` când rulați „npm install”. Pentru a remedia acest lucru, va trebui să ștergeți `node_modules` și `package-lock.json` și să rulați `npm install`. Aceasta ar trebui să instaleze toate pachetele necesare pentru a rula aplicația.
```shell
# Ștergeți node_modules din subdirectoare
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Ștergeți package-lock din subdirectoare
find . -type f -name "package-lock.json" -delete
```
### Testarea
```shell
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Crearea unui Pull Request
- Vă rugăm să păstrați PR-urile mici și concentrate pe un singur lucru
- Vă rugăm să urmați formatul de creare a branchurilor
- feature/[Numele funcției]: Acest branch ar trebui să conțină modificări pentru o funcție anumită
- Exemplu: feature/dark-mode
- bugfix/[Numele eroarei]: Acest branch ar trebui să conţină numai remedieri pentru o eroare anumită
- Exemplu bugfix/bug-1

View File

@@ -0,0 +1,91 @@
[English](/contributing.md) | [Українська](/contributing_ua.md) | **Русский** | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) | [বাংলা](docs/contributing/contributing_bn.md)
## Давайте вместе сделаем Бруно лучше!!!
Я рад, что Вы хотите усовершенствовать bruno. Ниже приведены рекомендации по запуску bruno на вашем компьютере.
### Стек
Bruno построен с использованием Next.js и React. Мы также используем electron для поставки десктопной версии ( которая поддерживает локальные коллекции )
Библиотеки, которые мы используем
- CSS - Tailwind
- Редакторы кода - Codemirror
- Управление состоянием - Redux
- Иконки - Tabler Icons
- Формы - formik
- Валидация схем - Yup
- Запросы клиента - axios
- Наблюдатель за файловой системой - chokidar
### Зависимости
Вам потребуется [Node v18.x или последняя версия LTS](https://nodejs.org/en/) и npm 8.x. В проекте мы используем рабочие пространства npm
### Приступим к коду
Пожалуйста, обратитесь к [development_ru.md](docs/development_ru.md) для получения инструкций по запуску локальной среды разработки.
### Создание Pull Request
- Пожалуйста, пусть PR будет небольшим и сфокусированным на одной вещи
- Пожалуйста, соблюдайте формат создания веток
- feature/[название функции]: Эта ветка должна содержать изменения для конкретной функции
- Пример: feature/dark-mode
- bugfix/[название ошибки]: Эта ветка должна содержать только исправления для конкретной ошибки
- Пример bugfix/bug-1
## Разработка
Bruno разрабатывается как десктопное приложение. Необходимо загрузить приложение, запустив приложение Next.js в одном терминале, а затем запустить приложение electron в другом терминале.
### Зависимости
- NodeJS v18
### Локальная разработка
```bash
# используйте nodejs 18 версии
nvm use
# установите зависимости
npm i --legacy-peer-deps
# билд документации по graphql
npm run build:graphql-docs
# билд bruno query
npm run build:bruno-query
# запустить next приложение ( терминал 1 )
npm run dev:web
# запустить приложение electron ( терминал 2 )
npm run dev:electron
```
### Устранение неисправностей
При запуске `npm install` может возникнуть ошибка `Unsupported platform`. Чтобы исправить это, необходимо удалить `node_modules` и `package-lock.json` и запустить `npm install`. В результате будут установлены все пакеты, необходимые для работы приложения.
```shell
# Удаление node_modules в подкаталогах
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Удаление package-lock в подкаталогах
find . -type f -name "package-lock.json" -delete
```
### Тестирование
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -0,0 +1,88 @@
[English](../../contributing.md) | [Українська](docs/contributing/contributing_ua.md) | [Русский](docs/contributing/contributing_ru.md) | **Türkçe** | [Deutsch](docs/contributing/contributing_de.md) | [Français](docs/contributing/contributing_fr.md) | [Português (BR)](docs/contributing/contributing_pt_br.md) | [বাংলা](docs/contributing/contributing_bn.md) | [Español](docs/contributing/contributing_es.md) | [Română](docs/contributing/contributing_ro.md) | [Polski](docs/contributing/contributing_pl.md)
| [简体中文](docs/contributing/contributing_cn.md)
## Bruno'yu birlikte daha iyi hale getirelim!!!
bruno'yu geliştirmek istemenizden mutluluk duyuyoruz. Aşağıda, bruno'yu bilgisayarınıza getirmeye başlamak için yönergeler bulunmaktadır.
### Kullanılan Teknolojiler
Bruno, Next.js ve React kullanılarak oluşturulmuştur. Ayrıca bir masaüstü sürümü (yerel koleksiyonları destekleyen) göndermek için electron kullanıyoruz
Kullandığımız kütüphaneler
- CSS - Tailwind
- Kod Düzenleyiciler - Codemirror
- Durum Yönetimi - Redux
- Iconlar - Tabler Icons
- Formlar - formik
- Şema Doğrulama - Yup
- İstek İstemcisi - axios
- Dosya Sistemi İzleyicisi - chokidar
### Bağımlılıklar
[Node v18.x veya en son LTS sürümüne](https://nodejs.org/en/) ve npm 8.x'e ihtiyacınız olacaktır. Projede npm çalışma alanlarını kullanıyoruz
## Gelişim
Bruno bir masaüstü uygulaması olarak geliştirilmektedir. Next.js uygulamasını bir terminalde çalıştırarak uygulamayı yüklemeniz ve ardından electron uygulamasını başka bir terminalde çalıştırmanız gerekir.
### Bağımlılıklar
- NodeJS v18
### Yerel Geliştirme
```bash
# nodejs 18 sürümünü kullan
nvm use
# deps yükleyin
npm i --legacy-peer-deps
# graphql dokümanlarını oluştur
npm run build:graphql-docs
# bruno sorgusu oluştur
npm run build:bruno-query
# sonraki uygulamayı çalıştır (terminal 1)
npm run dev:web
# electron uygulamasını çalıştır (terminal 2)
npm run dev:electron
```
### Sorun Giderme
`npm install`'ı çalıştırdığınızda `Unsupported platform` hatası ile karşılaşabilirsiniz. Bunu düzeltmek için `node_modules` ve `package-lock.json` dosyalarını silmeniz ve `npm install` dosyasını çalıştırmanız gerekecektir. Bu, uygulamayı çalıştırmak için gereken tüm gerekli paketleri yüklemelidir.
```shell
# Alt dizinlerdeki node_modules öğelerini silme
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Alt dizinlerdeki paket kilidini silme
find . -type f -name "package-lock.json" -delete
```
### Test
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### Pull Request Oluşturma
- Lütfen PR'ları küçük tutun ve tek bir şeye odaklanın
- Lütfen şube oluşturma formatını takip edin
- feature/[özellik adı]: Bu dal belirli bir özellik için değişiklikler içermelidir
- Örnek: feature/dark-mode
- bugfix/[hata adı]: Bu dal yalnızca belirli bir hata için hata düzeltmeleri içermelidir
- Örnek bugfix/bug-1

View File

@@ -0,0 +1,91 @@
[English](/contributing.md) | **Українська** | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) | [বাংলা](docs/contributing/contributing_bn.md)
## Давайте зробимо Bruno краще, разом !!
Я дуже радий що Ви бажаєте покращити Bruno. Нижче наведені вказівки як розпочати розробку Bruno на Вашому комп'ютері.
### Стек технологій
Bruno побудований на Next.js та React. Також для десктопної версії (яка підтримує локальні колекції) використовується Electron
Бібліотеки, які ми використовуємо
- CSS - Tailwind
- Редактори коду - Codemirror
- Керування станом - Redux
- Іконки - Tabler Icons
- Форми - formik
- Валідація по схемі - Yup
- Клієнт запитів - axios
- Спостерігач за файловою системою - chokidar
### Залежності
Вам знадобиться [Node v18.x або остання LTS версія](https://nodejs.org/en/) та npm 8.x. Ми використовуєм npm workspaces в цьому проекті
### Починаєм писати код
Будь ласка, зверніться до [development_ua.md](docs/development_ua.md) за інструкціями щодо запуску локального середовища розробки.
### Створення Pull Request-ів
- Будь ласка, робіть PR-и маленькими і сфокусованими на одній речі
- Будь ласка, слідуйте формату назв гілок
- feature/[назва feature]: Така гілка має містити зміни лише щодо конкретної feature
- Приклад: feature/dark-mode
- bugfix/[назва баґу]: Така гілка має містити лише виправлення конкретного багу
- Приклад: bugfix/bug-1
## Розробка
Bruno розробляється як декстопний застосунок. Вам потрібно запустити Next.js в одній сесії терміналу, та запустити застосунок Electron в іншій сесії терміналу.
### Залежності
- NodeJS v18
### Локальна розробка
```bash
# Використовуйте nodejs 18-ї версії
nvm use
# встановіть залежності
npm i --legacy-peer-deps
# зберіть документацію graphql
npm run build:graphql-docs
# зберіть bruno query
npm run build:bruno-query
# запустіть додаток next (термінал 1)
npm run dev:web
# запустіть додаток електрон (термінал 2)
npm run dev:electron
```
### Усунення несправностей
Ви можете зтикнутись із помилкою `Unsupported platform` коли запускаєте `npm install`. Щоб усунути цю проблему, вам потрібно видалити `node_modules` та `package-lock.json`, і тоді запустити `npm install`. Це має встановити всі потрібні для запуску додатку пекеджі.
```shell
# Видаліть node_modules в піддиректоріях
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Видаліть package-lock в піддиректоріях
find . -type f -name "package-lock.json" -delete
```
### Тестування
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -0,0 +1,91 @@
[English](/contributing.md) | [Українська](./contributing_ua.md) | [Русский](./contributing_ru.md) | [Türkçe](./contributing_tr.md) | [Deutsch](./contributing_de.md) | [Français](./contributing_fr.md) | [Português (BR)](./contributing_pt_br.md) | [বাংলা](./contributing_bn.md) | [Español](./contributing_es.md) | [Română](./contributing_ro.md) | [Polski](./contributing_pl.md) | [简体中文](./contributing_cn.md) | **正體中文**
## 讓我們一起來讓 Bruno 變得更好!
我們很高興您希望一同改善 Bruno。以下是在您的電腦上開始運行 Bruno 的規則及指南。
### 技術細節
Bruno 使用 Next.js 和 React 構建。我們使用 Electron 來封裝及發佈桌面版本。
我們使用的函式庫:
- CSS - Tailwind
- 程式碼編輯器 - Codemirror
- 狀態管理 - Redux
- Icons - Tabler Icons
- 表單 - formik
- 結構驗證- Yup
- 請求用戶端 - axios
- 檔案系統監測 - chokidar
### 依賴關係
您需要使用 [Node v18.x 或最新的 LTS 版本](https://nodejs.org/en/) 和 npm 8.x。我們在這個專案中使用 npm 工作區_npm workspaces_
## 開發
Bruno 正以桌面應用程式的形式開發。您需要在一個終端機中執行 Next.js 來載入應用程式,然後在另一個終端機中執行 electron 應用程式。
### 開發依賴
- NodeJS v18
### 本地開發
```bash
# 使用 nodejs 第 18 版
nvm use
# 安裝相依套件(使用--legacy-peer-deps 解決套件相依性問題)
npm i --legacy-peer-deps
# 建立 graphql 文件
npm run build:graphql-docs
# 建立 bruno 查詢
npm run build:bruno-query
# 執行 next 應用程式(終端機 1
npm run dev:web
# 執行 electron 應用程式(終端機 2
npm run dev:electron
```
### 故障排除
在執行 `npm install` 時,您可能會遇到 `Unsupported platform` 的錯誤訊息。爲了解決這個問題,您需要刪除 `node_modules` 資料夾和 `package-lock.json` 檔案,然後再執行一次 `npm install`。這應該能重新安裝應用程式所需的套件。
```shell
# 刪除子資料夾中的 node_modules 資料夾
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# 刪除子資料夾中的 package-lock.json 檔案
find . -type f -name "package-lock.json" -delete
```
### 測試
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```
### 發送 Pull Request
- 請保持 PR 精簡並專注於一個目標
- 請遵循建立分支的格式:
- feature/[feature name]:該分支應包含特定功能的更改
- 範例feature/dark-mode
- bugfix/[bug name]:該分支應僅包含特定 bug 的修復
- 範例bugfix/bug-1

View File

@@ -1,55 +0,0 @@
**English** | [Українська](/docs/development_ua.md) | [Русский](/docs/development_ru.md)
## Development
Bruno is being developed as a desktop app. You need to load the app by running the nextjs app in one terminal and then run the electron app in another terminal.
### Dependencies
- NodeJS v18
### Local Development
```bash
# use nodejs 18 version
nvm use
# install deps
npm i --legacy-peer-deps
# build graphql docs
npm run build:graphql-docs
# build bruno query
npm run build:bruno-query
# run next app (terminal 1)
npm run dev:web
# run electron app (terminal 2)
npm run dev:electron
```
### Troubleshooting
You might encounter a `Unsupported platform` error when you run `npm install`. To fix this, you will need to delete `node_modules` and `package-lock.json` and run `npm install`. This should install all the necessary packages needed to run the app.
```shell
# Delete node_modules in sub-directories
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Delete package-lock in sub-directories
find . -type f -name "package-lock.json" -delete
```
### Testing
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -1,55 +0,0 @@
[English](/docs/development.md) | [Українська](/docs/development_ua.md) | **Русский**
## Разработка
Bruno разрабатывается как десктопное приложение. Необходимо загрузить приложение, запустив приложение nextjs в одном терминале, а затем запустить приложение electron в другом терминале.
### Зависимости
- NodeJS v18
### Локальная разработка
```bash
# используйте nodejs 18 версии
nvm use
# установите зависимости
npm i --legacy-peer-deps
# билд документации по graphql
npm run build:graphql-docs
# билд bruno query
npm run build:bruno-query
# запустить next приложение ( терминал 1 )
npm run dev:web
# запустить приложение electron ( терминал 2 )
npm run dev:electron
```
### Устранение неисправностей
При запуске `npm install` может возникнуть ошибка `Unsupported platform`. Чтобы исправить это, необходимо удалить `node_modules` и `package-lock.json` и запустить `npm install`. В результате будут установлены все пакеты, необходимые для работы приложения.
```shell
# Удаление node_modules в подкаталогах
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Удаление package-lock в подкаталогах
find . -type f -name "package-lock.json" -delete
```
### Тестирование
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -1,55 +0,0 @@
[English](/docs/development.md) | **Українська** | [Русский](/docs/development_ru.md)
## Розробка
Bruno розробляється як декстопний застосунок. Вам потрібно запустити nextjs в одній сесії терміналу, та запустити застосунок Electron в іншій сесії терміналу.
### Залежності
- NodeJS v18
### Локальна розробка
```bash
# Використовуйте nodejs 18-ї версії
nvm use
# встановіть залежності
npm i --legacy-peer-deps
# зберіть документацію graphql
npm run build:graphql-docs
# зберіть bruno query
npm run build:bruno-query
# запустіть додаток next (термінал 1)
npm run dev:web
# запустіть додаток електрон (термінал 2)
npm run dev:electron
```
### Усунення несправностей
Ви можете зтикнутись із помилкою `Unsupported platform` коли запускаєте `npm install`. Щоб усунути цю проблему, вам потрібно видалити `node_modules` та `package-lock.json`, і тоді запустити `npm install`. Це має встановити всі потрібні для запуску додатку пекеджі.
```shell
# Видаліть node_modules в піддиректоріях
find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do
rm -rf "$dir"
done
# Видаліть package-lock в піддиректоріях
find . -type f -name "package-lock.json" -delete
```
### Тестування
```bash
# bruno-schema
npm test --workspace=packages/bruno-schema
# bruno-lang
npm test --workspace=packages/bruno-lang
```

View File

@@ -0,0 +1,7 @@
[English](/publishing.md) | [Português (BR)](docs/publishing/publishing_pt_br.md) | [Română](docs/publishing/publishing_ro.md) | [Türkçe](/docs/publishing/publishing_tr.md) | [Polski](docs/publishing/publishing_pl.md) | **বাংলা** | [Français](docs/publishing/publishing_fr.md)
### ব্রুনোকে নতুন প্যাকেজ ম্যানেজারে প্রকাশ করা
যদিও আমাদের কোড ওপেন সোর্স এবং সবার ব্যবহারের জন্য উপলব্ধ, তবে আমরা নতুন প্যাকেজ ম্যানেজারে প্রকাশনা বিবেচনা করার আগে আমাদের সাথে যোগাযোগ করার জন্য অনুরোধ করি। ব্রুনোর স্রষ্টা হিসাবে, আমি এই প্রকল্পের জন্য `Bruno` ট্রেডমার্ক ধারণ করি এবং এর বিতরণ পরিচালনা করতে চাই। যদি আপনি একটি নতুন প্যাকেজ ম্যানেজারে ব্রুনো দেখতে চান, দয়া করে একটি GitHub ইস্যু তুলুন।
যদিও আমাদের বেশিরভাগ বৈশিষ্ট্য বিনামূল্যে এবং ওপেন সোর্স (যা REST এবং GraphQL API গুলিকে কভার করে), আমরা ওপেন-সোর্স নীতি এবং স্থায়িত্বের মধ্যে একটি সুসঙ্গত ভারসাম্য বজায় রাখার জন্য চেষ্টা করি - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,7 @@
[English](/publishing.md) | [Português (BR)](docs/publishing/publishing_pt_br.md) | [Română](docs/publishing/publishing_ro.md) | [Türkçe](/docs/publishing/publishing_tr.md) | [Polski](docs/publishing/publishing_pl.md) | [বাংলা](docs/publishing/publishing_bn.md) | **Français**
### Publier Bruno dans un nouveau gestionnaire de paquets
Bien que notre code soit open source et disponible pour tout le monde, nous vous remercions de nous contacter avant de considérer sa publication sur un nouveau gestionnaire de paquets. En tant que createur de Bruno, je détiens la marque `Bruno` pour ce projet et j'aimerais gérer moi-même sa distribution. Si vous voyez Bruno sur un nouveau gestionnaire de paquets, merci de créer une _issue_ Github.
Bien que la majorité de nos fonctionnalités soient gratuites et open source (ce qui couvre les apis REST et GraphQL), nous nous efforçons de trouver un équilibre harmonieux entre les principes de l'open source et la pérennité - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,8 @@
[English](/publishing.md) | [Português (BR)](docs/publishing/publishing_pt_br.md) | [Română](docs/publishing/publishing_ro.md) | [Türkçe](/docs/publishing/publishing_tr.md) | **Polski** | [বাংলা](docs/publishing/publishing_bn.md) | [Français](docs/publishing/publishing_fr.md)
### Publikowanie Bruno w nowym menedżerze pakietów
Chociaż nasz kod jest otwartoźródłowy i dostępny dla każdego do użytku, uprzejmie prosimy o kontakt z nami przed rozważeniem publikacji w nowych menedżerach pakietów. Jako twórca Bruno, posiadam znak towarowy `Bruno` dla tego projektu i chciałbym zarządzać jego dystrybucją. Jeśli chcesz zobaczyć Bruno w nowym menedżerze pakietów, proszę zgłoś problem na GitHubie.
Chociaż większość naszych funkcji jest darmowa i otwartoźródłowa (co obejmuje REST i GraphQL Apis),
staramy się osiągnąć harmonijny balans między zasadami open-source a zrównoważonym rozwojem - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,7 @@
[English](/publishing.md) | **Português (BR)** | [Română](docs/publishing/publishing_ro.md) | [Türkçe](/docs/publishing/publishing_tr.md) | [Polski](docs/publishing/publishing_pl.md) | [বাংলা](docs/publishing/publishing_bn.md) | [Français](docs/publishing/publishing_fr.md)
### Publicando Bruno em um novo gerenciador de pacotes
Embora nosso código seja de código aberto e esteja disponível para todos usarem, pedimos gentilmente que entre em contato conosco antes de considerar a publicação em novos gerenciadores de pacotes. Como o criador da ferramenta, mantenho a marca registrada `Bruno` para este projeto e gostaria de gerenciar sua distribuição. Se deseja ver o Bruno em um novo gerenciador de pacotes, por favor, solicite através de uma issue no GitHub.
Embora a maioria de nossas funcionalidades seja gratuita e de código aberto (o que abrange API's REST e GraphQL), buscamos alcançar um equilíbrio harmonioso entre os princípios de código aberto e sustentabilidade. - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,8 @@
[English](/publishing.md) | [Português (BR)](/docs/publishing/publishing_pt_br.md) | **Română** | [Türkçe](/docs/publishing/publishing_tr.md) | [Polski](docs/publishing/publishing_pl.md) | [বাংলা](/docs/publishing/publishing_bn.md) | [Français](docs/publishing/publishing_fr.md)
### Publicarea lui Bruno la un gestionar de pachete nou
Deși codul nostru este cu sursă deschisă și disponibil pentru utilizare pentru toată lumea, vă rugăm să ne contactați înainte de a considera publicarea pe gestionari de pachete noi. În calitate de creator al lui Bruno, dețin marca comercială `Bruno` pentru acest proiect și aș dori să gestionez distribuția acestuia. Dacă doriți să-l vedeți pe Bruno pe un gestionar de pachete nou, vă rugăm să creați un issue pe GitHub.
În timp ce majoritatea funcțiilor noastre sunt gratuite și cu sursă deschisă (ceea ce acoperă API-uri REST și GraphQL),
ne străduim să găsim un echilibru armonios între principiile de sursă deschisă și sustenabilitate - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,8 @@
[English](../../publishing.md) | [Português (BR)](docs/publishing/publishing_pt_br.md) | [Română](docs/publishing/publishing_ro.md) | **Türkçe** | [Polski](docs/publishing/publishing_pl.md) | [বাংলা](docs/publishing/publishing_bn.md) | [Français](docs/publishing/publishing_fr.md)
### Bruno'yu yeni bir paket yöneticisine yayınlama
Kodumuz açık kaynak kodlu ve herkesin kullanımına açık olsa da, yeni paket yöneticilerinde yayınlamayı düşünmeden önce bize ulaşmanızı rica ediyoruz. Bruno'nun yaratıcısı olarak, bu proje için `Bruno` ticari markasına sahibim ve dağıtımını yönetmek istiyorum. Bruno'yu yeni bir paket yöneticisinde görmek istiyorsanız, lütfen bir GitHub sorunu oluşturun.
Özelliklerimizin çoğu ücretsiz ve açık kaynak olsa da (REST ve GraphQL Apis'i kapsar),
ık kaynak ilkeleri ile sürdürülebilirlik arasında uyumlu bir denge kurmaya çalışıyoruz - https://github.com/usebruno/bruno/discussions/269

View File

@@ -0,0 +1,7 @@
[English](/publishing.md) | [Português (BR)](docs/publishing/publishing_pt_br.md) | [Română](docs/publishing/publishing_ro.md) | [Polski](docs/publishing/publishing_pl.md) | [বাংলা](docs/publishing/publishing_bn.md) | [Français](docs/publishing/publishing_fr.md) | **正體中文**
### 將 Bruno 發佈到新的套件管理器
雖然我們的程式碼是開源的並且可供所有人使用,但我們懇請您在考慮在新的套件管理器上發布之前與我們聯繫。作為 Bruno 的創建者,我擁有這個專案的 Bruno 商標並希望管理其發行。如果您希望看到 Bruno 使用新的套件管理器,請提出一個 GitHub issue。
雖然我們的大部分功能都是免費和開源(涵蓋 REST 和 GraphQL APIs但我們努力在開源的原則和永續性之間取得和諧的平衡 - https://github.com/usebruno/bruno/discussions/269

123
docs/readme/readme_bn.md Normal file
View File

@@ -0,0 +1,123 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### ব্রুনো - API অন্বেষণ এবং পরীক্ষা করার জন্য ওপেনসোর্স IDE।
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](../../readme.md) | [Українська](docs/readme/readme_ua.md) | [Русский](docs/readme/readme_ru.md) | [Türkçe](docs/readme/readme_tr.md) | [Deutsch](docs/readme/readme_de.md) | [Français](docs/readme/readme_fr.md) | [Português (BR)](docs/readme/readme_pt_br.md) | [한국어](docs/readme/readme_kr.md) | **বাংলা** | [Español](docs/readme/readme_es.md) | [Italiano](docs/readme/readme_it.md) | [Română](docs/readme/readme_ro.md) | [Polski](docs/readme/readme_pl.md)
ব্রুনো হল একটি নতুন এবং উদ্ভাবনী API ক্লায়েন্ট, যার লক্ষ্য পোস্টম্যান এবং অনুরূপ সরঞ্জাম দ্বারা প্রতিনিধিত্ব করা স্থিতাবস্থায় বিপ্লব ঘটানো।
ব্রুনো আপনার সংগ্রহগুলি সরাসরি আপনার ফাইল সিস্টেমের একটি ফোল্ডারে সঞ্চয় করে। আমরা API অনুরোধ সম্পর্কে তথ্য সংরক্ষণ করতে একটি প্লেইন টেক্সট মার্কআপ ভাষা, ব্রু ব্যবহার করি।
আপনি আপনার API সংগ্রহে সহযোগিতা করতে গিট বা আপনার পছন্দের যেকোনো সংস্করণ নিয়ন্ত্রণ ব্যবহার করতে পারেন।
ব্রুনো শুধুমাত্র অফলাইন। ব্রুনোতে ক্লাউড-সিঙ্ক যোগ করার কোন পরিকল্পনা নেই, কখনও। আমরা আপনার ডেটা গোপনীয়তার মূল্য দিই এবং বিশ্বাস করি এটি আপনার ডিভাইসে থাকা উচিত। আমাদের দীর্ঘমেয়াদী দৃষ্টি পড়ুন। [এখানে ](https://github.com/usebruno/bruno/discussions/269)
📢 ইন্ডিয়া FOSS 3.0 সম্মেলনে আমাদের সাম্প্রতিক আলোচনা দেখুন [এখানে](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### স্থাপন
ব্রুনো বাইনারি ডাউনলোড হিসাবে উপলব্ধ [আমাদের ওয়েবসাইটে](https://www.usebruno.com/downloads) ম্যাক, উইন্ডোজ এবং লিনাক্সের জন্য।
আপনি Homebrew, Chocolatey, Snap এবং Apt এর মত প্যাকেজ ম্যানেজারদের মাধ্যমে ব্রুনো ইনস্টল করতে পারেন।
```sh
# Homebrew এর মাধ্যমে Mac-এ
brew install bruno
# চকোলেটির মাধ্যমে উইন্ডোজে
choco install bruno
# স্ন্যাপ এর মাধ্যমে লিনাক্সে
snap install bruno
# Apt এর মাধ্যমে লিনাক্সে
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### একাধিক প্ল্যাটফর্মে চালান 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Git এর মাধ্যমে সহযোগিতা করুন 👩‍💻🧑‍💻
অথবা আপনার পছন্দের যেকোনো সংস্করণ নিয়ন্ত্রণ ব্যবস্থা
![bruno](/assets/images/version-control.png) <br /><br />
### গুরুত্বপূর্ণ লিংক 📌
- [আমাদের দীর্ঘমেয়াদী দৃষ্টি](https://github.com/usebruno/bruno/discussions/269)
- [রোডম্যাপ](https://github.com/usebruno/bruno/discussions/384)
- [ডকুমেন্টেশন](https://docs.usebruno.com)
- [ওয়েবসাইট](https://www.usebruno.com)
- [মূল্য](https://www.usebruno.com/pricing)
- [ডাউনলোড করুন](https://www.usebruno.com/downloads)
### শোকেস 🎥
- [প্রশংসাপত্র](https://github.com/usebruno/bruno/discussions/343)
- [নলেজ হাব](https://github.com/usebruno/bruno/discussions/386)
- [স্ক্রিপ্টম্যানিয়া](https://github.com/usebruno/bruno/discussions/385)
### সমর্থন ❤️
উফ ! আপনি যদি প্রকল্পটি পছন্দ করেন তবে ⭐ বোতামটি টিপুন !!
### প্রশংসাপত্র শেয়ার করুন 📣
যদি ব্রুনো আপনাকে কর্মক্ষেত্রে এবং আপনার দলগুলিতে সাহায্য করে থাকে, অনুগ্রহ করে আপনার [আমাদের গিটহাব আলোচনায় প্রশংসাপত্রগুলি](https://github.com/usebruno/bruno/discussions/343) শেয়ার করতে ভুলবেন না
### নতুন প্যাকেজ পরিচালকদের কাছে প্রকাশ করা হচ্ছে
আরও তথ্যের জন্য অনুগ্রহ করে [এখানে](../publishing/publishing_bn.md) দেখুন।
### অবদান 👩‍💻🧑‍💻
আমি খুশি যে আপনি ব্রুনোর উন্নতি করতে চাইছেন। অনুগ্রহ করে [অবদানকারী নির্দেশিকা](contributing.md) দেখুন
আপনি কোডের মাধ্যমে অবদান রাখতে না পারলেও, অনুগ্রহ করে বাগ এবং বৈশিষ্ট্যের অনুরোধ ফাইল করতে দ্বিধা করবেন না যা আপনার ব্যবহারের ক্ষেত্রে সমাধান করার জন্য প্রয়োগ করা প্রয়োজন।
### লেখক
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### সাথে থাকুন 🌐
[𝕏 (টুইটার)](https://twitter.com/use_bruno) <br />
[ওয়েবসাইট](https://www.usebruno.com) <br />
[ডিসকর্ড](https://discord.com/invite/KgcZUncpjq) <br />
[লিঙ্কডইন](https://www.linkedin.com/company/usebruno)
### ট্রেডমার্ক
**নাম**
`Bruno` হল একটি ট্রেডমার্ক [Anoop M D](https://www.helloanoop.com/)
**লোগো**
লোগোটি [OpenMoji](https://openmoji.org/library/emoji-1F436/) থেকে নেওয়া হয়েছে। লাইসেন্স: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### লাইসেন্স 📄
[MIT](license.md)

131
docs/readme/readme_cn.md Normal file
View File

@@ -0,0 +1,131 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - 开源IDE用于探索和测试API。
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![网站](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![下载](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](../../readme.md) | [Українська](./readme_ua.md) | [Русский](./readme_ru.md) | [Türkçe](./readme_tr.md) | [Deutsch](./readme_de.md) | [Français](./readme_fr.md) | [Português (BR)](./readme_pt_br.md) | [한국어](./readme_kr.md) | [বাংলা](./readme_bn.md) | [Español](./readme_es.md) | [Italiano](./readme_it.md) | [Română](./readme_ro.md) | [Polski](./readme_pl.md) | [简体中文](./readme_cn.md)
Bruno 是一款全新且创新的 API 客户端,旨在颠覆 Postman 和其他类似工具。
Bruno 直接在您的电脑文件夹中存储您的 API 信息。我们使用纯文本标记语言 Bru 来保存有关 API 的信息。
您可以使用 Git 或您选择的任何版本控制系统来对您的API信息进行版本控制和协作。
Bruno 仅限离线使用。我们计划永不向 Bruno 添加云同步功能。我们重视您的数据隐私,并认为它应该留在您的设备上。阅读我们的长期愿景 [点击查看](https://github.com/usebruno/bruno/discussions/269)
📢 观看我们在印度 FOSS 3.0 会议上的最新演讲 [点击查看](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](../../assets/images/landing-2.png) <br /><br />
### 安装
Bruno 可以在我们的 [网站上下载](https://www.usebruno.com/downloads) Mac、Windows 和 Linux 的可执行文件。
您也可以通过包管理器如 Homebrew、Chocolatey、Scoop、Snap 和 Apt 安装 Bruno。
```sh
# 在 Mac 电脑上用 Homebrew 安装
brew install bruno
# 在 Windows 上用 Chocolatey 安装
choco install bruno
# 在 Windows 上用 Scoop 安装
scoop bucket add extras
scoop install bruno
# 在 Linux 上用 Snap 安装
snap install bruno
# 在 Linux 上用 Apt 安装
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### 在 Mac 上通过 Homebrew 安装 🖥️
![bruno](../../assets/images/run-anywhere.png) <br /><br />
### Collaborate 安装 👩‍💻🧑‍💻
或者任何你选择的版本控制系统
![bruno](../../assets/images/version-control.png) <br /><br />
### 重要链接 📌
- [我们的愿景](https://github.com/usebruno/bruno/discussions/269)
- [路线图](https://github.com/usebruno/bruno/discussions/384)
- [文档](https://docs.usebruno.com)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bruno)
- [网站](https://www.usebruno.com)
- [价格](https://www.usebruno.com/pricing)
- [下载](https://www.usebruno.com/downloads)
- [Github 赞助](https://github.com/sponsors/helloanoop).
### 展示 🎥
- [Testimonials](https://github.com/usebruno/bruno/discussions/343)
- [Knowledge Hub](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### 支持 ❤️
如果您喜欢 Bruno 并想支持我们的开源工作,请考虑通过 [Github Sponsors](https://github.com/sponsors/helloanoop) 来赞助我们。
### 分享评价 📣
如果 Bruno 在您的工作和团队中帮助了您,请不要忘记在我们的 GitHub 讨论上分享您的 [评价](https://github.com/usebruno/bruno/discussions/343)
### 发布到新的包管理器
有关更多信息,请参见 [此处](../../publishing.md) 。
### 贡献 👩‍💻🧑‍💻
我很高兴您希望改进bruno。请查看 [贡献指南](../../contributing.md)。
即使您无法通过代码做出贡献我们仍然欢迎您提出BUG和新的功能需求。
### 作者
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### 联系方式 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### 商标
**名称**
`Bruno` 是由 [Anoop M D](https://www.helloanoop.com/) 持有的商标。
**Logo**
Logo 源自 [OpenMoji](https://openmoji.org/library/emoji-1F436/). License: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### 许可证 📄
[MIT](../../license.md)

95
docs/readme/readme_de.md Normal file
View File

@@ -0,0 +1,95 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - Opensource IDE zum Erkunden und Testen von APIs.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](./readme_ua.md) | [Русский](./readme_ru.md) | [Türkçe](./readme_tr.md) | **Deutsch** | [Français](./readme_fr.md) | [Português (BR)](./readme_pt_br.md) | [한국어](./readme_kr.md) | [বাংলা](./readme_bn.md) | [Español](./readme_es.md) | [Italiano](./readme_it.md) | [Română](./readme_ro.md) | [Polski](./readme_pl.md)
Bruno ist ein neuer und innovativer API-Client, der den Status Quo von Postman und ähnlichen Tools revolutionieren soll.
Bruno speichert deine Sammlungen direkt in einem Ordner in deinem Dateisystem. Wir verwenden eine einfache Textauszeichnungssprache - Bru - um Informationen über API-Anfragen zu speichern.
Du kannst Git oder eine andere Versionskontrolle deiner Wahl verwenden, um gemeinsam mit anderen an deinen API-Sammlungen zu arbeiten.
Bruno ist ein reines Offline-Tool. Es gibt keine Pläne, Bruno um eine Cloud-Synchronisation zu erweitern. Wir schätzen den Schutz deiner Daten und glauben, dass sie auf deinem Gerät bleiben sollten. Lies unsere Langzeit-Vision [hier](https://github.com/usebruno/bruno/discussions/269).
![bruno](/assets/images/landing-2.png) <br /><br />
### Einsatz auf verschiedensten Plattformen 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Zusammenarbeit mit Git 👩‍💻🧑‍💻
Oder einer Versionskontrolle deiner Wahl
![bruno](/assets/images/version-control.png) <br /><br />
### Wichtige Links 📌
- [Unsere Langzeit-Vision](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Dokumentation](https://docs.usebruno.com)
- [Webseite](https://www.usebruno.com)
- [Preise](https://www.usebruno.com/pricing)
- [Download](https://www.usebruno.com/downloads)
### Showcase 🎥
- [Erfahrungsberichte](https://github.com/usebruno/bruno/discussions/343)
- [Wissenswertes](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Unterstützung ❤️
Wuff! Wenn du dieses Projekt magst, klick den ⭐ Button !!
### Teile Erfahrungsberichte 📣
Wenn Bruno dir und in deinen Teams bei der Arbeit geholfen hat, vergiss bitte nicht, deine [Erfahrungsberichte auf unserer GitHub-Diskussion](https://github.com/usebruno/bruno/discussions/343) zu teilen.
### Bereitstellung in neuen Paket-Managern
Mehr Informationen findest du [hier](/publishing.md).
### Mitmachen 👩‍💻🧑‍💻
Ich freue mich, dass du Bruno verbessern willst. Bitte schau dir den [Leitfaden zum Mitmachen](../contributing/contributing_de.md) an.
Auch wenn du nicht in der Lage bist, einen Beitrag in Form von Code zu leisten, zögere bitte nicht, uns Fehler und Funktionswünsche mitzuteilen, die implementiert werden müssen, um deinen Anwendungsfall zu unterstützen.
### Autoren
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### In Verbindung bleiben 🌐
[Twitter](https://twitter.com/use_bruno) <br />
[Webseite](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Markenzeichen
**Name**
`Bruno` ist ein Markenzeichen von [Anoop M D](https://www.helloanoop.com/)
**Logo**
Das Logo stammt von [OpenMoji](https://openmoji.org/library/emoji-1F436/). Lizenz: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Lizenz 📄
[MIT](/license.md)

95
docs/readme/readme_es.md Normal file
View File

@@ -0,0 +1,95 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - IDE de código abierto para explorar y probar APIs.
[![Versión en Github](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Actividad de Commits](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Sitio Web](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Descargas](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](./readme_ua.md) | [Русский](./readme_ru.md) | [Türkçe](./readme_tr.md) | [Deutsch](./readme_de.md) | [Français](./readme_fr.md) | [Português (BR)](./readme_pt_br.md) | [한국어](./readme_kr.md) | [বাংলা](./readme_bn.md) | **Español** | [Italiano](./readme_it.md) | [Română](./readme_ro.md) | [Polski](./readme_pl.md)
Bruno un cliente de APIs nuevo e innovador, creado con el objetivo de revolucionar el panorama actual representado por Postman y otras herramientas similares.
Bruno almacena tus colecciones directamente en una carpeta de tu sistema de archivos. Usamos un lenguaje de marcado de texto plano, llamado Bru, para guardar información sobre las peticiones a tus APIs.
Puedes usar git o cualquier otro sistema de control de versiones que prefieras para colaborar en tus colecciones.
Bruno funciona sin conexión a internet. No tenemos intenciones de añadir sincronización en la nube a Bruno, en ningún momento. Valoramos tu privacidad y creemos que tus datos deben permanecer en tu dispositivo. Puedes leer nuestra visión a largo plazo [aquí](https://github.com/usebruno/bruno/discussions/269)
![bruno](/assets/images/landing-2.png) <br /><br />
### Ejecútalo en múltiples plataformas 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Colabora vía Git 👩‍💻🧑‍💻
O cualquier otro sistema de control de versiones que prefieras
![bruno](/assets/images/version-control.png) <br /><br />
### Enlaces importantes 📌
- [Nuestra Visión a Largo Plazo](https://github.com/usebruno/bruno/discussions/269)
- [Hoja de Ruta](https://github.com/usebruno/bruno/discussions/384)
- [Documentación](https://docs.usebruno.com)
- [Sitio Web](https://www.usebruno.com)
- [Precios](https://www.usebruno.com/pricing)
- [Descargas](https://www.usebruno.com/downloads)
### Casos de uso 🎥
- [Testimonios](https://github.com/usebruno/bruno/discussions/343)
- [Centro de Conocimiento](https://github.com/usebruno/bruno/discussions/386)
- [Scripts de la Comunidad](https://github.com/usebruno/bruno/discussions/385)
### Apoya el proyecto ❤️
¡Guau! Si te gusta el proyecto, ¡dale al botón de ⭐!
### Comparte tus testimonios 📣
Si Bruno te ha ayudado en tu trabajo y con tus equipos, por favor, no olvides compartir tus testimonios en [nuestras discusiones de GitHub](https://github.com/usebruno/bruno/discussions/343)
### Publicar en nuevos gestores de paquetes
Por favor, consulta [aquí](publishing.md) para más información.
### Contribuye 👩‍💻🧑‍💻
Estamos encantados de que quieras ayudar a mejorar Bruno. Por favor, consulta la [guía de contribución](contributing_es.md) para más información.
Incluso si no puedes contribuir con código, no dudes en reportar errores y solicitar nuevas funcionalidades que necesites para resolver tu caso de uso.
### Colaboradores
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Mantente en contacto 🌐
[X](https://twitter.com/use_bruno) <br />
[Sitio Web](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Marca
**Nombre**
`Bruno` es una marca propiedad de [Anoop M D](https://www.helloanoop.com/).
**Logo**
El logo fue obtenido de [OpenMoji](https://openmoji.org/library/emoji-1F436/). Licencia: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Licencia 📄
[MIT](license.md)

132
docs/readme/readme_fr.md Normal file
View File

@@ -0,0 +1,132 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - IDE Opensource pour explorer et tester des APIs.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](docs/readme/readme_ua.md) | [Русский](docs/readme/readme_ru.md) | [Türkçe](docs/readme/readme_tr.md) | [Deutsch](docs/readme/readme_de.md) | **Français** | [Português (BR)](docs/readme/readme_pt_br.md) | [한국어](docs/readme/readme_kr.md) | [বাংলা](docs/readme/readme_bn.md) | [Español](docs/readme/readme_es.md) | [Italiano](docs/readme/readme_it.md) | [Română](docs/readme/readme_ro.md) | [Polski](docs/readme/readme_pl.md)
Bruno est un nouveau client API, innovant, qui a pour but de révolutionner le _status quo_ que représente Postman et les autres outils.
Bruno sauvegarde vos collections directement sur votre système de fichiers. Nous utilisons un langage de balise de type texte pour décrire les requêtes API.
Vous pouvez utiliser git ou tout autre gestionnaire de version pour travailler de manière collaborative sur vos collections d'APIs.
Bruno ne fonctionne qu'en mode déconnecté. Il n'y a pas de d'abonnement ou de synchronisation avec le cloud Bruno, il n'y en aura jamais. Nous sommes conscients de la confidentialité de vos données et nous sommes convaincus qu'elles doivent rester sur vos appareils. Vous pouvez lire notre vision à long terme [ici (en anglais)](https://github.com/usebruno/bruno/discussions/269).
📢 Regarder notre présentation récente lors de la conférence India FOSS 3.0 (en anglais) [ici](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### Installation
Bruno est disponible au téléchargement [sur notre site web](https://www.usebruno.com/downloads), pour Mac, Windows et Linux.
Vous pouvez aussi installer Bruno via un gestionnaire de paquets, comme Homebrew, Chocolatey, Scoop, Snap et Apt.
```sh
# Mac via Homebrew
brew install bruno
# Windows via Chocolatey
choco install bruno
# Windows via Scoop
scoop bucket add extras
scoop install bruno
# Linux via Snap
snap install bruno
# Linux via Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Fonctionne sur de multiples platformes 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Collaborer via Git 👩‍💻🧑‍💻
Ou n'importe quel système de gestion de sources
![bruno](/assets/images/version-control.png) <br /><br />
### Liens importants 📌
- [Notre vision à long terme (en anglais)](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Documentation](https://docs.usebruno.com)
- [Site web](https://www.usebruno.com)
- [Prix](https://www.usebruno.com/pricing)
- [Téléchargement](https://www.usebruno.com/downloads)
- [Sponsors Github](https://github.com/sponsors/helloanoop)
### Showcase 🎥
- [Témoignages](https://github.com/usebruno/bruno/discussions/343)
- [Centre de connaissance](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Soutien ❤️
Ouaf! Si vous aimez le projet, cliquez sur le bouton ⭐ !!
### Partage de témoignages 📣
Si Bruno vous a aidé dans votre travail, au sein de votre équipe, merci de penser à partager votre témoignage sur la [page discussion Github dédiée](https://github.com/usebruno/bruno/discussions/343)
### Publier Bruno sur un nouveau gestionnaire de paquets
Veuillez regarder [ici](/publishing.md) pour plus d'information.
### Contribuer 👩‍💻🧑‍💻
Je suis heureux de voir que vous cherchez à améliorer Bruno. Merci de consulter le [guide de contribution](../contributing/contributing_fr.md)
Même si vous n'êtes pas en mesure de contribuer directement via du code, n'hésitez pas à consigner les bogues et les demandes de nouvelles fonctionnalités pour résoudre vos cas d'usage !
### Auteurs
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Restons en contact 🌐
[Twitter](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Marque
**Nom**
`Bruno` est une marque appartenant à [Anoop M D](https://www.helloanoop.com/)
**Logo**
Le logo est issu de [OpenMoji](https://openmoji.org/library/emoji-1F436/).
Licence: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Licence 📄
[MIT](/license.md)

121
docs/readme/readme_it.md Normal file
View File

@@ -0,0 +1,121 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - Opensource IDE per esplorare e testare gli APIs.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
Bruno è un nuovo ed innovativo API client, mirato a rivoluzionare lo status quo rappresentato da Postman e strumenti simili disponibili.
Bruno memorizza le tue raccolte direttamente in una cartella del tuo filesystem. Utilizziamo un linguaggio di markup in testo semplice chiamato Bru per salvare informazioni sulle richeste API.
Puoi utilizzare Git o qualsiasi sistema di controllo che preferisci per collaborare sulle tue raccolte di API.
Bruno funziona solo in modalità offline. Non ci sono piani per aggiungere la sincronizzazione su cloud a Bruno in futuro. Valorizziamo la privacy dei tuoi dati e crediamo che dovrebbero rimanere sul tuo dispositivo. Puoi leggere la nostra visione a lungo termine [qui (in inglese)](https://github.com/usebruno/bruno/discussions/269)
📢 Guarda la nostra presentazione più recente alla conferenza India FOSS 3.0 [qui](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### Installazione
Bruno è disponibile come download binario [sul nostro sito](https://www.usebruno.com/downloads) per Mac, Windows e Linux.
Puoi installare Bruno anche tramite package manger come Homebrew, Chocolatey, Snap e Apt.
```sh
# Su Mac come Homebrew
brew install bruno
# Su Windows come Chocolatey
choco install bruno
# Su Linux tramite Snap
snap install bruno
# Su Linux tramite Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Funziona su diverse piattaforme 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Collabora tramite Git 👩‍💻🧑‍💻
O con qualsiasi sistema di controllo di versioni a tua scelta
![bruno](/assets/images/version-control.png) <br /><br />
### Collegamenti importanti 📌
- [La nostra visione a lungo termine](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Documentazione](https://docs.usebruno.com)
- [Sito internet](https://www.usebruno.com)
- [Prezzo](https://www.usebruno.com/pricing)
- [Download](https://www.usebruno.com/downloads)
### Showcase 🎥
- [Testimonianze](https://github.com/usebruno/bruno/discussions/343)
- [Centro di conoscenza](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Supporto ❤️
Woof! se ti piace il progetto, premi quel ⭐ pulsante !!
### Testimonianze condivise 📣
Se Bruno ti ha aiutato con il tuo lavoro ed il tuo team, per favore non dimenticare di condividere le tue [testimonianze nella nostra discussione su GitHub](https://github.com/usebruno/bruno/discussions/343)
### Pubblica Bruno su un nuovo gestore di pacchetti
Per favore vedi [qui](publishing.md) per accedere a più informazioni.
### Contribuire 👩‍💻🧑‍💻
Sono felice che vuoi migliorare Bruno. Per favore controlla la [guida per la partecipazione](contributing.md)
Anche se non sei in grado di contribuire tramite il codice, non esitare a segnalare bug e richieste di funzionalità che devono essere implementati per risolvere il tuo caso d'uso.
### Autori
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Resta in contatto 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Sito internet](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Marchio
**Nome**
`Bruno` è un marchio registrato appartenente a [Anoop M D](https://www.helloanoop.com/)
**Logo**
Il logo è stato creato da [OpenMoji](https://openmoji.org/library/emoji-1F436/). Licenza: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Licenza 📄
[MIT](license.md)

121
docs/readme/readme_kr.md Normal file
View File

@@ -0,0 +1,121 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - API 탐색 및 테스트를 위한 오픈소스 IDE.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
Bruno는 새롭고 혁신적인 API 클라이언트로, Postman과 유사한 툴들을 혁신하는 것을 목표로 합니다.
Bruno는 사용자의 컬렉션을 파일 시스템의 폴더에 직접 저장합니다. 일반 텍스트 마크업 언어인 Bru를 사용해 API 요청에 대한 정보를 저장합니다.
Git 또는 원하는 버전 관리 도구를 사용하여 API 컬렉션을 연동할 수 있습니다.
브루는 오프라인 전용입니다. 브루노에 클라우드 동기화 기능을 추가할 계획은 없습니다. 저희는 사용자의 데이터 프라이버시를 소중히 여기며, 데이터는 사용자의 기기에 남아 있어야 한다고 믿습니다. 장기 비전 읽기 [링크](https://github.com/usebruno/bruno/discussions/269)
📢 Watch our recent talk at India FOSS 3.0 Conference [here](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### 설치
Bruno 는 여기에서 다운로드 받을 수 있습니다.[링크](https://www.usebruno.com/downloads) (맥, 윈도우, 리눅스)
Homebrew, Chocolatey, Snap, Apt 같은 패키지 관리자를 통해서도 Bruno를 설치할 수 있습니다.
```sh
# On Mac via Homebrew
brew install bruno
# On Windows via Chocolatey
choco install bruno
# On Linux via Snap
snap install bruno
# On Linux via Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### 여러 플랫폼에서 실행하세요. 🖥️
![bruno](assets/images/run-anywhere.png) <br /><br />
### Git과 연동하세요. 👩‍💻🧑‍💻
또는 원하는 버전 관리 시스템을 선택하세요.
![bruno](assets/images/version-control.png) <br /><br />
### 중요 링크 📌
- [Our Long Term Vision](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Documentation](https://docs.usebruno.com)
- [Website](https://www.usebruno.com)
- [Pricing](https://www.usebruno.com/pricing)
- [Download](https://www.usebruno.com/downloads)
### 쇼케이스 🎥
- [Testimonials](https://github.com/usebruno/bruno/discussions/343)
- [Knowledge Hub](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### 지원 ❤️
프로젝트가 마음에 들면 ⭐ 버튼을 눌러 주세요.
### 후기 공유 📣
Bruno가 여러분과 여러분의 팀에 도움이 되었다면, 잊지 말고 공유해 주세요. [Github discussion 공유 링크](https://github.com/usebruno/bruno/discussions/343)
### 새 패키지 관리자에게 게시
더 많은 정보를 확인하시려명 링크를 클릭해 주세요.[배포 가이드](publishing.md)
### 컨트리뷰트 👩‍💻🧑‍💻
컨트리뷰트에 관심이 있으시면 링크를 참고해 주세요. [컨트리뷰트 가이드](contributing.md)
코드를 통해 기여할 수 없더라도 사용 사례를 해결하기 위해 구현이 필요한 버그나 기능 요청을 주저하지 마시고 제출해 주세요.
### Authors
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Stay in touch 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Trademark
**Name**
`Bruno` is a trademark held by [Anoop M D](https://www.helloanoop.com/)
**Logo**
The logo is sourced from [OpenMoji](https://openmoji.org/library/emoji-1F436/). License: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### License 📄
[MIT](license.md)

129
docs/readme/readme_pl.md Normal file
View File

@@ -0,0 +1,129 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - Otwartoźródłowe IDE do exploracji i testów APIs.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](docs/readme/readme_ua.md) | [Русский](docs/readme/readme_ru.md) | [Türkçe](docs/readme/readme_tr.md) | [Deutsch](docs/readme/readme_de.md) | [Français](docs/readme/readme_fr.md) | [Português (BR)](docs/readme/readme_pt_br.md)) | [한국어](docs/readme/readme_kr.md) ) | [বাংলা](docs/readme/readme_bn.md) | [Español](docs/readme/readme_es.md) | [Italiano](docs/readme/readme_it.md) | [Română](docs/readme/readme_ro.md) | **Polski**
Bruno to nowy i innowacyjny klient API, którego celem jest zrewolucjonizowanie status quo reprezentowy przez Postman i podobne narzędzia.
Bruno przechowuje twoje kolekcje bezpośrednio w folderze na twoim systemie plików. Używamy prostego języka znaczników, Bru, do zapisywania informacji o żądaniach API.
Możesz użyć Git lub dowolnego systemu kontroli wersji do współpracy nad swoimi kolekcjami API.
Bruno działa tylko w trybie offline. Nie planujemy nigdy dodawać synchronizacji w chmurze do Bruno. Cenimy prywatność Twoich danych i wierzymy, że powinny one pozostać na Twoim urządzeniu. Przeczytaj naszą długoterminową wizję [tutaj](https://github.com/usebruno/bruno/discussions/269)
📢 Obejrzyj naszą ostatnią rozmowę na konferencji India FOSS 3.0 [tutaj](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### Instalacja
Bruno jest dostępny jako plik binarny do pobrania [na naszej stronie internetowej](https://www.usebruno.com/downloads) dla Mac, Windows i Linux.
Możesz również zainstalować Bruno za pomocą menedżerów pakietów, takich jak Homebrew, Chocolatey, Scoop, Snap i Apt.
```sh
# On Mac via Homebrew
brew install bruno
# On Windows via Chocolatey
choco install bruno
# On Windows via Scoop
scoop bucket add extras
scoop install bruno
# On Linux via Snap
snap install bruno
# On Linux via Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Uruchom na wielu platformach 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Współpracuj przez Git 👩‍💻🧑‍💻
Lub dowolny inny system kontroli wersji, który wybierzesz
![bruno](/assets/images/version-control.png) <br /><br />
### Ważne Linki 📌
- [Nasza Długoterminowa Wizja](https://github.com/usebruno/bruno/discussions/269)
- [Mapa Drogi](https://github.com/usebruno/bruno/discussions/384)
- [Dokumentacja](https://docs.usebruno.com)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bruno)
- [Strona Internetowa](https://www.usebruno.com)
- [Cennik](https://www.usebruno.com/pricing)
- [Pobieranie](https://www.usebruno.com/downloads)
- [Sponsorzy Github](https://github.com/sponsors/helloanoop).
### Zobacz 🎥
- [Opinie](https://github.com/usebruno/bruno/discussions/343)
- [Centrum Wiedzy](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Wsparcie ❤️
Jeśli podoba Ci się Bruno i chcesz wspierać naszą pracę opensource, rozważ sponsorowanie nas przez [Sponsorzy Github](https://github.com/sponsors/helloanoop).
### Udostępnij Opinie 📣
Jeśli Bruno pomógł Tobie w pracy i Twoim zespołom, nie zapomnij podzielić się swoimi [opiniami na naszej dyskusji GitHub](https://github.com/usebruno/bruno/discussions/343)
### Publikowanie w Nowych Menedżerach Pakietów
Więcej informacji znajdziesz [tutaj](publishing.md).
### Współpraca 👩‍💻🧑‍💻
Cieszę się, że chcesz udoskonalić bruno. Proszę sprawdź [przewodnik współpracy](contributing.md)
Nawet jeśli nie jesteś w stanie przyczynić się poprzez kod, nie wahaj się zgłaszać błędów i wniosków o funkcje, które muszą zostać zaimplementowane, aby rozwiązać Twój przypadek użycia.
### Autorzy
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Pozostań w kontakcie 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Strona Internetowa](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Znak Towarowy
**Nazwa**
`Bruno` jest znakiem towarowym należącym do [Anoop M D](https://www.helloanoop.com/)
**Logo**
Logo pochodzi z [OpenMoji](https://openmoji.org/library/emoji-1F436/). Licencja: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Licencja 📄
[MIT](license.md)

121
docs/readme/readme_pt_br.md Normal file
View File

@@ -0,0 +1,121 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - IDE de código aberto para explorar e testar APIs.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
Bruno é um novo e inovador cliente de API, com o objetivo de revolucionar o status quo representado por ferramentas como o Postman e outras semelhantes.
Bruno armazena suas coleções diretamente em uma pasta no seu sistema de arquivos. Utilizamos uma linguagem de marcação de texto simples, chamada Bru, para salvar informações sobre requisições de API.
Você pode usar o Git ou qualquer sistema de controle de versão de sua escolha para colaborar em suas coleções de API.
Bruno é totalmente offline. Não há planos de adicionar sincronização em nuvem ao Bruno, nunca. Valorizamos a privacidade de seus dados e acreditamos que eles devem permanecer em seu dispositivo. Saiba mais sobre nossa visão a longo prazo [aqui](https://github.com/usebruno/bruno/discussions/269).
📢 Assista à nossa palestra recente na India FOSS 3.0 Conference [aqui](https://www.youtube.com/watch?v=7bSMFpbcPiY).
![bruno](../../assets/images/landing-2.png) <br /><br />
### Instalação
Bruno está disponível para download como binário [em nosso site](https://www.usebruno.com/downloads) para Mac, Windows e Linux.
Você também pode instalar o Bruno via gerenciadores de pacotes como Homebrew, Chocolatey, Snap e Apt.
```sh
# Mac via Homebrew
brew install bruno
# Windows via Chocolatey
choco install bruno
# Linux via Snap
snap install bruno
# Linux via Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Execute em várias plataformas 🖥️
![bruno](../../assets/images/run-anywhere.png) <br /><br />
### Colaboração via Git 👩‍💻🧑‍💻
Ou qualquer sistema de controle de versão de sua escolha.
![bruno](../../assets/images/version-control.png) <br /><br />
### Links Importantes 📌
- [Nossa Visão de Longo Prazo](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Documentação](https://docs.usebruno.com)
- [Website](https://www.usebruno.com)
- [Preços](https://www.usebruno.com/pricing)
- [Download](https://www.usebruno.com/downloads)
### Showcase 🎥
- [Depoimentos](https://github.com/usebruno/bruno/discussions/343)
- [Hub de Conhecimento](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Apoie ❤️
Au-au! Se você gosta do projeto, clique no botão ⭐!!
### Compartilhe sua experiência 📣
Se o Bruno ajudou no seu trabalho e/ou no trabalho de sua equipe, por favor, não se esqueça de compartilhar seu [depoimento em nossas discussões no GitHub](https://github.com/usebruno/bruno/discussions/343).
### Publicando em Novos Gerenciadores de Pacotes
Por favor, verifique [aqui](../publishing/publishing_pt_br.md) mais informações.
### Colabore 👩‍💻🧑‍💻
Fico feliz que você queira melhorar o Bruno. Por favor, confira o [guia de colaboração](../contributing/contributing_pt_br.md).
Mesmo que você não possa contribuir codificando, não deixe de relatar problemas e solicitar recursos que precisam ser implementados para atender ao contexto de seu dia a dia.
### Authors
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Mantenha Contato 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Trademark
**Nome**
`Bruno` é uma marca registrada de [Anoop M D](https://www.helloanoop.com/).
**Logo**
A logo é original do [OpenMoji](https://openmoji.org/library/emoji-1F436/). Licença: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/).
### Licença 📄
[MIT](license.md)

125
docs/readme/readme_ro.md Normal file
View File

@@ -0,0 +1,125 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - Mediu integrat de dezvoltare cu sursă deschisă pentru explorarea și testarea API-urilor.
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](/docs/readme/readme_ua.md) | [Русский](/docs/readme/readme_ru.md) | [Türkçe](/docs/readme/readme_tr.md) | [Deutsch](/docs/readme/readme_de.md) | [Français](/docs/readme/readme_fr.md) | [Português (BR)](/docs/readme/readme_pt_br.md)) | [한국어](/docs/readme/readme_kr.md) | [বাংলা](/docs/readme/readme_bn.md) | [Español](/docs/readme/readme_es.md) | [Italiano](/docs/readme/readme_it.md) | **Română**
Bruno este un client API nou și inovativ, care vizează să revoluționeze status quo-ul reprezentat de Postman și alte instrumente similare.
Bruno salvează colecțiile voastre direct într-o mapă din sistemul dvs. de fișiere. Folosim un limbaj de marcare cu text simplu, Bru, pentru a salva informații despre cererile API.
Puteți folosi Git sau orice altă unealtă de control al versiunii la alegere pentru a colabora la colecțiile API voastre.
Bruno este numai offline. Nu va exista niciodată vreun plan pentru a adăuga sincronizarea cloud la Bruno. Noi valorăm confidențialitatea datelor voastre și credem că ar trebui să rămână pe dispozitivul vostru. Citiți viziunea noastră pe termen lung [aici](https://github.com/usebruno/bruno/discussions/269)
📢 Priviți prezentarea noastră recentă de la India FOSS 3.0 Conference [aici](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### Instalarea
Bruno este disponibil ca descărcare binară [pe website-ul nostru](https://www.usebruno.com/downloads) pentru Mac, Windows și Linux.
De asemenea, puteţi instala Bruno cu un gestionar de pachete precum Homebrew, Chocolatey, Snap şi Apt.
```sh
# Pe Mac cu Homebrew
brew install bruno
# Pe Windows cu Chocolatey
choco install bruno
# Pe Linux cu Snap
snap install bruno
# Pe Linux cu Apt
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Utilizați pe mai multe platforme 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Colaborați cu Git 👩‍💻🧑‍💻
Sau orice unealtă de control al versiunii la alegere
![bruno](/assets/images/version-control.png) <br /><br />
### Linkuri importante 📌
- [Viziunea noastră pe termen lung](https://github.com/usebruno/bruno/discussions/269)
- [Roadmap](https://github.com/usebruno/bruno/discussions/384)
- [Documentație](https://docs.usebruno.com)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bruno)
- [Website](https://www.usebruno.com)
- [Prețuri](https://www.usebruno.com/pricing)
- [Descărcări](https://www.usebruno.com/downloads)
- [Sponsori GitHub](https://github.com/sponsors/helloanoop).
### Vitrina 🎥
- [Recenzii](https://github.com/usebruno/bruno/discussions/343)
- [Centrul de cunoștințe](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Sprijiniți ❤️
Dacă vă place Bruno și doriți să sprijiniți munca noastră de sursă deschisă, puteți considera să ne sponsorizați [pe GitHub](https://github.com/sponsors/helloanoop).
### Distribuiți recenziile 📣
Dacă Bruno va ajutat la locul de muncă și la echipele dvs., vă rugăm să nu uitați să distribuiți [recenziile în discuția noastră GitHub](https://github.com/usebruno/bruno/discussions/343)
### Publicarea la gestionari de pachete noi
Vă rugăm să citiţi [aici](/docs/publishing/publishing_ro.md) pentru mai multă informaţie.
### Contribuiți 👩‍💻🧑‍💻
Mă bucur că doriți să îmbunătățiți Bruno. Vă rugăm să consultați [ghidul pentru contribuire](/docs/contributing/contributing_ro.md)
Chiar dacă nu puteți face contribuții prin cod, vă rugăm să nu ezitați să raportați erori și să solicitați funcții care trebuie implementate pentru a rezolva cazul dvs. de utilizare.
### Autori
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### Păstrați legătura 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Marcă comercială
**Nume**
`Bruno` este o marcă deținută de [Anoop M D](https://www.helloanoop.com/)
**Logo**
Logo-ul provine de la [OpenMoji](https://openmoji.org/library/emoji-1F436/). Licența: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Licența 📄
[MIT](license.md)

View File

@@ -1,5 +1,5 @@
<br />
<img src="assets/images/logo-transparent.png" width="80"/>
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - IDE с открытым исходным кодом для изучения и тестирования API.
@@ -10,7 +10,8 @@
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | [Українська](/readme_ua.md) | **Русский** | [Türkçe](/readme_tr.md)
[English](/readme.md) | [Українська](/readme_ua.md) | **Русский** | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) | [বাংলা](docs/readme/readme_bn.md)
Bruno - новый и инновационный клиент API, направленный на революцию в установившейся ситуации, представленной Postman и подобными инструментами.
@@ -20,17 +21,17 @@ Bruno хранит ваши коллекции непосредственно в
Bruno работает только в автономном режиме. Добавление облачной синхронизации в Bruno не планируется. Мы ценим конфиденциальность ваших данных и считаем, что они должны оставаться на вашем устройстве. Ознакомьтесь с нашим долгосрочным видением [здесь](https://github.com/usebruno/bruno/discussions/269)
![bruno](assets/images/landing-2.png) <br /><br />
![bruno](/assets/images/landing-2.png) <br /><br />
### Работа на нескольких платформах 🖥️
![bruno](assets/images/run-anywhere.png) <br /><br />
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Совместная работа через Git 👩‍💻🧑‍💻
Или другая система контроля версий по вашему выбору
![bruno](assets/images/version-control.png) <br /><br />
![bruno](/assets/images/version-control.png) <br /><br />
### Важные ссылки 📌
@@ -56,7 +57,7 @@ Bruno работает только в автономном режиме. Доб
### Внести вклад 👩‍💻🧑‍💻
Я рад, что Вы хотите улучшить Бруно. Пожалуйста, ознакомьтесь с [этим гайдом](contributing_ru.md)
Я рад, что Вы хотите улучшить Бруно. Пожалуйста, ознакомьтесь с [этим гайдом](../contributing/contributing_ru.md)
Даже если вы не можете внести свой вклад с помощью кода, пожалуйста, не стесняйтесь сообщать об ошибках и пожеланиях к функциям, которые необходимо реализовать для решения вашей задачи.
@@ -76,4 +77,4 @@ Bruno работает только в автономном режиме. Доб
### Лицензия 📄
[MIT](license.md)
[MIT](/license.md)

129
docs/readme/readme_tr.md Normal file
View File

@@ -0,0 +1,129 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - API'leri keşfetmek ve test etmek için açık kaynaklı IDE.
[![GitHub sürümü](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![Web Sitesi](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![İndir](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](../../readme.md) | [Українська](docs/readme/readme_ua.md) | [Русский](docs/readme/readme_ru.md) | **Türkçe** | [Deutsch](docs/readme/readme_de.md) | [Français](docs/readme/readme_fr.md) | [Português (BR)](docs/readme/readme_pt_br.md) | [한국어](docs/readme/readme_kr.md) | [বাংলা](docs/readme/readme_bn.md) | [Español](docs/readme/readme_es.md) | [Italiano](docs/readme/readme_it.md) | [Română](docs/readme/readme_ro.md) | [Polski](docs/readme/readme_pl.md) | [简体中文](docs/readme/readme_cn.md)
Bruno, Postman ve benzeri araçlar tarafından temsil edilen statükoda devrim yaratmayı amaçlayan yeni ve yenilikçi bir API istemcisidir.
Bruno koleksiyonlarınızı doğrudan dosya sisteminizdeki bir klasörde saklar. API istekleri hakkındaki bilgileri kaydetmek için düz bir metin biçimlendirme dili olan Bru kullanıyoruz.
API koleksiyonlarınız üzerinde işbirliği yapmak için Git veya seçtiğiniz herhangi bir sürüm kontrolünü kullanabilirsiniz.
Bruno yalnızca çevrimdışıdır. Bruno'ya bulut senkronizasyonu eklemek gibi bir planımız yok. Veri gizliliğinize değer veriyoruz ve cihazınızda kalması gerektiğine inanıyoruz. Uzun vadeli vizyonumuzu okuyun [burada](https://github.com/usebruno/bruno/discussions/269)
📢 Hindistan FOSS 3.0 Konferansındaki son konuşmamızı izleyin [burada](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](/assets/images/landing-2.png) <br /><br />
### Kurulum
Bruno Mac, Windows ve Linux için ikili indirme olarak [web sitemizde](https://www.usebruno.com/downloads) mevcuttur.
Bruno'yu Homebrew, Chocolatey, Scoop, Snap ve Apt gibi paket yöneticileri aracılığıyla da yükleyebilirsiniz.
```sh
# Homebrew aracılığıyla Mac'te
brew install bruno
# Chocolatey aracılığıyla Windows'ta
choco install bruno
# Scoop aracılığıyla Windows'ta
scoop bucket add extras
scoop install bruno
# Snap aracılığıyla Linux'ta
snap install bruno
# Apt aracılığıyla Linux'ta
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### Birden fazla platformda çalıştırın 🖥️
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Git üzerinden katkıda bulunun 👩‍💻🧑‍💻
Veya seçtiğiniz herhangi bir sürüm kontrol sistemi
![bruno](/assets/images/version-control.png) <br /><br />
### Önemli Bağlantılar 📌
- [Uzun Vadeli Vizyonumuz](https://github.com/usebruno/bruno/discussions/269)
- [Yol Haritası](https://github.com/usebruno/bruno/discussions/384)
- [Dokümantasyon](https://docs.usebruno.com)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bruno)
- [Web sitesi](https://www.usebruno.com)
- [Fiyatlandırma](https://www.usebruno.com/pricing)
- [İndir](https://www.usebruno.com/downloads)
- [Github Sponsorları](https://github.com/sponsors/helloanoop).
### Vitrin 🎥
- [Görüşler](https://github.com/usebruno/bruno/discussions/343)
- [Bilgi Merkezi](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### Destek ❤️
Bruno'yu seviyorsanız ve açık kaynak çalışmalarımızı desteklemek istiyorsanız, [Github Sponsorları](https://github.com/sponsors/helloanoop) aracılığıyla bize sponsor olmayı düşünün.
### Referansları Paylaşın 📣
Bruno işinizde ve ekiplerinizde size yardımcı olduysa, lütfen [github tartışmamızdaki referanslarınızı](https://github.com/usebruno/bruno/discussions/343) paylaşmayı unutmayın.
### Yeni Paket Yöneticilerine Yayınlama
Daha fazla bilgi için lütfen [buraya](publishing.md) bakın.
### Katkıda Bulunun 👩‍💻🧑‍💻
Bruno'yu geliştirmek istemenize sevindim. Lütfen [katkıda bulunma kılavuzuna](contributing.md) göz atın
Kod yoluyla katkıda bulunamasanız bile, lütfen kullanım durumunuzu çözmek için uygulanması gereken hataları ve özellik isteklerini bildirmekten çekinmeyin.
### Katkıda Bulunanlar
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### İletişimde Kalın 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### Ticari Marka
**İsim**
`Bruno` [Anoop M D](https://www.helloanoop.com/) tarafından sahip olunan bir ticari markadır.
**Logo**
Logo [OpenMoji](https://openmoji.org/library/emoji-1F436/) adresinden alınmıştır. Lisans: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### Lisans 📄
[MIT](license.md)

View File

@@ -1,5 +1,5 @@
<br />
<img src="assets/images/logo-transparent.png" width="80"/>
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - IDE із відкритим кодом для тестування та дослідження API
@@ -10,7 +10,7 @@
[![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](/readme.md) | **Українська** | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md)
[English](/readme.md) | **Українська** | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) | [বাংলা](docs/readme/readme_bn.md)
Bruno це новий та іноваційний API клієнт, націлений на революційну зміну статус кво, запровадженого інструментами на кшталт Postman.
@@ -20,17 +20,17 @@ Bruno зберігає ваші колекції напряму у теці на
Bruno є повністю автономним. Немає жодних планів додавати будь-які синхронізації через хмару, ніколи. Ми цінуємо приватність ваших даних, і вважаєм, що вони мають залишитись лише на вашому комп'ютері. Взнати більше про наше бачення у довготривалій перспективі можна [тут](https://github.com/usebruno/bruno/discussions/269)
![bruno](assets/images/landing-2.png) <br /><br />
![bruno](/assets/images/landing-2.png) <br /><br />
### Кросплатформенність 🖥️
![bruno](assets/images/run-anywhere.png) <br /><br />
![bruno](/assets/images/run-anywhere.png) <br /><br />
### Спільна робота через Git 👩‍💻🧑‍💻
Або будь-яку іншу систему контролю версій на ваш вибір
![bruno](assets/images/version-control.png) <br /><br />
![bruno](/assets/images/version-control.png) <br /><br />
### Важливі посилання 📌
@@ -56,7 +56,7 @@ Bruno є повністю автономним. Немає жодних план
### Зробити свій внесок 👩‍💻🧑‍💻
Я радий що ви бажаєте покращити Bruno. Будь ласка переглянте [інструкцію по контрибуції](contributing_ua.md)
Я радий що ви бажаєте покращити Bruno. Будь ласка переглянте [інструкцію по контрибуції](../contributing/contributing_ua.md)
Навіть якщо ви не можете зробити свій внесок пишучи програмний код, будь ласка не соромтесь рапортувати про помилки і писати запити на новий функціонал, який потрібен вам у вашій роботі.
@@ -77,4 +77,4 @@ Bruno є повністю автономним. Немає жодних план
### Ліцензія 📄
[MIT](license.md)
[MIT](/license.md)

129
docs/readme/readme_zhtw.md Normal file
View File

@@ -0,0 +1,129 @@
<br />
<img src="../../assets/images/logo-transparent.png" width="80"/>
### Bruno - 探索和測試 API 的開源 IDE 工具
[![GitHub version](https://badge.fury.io/gh/usebruno%2Fbruno.svg)](https://badge.fury.io/gh/usebruno%bruno)
[![CI](https://github.com/usebruno/bruno/actions/workflows/unit-tests.yml/badge.svg?branch=main)](https://github.com/usebruno/bruno/workflows/unit-tests.yml)
[![Commit Activity](https://img.shields.io/github/commit-activity/m/usebruno/bruno)](https://github.com/usebruno/bruno/pulse)
[![X](https://img.shields.io/twitter/follow/use_bruno?style=social&logo=x)](https://twitter.com/use_bruno)
[![网站](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com)
[![下载](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads)
[English](../../readme.md) | [Українська](./readme_ua.md) | [Русский](./readme_ru.md) | [Türkçe](./readme_tr.md) | [Deutsch](./readme_de.md) | [Français](./readme_fr.md) | [Português (BR)](./readme_pt_br.md) | [한국어](./readme_kr.md) | [বাংলা](./readme_bn.md) | [Español](./readme_es.md) | [Italiano](./readme_it.md) | [Română](./readme_ro.md) | [Polski](./readme_pl.md) | [简体中文](./readme_cn.md) | **正體中文**
Bruno 是一個全新且有創新性的 API 用戶端,目的在徹底改變以 Postman 和其他類似工具的現況。
Bruno 將您的 API 集合直接儲存在檔案系統上的資料夾中。我們以純文本標記語言- Bru來儲存和 API 有關的資訊。
您可以使用 Git 或您選擇的任何版本管理軟體,來管理及協作 API 集合。
Bruno 僅能夠離線使用,永遠不會計劃為 Bruno 增加雲端同步的功能。我們重視您的資料隱私,並相信它應該保留在您的裝置上。瞭解我們的長期願景 [連結](https://github.com/usebruno/bruno/discussions/269)
📢 觀看我們最近在 India FOSS 3.0 研討會上的演講 [連結](https://www.youtube.com/watch?v=7bSMFpbcPiY)
![bruno](../../assets/images/landing-2.png) <br /><br />
### 安装
可以在我們的 [網站上下載](https://www.usebruno.com/downloads) 跨平臺Mac、Windows 和 Linux的 Bruno 程式檔。
您也可以透過套件管理程式來安裝 BrunoHomebrew、Chocolatey、Scoop、Snap 和 Apt。
```shell
# 在 Mac 上使用 Homebrew 安裝
brew install bruno
# 在 Windows 上使用 Chocolatey 安裝
choco install bruno
# 在 Windows 上使用 Scoop 安裝
scoop bucket add extras
scoop install bruno
# 在 Linux 上使用 Snap 安裝
snap install bruno
# 在 Linux 上使用 Apt 安裝
sudo mkdir -p /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/bruno.gpg --keyserver keyserver.ubuntu.com --recv-keys 9FA6017ECABE0266
echo "deb [signed-by=/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable" | sudo tee /etc/apt/sources.list.d/bruno.list
sudo apt update
sudo apt install bruno
```
### 跨多個平台運行 🖥️
![bruno](../../assets/images/run-anywhere.png) <br /><br />
### 透過 Git 進行協作 👩‍💻🧑‍💻
您選擇的任何版本管理軟體
![bruno](../../assets/images/version-control.png) <br /><br />
### 重要連結 📌
- [我們的長期願景](https://github.com/usebruno/bruno/discussions/269)
- [藍圖](https://github.com/usebruno/bruno/discussions/384)
- [說明文件](https://docs.usebruno.com)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/bruno)
- [網站](https://www.usebruno.com)
- [定價](https://www.usebruno.com/pricing)
- [下載](https://www.usebruno.com/downloads)
- [Github 贊助](https://github.com/sponsors/helloanoop).
### 展示 🎥
- [Testimonials](https://github.com/usebruno/bruno/discussions/343)
- [Knowledge Hub](https://github.com/usebruno/bruno/discussions/386)
- [Scriptmania](https://github.com/usebruno/bruno/discussions/385)
### 贊助支持 ❤️
如果您喜歡 Bruno 和希望支持我們在開源上的工作,請考慮使用 [Github Sponsors](https://github.com/sponsors/helloanoop) 來贊助我們。
### 分享感想 📣
如果 Bruno 在工作和您的團隊中為您提供了幫助,請不要忘記在我們的 [GitHub 討論區](https://github.com/usebruno/bruno/discussions/343) 中分享您的感想。
### 發佈到新的套件管理器
更多資訊,請參考這個 [連結](../publishing/publishing_zhtw.md) 。
### 持續關注 🌐
[𝕏 (Twitter)](https://twitter.com/use_bruno) <br />
[Website](https://www.usebruno.com) <br />
[Discord](https://discord.com/invite/KgcZUncpjq) <br />
[LinkedIn](https://www.linkedin.com/company/usebruno)
### 商標
**名稱**
`Bruno` 是 [Anoop M D](https://www.helloanoop.com/) 持有的商標。
**Logo**
Logo 源自於 [OpenMoji](https://openmoji.org/library/emoji-1F436/)。授權: CC [BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
### 提供貢獻 👩‍💻🧑‍💻
我很高興您希望一同改善 Bruno。請參考 [貢獻指南](../contributing/contributing_zhtw.md)。
即使您無法透過程式碼做出貢獻,我們仍然歡迎您提出 Bug 及新的實作需求。
### 作者們
<div align="center">
<a href="https://github.com/usebruno/bruno/graphs/contributors">
<img src="https://contrib.rocks/image?repo=usebruno/bruno" />
</a>
</div>
### 授權許可 📄
[MIT](../../license.md)

4675
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,12 +5,13 @@
"packages/bruno-app",
"packages/bruno-electron",
"packages/bruno-cli",
"packages/bruno-tauri",
"packages/bruno-common",
"packages/bruno-schema",
"packages/bruno-query",
"packages/bruno-js",
"packages/bruno-lang",
"packages/bruno-testbench",
"packages/bruno-tests",
"packages/bruno-toml",
"packages/bruno-graphql-docs"
],
"homepage": "https://usebruno.com",
@@ -18,18 +19,20 @@
"@faker-js/faker": "^7.6.0",
"@jest/globals": "^29.2.0",
"@playwright/test": "^1.27.1",
"@types/jest": "^29.5.11",
"fs-extra": "^11.1.1",
"husky": "^8.0.3",
"jest": "^29.2.0",
"pretty-quick": "^3.1.3",
"randomstring": "^1.2.2",
"ts-jest": "^29.0.5",
"fs-extra": "^11.1.1"
"ts-jest": "^29.0.5"
},
"scripts": {
"dev:web": "npm run dev --workspace=packages/bruno-app",
"build:web": "npm run build --workspace=packages/bruno-app",
"prettier:web": "npm run prettier --workspace=packages/bruno-app",
"dev:electron": "npm run dev --workspace=packages/bruno-electron",
"build:bruno-common": "npm run build --workspace=packages/bruno-common",
"build:bruno-query": "npm run build --workspace=packages/bruno-query",
"build:graphql-docs": "npm run build --workspace=packages/bruno-graphql-docs",
"build:electron": "node ./scripts/build-electron.js",

View File

@@ -1,5 +1,6 @@
{
"compilerOptions": {
"jsx": "react",
"target": "es2017",
"allowSyntheticDefaultImports": false,
"baseUrl": "./",

View File

@@ -3,7 +3,7 @@
"version": "0.3.0",
"private": true,
"scripts": {
"dev": "cross-env ENV=dev next dev",
"dev": "cross-env ENV=dev next dev -p 3000",
"build": "next build && next export",
"start": "next start",
"lint": "next lint",
@@ -18,13 +18,16 @@
"@reduxjs/toolkit": "^1.8.0",
"@tabler/icons": "^1.46.0",
"@tippyjs/react": "^4.2.6",
"@usebruno/common": "0.1.0",
"@usebruno/graphql-docs": "0.1.0",
"@usebruno/schema": "0.6.0",
"axios": "^0.26.0",
"axios": "^1.5.1",
"classnames": "^2.3.1",
"codemirror": "^5.65.2",
"codemirror-graphql": "^1.2.5",
"codemirror": "5.65.2",
"codemirror-graphql": "1.2.5",
"cookie": "^0.6.0",
"escape-html": "^1.0.3",
"file": "^0.2.2",
"file-dialog": "^0.0.8",
"file-saver": "^2.0.5",
"formik": "^2.2.9",
@@ -32,10 +35,14 @@
"graphiql": "^1.5.9",
"graphql": "^16.6.0",
"graphql-request": "^3.7.0",
"handlebars": "^4.7.8",
"httpsnippet": "^3.0.1",
"idb": "^7.0.0",
"immer": "^9.0.15",
"jsesc": "^3.0.2",
"jshint": "^2.13.6",
"json5": "^2.2.3",
"jsonlint": "^1.6.3",
"jsonpath-plus": "^7.2.0",
"know-your-http-well": "^0.5.0",
"lodash": "^4.17.21",
"markdown-it": "^13.0.2",
@@ -43,22 +50,30 @@
"nanoid": "3.3.4",
"next": "12.3.3",
"path": "^0.12.7",
"pdfjs-dist": "^3.11.174",
"platform": "^1.3.6",
"posthog-node": "^2.1.0",
"qs": "^6.11.0",
"query-string": "^7.0.1",
"react": "18.2.0",
"react-copy-to-clipboard": "^5.1.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "18.2.0",
"react-github-btn": "^1.4.0",
"react-hot-toast": "^2.4.0",
"react-inspector": "^6.0.2",
"react-pdf": "^7.5.1",
"react-redux": "^7.2.6",
"react-tooltip": "^5.5.2",
"sass": "^1.46.0",
"strip-json-comments": "^5.0.1",
"styled-components": "^5.3.3",
"system": "^2.0.1",
"tailwindcss": "^2.2.19",
"url": "^0.11.3",
"xml-formatter": "^3.5.0",
"yargs-parser": "^21.1.1",
"yup": "^0.32.11"
},
"devDependencies": {

View File

@@ -10,12 +10,89 @@ import isEqual from 'lodash/isEqual';
import { getEnvironmentVariables } from 'utils/collections';
import { defineCodeMirrorBrunoVariablesMode } from 'utils/common/codemirror';
import StyledWrapper from './StyledWrapper';
import jsonlint from 'jsonlint';
import { JSHINT } from 'jshint';
import stripJsonComments from 'strip-json-comments';
let CodeMirror;
const SERVER_RENDERED = typeof navigator === 'undefined' || global['PREVENT_CODEMIRROR_RENDER'] === true;
if (!SERVER_RENDERED) {
CodeMirror = require('codemirror');
window.jsonlint = jsonlint;
window.JSHINT = JSHINT;
//This should be done dynamically if possible
const hintWords = [
'res',
'res.status',
'res.statusText',
'res.headers',
'res.body',
'res.responseTime',
'res.getStatus()',
'res.getHeader(name)',
'res.getHeaders()',
'res.getBody()',
'res.getResponseTime()',
'req',
'req.url',
'req.method',
'req.headers',
'req.body',
'req.timeout',
'req.getUrl()',
'req.setUrl(url)',
'req.getMethod()',
'req.setMethod(method)',
'req.getHeader(name)',
'req.getHeaders()',
'req.setHeader(name, value)',
'req.setHeaders(data)',
'req.getBody()',
'req.setBody(data)',
'req.setMaxRedirects(maxRedirects)',
'req.getTimeout()',
'req.setTimeout(timeout)',
'bru',
'bru.cwd()',
'bru.getEnvName(key)',
'bru.getProcessEnv(key)',
'bru.getEnvVar(key)',
'bru.setEnvVar(key,value)',
'bru.getVar(key)',
'bru.setVar(key,value)',
'bru.setNextRequest(requestName)'
];
CodeMirror.registerHelper('hint', 'brunoJS', (editor, options) => {
const cursor = editor.getCursor();
const currentLine = editor.getLine(cursor.line);
let startBru = cursor.ch;
let endBru = startBru;
while (endBru < currentLine.length && /[\w.]/.test(currentLine.charAt(endBru))) ++endBru;
while (startBru && /[\w.]/.test(currentLine.charAt(startBru - 1))) --startBru;
let curWordBru = startBru != endBru && currentLine.slice(startBru, endBru);
let start = cursor.ch;
let end = start;
while (end < currentLine.length && /[\w]/.test(currentLine.charAt(end))) ++end;
while (start && /[\w]/.test(currentLine.charAt(start - 1))) --start;
const jsHinter = CodeMirror.hint.javascript;
let result = jsHinter(editor) || { list: [] };
result.to = CodeMirror.Pos(cursor.line, end);
result.from = CodeMirror.Pos(cursor.line, start);
if (curWordBru) {
hintWords.forEach((h) => {
if (h.includes('.') == curWordBru.includes('.') && h.startsWith(curWordBru)) {
result.list.push(curWordBru.includes('.') ? h.split('.')[1] : h);
}
});
result.list?.sort();
}
return result;
});
CodeMirror.commands.autocomplete = (cm, hint, options) => {
cm.showHint({ hint, ...options });
};
}
export default class CodeEditor extends React.Component {
@@ -27,6 +104,12 @@ export default class CodeEditor extends React.Component {
// unnecessary updates during the update lifecycle.
this.cachedValue = props.value || '';
this.variables = {};
this.lintOptions = {
esversion: 11,
expr: true,
asi: true
};
}
componentDidMount() {
@@ -41,7 +124,8 @@ export default class CodeEditor extends React.Component {
matchBrackets: true,
showCursorWhenSelecting: true,
foldGutter: true,
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter', 'CodeMirror-lint-markers'],
lint: this.lintOptions,
readOnly: this.props.readOnly,
scrollbarStyle: 'overlay',
theme: this.props.theme === 'dark' ? 'monokai' : 'default',
@@ -68,15 +152,94 @@ export default class CodeEditor extends React.Component {
},
'Cmd-F': 'findPersistent',
'Ctrl-F': 'findPersistent',
'Cmd-H': 'replace',
'Ctrl-H': 'replace',
Tab: function (cm) {
cm.replaceSelection(' ', 'end');
cm.getSelection().includes('\n') || editor.getLine(cm.getCursor().line) == cm.getSelection()
? cm.execCommand('indentMore')
: cm.replaceSelection(' ', 'end');
},
'Shift-Tab': 'indentLess',
'Ctrl-Space': 'autocomplete',
'Cmd-Space': 'autocomplete',
'Ctrl-Y': 'foldAll',
'Cmd-Y': 'foldAll',
'Ctrl-I': 'unfoldAll',
'Cmd-I': 'unfoldAll'
},
foldOptions: {
widget: (from, to) => {
var count = undefined;
var internal = this.editor.getRange(from, to);
if (this.props.mode == 'application/ld+json') {
if (this.editor.getLine(from.line).endsWith('[')) {
var toParse = '[' + internal + ']';
} else var toParse = '{' + internal + '}';
try {
count = Object.keys(JSON.parse(toParse)).length;
} catch (e) {}
} else if (this.props.mode == 'application/xml') {
var doc = new DOMParser();
try {
//add header element and remove prefix namespaces for DOMParser
var dcm = doc.parseFromString(
'<a> ' + internal.replace(/(?<=\<|<\/)\w+:/g, '') + '</a>',
'application/xml'
);
count = dcm.documentElement.children.length;
} catch (e) {}
}
return count ? `\u21A4${count}\u21A6` : '\u2194';
}
}
}));
CodeMirror.registerHelper('lint', 'json', function (text) {
let found = [];
if (!window.jsonlint) {
if (window.console) {
window.console.error('Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.');
}
return found;
}
let jsonlint = window.jsonlint.parser || window.jsonlint;
jsonlint.parseError = function (str, hash) {
let loc = hash.loc;
found.push({
from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
message: str
});
};
try {
jsonlint.parse(stripJsonComments(text.replace(/(?<!"[^":{]*){{[^}]*}}(?![^"},]*")/g, '1')));
} catch (e) {}
return found;
});
if (editor) {
editor.setOption('lint', this.props.mode && editor.getValue().trim().length > 0 ? this.lintOptions : false);
editor.on('change', this._onEdit);
this.addOverlay();
}
if (this.props.mode == 'javascript') {
editor.on('keyup', function (cm, event) {
const cursor = editor.getCursor();
const currentLine = editor.getLine(cursor.line);
let start = cursor.ch;
let end = start;
while (end < currentLine.length && /[^{}();\s\[\]\,]/.test(currentLine.charAt(end))) ++end;
while (start && /[^{}();\s\[\]\,]/.test(currentLine.charAt(start - 1))) --start;
let curWord = start != end && currentLine.slice(start, end);
//Qualify if autocomplete will be shown
if (
/^(?!Shift|Tab|Enter|ArrowUp|ArrowDown|ArrowLeft|ArrowRight|\s)\w*/.test(event.key) &&
curWord.length > 0 &&
!/\/\/|\/\*|.*{{|`[^$]*{|`[^{]*$/.test(currentLine.slice(0, end)) &&
/(?<!\d)[a-zA-Z\._]$/.test(curWord)
) {
CodeMirror.commands.autocomplete(cm, CodeMirror.hint.brunoJS, { completeSingle: false });
}
});
}
}
componentDidUpdate(prevProps) {
@@ -117,6 +280,9 @@ export default class CodeEditor extends React.Component {
}
render() {
if (this.editor) {
this.editor.refresh();
}
return (
<StyledWrapper
className="h-full w-full"
@@ -140,6 +306,7 @@ export default class CodeEditor extends React.Component {
_onEdit = () => {
if (!this.ignoreChangeEvent && this.editor) {
this.editor.setOption('lint', this.editor.getValue().trim().length > 0 ? this.lintOptions : false);
this.cachedValue = this.editor.getValue();
if (this.props.onEdit) {
this.props.onEdit(this.cachedValue);

View File

@@ -61,6 +61,15 @@ const AuthMode = ({ collection }) => {
>
Bearer Token
</div>
<div
className="dropdown-item"
onClick={() => {
dropdownTippyRef.current.hide();
onModeChange('digest');
}}
>
Digest Auth
</div>
<div
className="dropdown-item"
onClick={() => {

View File

@@ -0,0 +1,16 @@
import styled from 'styled-components';
const Wrapper = styled.div`
label {
font-size: 0.8125rem;
}
.single-line-editor-wrapper {
padding: 0.15rem 0.4rem;
border-radius: 3px;
border: solid 1px ${(props) => props.theme.input.border};
background-color: ${(props) => props.theme.input.bg};
}
`;
export default Wrapper;

View File

@@ -0,0 +1,71 @@
import React from 'react';
import get from 'lodash/get';
import { useTheme } from 'providers/Theme';
import { useDispatch } from 'react-redux';
import SingleLineEditor from 'components/SingleLineEditor';
import { updateCollectionAuth } from 'providers/ReduxStore/slices/collections';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
import StyledWrapper from './StyledWrapper';
const DigestAuth = ({ collection }) => {
const dispatch = useDispatch();
const { storedTheme } = useTheme();
const digestAuth = get(collection, 'root.request.auth.digest', {});
const handleSave = () => dispatch(saveCollectionRoot(collection.uid));
const handleUsernameChange = (username) => {
dispatch(
updateCollectionAuth({
mode: 'digest',
collectionUid: collection.uid,
content: {
username: username,
password: digestAuth.password
}
})
);
};
const handlePasswordChange = (password) => {
dispatch(
updateCollectionAuth({
mode: 'digest',
collectionUid: collection.uid,
content: {
username: digestAuth.username,
password: password
}
})
);
};
return (
<StyledWrapper className="mt-2 w-full">
<label className="block font-medium mb-2">Username</label>
<div className="single-line-editor-wrapper mb-2">
<SingleLineEditor
value={digestAuth.username || ''}
theme={storedTheme}
onSave={handleSave}
onChange={(val) => handleUsernameChange(val)}
collection={collection}
/>
</div>
<label className="block font-medium mb-2">Password</label>
<div className="single-line-editor-wrapper">
<SingleLineEditor
value={digestAuth.password || ''}
theme={storedTheme}
onSave={handleSave}
onChange={(val) => handlePasswordChange(val)}
collection={collection}
/>
</div>
</StyledWrapper>
);
};
export default DigestAuth;

View File

@@ -5,6 +5,7 @@ import AuthMode from './AuthMode';
import AwsV4Auth from './AwsV4Auth';
import BearerAuth from './BearerAuth';
import BasicAuth from './BasicAuth';
import DigestAuth from './DigestAuth';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
import StyledWrapper from './StyledWrapper';
@@ -25,6 +26,9 @@ const Auth = ({ collection }) => {
case 'bearer': {
return <BearerAuth collection={collection} />;
}
case 'digest': {
return <DigestAuth collection={collection} />;
}
}
};

View File

@@ -3,7 +3,7 @@ import get from 'lodash/get';
import { updateCollectionDocs } from 'providers/ReduxStore/slices/collections';
import { useTheme } from 'providers/Theme';
import { useState } from 'react';
import { useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
import Markdown from 'components/MarkDown';
import CodeEditor from 'components/CodeEditor';
@@ -14,6 +14,7 @@ const Docs = ({ collection }) => {
const { storedTheme } = useTheme();
const [isEditing, setIsEditing] = useState(false);
const docs = get(collection, 'root.docs', '');
const preferences = useSelector((state) => state.app.preferences);
const toggleViewMode = () => {
setIsEditing((prev) => !prev);
@@ -44,6 +45,7 @@ const Docs = ({ collection }) => {
onEdit={onEdit}
onSave={onSave}
mode="application/text"
font={get(preferences, 'font.codeFont', 'default')}
/>
) : (
<Markdown onDoubleClick={toggleViewMode} content={docs} />

View File

@@ -0,0 +1,13 @@
import styled from 'styled-components';
const StyledWrapper = styled.div`
table {
td {
&:first-child {
width: 120px;
}
}
}
`;
export default StyledWrapper;

View File

@@ -1,5 +1,5 @@
import React from 'react';
import Modal from 'components/Modal';
import StyledWrapper from './StyledWrapper';
function countRequests(items) {
let count = 0;
@@ -20,9 +20,9 @@ function countRequests(items) {
return count;
}
const CollectionProperties = ({ collection, onClose }) => {
const Info = ({ collection }) => {
return (
<Modal size="sm" title="Collection Properties" hideFooter={true} handleCancel={onClose}>
<StyledWrapper className="w-full flex flex-col h-full">
<table className="w-full border-collapse">
<tbody>
<tr className="">
@@ -43,8 +43,8 @@ const CollectionProperties = ({ collection, onClose }) => {
</tr>
</tbody>
</table>
</Modal>
</StyledWrapper>
);
};
export default CollectionProperties;
export default Info;

View File

@@ -0,0 +1,27 @@
import styled from 'styled-components';
const StyledWrapper = styled.div`
.settings-label {
width: 110px;
}
.textbox {
border: 1px solid #ccc;
padding: 0.15rem 0.45rem;
box-shadow: none;
border-radius: 0px;
outline: none;
box-shadow: none;
transition: border-color ease-in-out 0.1s;
border-radius: 3px;
background-color: ${(props) => props.theme.modal.input.bg};
border: 1px solid ${(props) => props.theme.modal.input.border};
&:focus {
border: solid 1px ${(props) => props.theme.modal.input.focusBorder} !important;
outline: none !important;
}
}
`;
export default StyledWrapper;

View File

@@ -0,0 +1,96 @@
import React, { useEffect } from 'react';
import { useFormik } from 'formik';
import { useDispatch } from 'react-redux';
import StyledWrapper from './StyledWrapper';
import toast from 'react-hot-toast';
import { updateBrunoConfig } from 'providers/ReduxStore/slices/collections/actions';
import cloneDeep from 'lodash/cloneDeep';
const PresetsSettings = ({ collection }) => {
const dispatch = useDispatch();
const {
brunoConfig: { presets: presets = {} }
} = collection;
const formik = useFormik({
enableReinitialize: true,
initialValues: {
requestType: presets.requestType || 'http',
requestUrl: presets.requestUrl || ''
},
onSubmit: (newPresets) => {
const brunoConfig = cloneDeep(collection.brunoConfig);
brunoConfig.presets = newPresets;
dispatch(updateBrunoConfig(brunoConfig, collection.uid));
toast.success('Collection presets updated');
}
});
return (
<StyledWrapper>
<h1 className="font-medium mb-3">Collection Presets</h1>
<form className="bruno-form" onSubmit={formik.handleSubmit}>
<div className="mb-3 flex items-center">
<label className="settings-label flex items-center" htmlFor="enabled">
Request Type
</label>
<div className="flex items-center">
<input
id="http"
className="cursor-pointer"
type="radio"
name="requestType"
onChange={formik.handleChange}
value="http"
checked={formik.values.requestType === 'http'}
/>
<label htmlFor="http" className="ml-1 cursor-pointer select-none">
HTTP
</label>
<input
id="graphql"
className="ml-4 cursor-pointer"
type="radio"
name="requestType"
onChange={formik.handleChange}
value="graphql"
checked={formik.values.requestType === 'graphql'}
/>
<label htmlFor="graphql" className="ml-1 cursor-pointer select-none">
GraphQL
</label>
</div>
</div>
<div className="mb-3 flex items-center">
<label className="settings-label" htmlFor="requestUrl">
Base URL
</label>
<div className="flex items-center">
<div className="flex items-center flex-grow input-container h-full">
<input
id="request-url"
type="text"
name="requestUrl"
className="block textbox"
autoComplete="off"
autoCorrect="off"
autoCapitalize="off"
spellCheck="false"
onChange={formik.handleChange}
value={formik.values.requestUrl || ''}
/>
</div>
</div>
</div>
<div className="mt-6">
<button type="submit" className="submit btn btn-sm btn-secondary">
Save
</button>
</div>
</form>
</StyledWrapper>
);
};
export default PresetsSettings;

View File

@@ -11,22 +11,20 @@ const ProxySettings = ({ proxyConfig, onUpdate }) => {
protocol: Yup.string().oneOf(['http', 'https', 'socks4', 'socks5']),
hostname: Yup.string()
.when('enabled', {
is: true,
is: 'true',
then: (hostname) => hostname.required('Specify the hostname for your proxy.'),
otherwise: (hostname) => hostname.nullable()
})
.max(1024),
port: Yup.number()
.when('enabled', {
is: true,
then: (port) => port.required('Specify port between 1 and 65535').typeError('Specify port between 1 and 65535'),
otherwise: (port) => port.nullable().transform((_, val) => (val ? Number(val) : null))
})
.min(1)
.max(65535),
.max(65535)
.typeError('Specify port between 1 and 65535')
.nullable()
.transform((_, val) => (val ? Number(val) : null)),
auth: Yup.object()
.when('enabled', {
is: true,
is: 'true',
then: Yup.object({
enabled: Yup.boolean(),
username: Yup.string()
@@ -166,7 +164,7 @@ const ProxySettings = ({ proxyConfig, onUpdate }) => {
onChange={formik.handleChange}
className="mr-1"
/>
http
HTTP
</label>
<label className="flex items-center ml-4">
<input
@@ -177,18 +175,18 @@ const ProxySettings = ({ proxyConfig, onUpdate }) => {
onChange={formik.handleChange}
className="mr-1"
/>
https
HTTPS
</label>
<label className="flex items-center ml-4">
<input
type="radio"
name="protocol"
value="socks5"
value="socks4"
checked={formik.values.protocol === 'socks4'}
onChange={formik.handleChange}
className="mr-1"
/>
socks4
SOCKS4
</label>
<label className="flex items-center ml-4">
<input
@@ -199,7 +197,7 @@ const ProxySettings = ({ proxyConfig, onUpdate }) => {
onChange={formik.handleChange}
className="mr-1"
/>
socks5
SOCKS5
</label>
</div>
</div>

View File

@@ -1,6 +1,6 @@
import React from 'react';
import get from 'lodash/get';
import { useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import CodeEditor from 'components/CodeEditor';
import { updateCollectionRequestScript, updateCollectionResponseScript } from 'providers/ReduxStore/slices/collections';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
@@ -13,6 +13,7 @@ const Script = ({ collection }) => {
const responseScript = get(collection, 'root.request.script.res', '');
const { storedTheme } = useTheme();
const preferences = useSelector((state) => state.app.preferences);
const onRequestScriptEdit = (value) => {
dispatch(
@@ -47,6 +48,7 @@ const Script = ({ collection }) => {
onEdit={onRequestScriptEdit}
mode="javascript"
onSave={handleSave}
font={get(preferences, 'font.codeFont', 'default')}
/>
</div>
<div className="flex-1 mt-6">
@@ -58,6 +60,7 @@ const Script = ({ collection }) => {
onEdit={onResponseScriptEdit}
mode="javascript"
onSave={handleSave}
font={get(preferences, 'font.codeFont', 'default')}
/>
</div>

View File

@@ -1,6 +1,6 @@
import React from 'react';
import get from 'lodash/get';
import { useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import CodeEditor from 'components/CodeEditor';
import { updateCollectionTests } from 'providers/ReduxStore/slices/collections';
import { saveCollectionRoot } from 'providers/ReduxStore/slices/collections/actions';
@@ -12,6 +12,7 @@ const Tests = ({ collection }) => {
const tests = get(collection, 'root.request.tests', '');
const { storedTheme } = useTheme();
const preferences = useSelector((state) => state.app.preferences);
const onEdit = (value) => {
dispatch(
@@ -33,6 +34,7 @@ const Tests = ({ collection }) => {
onEdit={onEdit}
mode="javascript"
onSave={handleSave}
font={get(preferences, 'font.codeFont', 'default')}
/>
<div className="mt-6">

View File

@@ -13,6 +13,8 @@ import Auth from './Auth';
import Script from './Script';
import Test from './Tests';
import Docs from './Docs';
import Presets from './Presets';
import Info from './Info';
import StyledWrapper from './StyledWrapper';
const CollectionSettings = ({ collection }) => {
@@ -84,6 +86,9 @@ const CollectionSettings = ({ collection }) => {
case 'tests': {
return <Test collection={collection} />;
}
case 'presets': {
return <Presets collection={collection} />;
}
case 'proxy': {
return <ProxySettings proxyConfig={proxyConfig} onUpdate={onProxySettingsUpdate} />;
}
@@ -99,6 +104,9 @@ const CollectionSettings = ({ collection }) => {
case 'docs': {
return <Docs collection={collection} />;
}
case 'info': {
return <Info collection={collection} />;
}
}
};
@@ -123,6 +131,9 @@ const CollectionSettings = ({ collection }) => {
<div className={getTabClassname('tests')} role="tab" onClick={() => setTab('tests')}>
Tests
</div>
<div className={getTabClassname('presets')} role="tab" onClick={() => setTab('presets')}>
Presets
</div>
<div className={getTabClassname('proxy')} role="tab" onClick={() => setTab('proxy')}>
Proxy
</div>
@@ -132,6 +143,9 @@ const CollectionSettings = ({ collection }) => {
<div className={getTabClassname('docs')} role="tab" onClick={() => setTab('docs')}>
Docs
</div>
<div className={getTabClassname('info')} role="tab" onClick={() => setTab('info')}>
Info
</div>
</div>
<section className={`flex ${['auth', 'script', 'docs', 'clientCert'].includes(tab) ? '' : 'mt-4'}`}>
{getTabPanel(tab)}

View File

@@ -0,0 +1,16 @@
import styled from 'styled-components';
const Wrapper = styled.div`
table {
width: 100%;
table-layout: fixed;
thead {
color: ${(props) => props.theme.table.thead.color};
font-size: 0.8125rem;
user-select: none;
}
}
`;
export default Wrapper;

View File

@@ -0,0 +1,54 @@
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import Modal from 'components/Modal';
import { IconTrash } from '@tabler/icons';
import { deleteCookiesForDomain } from 'providers/ReduxStore/slices/app';
import toast from 'react-hot-toast';
import StyledWrapper from './StyledWrapper';
const CollectionProperties = ({ onClose }) => {
const dispatch = useDispatch();
const cookies = useSelector((state) => state.app.cookies) || [];
const handleDeleteDomain = (domain) => {
dispatch(deleteCookiesForDomain(domain))
.then(() => {
toast.success('Domain deleted successfully');
})
.catch((err) => console.log(err) && toast.error('Failed to delete domain'));
};
return (
<Modal size="md" title="Cookies" hideFooter={true} handleCancel={onClose}>
<StyledWrapper>
<table className="w-full border-collapse" style={{ marginTop: '-1rem' }}>
<thead>
<tr>
<th className="py-2 px-2 text-left">Domain</th>
<th className="py-2 px-2 text-left">Cookie</th>
<th className="py-2 px-2 text-center" style={{ width: 80 }}>
Actions
</th>
</tr>
</thead>
<tbody>
{cookies.map((cookie) => (
<tr key={cookie.domain}>
<td className="py-2 px-2">{cookie.domain}</td>
<td className="py-2 px-2 break-all">{cookie.cookieString}</td>
<td className="text-center">
<button tabIndex="-1" onClick={() => handleDeleteDomain(cookie.domain)}>
<IconTrash strokeWidth={1.5} size={20} />
</button>
</td>
</tr>
))}
</tbody>
</table>
</StyledWrapper>
</Modal>
);
};
export default CollectionProperties;

View File

@@ -1,9 +1,9 @@
import 'github-markdown-css/github-markdown.css';
import get from 'lodash/get';
import { updateRequestDocs } from 'providers/ReduxStore/slices/collections';
import { useTheme } from 'providers/Theme/index';
import { useTheme } from 'providers/Theme';
import { useState } from 'react';
import { useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import { saveRequest } from 'providers/ReduxStore/slices/collections/actions';
import Markdown from 'components/MarkDown';
import CodeEditor from 'components/CodeEditor';
@@ -14,6 +14,7 @@ const Documentation = ({ item, collection }) => {
const { storedTheme } = useTheme();
const [isEditing, setIsEditing] = useState(false);
const docs = item.draft ? get(item, 'draft.request.docs') : get(item, 'request.docs');
const preferences = useSelector((state) => state.app.preferences);
const toggleViewMode = () => {
setIsEditing((prev) => !prev);
@@ -45,6 +46,7 @@ const Documentation = ({ item, collection }) => {
<CodeEditor
collection={collection}
theme={storedTheme}
font={get(preferences, 'font.codeFont', 'default')}
value={docs || ''}
onEdit={onEdit}
onSave={onSave}

View File

@@ -52,7 +52,7 @@ const EnvironmentSelector = ({ collection }) => {
dropdownTippyRef.current.hide();
}}
>
<IconDatabase size={18} strokeWidth={1.5} /> <span className="ml-2">{e.name}</span>
<IconDatabase size={18} strokeWidth={1.5} /> <span className="ml-2 break-all">{e.name}</span>
</div>
))
: null}

View File

@@ -13,10 +13,12 @@ const Wrapper = styled.div`
padding: 4px 10px;
&:nth-child(1),
&:nth-child(4),
&:nth-child(5) {
&:nth-child(4) {
width: 70px;
}
&:nth-child(5) {
width: 40px;
}
&:nth-child(2) {
width: 25%;

View File

@@ -1,68 +1,82 @@
import React, { useReducer } from 'react';
import React from 'react';
import toast from 'react-hot-toast';
import cloneDeep from 'lodash/cloneDeep';
import { IconTrash } from '@tabler/icons';
import { useTheme } from 'providers/Theme';
import { useDispatch } from 'react-redux';
import { saveEnvironment } from 'providers/ReduxStore/slices/collections/actions';
import reducer from './reducer';
import SingleLineEditor from 'components/SingleLineEditor';
import StyledWrapper from './StyledWrapper';
import { useFormik } from 'formik';
import * as Yup from 'yup';
import { uuid } from 'utils/common';
import { variableNameRegex } from 'utils/common/regex';
const EnvironmentVariables = ({ environment, collection }) => {
const dispatch = useDispatch();
const { storedTheme } = useTheme();
const [state, reducerDispatch] = useReducer(reducer, { hasChanges: false, variables: environment.variables || [] });
const { variables, hasChanges } = state;
const saveChanges = () => {
dispatch(saveEnvironment(cloneDeep(variables), environment.uid, collection.uid))
.then(() => {
toast.success('Changes saved successfully');
reducerDispatch({
type: 'CHANGES_SAVED'
});
const formik = useFormik({
enableReinitialize: true,
initialValues: environment.variables || [],
validationSchema: Yup.array().of(
Yup.object({
enabled: Yup.boolean(),
name: Yup.string()
.required('Name cannot be empty')
.matches(
variableNameRegex,
'Name contains invalid characters. Must only contain alphanumeric characters, "-", "_", "." and cannot start with a digit.'
)
.trim(),
secret: Yup.boolean(),
type: Yup.string(),
uid: Yup.string(),
value: Yup.string().trim().nullable()
})
.catch(() => toast.error('An error occurred while saving the changes'));
),
onSubmit: (values) => {
if (!formik.dirty) {
toast.error('Nothing to save');
return;
}
dispatch(saveEnvironment(cloneDeep(values), environment.uid, collection.uid))
.then(() => {
toast.success('Changes saved successfully');
formik.resetForm({ values });
})
.catch(() => toast.error('An error occurred while saving the changes'));
}
});
const ErrorMessage = ({ name }) => {
const meta = formik.getFieldMeta(name);
if (!meta.error) {
return null;
}
return (
<label htmlFor={name} className="text-red-500">
{meta.error}
</label>
);
};
const addVariable = () => {
reducerDispatch({
type: 'ADD_VAR'
});
const newVariable = {
uid: uuid(),
name: '',
value: '',
type: 'text',
secret: false,
enabled: true
};
formik.setFieldValue(formik.values.length, newVariable, false);
};
const handleVarChange = (e, _variable, type) => {
const variable = cloneDeep(_variable);
switch (type) {
case 'name': {
variable.name = e.target.value;
break;
}
case 'value': {
variable.value = e.target.value;
break;
}
case 'enabled': {
variable.enabled = e.target.checked;
break;
}
case 'secret': {
variable.secret = e.target.checked;
break;
}
}
reducerDispatch({
type: 'UPDATE_VAR',
variable
});
};
const handleRemoveVars = (variable) => {
reducerDispatch({
type: 'DELETE_VAR',
variable
});
const handleRemoveVar = (id) => {
formik.setValues(formik.values.filter((variable) => variable.uid !== id));
};
return (
@@ -78,55 +92,57 @@ const EnvironmentVariables = ({ environment, collection }) => {
</tr>
</thead>
<tbody>
{variables && variables.length
? variables.map((variable, index) => {
return (
<tr key={variable.uid}>
<td className="text-center">
<input
type="checkbox"
checked={variable.enabled}
className="mr-3 mousetrap"
onChange={(e) => handleVarChange(e, variable, 'enabled')}
/>
</td>
<td>
<input
type="text"
autoComplete="off"
autoCorrect="off"
autoCapitalize="off"
spellCheck="false"
value={variable.name}
className="mousetrap"
onChange={(e) => handleVarChange(e, variable, 'name')}
/>
</td>
<td>
<SingleLineEditor
value={variable.value}
theme={storedTheme}
onChange={(newValue) => handleVarChange({ target: { value: newValue } }, variable, 'value')}
collection={collection}
/>
</td>
<td>
<input
type="checkbox"
checked={variable.secret}
className="mr-3 mousetrap"
onChange={(e) => handleVarChange(e, variable, 'secret')}
/>
</td>
<td>
<button onClick={() => handleRemoveVars(variable)}>
<IconTrash strokeWidth={1.5} size={20} />
</button>
</td>
</tr>
);
})
: null}
{formik.values.map((variable, index) => (
<tr key={variable.uid}>
<td className="text-center">
<input
type="checkbox"
className="mr-3 mousetrap"
name={`${index}.enabled`}
checked={variable.enabled}
onChange={formik.handleChange}
/>
</td>
<td>
<input
type="text"
autoComplete="off"
autoCorrect="off"
autoCapitalize="off"
spellCheck="false"
className="mousetrap"
id={`${index}.name`}
name={`${index}.name`}
value={variable.name}
onChange={formik.handleChange}
/>
<ErrorMessage name={`${index}.name`} />
</td>
<td>
<SingleLineEditor
theme={storedTheme}
collection={collection}
name={`${index}.value`}
value={variable.value}
onChange={(newValue) => formik.setFieldValue(`${index}.value`, newValue, true)}
/>
</td>
<td>
<input
type="checkbox"
className="mr-3 mousetrap"
name={`${index}.secret`}
checked={variable.secret}
onChange={formik.handleChange}
/>
</td>
<td>
<button onClick={() => handleRemoveVar(variable.uid)}>
<IconTrash strokeWidth={1.5} size={20} />
</button>
</td>
</tr>
))}
</tbody>
</table>
@@ -137,12 +153,7 @@ const EnvironmentVariables = ({ environment, collection }) => {
</div>
<div>
<button
type="submit"
className="submit btn btn-md btn-secondary mt-2"
disabled={!hasChanges}
onClick={saveChanges}
>
<button type="submit" className="submit btn btn-md btn-secondary mt-2" onClick={formik.handleSubmit}>
Save
</button>
</div>

View File

@@ -1,52 +0,0 @@
import produce from 'immer';
import find from 'lodash/find';
import filter from 'lodash/filter';
import { uuid } from 'utils/common';
const reducer = (state, action) => {
switch (action.type) {
case 'ADD_VAR': {
return produce(state, (draft) => {
draft.variables.push({
uid: uuid(),
name: '',
value: '',
type: 'text',
secret: false,
enabled: true
});
draft.hasChanges = true;
});
}
case 'UPDATE_VAR': {
return produce(state, (draft) => {
const variable = find(draft.variables, (v) => v.uid === action.variable.uid);
variable.name = action.variable.name;
variable.value = action.variable.value;
variable.enabled = action.variable.enabled;
variable.secret = action.variable.secret;
draft.hasChanges = true;
});
}
case 'DELETE_VAR': {
return produce(state, (draft) => {
draft.variables = filter(draft.variables, (v) => v.uid !== action.variable.uid);
draft.hasChanges = true;
});
}
case 'CHANGES_SAVED': {
return produce(state, (draft) => {
draft.hasChanges = false;
});
}
default: {
return state;
}
}
};
export default reducer;

View File

@@ -28,7 +28,7 @@ const EnvironmentDetails = ({ environment, collection }) => {
<div className="flex">
<div className="flex flex-grow items-center">
<IconDatabase className="cursor-pointer" size={20} strokeWidth={1.5} />
<span className="ml-1 font-semibold">{environment.name}</span>
<span className="ml-1 font-semibold break-all">{environment.name}</span>
</div>
<div className="flex gap-x-4 pl-4">
<IconEdit className="cursor-pointer" size={20} strokeWidth={1.5} onClick={() => setOpenEditModal(true)} />

View File

@@ -10,6 +10,7 @@ const StyledWrapper = styled.div`
background-color: ${(props) => props.theme.collection.environment.settings.sidebar.bg};
border-right: solid 1px ${(props) => props.theme.collection.environment.settings.sidebar.borderRight};
min-height: 400px;
height: 100%;
max-height: 85vh;
overflow-y: auto;
}
@@ -44,10 +45,8 @@ const StyledWrapper = styled.div`
border-bottom: none;
color: ${(props) => props.theme.textLink};
&:hover {
span {
text-decoration: underline;
}
span:hover {
text-decoration: underline;
}
}

View File

@@ -1,12 +1,11 @@
import React, { useEffect, useState, forwardRef, useRef } from 'react';
import { findEnvironmentInCollection } from 'utils/collections';
import toast from 'react-hot-toast';
import { toastError } from 'utils/common/error';
import usePrevious from 'hooks/usePrevious';
import EnvironmentDetails from './EnvironmentDetails';
import CreateEnvironment from '../CreateEnvironment';
import { IconDownload } from '@tabler/icons';
import { IconDownload, IconShieldLock } from '@tabler/icons';
import ImportEnvironment from '../ImportEnvironment';
import ManageSecrets from '../ManageSecrets';
import StyledWrapper from './StyledWrapper';
const EnvironmentList = ({ collection }) => {
@@ -14,6 +13,7 @@ const EnvironmentList = ({ collection }) => {
const [selectedEnvironment, setSelectedEnvironment] = useState(null);
const [openCreateModal, setOpenCreateModal] = useState(false);
const [openImportModal, setOpenImportModal] = useState(false);
const [openManageSecretsModal, setOpenManageSecretsModal] = useState(false);
const envUids = environments ? environments.map((env) => env.uid) : [];
const prevEnvUids = usePrevious(envUids);
@@ -54,6 +54,7 @@ const EnvironmentList = ({ collection }) => {
<StyledWrapper>
{openCreateModal && <CreateEnvironment collection={collection} onClose={() => setOpenCreateModal(false)} />}
{openImportModal && <ImportEnvironment collection={collection} onClose={() => setOpenImportModal(false)} />}
{openManageSecretsModal && <ManageSecrets onClose={() => setOpenManageSecretsModal(false)} />}
<div className="flex">
<div>
<div className="environments-sidebar flex flex-col">
@@ -65,16 +66,22 @@ const EnvironmentList = ({ collection }) => {
className={selectedEnvironment.uid === env.uid ? 'environment-item active' : 'environment-item'}
onClick={() => setSelectedEnvironment(env)}
>
<span>{env.name}</span>
<span className="break-all">{env.name}</span>
</div>
))}
<div className="btn-create-environment" onClick={() => setOpenCreateModal(true)}>
+ <span>Create</span>
</div>
<div className="mt-auto flex items-center btn-import-environment" onClick={() => setOpenImportModal(true)}>
<IconDownload size={12} strokeWidth={2} />
<span className="label ml-1 text-xs">Import</span>
<div className="mt-auto btn-import-environment">
<div className="flex items-center" onClick={() => setOpenImportModal(true)}>
<IconDownload size={12} strokeWidth={2} />
<span className="label ml-1 text-xs">Import</span>
</div>
<div className="flex items-center mt-2" onClick={() => setOpenManageSecretsModal(true)}>
<IconShieldLock size={12} strokeWidth={2} />
<span className="label ml-1 text-xs">Managing Secrets</span>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
import React from 'react';
import Portal from 'components/Portal';
import Modal from 'components/Modal';
const ManageSecrets = ({ onClose }) => {
return (
<Portal>
<Modal size="sm" title="Manage Secrets" hideFooter={true} handleConfirm={onClose} handleCancel={onClose}>
<div>
<p>In any collection, there are secrets that need to be managed.</p>
<p className="mt-2">These secrets can be anything such as API keys, passwords, or tokens.</p>
<p className="mt-4">Bruno offers two approaches to manage secrets in collections.</p>
<p className="mt-2">
Read more about it in our{' '}
<a
href="https://docs.usebruno.com/secrets-management/overview.html"
target="_blank"
rel="noreferrer"
className="text-link hover:underline"
>
docs
</a>
.
</p>
</div>
</Modal>
</Portal>
);
};
export default ManageSecrets;

View File

@@ -71,6 +71,14 @@ const StyledMarkdownBodyWrapper = styled.div`
pre {
background: ${(props) => props.theme.sidebar.bg};
}
table {
th,
td {
border: 1px solid ${(props) => props.theme.table.border};
background-color: ${(props) => props.theme.bg};
}
}
}
@media (max-width: 767px) {

View File

@@ -1,19 +1,13 @@
import MarkdownIt from 'markdown-it';
import StyledWrapper from './StyledWrapper';
import * as React from 'react';
const md = new MarkdownIt();
const Markdown = ({ onDoubleClick, content }) => {
const handleOnDoubleClick = (event) => {
switch (event.detail) {
case 2: {
onDoubleClick();
break;
}
case 1:
default: {
break;
}
if (event?.detail === 2) {
onDoubleClick();
}
};
const htmlFromMarkdown = md.render(content || '');

View File

@@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import StyledWrapper from './StyledWrapper';
const ModalHeader = ({ title, handleCancel }) => (
@@ -62,6 +62,9 @@ const Modal = ({
confirmDisabled,
hideCancel,
hideFooter,
disableCloseOnOutsideClick,
disableEscapeKey,
onClick,
closeModalFadeTimeout = 500
}) => {
const [isClosing, setIsClosing] = useState(false);
@@ -78,12 +81,13 @@ const Modal = ({
};
useEffect(() => {
if (disableEscapeKey) return;
document.addEventListener('keydown', escFunction, false);
return () => {
document.removeEventListener('keydown', escFunction, false);
};
}, []);
}, [disableEscapeKey, document]);
let classes = 'bruno-modal';
if (isClosing) {
@@ -93,7 +97,7 @@ const Modal = ({
classes += ' modal-footer-none';
}
return (
<StyledWrapper className={classes}>
<StyledWrapper className={classes} onClick={onClick ? (e) => onClick(e) : null}>
<div className={`bruno-modal-card modal-${size}`}>
<ModalHeader title={title} handleCancel={() => closeModal({ type: 'icon' })} />
<ModalContent>{children}</ModalContent>
@@ -111,9 +115,13 @@ const Modal = ({
{/* Clicking on backdrop closes the modal */}
<div
className="bruno-modal-backdrop"
onClick={() => {
closeModal({ type: 'backdrop' });
}}
onClick={
disableCloseOnOutsideClick
? null
: () => {
closeModal({ type: 'backdrop' });
}
}
/>
</StyledWrapper>
);

View File

@@ -1,17 +1,28 @@
import React from 'react';
import React, { useRef } from 'react';
import get from 'lodash/get';
import { useFormik } from 'formik';
import { useSelector, useDispatch } from 'react-redux';
import { savePreferences } from 'providers/ReduxStore/slices/app';
import StyledWrapper from './StyledWrapper';
import * as Yup from 'yup';
import toast from 'react-hot-toast';
import path from 'path';
import slash from 'utils/common/slash';
import { IconTrash } from '@tabler/icons';
const General = ({ close }) => {
const preferences = useSelector((state) => state.app.preferences);
const dispatch = useDispatch();
const inputFileCaCertificateRef = useRef();
const preferencesSchema = Yup.object().shape({
sslVerification: Yup.boolean(),
customCaCertificate: Yup.object({
enabled: Yup.boolean(),
filePath: Yup.string().nullable()
}),
storeCookies: Yup.boolean(),
sendCookies: Yup.boolean(),
timeout: Yup.mixed()
.transform((value, originalValue) => {
return originalValue === '' ? undefined : value;
@@ -28,7 +39,13 @@ const General = ({ close }) => {
const formik = useFormik({
initialValues: {
sslVerification: preferences.request.sslVerification,
timeout: preferences.request.timeout
customCaCertificate: {
enabled: get(preferences, 'request.customCaCertificate.enabled', false),
filePath: get(preferences, 'request.customCaCertificate.filePath', null)
},
timeout: preferences.request.timeout,
storeCookies: get(preferences, 'request.storeCookies', true),
sendCookies: get(preferences, 'request.sendCookies', true)
},
validationSchema: preferencesSchema,
onSubmit: async (values) => {
@@ -47,7 +64,13 @@ const General = ({ close }) => {
...preferences,
request: {
sslVerification: newPreferences.sslVerification,
timeout: newPreferences.timeout
customCaCertificate: {
enabled: newPreferences.customCaCertificate.enabled,
filePath: newPreferences.customCaCertificate.filePath
},
timeout: newPreferences.timeout,
storeCookies: newPreferences.storeCookies,
sendCookies: newPreferences.sendCookies
}
})
)
@@ -57,24 +80,112 @@ const General = ({ close }) => {
.catch((err) => console.log(err) && toast.error('Failed to update preferences'));
};
const addCaCertificate = (e) => {
formik.setFieldValue('customCaCertificate.filePath', e.target.files[0]?.path);
};
const deleteCaCertificate = () => {
formik.setFieldValue('customCaCertificate.filePath', null);
};
return (
<StyledWrapper>
<form className="bruno-form" onSubmit={formik.handleSubmit}>
<div className="flex items-center mt-2">
<label className="block font-medium mr-2 select-none" style={{ minWidth: 200 }} htmlFor="sslVerification">
SSL/TLS Certificate Verification
</label>
<input
id="ssl-cert-verification"
id="sslVerification"
type="checkbox"
name="sslVerification"
checked={formik.values.sslVerification}
onChange={formik.handleChange}
className="mousetrap mr-0"
/>
<label className="block ml-2 select-none" htmlFor="sslVerification">
SSL/TLS Certificate Verification
</label>
</div>
<div className="flex items-center mt-2">
<input
id="customCaCertificateEnabled"
type="checkbox"
name="customCaCertificate.enabled"
checked={formik.values.customCaCertificate.enabled}
onChange={formik.handleChange}
className="mousetrap mr-0"
/>
<label className="block ml-2 select-none" htmlFor="customCaCertificateEnabled">
Use custom CA Certificate
</label>
</div>
{formik.values.customCaCertificate.filePath ? (
<div
className={`flex items-center mt-2 pl-6 ${formik.values.customCaCertificate.enabled ? '' : 'opacity-25'}`}
>
<span className="flex items-center border px-2 rounded-md">
{path.basename(slash(formik.values.customCaCertificate.filePath))}
<button
type="button"
tabIndex="-1"
className="pl-1"
disabled={formik.values.customCaCertificate.enabled ? false : true}
onClick={deleteCaCertificate}
>
<IconTrash strokeWidth={1.5} size={14} />
</button>
</span>
</div>
) : (
<div
className={`flex items-center mt-2 pl-6 ${formik.values.customCaCertificate.enabled ? '' : 'opacity-25'}`}
>
<button
type="button"
tabIndex="-1"
className="flex items-center border px-2 rounded-md"
disabled={formik.values.customCaCertificate.enabled ? false : true}
onClick={() => inputFileCaCertificateRef.current.click()}
>
select file
<input
id="caCertFilePath"
type="file"
name="customCaCertificate.filePath"
className="hidden"
ref={inputFileCaCertificateRef}
disabled={formik.values.customCaCertificate.enabled ? false : true}
onChange={addCaCertificate}
/>
</button>
</div>
)}
<div className="flex items-center mt-2">
<input
id="storeCookies"
type="checkbox"
name="storeCookies"
checked={formik.values.storeCookies}
onChange={formik.handleChange}
className="mousetrap mr-0"
/>
<label className="block ml-2 select-none" htmlFor="storeCookies">
Store Cookies automatically
</label>
</div>
<div className="flex items-center mt-2">
<input
id="sendCookies"
type="checkbox"
name="sendCookies"
checked={formik.values.sendCookies}
onChange={formik.handleChange}
className="mousetrap mr-0"
/>
<label className="block ml-2 select-none" htmlFor="sendCookies">
Send Cookies automatically
</label>
</div>
<div className="flex flex-col mt-6">
<label className="block font-medium select-none" htmlFor="timeout">
<label className="block select-none" htmlFor="timeout">
Request Timeout (in ms)
</label>
<input

View File

@@ -22,13 +22,11 @@ const ProxySettings = ({ close }) => {
})
.max(1024),
port: Yup.number()
.when('enabled', {
is: true,
then: (port) => port.required('Specify port between 1 and 65535').typeError('Specify port between 1 and 65535'),
otherwise: (port) => port.nullable().transform((_, val) => (val ? Number(val) : null))
})
.min(1)
.max(65535),
.max(65535)
.typeError('Specify port between 1 and 65535')
.nullable()
.transform((_, val) => (val ? Number(val) : null)),
auth: Yup.object()
.when('enabled', {
is: true,
@@ -129,7 +127,7 @@ const ProxySettings = ({ close }) => {
onChange={formik.handleChange}
className="mr-1"
/>
http
HTTP
</label>
<label className="flex items-center ml-4">
<input
@@ -140,18 +138,18 @@ const ProxySettings = ({ close }) => {
onChange={formik.handleChange}
className="mr-1"
/>
https
HTTPS
</label>
<label className="flex items-center ml-4">
<input
type="radio"
name="protocol"
value="socks5"
value="socks4"
checked={formik.values.protocol === 'socks4'}
onChange={formik.handleChange}
className="mr-1"
/>
socks4
SOCKS4
</label>
<label className="flex items-center ml-4">
<input
@@ -162,7 +160,7 @@ const ProxySettings = ({ close }) => {
onChange={formik.handleChange}
className="mr-1"
/>
socks5
SOCKS5
</label>
</div>
</div>

View File

@@ -13,7 +13,7 @@ const Theme = () => {
theme: storedTheme
},
validationSchema: Yup.object({
theme: Yup.string().oneOf(['light', 'dark']).required('theme is required')
theme: Yup.string().oneOf(['light', 'dark', 'system']).required('theme is required')
}),
onSubmit: (values) => {
setStoredTheme(values.theme);
@@ -55,6 +55,22 @@ const Theme = () => {
<label htmlFor="dark-theme" className="ml-1 cursor-pointer select-none">
Dark
</label>
<input
id="system-theme"
className="ml-4 cursor-pointer"
type="radio"
name="theme"
onChange={(e) => {
formik.handleChange(e);
formik.handleSubmit();
}}
value="system"
checked={formik.values.theme === 'system'}
/>
<label htmlFor="system-theme" className="ml-1 cursor-pointer select-none">
System
</label>
</div>
</div>
</StyledWrapper>

View File

@@ -62,6 +62,15 @@ const AuthMode = ({ item, collection }) => {
>
Bearer Token
</div>
<div
className="dropdown-item"
onClick={() => {
dropdownTippyRef.current.hide();
onModeChange('digest');
}}
>
Digest Auth
</div>
<div
className="dropdown-item"
onClick={() => {

View File

@@ -0,0 +1,16 @@
import styled from 'styled-components';
const Wrapper = styled.div`
label {
font-size: 0.8125rem;
}
.single-line-editor-wrapper {
padding: 0.15rem 0.4rem;
border-radius: 3px;
border: solid 1px ${(props) => props.theme.input.border};
background-color: ${(props) => props.theme.input.bg};
}
`;
export default Wrapper;

View File

@@ -0,0 +1,76 @@
import React from 'react';
import get from 'lodash/get';
import { useTheme } from 'providers/Theme';
import { useDispatch } from 'react-redux';
import SingleLineEditor from 'components/SingleLineEditor';
import { updateAuth } from 'providers/ReduxStore/slices/collections';
import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions';
import StyledWrapper from './StyledWrapper';
const DigestAuth = ({ item, collection }) => {
const dispatch = useDispatch();
const { storedTheme } = useTheme();
const digestAuth = item.draft ? get(item, 'draft.request.auth.digest', {}) : get(item, 'request.auth.digest', {});
const handleRun = () => dispatch(sendRequest(item, collection.uid));
const handleSave = () => dispatch(saveRequest(item.uid, collection.uid));
const handleUsernameChange = (username) => {
dispatch(
updateAuth({
mode: 'digest',
collectionUid: collection.uid,
itemUid: item.uid,
content: {
username: username,
password: digestAuth.password
}
})
);
};
const handlePasswordChange = (password) => {
dispatch(
updateAuth({
mode: 'digest',
collectionUid: collection.uid,
itemUid: item.uid,
content: {
username: digestAuth.username,
password: password
}
})
);
};
return (
<StyledWrapper className="mt-2 w-full">
<label className="block font-medium mb-2">Username</label>
<div className="single-line-editor-wrapper mb-2">
<SingleLineEditor
value={digestAuth.username || ''}
theme={storedTheme}
onSave={handleSave}
onChange={(val) => handleUsernameChange(val)}
onRun={handleRun}
collection={collection}
/>
</div>
<label className="block font-medium mb-2">Password</label>
<div className="single-line-editor-wrapper">
<SingleLineEditor
value={digestAuth.password || ''}
theme={storedTheme}
onSave={handleSave}
onChange={(val) => handlePasswordChange(val)}
onRun={handleRun}
collection={collection}
/>
</div>
</StyledWrapper>
);
};
export default DigestAuth;

View File

@@ -4,6 +4,7 @@ import AuthMode from './AuthMode';
import AwsV4Auth from './AwsV4Auth';
import BearerAuth from './BearerAuth';
import BasicAuth from './BasicAuth';
import DigestAuth from './DigestAuth';
import StyledWrapper from './StyledWrapper';
const Auth = ({ item, collection }) => {
@@ -20,6 +21,9 @@ const Auth = ({ item, collection }) => {
case 'bearer': {
return <BearerAuth collection={collection} item={item} />;
}
case 'digest': {
return <DigestAuth collection={collection} item={item} />;
}
}
};

View File

@@ -1,8 +1,7 @@
import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import find from 'lodash/find';
import get from 'lodash/get';
import classnames from 'classnames';
import { IconRefresh, IconLoader2, IconBook, IconDownload } from '@tabler/icons';
import { useSelector, useDispatch } from 'react-redux';
import { updateRequestPaneTab } from 'providers/ReduxStore/slices/tabs';
import QueryEditor from 'components/RequestPane/QueryEditor';
@@ -16,10 +15,9 @@ import Tests from 'components/RequestPane/Tests';
import { useTheme } from 'providers/Theme';
import { updateRequestGraphqlQuery } from 'providers/ReduxStore/slices/collections';
import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions';
import { findEnvironmentInCollection } from 'utils/collections';
import useGraphqlSchema from './useGraphqlSchema';
import StyledWrapper from './StyledWrapper';
import Documentation from 'components/Documentation/index';
import GraphQLSchemaActions from '../GraphQLSchemaActions/index';
const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, toggleDocs, handleGqlClickReference }) => {
const dispatch = useDispatch();
@@ -29,25 +27,11 @@ const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, tog
const variables = item.draft
? get(item, 'draft.request.body.graphql.variables')
: get(item, 'request.body.graphql.variables');
const url = item.draft ? get(item, 'draft.request.url') : get(item, 'request.url');
const { storedTheme } = useTheme();
const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid);
const request = item.draft ? item.draft.request : item.request;
let { schema, loadSchema, isLoading: isSchemaLoading } = useGraphqlSchema(url, environment, request, collection);
const loadGqlSchema = () => {
if (!isSchemaLoading) {
loadSchema();
}
};
const [schema, setSchema] = useState(null);
useEffect(() => {
if (onSchemaLoad) {
onSchemaLoad(schema);
}
onSchemaLoad(schema);
}, [schema]);
const onQueryChange = (value) => {
@@ -163,18 +147,7 @@ const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, tog
<div className={getTabClassname('docs')} role="tab" onClick={() => selectTab('docs')}>
Docs
</div>
<div className="flex flex-grow justify-end items-center" style={{ fontSize: 13 }}>
<div className="flex items-center cursor-pointer hover:underline" onClick={loadGqlSchema}>
{isSchemaLoading ? <IconLoader2 className="animate-spin" size={18} strokeWidth={1.5} /> : null}
{!isSchemaLoading && !schema ? <IconDownload size={18} strokeWidth={1.5} /> : null}
{!isSchemaLoading && schema ? <IconRefresh size={18} strokeWidth={1.5} /> : null}
<span className="ml-1">Schema</span>
</div>
<div className="flex items-center cursor-pointer hover:underline ml-2" onClick={toggleDocs}>
<IconBook size={18} strokeWidth={1.5} />
<span className="ml-1">Docs</span>
</div>
</div>
<GraphQLSchemaActions item={item} collection={collection} onSchemaLoad={setSchema} toggleDocs={toggleDocs} />
</div>
<section className="flex w-full mt-5">{getTabPanel(focusedTab.requestPaneTab)}</section>
</StyledWrapper>

View File

@@ -1,60 +0,0 @@
import { useState } from 'react';
import toast from 'react-hot-toast';
import { buildClientSchema } from 'graphql';
import { fetchGqlSchema } from 'utils/network';
import { simpleHash } from 'utils/common';
const schemaHashPrefix = 'bruno.graphqlSchema';
const useGraphqlSchema = (endpoint, environment, request, collection) => {
const localStorageKey = `${schemaHashPrefix}.${simpleHash(endpoint)}`;
const [error, setError] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [schema, setSchema] = useState(() => {
try {
const saved = localStorage.getItem(localStorageKey);
if (!saved) {
return null;
}
return buildClientSchema(JSON.parse(saved));
} catch {
localStorage.setItem(localStorageKey, null);
return null;
}
});
const loadSchema = () => {
setIsLoading(true);
fetchGqlSchema(endpoint, environment, request, collection)
.then((res) => {
if (!res || res.status !== 200) {
return Promise.reject(new Error(res.statusText));
}
return res.data;
})
.then((s) => {
if (s && s.data) {
setSchema(buildClientSchema(s.data));
setIsLoading(false);
localStorage.setItem(localStorageKey, JSON.stringify(s.data));
toast.success('GraphQL Schema loaded successfully');
} else {
return Promise.reject(new Error('An error occurred while introspecting schema'));
}
})
.catch((err) => {
setIsLoading(false);
setError(err);
toast.error(`Error occurred while loading GraphQL Schema: ${err.message}`);
});
};
return {
isLoading,
schema,
loadSchema,
error
};
};
export default useGraphqlSchema;

View File

@@ -0,0 +1,70 @@
import React, { useEffect, useRef, forwardRef } from 'react';
import useGraphqlSchema from './useGraphqlSchema';
import { IconBook, IconDownload, IconLoader2, IconRefresh } from '@tabler/icons';
import get from 'lodash/get';
import { findEnvironmentInCollection } from 'utils/collections';
import Dropdown from '../../Dropdown';
const GraphQLSchemaActions = ({ item, collection, onSchemaLoad, toggleDocs }) => {
const url = item.draft ? get(item, 'draft.request.url') : get(item, 'request.url');
const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid);
const request = item.draft ? item.draft.request : item.request;
let {
schema,
schemaSource,
loadSchema,
isLoading: isSchemaLoading
} = useGraphqlSchema(url, environment, request, collection);
useEffect(() => {
if (onSchemaLoad) {
onSchemaLoad(schema);
}
}, [schema]);
const schemaDropdownTippyRef = useRef();
const onSchemaDropdownCreate = (ref) => (schemaDropdownTippyRef.current = ref);
const MenuIcon = forwardRef((props, ref) => {
return (
<div ref={ref} className="dropdown-icon cursor-pointer flex hover:underline ml-2">
{isSchemaLoading && <IconLoader2 className="animate-spin" size={18} strokeWidth={1.5} />}
{!isSchemaLoading && schema && <IconRefresh size={18} strokeWidth={1.5} />}
{!isSchemaLoading && !schema && <IconDownload size={18} strokeWidth={1.5} />}
<span className="ml-1">Schema</span>
</div>
);
});
return (
<div className="flex flex-grow justify-end items-center" style={{ fontSize: 13 }}>
<div className="flex items-center cursor-pointer hover:underline" onClick={toggleDocs}>
<IconBook size={18} strokeWidth={1.5} />
<span className="ml-1">Docs</span>
</div>
<Dropdown onCreate={onSchemaDropdownCreate} icon={<MenuIcon />} placement="bottom-start">
<div
className="dropdown-item"
onClick={(e) => {
schemaDropdownTippyRef.current.hide();
loadSchema('introspection');
}}
>
{schema && schemaSource === 'introspection' ? 'Refresh from Introspection' : 'Load from Introspection'}
</div>
<div
className="dropdown-item"
onClick={(e) => {
schemaDropdownTippyRef.current.hide();
loadSchema('file');
}}
>
Load from File
</div>
</Dropdown>
</div>
);
};
export default GraphQLSchemaActions;

View File

@@ -0,0 +1,89 @@
import { useState } from 'react';
import toast from 'react-hot-toast';
import { buildClientSchema } from 'graphql';
import { fetchGqlSchema } from 'utils/network';
import { simpleHash } from 'utils/common';
const schemaHashPrefix = 'bruno.graphqlSchema';
const useGraphqlSchema = (endpoint, environment, request, collection) => {
const { ipcRenderer } = window;
const localStorageKey = `${schemaHashPrefix}.${simpleHash(endpoint)}`;
const [error, setError] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [schemaSource, setSchemaSource] = useState('');
const [schema, setSchema] = useState(() => {
try {
const saved = localStorage.getItem(localStorageKey);
if (!saved) {
return null;
}
return buildClientSchema(JSON.parse(saved));
} catch {
localStorage.setItem(localStorageKey, null);
return null;
}
});
const loadSchemaFromIntrospection = async () => {
const response = await fetchGqlSchema(endpoint, environment, request, collection);
if (!response) {
throw new Error('Introspection query failed');
}
if (response.status !== 200) {
throw new Error(response.statusText);
}
const data = response.data?.data;
if (!data) {
throw new Error('No data returned from introspection query');
}
setSchemaSource('introspection');
return data;
};
const loadSchemaFromFile = async () => {
const schemaContent = await ipcRenderer.invoke('renderer:load-gql-schema-file');
if (!schemaContent) {
setIsLoading(false);
return;
}
setSchemaSource('file');
return schemaContent.data;
};
const loadSchema = async (schemaSource) => {
if (isLoading) {
return;
}
setIsLoading(true);
try {
let data;
if (schemaSource === 'file') {
data = await loadSchemaFromFile();
} else {
// fallback to introspection if source is unknown
data = await loadSchemaFromIntrospection();
}
setSchema(buildClientSchema(data));
localStorage.setItem(localStorageKey, JSON.stringify(data));
toast.success('GraphQL Schema loaded successfully');
} catch (err) {
setError(err);
toast.error(`Error occurred while loading GraphQL Schema: ${err.message}`);
}
setIsLoading(false);
};
return {
isLoading,
schema,
schemaSource,
loadSchema,
error
};
};
export default useGraphqlSchema;

View File

@@ -34,7 +34,7 @@ const QueryUrl = ({ item, collection, handleRun }) => {
requestUrlChanged({
itemUid: item.uid,
collectionUid: collection.uid,
url: value
url: value && typeof value === 'string' ? value.trim() : value
})
);
};

View File

@@ -8,6 +8,8 @@ import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collection
import SingleLineEditor from 'components/SingleLineEditor';
import Tooltip from 'components/Tooltip';
import StyledWrapper from './StyledWrapper';
import toast from 'react-hot-toast';
import { variableNameRegex } from 'utils/common/regex';
const VarsTable = ({ item, collection, vars, varType }) => {
const dispatch = useDispatch();
@@ -29,7 +31,16 @@ const VarsTable = ({ item, collection, vars, varType }) => {
const _var = cloneDeep(v);
switch (type) {
case 'name': {
_var.name = e.target.value;
const value = e.target.value;
if (variableNameRegex.test(value) === false) {
toast.error(
'Variable contains invalid characters! Variables must only contain alpha-numeric characters, "-", "_", "."'
);
return;
}
_var.name = value;
break;
}
case 'value': {
@@ -88,7 +99,7 @@ const VarsTable = ({ item, collection, vars, varType }) => {
</thead>
<tbody>
{vars && vars.length
? vars.map((_var, index) => {
? vars.map((_var) => {
return (
<tr key={_var.uid}>
<td>

View File

@@ -1,42 +1,12 @@
import React from 'react';
import get from 'lodash/get';
import { useDispatch } from 'react-redux';
import { updateRequestScript, updateResponseScript } from 'providers/ReduxStore/slices/collections';
import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions';
import { useTheme } from 'providers/Theme';
import VarsTable from './VarsTable';
import StyledWrapper from './StyledWrapper';
const Vars = ({ item, collection }) => {
const dispatch = useDispatch();
const requestVars = item.draft ? get(item, 'draft.request.vars.req') : get(item, 'request.vars.req');
const responseVars = item.draft ? get(item, 'draft.request.vars.res') : get(item, 'request.vars.res');
const { storedTheme } = useTheme();
const onRequestScriptEdit = (value) => {
dispatch(
updateRequestScript({
script: value,
itemUid: item.uid,
collectionUid: collection.uid
})
);
};
const onResponseScriptEdit = (value) => {
dispatch(
updateResponseScript({
script: value,
itemUid: item.uid,
collectionUid: collection.uid
})
);
};
const onRun = () => dispatch(sendRequest(item, collection.uid));
const onSave = () => dispatch(saveRequest(item.uid, collection.uid));
return (
<StyledWrapper className="w-full flex flex-col">
<div className="flex-1 mt-2">

View File

@@ -42,7 +42,7 @@ const CollectionToolBar = ({ collection }) => {
return (
<StyledWrapper>
<div className="flex items-center p-2">
<div className="flex flex-1 items-center">
<div className="flex flex-1 items-center cursor-pointer hover:underline" onClick={viewCollectionSettings}>
<IconFiles size={18} strokeWidth={1.5} />
<span className="ml-2 mr-4 font-semibold">{collection.name}</span>
</div>

View File

@@ -1,28 +1,46 @@
import React from 'react';
import { IconAlertTriangle } from '@tabler/icons';
import Modal from 'components/Modal';
const ConfirmRequestClose = ({ onCancel, onCloseWithoutSave, onSaveAndClose }) => {
const _handleCancel = ({ type }) => {
if (type === 'button') {
return onCloseWithoutSave();
}
return onCancel();
};
const ConfirmRequestClose = ({ item, onCancel, onCloseWithoutSave, onSaveAndClose }) => {
return (
<Modal
size="sm"
size="md"
title="Unsaved changes"
confirmText="Save and Close"
cancelText="Close without saving"
handleConfirm={onSaveAndClose}
handleCancel={_handleCancel}
disableEscapeKey={true}
disableCloseOnOutsideClick={true}
closeModalFadeTimeout={150}
onClick={(e) => {
e.stopPropagation();
e.preventDefault();
}}
hideFooter={true}
>
<div className="font-normal">You have unsaved changes in you request.</div>
<div className="flex items-center font-normal">
<IconAlertTriangle size={32} strokeWidth={1.5} className="text-yellow-600" />
<h1 className="ml-2 text-lg font-semibold">Hold on..</h1>
</div>
<div className="font-normal mt-4">
You have unsaved changes in request <span className="font-semibold">{item.name}</span>.
</div>
<div className="flex justify-between mt-6">
<div>
<button className="btn btn-sm btn-danger" onClick={onCloseWithoutSave}>
Don't Save
</button>
</div>
<div>
<button className="btn btn-close btn-sm mr-2" onClick={onCancel}>
Cancel
</button>
<button className="btn btn-secondary btn-sm" onClick={onSaveAndClose}>
Save
</button>
</div>
</div>
</Modal>
);
};

View File

@@ -3,15 +3,15 @@ import get from 'lodash/get';
import { closeTabs } from 'providers/ReduxStore/slices/tabs';
import { saveRequest } from 'providers/ReduxStore/slices/collections/actions';
import { deleteRequestDraft } from 'providers/ReduxStore/slices/collections';
import { useDispatch } from 'react-redux';
import { findItemInCollection } from 'utils/collections';
import StyledWrapper from './StyledWrapper';
import RequestTabNotFound from './RequestTabNotFound';
import ConfirmRequestClose from './ConfirmRequestClose';
import SpecialTab from './SpecialTab';
import { useTheme } from 'providers/Theme';
import { useDispatch } from 'react-redux';
import darkTheme from 'themes/dark';
import lightTheme from 'themes/light';
import { findItemInCollection } from 'utils/collections';
import ConfirmRequestClose from './ConfirmRequestClose';
import RequestTabNotFound from './RequestTabNotFound';
import SpecialTab from './SpecialTab';
import StyledWrapper from './StyledWrapper';
const RequestTab = ({ tab, collection }) => {
const dispatch = useDispatch();
@@ -92,6 +92,7 @@ const RequestTab = ({ tab, collection }) => {
<StyledWrapper className="flex items-center justify-between tab-container px-1">
{showConfirmClose && (
<ConfirmRequestClose
item={item}
onCancel={() => setShowConfirmClose(false)}
onCloseWithoutSave={() => {
dispatch(
@@ -136,6 +137,8 @@ const RequestTab = ({ tab, collection }) => {
onClick={(e) => {
if (!item.draft) return handleCloseClick(e);
e.stopPropagation();
e.preventDefault();
setShowConfirmClose(true);
}}
>

View File

@@ -0,0 +1,56 @@
import { IconFilter } from '@tabler/icons';
import React, { useMemo } from 'react';
import { Tooltip as ReactTooltip } from 'react-tooltip';
const QueryResultFilter = ({ onChange, mode }) => {
const tooltipText = useMemo(() => {
if (mode.includes('json')) {
return 'Filter with JSONPath';
}
if (mode.includes('xml')) {
return 'Filter with XPath';
}
return null;
}, [mode]);
const placeholderText = useMemo(() => {
if (mode.includes('json')) {
return '$.store.books..author';
}
if (mode.includes('xml')) {
return '/store/books//author';
}
return null;
}, [mode]);
return (
<div className={'response-filter relative'}>
<div className="absolute inset-y-0 left-0 pl-4 flex items-center">
<div className="text-gray-500 sm:text-sm" id="request-filter-icon">
<IconFilter size={16} strokeWidth={1.5} />
</div>
</div>
{tooltipText && <ReactTooltip anchorId={'request-filter-icon'} html={tooltipText} />}
<input
type="text"
name="response-filter"
id="response-filter"
placeholder={placeholderText}
autoComplete="off"
autoCorrect="off"
autoCapitalize="off"
spellCheck="false"
className="block w-full pl-10 py-1 sm:text-sm"
onChange={onChange}
/>
</div>
);
};
export default QueryResultFilter;

View File

@@ -2,6 +2,11 @@ import CodeEditor from 'components/CodeEditor/index';
import { get } from 'lodash';
import { useDispatch, useSelector } from 'react-redux';
import { sendRequest } from 'providers/ReduxStore/slices/collections/actions';
import { Document, Page } from 'react-pdf';
import { useState } from 'react';
import 'pdfjs-dist/build/pdf.worker';
import 'react-pdf/dist/esm/Page/AnnotationLayer.css';
import 'react-pdf/dist/esm/Page/TextLayer.css';
const QueryResultPreview = ({
previewTab,
@@ -19,6 +24,10 @@ const QueryResultPreview = ({
const preferences = useSelector((state) => state.app.preferences);
const dispatch = useDispatch();
const [numPages, setNumPages] = useState(null);
function onDocumentLoadSuccess({ numPages }) {
setNumPages(numPages);
}
// Fail safe, so we don't render anything with an invalid tab
if (!allowedPreviewModes.includes(previewTab)) {
return null;
@@ -45,6 +54,17 @@ const QueryResultPreview = ({
case 'preview-image': {
return <img src={`data:${contentType.replace(/\;(.*)/, '')};base64,${dataBuffer}`} className="mx-auto" />;
}
case 'preview-pdf': {
return (
<div className="preview-pdf" style={{ height: '100%', overflow: 'auto', maxHeight: 'calc(100vh - 220px)' }}>
<Document file={`data:application/pdf;base64,${dataBuffer}`} onLoadSuccess={onDocumentLoadSuccess}>
{Array.from(new Array(numPages), (el, index) => (
<Page key={`page_${index + 1}`} pageNumber={index + 1} renderAnnotationLayer={false} />
))}
</Document>
</div>
);
}
default:
case 'raw': {
return (

View File

@@ -3,7 +3,7 @@ import styled from 'styled-components';
const StyledWrapper = styled.div`
display: grid;
grid-template-columns: 100%;
grid-template-rows: 1.25rem calc(100% - 1.25rem);
grid-template-rows: ${(props) => (props.queryFilterEnabled ? '1.25rem 1fr 2.25rem' : '1.25rem 1fr')};
/* This is a hack to force Codemirror to use all available space */
> div {
@@ -18,11 +18,44 @@ const StyledWrapper = styled.div`
width: 100%;
}
.react-pdf__Page {
margin-top: 10px;
background-color: transparent !important;
}
.react-pdf__Page__textContent {
border: 1px solid darkgrey;
box-shadow: 5px 5px 5px 1px #ccc;
border-radius: 0px;
margin: 0 auto;
}
.react-pdf__Page__canvas {
margin: 0 auto;
}
div[role='tablist'] {
.active {
color: ${(props) => props.theme.colors.text.yellow};
}
}
.muted {
color: ${(props) => props.theme.colors.text.muted};
}
.response-filter {
position: absolute;
bottom: 0;
width: 100%;
input {
border: ${(props) => props.theme.sidebar.search.border};
border-radius: 2px;
background-color: ${(props) => props.theme.sidebar.search.bg};
&:focus {
outline: none;
}
}
}
`;
export default StyledWrapper;

View File

@@ -1,3 +1,6 @@
import { debounce } from 'lodash';
import QueryResultFilter from './QueryResultFilter';
import { JSONPath } from 'jsonpath-plus';
import React from 'react';
import classnames from 'classnames';
import { getContentType, safeStringifyJSON, safeParseXML } from 'utils/common';
@@ -10,12 +13,20 @@ import { useMemo } from 'react';
import { useEffect } from 'react';
import { useTheme } from 'providers/Theme/index';
const formatResponse = (data, mode) => {
if (!data) {
const formatResponse = (data, mode, filter) => {
if (data === undefined) {
return '';
}
if (mode.includes('json')) {
if (filter) {
try {
data = JSONPath({ path: filter, json: data });
} catch (e) {
console.warn('Could not filter with JSONPath.', e.message);
}
}
return safeStringifyJSON(data, true);
}
@@ -28,7 +39,7 @@ const formatResponse = (data, mode) => {
return safeStringifyJSON(parsed, true);
}
if (['text', 'html'].includes(mode) || typeof data === 'string') {
if (typeof data === 'string') {
return data;
}
@@ -37,10 +48,15 @@ const formatResponse = (data, mode) => {
const QueryResult = ({ item, collection, data, dataBuffer, width, disableRunEventListener, headers, error }) => {
const contentType = getContentType(headers);
const mode = getCodeMirrorModeBasedOnContentType(contentType);
const formattedData = formatResponse(data, mode);
const mode = getCodeMirrorModeBasedOnContentType(contentType, data);
const [filter, setFilter] = useState(null);
const formattedData = formatResponse(data, mode, filter);
const { storedTheme } = useTheme();
const debouncedResultFilterOnChange = debounce((e) => {
setFilter(e.target.value);
}, 250);
const allowedPreviewModes = useMemo(() => {
// Always show raw
const allowedPreviewModes = ['raw'];
@@ -49,6 +65,8 @@ const QueryResult = ({ item, collection, data, dataBuffer, width, disableRunEven
allowedPreviewModes.unshift('preview-web');
} else if (mode.includes('image')) {
allowedPreviewModes.unshift('preview-image');
} else if (contentType.includes('pdf')) {
allowedPreviewModes.unshift('preview-pdf');
}
return allowedPreviewModes;
@@ -79,27 +97,45 @@ const QueryResult = ({ item, collection, data, dataBuffer, width, disableRunEven
));
}, [allowedPreviewModes, previewTab]);
const queryFilterEnabled = useMemo(() => mode.includes('json'), [mode]);
return (
<StyledWrapper className="w-full h-full" style={{ maxWidth: width }}>
<StyledWrapper
className="w-full h-full relative"
style={{ maxWidth: width }}
queryFilterEnabled={queryFilterEnabled}
>
<div className="flex justify-end gap-2 text-xs" role="tablist">
{tabs}
</div>
{error ? (
<span className="text-red-500">{error}</span>
<div>
<div className="text-red-500">{error}</div>
{error && typeof error === 'string' && error.toLowerCase().includes('self signed certificate') ? (
<div className="mt-6 muted text-xs">
You can disable SSL verification in the Preferences. <br />
To open the Preferences, click on the gear icon in the bottom left corner.
</div>
) : null}
</div>
) : (
<QueryResultPreview
previewTab={previewTab}
data={data}
dataBuffer={dataBuffer}
formattedData={formattedData}
item={item}
contentType={contentType}
mode={mode}
collection={collection}
allowedPreviewModes={allowedPreviewModes}
disableRunEventListener={disableRunEventListener}
storedTheme={storedTheme}
/>
<>
<QueryResultPreview
previewTab={previewTab}
data={data}
dataBuffer={dataBuffer}
formattedData={formattedData}
item={item}
contentType={contentType}
mode={mode}
collection={collection}
allowedPreviewModes={allowedPreviewModes}
disableRunEventListener={disableRunEventListener}
storedTheme={storedTheme}
/>
{queryFilterEnabled && <QueryResultFilter onChange={debouncedResultFilterOnChange} mode={mode} />}
</>
)}
</StyledWrapper>
);

View File

@@ -0,0 +1,8 @@
import styled from 'styled-components';
const StyledWrapper = styled.div`
font-size: 0.8125rem;
color: ${(props) => props.theme.requestTabPanel.responseStatus};
`;
export default StyledWrapper;

View File

@@ -0,0 +1,27 @@
import React from 'react';
import { IconEraser } from '@tabler/icons';
import { useDispatch } from 'react-redux';
import StyledWrapper from './StyledWrapper';
import { responseCleared } from 'providers/ReduxStore/slices/collections/index';
const ResponseClear = ({ collection, item }) => {
const dispatch = useDispatch();
const clearResponse = () =>
dispatch(
responseCleared({
itemUid: item.uid,
collectionUid: collection.uid,
response: null
})
);
return (
<StyledWrapper className="ml-2 flex items-center">
<button onClick={clearResponse} title="Clear response">
<IconEraser size={16} strokeWidth={1.5} />
</button>
</StyledWrapper>
);
};
export default ResponseClear;

Some files were not shown because too many files have changed in this diff Show More