Compare commits

...

1468 Commits

Author SHA1 Message Date
liyasthomas
d3a1898dad feat: support to move sidebar to left - fixed #1933 2021-11-04 09:58:15 +05:30
Andrew Bastin
45e508fc36 refactor: pwa install prompt (#1932) 2021-11-03 23:44:01 +05:30
0xc0Der
8edad7ded7 persist environment selection. (#1925)
* feat: persist environment selection

* refactor: minor change to selectedEnvIndex calculation

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-11-03 23:15:52 +05:30
liyasthomas
75e1adb7b3 refactor: empty state illustrations 2021-11-03 16:10:06 +05:30
Andrew Bastin
22ac13f2f0 fix: docker action issues 2021-11-02 21:22:37 +05:30
liyasthomas
7f0246eb47 Merge branch 'refactor/backend' of https://github.com/hoppscotch/hoppscotch into refactor/backend 2021-11-02 19:48:34 +05:30
liyasthomas
5f0800760f chore: clean up 2021-11-02 19:45:41 +05:30
liyasthomas
6db99c9e37 chore(deps): bump 2021-11-02 19:42:44 +05:30
liyasthomas
3b2cabd3f3 fix: typo 2021-11-02 19:39:39 +05:30
Andrew Bastin
b0dd6b0bd6 feat: fix gqlclient race condition 2021-11-02 19:33:09 +05:30
liyasthomas
874b846e60 fix: fix broken edit team modal
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-11-02 19:33:09 +05:30
liyasthomas
dbe2525c6f docs: updated feature list 2021-11-02 19:33:09 +05:30
Andrew Bastin
afd414fa3f feat: introducing gql polling 2021-11-02 19:33:09 +05:30
liyasthomas
94763dcb31 fix: prompt user on actions with no permission 2021-11-02 19:33:09 +05:30
Andrew Bastin
6314740f46 feat: reinit gql client after login 2021-11-02 19:33:09 +05:30
liyasthomas
d7332120e3 fix: hide popover on click on update role 2021-11-02 19:33:09 +05:30
liyasthomas
8c74fe9925 feat: user's roles prompt on invite modal 2021-11-02 19:33:09 +05:30
liyasthomas
c74ddeb530 fix: team invitation error states 2021-11-02 19:33:09 +05:30
Andrew Bastin
e31c0a9d02 feat: fix subscription auth refresh issues 2021-11-02 19:33:09 +05:30
Andrew Bastin
d9e5d4aec5 feat: add subscriptions for team invitations added and removed 2021-11-02 19:33:09 +05:30
liyasthomas
c1ee8f5dd0 feat: subscriptions on edit team modal 2021-11-02 19:33:09 +05:30
Andrew Bastin
dd59de3de0 feat: add subscription support for useGQLQuery 2021-11-02 19:33:07 +05:30
liyasthomas
511a3c55f3 fix: broken edit team modal 2021-11-02 19:32:49 +05:30
liyasthomas
c9021ab3ca fix: broken edit team action 2021-11-02 19:32:49 +05:30
liyasthomas
a765c4a7cc feat: successfully joined team prompt 2021-11-02 19:32:48 +05:30
Andrew Bastin
ea99732474 refactor: use the unpaginated teamMembers field instead of members 2021-11-02 19:32:48 +05:30
liyasthomas
6c64ffe833 feat: invite system error states and user prompts 2021-11-02 19:32:48 +05:30
Andrew Bastin
5fa6c6cdb3 fix: improper parsed error checks 2021-11-02 19:32:48 +05:30
Andrew Bastin
d94759870e refactor: add error info to send invite results 2021-11-02 19:32:48 +05:30
Andrew Bastin
f0a6fc641a feat: team invitation caching 2021-11-02 19:32:48 +05:30
Andrew Bastin
7ba00bee0b feat: update graphcache keys typings 2021-11-02 19:32:48 +05:30
liyasthomas
dc2bdf81b9 fix: invitation acceptance flow 2021-11-02 19:32:48 +05:30
liyasthomas
187a30abac feat: init loading states, minor ui improvements 2021-11-02 19:32:48 +05:30
liyasthomas
5b824ccb17 feat: minor ui improvements on invite flow 2021-11-02 19:32:48 +05:30
liyasthomas
3bdf2baf97 feat: init invitation wiring
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-11-02 19:32:48 +05:30
Andrew Bastin
9af8a24a89 feat: initial team invites implementation
Co-authored-by: Liyas Thomas <hi@liyasthomas.com>
2021-11-02 19:32:48 +05:30
liyasthomas
57c4759bdb chore: minor fixes and improvements 2021-11-02 19:32:48 +05:30
Andrew Bastin
d9d7261bc5 feat: team invitation mutations 2021-11-02 19:32:48 +05:30
Andrew Bastin
a12315d81a refactor: add graphcache codegen and update types 2021-11-02 19:32:47 +05:30
liyasthomas
9f0956556f feat: support updating user's display name 2021-11-02 19:32:13 +05:30
liyasthomas
748318d44e feat: compact mode for team component 2021-11-02 19:32:13 +05:30
liyasthomas
ff3062cdfc chore: clean up 2021-11-02 19:32:13 +05:30
liyasthomas
48d67fe7e1 fix: init local persistence 2021-11-02 19:32:13 +05:30
liyasthomas
2c9918f9a7 feat: init theming in empty layout 2021-11-02 19:32:13 +05:30
liyasthomas
ee03952201 feat: init teams invite page 2021-11-02 19:32:13 +05:30
liyasthomas
43dcd3c443 feat: invite modal mvp 2021-11-02 19:32:13 +05:30
Andrew Bastin
8f8c42a92a feat: gql codegen + caching + optimistic 2021-11-02 19:32:11 +05:30
liyasthomas
6496aded25 feat: teams modal wrapper 2021-11-02 19:25:36 +05:30
Andrew Bastin
eacf8113af feat: initial setup of new backend comms 2021-11-02 19:20:07 +05:30
liyasthomas
c4a1527153 chore(deps): bump 2021-11-02 19:17:30 +05:30
liyasthomas
4a89a6aafc feat: teams invite modal 2021-11-02 19:17:11 +05:30
Andrew Bastin
52539b084d feat: gql codegen + caching + optimistic 2021-11-02 19:17:09 +05:30
Andrew Bastin
8d5bd051a1 refactor: extract cache info to separate files and add more mutations 2021-11-02 19:15:44 +05:30
liyasthomas
3809e9853e chore(ui): minor ui improvements, empty teams state 2021-11-02 19:15:44 +05:30
Andrew Bastin
5f795acd61 feat: probable user is displayed as authenticated 2021-11-02 19:15:44 +05:30
liyasthomas
17c550404f refactor: updated lint script 2021-11-02 19:15:44 +05:30
Andrew Bastin
a840079119 feat: add persistent cache and optimistic updates 2021-11-02 19:15:42 +05:30
Andrew Bastin
2761894164 fix: queries not waiting for authentication 2021-11-02 19:15:20 +05:30
liyasthomas
6b8bc618dc feat: teams modal wrapper 2021-11-02 19:15:02 +05:30
liyasthomas
258f79604f refactor: remove EAInvite flag 2021-11-02 19:15:02 +05:30
Andrew Bastin
81ae70ee04 fix: fix issue with team queries not updating correctly after mutation 2021-11-02 19:15:02 +05:30
Andrew Bastin
6b02d290a5 feat: team mutation 2021-11-02 19:15:02 +05:30
Andrew Bastin
7ab1bbaf62 refactor: refactor create team modal to new system 2021-11-02 19:15:02 +05:30
liyasthomas
079083d0f2 fix: i18n usage 2021-11-02 19:15:02 +05:30
liyasthomas
0504707aab feat: init profile page 2021-11-02 19:14:59 +05:30
Andrew Bastin
fb4aab875d feat: introduce updated mutation system and team.vue rewrite 2021-11-02 19:14:25 +05:30
Andrew Bastin
7bb32ecf7e feat: initial setup of new backend comms 2021-11-02 19:14:21 +05:30
Andrew Bastin
e129a5c179 feat: fix gqlclient race condition 2021-11-02 19:11:16 +05:30
liyasthomas
8045f26c19 fix: fix broken edit team modal
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-11-02 14:25:38 +05:30
liyasthomas
86516421b5 fix(ci): run build command from root 2021-11-02 07:01:48 +05:30
liyasthomas
bce88ccd44 docs: updated feature list 2021-11-02 06:41:18 +05:30
0xc0Der
66d408b7db Allow duplication of global environment (#1924) 2021-11-02 06:16:16 +05:30
Andrew Bastin
297bf3205f feat: introducing gql polling 2021-11-01 22:27:06 +05:30
liyasthomas
7366b32349 fix: prompt user on actions with no permission 2021-11-01 17:51:01 +05:30
Andrew Bastin
b7e0169c9b feat: reinit gql client after login 2021-11-01 17:30:16 +05:30
liyasthomas
6b6f85cc7e fix: hide popover on click on update role 2021-11-01 15:25:19 +05:30
liyasthomas
2c014a2f4b feat: user's roles prompt on invite modal 2021-11-01 15:04:46 +05:30
liyasthomas
d6df675821 fix: team invitation error states 2021-11-01 14:20:35 +05:30
liyasthomas
427baf4c79 chore: bump dep + minor ui fixes 2021-11-01 13:10:48 +05:30
liyasthomas
4f2b682341 chore(deps): bump 2021-10-31 19:53:05 +05:30
Andrew Bastin
e03f888cb2 feat: fix subscription auth refresh issues 2021-10-31 17:40:03 +05:30
Andrew Bastin
513396d498 feat: add subscriptions for team invitations added and removed 2021-10-30 18:56:34 +05:30
liyasthomas
8f04f0758b fix: use hoppscotch's realtime echo servers - resolved #1913 2021-10-29 08:55:31 +05:30
liyasthomas
7a77bfc248 feat: subscriptions on edit team modal 2021-10-28 20:29:49 +05:30
Andrew Bastin
ddd29374ea feat: add subscription support for useGQLQuery 2021-10-27 22:41:32 +05:30
liyasthomas
4b0d7a6c3d fix: broken edit team modal 2021-10-27 18:32:11 +05:30
liyasthomas
20bfc02a4e fix: disable spellcheck on contenteditable - resolved #1908 2021-10-27 18:17:22 +05:30
Darío Hereñú
2511724b73 chore: updated spanish translation (#1907) 2021-10-27 06:10:17 +05:30
liyasthomas
a851ee3fab fix: broken edit team action 2021-10-26 23:16:56 +05:30
liyasthomas
40f6e6f8a8 fix: typo in test result 2021-10-26 15:36:59 +05:30
liyasthomas
e2fd104c2d feat: test results indicator in response section's tests tab 2021-10-26 13:48:09 +05:30
Andrew Bastin
a3eafa54fa fix: test script not parsing json object if json content type 2021-10-26 13:19:15 +05:30
Sergio Guzmán Mayorga
b90b4a1910 chore: update spanish translations (#1904) 2021-10-26 06:47:28 +05:30
liyasthomas
247df4d5b9 chore: bump deps + fix broken links 2021-10-25 21:04:28 +05:30
Burak Saraloglu
4a3889a76e chore (i18n): updated Turkish translations (#1893) 2021-10-25 05:02:30 +05:30
liyasthomas
224a6e069c chore(deps): bump 2021-10-24 20:06:22 +05:30
liyasthomas
2c3097eeb7 feat: successfully joined team prompt 2021-10-24 14:46:32 +05:30
Andrew Bastin
3289ede0e8 refactor: use the unpaginated teamMembers field instead of members 2021-10-22 15:34:20 +05:30
liyasthomas
ddf21c17d2 feat: invite system error states and user prompts 2021-10-21 18:17:32 +05:30
Andrew Bastin
c9a24a0d28 fix: improper parsed error checks 2021-10-20 16:49:58 +05:30
Andrew Bastin
fa4b130b18 refactor: add error info to send invite results 2021-10-20 15:50:21 +05:30
Andrew Bastin
8561a7547f feat: team invitation caching 2021-10-20 15:33:20 +05:30
liyasthomas
e85f7b8232 feat: collapse collections/folders on clicking side border 2021-10-20 13:55:18 +05:30
Chun-Hao Lien
2f91d25ed4 chore: add json file extension (#1889) 2021-10-20 12:06:01 +05:30
Andrew Bastin
ae304b5af7 feat: update graphcache keys typings 2021-10-19 23:12:47 +05:30
Andrew Bastin
1c51f8b32e fix: bug with search box key listeners still active after close 2021-10-19 14:42:39 +05:30
liyasthomas
aaff07bba2 Merge remote-tracking branch 'origin/keyboard-navigation-on-power-search' 2021-10-19 13:45:48 +05:30
Francisco Emanuel de Sales Pereira
4bc38d5e0f Feature: Adds arrow keys navigation on power search (#1888) 2021-10-19 13:44:14 +05:30
liyasthomas
fdfca00886 feat: set active on hover + minor ui improvements 2021-10-19 13:40:47 +05:30
Liyas Thomas
d872e393f8 Merge branch 'main' into keyboard-navigation-on-power-search 2021-10-19 10:56:00 +05:30
franciscoemanuel
686d8e5be7 feat: adds arrow keys navigation on powersearch 2021-10-19 02:20:30 -03:00
liyasthomas
4e30efd737 fix: invitation acceptance flow 2021-10-18 21:43:13 +05:30
rubjo
aa4935c505 chore(i18n): updated Norwegian translations (#1886) 2021-10-18 12:20:27 +05:30
liyasthomas
0e381ab850 feat: init loading states, minor ui improvements 2021-10-18 09:36:33 +05:30
liyasthomas
4a03ee4518 chore(deps): bump 2021-10-18 07:34:26 +05:30
Geert Wirken
be414d8279 Improve Dutch translations (#1880) 2021-10-17 22:43:18 +05:30
liyasthomas
c47b1f2413 chore(deps): bump 2021-10-17 19:42:53 +05:30
liyasthomas
ba9ee052a6 feat: minor ui improvements on invite flow 2021-10-17 18:53:24 +05:30
liyasthomas
b1c6708762 feat: init invitation wiring
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-10-17 16:45:48 +05:30
Andrew Bastin
0ba31b6c79 feat: initial team invites implementation
Co-authored-by: Liyas Thomas <hi@liyasthomas.com>
2021-10-17 15:05:43 +05:30
liyasthomas
14f402f186 feat: minor ui improvements to power search 2021-10-17 11:37:06 +05:30
liyasthomas
b811e97ea5 feat: set hoppscotch graphql echo server as default 2021-10-17 00:49:36 +05:30
Oscar Dominguez
6d167ce1d6 ci(workflow): add cache to workflows using actions/setup-node (#1872) 2021-10-16 22:50:16 +05:30
liyasthomas
9ac1d23fd9 chore: minor fixes and improvements 2021-10-16 20:54:19 +05:30
Andrew Bastin
dea3a34e3d feat: team invitation mutations 2021-10-16 15:14:07 +05:30
Andrew Bastin
39de34f083 refactor: add graphcache codegen and update types 2021-10-16 15:14:07 +05:30
liyasthomas
02d5f0fdf3 feat: support updating user's display name 2021-10-16 15:01:32 +05:30
liyasthomas
0bb7cbe8d9 feat: compact mode for team component 2021-10-16 11:14:33 +05:30
liyasthomas
3e3b88b8c2 feat: native email input validation on login modal 2021-10-16 00:00:33 +05:30
liyasthomas
1438beb93b chore: clean up 2021-10-15 08:15:43 +05:30
liyasthomas
c1ec5dc60d feat: promote environment aware input to stable 2021-10-14 13:00:32 +05:30
prasanth
3f513f2f4d fix(request): multipart payload not working while using proxy 2021-10-13 21:32:27 +05:30
liyasthomas
d1b573f6f9 fix: init local persistence 2021-10-13 19:42:13 +05:30
liyasthomas
0e08abc46f feat: init theming in empty layout 2021-10-13 17:00:56 +05:30
liyasthomas
49bdf9f203 feat: init teams invite page 2021-10-13 16:12:02 +05:30
liyasthomas
b3e9df4f3d fix: introduce X-Frame-Options header to prevent clickjacking 2021-10-13 08:58:40 +05:30
Andrew Bastin
3b8cf4a60a fix: single character shortcuts not working 2021-10-12 21:43:06 +05:30
Akash Hamirwasia
b7ccb9a34c feat: disable inputs in realtime and graphql connections when active (#1870) 2021-10-12 21:19:29 +05:30
Akash Hamirwasia
b8ffa872c7 feat: add socket.io-client version selector menu (#1867) 2021-10-12 11:22:47 +05:30
liyasthomas
ef866f7851 feat: invite modal mvp 2021-10-11 06:51:43 +05:30
liyasthomas
f27515bf1d Merge branch 'refactor/backend' of https://github.com/hoppscotch/hoppscotch into refactor/backend 2021-10-10 20:49:27 +05:30
liyasthomas
ddf74c5d7c chore(deps): bump 2021-10-10 20:48:16 +05:30
liyasthomas
8ea12695b3 feat: teams invite modal 2021-10-10 20:44:21 +05:30
Andrew Bastin
d6324e6ba6 feat: gql codegen + caching + optimistic 2021-10-10 20:44:18 +05:30
Andrew Bastin
2325982801 refactor: extract cache info to separate files and add more mutations 2021-10-10 20:43:19 +05:30
liyasthomas
b103c45e65 chore(ui): minor ui improvements, empty teams state 2021-10-10 20:43:18 +05:30
Andrew Bastin
409989eddb feat: probable user is displayed as authenticated 2021-10-10 20:43:18 +05:30
liyasthomas
3f5fcae280 refactor: updated lint script 2021-10-10 20:43:18 +05:30
Andrew Bastin
d5123c793a feat: add persistent cache and optimistic updates 2021-10-10 20:43:16 +05:30
Andrew Bastin
e6707c1e4a fix: queries not waiting for authentication 2021-10-10 20:42:46 +05:30
liyasthomas
41be5cc4a8 feat: teams modal wrapper 2021-10-10 20:41:57 +05:30
liyasthomas
e82a4a1d23 refactor: remove EAInvite flag 2021-10-10 20:41:57 +05:30
Andrew Bastin
e30e4edfce fix: fix issue with team queries not updating correctly after mutation 2021-10-10 20:41:57 +05:30
Andrew Bastin
bd72ef7950 feat: team mutation 2021-10-10 20:41:57 +05:30
Andrew Bastin
539034df2a refactor: refactor create team modal to new system 2021-10-10 20:41:57 +05:30
liyasthomas
6da6afc5a1 fix: i18n usage 2021-10-10 20:41:57 +05:30
liyasthomas
fea523972d feat: init profile page 2021-10-10 20:41:57 +05:30
Andrew Bastin
5cfc6c2949 feat: introduce updated mutation system and team.vue rewrite 2021-10-10 20:41:57 +05:30
Andrew Bastin
6dd0c25d49 feat: initial setup of new backend comms 2021-10-10 20:41:54 +05:30
liyasthomas
ab9b3e47b9 chore(deps): bump 2021-10-10 20:24:31 +05:30
James George
33ebdf2831 chore: cleanup .husky directory (#1865) 2021-10-10 15:00:57 +05:30
liyasthomas
ef95939763 feat: teams invite modal 2021-10-09 16:10:51 +05:30
Rishabh kalra
0394deaeef route navigation no longer happening in typable areas (#1862) 2021-10-09 06:45:17 +05:30
Andrew Bastin
337a60c8a4 feat: gql codegen + caching + optimistic 2021-10-08 23:51:06 +05:30
Andrew Bastin
47b341d50e fix: fix conditional tabs not rerendering 2021-10-06 21:55:05 +05:30
Andrew Bastin
a5fd39adf8 refactor: extract cache info to separate files and add more mutations 2021-10-06 19:32:27 +05:30
liyasthomas
5772117dc8 fix: respect localePath on router - fixed #1859 2021-10-06 12:38:50 +05:30
liyasthomas
f73c8a45d9 chore(ui): minor ui improvements, empty teams state 2021-10-05 22:17:29 +05:30
Andrew Bastin
109d4190ae feat: probable user is displayed as authenticated 2021-10-05 22:06:19 +05:30
liyasthomas
317de82be6 refactor: updated lint script 2021-10-05 21:48:10 +05:30
Boris K
3604d69463 chore(i18n): fixed french translations (#1858) 2021-10-05 15:16:36 +05:30
Andrew Bastin
96cf774652 feat: add persistent cache and optimistic updates 2021-10-05 02:09:39 +05:30
liyasthomas
d2b39976ba chore(deps): bump 2021-10-04 08:16:40 +05:30
Stephane
06161bc963 Show graphql error message (#1852)
Co-authored-by: StephaneBischoffSSENSE <stephane.bischoff@ssense.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-10-04 08:01:47 +05:30
bblumenwiese
2ab1d3dbfa docs: fix broken link to .env.example in README (#1854)
Refs #1852
2021-10-04 00:29:45 +05:30
Andrew Bastin
ecdc7919ae fix: queries not waiting for authentication 2021-10-03 19:14:32 +05:30
liyasthomas
a24541ac2b chore(deps): bump 2021-10-03 19:13:44 +05:30
liyasthomas
d832690548 refactor: better name for duplicated environment 2021-10-03 18:53:27 +05:30
Stephane
2844710ea8 feat: add ability to copy environments (#1848)
Co-authored-by: StephaneBischoffSSENSE <stephane.bischoff@ssense.com>
2021-10-03 18:38:36 +05:30
liyasthomas
84ad4071ad feat: teams modal wrapper 2021-10-03 18:14:52 +05:30
liyasthomas
7f501241f0 refactor: remove EAInvite flag 2021-10-03 15:49:04 +05:30
Manda Putra
5dcfa66c5d fix: parsing 2021-10-03 12:28:49 +05:30
Manda Putra
f428a21279 feat: parse body from url params 2021-10-03 12:28:49 +05:30
Andrew Bastin
ccdd4963cd fix: fix issue with team queries not updating correctly after mutation 2021-10-03 01:31:06 +05:30
Andrew Bastin
2092a3729c feat: team mutation 2021-10-02 13:50:08 +05:30
Andrew Bastin
a628420adb refactor: refactor create team modal to new system 2021-10-02 13:50:08 +05:30
liyasthomas
23de147ca1 fix: i18n usage 2021-10-02 13:46:51 +05:30
liyasthomas
93f55f5619 feat: init profile page 2021-10-02 13:22:07 +05:30
Liyas Thomas
b10933898f Merge pull request #1845 from YasiOnFire/fix-polish-localization
chore(i18n): fix polish translation
2021-10-02 07:34:24 +05:30
Yasio
1727b754d4 chore(i18n): fix polish translation 2021-10-01 20:36:12 +02:00
Andrew Bastin
ffb0c12c08 feat: introduce updated mutation system and team.vue rewrite 2021-10-01 15:13:48 +05:30
Andrew Bastin
c332808fe4 feat: initial setup of new backend comms 2021-10-01 13:46:22 +05:30
liyasthomas
8f0538c886 chore(i18n): updated translations 2021-10-01 11:24:34 +05:30
Khaleel Gibran
e6bb7e2ca9 Remove random </br>s in locale footers (#1844) 2021-10-01 10:12:10 +05:30
liyasthomas
2a012520d0 fix: proper type for ID 2021-09-30 16:05:40 +05:30
Andrew Bastin
c71333d9cb refactor: update ID based backend queries to proper types 2021-09-30 12:52:31 +05:30
liyasthomas
728515c225 chore: bump deps 2021-09-26 19:16:23 +05:30
Andrew Bastin
e0f88e01f9 Update js-sandbox README 2021-09-26 11:27:46 +05:30
Andrew Bastin
1aa94a12c0 Merge pull request #1836 from AndrewBastin/refactor/js-sandbox
Move to JS code execution sandbox (HOPP-67, HOPP-66)
2021-09-25 23:05:41 +05:30
Andrew Bastin
de2d3361a7 refactor: bump js-sandbox version to 1.0.0 2021-09-25 22:25:33 +05:30
Andrew Bastin
680937e50b feat: fix issue with the pre-request envs 2021-09-25 21:21:01 +05:30
liyasthomas
6751c50514 fix: build 2021-09-25 12:21:32 +05:30
liyasthomas
0c389701fe chore(docs): updated readme 2021-09-25 12:21:19 +05:30
Andrew Bastin
9454d8c100 feat: move testing code to js-sandbox 2021-09-25 01:09:48 +05:30
Andrew Bastin
166f9e817b feat: project level testing + add fp-ts and sandbox as deps 2021-09-25 01:07:24 +05:30
Andrew Bastin
d2865c637c refactor: bring js-sandbox project to the monorepo 2021-09-25 01:01:22 +05:30
liyasthomas
9698932bde refactor(ui): minor ui improvements 2021-09-20 21:33:36 +05:30
liyasthomas
44026fcd41 fix: show scrollbars inside menu 2021-09-20 14:56:25 +05:30
liyasthomas
d938af0c2c fix: better responsiveness on horizontal layout 2021-09-20 14:18:40 +05:30
liyasthomas
fd658400a6 refactor: updated logo 2021-09-20 11:15:09 +05:30
liyasthomas
dcbb17b164 feat: vertical and horizontal layout support 2021-09-20 10:17:31 +05:30
liyasthomas
49741875bd chore: minor ui improvements 2021-09-19 20:27:20 +05:30
liyasthomas
0fcd9733ff chore: bump deps 2021-09-19 20:26:25 +05:30
Andrew Bastin
62d50169d7 Merge pull request #1832 from AndrewBastin/refactor/teams-list
fix: teams list not properly showing (HOPP-61)
2021-09-19 00:48:30 +05:30
Andrew Bastin
1d3d5a1e6a Merge branch 'main' into refactor/teams-list 2021-09-19 00:47:58 +05:30
Liyas Thomas
d309fa745e Update packages/hoppscotch-app/components/teams/index.vue 2021-09-19 00:33:21 +05:30
liyasthomas
f7031992d5 fix: enforce name for SmartTab component 2021-09-19 00:09:35 +05:30
Andrew Bastin
fcdf68ea15 fix: teams list not properly showing 2021-09-18 23:56:19 +05:30
liyasthomas
b0a6692179 feat: vertical tabs for right sidebars 2021-09-18 23:50:42 +05:30
liyasthomas
e1e763575d perf: template literals 2021-09-18 16:09:58 +05:30
Andrew Bastin
4236d1179c fix: save request crashing on teams 2021-09-18 15:11:54 +05:30
Andrew Bastin
09365bcabe fix: environments not being written correctly 2021-09-18 14:39:43 +05:30
Andrew Bastin
be29ddcbd6 fix: volar shim gitignore issue 2021-09-17 18:49:38 +05:30
liyasthomas
522194ca8d chore: remove absolute files 2021-09-17 17:30:55 +05:30
liyasthomas
5af8f584f6 chore(deps): bump 2021-09-17 15:25:52 +05:30
liyasthomas
adc08f8865 perf(ci): remove absolute branch hooks 2021-09-17 15:20:30 +05:30
liyasthomas
0f39d54c3c fix: netlify builds 2021-09-17 14:17:48 +05:30
liyasthomas
9e6659e842 fix: netlify builds 2021-09-17 14:11:30 +05:30
liyasthomas
46a0f6e3f8 refactor: update build docs 2021-09-17 13:57:56 +05:30
Andrew Bastin
e90b26ebed fix: standardized build scripts 2021-09-17 13:46:23 +05:30
Andrew Bastin
4407f260ae fix: updated to better dockerfile 2021-09-17 13:12:49 +05:30
Andrew Bastin
d4392416c8 fix: fix broken tests 2021-09-16 22:59:29 +05:30
liyasthomas
2d3cbd26b8 fix: ci builds 2021-09-16 22:44:34 +05:30
Andrew Bastin
98b9660956 refactor: merge branch 'main' into refactor/monorepo 2021-09-16 22:24:21 +05:30
liyasthomas
4e8a4e8914 refactor: typescript support 2021-09-15 17:30:04 +05:30
liyasthomas
96bcbc80f8 fix(ci): bump deps + fix tests 2021-09-14 23:43:20 +05:30
liyasthomas
1dfc8e2973 perf: remove absolute files 2021-09-14 23:32:43 +05:30
liyasthomas
311886f6c9 Merge remote-tracking branch 'origin/feat/codemirror' 2021-09-14 23:30:04 +05:30
liyasthomas
4a332f40e5 fix: json outline line index 2021-09-14 23:28:39 +05:30
liyasthomas
93a97a2f4c refactor: json outline ui 2021-09-14 23:11:10 +05:30
Andrew Bastin
1dee098ca2 feat: fix outline 2021-09-14 21:33:13 +05:30
liyasthomas
a07cc7e560 refactor: minor ui improvements 2021-09-14 13:19:10 +05:30
Andrew Bastin
c26f7f5ebc fix: autocompletion eating non-identifier tokens 2021-09-13 09:18:37 +05:30
liyasthomas
5d801cf566 fix: missing '?' in query parameter string for code generators 2021-09-13 09:07:06 +05:30
Andrew Bastin
631b2d869e fix: autocompletion position messing up 2021-09-12 21:56:56 +05:30
liyasthomas
c02f54cc18 chore(deps): bump 2021-09-12 19:45:23 +05:30
liyasthomas
827a95515d feat: select suggestion on enter key for autocomplete 2021-09-12 10:51:46 +05:30
liyasthomas
9082152f1a fix: editor width 2021-09-12 02:08:37 +05:30
Liyas Thomas
0efbddeda4 Merge pull request #1822 from hoppscotch/fix/gql-save-req 2021-09-12 00:07:22 +05:30
liyasthomas
b2e186957c fix: repetitive use of () in setup script 2021-09-12 00:02:07 +05:30
Andrew Bastin
d855e5cffb fix: gql request save issue 2021-09-11 23:43:35 +05:30
Andrew Bastin
f3747edaa3 Merge pull request #1820 from hoppscotch/fix/gql-headers
fix: gql headers not passed properly (HOPP-55)
2021-09-11 21:15:17 +05:30
Andrew Bastin
752932ef3d fix: gql headers not passed properly 2021-09-11 21:01:48 +05:30
liyasthomas
948cf9dae3 perf: cleanup 2021-09-11 10:34:06 +05:30
liyasthomas
b2f93aa549 feat: highlight active line in codemirror when focused 2021-09-11 09:19:16 +05:30
liyasthomas
108f228edf refactor: minor ui improvements 2021-09-11 08:26:54 +05:30
liyasthomas
fe6030140f feat: graphql mode for schema editor 2021-09-10 19:57:52 +05:30
Andrew Bastin
003400cfa8 feat: introduce graphql mode for codemirror 2021-09-10 19:01:35 +05:30
liyasthomas
41a02f059d perf: remove ace editor 2021-09-10 18:52:58 +05:30
liyasthomas
b4ed6fd107 feat: codemirror for import curl and codegens 2021-09-10 18:27:31 +05:30
Andrew Bastin
36246da9e1 feat: fix up jest tests 2021-09-10 17:50:22 +05:30
liyasthomas
457b6b982c feat: codemirror for graphql query, scheme and response 2021-09-10 16:12:04 +05:30
liyasthomas
05a07dc4a1 perf: ci 2021-09-10 13:05:31 +05:30
Andrew Bastin
85889c2cb9 fix: fix tests.yml 2021-09-10 12:55:59 +05:30
liyasthomas
be6ceaab04 perf: ci 2021-09-10 12:46:50 +05:30
liyasthomas
f1b18688bb fix: ci 2021-09-10 12:15:08 +05:30
liyasthomas
80c7decb81 feat: husky + commitlint 2021-09-10 12:02:18 +05:30
liyasthomas
3ef5a1e21a feat: codemirror editor for pre-request and test scripts 2021-09-10 11:12:08 +05:30
liyasthomas
2eb0a4c754 feat: reactive syntax + line wrap on raw body 2021-09-10 10:46:58 +05:30
liyasthomas
10f5af5dda feat: codemirror editot for raw body 2021-09-10 01:35:46 +05:30
liyasthomas
8b27ebb96b feat: mixed html syntax, light theme for codemiror 2021-09-10 00:44:14 +05:30
Andrew Bastin
b28f82a881 refactor: monorepo+pnpm (removed husky) 2021-09-10 00:28:28 +05:30
liyasthomas
c921606f3f Merge remote-tracking branch 'origin/exp/volar-types' into feat/codemirror 2021-09-09 20:50:58 +05:30
liyasthomas
c6c08f6c60 feat: reactive line wrap on codemirror
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-09-09 20:50:04 +05:30
liyasthomas
02cf620090 feat: port ace editor to codemirror
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-09-09 17:47:27 +05:30
liyasthomas
917550ff4d feat: tooltips on primary navigation in zenmode 2021-09-09 13:10:48 +05:30
Andrew Bastin
4a12cc76fa feat: improve shim generation for index components 2021-09-09 01:56:43 +05:30
Andrew Bastin
f4f74e223f refactor: a volar types shim generator 2021-09-09 01:03:46 +05:30
liyasthomas
8b4535c131 Merge branch 'feat/codemirror' of https://github.com/hoppscotch/hoppscotch into feat/codemirror 2021-09-08 21:54:00 +05:30
liyasthomas
b15fd6c75a feat: port bulk editor textareas to codemirror 2021-09-08 21:52:26 +05:30
liyasthomas
e1a25fa894 fix: broken conditional rendering of codemirror
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-09-08 21:41:02 +05:30
Andrew Bastin
2bb3b71a70 refactor: map ctrl-space to autocomplete by default in codemirror 2021-09-08 21:41:02 +05:30
Andrew Bastin
4c55b9c304 fix: codemirror theme not changing when color mode is updated 2021-09-08 21:41:02 +05:30
Andrew Bastin
639a629809 feat: gql query autocompletion on codemirror 2021-09-08 21:41:02 +05:30
Andrew Bastin
d6e3bd09b4 refactor: pass current token position to auto completers on codemirror 2021-09-08 21:41:02 +05:30
Andrew Bastin
8d67a0d95f feat: test script auto completion for codemirror 2021-09-08 21:41:02 +05:30
Andrew Bastin
b9fc0175e7 feat: implement base autocomplete implementation for codemirror along with preRequest autocompletion 2021-09-08 21:41:02 +05:30
liyasthomas
dc5f52cc0d refactor: github flavored codemirror light theme 2021-09-08 21:40:55 +05:30
liyasthomas
602aabdeb8 feat: reactive codemirror theme 2021-09-08 21:40:11 +05:30
Andrew Bastin
2f8aa79ec1 feat: json linter support for codemirror 2021-09-08 21:40:11 +05:30
Andrew Bastin
8af90432cf feat: implement gql query linting in codemirror 2021-09-08 21:40:11 +05:30
Andrew Bastin
61da0733c2 feat: codemirror editor options are reactive 2021-09-08 21:40:11 +05:30
liyasthomas
33951482d5 feat: placeholder, auto-close brackets, search, line wrap 2021-09-08 21:40:11 +05:30
Andrew Bastin
4e8484ee7c feat: linter for prerequest and testscripts 2021-09-08 21:40:11 +05:30
Andrew Bastin
071761a61e feat: codemirror linting system 2021-09-08 21:40:11 +05:30
Andrew Bastin
10a11d6725 refactor: add types for esprima 2021-09-08 21:40:11 +05:30
Andrew Bastin
c81178ae26 refactor: extract common codemirror logic out to composable 2021-09-08 21:40:10 +05:30
liyasthomas
2bafae5397 feat: line wrap, auto close brackets, placeholder on codemirror 2021-09-08 21:40:10 +05:30
liyasthomas
6a1d201e0e refactor: ts codemirror 2021-09-08 21:40:10 +05:30
liyasthomas
8de544696d feat: init codemirror 2021-09-08 21:40:06 +05:30
liyasthomas
66c489da8f fix: broken conditional rendering of codemirror
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-09-08 20:27:36 +05:30
Andrew Bastin
26c8f35688 refactor: map ctrl-space to autocomplete by default in codemirror 2021-09-08 19:51:43 +05:30
liyasthomas
c3e881ed77 fix: tooltip position on containers with overflow 2021-09-08 15:22:38 +05:30
liyasthomas
2cf55cbb96 refactor: hide right sidebars by default on mobile devices 2021-09-08 13:56:02 +05:30
liyasthomas
73f22abf56 feat: mobile responsive right sidbars + composable window size 2021-09-08 12:27:46 +05:30
liyasthomas
dbae90a193 refactor: replace lunr with fuse 2021-09-08 09:21:22 +05:30
Andrew Bastin
28aeac4533 fix: codemirror theme not changing when color mode is updated 2021-09-08 06:00:23 +05:30
Andrew Bastin
162b3d6192 feat: gql query autocompletion on codemirror 2021-09-08 05:38:03 +05:30
Andrew Bastin
b016d3fd9d refactor: pass current token position to auto completers on codemirror 2021-09-08 05:36:46 +05:30
Andrew Bastin
f64ff58dbc feat: test script auto completion for codemirror 2021-09-08 04:58:30 +05:30
Andrew Bastin
d4d3d96bbb feat: implement base autocomplete implementation for codemirror along with preRequest autocompletion 2021-09-07 22:15:47 +05:30
liyasthomas
a5197ee544 refactor: github flavored codemirror light theme 2021-09-07 16:26:26 +05:30
liyasthomas
8a5fd4f745 feat: reactive codemirror theme 2021-09-07 12:14:13 +05:30
Andrew Bastin
12cd7940c6 feat: json linter support for codemirror 2021-09-06 23:47:26 +05:30
Andrew Bastin
0c2cec46a7 feat: implement gql query linting in codemirror 2021-09-06 23:30:43 +05:30
liyasthomas
84457ddc86 chore(deps+i18n): updated deps and translations 2021-09-06 20:32:45 +05:30
Liyas Thomas
d6d20e5d49 Merge pull request #1815 from bokub/patch-1
chore(i18n): fixed french translations
2021-09-06 20:26:20 +05:30
Boris K
9acdca1059 chore: french i18n translations 2021-09-06 16:48:10 +02:00
liyasthomas
66c4fd4d2f chore(i18n): updated translations 2021-09-05 20:51:54 +05:30
liyasthomas
f2defb3a31 chore(deps): bump 2021-09-05 20:51:25 +05:30
Andrew Bastin
aa66c10608 fix: improved volar integration 2021-09-03 23:06:23 +05:30
liyasthomas
28d20a9c61 refactor: updated svg icon assets 2021-09-03 11:27:11 +05:30
liyasthomas
94fcc0a6a9 perf: workflows 2021-09-02 20:33:34 +05:30
Andrew Bastin
91abdd5415 Merge pull request #1802 from AndrewBastin/bugfix/1798
fix: auth header doubling in codegen
2021-09-02 20:19:15 +05:30
Andrew Bastin
58e940d193 fix: auth header doubling in codegen 2021-09-02 20:04:56 +05:30
liyasthomas
6991dd48f3 feat: publish docker image 2021-09-02 17:44:36 +05:30
liyasthomas
270a077539 chore: updated social banner image 2021-09-02 09:04:02 +05:30
liyasthomas
ff326acfc8 chore: updated screenshots 2021-09-02 01:46:08 +05:30
liyasthomas
af1446233c chore: i18n translations 2021-09-02 00:28:38 +05:30
liyasthomas
67d66e2b2f Merge remote-tracking branch 'origin/i18n-de' 2021-09-01 23:19:56 +05:30
Liyas Thomas
753ce5bd6e Merge pull request #1800 from JorgeFerrer/patch-1
Improvements for the translation to Spanish #1799
2021-09-01 23:18:37 +05:30
Jorge Ferrer
e7d71ef301 Improvements for the translation to Spanish #1799
I have fixed REST as well as some wrong automatic translations and also applied consistency in terms used across all translations
2021-09-01 19:35:15 +02:00
Andrew Bastin
8430921e4e feat: codemirror editor options are reactive 2021-09-01 20:32:33 +05:30
liyasthomas
c938abf606 feat: placeholder, auto-close brackets, search, line wrap 2021-09-01 17:33:54 +05:30
Andrew Bastin
3addfe8d4b feat: linter for prerequest and testscripts 2021-09-01 16:45:49 +05:30
Andrew Bastin
5276556837 feat: codemirror linting system 2021-09-01 16:41:14 +05:30
Andrew Bastin
e47ad94666 refactor: add types for esprima 2021-09-01 16:34:02 +05:30
liyasthomas
7065763c7c Merge branch 'main' into feat/codemirror 2021-09-01 10:34:52 +05:30
Andrew Bastin
86489d95c2 refactor: extract common codemirror logic out to composable 2021-08-31 22:20:42 +05:30
liyasthomas
f357c4f171 fix: response section's font weight 2021-08-31 22:16:49 +05:30
Liyas Thomas
36e34fe667 Merge pull request #1796 from hoppscotch/feat/bulk-edit
feat: bulk edit
2021-08-31 22:03:39 +05:30
liyasthomas
dcc59f42fa fix: remove // from key on disabled bulk edit entries 2021-08-31 21:54:24 +05:30
Liyas Thomas
f6fbff2b42 Merge pull request #1797 from jenskeiner/jenskeiner-fix-mistranslations-and-typos
Fix some mistranslations an typos.
2021-08-31 18:23:14 +05:30
Jens Keiner
67ce20ef62 Fix some mistranslations an typos.
Fixed up some apparent mistranslated items and typos.
2021-08-31 14:37:19 +02:00
liyasthomas
788e0dc851 chore: lint 2021-08-31 17:38:54 +05:30
liyasthomas
e2b1c83698 feat: line wrap, auto close brackets, placeholder on codemirror 2021-08-31 16:10:35 +05:30
liyasthomas
15373be63e refactor: ts codemirror 2021-08-31 10:47:00 +05:30
liyasthomas
8c9cd079b7 feat: init codemirror 2021-08-31 00:03:07 +05:30
liyasthomas
6f67a97ade feat: textare autoresize 2021-08-30 22:03:59 +05:30
liyasthomas
ada568cb75 feat: bulk edit for graphql headers 2021-08-30 18:49:35 +05:30
liyasthomas
b9fa254ab5 feat: disable bulk edit entries with // 2021-08-30 18:35:33 +05:30
liyasthomas
174ba90fb5 feat: bulk edit transformation 2021-08-30 14:34:43 +05:30
liyasthomas
de8c7c1ca3 Merge branch 'main' into feat/bulk-edit 2021-08-30 13:23:24 +05:30
liyasthomas
407a125533 feat: search
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-30 11:27:36 +05:30
liyasthomas
d8881ba6a3 feat: init bulk edit 2021-08-29 23:26:27 +05:30
liyasthomas
755540fb81 Merge branch 'main' into feat/search 2021-08-29 20:59:47 +05:30
liyasthomas
add358c752 chore(deps): bump 2021-08-29 20:53:59 +05:30
liyasthomas
91352ade20 feat: typescript support in auth components
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-29 19:31:23 +05:30
Liyas Thomas
39fbf4ef33 Merge pull request #1790 from AndrewBastin/refactor/firebase-v9
refactor: bump firebase to v9
2021-08-29 18:28:33 +05:30
liyasthomas
d9547c6654 fix: mobile responsiveness 2021-08-29 17:11:37 +05:30
liyasthomas
04f9428267 feat: disable autocomplete on inputs + keyboard navigation focus 2021-08-29 16:44:18 +05:30
liyasthomas
ebd8f43219 refactor: minor ui improvements 2021-08-29 13:25:01 +05:30
liyasthomas
f75b2e26a3 chore: cleanup, typescript 2021-08-29 12:00:19 +05:30
Andrew Bastin
2e654c143f refactor: bump firebase to v9 2021-08-29 10:51:31 +05:30
liyasthomas
5bcee265a6 fix: show empty state for search results, es6 2021-08-29 10:02:19 +05:30
liyasthomas
647599e5aa refactor: full-width modal for search, transparent tabs 2021-08-29 09:44:46 +05:30
liyasthomas
16b9a2b06e feat: search 2021-08-28 23:23:16 +05:30
liyasthomas
7da427c669 feat: share and support modals 2021-08-28 20:48:13 +05:30
liyasthomas
405e6c1e4e chore: minor fixes and improvements 2021-08-28 10:57:21 +05:30
liyasthomas
efbc21826b Merge branch 'refactor/ui' 2021-08-28 05:56:58 +05:30
liyasthomas
7a1f1c9df7 feat: updated screenshots 2021-08-28 05:56:07 +05:30
liyasthomas
476bfbaef0 feat: svg icons 2021-08-28 05:47:33 +05:30
Andrew Bastin
8231157cdb feat: bump version to 2.0.0 2021-08-28 02:21:37 +05:30
liyasthomas
e397e3fb6f feat: add newsletter link 2021-08-27 22:13:15 +05:30
liyasthomas
8f1cafc80d chore: i18n 2021-08-27 15:22:21 +05:30
liyasthomas
71619cf84b feat: test report pie chart 2021-08-27 14:32:07 +05:30
liyasthomas
a3551c6719 fix: broken test results 2021-08-27 12:38:03 +05:30
Andrew Bastin
e9043e6762 refactor: update test components to use setup scripts 2021-08-27 11:45:08 +05:30
liyasthomas
6b7d30a701 fix: restore v1 test API 2021-08-27 09:42:53 +05:30
liyasthomas
76eab2632e fix: failed tests 2021-08-27 09:38:29 +05:30
liyasthomas
bba4d7fcd9 chore: cleanup 2021-08-27 09:37:29 +05:30
Andrew Bastin
46eb7d6786 fix: test scripts response respects the old api and the new structure 2021-08-26 13:08:06 +05:30
Andrew Bastin
f5c84b57b2 fix: improved codegen compat 2021-08-26 13:08:06 +05:30
liyasthomas
0b12901344 feat: sample pre-request and test snippets 2021-08-26 12:18:28 +05:30
liyasthomas
5e3c303aaf fix: tippy on request + lint 2021-08-26 11:04:52 +05:30
liyasthomas
f02b1639c3 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-26 11:03:30 +05:30
Andrew Bastin
94e0c3ef64 refactor: update codegen code 2021-08-26 11:02:05 +05:30
liyasthomas
17366f5e6e fix: sync modal 2021-08-26 10:44:01 +05:30
liyasthomas
f7a6f899d4 Merge branch 'refactor/oauth' of https://github.com/hoppscotch/hoppscotch into refactor/oauth 2021-08-26 10:03:05 +05:30
liyasthomas
62205919a3 feat: env variable support in authorization
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-26 10:00:21 +05:30
liyasthomas
ee44a48994 feat: ui for oauth 2021-08-26 09:21:37 +05:30
liyasthomas
fedc230c9f feat: add OAuth 2.0 support 2021-08-26 09:21:37 +05:30
Andrew Bastin
8796cec493 fix: tippy not disappearing on request component modals 2021-08-26 09:19:18 +05:30
Andrew Bastin
b3b76adec4 feat: antfu's setup script transform + request component in setup sugar 2021-08-26 08:56:22 +05:30
liyasthomas
4362760461 feat: ui for oauth 2021-08-25 22:20:35 +05:30
liyasthomas
bc9236c9a7 feat: add OAuth 2.0 support 2021-08-25 21:30:13 +05:30
liyasthomas
9e16cff62a chore: minor fixes and improvements 2021-08-25 21:26:53 +05:30
Andrew Bastin
b04d8dde2b feat: request local persistence 2021-08-25 18:29:04 +05:30
liyasthomas
2a23c95f34 fix: empty github auth provider info 2021-08-25 16:15:31 +05:30
Andrew Bastin
cb9aa33ad0 fix: req.id undefined issues 2021-08-25 09:43:16 +05:30
Andrew Bastin
31258b1108 refactor: improved teams migrations 2021-08-25 08:41:09 +05:30
Andrew Bastin
6e9f16d8f1 refactor: collections versioning, migration and types 2021-08-24 23:12:53 +05:30
Andrew Bastin
d1b2539d67 refactor: gql request object and history typing updates 2021-08-24 21:58:04 +05:30
liyasthomas
c5f8ab3394 chore: minor fixes and improvements 2021-08-24 13:45:11 +05:30
liyasthomas
12c28f4efc fix: broken component import in prod 2021-08-24 09:14:46 +05:30
Andrew Bastin
f20fed444a fix: history entries becoming undefined over reloads 2021-08-23 12:57:36 +05:30
Andrew Bastin
97b92ba35b feat: history migration from legacy request object 2021-08-23 11:49:43 +05:30
liyasthomas
91df36ccca fix: ctrl+c shortcut, minor ui issues 2021-08-23 10:22:07 +05:30
liyasthomas
294b1a5a7c fix: cors when content-type is set for simple requests 2021-08-22 22:44:07 +05:30
liyasthomas
5f27b59dc0 fix: typo 2021-08-22 17:02:18 +05:30
Andrew Bastin
af0efc1e7f fix: migration of request url from old to new format 2021-08-22 16:31:09 +05:30
Andrew Bastin
db25346505 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-22 13:06:58 +05:30
Andrew Bastin
1a4fc1f539 feat: remove authName from HoppRESTAuth type definitions 2021-08-22 13:06:19 +05:30
liyasthomas
1bea0a42d7 refactor(ui): better button, tab caomponents 2021-08-22 12:58:43 +05:30
liyasthomas
22e73a4d83 Merge branch 'main' into refactor/ui 2021-08-22 00:55:02 +05:30
liyasthomas
3ab3c09982 chore(deps): bump 2021-08-22 00:43:58 +05:30
liyasthomas
0fb0ae1826 refactor(ui): better tabs 2021-08-22 00:39:05 +05:30
Andrew Bastin
08fe4ae71f feat: shift based keyboard shortcuts and save as action 2021-08-21 21:59:55 +05:30
Andrew Bastin
883c787c0b fix: global variables not applying on codegen 2021-08-21 20:08:32 +05:30
Andrew Bastin
732dc07ec5 fix: history sync issues and crashes 2021-08-21 12:37:26 +05:30
Andrew Bastin
c00c8f249e fix: environments being cringe :) 2021-08-21 10:38:35 +05:30
Andrew Bastin
77d876d443 fix: error on empty environment sync 2021-08-21 08:08:39 +05:30
liyasthomas
822e7b4630 refactor: improve lighthouse score 2021-08-20 21:35:54 +05:30
liyasthomas
275a7fc113 fix: save context indicatior + added unplug save on double click 2021-08-20 20:21:22 +05:30
Andrew Bastin
b08b06c4d4 fix: save request context set on teams 2021-08-20 18:27:52 +05:30
liyasthomas
7082eb27db refactor(ui): minor ui improvements 2021-08-20 15:08:54 +05:30
liyasthomas
a121445b1e feat: active request indication in collections 2021-08-19 23:15:10 +05:30
liyasthomas
95547108bf docs: updated wiki links 2021-08-19 22:38:50 +05:30
Andrew Bastin
fc4e945a7e refactor: reactive stream of save context 2021-08-19 19:38:32 +05:30
Andrew Bastin
1fdb6488fd feat: save request context 2021-08-19 12:06:56 +05:30
liyasthomas
51142e5c77 feat: added docs links 2021-08-19 11:46:22 +05:30
liyasthomas
57ce7ccfdf chore: i18n 2021-08-19 01:38:30 +05:30
liyasthomas
c1ce90dad0 feat: finish new i18n translation format 2021-08-19 00:10:57 +05:30
liyasthomas
ceb8bdf0fd refactor: more i18n translation strings 2021-08-18 22:17:31 +05:30
liyasthomas
b9c233cdf9 refactor(ui): better remove, delete icons, and select components 2021-08-18 13:30:01 +05:30
liyasthomas
4f5de51104 refactor: change default env name from 'global' to 'Global' 2021-08-18 10:44:58 +05:30
liyasthomas
c949783698 feat: show global envs on hover 2021-08-18 10:34:20 +05:30
Andrew Bastin
6af42e5e08 fix: issues with global environment writes 2021-08-18 09:52:13 +05:30
liyasthomas
f312ed32be refactor(ui): global environment 2021-08-18 02:29:05 +05:30
Andrew Bastin
91fee8d2d0 refactor: remove legacy global env preRequest reference 2021-08-17 14:51:10 +05:30
Andrew Bastin
c23a4bf75d feat: aggregated environment variable stream 2021-08-17 14:51:10 +05:30
Andrew Bastin
e38af0bebe feat: firestore sync for global environment 2021-08-17 14:51:10 +05:30
Andrew Bastin
b968756be2 feat: global env variable migration and local persistence 2021-08-17 14:51:10 +05:30
Andrew Bastin
ed5b4b6dc5 refactor: custom space for global variables 2021-08-17 14:51:10 +05:30
liyasthomas
956ca44ef0 refactor: remove absolute classes 2021-08-17 12:56:36 +05:30
Andrew Bastin
3534e133af fix: eslint being dumb 2021-08-17 10:25:27 +05:30
Andrew Bastin
7744e2eb03 feat: add success test descriptions 2021-08-17 10:05:19 +05:30
Andrew Bastin
078c5e8d8a refactor: update postwomanTesting to typescript 2021-08-17 09:06:04 +05:30
liyasthomas
6c3607d7e7 refactor: i18n 2021-08-16 23:15:06 +05:30
liyasthomas
c04435108b refactor: i18n SEO 2021-08-16 22:02:18 +05:30
liyasthomas
e5c8d05850 feat: added remaining i18n translations 2021-08-16 17:06:43 +05:30
liyasthomas
bf0278aa00 feat: init i18n with gitlocalize 2021-08-16 14:18:45 +05:30
Liyas Thomas
33d05eaa77 Merge pull request #1779 from hoppscotch/gitlocalize-16541 2021-08-16 14:11:19 +05:30
mt-gitlocalize
5b074409fc Translate zh.json via GitLocalize 2021-08-16 08:41:02 +00:00
Liyas Thomas
bdc3cf2150 Merge pull request #1778 from hoppscotch/gitlocalize-16540 2021-08-16 14:03:57 +05:30
mt-gitlocalize
c3b7d45502 Translate pt.json via GitLocalize 2021-08-16 08:33:36 +00:00
Liyas Thomas
2ef4bc1b36 Merge pull request #1777 from hoppscotch/gitlocalize-16539 2021-08-16 14:02:58 +05:30
mt-gitlocalize
2f87549dac Translate ru.json via GitLocalize 2021-08-16 08:32:35 +00:00
Liyas Thomas
c596012bb5 Merge pull request #1776 from hoppscotch/gitlocalize-16538 2021-08-16 13:57:43 +05:30
mt-gitlocalize
04c6faf5da Translate de.json via GitLocalize 2021-08-16 08:27:25 +00:00
Liyas Thomas
b2f50547a9 Merge pull request #1775 from hoppscotch/gitlocalize-16537 2021-08-16 13:48:39 +05:30
mt-gitlocalize
e221741a6a Translate fr.json via GitLocalize 2021-08-16 08:17:15 +00:00
Liyas Thomas
fe43ae9e81 Merge pull request #1774 from hoppscotch/gitlocalize-16536 2021-08-16 13:37:02 +05:30
mt-gitlocalize
c5d4b9f0ae Translate es.json via GitLocalize 2021-08-16 08:05:48 +00:00
liyasthomas
b9156cdf7f refactor: init english glossary for i18n 2021-08-16 13:11:50 +05:30
liyasthomas
c6a3b784b5 fix: proper state indicatior in teams collections 2021-08-16 08:18:48 +05:30
Andrew Bastin
33e2afab7b feat: send formdata over network 2021-08-16 07:12:33 +05:30
Andrew Bastin
5eb6fb38e0 fix: crash on switch from formdata to non-formdata 2021-08-16 01:00:44 +05:30
liyasthomas
c2ae333a12 refactor(ui): better CTAs, expanded app bar 2021-08-16 00:38:57 +05:30
liyasthomas
d462242927 chore(deps): bump 2021-08-15 19:16:31 +05:30
liyasthomas
c1d2f12e48 Merge branch 'main' into refactor/ui 2021-08-15 19:11:00 +05:30
liyasthomas
74d472e76e chore(deps): bump 2021-08-15 19:06:20 +05:30
liyasthomas
bfc0282e49 refactor: minor ui improvements 2021-08-15 15:18:04 +05:30
liyasthomas
8c70f83297 fix: broken contenteditable support in macOS 2021-08-15 13:11:12 +05:30
liyasthomas
1e6e826426 fix: broken expand / collapse graphql history card 2021-08-15 12:16:33 +05:30
liyasthomas
872ba2d48e fix: catch network failed error and show prompt in response section 2021-08-15 11:57:20 +05:30
Andrew Bastin
7acde1c174 feat: rest request sync with firestore 2021-08-15 10:45:26 +05:30
liyasthomas
bb6d9a88ec refactor: minoe fixes and improvements 2021-08-14 23:46:03 +05:30
liyasthomas
29305a8e1e Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-14 21:41:38 +05:30
liyasthomas
9f639378ec feat: reactive font size for ace editor + i18n support for font size settings strings 2021-08-14 21:40:56 +05:30
Andrew Bastin
92a42269e7 refactor: remove vuex dependency 2021-08-14 21:27:22 +05:30
liyasthomas
691629890f fix: form data request as body
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-14 19:11:05 +05:30
liyasthomas
2051b8788a refactor: minor ui improvements 2021-08-14 16:14:08 +05:30
liyasthomas
a129d7eb13 refactor: init newstore for request body
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-14 14:31:16 +05:30
liyasthomas
e9eee0703d refactor: set placement as top by edfault for modals, better response header layout 2021-08-13 22:39:47 +05:30
liyasthomas
11816111ea refactor(ui): better font weight, icon hover states, etc 2021-08-13 16:44:02 +05:30
Andrew Bastin
08e3cffff8 refactor: decouple REST params and URL params 2021-08-13 12:12:05 +05:30
Andrew Bastin
ab63735a89 fix: bump deps 2021-08-13 12:00:22 +05:30
Andrew Bastin
560c6e0d6a refactor: add prettier-ignore to Key type def 2021-08-13 10:23:40 +05:30
Andrew Bastin
f688099f2c fix: improper theme application on initial load 2021-08-13 08:11:06 +05:30
liyasthomas
877f1e343a Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-12 18:42:11 +05:30
liyasthomas
32660c5251 refactor: move test results to request response section 2021-08-12 18:41:55 +05:30
Andrew Bastin
a1dc224007 feat: graphql request history and collection restore 2021-08-12 16:15:17 +05:30
liyasthomas
55bcb34fd5 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-12 13:56:51 +05:30
liyasthomas
b18f7af28f feat: enable / disable authorization 2021-08-12 13:56:11 +05:30
Andrew Bastin
c273ded97d refactor: remove vue-rx dependency 2021-08-12 13:44:10 +05:30
liyasthomas
971b35a252 refactor: auth
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-08-12 09:56:05 +05:30
Andrew Bastin
dad18aabcb feat: expose actively bound actions via activeActions$ 2021-08-11 22:07:47 +05:30
liyasthomas
0738ad1c15 refactor: better toast messages + minor ui improvements 2021-08-11 16:57:40 +05:30
liyasthomas
829e116e04 feat: more actions & shortcuts 2021-08-11 14:16:43 +05:30
liyasthomas
384e4ce43e chore: lint 2021-08-11 10:27:36 +05:30
Andrew Bastin
da3f55c910 feat: graphql rewrite to new state system 2021-08-11 08:23:49 +05:30
liyasthomas
87833f1e9f fix: broken team's add / edit member action 2021-08-10 20:45:57 +05:30
liyasthomas
ba5d1666d6 feat: placement option (center, top) in modals 2021-08-10 20:45:45 +05:30
liyasthomas
b612feea41 feat: search 2021-08-10 13:46:42 +05:30
Andrew Bastin
da74fb5241 refactor: remove nuxt eslint module 2021-08-10 05:27:34 +05:30
liyasthomas
aa8b4231e2 feat: share and support modals 2021-08-09 17:55:30 +05:30
Andrew Bastin
6b4bd44807 Merge pull request #1769 from s-r-x/fix/settings-persistence
fix: broken settings persistence on the home page
2021-08-09 13:34:20 +05:30
Andrew Bastin
058c1090e3 fix: remove settings entries from postwoman.js 2021-08-09 12:56:20 +05:30
s-r-x
6aa6fb5c0a fix: broken settings persistence 2021-08-09 09:07:17 +05:00
liyasthomas
cbf99d2daf feat: auto focus directive, auto focus primary action by default 2021-08-08 22:44:05 +05:30
liyasthomas
a71f70644f chore(deps): bump 2021-08-08 20:47:50 +05:30
liyasthomas
b41d08007a Merge branch 'main' into refactor/ui 2021-08-08 19:52:39 +05:30
liyasthomas
0e1900b36a chore(deps): bump 2021-08-08 19:49:06 +05:30
Andrew Bastin
e6c503253b fix: firebase imports to allow tree shaking 2021-08-08 13:25:54 +05:30
Andrew Bastin
846c1426cf fix: proper implementation of isCustomMethod 2021-08-08 13:16:14 +05:30
Andrew Bastin
c97f8aa148 fix: cancel request 2021-08-08 13:08:10 +05:30
liyasthomas
b99c4fe5c1 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-08 12:42:44 +05:30
liyasthomas
42d2dd284f refactor(ui): title and actions slot on modals 2021-08-08 12:42:29 +05:30
Andrew Bastin
b7e3f2a4ee feat: reimplement request time loading bar 2021-08-08 12:41:52 +05:30
Andrew Bastin
6599c5f5bf feat: introduce useNuxt composable 2021-08-08 12:39:02 +05:30
Andrew Bastin
13f6e5ff43 fix: remove keydown log 2021-08-08 12:13:59 +05:30
liyasthomas
4d76c83328 refactor: improved input validations 2021-08-08 12:01:36 +05:30
liyasthomas
fee19f3d7a Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-08-07 19:19:49 +05:30
Andrew Bastin
200fc738e8 fix: remove unused focus listeners in keybindings 2021-08-07 19:18:55 +05:30
Andrew Bastin
05294ac556 fix: remove unused focus listeners in keybindings 2021-08-07 18:51:14 +05:30
Andrew Bastin
93dfed74f8 feat: singlecharacter shortcuts 2021-08-07 18:43:38 +05:30
liyasthomas
3d963a7719 feat: floating input label 2021-08-07 14:51:13 +05:30
liyasthomas
92abbc4ce6 Merge branch 'main' into refactor/ui 2021-08-07 11:28:39 +05:30
Liyas Thomas
d111893302 Merge pull request #1766 from hughobrien/fix-well-known
fix: bad var names from oauth well.known config
2021-08-07 11:23:49 +05:30
Hugh O'Brien
967ad773eb Update oauth.js 2021-08-07 06:29:49 +01:00
Liyas Thomas
b036863dda Merge pull request #1765 from hughobrien/fix-oauth-param-names 2021-08-07 10:31:59 +05:30
Hugh O'Brien
ead9c23d9e fix: oauth token exchange param naming convention
https://developer.okta.com/docs/guides/implement-auth-code-pkce/exchange-code-token/
2021-08-07 05:48:44 +01:00
liyasthomas
8c60a4c032 refactor(ui): sort classes 2021-08-07 09:07:26 +05:30
liyasthomas
d08f15430c Merge branch 'main' into refactor/ui 2021-08-06 23:39:03 +05:30
Liyas Thomas
f71d93a684 Merge pull request #1762 from hughobrien/oauth-pkce-paramname-fix
fix: pkce params match rfc naming convention
2021-08-06 23:23:10 +05:30
Hugh O'Brien
44d1ad7422 fix: pkce params match okta naming convension 2021-08-06 18:45:09 +01:00
liyasthomas
346ece94b7 refactor(ui): a11y improvements 2021-08-06 21:40:26 +05:30
liyasthomas
3a96eb003b refactor(ui): group windi classes 2021-08-05 22:52:02 +05:30
liyasthomas
3bd78869a0 fix: responsiveness 2021-08-05 21:29:05 +05:30
liyasthomas
4b416586b7 fix: build 2021-08-05 19:43:46 +05:30
liyasthomas
20ffbe906f fix: sse, refactor(ui): tabs, feat: help button 2021-08-05 11:06:37 +05:30
liyasthomas
b2baeb0a5d fix(ui): realtime pages 2021-08-04 22:07:12 +05:30
Andrew Bastin
b524af174a feat: disable keybindings when a modal is open 2021-08-04 10:48:41 -04:00
liyasthomas
a4caeac584 refactor(ui): better select popovers 2021-08-04 11:20:23 +05:30
liyasthomas
b03565a816 fix: broken sticky sections on font size 2021-08-04 01:00:06 +05:30
liyasthomas
d0c0a543cf feat: font size picker 2021-08-03 21:35:01 +05:30
liyasthomas
17192c898b refactor(ui): teams 2021-08-03 16:50:28 +05:30
liyasthomas
7d913b0ee7 fix: build - lock deps 2021-08-03 10:45:11 +05:30
liyasthomas
db4521db5a fix: build - retire storybook 2021-08-03 10:24:32 +05:30
Andrew Bastin
10b7da0558 feat: live request url under the new system 2021-08-02 17:57:13 -04:00
Andrew Bastin
05f19cbb60 fix: remove legacy code in index.vue 2021-08-02 17:57:13 -04:00
liyasthomas
6d9ac84859 fix: use build commands mentioned in Netlify UI 2021-08-03 00:29:42 +05:30
liyasthomas
d9834d0fd1 feat: more storybook stories 2021-08-03 00:23:04 +05:30
liyasthomas
d84e2a8e9b feat: storybook 2021-08-02 21:38:04 +05:30
liyasthomas
13dbeaba35 Merge branch 'refactor/ui' into feat/storybook 2021-08-02 21:00:09 +05:30
liyasthomas
b615fe7529 feat: init new i18n format 2021-08-02 20:57:18 +05:30
liyasthomas
8a268ee6de refactor(ui): improved empty state for env variables and response sections 2021-08-02 10:00:50 +05:30
liyasthomas
2ae2acc003 fix: prevent enter key on content editable 2021-08-02 09:08:37 +05:30
Andrew Bastin
13d89b323e fix: tippy not appearing on envinput when typing and then hover 2021-08-01 23:15:15 -04:00
Andrew Bastin
6acb9be48c feat: envinput revalidates with environment changes 2021-08-01 23:05:15 -04:00
liyasthomas
d9d61b5b1d feat: tooltip on hovering environment variables 2021-08-02 08:08:41 +05:30
liyasthomas
2ee65e69dc fix: color contrast 2021-08-01 23:03:54 +05:30
liyasthomas
fd3b5ecf08 feat: actions in empty state 2021-08-01 20:04:25 +05:30
liyasthomas
6d67b1e51f chore(deps): bump 2021-08-01 20:03:27 +05:30
liyasthomas
79cea34fac Merge branch 'main' into refactor/ui 2021-08-01 18:19:40 +05:30
liyasthomas
b0b758a9c6 chore(deps): bump 2021-08-01 18:18:30 +05:30
liyasthomas
462d17de17 feat: auto increment headers and parameters list on input 2021-08-01 15:01:31 +05:30
liyasthomas
9afe415c2d feat: indicated valid and invalid environment variables with its value on hover 2021-08-01 14:42:32 +05:30
liyasthomas
1e4bb65db2 feat: environment aware smart input in parameters and headers 2021-08-01 13:07:07 +05:30
Andrew Bastin
fcb194d08a feat: effective url environment templates work with headers, url and params 2021-07-31 22:21:14 -04:00
Andrew Bastin
7354951d5a refactor: move Request.vue to composition api fully 2021-07-31 21:21:09 -04:00
Andrew Bastin
369bca90fc feat: use navigator clipboard to copy text is possible 2021-07-31 20:43:17 -04:00
liyasthomas
5275d365cb feat: selectable response headers entry 2021-08-01 00:11:45 +05:30
liyasthomas
e2fc056488 feat: make smart url feild the default input 2021-07-31 23:58:34 +05:30
liyasthomas
98d2b2ee9c feat: supported copy to clipboard utlity 2021-07-31 22:50:08 +05:30
Andrew Bastin
9441c76a12 fix: fix copy request link 2021-07-31 11:42:01 -04:00
liyasthomas
1ef7b52425 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-07-31 21:04:16 +05:30
liyasthomas
d88725b998 fix: inconsistent icon size 2021-07-31 21:04:03 +05:30
Andrew Bastin
a48ca25fa2 fix: and redeclaration 2021-07-31 11:32:50 -04:00
Andrew Bastin
28d636fa0d fix: update Netlify build Node version to 14 2021-07-30 23:39:50 -04:00
liyasthomas
2904084853 refactor: tests and results section 2021-07-31 00:51:41 +05:30
liyasthomas
a1eac2f348 refactor: cleanup documentation page 2021-07-30 21:06:25 +05:30
liyasthomas
203b45f4d5 refactor: cleanup 2021-07-30 13:52:43 +05:30
liyasthomas
2891da3c74 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-07-30 13:15:10 +05:30
Andrew Bastin
09d552b17a fix: fix cancel request issues and stream setup issues 2021-07-29 22:44:43 -04:00
Andrew Bastin
b524fa7248 feat: revamped keybinding implementation 2021-07-29 22:13:06 -04:00
Andrew Bastin
e138a5f846 fix: typescript error on clipboard 2021-07-29 18:13:17 -04:00
liyasthomas
82a5f56522 Merge branch 'main' into refactor/ui 2021-07-29 09:46:06 +05:30
liyasthomas
4f71e801d5 refactor(ui): minor improvements on buttons and actions 2021-07-28 22:23:43 +05:30
Andrew Bastin
d5cb9f135f fix: null reference when parsing error responses (fixes #1749) 2021-07-28 00:47:52 -04:00
liyasthomas
1a4d3dc91a feat: refactor modal component 2021-07-28 01:08:11 +05:30
liyasthomas
78fccc8583 feat: migrate all copy to clipboard actions to v-clipboard 2021-07-27 18:17:41 +05:30
liyasthomas
37ad8e08fc fix: build 2021-07-26 21:53:59 +05:30
liyasthomas
e60e8545a1 refactor(ui): better color schemes and empty states 2021-07-26 21:39:39 +05:30
liyasthomas
5258db345e refactor(ui): remaining realtime pages 2021-07-26 12:40:02 +05:30
liyasthomas
c3921bebf2 fix: proper padding and margins 2021-07-26 09:08:06 +05:30
liyasthomas
08d1f01e8e Merge branch 'main' into refactor/ui 2021-07-26 07:54:53 +05:30
liyasthomas
8bf9a1e821 chore(deps): bump 2021-07-26 07:52:15 +05:30
liyasthomas
8debb65d89 refactor(ui): better rendering with Inter font 2021-07-26 01:33:32 +05:30
liyasthomas
397cab9032 Merge branch 'main' into refactor/ui 2021-07-25 21:35:29 +05:30
liyasthomas
449c87802f chore(deps): bump 2021-07-25 18:41:26 +05:30
liyasthomas
3862a926ab fix: minor color scheme inconsistencies 2021-07-25 16:23:29 +05:30
liyasthomas
56c2e1094d refactor: wire remaining request actions 2021-07-25 11:15:53 +05:30
Andrew Bastin
4508e309c2 fix: fix typescript issues 2021-07-24 17:45:48 -04:00
liyasthomas
f0aaca2639 feat: slideover menus, minor ui fixes 2021-07-24 22:16:48 +05:30
liyasthomas
4c2a9c1229 refactor: types 2021-07-24 16:28:32 +05:30
liyasthomas
4de55c39dd refactor: graphql page to new ui 2021-07-24 14:10:28 +05:30
liyasthomas
84b94f3091 fix: minor input stylings 2021-07-24 11:23:10 +05:30
Liyas Thomas
2e94969a41 fix: uniform inputs 2021-07-23 19:12:31 +00:00
Liyas Thomas
09eabbdcea Merge branch 'main' into refactor/ui 2021-07-23 18:28:37 +00:00
Liyas Thomas
233214cb30 refactor: move actions from app header to app footer 2021-07-23 18:28:07 +00:00
liyasthomas
f694f1ad36 refactor: init new state for body 2021-07-23 00:07:39 +05:30
Andrew Bastin
dd004c921e fix: fix test script lint errors 2021-07-22 01:24:08 -04:00
Andrew Bastin
8597c04ff1 feat: test script and pre-request script wiring 2021-07-21 23:56:39 -04:00
Andrew Bastin
5f5f086dfc feat: fix loading state disappearing 2021-07-21 17:43:15 -04:00
liyasthomas
04cd5b0981 feat: zenmode + toggle left, right & header panes 2021-07-21 15:25:46 +05:30
liyasthomas
22772ac10f feat: migrate pre-request script, test script, settings to nuxt composition 2021-07-21 10:50:20 +05:30
liyasthomas
d4234f0837 fix: nullable analytic events 2021-07-21 10:15:29 +05:30
liyasthomas
982f467572 fix: remove unused deps 2021-07-21 09:02:37 +05:30
Andrew Bastin
f4ffb8e357 feat: move pre request script to new state system 2021-07-20 23:27:06 -04:00
Andrew Bastin
cd908ae1b2 feat: parse and run REST request params
* package-lock.json:
2021-07-20 19:12:04 -04:00
Andrew Bastin
1573ddad1b feat: initial attempt at restoring codegen 2021-07-20 19:12:04 -04:00
liyasthomas
2ace83bcaf fix: minor UI styling 2021-07-20 15:59:30 +05:30
liyasthomas
88ccda8fd1 feat: shortcuts indicator toggle 2021-07-19 22:12:56 +05:30
liyasthomas
ae8cf656a3 Merge branch 'refactor/codegen' into refactor/ui 2021-07-19 19:23:17 +05:30
liyasthomas
68c00433f5 refactor(ui): introduce landing page + minor fixes 2021-07-19 18:42:33 +05:30
liyasthomas
f1ad7b9ef5 chore(deps): bump 2021-07-18 20:41:51 +05:30
liyasthomas
27cf8660d8 Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-18 20:40:41 +05:30
liyasthomas
7105e7a86f chore(deps): bump 2021-07-18 20:37:06 +05:30
liyasthomas
e52ed7a5ce refactor(ui): minor inconsistency fixes 2021-07-18 18:53:51 +05:30
liyasthomas
393e6896ec refactor(ui): more pages 2021-07-18 13:17:58 +05:30
liyasthomas
6ebfb1f109 feat: init codegen state 2021-07-18 10:03:52 +05:30
liyasthomas
590c21209c refactor(ui): sort windicss classes 2021-07-17 23:10:28 +05:30
liyasthomas
e7b58b27e8 feat: init storybook 2021-07-16 20:35:15 +05:30
liyasthomas
a2a9bae0e3 refactor(ui): minor stylings 2021-07-16 20:34:35 +05:30
liyasthomas
3ef8e677c7 fix: wire response + init error handling 2021-07-15 09:40:45 +05:30
Andrew Bastin
86c9e09782 fix: theme flicker 2021-07-14 22:29:11 -04:00
liyasthomas
fa8662f17d Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-15 06:33:31 +05:30
Andrew Bastin
dcf34ea92c feat: pass headers to the ran request 2021-07-14 15:36:15 -04:00
Andrew Bastin
9ece8adda8 feat: response size and duration metrics 2021-07-14 14:54:53 -04:00
Liyas Thomas
c302f7e1a9 Merge pull request #1742 from s-r-x/fix/nil-response-time
fix: undefined duration
2021-07-14 12:51:09 +05:30
s-r-x
2907d69dfc fix: undefined duration 2021-07-14 10:55:57 +05:00
liyasthomas
eeddb6a97e fix: proper key for v-for loops 2021-07-14 05:19:08 +05:30
liyasthomas
7ec8539540 feat: new components and UI improvements 2021-07-13 22:07:01 +05:30
liyasthomas
5e740a6ed6 refactor(ui): minor stylings 2021-07-13 12:48:57 +05:30
liyasthomas
a4032836c3 feat: init new response state system 2021-07-13 11:07:29 +05:30
Andrew Bastin
ffc891f38e feat: add header session store fields and dispatchers 2021-07-12 20:17:13 -04:00
liyasthomas
93ea80a3e3 feat: init request state management 2021-07-12 09:11:55 +05:30
liyasthomas
68ff422a5f Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-12 07:05:29 +05:30
Andrew Bastin
54d21c4950 feat: url and params rewrite index.vue 2021-07-11 21:33:11 -04:00
Liyas Thomas
bfd9327e74 fix: raw <=> key-value toggle button 2021-07-12 01:21:40 +00:00
liyasthomas
498d0e18b9 Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-12 04:22:21 +05:30
liyasthomas
b5e524e513 refactor: remaining sections stylings 2021-07-12 04:20:00 +05:30
Liyas Thomas
c512c8d297 chore(deps): bump 2021-07-11 14:39:52 +00:00
liyasthomas
2e092d34a6 refactor: minor input stylings 2021-07-10 23:38:35 +05:30
liyasthomas
d94c8aec51 refactor: request section 2021-07-10 18:45:39 +05:30
liyasthomas
c7062ad613 refactor: modals 2021-07-09 22:49:45 +05:30
liyasthomas
08d0765cfb Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-09 13:11:12 +05:30
liyasthomas
1f0a3e97ae refactor: gql docs 2021-07-09 13:09:52 +05:30
Andrew Bastin
36745d79db feat: add page view to telemetry 2021-07-08 23:39:07 -04:00
liyasthomas
c6490818d0 feat: revamp graphql sidebar ui 2021-07-08 23:42:15 +05:30
liyasthomas
f1ef403c83 Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-08 14:03:41 +05:30
liyasthomas
cad7ecf760 feat: ask confirmation for telmetry 2021-07-08 14:00:18 +05:30
liyasthomas
8f7fcfa147 perf: even 2021-07-08 13:46:43 +05:30
liyasthomas
a3bde5797a Merge remote-tracking branch 'origin/main' into refactor/ui 2021-07-08 13:44:00 +05:30
liyasthomas
a070bed7c9 feat: revamp environments ui 2021-07-08 13:36:37 +05:30
liyasthomas
207dc2b6a6 feat: revamp collections ui 2021-07-08 13:00:41 +05:30
liyasthomas
fee0a8cec1 feat: ask confirmation for telmetry 2021-07-08 09:20:41 +05:30
Liyas Thomas
6635d449a5 feat: history section 2021-07-07 23:28:42 +00:00
Andrew Bastin
99b1699ade feat: disable telemetry calls if disabled 2021-07-07 16:40:31 -04:00
liyasthomas
20d38e247b feat: enable telemetry toggle button 2021-07-07 06:30:49 +05:30
Liyas Thomas
7c8ab6fd4a perf: even 2021-07-06 18:18:07 +00:00
Liyas Thomas
7bb570cdc7 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-07-06 18:13:49 +00:00
Liyas Thomas
fc5a5aad8d feat: init split layouts 2021-07-06 18:00:39 +00:00
Liyas Thomas
93d373c032 refactor(ui): popovers 2021-07-06 18:00:39 +00:00
Liyas Thomas
fde5b0717d fix: button icons 2021-07-06 18:00:39 +00:00
Liyas Thomas
069b26bdc4 feat: settings page 2021-07-06 18:00:39 +00:00
Liyas Thomas
8f3e4cfdba feat: refactor buttons 2021-07-06 18:00:39 +00:00
Liyas Thomas
ba7f5d3dc3 feat: tooltip and popover components 2021-07-06 18:00:39 +00:00
Liyas Thomas
42ce183510 feat: landing page + smart components 2021-07-06 18:00:39 +00:00
liyasthomas
977bad2156 refactor: init packages 2021-07-06 18:00:39 +00:00
Liyas Thomas
fd4f49cf8e refactor: settings page + ui components 2021-07-06 18:00:39 +00:00
Liyas Thomas
1b540c0e57 feat: refactor buttons 2021-07-06 18:00:39 +00:00
Liyas Thomas
0e443b3a43 feat: tooltip and popover components 2021-07-06 18:00:38 +00:00
Liyas Thomas
eaf0da3d00 feat: users section 2021-07-06 18:00:38 +00:00
Liyas Thomas
dd41ac3888 feat: landing page + smart components 2021-07-06 18:00:38 +00:00
liyasthomas
a0e26c6c4f refactor: init packages 2021-07-06 18:00:38 +00:00
liyasthomas
6ac7ce2c73 chore(deps): bump 2021-07-06 18:00:38 +00:00
Andrew Bastin
7b3dd697bb feat: pass theme data to analytics 2021-07-06 08:30:48 -04:00
Andrew Bastin
48e562dcee feat: theme syncing 2021-07-06 08:20:37 -04:00
Andrew Bastin
86bd4aa568 feat: add analytics logging while hoppscotch requests are fired 2021-07-05 21:47:48 -04:00
Liyas Thomas
ed91486d53 refactor(ui): popovers 2021-07-05 16:52:15 +00:00
Andrew Bastin
913b073ba4 feat: add initial analytics implementation 2021-07-05 12:45:10 -04:00
Andrew Bastin
b1418c081c feat: auth event subject 2021-07-05 12:44:43 -04:00
Andrew Bastin
6b373bee47 feat: update env with FB_MEASUREMENT_ID 2021-07-05 12:42:44 -04:00
Liyas Thomas
256d4b3e07 fix: button icons 2021-07-05 12:56:00 +00:00
Liyas Thomas
dc5a09bebc feat: settings page 2021-07-05 05:08:03 +00:00
Liyas Thomas
ababd79da2 Merge branch 'refactor/ui' of https://github.com/hoppscotch/hoppscotch into refactor/ui 2021-07-04 17:12:15 +00:00
Liyas Thomas
5e21210962 refactor: settings page + ui components 2021-07-04 17:00:30 +00:00
Liyas Thomas
3e3da2f27b feat: refactor buttons 2021-07-04 17:00:30 +00:00
Liyas Thomas
b55439ce44 feat: tooltip and popover components 2021-07-04 17:00:30 +00:00
Liyas Thomas
ff791098d8 feat: users section 2021-07-04 17:00:29 +00:00
Liyas Thomas
5abf837e95 feat: landing page + smart components 2021-07-04 17:00:29 +00:00
liyasthomas
6bcf1a3522 refactor: init packages 2021-07-04 17:00:29 +00:00
liyasthomas
b0f055567d chore(deps): bump 2021-07-04 22:27:18 +05:30
Liyas Thomas
1ee2fecbc2 feat: refactor buttons 2021-07-03 13:14:58 +00:00
Liyas Thomas
04b0cd2d3b feat: tooltip and popover components 2021-07-02 16:30:08 +00:00
Liyas Thomas
0439e6811b feat: users section 2021-07-02 08:55:03 +00:00
Liyas Thomas
a130cfcadb feat: landing page + smart components 2021-07-02 05:01:29 +00:00
Liyas Thomas
77fcc14043 Merge pull request #1737 from s-r-x/fix/duplicate-input-id
fix: duplicated input ids
2021-07-02 04:58:22 +05:30
liyasthomas
fb93db6ad4 refactor: init packages 2021-07-01 22:09:11 +05:30
s-r-x
47cf321eba fix: duplicated input ids 2021-07-01 15:10:51 +05:00
Liyas Thomas
b0ab1b048d refactor(ui): better GitHub buttons 2021-06-30 17:23:48 +00:00
liyasthomas
aaec87d7be docs: updated readme 2021-06-30 20:26:11 +05:30
liyasthomas
3198bc6b2c chore(deps): bump 2021-06-30 14:53:15 +05:30
liyasthomas
60be228c33 Merge branch 'refactor/sponsors' of https://github.com/hoppscotch/hoppscotch into refactor/sponsors 2021-06-30 14:27:38 +05:30
liyasthomas
22c3ffcc02 chore: removed sponsorship prompts 2021-06-30 14:21:16 +05:30
liyasthomas
b750ccd46f refactor: better implimentation for slots 2021-06-30 14:16:02 +05:30
liyasthomas
0dd0d262d6 Merge branch 'refactor/code' 2021-06-29 17:07:46 +05:30
liyasthomas
9a83938c75 refactor: better icon button states 2021-06-29 17:04:02 +05:30
liyasthomas
9b5b3cc202 ci: enforce commitlint + skip build on tests 2021-06-29 06:50:38 +05:30
liyasthomas
729f341164 fix: remove stale state file 2021-06-29 06:37:42 +05:30
liyasthomas
d5c5fb7435 refactor: better error prompts 2021-06-28 17:28:22 +05:30
liyasthomas
01b8001d4c chore: removed sponsorship prompts 2021-06-28 17:27:03 +05:30
liyasthomas
3992650fd6 fix: remove stale default environments state - fixed #1735 2021-06-28 08:48:07 +05:30
liyasthomas
a2354b5e9e feat: added commitlint, semantic pr 2021-06-28 00:24:16 +05:30
liyasthomas
43b7e94974 feat: setup firebase hosting for prod 2021-06-27 12:06:57 +05:30
Liyas Thomas
cdfce9e2b8 refactor: class names 2021-06-26 10:41:19 +00:00
Liyas Thomas
9bd86f0564 fix: minor stylings fixes 2021-06-26 00:19:42 +00:00
Liyas Thomas
1c0b5b25ed Merge pull request #1734 from hoppscotch/feat/windicss
feat: remove tailwindcss + introduce windicss
2021-06-26 05:21:13 +05:30
Liyas Thomas
6d33132705 feat: remove tailwindcss + introduce windicss 2021-06-25 23:44:27 +00:00
liyasthomas
3e5629e738 fix: typo 2021-06-21 16:39:51 +05:30
liyasthomas
41eb4f8395 refactor(ui): minor font tweaks 2021-06-21 16:31:40 +05:30
liyasthomas
6ddff58ba5 feat: better route determination - fixed #1732 2021-06-21 15:33:51 +05:30
liyasthomas
5bb9b1b675 chore: bump deps 2021-06-21 15:32:23 +05:30
Andrew Bastin
f4f29b8520 Fix localStorage usage 2021-06-21 00:27:45 -04:00
Andrew Bastin
257e2db651 Add no localstorage rule 2021-06-20 23:27:05 -04:00
liyasthomas
a853c13bcd Merge branch 'newstate/firebase' 2021-06-20 19:09:59 +05:30
liyasthomas
96c23200f7 chore: bump deps 2021-06-20 18:06:20 +05:30
Andrew Bastin
7c2becd3a4 Merge remote-tracking branch 'upstream/main' into newstate/firebase 2021-06-19 20:41:25 -04:00
Andrew Bastin
a85729b4cf Fix firebase reinitialization crash 2021-06-19 20:36:23 -04:00
Liyas Thomas
bd3cec18d8 Merge pull request #1727 from d4v3y0rk/patch-1 2021-06-20 05:47:23 +05:30
Dave York
7dcd96350a Cleaner Docker run command
added two flags to the docker run command to clean up the container after it has been run and also assign it a name to help manage it while it is running.
2021-06-19 12:09:03 -04:00
Ilya
2e1c0ae77a fix: janky sidebar animation (#1726) 2021-06-18 11:56:27 +05:30
liyasthomas
6a6754c7da feat: active toggle for web socket protocols 2021-06-18 10:45:48 +05:30
Andrew Bastin
1fb2c35984 Handle error.vue initializeFirebase 2021-06-17 08:22:59 -04:00
Andrew Bastin
02d3b45efc Added settings observable 2021-06-16 22:35:53 -04:00
Andrew Bastin
4ce7f0b487 Remove redudant applySettingFB 2021-06-16 22:33:17 -04:00
liyasthomas
3559d98df1 chore: lint 2021-06-16 19:13:07 +05:30
Liyas Thomas
0a4251825b feat: Sec-WebSocket-Protocol header on WebSocket connections - resolved #1620 2021-06-15 14:44:23 +00:00
Liyas Thomas
499cd9d81b Merge pull request #1723 from s-r-x/fix/broken-gql-col-req-edit 2021-06-15 18:24:52 +05:30
Liyas Thomas
10a6b96f13 Merge branch 'main' into fix/broken-gql-col-req-edit 2021-06-15 18:15:40 +05:30
Liyas Thomas
4e3d9187f7 Merge pull request #1721 from s-r-x/fix/modal-overlay-mouseup
fix: modal backdrop click
2021-06-15 18:13:02 +05:30
Andrew Bastin
0921cccb4c Reset save req selection when selected item is deleted 2021-06-15 08:26:01 -04:00
s-r-x
07a505c365 fix: broken gql collection request editor 2021-06-15 15:25:19 +05:00
s-r-x
c3411ba0cf fix: do not close modal if mousedown event was on the content but mouseup on the backdrop 2021-06-15 14:28:10 +05:00
Liyas Thomas
5246284e32 refactor(ci): minor optimizations 2021-06-15 08:40:03 +00:00
Ilya
5fe8fce89d refactor: modals (#1720)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-06-15 13:48:38 +05:30
liyasthomas
0cedc9ed51 chore: remove unused code 2021-06-15 06:34:21 +05:30
Liyas Thomas
7cbb61bdf8 chore(deps): bump 2021-06-14 15:43:21 +00:00
Andrew Bastin
b357dc8e2f Fix history sync issues 2021-06-14 09:24:46 -04:00
Andrew Bastin
f745fef6c2 Fix enter.vue firebase not loaded 2021-06-14 08:40:39 -04:00
Andrew Bastin
dfe810fff4 Fix Sign In With Github 2021-06-14 08:35:53 -04:00
liyasthomas
111a947413 feat: minor ui tweaks 2021-06-14 09:55:27 +05:30
Andrew Bastin
85c6932f8f Initial Firebase refactor pass 2021-06-14 00:11:57 -04:00
liyasthomas
ced2f1b911 feat: introduce animations 2021-06-13 20:31:42 +05:30
liyasthomas
685f9d506d chore(deps): bump 2021-06-13 16:25:22 +05:30
liyasthomas
34cd604a91 refactor(ui): minor ux improvements 2021-06-13 16:24:29 +05:30
liyasthomas
2ffd0be03f refactor(ui): better color names 2021-06-12 22:16:17 +05:30
liyasthomas
58296505a8 feat: show and hide sidebar - fixed #1716 2021-06-12 16:40:12 +05:30
Andrew Bastin
779f5e9af4 Merge pull request #1710 from hoppscotch/feat/email-auth
Passwordless sign in with email address
2021-06-11 01:14:06 -04:00
Andrew Bastin
2351f64e6f Merge branch 'main' into feat/email-auth 2021-06-11 01:10:19 -04:00
liyasthomas
03987da05b refactor: better ui + ux for email sign in 2021-06-11 10:29:52 +05:30
Andrew Bastin
07e2cb5cd9 Email login toast improvements 2021-06-11 00:25:58 -04:00
Andrew Bastin
9b43f9a40c Close email modal on login complete 2021-06-10 23:57:29 -04:00
liyasthomas
43b0225fba fix: broken create github gist for collections 2021-06-11 09:05:00 +05:30
Liyas Thomas
da491a2967 Merge branch 'main' into feat/email-auth 2021-06-11 05:33:16 +05:30
liyasthomas
be67986123 feat: sign in with email 2021-06-11 05:31:29 +05:30
liyasthomas
af9c7e0aff feat: add FundOSS toast 2021-06-10 19:26:03 +05:30
liyasthomas
27e061c355 setup: GitHub actions for tests and remove Travis CI 2021-06-10 11:02:24 +05:30
Liyas Thomas
da94a94d71 Merge pull request #1709 from JoelJacobStephen/main
Made changes to Black Mode to make UI elements more visible.
2021-06-09 08:52:58 +05:30
Joel Jacob Stephen
970c2e56d8 Made changes to Black Mode to make UI elements more visible. 2021-06-08 18:28:34 +05:30
liyasthomas
766c31fa56 chore: bump deps + refactor: consistent import / export modal 2021-06-07 15:22:34 +05:30
Andrew Bastin
50fa1c8f0a Fix import export for environments 2021-06-07 00:13:28 -04:00
Andrew Bastin
e361d66c88 Merge branch 'newstate/environments' into main 2021-06-06 23:12:41 -04:00
Andrew Bastin
f1203efa62 Fix firebase sync issue 2021-06-06 20:35:28 -04:00
liyasthomas
45b9f2e1bf fix: replace auto complete with drop down for content-types - fixed #1704 2021-06-06 20:56:56 +05:30
liyasthomas
538600354d chore(deps): bump 2021-06-06 16:36:02 +05:30
liyasthomas
5c9093823b chore: lint + minor ui tweaks 2021-06-06 16:35:30 +05:30
liyasthomas
7b6c4f71a2 patch: set application/json as default content-type 2021-06-06 15:52:54 +05:30
nelsontky
7e9ae69f38 fix: prevent overwrite of content type (#1703)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-06-06 03:12:50 -07:00
Andrew Bastin
ddbc9ca61b Inject globals env into pre-request scripts 2021-06-05 21:07:06 -04:00
Andrew Bastin
d9aa965069 Fix import of replaceEnvironments in fb.js 2021-06-05 20:55:51 -04:00
Andrew Bastin
6ea9d16f87 Add firebase sync code for new environment state system 2021-06-04 22:52:06 -04:00
Andrew Bastin
5bfeb541fc Initial environment state system refactor 2021-06-04 22:41:07 -04:00
liyasthomas
c3f713c0bd fix: break words on long texts - fixed #1699 2021-06-02 08:20:39 +05:30
Liyas Thomas
97979a6ab5 Merge pull request #1696 from JoelJacobStephen/main
Changing Hoppscotch Title from Hs to Hoppscotch for all sizes
2021-06-02 00:08:30 +05:30
Joel Jacob Stephen
055adf9fe0 Changing Hoppscotch Title from Hs to Hoppscotch for all sizes 2021-06-01 23:49:04 +05:30
Andrew Bastin
e94adc835d Merge pull request #1695 from JoelJacobStephen/main
Simplified the capitalization of Accent Color Names by using a function.
2021-06-01 13:24:32 -04:00
Joel Jacob Stephen
50bb8c4fdd Simplified the capitalization of Accent Color Names by using a function. 2021-06-01 22:44:22 +05:30
Andrew Bastin
aa0a340b95 Merge branch 'newstate/collections' into main 2021-06-01 00:12:40 -04:00
Andrew Bastin
41d21bc0ff Remove unwanted logs 2021-06-01 00:09:35 -04:00
liyasthomas
2de4b75b89 docs: add join beta form link 2021-06-01 07:11:05 +05:30
Andrew Bastin
b52cc9e2b4 Reimplement Body Param File input filtering for saving requests 2021-05-31 14:00:48 -04:00
liyasthomas
fea3843714 Merge branch 'newstate/collections' of https://github.com/AndrewBastin/hoppscotch into newstate/collections 2021-05-31 10:37:44 +05:30
Andrew Bastin
5df5d59f50 Drag and Drop for GraphQL requests in Collections pane 2021-05-30 23:30:28 -04:00
Andrew Bastin
062dd4f889 Linting 2021-05-30 23:30:28 -04:00
Andrew Bastin
948b027059 Remove GraphQL SaveRequest component 2021-05-30 23:30:28 -04:00
Andrew Bastin
4d057a39ed Migrate GraphQL to use SaveRequest modal instead of GQL one 2021-05-30 23:30:28 -04:00
Andrew Bastin
68c4efb1d3 fix: drag and drop on collections 2021-05-30 23:30:28 -04:00
Andrew Bastin
eda8c7da41 Initial Collection State System implementation
Co-authored-by: Liyas Thomas <hi@liyasthomas.com>
2021-05-30 23:30:28 -04:00
Liyas Thomas
ac1937f9be chore(deps): bump 2021-05-30 13:40:20 +00:00
liyasthomas
5f0f7693bb fix: import collections from file - removed store commit 2021-05-30 09:21:55 +05:30
Andrew Bastin
9ad22e2600 Linting 2021-05-29 22:43:05 -04:00
Andrew Bastin
fe8bbc6cc8 Remove GraphQL SaveRequest component 2021-05-29 22:38:18 -04:00
Andrew Bastin
795c5f8263 Migrate GraphQL to use SaveRequest modal instead of GQL one 2021-05-29 22:36:58 -04:00
Andrew Bastin
66bb9dc42b fix: drag and drop on collections 2021-05-28 00:23:11 -04:00
Andrew Bastin
70a350fdac Initial Collection State System implementation
Co-authored-by: Liyas Thomas <hi@liyasthomas.com>
2021-05-27 23:22:17 -04:00
Liyas Thomas
a795fc4310 release: v1.12.0 2021-05-27 15:11:01 +00:00
Liyas Thomas
790b743e42 fix: copy .env to root - fixed #1671 2021-05-27 14:08:21 +00:00
Andrew Bastin
21aeded2ea Update DispatchingStore to provide better typing for dispatch function parameters 2021-05-25 18:27:50 -04:00
liyasthomas
baf6d6bd29 refactor: lint options 2021-05-25 21:43:13 +05:30
Andrew Bastin
2e213a8692 Remove History test spec 2021-05-24 23:37:48 -04:00
Andrew Bastin
455cccebb5 Fix issue with clear history confirmation persisting after clearing 2021-05-24 23:37:48 -04:00
Andrew Bastin
9e602394cf Remove dependency on history component to add history entry 2021-05-24 23:37:48 -04:00
Andrew Bastin
46ebd49936 Refactor history entry limits 2021-05-24 23:37:48 -04:00
Andrew Bastin
fcac750ad7 Migrate code to new history store 2021-05-24 23:37:48 -04:00
Andrew Bastin
8cd3acd205 Introduce History store 2021-05-24 23:37:48 -04:00
liyasthomas
bc95a028ce chore(deps): bump 2021-05-23 18:48:48 +05:30
Andrew Bastin
5fb457d331 Fix Settings Sync issues 2021-05-22 21:48:15 -04:00
liyasthomas
454c11a12c chore: lint 2021-05-22 20:50:23 +05:30
Andrew Bastin
3ac9a418e6 Defer ChooseType teams list query until component visible 2021-05-20 22:21:12 -04:00
liyasthomas
c98de5988e fix: clean input value in modals - fixed #1662 2021-05-20 14:24:14 +05:30
Andrew Bastin
ca5df588b7 Fix UrlField tests 2021-05-19 22:41:16 -04:00
Andrew Bastin
08a41691af Revamp URLField 2021-05-19 22:25:00 -04:00
Andrew Bastin
665f272a0e Stylelint updates 2021-05-19 22:24:31 -04:00
Andrew Bastin
2591e3ab67 Add node-interval-tree as dep 2021-05-19 22:23:47 -04:00
liyasthomas
44df9b3be8 refactor: lint 2021-05-19 10:24:57 +05:30
liyasthomas
40ddfa8def refactor: lint 2021-05-18 21:39:55 +05:30
liyasthomas
cc27c552af refactor: lint 2021-05-18 14:57:29 +05:30
liyasthomas
7f248da0b3 refactor: lint 2021-05-18 11:56:59 +05:30
Andrew Bastin
79a0002594 Load through server side pagination for team members list 2021-05-17 12:27:36 -04:00
Andrew Bastin
a6c015bcc5 Make ESLint happy with fb.js 2021-05-17 12:26:57 -04:00
Andrew Bastin
692d98cb55 Make ESLint a bit more forgiving 2021-05-17 12:26:25 -04:00
liyasthomas
d9ddc184cb refactor: lint 2021-05-17 19:17:57 +05:30
liyasthomas
e424d06026 refactor: lint 2021-05-17 17:11:58 +05:30
liyasthomas
f9821e5f80 feat: eslint for typescript 2021-05-17 15:17:23 +05:30
Liyas Thomas
5bd53dc093 feat: eslint + stylelint 2021-05-17 05:55:50 +00:00
Liyas Thomas
204834872e refector: remove unused components 2021-05-17 03:19:53 +00:00
liyasthomas
a24049aa17 fix: dotenv 2021-05-16 14:10:39 +05:30
liyasthomas
9cb9e9e7b6 fix: dotenv 2021-05-16 12:53:40 +05:30
liyasthomas
3e7a766d12 Merge branch 'main' of https://github.com/hoppscotch/hoppscotch 2021-05-16 12:23:45 +05:30
liyasthomas
02debdc28b fix: use .env values - fixed #1639 2021-05-16 12:23:29 +05:30
liyasthomas
e104fe3021 chore(deps): bump 2021-05-16 12:21:28 +05:30
Andrew Bastin
dda40537cc Don't update BackendUserInfo if not authenticated 2021-05-15 21:52:31 -04:00
liyasthomas
217269467c docs: updated sponsors list 2021-05-16 04:08:56 +05:30
Liyas Thomas
5f193680c9 fix: minor UI stylings 2021-05-15 21:19:23 +00:00
Liyas Thomas
c0ef713c0b i18n: add Hindi and Norwegian (Bokmål) language (#1642)
Co-authored-by: Sindre van der Linden <sindre@allvis.io>
Co-authored-by: Deven Rathod <devenrathod2001@gmail.com>
2021-05-15 06:23:12 -07:00
Liyas Thomas
3533aa391a chore: lint 2021-05-15 12:43:31 +00:00
Liyas Thomas
ec90365427 Merge pull request #1641 from hoppscotch/teams 2021-05-15 14:08:03 +05:30
Liyas Thomas
78f7a9ba06 chore(deps): lock file 2021-05-15 08:26:22 +00:00
Liyas Thomas
7793dd8b3e Merge branch 'main' into teams 2021-05-15 08:11:03 +00:00
Liyas Thomas
76866f78f0 cleanup: remove logs 2021-05-15 06:47:13 +00:00
Liyas Thomas
8e3ecb4c25 fix: save location picker indicator 2021-05-15 05:45:05 +00:00
Andrew Bastin
1b9b2ac4c9 Fix SaveRequest modal selection 2021-05-15 00:02:55 -04:00
Andrew Bastin
489f14b88f Fixed issue in TeamCollectionAdapter with request updates 2021-05-14 01:59:08 -04:00
Liyas Thomas
8f09c82763 fixes and refactor 2021-05-14 05:50:17 +00:00
Andrew Bastin
2b8cda40a2 Introduce TeamMemberAdapter 2021-05-14 00:08:52 -04:00
Liyas Thomas
4656d67fcf fix: teams edit modal + race conditions on currentUser 2021-05-14 03:40:53 +00:00
Andrew Bastin
e7dd67deaa Update race condition with Apollo getting ID Token and BackendUserInfo 2021-05-13 22:42:04 -04:00
Andrew Bastin
b9c3219094 Hide "Team Collections" tab if user has no access 2021-05-13 20:16:41 -04:00
Andrew Bastin
f55a995c0a Introducing BackendUserInfo 2021-05-13 20:16:29 -04:00
Andrew Bastin
ee378a128c Introduce observable function for team member list 2021-05-13 02:28:35 -04:00
Liyas Thomas
c1f083d19f fix: indicate selected location on save request 2021-05-13 04:26:33 +00:00
Liyas Thomas
2ff0f97295 refactor: request actions + fix: timeout bug 2021-05-12 05:33:15 +00:00
Andrew Bastin
dd3b51d0b7 Use Intersection component to fetch team list on visibility 2021-05-11 23:39:23 -04:00
Andrew Bastin
853acfda2c Introduce Intersection component 2021-05-11 23:38:47 -04:00
Liyas Thomas
c756be54a1 refactor: separate request components for team & my collections 2021-05-11 13:10:36 +00:00
Liyas Thomas
3bbf334f99 refactor: separate folders for team and personal collections 2021-05-11 05:49:36 +00:00
Liyas Thomas
c6c8b7da6a chore(deps): bump 2021-05-09 14:59:24 +00:00
Liyas Thomas
8a30d3ed42 refactor: separated my collections and tam collections 2021-05-09 07:48:52 +00:00
Andrew Bastin
a5a6b864a5 Fix issue with child collection not rerendering 2021-05-09 02:08:48 -04:00
Liyas Thomas
97b7320939 move collections actions to parent 2021-05-09 05:30:31 +00:00
Andrew Bastin
5c11bcb2c6 Update TeamCollectionAdapter with more docs 2021-05-06 21:22:17 -04:00
Andrew Bastin
3888584b58 Initial refactor of the collections list and friends 2021-05-06 20:46:29 -04:00
Andrew Bastin
531a9c0bc8 Update team_utils imports 2021-05-06 12:21:53 -04:00
Andrew Bastin
84f8048e0a Initial introduction of TeamCollectionAdapter based collection render 2021-05-06 12:06:19 -04:00
Andrew Bastin
fdf96b0b63 Fixed build time issue with TeamCollectionAdapter 2021-05-06 12:05:45 -04:00
Andrew Bastin
86ddfe2c9f Introduce TeamCollectionAdapter 2021-05-05 10:44:17 -04:00
Andrew Bastin
115ae93073 Merge pull request #1625 from iamtabrezkhan/issue-1507
FEAT: add syntax highlighting in Code Generator Modal
2021-05-04 22:57:45 -04:00
Andrew Bastin
aa65cada6f Merge branch 'main' into issue-1507 2021-05-04 22:44:11 -04:00
Andrew Bastin
ad9cdf3fa8 Update team/utils code style 2021-05-04 22:18:46 -04:00
Liyas Thomas
5c0035f4c3 chore(deps): bump 2021-05-04 19:36:50 +00:00
Liyas Thomas
37b4c67ead docs: updated sponsors list 2021-05-04 19:36:23 +00:00
Liyas Thomas
63998f4a23 minor UI styling 2021-05-04 14:02:19 +05:30
Liyas Thomas
efeec13794 set default export language as cURL 2021-05-03 19:14:26 -07:00
Liyas Thomas
6c49e5c86a fix: race condition where no language is selected 2021-05-03 19:12:13 -07:00
Andrew Bastin
ec57392424 Fixed subscriptions authorization 2021-05-03 09:57:58 -04:00
Andrew Bastin
8713aa7fd3 Remove @nuxtjs/apollo and added vue-apollo as dep 2021-05-03 09:22:39 -04:00
Andrew Bastin
627811f28d Refactor Apollo Client handling 2021-05-03 09:18:24 -04:00
Tabrez Khan
3f743b4f61 FEAT: add syntax highlighting in Code Generator Modal
USE: SmartAceEditor componenent
2021-05-03 14:46:41 +05:30
Liyas Thomas
d676b5a68d chore(deps): bump rxjs 2021-05-03 05:08:39 +00:00
Liyas Thomas
a6dfab5fbf chore(deps): bump 2021-05-02 15:21:27 +00:00
Liyas Thomas
b8bc110d33 check existance of teamCollectionAdded.parent
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-05-02 03:49:00 +00:00
Andrew Bastin
597fd2c6d1 Fix duplication on teams folder creation 2021-04-29 23:50:50 -04:00
Liyas Thomas
ab0bc3e927 fix: permissions for collections and folders 2021-04-30 01:04:41 +00:00
liyasthomas
e28373dae1 fixes
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-04-29 14:03:39 +05:30
Liyas Thomas
1bc57f159c merge feat/teams-new-ui
Co-authored-by: Isha Gupta <40794215+IshaGupta18@users.noreply.github.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Osheen Sachdev <45964755+oshhh@users.noreply.github.com>
Co-authored-by: Rohan Rajpal <rohan46000@gmail.com>
Co-authored-by: Raghav Gupta <raghav.gupta0307@gmail.com>
2021-04-26 09:37:18 +00:00
Liyas Thomas
6a8019c7a0 chore(deps): bump 2021-04-25 16:38:09 +00:00
Liyas Thomas
9b0dc5a849 Merge pull request #1615 from hoppscotch/feat/links 2021-04-23 04:46:54 -07:00
Liyas Thomas
283e1b0790 chore(deps): bump 2021-04-23 11:39:20 +00:00
Liyas Thomas
fc05a4bb78 docs: better copy 2021-04-23 11:38:56 +00:00
Liyas Thomas
88b32e317a docs: update links 2021-04-23 11:38:17 +00:00
Liyas Thomas
6c61a70d58 docs: updated built with stack, ideas for externship 2021-04-22 01:01:39 +00:00
Osheen Sachdev
5df3ebae22 Documentation generation (#1610)
Co-authored-by: Isha Gupta <40794215+IshaGupta18@users.noreply.github.com>
Co-authored-by: IshaGupta18 <ishagupta1828@gmail.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-04-21 10:17:31 -07:00
Liyas Thomas
ad252476ce docs: update GitHub Externship guidelines 2021-04-20 11:20:01 +00:00
Liyas Thomas
8e5f6a3a96 GitHub Externship @ Hoppscotch 2021-04-20 10:37:46 +00:00
Liyas Thomas
9ff209bd32 Merge pull request #1608 from hoppscotch/dependabot/npm_and_yarn/ssri-6.0.2
chore(deps): bump ssri from 6.0.1 to 6.0.2
2021-04-19 09:27:15 -07:00
dependabot[bot]
505e61475d chore(deps): bump ssri from 6.0.1 to 6.0.2
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-19 16:22:02 +00:00
Liyas Thomas
2c137a0eec chore(deps): bump 2021-04-18 15:09:32 +00:00
Liyas Thomas
b65ae89be6 fix: respect environment variable in inline query parameters - fixed #1603 2021-04-15 10:04:23 +00:00
Liyas Thomas
432884a2af Select multiple collections (#1604) (#1605) 2021-04-15 01:01:15 -07:00
Osheen Sachdev
6878498b2e Fix folder nesting in document generation (#1602) 2021-04-14 17:54:55 -07:00
Jainal Gosaliya
4d5332fef7 fixes empty url bug during importing postman json (#1593)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-04-13 21:44:50 -07:00
Andrew Bastin
50a149b662 Bump graphql-language-service-interface and fix build issues 2021-04-12 11:50:25 -04:00
Liyas Thomas
930838d676 chore(deps): bump 2021-04-12 08:14:19 +00:00
Liyas Thomas
f6c952ffb0 v1.10.0 2021-04-10 14:49:43 +00:00
Joel D Souza
f6db530de2 Sync bodyParams and rawBodyParams (#1562)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Joel DSouza <joel.dsouza@kapturecrm.com>
2021-04-10 01:03:37 -07:00
Liyas Thomas
db45f08905 fix: add query from cURL import - fixed #1582 2021-04-08 11:31:24 +00:00
Liyas Thomas
516d53f9bf chore(deps): bump + docs: add docker pulls badge 2021-04-02 06:46:50 +00:00
Liyas Thomas
c7e1adf638 chore(deps): bump + ui: full width container 2021-03-31 15:44:26 +00:00
Liyas Thomas
31147975c7 i18n translations (#1572)
* Suppletments some tranlations on zh-CN

* Update de-DE.json

Co-authored-by: mrhanson <chihanghanson@gmail.com>
Co-authored-by: 0xflotus <0xflotus@gmail.com>
2021-03-30 13:29:57 -07:00
Liyas Thomas
b9deec1487 chore(deps): bump + docs: remove absolute instructions from readme 2021-03-30 05:00:24 +00:00
Liyas Thomas
de57208bab Merge pull request #1566 from AndrewBastin/main
Bump minor dep updates and update Tab test spec
2021-03-28 17:25:23 +05:30
Andrew Bastin
07e966c640 Bump minor dep updates and update Tab test spec 2021-03-27 23:47:35 -04:00
Liyas Thomas
56982effcd feat: support custom router base property - fixed #1561 2021-03-24 13:18:33 +00:00
Liyas Thomas
8a52b0fbd6 fix: broken grapgql query fetch 2021-03-24 05:20:01 +00:00
Liyas Thomas
2190a1b6fd chore(deps): bump + fix: only allow one from extension and proxy 2021-03-23 19:48:00 +00:00
Andrew Bastin
c18c2ea9d4 Fix settings data migration issues 2021-03-23 11:34:19 -04:00
Andrew Bastin
5fce1118f6 Revamp of the Settings State System along with TypeScript support (#1560)
* Add vue-rx, rxjs and lodash as dependencies

* Added vue-rx plugin integration to nuxt config

* Initial settings store implementation

* Add babel plugin for private class properties to for Jest

* Add DispatchingStore test spec

* Initial settings code

* Reactive Streams for fb current user and id token

* Fix typo

* Migrate index and graphql pages to the new store

* Migrate network strategy to the new store

* Fixed Section.vue errors

* Fix getSettingSubject issue

* Migrate fb settings reference in components to the new state system

* Add typings for lodash as dev dependency

* Load setting

* Load initial sync setting values

* Update proxy url

* Add typescript support

* Rewrite Settings store to TypeScript

* Port Settings page to TypeScript as reference

* Move all store migrations to a separate file

* Delete test file for fb.js

* Add ts-jest as dev dependency

* Remove firebase-mock as dependency

* Remove FRAME_COLORS_ENABLED settings value
2021-03-23 11:18:14 -04:00
Liyas Thomas
64f64b9e31 fix: disable resize on ace editor - fixed #1110 2021-03-23 09:39:14 +00:00
Liyas Thomas
b4ac527638 fix: restore previous theme colors - fixed #1559 2021-03-22 16:36:57 +00:00
Liyas Thomas
352f3af737 refactor: show sub-folders before requests inside folders 2021-03-22 11:53:36 +00:00
Liyas Thomas
c7c221ad5e Merge pull request #1554 from farhan-tariq/show-sub-folders-first
Show sub-folders first instead of requests
2021-03-22 08:31:55 +05:30
Liyas Thomas
74adbae7ed chore(deps): bump 2021-03-22 02:55:47 +00:00
Farhan Tariq
8a5402932c Show sub-folders first instead of requests 2021-03-21 19:49:03 +05:00
Isha Gupta
e565f9bf72 GraphQL collections (#1536) 2021-03-18 20:25:12 +05:30
Liyas Thomas
942b86c647 refactor: upgrade tailwindcss 2021-03-17 18:00:58 +00:00
Liyas Thomas
1042310038 Merge pull request #1542 from JDevx97/fix/1541/query-parameters-url-encoding 2021-03-16 21:18:58 -07:00
Liyas Thomas
d0c261b9cd Merge branch 'main' into fix/1541/query-parameters-url-encoding 2021-03-16 21:12:52 -07:00
liyasthomas
61396cbb15 download fonts to same site origin 2021-03-17 09:23:16 +05:30
Jayce Dugan
87c6230ef2 Fix: Whitespace & URL encoding applied to query parameters.
fix: String.trim() applied to query parameter keys and values to remove additional whitespace.

fix: encodeURI() applied to query string before being applied to request url path.
2021-03-16 22:45:07 +00:00
Liyas Thomas
347ad94a43 fix: minor UI spacing issues 2021-03-16 09:11:19 +00:00
Liyas Thomas
f1389cdba0 TailwindCSS v2.x (#1540) 2021-03-16 01:49:21 -07:00
Liyas Thomas
5399ddf6ac docs: updated description 2021-03-14 15:15:57 +00:00
Liyas Thomas
a724dc1207 proxy.hoppscotch.io (#1532)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-03-14 08:54:15 +05:30
Liyas Thomas
c6af38f7dc docs: updated sponsors list 2021-03-12 15:41:44 +00:00
Liyas Thomas
4d0008186b fix: only show recent 50 synced history entries - fixed #1530 2021-03-12 17:35:16 +05:30
Liyas Thomas
df3df6697e chore(deps): bump + docs: update sponsor list 2021-03-12 08:39:21 +00:00
Liyas Thomas
13ff7b9088 docs: updated screenshots + feature list 2021-03-11 14:59:16 +00:00
Liyas Thomas
196d252fec Merge pull request #1533 from jamesgeorge007/docs/add-ons
docs: add reference to hopp-doc-gen add-on
2021-03-11 16:51:32 +05:30
jamesgeorge007
53dfdc440d docs: add reference to hopp-doc-gen 2021-03-11 15:25:18 +05:30
Liyas Thomas
988a99efb7 fix: history order on cloud sync 2021-03-11 13:51:22 +05:30
Liyas Thomas
17da230d72 fix: remove sort history entries + fix history entries order - fixed #1455 2021-03-11 06:53:49 +00:00
Liyas Thomas
c8cdfc8885 Merge pull request #1531 from hoppscotch/audit/pwa
Added source=pwa on PWA start URL
2021-03-11 08:52:45 +05:30
Osheen Sachdev
0b00842c50 [Feat: GraphQL sidebar] GraphQL History (#1528)
* Create REQUIREMENTS.md

* graphql history UI

* rest history emit

* removed requirements file

* add, delete, clear, star history and sync with firstore

* use history

* empty schema

* remove other tabs

* computed query, setting headers

* binding props

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>

* remove print

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>

* remove dummy data

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>

* add docs tab

* date, time attribute --> updatedOn

* Removed margin from sidebar Tab

* removed v-bind

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>

* use shortcut for v-bind

* use shortcut for v-bind

* use unfold icons

* use template literals in :key

* history clear bug

* delete history bug

* minor translation

* remove console logs

* remove unused css

* add stared style

* remove absolute styles

* tests for graphql card

* tests for rest card

* tests for clear history added

* mount, clear, use, delete history tests added

* Rename card.vue to Card.vue

* Rename card.vue to Card.vue

* use computed

Co-authored-by: Isha Gupta <40794215+IshaGupta18@users.noreply.github.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-03-10 22:12:09 -05:00
Liyas Thomas
17e405a39e feat: added source=pwa on PWA start URL 2021-03-10 23:51:58 +00:00
Liyas Thomas
51bd3455cc chore(deps): bump 2021-03-09 15:28:41 +00:00
Liyas Thomas
e292af75ad meta: updated sponsors link 2021-03-09 15:28:15 +00:00
Liyas Thomas
ef4566eb95 refactor: show interaction while dragging request in collections 2021-03-08 04:02:08 +00:00
Liyas Thomas
e7d1ffb7ae chore: deps bump 2021-03-06 17:36:56 +00:00
Liyas Thomas
4fded3ada3 i18n translations (#1527)
Co-authored-by: Yohann Fabri <11197007+YoranSys@users.noreply.github.com>
Co-authored-by: Muhammad Rifqi Priyo Susanto <muhammadrifqipriyosusanto@gmail.com>
Co-authored-by: UioSun <uio.sun@soundws.com>
2021-03-04 09:13:31 +05:30
Liyas Thomas
dc5ca76d05 rename all components to new namespace (#1515)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-03-01 09:28:14 +05:30
Liyas Thomas
37bdd525ea refactor: replace fonts with Google fonts module 2021-02-25 16:08:12 +00:00
Liyas Thomas
3f03806455 Set schedule interval to weekly 2021-02-23 17:14:33 +00:00
harshlele
ff7bb1f303 response outline for JSON responses (#1484)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-02-23 08:09:16 +05:30
Liyas Thomas
5fe1de170d chore(deps): bump 2021-02-23 01:49:23 +00:00
Liyas Thomas
72913ccece chore(deps): bump + sort tailwind classes 2021-02-20 15:39:37 +00:00
Liyas Thomas
a6207e7edf chore(deps): bump + docs: updated readme 2021-02-19 17:33:37 +00:00
Liyas Thomas
2972ac6328 Support multipart/form-data content-type (#1485)
* Initial UI refactor - move raw and key-value body to components and tabs

* Delete package-lock.json

* deps

* Add multipart/form-data as a content type

* fix: add default contentType value

* Allow http body param request body with multipart/form-data

* Add form data to vuex

* move raw body components to 'Raw Request Body' tab

* Add files addition logic

* Set Dockerfile to run nuxt in dev mode

* Set Dockerfile to run nuxt in dev mode

* Draft version of file upload

* refactor: clean up

* Add file chip to denote file input

* Remove console.log

* refactor(ui): matching styles

* refactor(ui): matching styles

* fix(ui): mobile responsiveness

* fix(ui): mobile responsiveness

* refactor: minor cleanup

* Remove file from any form of persistence

* Add warning that form data files will not be saved to local storage

* Add remove file functionality

* Prevent file from being saved to collections

* Remove console.log

* fix active toggle on multipart/form-data + cleanup

* auto import components

Co-authored-by: nelsontky <nelson@ccb.wtf>
2021-02-19 22:31:31 +05:30
Liyas Thomas
d90550438f chore(deps): bump 2021-02-15 18:13:40 +00:00
Liyas Thomas
aa0f08cba3 chore(deps): bump 2021-02-14 21:27:47 +05:30
Liyas Thomas
a1b39d4fbc docs: updated sponsorship assets 2021-02-13 07:22:27 +05:30
Liyas Thomas
091a160db3 docs: updated sponsors list 2021-02-13 00:52:44 +05:30
Liyas Thomas
03f6336ac5 chore(deps): bump 2021-02-12 23:57:14 +05:30
Liyas Thomas
24c4cfe586 chore(deps): bump 2021-02-10 20:19:09 +05:30
Liyas Thomas
ca0c858e0f fix: broken mobile responsiveness - fixed #1472 2021-02-10 19:53:47 +05:30
Andrew Bastin
2be9a0bdba Merge pull request #1471 from KoHcoJlb/interface_and_enum_types
graphql: show enums and interfaces
2021-02-08 21:18:24 -05:00
Andrew Bastin
d333a44e11 Minor cleanup of type.vue 2021-02-08 21:11:18 -05:00
Andrew Bastin
e8e855a36c Added tests for the added functionality in type.vue and typelink.vue 2021-02-08 21:08:30 -05:00
Igor Stuzhuk (KoHcoJlb)
09719a4ad3 fix type tests 2021-02-08 14:02:01 +02:00
Igor Stuzhuk (KoHcoJlb)
c9e542d6d5 graphql: show enums and interfaces
make scalars not clickable
2021-02-07 22:18:20 +02:00
Liyas Thomas
a32ce56295 i18n (#1470) 2021-02-07 06:52:21 +05:30
Andrew Bastin
279c8c14cc Disabling GQL schema polling if there was an error 2021-02-06 19:37:45 -05:00
Liyas Thomas
49bc2c2204 Merge branch 'main' of https://github.com/hoppscotch/hoppscotch 2021-02-05 06:07:55 +05:30
Liyas Thomas
c036c945bd chore(deps): bump 2021-02-05 06:02:09 +05:30
Andrew Bastin
2e2cce9fcb Merge pull request #1457 from KoHcoJlb/fix-graphql-types-view
Fix "jump to graphql type" and show graphql input types
2021-02-02 12:52:27 -05:00
Igor Stuzhuk (KoHcoJlb)
7f33798789 graphql: fix "jump to type" and show input types 2021-02-02 16:10:51 +02:00
Liyas Thomas
e299433e6e Merge branch 'main' of https://github.com/hoppscotch/hoppscotch 2021-02-02 10:23:11 +05:30
Liyas Thomas
c82cb67bb6 chore(deps): bump 2021-02-02 10:22:31 +05:30
Andrew Bastin
075e11a7e1 Fix extension tick mark not appearing 2021-02-01 10:03:18 -05:00
Liyas Thomas
2b2c968a97 fix: revert axios interceptor and use normal time data - fixed #1449 2021-01-31 08:18:25 +05:30
Liyas Thomas
bffdb39c02 fix: decode url and path before saving to collection - fixed #1451 2021-01-30 22:19:19 +05:30
Liyas Thomas
3dabd73e95 chore(deps): bump 2021-01-30 22:17:50 +05:30
Liyas Thomas
8ed30e7eda chore(deps): bump 2021-01-28 21:28:36 +05:30
Liyas Thomas
7e4297d9bf Accurate response time and size (#1441)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2021-01-28 13:09:31 +05:30
Liyas Thomas
99e634711e chore(deps): bump 2021-01-26 20:09:19 +05:30
Kévin Dunglas
07f370d6d2 feat: better media types detection for JSON, XML and HTML lenses (#1438)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-01-26 09:57:11 +05:30
Kévin Dunglas
d2dfb4c8df fix: status code detection (#1440) 2021-01-25 06:50:50 +05:30
Liyas Thomas
64ee01d9fe Merge pull request #1439 from dunglas/feat/jsonld
feat: add JSON-LD to the list of known content types
2021-01-25 06:38:34 +05:30
Kévin Dunglas
a8d5ab035d feat: add JSON-LD to the list of known content types 2021-01-24 18:25:39 +01:00
Liyas Thomas
f58c6807d0 fix: encoding parameters twice effecting codegen - fixed #1437 2021-01-24 07:42:07 +05:30
Liyas Thomas
ca66b47014 refactor: better copy 2021-01-23 19:43:11 +05:30
Liyas Thomas
290781e734 feat: 'New version found. Refresh to update' toast 2021-01-23 17:22:54 +05:30
Liyas Thomas
d403e10018 docs: added contributors welcome badge + updated sponsors list 2021-01-23 12:40:40 +05:30
Liyas Thomas
161a0e07f9 refactor(codeql): removed unused variables 2021-01-23 11:40:29 +05:30
Liyas Thomas
eb9b0c85a9 chore(deps): bump 2021-01-23 11:38:37 +05:30
John Harker
c7f7b96405 Update Proxy URL (#1436)
* Update proxy URLs

* Update URLs in Vue file

Had to edit with web editor to avoid vs code changing indentation.

* Delete settings.json

Co-authored-by: Sam Jakob Mearns <me@samjakob.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-01-22 10:43:44 +05:30
Andrew Bastin
c5dff96f57 Better JS language integration for Pre-Request scripts and Test scripts (#1422)
* Add tern as dependency

* Add build rule to transpile mjs

* Initial implementation of the auto complete engine

* Separate out the tern server code to separate file

* Added extra type defs for tern server

* Boost the pw completion result to the top of the list

* Added acorn and acorn-walk as dependency

* Semantic linting powered by tern

* Fix DeepCode warnings for js-editor

* Remove unused registerLint tern extension

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2021-01-22 07:04:02 +05:30
Liyas Thomas
ff418ad55f chore(deps): bump 2021-01-20 21:23:13 +05:30
Liyas Thomas
6b0da0a568 fix: delete request from collection modal not closing 2021-01-18 22:08:48 +05:30
Liyas Thomas
56151982a7 chore(deps): bump 2021-01-17 22:44:58 +05:30
Liyas Thomas
c8185050f6 feat: GitHub buttons 2021-01-16 18:40:18 +05:30
Liyas Thomas
ed20b009a5 refactor: removed sponsorship prompt 2021-01-16 17:00:03 +05:30
Liyas Thomas
bf0bcf2f72 chore(deps): bump 2021-01-15 23:27:07 +05:30
Liyas Thomas
d81e80f273 chore(deps): bump 2021-01-13 20:23:14 +05:30
Liyas Thomas
6afed0e035 chore(deps): bump + fix(typo): extension repo link 2021-01-12 13:21:48 +05:30
Liyas Thomas
0a39e7b02f feat: Active toggle for GraphQL headers 2021-01-08 21:55:31 +05:30
Liyas Thomas
01a45f3085 chore(deps): bump 2021-01-08 21:53:21 +05:30
Liyas Thomas
c61764cd8d chore(deps): bump 2021-01-06 08:47:37 +05:30
Liyas Thomas
ce20f5d0a2 chore(deps): bump 2021-01-05 05:48:25 +05:30
Liyas Thomas
ffa9210286 fix: broken file name extension while downloading response 2021-01-04 07:25:03 +05:30
Liyas Thomas
025ead4fa3 chore(deps): bump 2021-01-04 06:37:59 +05:30
Liyas Thomas
82de03101b fix: throwing error when settings key being empty - fixed #1409 2021-01-04 06:25:02 +05:30
Liyas Thomas
eae071f9b8 doc: updated screenshots 2021-01-02 23:09:46 +05:30
Liyas Thomas
aadad482c4 chore(deps): bump + updated sponsors list 2021-01-02 20:57:28 +05:30
Gerardyang
cb8b98f707 Fix a missing close parenthesis before '.then' (#1407) 2021-01-02 20:49:42 +05:30
Liyas Thomas
603a888e2e chore(deps): bump + fix: typo in docker commands 2020-12-31 17:22:58 +05:30
Liyas Thomas
9e3083cc5d Merge pull request #1404 from hoppscotch/dependabot/npm_and_yarn/v-tooltip-2.1.0
chore(deps): bump v-tooltip from 2.0.3 to 2.1.0
2020-12-31 05:42:48 +05:30
dependabot[bot]
ab9f2c0a66 chore(deps): bump v-tooltip from 2.0.3 to 2.1.0
Bumps [v-tooltip](https://github.com/Akryum/vue-tooltip) from 2.0.3 to 2.1.0.
- [Release notes](https://github.com/Akryum/vue-tooltip/releases)
- [Commits](https://github.com/Akryum/vue-tooltip/compare/v2.0.3...v2.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-31 00:05:42 +00:00
Liyas Thomas
e84888c27e fix: broken import cURL #1159 2020-12-30 18:43:56 +05:30
Liyas Thomas
4dfc91db0a chore(dev-deps): bump 2020-12-30 11:12:56 +05:30
Liyas Thomas
5705df96f3 Merge branch 'main' of https://github.com/hoppscotch/hoppscotch 2020-12-29 07:16:45 +05:30
Liyas Thomas
9ac0cf1406 fix: decodeURI() failing on malformated URI + chore(deps): bump 2020-12-29 07:13:46 +05:30
Liyas Thomas
71170a1c5d feat: input toggle for parameters and headers (#1388)
* feat: toggler for parameters and headers

* refactor: move bodyParams to separate component + feat: input toggle

* fix: backward copaitability

* Fixed issue with imported active prop mutations

Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2020-12-28 06:02:41 +05:30
Liyas Thomas
353978f115 Merge branch 'main' of https://github.com/hoppscotch/hoppscotch into main 2020-12-27 18:38:14 +05:30
Liyas Thomas
e89065aafc chore(deps): bump 2020-12-27 18:37:45 +05:30
Andrew Bastin
ff35ccbaec Merge pull request #1398 from carlos-ds/unit-tests
Unit tests for the remaining test methods
2020-12-23 21:02:48 -05:00
Liyas Thomas
529d5b0535 Merge branch 'main' into unit-tests 2020-12-23 06:00:16 +05:30
Karel De Smet
15ecb19c65 Added extra test for error handling 2020-12-22 21:15:20 +01:00
Karel De Smet
a64b32d12c Test for toBeType() 2020-12-22 21:12:53 +01:00
Karel De Smet
f53ac25d90 Test for toHaveLength() 2020-12-22 20:05:56 +01:00
Karel De Smet
de1d06528e Test for toBeLevel5xx() 2020-12-22 19:33:27 +01:00
Karel De Smet
ea227e09fa Explicitly pass radix 10 to parseInt functions in toBeLevelxxx() to avoid unexpected results 2020-12-22 19:19:21 +01:00
Liyas Thomas
46cbd6dfd2 chore(deps): bump 2020-12-22 20:31:13 +05:30
Karel De Smet
a61e6efdd4 Test for toBeLevel4xx() 2020-12-22 08:10:54 +01:00
Karel De Smet
6536d71566 Merge https://github.com/hoppscotch/hoppscotch into unit-tests 2020-12-22 08:02:03 +01:00
Karel De Smet
d92412175c Test for toBeLevel3xx() 2020-12-22 08:01:55 +01:00
Liyas Thomas
a3b7f9a739 Updated collaborators list 2020-12-21 23:56:35 +05:30
Karel De Smet
5367a23112 #1396: Fixed assertions for toBeLevelxxx() functions (#1397)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-12-21 22:42:53 +05:30
Karel De Smet
3614f5b620 Test for toBeLevel2xx() 2020-12-21 17:35:40 +01:00
Liyas Thomas
eac7954570 chore(deps): bump 2020-12-21 21:39:28 +05:30
Liyas Thomas
7d08da22b2 Merge branch 'main' of https://github.com/hoppscotch/hoppscotch into main 2020-12-20 12:26:04 +05:30
Liyas Thomas
756acf1395 chore(deps): bump 2020-12-20 12:20:37 +05:30
Karel De Smet
a2a03c6b52 Unit tests for test functions toBe, toHaveProperty (#1392)
* Added unit tests for the post-request tests

* Added 2 top level functions to avoid duplication of code

* Simplified tests for toBe and error handling

* Added a test for asserting string values with toBe

* Added a test for negative assertion with toBe

* Added tests for toHaveProperty

* Imported PASS, FAIL and ERROR constants

* Use getTestResult and getErrors to avoid duplication of code

* Removed .vscode/settings.json

* Minor cleanup to postwomanTesting.spec.js

* Revert change of runTestScriptWithVariables back to default export

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2020-12-19 07:45:36 +05:30
Liyas Thomas
8e63a84152 Merge pull request #1393 from farhan-tariq/fix-for-collections
Fix when folder is having no request property
2020-12-18 17:21:28 +05:30
Farhan Tariq
38b3197912 Fix when folder is having no request property 2020-12-18 10:53:29 +00:00
Liyas Thomas
1d4576c7fd chore(refactor): removed absolute codes 2020-12-17 15:30:02 +05:30
Liyas Thomas
29a4dee91b chore(deps): bump + refactor: removed absolute code 2020-12-16 23:53:08 +05:30
Liyas Thomas
9e166774ef refactor(ui): faster animations + chore(deps): bump 2020-12-16 06:05:58 +05:30
Liyas Thomas
dd40df4b37 fix: minor UI transitions 2020-12-15 07:58:12 +05:30
Liyas Thomas
afd07562b4 chore(deps): bump 2020-12-15 03:44:20 +05:30
Liyas Thomas
81a6d821c0 feat: confirm modal + chore(deps): bump 2020-12-14 10:35:14 +05:30
Liyas Thomas
858ab252a6 fix: input borders 2020-12-12 19:16:37 +05:30
Liyas Thomas
a56e2bb577 chore(refactor): better inputs 2020-12-12 08:33:29 +05:30
Liyas Thomas
27980cf7c7 fix: tests 2020-12-11 22:39:50 +05:30
Liyas Thomas
5a7bcf32ea chore(refactor): modern UI 2020-12-11 22:24:34 +05:30
Liyas Thomas
773423069b Refactor UI 2020-12-11 15:59:03 +05:30
Liyas Thomas
1e6773deb5 Refactor: Modularize home page (#1372)
* Move HTTP headers section to component

* Move import cURL modal to component

* Move Notes, OAuth token modal to seperate components

* Fix deepcode analysis

* Move parameters section to seperate component

* Move codegen modal to component

* ES6
2020-12-11 05:59:29 +05:30
Liyas Thomas
a95d37d610 Updated screenshots 2020-12-10 16:45:39 +05:30
Liyas Thomas
bdf72eca70 fix: turn off permission of GitHub OAuth app fixed #1377 2020-12-10 16:12:38 +05:30
Liyas Thomas
3acb2a56a2 chore(deps): bump 2020-12-10 08:48:59 +05:30
Liyas Thomas
2f0e9d0681 chore(deps): bump 2020-12-10 01:02:49 +05:30
Hari Narayanan
bfa7eb0c19 export markdown from docs (#1358)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-12-09 10:41:05 +05:30
Andrew Bastin
27d71fb10f Merge pull request #1367 from hoppscotch/feat/gist
Collections and environments + GitHub gist
2020-12-08 23:08:24 -05:00
Andrew Bastin
eeb1ecd2df Added test case for signInUserWithGithub to check if adding 'repo gist' 2020-12-08 23:01:17 -05:00
Andrew Bastin
f21b5768a5 Fixed tests for fb.spec.js 2020-12-08 22:55:41 -05:00
Liyas Thomas
ba08883623 Final gist integration + clean up 2020-12-08 17:50:32 +05:30
Liyas Thomas
b1587950c6 Merge branch 'main' into feat/gist 2020-12-08 14:59:03 +05:30
Liyas Thomas
b473ed7cb7 Allow importing and exporting environments to gist 2020-12-08 12:18:28 +05:30
Liyas Thomas
2978c8adfe Allow importing collections from gist 2020-12-08 12:05:10 +05:30
Liyas Thomas
1f0111256b chore(fonts): bump 2020-12-08 11:07:25 +05:30
Liyas Thomas
346b980a1d Merge pull request #1366 from hoppscotch/main 2020-12-08 09:03:00 +05:30
Liyas Thomas
8000791e17 chore(deps): bump 2020-12-07 20:53:49 +05:30
Liyas Thomas
66077ea6d7 Replaced svg with icon font 2020-12-07 20:37:13 +05:30
Liyas Thomas
3d10a8f86a Initial MVP of GitHub gist support 2020-12-07 14:14:02 +05:30
Liyas Thomas
ebae9880dc Updated license copyright (c) 2020, migrated docker container to organization, chores 2020-12-06 12:04:55 +05:30
Liyas Thomas
2e72c16964 chore(deps): bump husky to v5 2020-12-06 11:00:00 +05:30
Liyas Thomas
6ebaea395d chore(deps): bump 2020-12-05 23:47:26 +05:30
Liyas Thomas
257ee9928f chpore(deps): bump 2020-12-04 23:37:13 +05:30
Liyas Thomas
2ac9f5918a chore(deps): bump + updated sponsor list 2020-12-04 09:59:19 +05:30
Liyas Thomas
9c4767bb68 Merge pull request #1365 from hoppscotch/dependabot/npm_and_yarn/nuxtjs/tailwindcss-3.3.1
Bump @nuxtjs/tailwindcss from 3.3.0 to 3.3.1
2020-12-04 07:09:49 +05:30
dependabot[bot]
cbd82988a8 Bump @nuxtjs/tailwindcss from 3.3.0 to 3.3.1
Bumps [@nuxtjs/tailwindcss](https://github.com/nuxt-community/tailwindcss-module) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/nuxt-community/tailwindcss-module/releases)
- [Changelog](https://github.com/nuxt-community/tailwindcss-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/tailwindcss-module/compare/v3.3.0...v3.3.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-04 00:05:30 +00:00
Liyas Thomas
d0a9445dfc Environment select box - cherry picked from #1359 2020-12-03 11:12:47 +05:30
Liyas Thomas
cd6a9bf9a8 chore(deps): bump 2020-12-03 05:46:26 +05:30
Liyas Thomas
8afead4e39 Set 'Ctrl + I' to reset request - fixed #1356 2020-12-02 10:23:11 +05:30
Karel De Smet
f279471858 Added assertion methods toHaveLength & toBeType (#1357)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-12-02 06:55:37 +05:30
Liyas Thomas
61fe518710 chore(deps): bump + better History UI 2020-12-01 22:26:13 +05:30
Hari Narayanan
b774a59db2 Web Worker regex test (#1354)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-12-01 21:21:13 +05:30
Liyas Thomas
63a1f52482 Set a max-width container wrapper 2020-12-01 05:46:25 +05:30
Liyas Thomas
ab5ea5948b Minor refactoring and code splitting 2020-12-01 05:21:14 +05:30
Liyas Thomas
a8fd0fcd19 Minor refactoring and code splitting 2020-12-01 05:09:16 +05:30
Liyas Thomas
6098d55b57 chore(deps): bump + fixed: #1352 2020-11-30 23:44:39 +05:30
Liyas Thomas
9ba2f80e3a Updated sponsors list 2020-11-30 19:12:03 +05:30
Liyas Thomas
3acf71f253 Updated sponsor list 2020-11-30 18:51:46 +05:30
Liyas Thomas
ad51597bf5 Malayalam + Dutch (#1351)
Co-authored-by: vachan-maker <65799568+vachan-maker@users.noreply.github.com>
Co-authored-by: Karel De Smet <karel.de.smet@outlook.com>
2020-11-30 08:16:16 +05:30
Liyas Thomas
60057eee6a Temporarily removed test case number in tab label. Fixed #1349 2020-11-30 08:14:22 +05:30
Liyas Thomas
3cfd0ba1f8 chore(deps): bump 2020-11-29 20:00:32 +05:30
Liyas Thomas
dec386840a Fixed missing 'Done' button 2020-11-29 13:10:14 +05:30
Liyas Thomas
355b9be3ff chores(deps): bump + fixed og:image 2020-11-28 17:23:10 +05:30
Hari Narayanan
57627367f5 duplicate identifier for requests fixed (#1346)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-11-27 17:12:33 +05:30
Liyas Thomas
a5a812d3f4 Merge pull request #1343 from hariaakash/main
Request method labels & custom method width fix
2020-11-26 06:51:31 +05:30
Hari Narayanan
5426273cf8 custom method width 2020-11-26 00:38:03 +05:30
Hari Narayanan
d9bab319e3 added request method label in collections 2020-11-25 23:54:20 +05:30
Liyas Thomas
77862cdf9b lgtm code review suggestions 2020-11-23 12:32:13 +05:30
Liyas Thomas
b8d68ee359 Modern build, fixed WebSocket freezing on invalid URLs 2020-11-22 07:05:04 +05:30
Liyas Thomas
307e434f91 chore(deps): bump 2020-11-21 23:28:09 +05:30
Liyas Thomas
f60b2eb8af chore(deps): bump 2020-11-20 10:24:30 +05:30
Liyas Thomas
9da1aa1421 Merge pull request #1332 from hoppscotch/dependabot/npm_and_yarn/socket.io-client-3.0.2
Bump socket.io-client from 3.0.1 to 3.0.2
2020-11-18 06:17:21 +05:30
dependabot[bot]
4d3964daeb Bump socket.io-client from 3.0.1 to 3.0.2
Bumps [socket.io-client](https://github.com/socketio/socket.io-client) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/socketio/socket.io-client/releases)
- [Changelog](https://github.com/socketio/socket.io-client/blob/master/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-client/compare/3.0.1...3.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-18 00:07:32 +00:00
Liyas Thomas
b80f9d3517 chore(deps): bump 2020-11-14 06:17:37 +05:30
Liyas Thomas
46981f73a9 Updated sponsors list 2020-11-12 07:31:15 +05:30
Liyas Thomas
9b6394627b fixed #1323 + chore(deps) bump 2020-11-12 06:48:40 +05:30
Liyas Thomas
3a34331cc2 Replacing master branch with main branch 2020-11-11 08:55:44 +05:30
Liyas Thomas
95fe10b312 chore(deps): bump @nuxtjs/gtm 2020-11-11 08:34:00 +05:30
Liyas Thomas
f8d4303531 chore(deps): bump 2020-11-10 06:56:15 +05:30
Andrew Bastin
7d49f75682 Query arguments in GraphQL are shown separately with description (#1319)
* Query arguments in GraphQL are shown separately with description

* Update field.vue

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-11-09 07:16:47 +05:30
Liyas Thomas
a84a8e1a6e chore(deps): bump 2020-11-06 09:17:06 +05:30
Liyas Thomas
1fc2181937 chore(deps): bump 2020-11-05 13:32:27 +05:30
Liyas Thomas
7411f01fb5 Updated test snapshot 2020-11-03 14:06:24 +05:30
Liyas Thomas
2c9c598dd7 Merge branch 'master' of https://github.com/hoppscotch/hoppscotch 2020-11-03 13:48:18 +05:30
Liyas Thomas
3c00a3b1d0 Fixed Axios codegen missing raw post body 2020-11-03 13:47:17 +05:30
Liyas Thomas
660cdb575a Removed absolute Firebase files 2020-11-03 08:01:55 +05:30
Liyas Thomas
f20876a028 chore(deps): bump 2020-11-03 07:17:17 +05:30
Liyas Thomas
b31866cf32 Updated codegen list + removed hacktoberfest prompt 2020-11-02 18:05:29 +05:30
Liyas Thomas
bde27c3880 chore(deps): bump Firebase to v8.0 2020-11-02 14:59:08 +05:30
Liyas Thomas
80cb613888 Removed absolute PWA attributes 2020-11-02 10:33:01 +05:30
Liyas Thomas
23966b1103 Merge pull request #1312 from hoppscotch/sass
Replace node-sass with sass
2020-11-02 07:51:18 +05:30
Liyas Thomas
2fd897064a Replace node-sass with sass 2020-11-02 07:40:26 +05:30
Jyoti Gupta
846298210a [#1190] [Jyoti] Add codegen for nodeJs Unirest support (#1308)
* [#1190] [Jyoti] Add codegen for nodeJs Unirest

* Update and rename node-unirest.js to nodejs-unirest.js

* Update codegen.js

* [Jyoti] update snapshot for node-unirest-codegen

Co-authored-by: Jyoti Gupta <jyoti.gupta@INjyotigupta.local>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-11-02 06:23:13 +05:30
Liyas Thomas
f22e98ccca Updated test snapshots - fixing CI tests 2020-10-30 18:28:09 +05:30
Liyas Thomas
5cb6d10e3d Reorder codegens in alphabetical order 2020-10-30 18:16:34 +05:30
Liyas Thomas
5b4dd74503 Merge pull request #1307 from patidar-jaishree/add-c-libcurl-codegen
[Jaishree] Add C Libcurl Codegen
2020-10-29 18:44:38 +05:30
Jaishree Patidar
cd3cec5d48 [Jaishree] Add C Libcurl Codegen 2020-10-29 17:47:25 +05:30
Liyas Thomas
621888d6d4 Merge pull request #1306 from hoppscotch/fix/1304
Enable Workbox - fix #1304
2020-10-28 17:49:30 +05:30
Liyas Thomas
3e7fcaf764 Enable Workbox 2020-10-28 17:14:55 +05:30
Liyas Thomas
8fb44df59b Merge branch 'master' of https://github.com/hoppscotch/hoppscotch 2020-10-28 06:42:29 +05:30
Liyas Thomas
5b205d6e4a chore(deps): bump 2020-10-28 06:41:42 +05:30
Andrew Bastin
dc98ef8b57 Fix add folder to collections being broken when logged in (#1299)
* Moved add folder modal logic out

* Pass around folder paths for collections to fix folder not applying on
logged in users

* Remove unwanted use of folder value for addFolder store mutation

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-26 06:44:59 +05:30
Kunal Kumar
f9ae242792 Kunal - java-unirest 25 oct 2020 codegen added (#1301) 2020-10-26 00:00:36 +05:30
Shalika Singhal
438640d5b8 added codegen for java OK Http Client (#1300)
* added codegen for  java OK Http Client

* shalika- added snapshot test for -codegen- java -ok http client

* shalika- moving JavaOkHttpClientCodegen in alphabetical order in codegen
2020-10-25 23:07:28 +05:30
Liyas Thomas
078b755fb6 chore(deps-dev): bump 2020-10-24 22:57:37 +05:30
Liyas Thomas
501e01fe23 Update sponsor message 2020-10-24 17:36:33 +05:30
Liyas Thomas
ce992fc205 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2020-10-23 10:21:28 +05:30
Liyas Thomas
8609dedafd chore(deps-dev): bump 2020-10-23 10:20:57 +05:30
Liyas Thomas
66f124b397 Use correct build command - #1295 2020-10-21 18:59:13 +05:30
Andrew Bastin
21cf439210 Added polling schema (#1288)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-21 14:03:03 +05:30
Liyas Thomas
91a7d20923 Lint + ES6 2020-10-21 13:49:02 +05:30
Liyas Thomas
f49c2138de Lint + ES6 2020-10-21 12:20:32 +05:30
Liyas Thomas
774853af7a Remove teams section from Firebase 2020-10-21 10:11:56 +05:30
Farhan Tariq
7e30a4a3d4 Subfolder functionality (#1194)
* Added functionality for sub-folders

* Edit Request name only. Drag and drop to move requests

* Refactor

* Move requests between folder or collections

* Functionality to save request in multiple folders

* Unnecessary Lang

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-21 06:41:45 +05:30
Liyas Thomas
b179731359 sponsor ad 2020-10-20 16:59:54 +05:30
Liyas Thomas
d6409d7152 Fixed selected codegen name, updated deps 2020-10-20 00:24:57 +05:30
Liyas Thomas
eaeefafe39 Lint, ES6, popover for codegen 2020-10-19 18:02:42 +05:30
Ben
59974edf80 feat:add code generator for Shell with HTTPie (#1290)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-19 07:54:07 +05:30
Scott Dutton
37f914d1cc Possible solution for Global variables (#1289)
fix for #1164

This takes enviroments called "Global" or "global" and appends them
after the current scripts.

Seems to work, but proabbly a cleaner way to acheive

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-19 07:41:01 +05:30
Scott Dutton
da92fd705b Replace headers in view (#1287)
fixs #1257

Cant add this in the same place as the URL as you end in an infinate
loop

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-19 07:21:40 +05:30
Liyas Thomas
00505b8af8 chore(deps): bump 2020-10-19 06:43:08 +05:30
Liyas Thomas
22a3bba6ab Cherry picking refactored fb.js from #879 by @AndrewBastin (#1286)
* Cherry picking refactored fb.js from #879 by @AndrewBastin

* Fixed a minor UI glitch in History section

* Removed logout success toast testcase

Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2020-10-17 14:53:19 +05:30
Matthew Crumley
b6b3cbcb9a Add Salesforce Apex codegen (#1285) 2020-10-17 12:39:23 +05:30
Ben
de97048424 feat:add code generator for Ruby Net::HTTP (#1284) 2020-10-17 10:47:26 +05:30
Liyas Thomas
02471e6d60 Lint 2020-10-16 07:10:07 +05:30
Liyas Thomas
edf58ee897 Updated dependencies 2020-10-16 06:31:44 +05:30
Liyas Thomas
5ecfd278d4 i18n (#1277)
* improve pt-br translations

* Update french language

* Added i18n vi-VN translations (#1274)

Co-authored-by: Gustavo Cavalieri Fernandes <gugacavalieri@gmail.com>
Co-authored-by: Thomas Bnt <thomasbnt@protonmail.com>
Co-authored-by: Flyznex <thuanpt.dev@gmail.com>
2020-10-15 11:37:33 +05:30
Liyas Thomas
3327179270 Updated dependencies 2020-10-15 05:57:02 +05:30
Liyas Thomas
98462e8dca Updated deps 2020-10-14 08:51:33 +05:30
Liyas Thomas
2f515164b3 chore: updated deps 2020-10-13 19:08:20 +05:30
Liyas Thomas
3c8ceebedc Merge pull request #1262 from hoppscotch/dependabot/npm_and_yarn/jest-26.5.3
Bump jest from 26.5.2 to 26.5.3
2020-10-12 06:43:19 +05:30
dependabot[bot]
26fe93dfc0 Bump jest from 26.5.2 to 26.5.3
Bumps [jest](https://github.com/facebook/jest) from 26.5.2 to 26.5.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v26.5.2...v26.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-12 00:10:38 +00:00
Andrew Bastin
9113a826ce Added temporary hack to fix GQL trailing space errors 2020-10-11 13:17:49 -04:00
Liyas Thomas
eca1baf53e chore: updated deps 2020-10-11 12:37:32 +05:30
Jeff Sieu
6b3b8e6204 Remove extra console log (#1261)
* Add search bar for collections

* Remove console log

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-11 10:32:28 +05:30
Jeff Sieu
194a4f3adb Add search bar for collections (#1260)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-11 10:22:18 +05:30
Liyas Thomas
054f27083b Merge pull request #1259 from Ldoppea/feature/codegen-csharp-restsharp
feat:add code generator for C# RestSharp
2020-10-11 06:13:22 +05:30
Yannick Chiron
168d1dc678 feat:add code generator for C# RestSharp 2020-10-11 00:58:02 +02:00
Ldoppea
8cc5c62665 fix:add 'helpers' folder to docker compose volumes (#1258) 2020-10-10 16:52:02 +05:30
Raul Piraces Alastuey
82c874afb5 Add: Shell wget codegen (#1256)
* Add: Shell wget codegen

* Add missing snapshot for tests
2020-10-09 19:44:49 +05:30
YE Qing
1afd0381c1 Run tests against all codegen instead of individual ones (#1255)
* run tests against all codegens instead of individual ones

* table testing

* fixture is no longer needed

Co-authored-by: Qing Ye <ye.qing@go-jek.com>
2020-10-09 14:04:12 +05:30
Liyas Thomas
5f5589f1f1 Merge pull request #1254 from hoppscotch/dependabot/npm_and_yarn/firebase-7.23.0
Bump firebase from 7.22.1 to 7.23.0
2020-10-09 06:27:07 +05:30
dependabot[bot]
1cee408113 Bump firebase from 7.22.1 to 7.23.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.22.1 to 7.23.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.22.1...firebase@7.23.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-09 00:04:55 +00:00
luthrap
92854b9e84 Python http client codegen (#1252)
* add codegen for python http client

* update print header function
2020-10-08 23:29:00 +05:30
Liyas Thomas
a4c5817b54 Use function as default value for array prop 2020-10-08 20:00:20 +05:30
Liyas Thomas
6c82680066 Merge pull request #1249 from yq314/add-nodejs-native-codegen 2020-10-08 19:58:06 +05:30
Liyas Thomas
6135bc716e Merge branch 'master' into add-nodejs-native-codegen 2020-10-08 14:41:42 +05:30
Liyas Thomas
1639ea7552 Merge pull request #1250 from hoppscotch/dependabot/npm_and_yarn/nuxtjs/pwa-3.1.2
Bump @nuxtjs/pwa from 3.1.0 to 3.1.2
2020-10-08 09:31:06 +05:30
dependabot[bot]
bea8c89d9f Bump @nuxtjs/pwa from 3.1.0 to 3.1.2
Bumps [@nuxtjs/pwa](https://github.com/nuxt-community/pwa-module) from 3.1.0 to 3.1.2.
- [Release notes](https://github.com/nuxt-community/pwa-module/releases)
- [Changelog](https://github.com/nuxt-community/pwa-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/pwa-module/compare/v3.1.0...v3.1.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-08 00:06:41 +00:00
Qing Ye
fe1618d1d8 move test data to __fixtures__ 2020-10-08 00:17:58 +08:00
Qing Ye
30250e1afa add codegen for nodejs native and instrument snapshot tests 2020-10-08 00:10:02 +08:00
Liyas Thomas
16f02e2544 Updated contributors and sponsors list 2020-10-07 14:21:39 +05:30
Liyas Thomas
123f4a3931 Updated contributors and sponsors list 2020-10-07 14:10:45 +05:30
YE Qing
ce5fb78bcd Fix form post data parsing (#1248)
Co-authored-by: Qing Ye <ye.qing@go-jek.com>
2020-10-07 08:51:03 +05:30
Liyas Thomas
2ccd053b0a Disable workbox 2020-10-07 07:22:44 +05:30
Liyas Thomas
3422ccef15 Downgrade pwa dep 2020-10-07 06:47:21 +05:30
Liyas Thomas
630663ec83 Merge branch 'master' of https://github.com/hoppscotch/hoppscotch 2020-10-07 05:54:13 +05:30
Liyas Thomas
37c6bf3a3f Updated dependencies 2020-10-07 05:47:09 +05:30
YE Qing
1c2963a1e0 add codegen for python-requests (#1244)
Co-authored-by: Qing Ye <ye.qing@go-jek.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-06 22:56:10 +05:30
Liyas Thomas
50a5b0f7db Updated all dependencies 2020-10-06 06:20:06 +05:30
Yasio
df933bb928 Add PHP CURL codegenerator (#1238)
* add php-curl codegen

* fix codegen name casing
2020-10-05 23:03:44 +05:30
Léo Martin
aa85108f1a Use socket.io echo server (#1237) 2020-10-05 22:07:03 +05:30
Andrew Bastin
c778a28f2b Fixed improper page title definition 2020-10-04 22:29:07 -04:00
Liyas Thomas
48142721ac I18n (#1235)
Co-authored-by: CHALOPIN Clément <clement.chalopin@gmail.com>
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
Co-authored-by: Fiki Maulana <fikimaul@gmail.com>
Co-authored-by: Shunjid Rahman Showrov <shunjid.rahman@gmail.com>
Co-authored-by: Adrian Skar <adrian@adrianskar.com>
Co-authored-by: Lucas Queiroz <me@lucasqueiroz.dev>
Co-authored-by: piraces <raul.piraces@gmail.com>
Co-authored-by: vachan-maker <65799568+vachan-maker@users.noreply.github.com>
2020-10-05 07:07:02 +05:30
Liyas Thomas
826e3ebc5e Added default Socket.io URL - fixed #1231 2020-10-05 05:31:48 +05:30
Léo Martin
0f31259c97 Allow multiple arguments with socket.io (#1234)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-05 05:11:56 +05:30
Raul Piraces Alastuey
881d7fa5ee Add: Powershell RestMethod codegen (#1233) 2020-10-05 04:50:50 +05:30
Raul Piraces Alastuey
d479425333 Add: JS jQuery codegen (#1232)
* Add: JS jQuery codegen

* Remove console.log
2020-10-04 20:49:07 +05:30
Yasio
cb944bcfb2 Add nodejs request codegenerator (#1227)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-10-04 18:11:07 +05:30
Yasio
745683f2a8 Fix: passing auth into codegen (#1226) 2020-10-04 18:04:21 +05:30
Liyas Thomas
e019935545 Merge pull request #1220 from LeoMartinDev/feat/filter-graphql-fields 2020-10-04 16:17:53 +05:30
Liyas Thomas
9601477bba Merge branch 'master' into feat/filter-graphql-fields 2020-10-04 16:04:40 +05:30
Liyas Thomas
0702ca3fc9 Highlight filtered field and type 2020-10-04 16:01:19 +05:30
leoGeorges
d9a9ae7e72 Merge branch 'feat/filter-graphql-fields' of https://github.com/LeoMartinDev/hoppscotch into feat/filter-graphql-fields 2020-10-04 11:46:35 +02:00
leoGeorges
76eba3d638 Graphql: highlight fields on search 2020-10-04 11:46:16 +02:00
Liyas Thomas
69a448b4c1 Merge pull request #1223 from tonybatty/bug/http-page-headers-suggestions-are-overlapped
Fix: http page headers suggestions overlapped issue
2020-10-04 05:41:19 +05:30
tonybatty
a8d9a64f79 http page headers suggestions overlapped issue fixes #1222 2020-10-03 19:42:07 +01:00
Andrew Bastin
1546727612 Merge branch 'master' into feat/filter-graphql-fields 2020-10-03 13:10:22 -04:00
Liyas Thomas
dfdcc05d3e Merge pull request #1221 from tonybatty/bug/ios-home-bar-covers-content 2020-10-03 21:37:11 +05:30
leoGeorges
12941a107d Use normalized text 2020-10-03 17:36:26 +02:00
tonybatty
a94d46e005 fixes #1003 ios home bar covers content 2020-10-03 16:34:40 +01:00
leoGeorges
acb777c236 Remove debug code 2020-10-03 17:33:03 +02:00
leoGeorges
7e87cc1923 Add search input & capability to graphql types and fields 2020-10-03 17:24:26 +02:00
Saswata Mukherjee
1ad23f4ed8 Fix: GET requests for Go codegen (#1216) 2020-10-03 12:36:55 +05:30
Saswata Mukherjee
1bcba17f76 Add native Golang codegen (#1215) 2020-10-03 12:20:20 +05:30
Liyas Thomas
cb871f6a88 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2020-10-02 05:59:35 +05:30
Liyas Thomas
6d2c296a7d chore: updated dependencies 2020-10-02 05:59:16 +05:30
Liyas Thomas
3434a1f5a6 Create codeql-analysis.yml 2020-10-01 08:05:55 +05:30
CHALOPIN Clément
f9c45d95e1 Add: js axios codegen (#1199) 2020-10-01 06:32:22 +05:30
Liyas Thomas
0bd051a7a9 chore: updated dependencies 2020-10-01 06:26:13 +05:30
Liyas Thomas
d4789463ad Improving code quality as per LGTM review 2020-09-30 21:02:19 +05:30
Liyas Thomas
7190a25550 Added Hacktoberfest announcement 2020-09-30 14:21:22 +05:30
Liyas Thomas
04bc8308ac Fixed #1195 2020-09-29 23:46:31 +05:30
Liyas Thomas
68c67fbd32 Turn off GitHub Pages 2020-09-29 23:42:09 +05:30
Liyas Thomas
50fd8926d6 Fixed #1197 2020-09-29 23:40:33 +05:30
Liyas Thomas
7e1e61f8af chores: Lint + dependency update 2020-09-27 23:34:15 +05:30
Andrew Bastin
ee066d7859 Use the new separated codegen for code generation 2020-09-25 23:45:36 -04:00
Andrew Bastin
54a48f9493 Added codegen registrar 2020-09-25 23:45:18 -04:00
Andrew Bastin
70fc0789d6 Added separated code generator code for cURL, JS Fetch and JS XHR 2020-09-25 23:38:33 -04:00
Liyas Thomas
66cd75dce8 Moved utility functions from assets to helpers 2020-09-26 07:57:45 +05:30
Liyas Thomas
8b3b6a471b chore: dependency updates, minor UI fixes 2020-09-26 07:09:26 +05:30
Liyas Thomas
e707fcda05 chore: dependency updates, minor UI updates, better color schemes 2020-09-25 06:39:21 +05:30
Liyas Thomas
a3574acabd Fixed hidden overflow on inputs 2020-09-24 23:31:43 +05:30
Liyas Thomas
f36db182f1 Better color schemes, minor UI fixes 2020-09-24 22:52:17 +05:30
Liyas Thomas
59e492b2a6 Merge branch 'refactor' 2020-09-24 21:39:14 +05:30
Liyas Thomas
6380063978 Upstream 2020-09-24 21:37:27 +05:30
Liyas Thomas
2686873163 Cleanup stale files/codes 2020-09-24 21:31:56 +05:30
Moulik Aggarwal
b2ef26600c Fix Quality Issues using DeepSource (#1183)
Co-authored-by: DeepSource Bot <bot@deepsource.io>
2020-09-24 20:46:20 +05:30
Liyas Thomas
e94fdcad32 Color modes (#1181) 2020-09-24 08:22:54 +05:30
Liyas Thomas
2e423b101b Refactoring based on LGTM analysis 2020-09-23 17:54:52 +05:30
Liyas Thomas
91677a41d4 Update README.md 2020-09-23 13:34:02 +05:30
Liyas Thomas
b747d0273c Feat/tailwind (#1179) 2020-09-22 22:36:37 +05:30
Matthew Jarman
45fb612793 Add check for active suggestion (#1180) 2020-09-21 22:14:16 +05:30
Liyas Thomas
db081d3197 Updated all major dependencies 2020-09-21 21:04:55 +05:30
Liyas Thomas
423eaa5462 Fixed broken GraphQL mock query 2020-09-21 11:20:42 +05:30
Liyas Thomas
f38dde160e Updated all non-major dependencies to latest 2020-09-21 06:03:40 +05:30
Andrew Bastin
782eb29aac Fixed url-field bug with caret reset due to v-model update 2020-09-20 00:57:09 -04:00
Andrew Bastin
5810c5544a Fixed bug with restore from history not working in new URL field 2020-09-19 01:30:22 +00:00
Liyas Thomas
b6eb581192 Revert last commit 2020-09-18 16:05:50 +05:30
Liyas Thomas
54171e566a FIxed broken restore history on new URL bar 2020-09-18 16:01:58 +05:30
Liyas Thomas
b7a44ab11f Experiments (#1174)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2020-09-18 08:58:11 +05:30
Andrew Bastin
4ea60d3431 Added temporary fix for the trailing null character from extension
requests
2020-09-17 21:36:36 -04:00
Liyas Thomas
9840ebfe33 Updated all non-major dependencies 2020-09-18 06:18:54 +05:30
Liyas Thomas
af2b726a38 chore: dependency updates + fixed a minor bug with edit folder 2020-09-17 06:08:26 +05:30
Liyas Thomas
d425a1b2c0 Merge pull request #1169 from hoppscotch/snyk-fix-3786512203b7ce5e8de4cfb302b63900
[Snyk] Security upgrade firebase-admin from 9.1.1 to 9.2.0
2020-09-16 16:04:39 +05:30
snyk-bot
687b0ac3bd fix: functions/package.json & functions/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-NODEFORGE-598677
2020-09-16 08:47:23 +00:00
Liyas Thomas
3978dd9b07 Updated all non-major dependencies to latest 2020-09-15 06:49:03 +05:30
Liyas Thomas
d9f78b9d5c Fixed #1161 2020-09-14 15:09:44 +05:30
Liyas Thomas
81e638a7e0 chore: updated all non-major dependencies 2020-09-14 07:35:58 +05:30
Liyas Thomas
6dc906a604 🐛 Fixed #1160 2020-09-11 14:12:10 +05:30
Liyas Thomas
005db4d0e8 Fixed #1159 2020-09-11 15:07:57 +05:30
dependabot[bot]
41127da7d9 Bump node-fetch from 2.6.0 to 2.6.1 in /functions (#1158)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-11 05:52:51 +05:30
Liyas Thomas
3111b8d395 📦 Updated all non-major dependencies 2020-09-11 05:38:12 +05:30
Liyas Thomas
89f2647ead 📦 Updated all major dependencies 2020-09-10 19:07:49 +05:30
Liyas Thomas
084a432741 Merge branch 'master' of https://github.com/hoppscotch/hoppscotch into master 2020-09-10 05:46:13 +05:30
Liyas Thomas
1f071d1608 Updated all non-major dependencies 2020-09-10 05:45:56 +05:30
Liyas Thomas
3f75d0df56 Make use of GitHub sponsor API 2020-09-09 12:05:22 +05:30
Liyas Thomas
ba108fe23a Updated all non-major dependencies 2020-09-09 05:47:43 +05:30
Florin Mirosnicencu
ab736cf975 Handle postman subfolders when importing json (#1150) 2020-09-08 20:44:40 +05:30
Liyas Thomas
c36239772e Updated all non-major dependencies 2020-09-07 14:32:30 +05:30
Liyas Thomas
286090d58a Fixed #1146 2020-09-06 19:05:15 +05:30
Liyas Thomas
69fda864db Merge branch 'master' of https://github.com/hoppscotch/hoppscotch into master 2020-09-06 14:27:20 +05:30
Liyas Thomas
2709c5d332 Fixed typo, updated sponsors list 2020-09-06 14:26:54 +05:30
Scott Dutton
da5fdd54bd Import postman variables correctly (#1142)
Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2020-09-05 12:07:37 +05:30
Tiago Filipe Silva
92e7453c31 Lossless optimized images (#1141) 2020-09-05 12:01:42 +05:30
Liyas Thomas
a59e1a2015 Updated Sponsors list with GitHub sponsors 2020-09-04 16:51:27 +05:30
Liyas Thomas
838eb845d4 Merge branch 'master' of https://github.com/postwoman-io/postwoman into master 2020-09-04 06:35:50 +05:30
Liyas Thomas
f69fdc634a 📦 Updated all non-major dependencies 2020-09-04 06:35:22 +05:30
Liyas Thomas
9c0e7272ff I18n (#1138)
Co-authored-by: Gustavo Cavalieri <gugacavalieri@gmail.com>
Co-authored-by: Antonio Almeida <promatik@gmail.com>
Co-authored-by: Burak Sakallı <buraksakalli06@gmail.com>
Co-authored-by: Nisgrak <eneko.rodriguez99@gmail.com>
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
Co-authored-by: Junseo Park <wonderbotsupport@naver.com>
Co-authored-by: Jinseok Jeong <checkitup@hotmail.com>
2020-09-03 14:27:40 +05:30
Liyas Thomas
515afdc5ae Updated all non-major dependencies 2020-09-02 05:54:05 +05:30
Liyas Thomas
f32fa485e0 Merge branch 'master' of https://github.com/postwoman-io/postwoman into master 2020-09-01 06:05:09 +05:30
Liyas Thomas
a5187801b4 Updated all non-major dependencies 2020-09-01 06:04:43 +05:30
Liyas Thomas
6cb11d6a61 Added email address for contact 2020-08-31 13:23:39 +05:30
Liyas Thomas
1e91ca5eda Added default BASE_URL env variable 2020-08-30 11:21:42 +05:30
Liyas Thomas
210727ea0e Added default BASE_URL env variable 2020-08-30 11:10:19 +05:30
Liyas Thomas
f429585447 Removed @nuxtjs/dotenv (#1128)
* Removed `@nuxtjs/dotenv`

* Removed `@nuxtjs/dotenv`

* Fix broken tests

Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2020-08-29 23:10:06 +05:30
Andrew Bastin
759a3f17cc Merge pull request #1126 from hoppscotch/tests
tests: improve test suite
2020-08-29 12:41:08 -04:00
jamesgeorge007
de7d1c2baa refactor: helper to compute suggestions 2020-08-29 22:09:12 +05:30
James George
8223011c3d chore: rename exported files (#1127)
* chore: rename to hoppscotch-collection.json

* chore: rename to hoppscotch-environment.json
2020-08-29 13:11:49 +05:30
Andrew Bastin
53684d6fbb Add test spec for components/ui/autocomplete.vue 2020-08-29 00:25:46 -04:00
Andrew Bastin
31cefd7dd0 Remove use of keyboardevent.which as its deprecated in autocomplete 2020-08-29 00:24:54 -04:00
Liyas Thomas
993a8f83ff 📦 Updated all non-major dependencies 2020-08-28 00:12:27 +05:30
Liyas Thomas
fd1e00986c 📦 Updated all non-major dependencies 2020-08-27 23:28:31 +05:30
Liyas Thomas
62028d1273 Reset file input value after operations - fixed #1124 2020-08-27 13:56:55 +05:30
Liyas Thomas
240ae25a90 📦 Updated all minor dependencies 2020-08-27 05:38:38 +05:30
Andrew Bastin
2bd242a164 jsonParse now validates for array as root JSONs
fixes #1097
2020-08-26 18:21:37 -04:00
Andrew Bastin
4b87684611 Updated debounce test spec to use jest timers 2020-08-26 12:14:47 -04:00
Andrew Bastin
3cd2a2a0f9 Added test spec for components/ui/pw-toggle.vue 2020-08-25 22:59:46 -04:00
Liyas Thomas
dc129eeb7d Fixed word wrap on 'Send' button - resolves #1116 2020-08-26 07:30:40 +05:30
Liyas Thomas
fb3f426688 📦 Updated all minor dependencies 2020-08-26 06:02:03 +05:30
Andrew Bastin
f33ebbcce0 Add test spec for components/ui/tabs.vue 2020-08-25 15:44:16 -04:00
Liyas Thomas
86922df61a Detect browser language and always redirect to locale - fixed #1108 2020-08-25 21:55:23 +05:30
Liyas Thomas
2916ab502e Announcement banner 2020-08-25 13:27:59 +05:30
Liyas Thomas
9c24fcec0d Merge pull request #1115 from HerbertChu/socket-io-path
support user to customize the path to socket-io server
2020-08-25 12:55:57 +05:30
herbertc
8258997f3e support user to customize the path to socket-io server 2020-08-25 15:16:38 +08:00
Liyas Thomas
ef714c3903 Updated Shortcuts wiki 2020-08-25 08:11:58 +05:30
Liyas Thomas
76c0874f0e 📦 Updated all non-major dependencies 2020-08-25 06:51:47 +05:30
Andrew Bastin
9166f734c9 Add test spec for components/ui/tab.vue 2020-08-24 15:42:48 -04:00
Andrew Bastin
368421a498 added jest-dom as dev dependency and added jest setup script 2020-08-24 15:41:59 -04:00
Andrew Bastin
c8d8c68b95 corrected typo for gql component test spec folder name 2020-08-24 14:23:15 -04:00
Khaleel Gibran
e68cd3c47f replace postwoman with hoppscotch values (#1111)
Replace Postwoman with Hoppscotch
2020-08-24 19:50:09 +05:30
Liyas Thomas
1732d7e707 Merge pull request #1109 from sebastianwd/patch-1 2020-08-24 10:53:27 +05:30
Sebastian Luque
da0d778b25 Typos in spanish translation 2020-08-23 23:52:45 -05:00
Andrew Bastin
b8bd0cc63a Add test spec for components/graphql/field.vue 2020-08-23 21:39:21 -04:00
Andrew Bastin
5150e13121 Removed unused fieldString computed property in gql/field.vue 2020-08-23 21:39:21 -04:00
Liyas Thomas
b2f784eeff Update README.md 2020-08-24 05:49:59 +05:30
Liyas Thomas
ad98284caf Add HOST 0.0.0.0 2020-08-24 05:45:35 +05:30
Liyas Thomas
6915ea70ca Add host 0.0.0.0 2020-08-24 05:18:02 +05:30
Liyas Thomas
26eb99d4a7 Redirect 2020-08-24 04:52:57 +05:30
Andrew Bastin
e1eb1be781 Add test spec for components/graphql/type.vue 2020-08-23 17:40:32 -04:00
Andrew Bastin
b536e191b1 Remove unused graphql/argument component 2020-08-23 15:48:05 -04:00
Andrew Bastin
f1b475b966 Add test spec for components/graphql/typelink.vue 2020-08-23 14:46:36 -04:00
Liyas Thomas
23a61d400d Add host: 0.0.0.0 to server property. #1099 2020-08-23 18:47:57 +05:30
Liyas Thomas
4ae8308663 Updated icon locations 2020-08-23 17:03:49 +05:30
Liyas Thomas
c3d6343edb Updated social share images 2020-08-23 16:47:48 +05:30
Liyas Thomas
1059d2ddbd Updated screenshots 2020-08-23 16:43:35 +05:30
Liyas Thomas
10ecc27bb5 Updated screenshots 2020-08-23 16:40:53 +05:30
Liyas Thomas
0c3c540051 Updated image assets 2020-08-23 16:21:49 +05:30
Liyas Thomas
c44dba5e92 Merge pull request #1107 from hoppscotch/a11y
♥ a11y
2020-08-23 13:38:22 +05:30
Liyas Thomas
82da7d0b24 Map DELETE method Alt + X 2020-08-23 11:16:25 +05:30
Liyas Thomas
4dd522eda4 Merge branch 'a11y' of https://github.com/postwoman-io/postwoman into a11y 2020-08-23 09:25:49 +05:30
Liyas Thomas
bbe300e847 Updated keyboard shortcuts 2020-08-23 09:23:34 +05:30
Andrew Bastin
dd667e5b4a Merge branch 'master' into a11y 2020-08-22 23:27:45 -04:00
Andrew Bastin
6f013de8e4 Added test spec for helpers/strategies/ExtensionStrategy.js 2020-08-22 23:25:35 -04:00
Andrew Bastin
96a6289911 Fixed a typo in decodeB64StringToArrayBuffer line for proxy-extension
request
2020-08-22 23:25:35 -04:00
Andrew Bastin
e0970fc69d Remove No-Proxy test stubs from AxiosStrategy-Proxy.spec.js 2020-08-22 23:25:35 -04:00
Liyas Thomas
5cafc7bb37 ❤️ ally 2020-08-23 08:41:04 +05:30
Liyas Thomas
2b755c0497 Updated all minor dependencies 2020-08-23 05:48:18 +05:30
Andrew Bastin
e3beae244d Add test spec for helpers/strategies/AxiosStrategy.js 2020-08-21 23:12:28 -04:00
Andrew Bastin
c2ec7be719 Modify AxiosStrategy to allow for some testing 2020-08-21 23:12:27 -04:00
Liyas Thomas
ed5d9132d3 📦 Updated all non-major dependencies 2020-08-21 06:05:50 +05:30
Liyas Thomas
8654db534b 📦 Updated all non-major dependencies 2020-08-21 06:00:11 +05:30
Andrew Bastin
e20299eb94 Added test spec for helpers/lenses/lenses.js 2020-08-20 20:08:45 -04:00
Andrew Bastin
1f65907f70 Export lenses array for helping testing 2020-08-20 20:07:59 -04:00
Liyas Thomas
6a55c09328 Fixed #1098 2020-08-20 19:54:12 +05:30
Andrew Bastin
9734e4d859 Add test spec for helpers/network.js 2020-08-19 16:16:49 -04:00
Andrew Bastin
4f93bc5721 Added test spec for helpers/platformutils.js 2020-08-19 01:37:38 -04:00
Andrew Bastin
73dc0b1cfa Added test spec for helpers/jsonParse.js 2020-08-19 01:08:02 -04:00
Andrew Bastin
e31979002f Add test spec for helpers/editorutils.js 2020-08-19 00:43:47 -04:00
Andrew Bastin
4be1e527fc Add application/vnd.api+json as a valid JSON mime to editorutils 2020-08-19 00:41:06 -04:00
Andrew Bastin
45332b3202 Added test spec for helpers/util/uri.js 2020-08-18 23:15:42 -04:00
Liyas Thomas
cb0258cb58 Merge pull request #1096 from hoppscotch/dependabot/npm_and_yarn/nuxt-i18n-6.13.10 2020-08-19 08:17:20 +05:30
dependabot[bot]
f3d80f28fd Bump nuxt-i18n from 6.13.9 to 6.13.10
Bumps [nuxt-i18n](https://github.com/nuxt-community/i18n-module) from 6.13.9 to 6.13.10.
- [Release notes](https://github.com/nuxt-community/i18n-module/releases)
- [Changelog](https://github.com/nuxt-community/i18n-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/i18n-module/compare/v6.13.9...v6.13.10)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-19 00:03:03 +00:00
Andrew Bastin
4b73ee3d41 Added test spec for helpers/utils/debounce.js 2020-08-18 14:34:46 -04:00
Andrew Bastin
e0e2e0c2fb Added test spec for helpers/util/contenttypes.js 2020-08-18 14:13:52 -04:00
Andrew Bastin
f2b977c941 isJSONContentType returns false for null/undefined 2020-08-18 14:13:20 -04:00
Andrew Bastin
9fe10fd9a2 Added test spec for helpers/utils/b64.js 2020-08-18 14:01:04 -04:00
Liyas Thomas
6b444d280a Merge pull request #1095 from thierrydev/patch-1 2020-08-18 13:01:54 +05:30
Thierry Meliot
10c2acf410 Update README.md
Updated the second Telegram URL
2020-08-18 08:53:21 +02:00
Liyas Thomas
6bb5908aba Merge pull request #1088 from hoppscotch/tests 2020-08-18 08:22:15 +05:30
Liyas Thomas
f54b24b4da Merge pull request #1093 from hoppscotch/dependabot/npm_and_yarn/nuxtjs/pwa-3.0.1 2020-08-18 06:41:51 +05:30
dependabot[bot]
ef3c548c98 Bump @nuxtjs/pwa from 3.0.0 to 3.0.1
Bumps [@nuxtjs/pwa](https://github.com/nuxt-community/pwa-module) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/nuxt-community/pwa-module/releases)
- [Changelog](https://github.com/nuxt-community/pwa-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/pwa-module/compare/v3.0.0...v3.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-18 00:02:15 +00:00
Liyas Thomas
820690a073 Lock package 2020-08-18 02:45:44 +05:30
Liyas Thomas
63cf4f0045 Merge branch 'master' into tests 2020-08-18 08:14:28 +05:30
Liyas Thomas
deecbdd124 Update dependencies 2020-08-18 02:41:45 +05:30
Andrew Bastin
07f790dda0 Added test spec for helper/utils/valid.js 2020-08-17 22:10:47 -04:00
Andrew Bastin
a91b1ecf1f Added babel-core dev dependency 2020-08-17 19:38:17 -04:00
Liyas Thomas
4f75dd30fe Fix broken mobile responsiveness and URL input type 2020-08-17 17:04:13 +05:30
Liyas Thomas
629ee3e33f Merge pull request #1091 from hoppscotch/svgicons 2020-08-17 21:56:34 +05:30
Liyas Thomas
54e06d26bc Merge pull request #1090 from hoppscotch/autoimport 2020-08-17 18:41:43 +05:30
Liyas Thomas
dda26b7a3f Auto import components 2020-08-17 18:37:54 +05:30
Liyas Thomas
e86a17980b Auto import components 2020-08-17 18:29:14 +05:30
Liyas Thomas
23068450ed Remove stale file 2020-08-17 16:15:37 +05:30
Liyas Thomas
3924370b3e Introduce component wrapper for svg icons 2020-08-17 16:07:36 +05:30
Liyas Thomas
f57ac978ae Tests 2020-08-17 09:22:02 +05:30
Liyas Thomas
e68ad7331f Added default value to BASE_URL 2020-08-17 08:19:23 +05:30
Liyas Thomas
9b5fb4bde1 Add BASE_URL to environment variables 2020-08-17 07:49:11 +05:30
Liyas Thomas
a8f1fb5148 Merge pull request #1087 from hoppscotch/v2 2020-08-17 07:43:43 +05:30
Liyas Thomas
65185ecb77 Merge branch 'master' into v2 2020-08-17 07:26:19 +05:30
Liyas Thomas
14a68f24e4 Updated instances of Postwoman 2020-08-17 07:24:25 +05:30
Liyas Thomas
16a93c2b7e Merge pull request #1086 from hoppscotch/v2 2020-08-17 06:57:21 +05:30
Liyas Thomas
925690fb00 Fix conflicts 2020-08-17 06:52:38 +05:30
Liyas Thomas
dc279bc335 Updated dependencies 2020-08-17 06:49:33 +05:30
Liyas Thomas
d1d759e86f Merge branch 'master' into v2 2020-08-17 06:45:10 +05:30
Liyas Thomas
82a30fbd25 Updated dependencies 2020-08-17 06:41:25 +05:30
Liyas Thomas
12fea29f48 Merge pull request #1085 from hoppscotch/dependabot/npm_and_yarn/eslint-7.7.0 2020-08-17 06:38:59 +05:30
dependabot[bot]
b602f7c03f Bump eslint from 7.6.0 to 7.7.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.6.0 to 7.7.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.6.0...v7.7.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-17 00:10:14 +00:00
Liyas Thomas
a20ab981a7 Merge pull request #1071 from hoppscotch/v2 2020-08-16 22:21:41 +05:30
Liyas Thomas
9ae08cecf2 Merge branch 'master' into v2 2020-08-16 22:17:35 +05:30
Joel Camus Bueno
c9cd7b4344 Issue/1080 (#1081) 2020-08-16 17:26:33 +05:30
Liyas Thomas
24b587762a Lint 2020-08-16 05:48:00 +05:30
Joel Camus Bueno
18a2fb38d1 Issue/1078 (#1079)
* Externalize property of deletion messages (Collection) #1078

* Externalize property of deletion messages (folder) #1078

* Externalize property of deletion messages (request) #1078

* Externalize property of deletion messages (environment) #1078

* Externalize property (fr-FR.json) of deletion messages (collection, folder, request, environment) #1078

* Externalize property (pt-PT.json) of deletion messages (collection, folder, request, environment) #1078

* Externalize property (pt-BR.json) of deletion messages (collection, folder, request, environment) #1078

* Updating the Spanish file  (es-ES)
2020-08-15 20:30:00 +05:30
Joel Camus Bueno
5f47cdb763 Issue/1076 (#1077) 2020-08-15 16:57:14 +05:30
Liyas Thomas
e5a18b6e4c Fixed typo 2020-08-14 18:16:46 +05:30
Liyas Thomas
519976eb0b Merge pull request #1072 from postwoman-io/dependabot/npm_and_yarn/firebase-7.18.0
Bump firebase from 7.17.2 to 7.18.0
2020-08-14 06:54:21 +05:30
dependabot[bot]
b630fbc641 Bump firebase from 7.17.2 to 7.18.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.17.2 to 7.18.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.17.2...firebase@7.18.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-14 00:05:57 +00:00
Liyas Thomas
2369a22d23 Typos 2020-08-13 16:54:27 +05:30
Liyas Thomas
124d9ff269 v2 2020-08-13 16:50:02 +05:30
Liyas Thomas
1c95ac7f07 Merge pull request #1066 from Reflex-Gravity/master
Fixed broken tick icons placement in Settings
2020-08-11 08:39:16 +05:30
Joel DSouza
54169fe22b Fixed broken tick icons placement in Settings 2020-08-11 06:34:36 +05:30
Liyas Thomas
4707b78c1f Merge pull request #1064 from postwoman-io/dependabot/npm_and_yarn/yargs-parser-19.0.1
Bump yargs-parser from 18.1.3 to 19.0.1
2020-08-10 06:15:02 +05:30
dependabot[bot]
95d91efe52 Bump yargs-parser from 18.1.3 to 19.0.1
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.3 to 19.0.1.
- [Release notes](https://github.com/yargs/yargs-parser/releases)
- [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.3...v19.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-10 00:37:36 +00:00
Liyas Thomas
fc0c7f536b Merge pull request #1063 from postwoman-io/dependabot/npm_and_yarn/start-server-and-test-1.11.3 2020-08-10 06:05:52 +05:30
dependabot[bot]
80f1cfc72d Bump start-server-and-test from 1.11.2 to 1.11.3
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.11.2 to 1.11.3.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.11.2...v1.11.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-10 00:04:52 +00:00
Liyas Thomas
628012fb49 Merge pull request #1054 from postwoman-io/dependabot/npm_and_yarn/graphql-language-service-interface-2.4.1
Bump graphql-language-service-interface from 2.4.0 to 2.4.1
2020-08-07 07:42:54 +05:30
dependabot[bot]
a29498e911 Bump graphql-language-service-interface from 2.4.0 to 2.4.1
Bumps [graphql-language-service-interface](https://github.com/graphql/graphiql) from 2.4.0 to 2.4.1.
- [Release notes](https://github.com/graphql/graphiql/releases)
- [Changelog](https://github.com/graphql/graphiql/blob/main/CHANGELOG.md)
- [Commits](https://github.com/graphql/graphiql/compare/graphql-language-service-interface@2.4.0...graphql-language-service-interface@2.4.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-07 02:09:28 +00:00
Liyas Thomas
3d460b5862 Merge pull request #1055 from postwoman-io/dependabot/npm_and_yarn/firebase-7.17.2
Bump firebase from 7.17.1 to 7.17.2
2020-08-07 07:37:03 +05:30
Liyas Thomas
4acb2a5d92 Merge branch 'master' into dependabot/npm_and_yarn/firebase-7.17.2 2020-08-07 07:32:07 +05:30
Liyas Thomas
47c800b78b Merge pull request #1053 from AndrewBastin/feat/extension-setting 2020-08-07 06:45:24 +05:30
dependabot[bot]
a20da8036f Bump firebase from 7.17.1 to 7.17.2
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.17.1 to 7.17.2.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.17.1...firebase@7.17.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-07 00:07:29 +00:00
Andrew Bastin
7897118fbd i10n for extension version display 2020-08-06 14:46:55 -04:00
Andrew Bastin
0246e09595 Extension Version is reported on the settings page 2020-08-06 14:40:41 -04:00
Liyas Thomas
72ad37456a Removed all instances of the term 'Postman' 2020-08-06 11:03:50 +05:30
Liyas Thomas
83ec0a6c76 Merge pull request #1050 from postwoman-io/dependabot/npm_and_yarn/sass-loader-9.0.3
Bump sass-loader from 9.0.2 to 9.0.3
2020-08-06 08:16:58 +05:30
dependabot[bot]
63f77b0dc5 Bump sass-loader from 9.0.2 to 9.0.3
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v9.0.2...v9.0.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-06 02:40:28 +00:00
Liyas Thomas
798d2e0e6b Merge pull request #1051 from postwoman-io/dependabot/npm_and_yarn/nuxtjs/axios-5.12.1
Bump @nuxtjs/axios from 5.12.0 to 5.12.1
2020-08-06 08:08:15 +05:30
dependabot[bot]
fd098b5440 Bump @nuxtjs/axios from 5.12.0 to 5.12.1
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.12.0 to 5.12.1.
- [Release notes](https://github.com/nuxt-community/axios-module/releases)
- [Changelog](https://github.com/nuxt-community/axios-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/axios-module/compare/v5.12.0...v5.12.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-06 00:08:12 +00:00
Liyas Thomas
11d30e409c 💄 Updated fonts to latest version 2020-08-04 09:39:52 +05:30
Andrew Bastin
6cb5ae246d Merge pull request #1044 from postwoman-io/dependabot/npm_and_yarn/cypress-4.12.0
Bump cypress from 4.10.0 to 4.12.0
2020-08-03 21:03:57 -04:00
Andrew Bastin
60c76ba854 Merge branch 'master' into dependabot/npm_and_yarn/cypress-4.12.0 2020-08-03 21:00:21 -04:00
Andrew Bastin
ebf7b32408 Fix Proxy error issue #1027 2020-08-03 20:47:44 -04:00
dependabot[bot]
f343459236 Bump cypress from 4.10.0 to 4.12.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.10.0 to 4.12.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.10.0...v4.12.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-04 00:04:52 +00:00
Andrew Bastin
d2a57864f0 Merge pull request #1043 from AndrewBastin/bug/1036
Test scripts get properly parsed JSON body
2020-08-03 14:29:47 -04:00
Andrew Bastin
8a07f281ff Test scripts get parsed JSON body 2020-08-03 13:42:33 -04:00
Andrew Bastin
b7b721abd5 Merge pull request #1040 from AndrewBastin/feat/js-linting
Basic linting for JS code
2020-08-02 13:20:40 -04:00
Andrew Bastin
45f1e386cc PreReq scripts and Test scripts now use JSEditor 2020-08-02 13:14:14 -04:00
Andrew Bastin
3c3e8a6c31 Move JS linting code to separate component 2020-08-02 11:47:16 -04:00
Andrew Bastin
ec99b48605 Added JS linting to Ace Editor 2020-08-02 00:26:16 -04:00
Andrew Bastin
da9e599e8f Added esprima as dependency 2020-08-02 00:26:16 -04:00
Andrew Bastin
b1d3fa3f42 Handled error handling to pre-request script execution 2020-08-02 00:26:16 -04:00
Andrew Bastin
7954672ef8 Updated README browser extension links 2020-07-31 23:50:49 -04:00
Liyas Thomas
20a6039bd0 Update README.md 2020-08-01 09:04:46 +05:30
Liyas Thomas
d7fe61bc3d Update README.md 2020-08-01 08:58:29 +05:30
Liyas Thomas
b10406896a Merge pull request #1039 from postwoman-io/dependabot/npm_and_yarn/eslint-7.6.0
Bump eslint from 7.5.0 to 7.6.0
2020-08-01 08:52:00 +05:30
dependabot[bot]
1f135e0721 Bump eslint from 7.5.0 to 7.6.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.5.0 to 7.6.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.5.0...v7.6.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-01 03:18:02 +00:00
Liyas Thomas
e1bdc9ce33 Merge pull request #1038 from postwoman-io/dependabot/npm_and_yarn/nuxt-i18n-6.13.2 2020-08-01 08:38:19 +05:30
dependabot[bot]
e3654bb472 Bump nuxt-i18n from 6.13.1 to 6.13.2
Bumps [nuxt-i18n](https://github.com/nuxt-community/i18n-module) from 6.13.1 to 6.13.2.
- [Release notes](https://github.com/nuxt-community/i18n-module/releases)
- [Changelog](https://github.com/nuxt-community/i18n-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/i18n-module/compare/v6.13.1...v6.13.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-01 02:32:25 +00:00
Liyas Thomas
6418d6bcff Delete codeql-analysis.yml
codeql-analysis isn't available for this org. will be added once it is out of beta.
2020-08-01 07:53:50 +05:30
Liyas Thomas
9bf7c5013e Merge pull request #1037 from liyasthomas/dependabot/npm_and_yarn/elliptic-6.5.3
Bump elliptic from 6.5.2 to 6.5.3
2020-07-31 21:14:36 +05:30
dependabot[bot]
1797e78ebd Bump elliptic from 6.5.2 to 6.5.3
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-31 15:38:22 +00:00
732 changed files with 79543 additions and 35120 deletions

View File

@@ -1,143 +0,0 @@
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"contributors": [
{
"login": "liyasthomas",
"name": "Liyas Thomas",
"avatar_url": "https://avatars1.githubusercontent.com/u/10395817?v=4",
"profile": "https://liyasthomas.web.app",
"contributions": [
"code",
"design"
]
},
{
"login": "NBTX",
"name": "John Harker",
"avatar_url": "https://avatars3.githubusercontent.com/u/43181178?v=4",
"profile": "https://github.com/NBTX",
"contributions": [
"code",
"design"
]
},
{
"login": "larouxn",
"name": "Nicholas La Roux",
"avatar_url": "https://avatars0.githubusercontent.com/u/1557529?v=4",
"profile": "https://nicholaslaroux.com",
"contributions": [
"code"
]
},
{
"login": "yubathom",
"name": "Thomas Yuba",
"avatar_url": "https://avatars3.githubusercontent.com/u/4117768?v=4",
"profile": "https://github.com/yubathom",
"contributions": [
"code"
]
},
{
"login": "nickpalenchar",
"name": "Nick Palenchar",
"avatar_url": "https://avatars1.githubusercontent.com/u/7539781?v=4",
"profile": "http://www.linkedin.com/in/nickpalenchar",
"contributions": [
"code"
]
},
{
"login": "AndrewBastin",
"name": "Andrew Bastin",
"avatar_url": "https://avatars2.githubusercontent.com/u/9131943?v=4",
"profile": "https://github.com/AndrewBastin",
"contributions": [
"code"
]
},
{
"login": "vlad0337187",
"name": "Vladislav",
"avatar_url": "https://avatars1.githubusercontent.com/u/12682937?v=4",
"profile": "https://github.com/vlad0337187",
"contributions": [
"code"
]
},
{
"login": "izerozlu",
"name": "izerozlu",
"avatar_url": "https://avatars3.githubusercontent.com/u/17386157?v=4",
"profile": "https://github.com/izerozlu",
"contributions": [
"code"
]
},
{
"login": "JacobAnavisca",
"name": "Jacob Anavisca",
"avatar_url": "https://avatars2.githubusercontent.com/u/21232366?v=4",
"profile": "https://github.com/JacobAnavisca",
"contributions": [
"code"
]
},
{
"login": "nityanandagohain",
"name": "Nityananda Gohain",
"avatar_url": "https://avatars3.githubusercontent.com/u/26831659?v=4",
"profile": "http://nityanandagohain.github.io",
"contributions": [
"code"
]
},
{
"login": "hosseinnedaee",
"name": "Hossein Nedaee",
"avatar_url": "https://avatars2.githubusercontent.com/u/42691357?v=4",
"profile": "https://github.com/hosseinnedaee",
"contributions": [
"code"
]
},
{
"login": "jamesgeorge007",
"name": "James George",
"avatar_url": "https://avatars2.githubusercontent.com/u/25279263?v=4",
"profile": "https://ghuser.io/jamesgeorge007",
"contributions": [
"code"
]
},
{
"login": "dmitryyankowski",
"name": "Dmitry Yankowski",
"avatar_url": "https://avatars0.githubusercontent.com/u/20114263?v=4",
"profile": "https://dmitryyankowski.com",
"contributions": [
"code"
]
},
{
"login": "sboulema",
"name": "Samir Boulema",
"avatar_url": "https://avatars2.githubusercontent.com/u/1820661?v=4",
"profile": "http://www.sboulema.nl",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
"projectName": "postwoman",
"projectOwner": "liyasthomas",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true
}

View File

@@ -30,7 +30,7 @@ coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
@@ -97,8 +97,8 @@ sw.*
# Vim swap files
*.swp
# Postwoman build data
.postwoman
# Build data
.hoppscotch
# File explorer
.directory

View File

@@ -1,11 +1,11 @@
# https://editorconfig.org
# EditorConfig is awesome: https://EditorConfig.org
root = true
[*]
indent_size = 2
indent_style = space
charset = utf-8
indent_size = 2
end_of_line = lf
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

View File

@@ -1,15 +0,0 @@
# Google Analytics
GA_ID=UA-XXXXXXXX-X
# Google Tag Manager
GTM_ID=GTM-XXXXXXX
# Firebase
API_KEY=api-key
AUTH_DOMAIN=project-id.firebaseapp.com
DATABASE_URL=https://project-id.firebaseio.com
PROJECT_ID=project-id
STORAGE_BUCKET=project-id.appspot.com
MESSAGING_SENDER_ID=sender-id
APP_ID=app-id
MEASUREMENT_ID=G-measurement-id

View File

@@ -1,14 +1,5 @@
{
"projects": {
"default": "postwoman-api"
},
"targets": {
"postwoman-api": {
"hosting": {
"postwoman": [
"postwoman"
]
}
}
}
}

6
.github/FUNDING.yml vendored
View File

@@ -1,4 +1,2 @@
github: postwoman-io
open_collective: postwoman
patreon: liyasthomas
custom: https://www.paypal.me/liyascthomas
github: hoppscotch
open_collective: hoppscotch

View File

@@ -6,5 +6,3 @@ labels: ''
assignees: ''
---

View File

@@ -3,7 +3,7 @@ updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
interval: weekly
time: '00:00'
open-pull-requests-limit: 10
reviewers:

5
.github/semantic.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
# Always validate the PR title AND all the commits
titleAndCommits: true
# Allows use of Merge commits (eg on github: "Merge branch 'master' into feature/ride-unicorns")
# this is only relevant when using commitsOnly: true (or titleAndCommits: true)
allowMergeCommits: true

View File

@@ -1,54 +1,61 @@
name: "CodeQL"
name: "Code Scanning - Action"
on:
push:
branches: [master, ]
branches: [main]
pull_request:
# The branches below must be a subset of the branches above
branches: [master]
branches: [main]
schedule:
- cron: '0 13 * * 0'
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
- cron: '0 0 * * 6'
jobs:
analyse:
name: Analyse
CodeQL-Build:
# CodeQL runs on ubuntu-latest, windows-latest, and macos-latest
runs-on: ubuntu-latest
permissions:
# required for all workflows
security-events: write
# only required for workflows in private repositories
actions: read
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
- name: Checkout repository
uses: actions/checkout@v2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below).
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# If the Autobuild fails above, remove it and uncomment the following
# three lines and modify them (or add more) to build your code if your
# project uses a compiled language
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

18
.github/workflows/deploy-prod.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Deploy to Live Channel
on:
push:
branches:
- main
jobs:
deploy_live_website:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: FirebaseExtended/action-hosting-deploy@v0
with:
repoToken: '${{ secrets.GITHUB_TOKEN }}'
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_POSTWOMAN_API }}'
channelId: live
projectId: postwoman-api

39
.github/workflows/publish-docker.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
name: Publish Docker image
on:
push:
branches: [main]
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: hoppscotch/hoppscotch
flavor: |
latest=true
prefix=
suffix=
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

28
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Node.js CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- name: Install pnpm
run: curl -f https://get.pnpm.io/v6.14.js | node - add --global pnpm@6
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: pnpm
- name: Run tests
run: pnpm i && pnpm -r test

12
.gitignore vendored
View File

@@ -26,7 +26,7 @@ coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
@@ -93,8 +93,8 @@ sw.*
# Vim swap files
*.swp
# Postwoman build data
.postwoman
# Build data
.hoppscotch
# File explorer
.directory
@@ -104,3 +104,9 @@ tests/*/screenshots
# Tests videos
tests/*/videos
# Local Netlify folder
.netlify
# Andrew's crazy Volar shim generator
shims-volar.d.ts

4
.husky/commit-msg Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit ""

4
.husky/pre-commit Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run pre-commit

View File

@@ -1,7 +1,8 @@
.dependabot
.github
.nuxt
.postwoman
.hoppscotch
.vscode
package-lock.json
node_modules
node_modules
dist

3
.prettierrc.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
semi: false
}

View File

@@ -1,39 +0,0 @@
# == INSTRUCTIONS FOR SETTING UP TRAVIS ==
#
# 1. Find this repository in your Travis-CI dashboard.
# open settings and add an environment variable called
# GITHUB_ACCESS_TOKEN and set it to your personal access token.addons:
# See: https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line
#
# **DO NOT TURN ON 'Display value in build log'!!!!**
#
# 2. Push the code to the repository.
language: node_js
node_js:
- lts/*
os: linux
addons:
apt:
packages:
- libgconf-2-4 # cypress binary dependency
cache: npm
branches:
only:
- master
install:
- npm ci
before_script:
- npm run build # use nuxt build and start to run tests
script:
- npm test
notifications:
webhooks: https://www.travisbuddy.com

View File

@@ -1,5 +1,13 @@
# Changelog
## [v1.12.0](https://github.com/hoppscotch/hoppscotch/tree/v1.12.0) (2020-05-27)
[Full Changelog](https://github.com/hoppscotch/hoppscotch/compare/v1.10.0...v1.12.0)
## [v1.10.0](https://github.com/hoppscotch/hoppscotch/tree/v1.10.0) (2020-04-10)
[Full Changelog](https://github.com/hoppscotch/hoppscotch/compare/v1.9.9...v1.10.0)
## [v1.9.9](https://github.com/liyasthomas/postwoman/tree/v1.9.9) (2020-07-30)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.9.7...v1.9.9)

View File

@@ -2,75 +2,131 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
Examples of behavior that contributes to a positive environment for our
community include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
## Enforcement Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior. Maintainers are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned with our Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at hello@postwoman.io. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
reported to the community leaders responsible for enforcement at
[INSERT CONTACT METHOD].
All complaints will be reviewed and investigated promptly and fairly.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][mozilla coc].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][faq]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[mozilla coc]: https://github.com/mozilla/diversity
[faq]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -12,81 +12,6 @@ Please note we have a code of conduct, please follow it in all your interactions
2. Update the README.md with details of changes to the interface, this includes new environment
variables, exposed ports, useful file locations and container parameters.
3. Increase the version numbers in any examples files and the README.md to the new version that this
Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
Pull Request would represent. The versioning scheme we use is [SemVer](https://semver.org).
4. You may merge the Pull Request once you have the sign-off of two other developers, or if you
do not have permission to do that, you may request the second reviewer merge it for you.
## Code of Conduct
### Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
### Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior. Maintainers are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned with our Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
### Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
### Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -1,21 +1,27 @@
FROM node:12.10.0-alpine
FROM node:lts-alpine
LABEL maintainer="Liyas Thomas (liyascthomas@gmail.com)"
LABEL maintainer="Hoppscotch (support@hoppscotch.io)"
# Add git as the prebuild target requires it to parse version information
RUN apk add --update --no-cache \
git
# Create app directory
WORKDIR /app
COPY package*.json ./
RUN npm install
ADD . /app/
COPY . .
RUN npm run build
RUN npm install -g pnpm
RUN pnpm i --unsafe-perm=true
ENV HOST 0.0.0.0
EXPOSE 3000
CMD ["npm", "run", "start"]
RUN mv packages/hoppscotch-app/.env.example packages/hoppscotch-app/.env
RUN pnpm run generate
CMD ["pnpm", "run", "start"]

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2019 Liyas Thomas
Copyright (c) 2020
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

565
README.md
View File

@@ -1,107 +1,105 @@
<div align="center">
<a href="https://postwoman.io"><img src="https://raw.githubusercontent.com/liyasthomas/postwoman/master/static/logo.png" alt="Postwoman.io logo" height="160"></a>
<br>
<br>
<a href="https://hoppscotch.io">
<img
src="https://avatars.githubusercontent.com/u/56705483"
alt="Hoppscotch Logo"
height="64"
/>
</a>
<br />
<p>
<b>A free, fast and beautiful API request builder</b>
<h3>
<b>
Hoppscotch
</b>
</h3>
</p>
<p>
<i>Web alternative to Postman - Helps you create requests faster, saving precious time on development - <a href="https://postwoman.launchaco.com">Subscribe</a></i>
<b>
Open source API development ecosystem
</b>
</p>
<p>
[![Travis Build Status](https://img.shields.io/travis/com/liyasthomas/postwoman?logo=Travis)](https://travis-ci.com/liyasthomas/postwoman) [![GitHub release](https://img.shields.io/github/release/liyasthomas/postwoman/all?logo=GitHub)](https://github.com/liyasthomas/postwoman/releases/latest) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fpostwoman.io&logo=Postwoman)](https://postwoman.io) [![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen)](CONTRIBUTING.md) [![Financial Contributors on Open Collective](https://img.shields.io/opencollective/all/postwoman?logo=Open-Collective&label=financial+contributors)](https://opencollective.com/postwoman) [![Donate on PayPal](https://img.shields.io/badge/support-PayPal-blue?logo=PayPal)](https://www.paypal.me/liyascthomas) [![Chat on Telegram](https://img.shields.io/badge/chat-Telegram-blueviolet?logo=Telegram)](https://t.me/postwoman_app) [![Chat on Discord](https://img.shields.io/badge/chat-Discord-violet?logo=discord)](https://discord.gg/GAMWxmR) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fpostwoman.io%2F)](https://twitter.com/intent/tweet?url=https%3A%2F%2Fpostwoman.io&text=%F0%9F%91%BD%20Postwoman%20%E2%80%A2%20API%20request%20builder%20-%20Helps%20you%20create%20your%20requests%20faster%2C%20saving%20you%20precious%20time%20on%20your%20development&original_referer=https%3A%2F%2Ftwitter.com%2Fshare%3Ftext%3D%25F0%259F%2591%25BD%2520Postwoman%2520%25E2%2580%25A2%2520API%2520request%2520builder%2520-%2520Helps%2520you%2520create%2520your%2520requests%2520faster%2C%2520saving%2520you%2520precious%2520time%2520on%2520your%2520development%26url%3Dhttps%3A%2F%2Fpostwoman.io%26hashtags%3Dpostwoman%26via%3Dliyasthomas&via=liyasthomas&hashtags=postwoman)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?logo=github)](CODE_OF_CONDUCT.md) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fhoppscotch.io&logo=hoppscotch)](https://hoppscotch.io) [![Tests](https://github.com/hoppscotch/hoppscotch/actions/workflows/tests.yml/badge.svg)](https://github.com/hoppscotch/hoppscotch/actions) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fhoppscotch.io%2F)](https://twitter.com/share?text=%F0%9F%91%BD%20Hoppscotch%20%E2%80%A2%20Open%20source%20API%20development%20ecosystem%20-%20Helps%20you%20create%20requests%20faster,%20saving%20precious%20time%20on%20development.&url=https://hoppscotch.io&hashtags=hoppscotch&via=hoppscotch_io)
</p>
<p>
<sub>Built with ❤︎ by
<a href="https://github.com/liyasthomas">liyasthomas</a> and
<a href="https://github.com/liyasthomas/postwoman/graphs/contributors">contributors</a>
<sub>
Built with ❤︎ by
<a href="https://github.com/hoppscotch/hoppscotch/graphs/contributors">
contributors
</a>
</sub>
</p>
<br />
<p>
<a href="https://hoppscotch.io">
<img
src="https://tiny.cc/hoppscotch_screenshot_1"
alt="Screenshot"
width="100%"
/>
</a>
</p>
</div>
#### **Support**
[![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://hoppscotch.io/discord) [![Chat on Telegram](https://img.shields.io/badge/chat-Telegram-2CA5E0?logo=Telegram)](https://hoppscotch.io/telegram)
<details open>
<summary><b>Table of contents</b></summary>
---
**Read: [Story behind Postwoman](https://dev.to/liyasthomas/i-created-postwoman-an-online-open-source-api-request-builder-41md)**
**Chat: [Telegram](https://t.me/postwoman_app), [Discord](https://discord.gg/GAMWxmR)**
**Donate: [GitHub Sponsors](https://github.com/sponsors/postwoman-io), [Open Collective](https://opencollective.com/postwoman), [Patreon](https://www.patreon.com/liyasthomas), [PayPal](https://www.paypal.me/liyascthomas)**
<div align="center">
<a href="https://postwoman.io"><img src="https://raw.githubusercontent.com/liyasthomas/postwoman/master/static/images/screenshot1.png" alt="Screenshot1" width="100%"></a>
</div>
<details>
<summary>Table of contents</summary>
---
- [Features](#features-)
- [Demo](#demo--)
- [Usage](#usage-)
- [Built with](#built-with-)
- [Developing](#developing-)
- [Browser based development environment](#browser-based-development-environment)
- [Local development environment](#local-development-environment)
- [Docker compose](#docker-compose)
- [Docker](#docker--)
- [Releasing](#releasing-)
- [Contributing](#contributing-)
- [Continuous Integration](#continuous-integration--)
- [Versioning](#versioning--)
- [Change log](#change-log-)
- [Authors](#authors-)
- [Lead Developers](#lead-developers)
- [Testing and Debugging](#testing-and-debugging)
- [Collaborators](#collaborators-)
- [Thanks](#thanks)
- [Financial Contributors](#financial-contributors)
- [Organizations](#organizations)
- [Individuals](#individuals)
- [Code Contributors](#code-contributors)
- [License](#license-)
- [Acknowledgements](#acknowledgements-)
- [Badges](#badges-)
- [Features](#features)
- [Demo](#demo)
- [Usage](#usage)
- [Built with](#built-with)
- [Developing](#developing)
- [Docker](#docker)
- [Releasing](#releasing)
- [Contributing](#contributing)
- [Continuous Integration](#continuous-integration)
- [Changelog](#changelog)
- [Authors](#authors)
- [License](#license)
---
</details>
### Features
### **Features**
❤️ **Lightweight**: Crafted with minimalistic UI design.
❤️ **Lightweight:** Crafted with minimalistic UI design.
⚡️ **Fast**: Send requests and get/copy responses in real-time.
⚡️ **Fast:** Send requests and get/copy responses in real-time.
**Methods:**
**HTTP Methods**
- `GET` - Retrieve information about the REST API resource
- `GET` - Requests retrieve resource information
- `POST` - The server creates a new entry in a database
- `PUT` - Updates an existing resource
- `PATCH` - Very similar to `PUT` but makes a partial update on a resource
- `DELETE` - Deletes resource or related component
- `HEAD` - Retrieve response headers identical to those of a GET request, but without the response body.
- `POST` - Create a REST API resource
- `PUT` - Update a REST API resource
- `DELETE` - Delete a REST API resource or related component
- `CONNECT` - Establishes a tunnel to the server identified by the target resource
- `OPTIONS` - Describe the communication options for the target resource
- `TRACE` - Performs a message loop-back test along the path to the target resource
- `PATCH` - Apply partial modifications to a REST API resource
- `<custom>` - Some APIs use custom request methods such as `LIST`. Type in your custom methods.
🌈 **Make it yours**: Customizable combinations for background, foreground and accent colors.
🌈 **Make it yours:** Customizable combinations for background, foreground and accent colors — [customize now](https://hoppscotch.io/settings).
**Theming:** [Customize now ✨](https://postwoman.io/settings)
**Theming**
- Choose theme: Kinda Dark (default), Clearly White, Just Black and System theme
- Choose accent color: Green (default), Yellow, Pink, Red, Purple, Orange, Cyan and Blue
- Toggle multi-colored headings
- Toggle auto-scroll to response
- Choose theme: System (default), Light, Dark and Black
- Choose accent color: Green (default), Teal, Blue, Indigo, Purple, Yellow, Orange, Red and Pink
- Distraction free Zen mode
_Customized themes are synced with local session storage_
_Customized themes are synced with cloud / local session_
🔥 **PWA**: Install as a [PWA](https://developers.google.com/web/progressive-web-apps) on your device.
**Features:**
🔥 **PWA:** Install as a [PWA](https://developers.google.com/web/progressive-web-apps) on your device.
- Instant loading with Service Workers
- Offline support
@@ -109,41 +107,34 @@ _Customized themes are synced with local session storage_
- Add to Home Screen
- Desktop PWA
🚀 **Request**: Retrieve response from endpoint instantly.
🚀 **Request:** Retrieve response from endpoint instantly.
- Choose `method`
- Enter `URL`
- Send
**Features:**
1. Choose `method`
2. Enter `URL`
3. Send
- Copy/share public "Share URL"
- Generate/copy request code for `JavaScript XHR`, `Fetch` and `cURL`
- Generate/copy request code snippets for 10+ languages and frameworks
- Import `cURL`
- Label requests
🔌 **WebSocket**: Establish full-duplex communication channels over a single TCP connection.
🔌 **WebSocket:** Establish full-duplex communication channels over a single TCP connection.
- Send and receive data
- Basic and Bearer Token authentication
📡 **Server Sent Events:** Receive a stream of updates from a server over a HTTP connection without resorting to polling.
📡 **Server Sent Events**: Receive a stream of updates from a server over a HTTP connection without resorting to polling.
🌩 **Socket.IO:** Send and Receive data with SocketIO server.
🌩 **Socket.IO**: Send and Receive data with SocketIO server.
🦟 **MQTT:** Subscribe and Publish to topics of a MQTT Broker.
🦟 **MQTT**: Subscribe and Publish to topics of a MQTT Broker.
🔮 **GraphQL:** GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
🔮 **GraphQL**: GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
- Set endpoint and get schemas
- Set endpoint and get schema
- Multi-column docs
- Set custom request headers
- Query schema
- Get query response
🔐 **Authentication**: Allows to identify the end user.
**Types:**
🔐 **Authorization:** Allows to identify the end user.
- None
- Basic
@@ -151,386 +142,222 @@ _Customized themes are synced with local session storage_
- OAuth 2.0
- OIDC Access Token/PKCE
📢 **Headers**: Describes the format the body of your request is being sent as.
📢 **Headers:** Describes the format the body of your request is being sent as.
📫 **Parameters**: Use request parameters to set varying parts in simulated requests.
📫 **Parameters:** Use request parameters to set varying parts in simulated requests.
📃 **Request Body**: Used to send and receive data via the REST API.
**Options:**
📃 **Request Body:** Used to send and receive data via the REST API.
- Set `Content Type`
- Add or remove Parameter list
- FormData, JSON and many more
- Toggle between key-value and RAW input parameter list
👋 **Responses**: Contains the status line, headers and the message/response body.
👋 **Response:** Contains the status line, headers and the message/response body.
- Copy response to clipboard
- Download response as a file
- View preview of HTML responses
- View response headers
- View raw and preview of HTML, image, JSON, XML responses
**History**: Request entries are synced with cloud / local session storage to restore with a single click.
**History:** Request entries are synced with cloud / local session storage to restore with a single click.
📁 **Collections**: Keep your API requests organized with collections and folders. Reuse them with a single click.
📁 **Collections:** Keep your API requests organized with collections and folders. Reuse them with a single click.
- Unlimited collections, folders and requests
- Nested folders
- Export and import as file or GitHub gist
_Collections are synced with cloud / local session storage_
🌐 **Proxy**: Enable Proxy Mode from Settings to access blocked APIs.
**Features:**
🌐 **Proxy:** Enable Proxy Mode from Settings to access blocked APIs.
- Hide your IP address
- Fixes [`CORS`](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) (Cross Origin Resource Sharing) issues
- Access APIs served in non-HTTPS (`http://`)
- Use custom Proxy URL
- Access APIs served in non-HTTPS (`http://`) endpoints
- Use your own Proxy URL
_Official Postwoman Proxy is hosted by Apollo Software - **[Privacy Policy](https://apollosoftware.xyz/legal/postwoman)**_
_Official proxy server is hosted by Hoppscotch - **[GitHub](https://github.com/hoppscotch/proxyscotch)** - **[Privacy Policy](https://docs.hoppscotch.io/privacy)**_
📜 **Pre-Request Scripts β**: Snippets of code associated with a request that are executed before the request is sent.
**Use-cases:**
📜 **Pre-Request Scripts β:** Snippets of code associated with a request that are executed before the request is sent.
- Set environment variables
- Include timestamp in the request headers
- Send a random alphanumeric string in the URL parameters
- Any JavaScript functions
📄 **API Documentation**: Create and share dynamic API documentation easily, quickly.
**Usage:**
📄 **API Documentation:** Create and share dynamic API documentation easily, quickly.
1. Add your requests to Collections and Folders
2. Export Collections and easily share your APIs with the rest of your team
3. Import Collections and Generate Documentation on-the-go
⌨️ **Keyboard Shortcuts**: Optimized for efficiency.
⌨️ **Keyboard Shortcuts:** Optimized for efficiency.
**Shortcuts:**
> **[Read our documentation on Keyboard Shortcuts](https://docs.hoppscotch.io/features/shortcuts)**
- Send/Cancel Request <kbd>Ctrl</kbd> + <kbd>G</kbd>
- Save to Collections <kbd>Ctrl</kbd> + <kbd>S</kbd>
- Copy Request Link <kbd>Ctrl</kbd> + <kbd>K</kbd>
- Reset Request <kbd>Ctrl</kbd> + <kbd>L</kbd>
🌎 **i18n:** Experience the app in your own language.
🌎 **i18n β**: Experience the app in your own language.
Help us to translate Hoppscotch. Please read [`TRANSLATIONS`](TRANSLATIONS.md) for details on our [`CODE OF CONDUCT`](CODE_OF_CONDUCT.md), and the process for submitting pull requests to us.
1. Scroll down to the footer
2. Click "Choose Language" icon button
3. Select your language from the menu
📦 **Add-ons:** Official add-ons for hoppscotch.
_Keep in mind: Translations aren't available for all source and target language combinations_
- **[Proxy](https://github.com/hoppscotch/proxyscotch)** - A simple proxy server created for Hoppscotch
- **[CLI β](https://github.com/hoppscotch/hopp-cli)** - A CLI solution for Hoppscotch
- **[Browser Extensions](https://github.com/hoppscotch/hoppscotch-extension)** - Browser extensions that simplifies access to Hoppscotch
**To provide a localized experience for users around the world, you can add you own translations.**
_**All `i18n` contributions are welcome to `i18n` [branch](https://github.com/liyasthomas/postwoman/tree/i18n) only!**_
📦 **Add-ons**: Official add-ons for Postwoman.
- **[Proxy](https://github.com/postwoman-io/proxywoman)** - A simple proxy server created for Postwoman
- **[CLI β](https://github.com/postwoman-io/postwoman-cli)** - A CLI solution for Postwoman
- **[Browser Extensions](https://github.com/AndrewBastin/postwoman-extension)** - Browser extensions that simplifies access to Postwoman
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/postwoman) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/postwoman-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld)
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/hoppscotch) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/hoppscotch-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld)
> **Extensions fixes `CORS` issues.**
_Add-ons are developed and maintained under **[Official Postwoman Organization](https://github.com/postwoman-io)**._
- **[Hopp-Doc-Gen](https://github.com/hoppscotch/hopp-doc-gen)** - An API doc generator CLI for Hoppscotch
☁️ **Auth + Sync**: Sign in and sync in real-time.
_Add-ons are developed and maintained under **[Hoppscotch Organization](https://github.com/hoppscotch)**._
**Sign in with:**
☁️ **Auth + Sync:** Sign in and sync your data in real-time.
**Sign in with**
- Google
- GitHub
- Google
- Email
**Sync:**
**Synchronize your data**
- History
- Collections
- Environments
- Notes
- Settings
**Post-Request Tests β**: Write tests associated with a request that are executed after the request response.
**Use-cases:**
**Post-Request Tests β:** Write tests associated with a request that are executed after the request response.
- Check the status code as an integer
- Filter response headers
- Parse the response data
📝 **Notes** : Instantly jot down notes, tasks or whatever you feel like as they come to your mind.
_Notes are only available for signed-in users_
- Any JavaScript functions
🌱 **Environments** : Environment variables allow you to store and reuse values in your requests and scripts.
**Use-cases:**
- Unlimited environments and variables
- Initialize through pre-request script
- Export as / import from GitHub gist
<details>
<summary><i>Use-cases</i></summary>
---
- By storing a value in a variable, you can reference it throughout your request section
- If you need to update the value, you only have to change it in one place
- Using variables increases your ability to work efficiently and minimizes the likelihood of error
**To find out more, please check out [Postwoman Wiki](https://github.com/liyasthomas/postwoman/wiki).**
---
## Demo 🚀 [![Website](https://img.shields.io/website?url=https%3A%2F%2Fpostwoman.io&logo=Postwoman)](https://postwoman.io)
</details>
[postwoman.io](https://postwoman.io)
👨‍👩‍👧‍👦 **Teams β:** Helps you collaborate across your team to design, develop, and test APIs faster.
## Usage 💡
- Unlimited teams
- Unlimited shared collections
- Unlimited team members
- Role-based access control
- Cloud sync
- Multiple devices
🚚 **Bulk Edit:** Edit key-value pairs in bulk.
- Entries are separated by newline
- Keys and values are separated by `:`
- Prepend `//` to any row you want to add but keep disabled
**For more features, please read our [documentation](https://docs.hoppscotch.io).**
## **Demo**
[hoppscotch.io](https://hoppscotch.io)
## **Usage**
1. Choose `method`
2. Enter `URL`
3. Send request
4. Get response
## Built with 🔧
## **Built with**
- HTML - For the web framework
- CSS - For styling components
- JavaScript - For magic!
- [Vue](https://vuejs.org/)
- [Nuxt](https://nuxtjs.org/)
- [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML)
- [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS), [SCSS](https://sass-lang.com), [Windi CSS](https://windicss.org)
- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
- [TypeScript](https://www.typescriptlang.org)
- [Vue](https://vuejs.org)
- [Nuxt](https://nuxtjs.org)
## Developing 👷
## **Developing**
0. Update [`.env.example`](https://github.com/liyasthomas/postwoman/blob/master/.env.example) file found in repository's root directory with your own keys and rename it to `.env`.
0. Update [`.env.example`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-app/.env.example) file found in `packages/hoppscotch-app` with your own keys and rename it to `.env`.
_Sample keys only works with the [production build](https://postwoman.io)._
_Sample keys only works with the [production build](https://hoppscotch.io)._
#### Browser based development environment
### Browser based development environment
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/liyasthomas/postwoman)
- [GitHub codespace](https://docs.github.com/en/codespaces/developing-in-codespaces/creating-a-codespace)
- [Gitpod](https://gitpod.io/#https://github.com/hoppscotch/hoppscotch)
#### Local development environment
### Local development environment
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Install dependencies by running `npm install` within the directory that you cloned (probably `postwoman`).
3. Start the development server with `npm run dev`.
4. Open development site by going to [`http://localhost:3000`](http://localhost:3000) in your browser.
2. Install pnpm using npm by running `npm install -g pnpm`.
3. Install dependencies by running `pnpm install` within the directory that you cloned (probably `hoppscotch`).
4. Start the development server with `pnpm run dev`.
5. Open development site by going to [`http://localhost:3000`](http://localhost:3000) in your browser.
#### Docker compose
### Docker compose
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Run `docker-compose up`
3. Open development site by going to [`http://localhost:3000`](http://localhost:3000) in your browser.
## Docker 🐳 [![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/liyasthomas/postwoman?logo=Docker)](https://hub.docker.com/r/liyasthomas/postwoman)
## **Docker**
**Official container** &nbsp; [![hoppscotch/hoppscotch](https://img.shields.io/docker/pulls/hoppscotch/hoppscotch?style=social)](https://hub.docker.com/r/hoppscotch/hoppscotch)
```bash
#pull
docker pull liyasthomas/postwoman
#run
docker run -p 3000:3000 liyasthomas/postwoman:latest
#build
docker build -t postwoman:latest .
docker run --rm --name hoppscotch -p 3000:3000 hoppscotch/hoppscotch:latest
```
## Releasing 🧞
## **Releasing**
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Install dependencies by running `npm install` within the directory that you cloned (probably `postwoman`).
3. Build the release files with `npm run build`.
4. Find the built project in `./dist`.
2. Install pnpm using npm by running `npm install -g pnpm`.
3. Install dependencies by running `pnpm install` within the directory that you cloned (probably `hoppscotch`).
4. Build the release files with `pnpm run generate`.
5. Find the built project in `packages/hoppscotch-app/dist`.
## Contributing 🍰
## **Contributing**
Please contribute using [GitHub Flow](https://guides.github.com/introduction/flow). Create a branch, add commits, and [open a pull request](https://github.com/hoppscotch/hoppscotch/compare).
Please read [`CONTRIBUTING`](CONTRIBUTING.md) for details on our [`CODE OF CONDUCT`](CODE_OF_CONDUCT.md), and the process for submitting pull requests to us.
## Continuous Integration 💚 [![Travis Build Status](https://img.shields.io/travis/com/liyasthomas/postwoman?logo=Travis)](https://travis-ci.com/liyasthomas/postwoman)
## **Continuous Integration**
We use [Travis CI](https://travis-ci.com) for continuous integration. Check out our [Travis CI Status](https://travis-ci.com/liyasthomas/postwoman).
We use [GitHub Actions](https://github.com/features/actions) for continuous integration. Check out our [build workflows](https://github.com/hoppscotch/hoppscotch/actions).
## Versioning 🔖 [![GitHub release](https://img.shields.io/github/release/liyasthomas/postwoman/all?logo=GitHub)](https://github.com/liyasthomas/postwoman/releases/latest)
This project is developed by [Liyas Thomas](https://github.com/liyasthomas) using the [Semantic Versioning specification](https://semver.org). For the versions available, see the [releases on this repository](https://github.com/liyasthomas/postwoman/releases).
## Change log 📝
## **Changelog**
See the [`CHANGELOG`](CHANGELOG.md) file for details.
## Authors 🧙
## **Authors**
### Lead Developers
- **[Liyas Thomas](https://github.com/liyasthomas)** - _Author_
- **[John Harker](https://github.com/NBTX)** - _Lead developer_
- **[Andrew Bastin](https://github.com/andrewbastin)** - _Lead developer_
- **[James George](https://github.com/jamesgeorge007)** - _Lead maintainer_
- **[Caneco](https://twitter.com/caneco)** - _Logo and banner designer_
### Testing and Debugging
- [Contributors](https://github.com/liyasthomas/postwoman/graphs/contributors)
### Collaborators <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://liyasthomas.web.app"><img src="https://avatars1.githubusercontent.com/u/10395817?v=4" width="100px;" alt=""/><br /><sub><b>Liyas Thomas</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=liyasthomas" title="Code">💻</a> <a href="#design-liyasthomas" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/NBTX"><img src="https://avatars3.githubusercontent.com/u/43181178?v=4" width="100px;" alt=""/><br /><sub><b>John Harker</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=NBTX" title="Code">💻</a> <a href="#design-NBTX" title="Design">🎨</a></td>
<td align="center"><a href="https://nicholaslaroux.com"><img src="https://avatars0.githubusercontent.com/u/1557529?v=4" width="100px;" alt=""/><br /><sub><b>Nicholas La Roux</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=larouxn" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/yubathom"><img src="https://avatars3.githubusercontent.com/u/4117768?v=4" width="100px;" alt=""/><br /><sub><b>Thomas Yuba</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=yubathom" title="Code">💻</a></td>
<td align="center"><a href="http://www.linkedin.com/in/nickpalenchar"><img src="https://avatars1.githubusercontent.com/u/7539781?v=4" width="100px;" alt=""/><br /><sub><b>Nick Palenchar</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=nickpalenchar" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/AndrewBastin"><img src="https://avatars2.githubusercontent.com/u/9131943?v=4" width="100px;" alt=""/><br /><sub><b>Andrew Bastin</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=AndrewBastin" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/vlad0337187"><img src="https://avatars1.githubusercontent.com/u/12682937?v=4" width="100px;" alt=""/><br /><sub><b>Vladislav</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=vlad0337187" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/izerozlu"><img src="https://avatars3.githubusercontent.com/u/17386157?v=4" width="100px;" alt=""/><br /><sub><b>izerozlu</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=izerozlu" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/JacobAnavisca"><img src="https://avatars2.githubusercontent.com/u/21232366?v=4" width="100px;" alt=""/><br /><sub><b>Jacob Anavisca</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=JacobAnavisca" title="Code">💻</a></td>
<td align="center"><a href="http://nityanandagohain.github.io"><img src="https://avatars3.githubusercontent.com/u/26831659?v=4" width="100px;" alt=""/><br /><sub><b>Nityananda Gohain</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=nityanandagohain" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/hosseinnedaee"><img src="https://avatars2.githubusercontent.com/u/42691357?v=4" width="100px;" alt=""/><br /><sub><b>Hossein Nedaee</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=hosseinnedaee" title="Code">💻</a></td>
<td align="center"><a href="https://ghuser.io/jamesgeorge007"><img src="https://avatars2.githubusercontent.com/u/25279263?v=4" width="100px;" alt=""/><br /><sub><b>James George</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=jamesgeorge007" title="Code">💻</a></td>
<td align="center"><a href="https://dmitryyankowski.com"><img src="https://avatars0.githubusercontent.com/u/20114263?v=4" width="100px;" alt=""/><br /><sub><b>Dmitry Yankowski</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=dmitryyankowski" title="Code">💻</a></td>
<td align="center"><a href="http://www.sboulema.nl"><img src="https://avatars2.githubusercontent.com/u/1820661?v=4" width="100px;" alt=""/><br /><sub><b>Samir Boulema</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=sboulema" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
See the list of [contributors](https://github.com/liyasthomas/postwoman/graphs/contributors) who participated in this project.
### Thanks
- [dev.to 👩‍💻👨‍💻](https://dev.to)
### Financial Contributors
Become a financial contributor and help us sustain our community [[Contribute](https://opencollective.com/postwoman/contribute)].
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website [[Contribute](https://opencollective.com/postwoman/contribute)].
<a href="https://opencollective.com/postwoman/organization/0/website"><img src="https://opencollective.com/postwoman/organization/0/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/1/website"><img src="https://opencollective.com/postwoman/organization/1/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/2/website"><img src="https://opencollective.com/postwoman/organization/2/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/3/website"><img src="https://opencollective.com/postwoman/organization/3/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/4/website"><img src="https://opencollective.com/postwoman/organization/4/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/5/website"><img src="https://opencollective.com/postwoman/organization/5/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/6/website"><img src="https://opencollective.com/postwoman/organization/6/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/7/website"><img src="https://opencollective.com/postwoman/organization/7/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/8/website"><img src="https://opencollective.com/postwoman/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/9/website"><img src="https://opencollective.com/postwoman/organization/9/avatar.svg"></a>
#### Individuals
<a href="https://opencollective.com/postwoman"><img src="https://opencollective.com/postwoman/individuals.svg"></a>
### Code Contributors
This project exists thanks to all the people who contribute [[Contribute](CONTRIBUTING.md)].
<a href="https://github.com/liyasthomas/postwoman/graphs/contributors"><img src="https://opencollective.com/postwoman/contributors.svg?width=890&button=false" /></a>
## License 📄
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [`LICENSE`](LICENSE) file for details.
## Acknowledgements 🙏
- Hat tip to anyone whose code was used
- Inspirations:
- [Dribbble](https://dribbble.com)
## Badges 📛
<table>
<tr>
<th>Preview</th>
<th>Markdown code</th>
</tr>
<tbody>
<tr>
<td align="center" width="200px">
<a href="https://postwoman.io">
<br/>
<img src="https://img.shields.io/badge/Tested_on-Postwoman-202124?logo=Postwoman"/>
</a>
<br/>
<sub>
Default
</sub>
</td>
<td>
<code>[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-202124?logo=Postwoman)](https://postwoman.io)</code>
</td>
</tr>
<tr>
<td align="center" width="200px">
<a href="https://postwoman.io">
<br/>
<img src="https://img.shields.io/badge/Tested_on-Postwoman-success?logo=Postwoman"/>
</a>
<br/>
<sub>
Success
</sub>
</td>
<td>
<code>[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-success?logo=Postwoman)](https://postwoman.io)</code>
</td>
</tr>
<tr>
<td align="center" width="200px">
<a href="https://postwoman.io">
<br/>
<img src="https://img.shields.io/badge/Tested_on-Postwoman-critical?logo=Postwoman"/>
</a>
<br/>
<sub>
Critical
</sub>
</td>
<td>
<code>[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-critical?logo=Postwoman)](https://postwoman.io)</code>
</td>
</tr>
<tr>
<td align="center" width="200px">
<a href="https://postwoman.io">
<br/>
<img src="https://img.shields.io/badge/Tested_on-Postwoman-blueviolet?logo=Postwoman"/>
</a>
<br/>
<sub>
Custom
</sub>
</td>
<td>
<code>[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-blueviolet?logo=Postwoman)](https://postwoman.io)</code>
</td>
</tr>
<tr>
<td align="center" width="200px">
<a href="https://postwoman.io">
<br/>
<img src="https://img.shields.io/badge/your_text-Postwoman-hex_color_code?logo=Postwoman"/>
</a>
<br/>
<sub>
Customize
</sub>
</td>
<td>
<code>[![Postwoman](https://img.shields.io/badge/your_text-Postwoman-hex_color_code?logo=Postwoman)](https://postwoman.io)</code>
</td>
</tr>
</tbody>
</table>
This project exists thanks to all the people who contribute — [make a contribution](CONTRIBUTING.md).
<div align="center">
<br>
<a href="https://postwoman.io"><img src="https://raw.githubusercontent.com/liyasthomas/templates/master/assets/logo.gif" alt="Postwoman.io" width="200"></a>
<br>
<h3>Happy Coding ❤︎</h3>
<a href="https://github.com/hoppscotch/hoppscotch/graphs/contributors">
<img src="https://opencollective.com/hoppscotch/contributors.svg?width=840&button=false"
alt="Contributors"
width="100%" />
</a>
</div>
## **License**
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [`LICENSE`](LICENSE) file for details.

View File

@@ -1,43 +1,25 @@
# Translations
Thanks for your interest in helping translating the software!
Thanks for showing your interest in helping us to translate the software.
## Starting a translation
## Creating a new translation
Before you start working on a translation, look through the [open pull requests](https://github.com/liyasthomas/postwoman/pulls) to see if anyone else is already working on one for your language.
Before you start working on a new language, please look through the [open pull requests](https://github.com/hoppscotch/hoppscotch/pulls) to see if anyone is already working on a translation. If you find one, please join the discussion and help us keep the existing translations up to date.
If there's not, then today is your day to lead this effort! Here's how to start:
if there is no existing translation, you can create a new one by following these steps:
1. [Fork this repository](https://github.com/liyasthomas/postwoman/fork)
2. Create a new branch for your translation work e.g. `es`.
3. Copy `lang/en-US.json` to your target language file e.g. `lang/es-ES.json` and translate all the strings.
4. Add your language entry to `nuxt.config.js`.
1. **[Fork the repository](https://github.com/hoppscotch/hoppscotch/fork).**
2. **Create a new branch for your translation.**
3. **Create target language file in the [`locales`](https://github.com/hoppscotch/hoppscotch/tree/main/packages/hoppscotch-app/locales) directory.**
4. **Copy the contents of the source file [`locales/en.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-app/locales/en.json) to the target language file.**
5. **Translate the strings in the target language file.**
6. **Add your language entry to [`languages.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-app/languages.json).**
7. **Save & commit changes.**
8. **Send a pull request.**
e.g.
_You may send a pull request before all steps above are complete: e.g., you may want to ask for help with translations, or getting tests to pass. However, your pull request will not be merged until all steps above are complete._
```
i18n: {
locales: [
{
code: "en",
name: "English",
iso: "en-US",
file: "en-US.json",
},
{
code: 'es',
name: 'Español',
iso: 'es-ES',
file: 'es-ES.js'
}
]
}
```
5. Save & commit changes.
6. Send a pull request. (You may send a pull request before all steps above are complete: e.g., you may want to ask for help with translations, or getting tests to pass. However your pull request will not be merged until all steps above are complete.)
Completing an initial translation of the whole site is a fairly large task. One way to break that task up is to work with other translators through pull requests on your fork. You can also [add collaborators to your fork](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) if you'd like to inivte other translators to commit directly to your fork and share responsibility for merging pull requests.
Completing an initial translation of the whole site is a fairly large task. One way to break that task up is to work with other translators through pull requests on your fork. You can also [add collaborators to your fork](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) if you'd like to invite other translators to commit directly to your fork and share responsibility for merging pull requests.
## Updating a translation

View File

@@ -1,66 +0,0 @@
// @import url("https://fonts.googleapis.com/css?family=Poppins:500,700|Roboto+Mono:400&display=swap");
// @import url("https://fonts.googleapis.com/icon?family=Material+Icons&display=swap");
/* Material Design Icons */
@font-face {
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
// Do not use font-display: swap for the icon font - it looks really bad when the page
// loads.
font-display: block;
src: url("~static/fonts/material-icons-v52.woff2") format("woff2");
}
.material-icons {
font-family: "Material Icons";
font-weight: normal;
font-style: normal;
height: 24px;
width: 24px;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-feature-settings: "liga";
-webkit-font-smoothing: antialiased;
font-feature-settings: "liga";
border-radius: 50%;
}
/* poppins-500 - latin */
@font-face {
font-family: "Poppins";
font-style: normal;
font-weight: 500;
font-display: swap;
src: local("Poppins Medium"), local("Poppins-Medium"),
url("~static/fonts/poppins-v9-latin-500.woff2") format("woff2"),
url("~static/fonts/poppins-v9-latin-500.woff") format("woff");
}
/* poppins-700 - latin */
@font-face {
font-family: "Poppins";
font-style: normal;
font-weight: 700;
font-display: swap;
src: local("Poppins Bold"), local("Poppins-Bold"),
url("~static/fonts/poppins-v9-latin-700.woff2") format("woff2"),
url("~static/fonts/poppins-v9-latin-700.woff") format("woff");
}
/* roboto-mono-regular - latin */
@font-face {
font-family: "Roboto Mono";
font-style: normal;
font-weight: 400;
font-display: swap;
src: local("Roboto Mono"), local("RobotoMono-Regular"),
url("~static/fonts/roboto-mono-v7-latin-regular.woff2") format("woff2"),
url("~static/fonts/roboto-mono-v7-latin-regular.woff") format("woff");
}

View File

@@ -1,784 +0,0 @@
$responsiveWidth: 768px;
::selection {
background-color: var(--ac-color);
color: var(--act-color);
}
::-webkit-scrollbar {
width: 4px;
height: 4px;
border-radius: 4px;
background-color: var(--bg-dark-color);
}
::-webkit-scrollbar-thumb {
border-radius: 4px;
background-color: var(--fg-light-color);
&:hover {
background-color: var(--fg-color);
}
}
::placeholder {
color: var(--fg-light-color);
opacity: 0.3;
}
* {
box-sizing: border-box;
outline: 0;
border: 0;
}
html,
body {
background-color: var(--bg-color);
color: var(--fg-color);
font-weight: 500;
font-size: 14px;
font-family: "Poppins", "Roboto", "Noto", sans-serif;
line-height: 1.5;
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
user-select: none;
padding: 0;
margin: 0;
scroll-behavior: smooth;
transition: all 0.2s ease-in-out;
}
body.afterLoad {
transition: background-color 0.2s ease-in-out;
}
body.sticky-footer footer {
opacity: 0.25;
}
a {
display: inline-flex;
color: inherit;
text-decoration: none;
transition: all 0.2s ease-in-out;
&.link {
color: var(--ac-color);
}
}
header,
footer {
& > div {
display: flex;
padding: 16px 8px;
width: 100%;
align-items: center;
justify-content: space-between;
}
}
.page-enter-active,
.page-leave-active,
.layout-enter-active,
.layout-leave-active {
transition: opacity 0.2s;
}
.page-enter,
.page-leave-active,
.layout-enter,
.layout-leave-active {
opacity: 0;
}
.wrapper {
min-height: 100vh;
display: flex;
flex-flow: column nowrap;
}
.wrapper .page {
min-height: calc(100vh - 153px);
}
.header,
.content,
.columns,
.footer {
display: flex;
flex: 1;
}
.nav-first,
.sticky-inner {
display: flex;
order: 1;
flex-flow: column;
position: sticky;
top: 0;
align-self: flex-start;
}
.main {
display: flex;
flex-flow: column;
flex: 1;
order: 2;
position: relative;
padding: 0 16px;
}
h1,
h2,
h3,
h4 {
display: flex;
align-items: center;
margin: 0;
font-weight: 700;
}
h3.title {
margin: 4px;
}
p {
transition: all 0.2s ease-in-out;
}
hr {
border-bottom: 1px dashed var(--brd-color);
margin: 16px 0;
}
.tooltip {
$bgcolor: var(--tt-color);
$fgcolor: var(--fg-color);
display: block !important;
z-index: 10000;
transition: all 0.2s ease-in-out;
.tooltip-inner {
background: $bgcolor;
color: $fgcolor;
border-radius: 8px;
padding: 8px 16px;
font-size: 12px;
font-weight: 500;
box-shadow: 0 4px 24px rgba(black, 0.1);
}
.tooltip-arrow {
width: 0;
height: 0;
border-style: solid;
position: absolute;
margin: 5px;
border-color: $bgcolor;
z-index: 1;
}
&[x-placement^="top"] {
margin-bottom: 5px;
.tooltip-arrow {
border-width: 5px 5px 0 5px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
bottom: -5px;
left: calc(50% - 5px);
margin-top: 0;
margin-bottom: 0;
}
}
&[x-placement^="bottom"] {
margin-top: 5px;
.tooltip-arrow {
border-width: 0 5px 5px 5px;
border-left-color: transparent !important;
border-right-color: transparent !important;
border-top-color: transparent !important;
top: -5px;
left: calc(50% - 5px);
margin-top: 0;
margin-bottom: 0;
}
}
&[x-placement^="right"] {
margin-left: 5px;
.tooltip-arrow {
border-width: 5px 5px 5px 0;
border-left-color: transparent !important;
border-top-color: transparent !important;
border-bottom-color: transparent !important;
left: -5px;
top: calc(50% - 5px);
margin-left: 0;
margin-right: 0;
}
}
&[x-placement^="left"] {
margin-right: 5px;
.tooltip-arrow {
border-width: 5px 0 5px 5px;
border-top-color: transparent !important;
border-right-color: transparent !important;
border-bottom-color: transparent !important;
right: -5px;
top: calc(50% - 5px);
margin-left: 0;
margin-right: 0;
}
}
&.popover {
.wrapper {
min-height: auto;
}
.popover-inner {
background: $bgcolor;
color: $fgcolor;
padding: 4px;
border-radius: 8px;
box-shadow: 0 5px 30px rgba(black, 0.1);
max-height: 256px;
overflow: auto;
div {
display: flex;
align-items: stretch;
flex-direction: column;
}
button {
justify-content: start;
}
}
.popover-arrow {
border-color: $bgcolor;
}
}
&[aria-hidden="true"] {
visibility: hidden;
opacity: 0;
transition: opacity 0.15s, visibility 0.15s;
}
&[aria-hidden="false"] {
visibility: visible;
opacity: 1;
transition: opacity 0.15s;
}
}
.info:not(.toasted) {
margin-left: 4px;
color: var(--fg-light-color);
.material-icons {
vertical-align: middle;
margin-right: 8px;
}
}
.bg-color {
background-color: transparent;
}
button {
display: inline-flex;
align-items: center;
justify-content: center;
margin: 4px;
padding: 6px 16px;
border-radius: 8px;
background-color: var(--ac-color);
color: var(--act-color);
font-size: 16px;
font-family: "Poppins", "Roboto", "Noto", sans-serif;
font-weight: 700;
transition: all 0.2s ease-in-out;
fill: var(--act-color);
cursor: pointer;
span {
display: inline-flex;
margin-left: 8px;
text-align: left;
}
&:not([disabled]):hover,
&:not([disabled]):active,
&:not([disabled]):focus {
color: var(--act-color);
fill: var(--act-color);
box-shadow: inset 0 0 0 2px var(--fg-color);
}
&.icon {
background-color: transparent;
color: var(--fg-light-color);
fill: var(--fg-light-color);
border-radius: 8px;
&:not([disabled]):hover,
&:not([disabled]):active,
&:not([disabled]):focus {
color: var(--fg-color);
fill: var(--fg-color);
box-shadow: none;
}
}
&.primary {
color: var(--ac-color);
&:not([disabled]):hover,
&:not([disabled]):active,
&:not([disabled]):focus {
background-color: var(--ac-color);
color: var(--act-color);
}
}
}
@keyframes beat {
30% {
transform: scale(1.1);
}
50% {
transform: scale(0.9);
}
100% {
transform: scale(1);
}
}
.material-icons:active {
animation: beat 0.5s forwards 1;
}
fieldset:target,
section:target {
animation: highlight 2s ease;
}
@keyframes highlight {
50% {
box-shadow: 0 0 0 2px var(--ac-color);
}
}
input[type="file"],
input[type="radio"],
.hide-on-large-screen,
#installPWA,
.hidden {
display: none;
}
.method,
kbd,
select,
input,
textarea,
pre,
code {
display: inline-flex;
margin: 4px;
padding: 8px;
border-radius: 8px;
background-color: var(--bg-dark-color);
color: var(--fg-color);
font-size: 16px;
font-family: "Roboto Mono", monospace;
font-weight: 400;
line-height: 1;
transition: all 0.2s ease-in-out;
user-select: text;
width: calc(100% - 8px);
resize: vertical;
text-overflow: ellipsis;
&:not([readonly]):not(.ace_editor):hover,
&:not([readonly]):not(.ace_editor):active,
&:not([readonly]):not(.ace_editor):focus {
box-shadow: inset 0 0 0 2px var(--fg-light-color);
}
}
.method {
cursor: pointer;
&:hover,
&:active,
&:focus {
box-shadow: inset 0 0 0 2px var(--fg-light-color);
}
}
pre {
display: grid;
}
pre.ace_editor {
font-family: "Roboto Mono", monospace;
font-weight: 400;
z-index: 0;
}
kbd,
code,
pre {
width: auto;
}
.select-wrapper {
position: relative;
input {
text-transform: uppercase;
min-width: 128px;
}
.trigger {
width: 100%;
}
&:after {
display: inline-block;
position: absolute;
pointer-events: none;
content: "\e313";
font-family: "Material Icons";
top: 14px;
right: 14px;
}
}
select {
height: 37px;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
&::-ms-expand {
display: none;
}
}
option {
background-color: var(--bg-color);
}
input[type="checkbox"] {
display: none;
&,
& + label {
vertical-align: middle;
cursor: pointer;
&:before {
content: "\2714";
border: 1px solid var(--fg-color);
border-radius: 8px;
display: inline-flex;
height: 16px;
width: 16px;
align-items: center;
justify-content: center;
margin: 8px 8px 8px 0;
color: transparent;
transition: all 0.2s ease-in-out;
}
}
&:checked + label:before {
background-color: var(--ac-color);
border-color: var(--ac-color);
color: var(--act-color);
}
}
.error:not(input),
.disabled:not(input),
[disabled] {
background-color: var(--err-color);
color: var(--fg-light-color);
fill: var(--fg-light-color);
cursor: not-allowed;
&.icon {
color: var(--err-color);
fill: var(--err-color);
}
}
label {
padding: 4px;
color: var(--fg-light-color);
transition: all 0.2s ease-in-out;
}
ul,
ol {
display: flex;
margin: 4px 0 4px;
padding: 0;
list-style-type: none;
ul,
ol {
margin: 0;
}
}
ul li,
ol li {
display: inline-flex;
flex-flow: column nowrap;
flex: 1;
justify-content: center;
&.shrink {
flex-grow: 0;
}
}
.flex-wrap {
display: flex;
align-items: center;
justify-content: space-between;
flex-grow: 1;
flex-direction: row;
* {
display: inline-flex;
flex-flow: row nowrap;
align-items: center;
justify-content: center;
}
}
.show-on-small-screen {
display: flex;
}
.show-on-large-screen {
display: flex;
flex: 1;
}
.info-response {
color: #ffeb3b;
}
.success-response {
color: #4bb543;
}
.redir-response {
color: #ff5722;
}
.cl-error-response {
color: #a63232;
}
.sv-error-response {
color: #b71c1c;
}
.missing-data-response {
background-color: var(--err-color);
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
.mono {
font-family: "Roboto Mono", monospace;
font-weight: 400;
}
#response-details-wrapper {
position: relative;
overflow: hidden;
border-radius: 8px;
textarea {
margin: 0;
width: 100%;
line-height: 1;
}
.covers-response {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: white;
height: 100%;
width: 100%;
}
}
#send {
&.show {
display: flex;
position: fixed;
bottom: 86px;
left: 50%;
z-index: 10001;
transform: translateX(-50%);
box-shadow: 0 4px 24px rgba(black, 0.2);
transition: all 0.2s ease-in-out;
}
}
section {
display: flex;
flex-wrap: wrap;
border-radius: 8px;
}
.toasted-container .toasted {
justify-content: flex-start !important;
}
.toasted.info {
background-color: var(--ac-color) !important;
color: var(--act-color) !important;
font-weight: 700 !important;
}
.toasted.bubble .action {
color: inherit !important;
}
.toasted .action {
margin-left: auto !important;
}
.page-columns {
display: flex;
flex: 1;
flex-flow: column;
}
.inner-left {
display: flex;
order: 1;
}
.inner-right {
display: flex;
width: 30%;
order: 2;
margin-left: 16px;
}
@media (max-width: $responsiveWidth) {
.content,
.columns {
flex-flow: column;
}
.main {
padding: 0 8px 68px;
}
ul,
ol {
flex-flow: column nowrap;
}
ul li,
ol li {
display: flex;
}
.hide-on-small-screen {
display: none;
}
.hide-on-large-screen,
.show-on-small-screen {
display: inline-flex;
}
.sticky-inner {
position: relative;
width: 100%;
}
.inner-left {
order: 0;
}
.inner-right {
margin-left: 0;
}
.toasted-container {
margin-bottom: 68px;
}
}
.toasted-ad {
background-color: #fefefe;
color: #121212;
padding: 16px !important;
font-weight: 700;
font-size: 16px;
border-radius: 8px;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
.action {
text-transform: none !important;
background-color: #121212;
color: #fefefe;
padding: 12px 16px !important;
font-weight: 500 !important;
font-size: 16px !important;
border-radius: 8px;
margin: 0 !important;
margin-left: 8px !important;
}
}
.virtual-list {
overflow: auto;
}
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
overflow-wrap: break-word;
word-break: break-all;
}

View File

@@ -1,107 +0,0 @@
/**
Main Themes:
- dark (default)
- light
- black
- auto
*/
// Dark is the default theme variant.
@mixin darkTheme {
// Background color
--bg-color: rgba(32, 33, 36, 1);
// Light Background color
--bg-light-color: rgba(255, 255, 255, 0.04);
// Dark Background color
--bg-dark-color: rgba(0, 0, 0, 0.2);
// Text color
--fg-color: rgba(255, 255, 255, 0.9);
// Light Text color
--fg-light-color: rgba(255, 255, 255, 0.5);
// Border color
--brd-color: rgba(255, 255, 255, 0.05);
// Error color
--err-color: rgba(255, 255, 255, 0.05);
// Acent color
--ac-color: rgba(80, 250, 123, 1);
// Active text color
--act-color: rgba(32, 33, 36, 1);
// Auto-complete color
--atc-color: rgba(32, 33, 36, 1);
// Tooltip color
--tt-color: rgba(53, 53, 53, 1);
}
@mixin lightTheme {
// Background color
--bg-color: rgba(255, 255, 255, 1);
// Light Background color
--bg-light-color: rgba(0, 0, 0, 0.05);
// Dark Background color
--bg-dark-color: rgba(0, 0, 0, 0.02);
// Text color
--fg-color: rgba(0, 0, 0, 0.9);
// Light Text color
--fg-light-color: rgba(0, 0, 0, 0.6);
// Border color
--brd-color: rgba(0, 0, 0, 0.1);
// Error color
--err-color: rgba(0, 0, 0, 0.1);
// Acent color
--ac-color: rgba(80, 250, 123, 1);
// Active text color
--act-color: rgba(255, 255, 255, 1);
// Auto-complete color
--atc-color: rgba(255, 255, 255, 1);
// Tooltip color
--tt-color: rgba(220, 220, 220, 1);
}
@mixin blackTheme {
// Background color
--bg-color: rgba(0, 0, 0, 1);
// Light Background color
--bg-light-color: rgba(255, 255, 255, 0.02);
// Dark Background color
--bg-dark-color: rgba(255, 255, 255, 0.04);
// Text color
--fg-color: rgba(255, 255, 255, 0.9);
// Light Text color
--fg-light-color: rgba(255, 255, 255, 0.5);
// Border color
--brd-color: rgba(255, 255, 255, 0.05);
// Error color
--err-color: rgba(255, 255, 255, 0.05);
// Acent color
--ac-color: rgba(80, 250, 123, 1);
// Active text color
--act-color: rgba(0, 0, 0, 1);
// Auto-complete color
--atc-color: rgba(0, 0, 0, 1);
// Tooltip color
--tt-color: rgba(18, 18, 18, 1);
}
:root {
@include darkTheme;
}
:root.light {
@include lightTheme;
}
:root.black {
@include blackTheme;
}
@media (prefers-color-scheme: dark) {
:root.auto {
@include darkTheme;
}
}
@media (prefers-color-scheme: light) {
:root.auto {
@include lightTheme;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

26
babel.config.js Normal file
View File

@@ -0,0 +1,26 @@
function isBabelLoader(caller) {
return caller && caller.name === "babel-loader"
}
module.exports = function (api) {
if (api.env("test") && !api.caller(isBabelLoader)) {
return {
plugins: [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-nullish-coalescing-operator",
"@babel/plugin-proposal-optional-chaining",
],
presets: [
[
"@babel/preset-env",
{
targets: {
node: "current",
},
},
],
],
}
}
return {}
}

View File

@@ -1,56 +0,0 @@
const axios = require("axios")
const fs = require("fs")
const { spawnSync } = require("child_process")
const runCommand = (command, args) => spawnSync(command, args).stdout.toString().replace(/\n/g, "")
const FAIL_ON_ERROR = false
const PW_BUILD_DATA_DIR = "./.postwoman"
// const IS_DEV_MODE = process.argv.includes("--dev")
try {
;(async () => {
// Create the build data directory if it does not exist.
if (!fs.existsSync(PW_BUILD_DATA_DIR)) {
fs.mkdirSync(PW_BUILD_DATA_DIR)
}
let version = {}
// Get the current version name as the tag from Git.
version.name =
process.env.TRAVIS_TAG || runCommand("git", ["tag --sort=committerdate | tail -1"])
// FALLBACK: If version.name was unset, let's grab it from GitHub.
if (!version.name) {
version.name = (
await axios
.get("https://api.github.com/repos/liyasthomas/postwoman/releases")
// If we can't get it from GitHub, we'll resort to getting it from package.json
.catch((ex) => ({
data: [
{
tag_name: require("./package.json").version,
},
],
}))
).data[0]["tag_name"]
}
// Get the current version hash as the short hash from Git.
// version.hash = runCommand("git", ["rev-parse", "--short", "HEAD"])
// Get the 'variant' name as the branch, if it's not master.
// version.variant =
// process.env.TRAVIS_BRANCH ||
// runCommand("git", ["branch"])
// .split("* ")[1]
// .split(" ")[0] + (IS_DEV_MODE ? " - DEV MODE" : "")
// if (["", "master"].includes(version.variant)) {
// delete version.variant
// }
// Write version data into a file
fs.writeFileSync(`${PW_BUILD_DATA_DIR}/version.json`, JSON.stringify(version))
})()
} catch (ex) {
console.error(ex)
process.exit(FAIL_ON_ERROR ? 1 : 0)
}

3
commitlint.config.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
}

View File

@@ -1,85 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("new_collection") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="$t('my_new_collection')"
@keyup.enter="addNewCollection"
/>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="addNewCollection">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
addNewCollection() {
if (!this.$data.name) {
this.$toast.info(this.$t("invalid_collection_name"))
return
}
this.$store.commit("postwoman/addNewCollection", {
name: this.$data.name,
})
this.$emit("hide-modal")
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal")
this.$data.name = undefined
},
},
}
</script>

View File

@@ -1,83 +0,0 @@
<template>
<modal v-if="show" @close="show = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("new_folder") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="$t('my_new_folder')"
@keyup.enter="addNewFolder"
/>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="addNewFolder">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
collection: Object,
collectionIndex: Number,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
methods: {
addNewFolder() {
this.$store.commit("postwoman/addNewFolder", {
folder: { name: this.$data.name },
collectionIndex: this.$props.collectionIndex,
})
this.hideModal()
this.syncCollections()
},
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
hideModal() {
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -1,141 +0,0 @@
<template>
<div>
<div class="flex-wrap">
<button class="icon" @click="toggleShowChildren">
<i class="material-icons" v-show="!showChildren">arrow_right</i>
<i class="material-icons" v-show="showChildren">arrow_drop_down</i>
<i class="material-icons">folder</i>
<span>{{ collection.name }}</span>
</button>
<div>
<button
v-if="doc"
class="icon"
@click="$emit('select-collection')"
v-tooltip.left="$t('import')"
>
<i class="material-icons">topic</i>
</button>
<v-popover>
<button class="tooltip-target icon" v-tooltip.left="$t('more')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="$emit('add-folder')" v-close-popover>
<i class="material-icons">create_new_folder</i>
<span>{{ $t("new_folder") }}</span>
</button>
</div>
<div>
<button class="icon" @click="$emit('edit-collection')" v-close-popover>
<i class="material-icons">create</i>
<span>{{ $t("edit") }}</span>
</button>
</div>
<div>
<button class="icon" @click="removeCollection" v-close-popover>
<i class="material-icons">delete</i>
<span>{{ $t("delete") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
</div>
<div v-show="showChildren">
<ul>
<li v-for="(folder, index) in collection.folders" :key="folder.name">
<folder
:folder="folder"
:folderIndex="index"
:collection-index="collectionIndex"
:doc="doc"
@edit-folder="editFolder(collectionIndex, folder, index)"
@edit-request="$emit('edit-request', $event)"
/>
</li>
<li v-if="collection.folders.length === 0 && collection.requests.length === 0">
<label>{{ $t("collection_empty") }}</label>
</li>
</ul>
<ul>
<li v-for="(request, index) in collection.requests" :key="index">
<request
:request="request"
:collection-index="collectionIndex"
:folder-index="-1"
:request-index="index"
:doc="doc"
@edit-request="
$emit('edit-request', {
request,
collectionIndex,
folderIndex: undefined,
requestIndex: index,
})
"
/>
</li>
</ul>
</div>
</div>
</template>
<style scoped lang="scss">
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
margin-left: 32px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
components: {
folder: () => import("./folder"),
request: () => import("./request"),
},
props: {
collectionIndex: Number,
collection: Object,
doc: Boolean,
},
data() {
return {
showChildren: false,
selectedFolder: {},
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
toggleShowChildren() {
this.showChildren = !this.showChildren
},
removeCollection() {
if (!confirm("Are you sure you want to remove this Collection?")) return
this.$store.commit("postwoman/removeCollection", {
collectionIndex: this.collectionIndex,
})
this.syncCollections()
},
editFolder(collectionIndex, folder, folderIndex) {
this.$emit("edit-folder", { collectionIndex, folder, folderIndex })
},
},
}
</script>

View File

@@ -1,91 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("edit_collection") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="editingCollection.name"
@keyup.enter="saveCollection"
/>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="saveCollection">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
editingCollection: Object,
editingCollectionIndex: Number,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
saveCollection() {
if (!this.$data.name) {
this.$toast.info(this.$t("invalid_collection_name"))
return
}
const collectionUpdated = {
...this.$props.editingCollection,
name: this.$data.name,
}
this.$store.commit("postwoman/editCollection", {
collection: collectionUpdated,
collectionIndex: this.$props.editingCollectionIndex,
})
this.$emit("hide-modal")
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -1,81 +0,0 @@
<template>
<modal v-if="show" @close="show = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("edit_folder") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input type="text" v-model="name" :placeholder="folder.name" @keyup.enter="editFolder" />
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="editFolder">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
collection: Object,
collectionIndex: Number,
folder: Object,
folderIndex: Number,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
editFolder() {
this.$store.commit("postwoman/editFolder", {
collectionIndex: this.$props.collectionIndex,
folder: { ...this.$props.folder, name: this.$data.name },
folderIndex: this.$props.folderIndex,
})
this.hideModal()
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -1,149 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("edit_request") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<label for="selectLabel">{{ $t("label") }}</label>
<input
type="text"
id="selectLabel"
v-model="requestUpdateData.name"
@keyup.enter="saveRequest"
:placeholder="request.name"
/>
<label for="selectCollection">{{ $t("collection") }}</label>
<span class="select-wrapper">
<select type="text" id="selectCollection" v-model="requestUpdateData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>{{
$t("current_collection")
}}</option>
<option
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>
{{ collection.name }}
</option>
</select>
</span>
<label for="selectFolder">{{ $t("folder") }}</label>
<span class="select-wrapper">
<select type="text" id="selectFolder" v-model="requestUpdateData.folderIndex">
<option :key="undefined" :value="undefined">/</option>
<option v-for="(folder, index) in folders" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
</span>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="saveRequest">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
collectionIndex: Number,
folderIndex: Number,
request: Object,
requestIndex: Number,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
requestUpdateData: {
name: undefined,
collectionIndex: undefined,
folderIndex: undefined,
},
}
},
watch: {
"requestUpdateData.collectionIndex": function resetFolderIndex() {
// if user choosen some folder, than selected other collection, which doesn't have any folders
// than `requestUpdateData.folderIndex` won't be reseted
this.$data.requestUpdateData.folderIndex = undefined
},
},
computed: {
folders() {
const userSelectedAnyCollection = this.$data.requestUpdateData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
return this.$store.state.postwoman.collections[this.$data.requestUpdateData.collectionIndex]
.folders
},
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
saveRequest() {
const userSelectedAnyCollection = this.$data.requestUpdateData.collectionIndex !== undefined
const requestUpdated = {
...this.$props.request,
name: this.$data.requestUpdateData.name || this.$props.request.name,
collection: userSelectedAnyCollection
? this.$data.requestUpdateData.collectionIndex
: this.$props.collectionIndex,
folder: this.$data.requestUpdateData.folderIndex,
}
// pass data separately to don't depend on request's collection, folder fields
// probably, they should be deprecated because they don't describe request itself
this.$store.commit("postwoman/editRequest", {
requestOldCollectionIndex: this.$props.collectionIndex,
requestOldFolderIndex: this.$props.folderIndex,
requestOldIndex: this.$props.requestIndex,
requestNew: requestUpdated,
requestNewCollectionIndex: requestUpdated.collection,
requestNewFolderIndex: requestUpdated.folder,
})
this.hideModal()
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -1,118 +0,0 @@
<template>
<div>
<div class="flex-wrap">
<div>
<button class="icon" @click="toggleShowChildren">
<i class="material-icons" v-show="!showChildren">arrow_right</i>
<i class="material-icons" v-show="showChildren">arrow_drop_down</i>
<i class="material-icons">folder_open</i>
<span>{{ folder.name }}</span>
</button>
</div>
<v-popover>
<button class="tooltip-target icon" v-tooltip.left="$t('more')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="editFolder" v-close-popover>
<i class="material-icons">edit</i>
<span>{{ $t("edit") }}</span>
</button>
</div>
<div>
<button class="icon" @click="removeFolder" v-close-popover>
<i class="material-icons">delete</i>
<span>{{ $t("delete") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
<div v-show="showChildren">
<ul>
<li v-for="(request, index) in folder.requests" :key="index">
<request
:request="request"
:collection-index="collectionIndex"
:folder-index="folderIndex"
:request-index="index"
:doc="doc"
@edit-request="
$emit('edit-request', {
request,
collectionIndex,
folderIndex,
requestIndex: index,
})
"
/>
</li>
<li v-if="folder.requests.length === 0">
<label>{{ $t("folder_empty") }}</label>
</li>
</ul>
</div>
</div>
</template>
<style scoped lang="scss">
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
margin-left: 32px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
folder: Object,
collectionIndex: Number,
folderIndex: Number,
doc: Boolean,
},
components: {
request: () => import("./request"),
},
data() {
return {
showChildren: false,
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
toggleShowChildren() {
this.showChildren = !this.showChildren
},
selectRequest(request) {
this.$store.commit("postwoman/selectRequest", { request })
},
removeFolder() {
if (!confirm("Are you sure you want to remove this folder?")) return
this.$store.commit("postwoman/removeFolder", {
collectionIndex: this.collectionIndex,
folderIndex: this.folderIndex,
})
this.syncCollections()
},
editFolder() {
this.$emit("edit-folder")
},
},
}
</script>

View File

@@ -1,295 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("import_export") }} {{ $t("collections") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
<div class="flex-wrap">
<span
v-tooltip="{
content: !fb.currentUser ? $t('login_first') : $t('replace_current'),
}"
>
<button :disabled="!fb.currentUser" class="icon" @click="syncCollections">
<i class="material-icons">folder_shared</i>
<span>{{ $t("import_from_sync") }}</span>
</button>
</span>
<button
class="icon"
@click="openDialogChooseFileToReplaceWith"
v-tooltip="$t('replace_current')"
>
<i class="material-icons">create_new_folder</i>
<span>{{ $t("replace_json") }}</span>
<input
type="file"
@change="replaceWithJSON"
style="display: none;"
ref="inputChooseFileToReplaceWith"
accept="application/json"
/>
</button>
<button
class="icon"
@click="openDialogChooseFileToImportFrom"
v-tooltip="$t('preserve_current')"
>
<i class="material-icons">folder_special</i>
<span>{{ $t("import_json") }}</span>
<input
type="file"
@change="importFromJSON"
style="display: none;"
ref="inputChooseFileToImportFrom"
accept="application/json"
/>
</button>
</div>
</li>
</ul>
</div>
<div slot="body">
<textarea v-model="collectionJson" rows="8"></textarea>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="exportJSON" v-tooltip="$t('download_file')">
{{ $t("export") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
data() {
return {
fb,
}
},
props: {
show: Boolean,
},
components: {
modal: () => import("~/components/ui/modal"),
},
computed: {
collectionJson() {
return JSON.stringify(this.$store.state.postwoman.collections, null, 2)
},
},
methods: {
hideModal() {
this.$emit("hide-modal")
},
openDialogChooseFileToReplaceWith() {
this.$refs.inputChooseFileToReplaceWith.click()
},
openDialogChooseFileToImportFrom() {
this.$refs.inputChooseFileToImportFrom.click()
},
replaceWithJSON() {
let reader = new FileReader()
reader.onload = (event) => {
let content = event.target.result
let collections = JSON.parse(content)
if (collections[0]) {
let [name, folders, requests] = Object.keys(collections[0])
if (name === "name" && folders === "folders" && requests === "requests") {
// Do nothing
}
} else if (collections.info && collections.info.schema.includes("v2.1.0")) {
collections = this.parsePostmanCollection(collections)
} else {
return this.failedImport()
}
this.$store.commit("postwoman/replaceCollections", collections)
this.fileImported()
this.syncToFBCollections()
}
reader.readAsText(this.$refs.inputChooseFileToReplaceWith.files[0])
},
importFromJSON() {
let reader = new FileReader()
reader.onload = (event) => {
let content = event.target.result
let collections = JSON.parse(content)
if (collections[0]) {
let [name, folders, requests] = Object.keys(collections[0])
if (name === "name" && folders === "folders" && requests === "requests") {
// Do nothing
}
} else if (collections.info && collections.info.schema.includes("v2.1.0")) {
collections = this.parsePostmanCollection(collections)
} else {
return this.failedImport()
}
this.$store.commit("postwoman/importCollections", collections)
this.fileImported()
this.syncToFBCollections()
}
reader.readAsText(this.$refs.inputChooseFileToImportFrom.files[0])
},
exportJSON() {
let text = this.collectionJson
text = text.replace(/\n/g, "\r\n")
let blob = new Blob([text], {
type: "text/json",
})
let anchor = document.createElement("a")
anchor.download = "postwoman-collection.json"
anchor.href = window.URL.createObjectURL(blob)
anchor.target = "_blank"
anchor.style.display = "none"
document.body.appendChild(anchor)
anchor.click()
document.body.removeChild(anchor)
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
},
syncCollections() {
this.$store.commit("postwoman/replaceCollections", fb.currentCollections)
this.fileImported()
},
syncToFBCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
fileImported() {
this.$toast.info(this.$t("file_imported"), {
icon: "folder_shared",
})
},
failedImport() {
this.$toast.error(this.$t("import_failed"), {
icon: "error",
})
},
parsePostmanCollection(collection, folders = true) {
let postwomanCollection = folders
? [
{
name: "",
folders: [],
requests: [],
},
]
: {
name: "",
requests: [],
}
for (let collectionItem of collection.item) {
if (collectionItem.request) {
if (postwomanCollection[0]) {
postwomanCollection[0].name = collection.info ? collection.info.name : ""
postwomanCollection[0].requests.push(this.parsePostmanRequest(collectionItem))
} else {
postwomanCollection.name = collection.name ? collection.name : ""
postwomanCollection.requests.push(this.parsePostmanRequest(collectionItem))
}
} else if (collectionItem.item) {
if (collectionItem.item[0]) {
postwomanCollection[0].folders.push(this.parsePostmanCollection(collectionItem, false))
}
}
}
return postwomanCollection
},
parsePostmanRequest({ name, request }) {
let pwRequest = {
url: "",
path: "",
method: "",
auth: "",
httpUser: "",
httpPassword: "",
passwordFieldType: "password",
bearerToken: "",
headers: [],
params: [],
bodyParams: [],
rawParams: "",
rawInput: false,
contentType: "",
requestType: "",
name: "",
}
pwRequest.name = name
let requestObjectUrl = request.url.raw.match(/^(.+:\/\/[^\/]+|{[^\/]+})(\/[^\?]+|).*$/)
if (requestObjectUrl) {
pwRequest.url = requestObjectUrl[1]
pwRequest.path = requestObjectUrl[2] ? requestObjectUrl[2] : ""
}
pwRequest.method = request.method
let itemAuth = request.auth ? request.auth : ""
let authType = itemAuth ? itemAuth.type : ""
if (authType === "basic") {
pwRequest.auth = "Basic Auth"
pwRequest.httpUser =
itemAuth.basic[0].key === "username" ? itemAuth.basic[0].value : itemAuth.basic[1].value
pwRequest.httpPassword =
itemAuth.basic[0].key === "password" ? itemAuth.basic[0].value : itemAuth.basic[1].value
} else if (authType === "oauth2") {
pwRequest.auth = "OAuth 2.0"
pwRequest.bearerToken =
itemAuth.oauth2[0].key === "accessToken"
? itemAuth.oauth2[0].value
: itemAuth.oauth2[1].value
} else if (authType === "bearer") {
pwRequest.auth = "Bearer Token"
pwRequest.bearerToken = itemAuth.bearer[0].value
}
let requestObjectHeaders = request.header
if (requestObjectHeaders) {
pwRequest.headers = requestObjectHeaders
for (let header of pwRequest.headers) {
delete header.name
delete header.type
}
}
let requestObjectParams = request.url.query
if (requestObjectParams) {
pwRequest.params = requestObjectParams
for (let param of pwRequest.params) {
delete param.disabled
}
}
if (request.body) {
if (request.body.mode === "urlencoded") {
let params = request.body.urlencoded
pwRequest.bodyParams = params ? params : []
for (let param of pwRequest.bodyParams) {
delete param.type
}
} else if (request.body.mode === "raw") {
pwRequest.rawInput = true
pwRequest.rawParams = request.body.raw
}
}
return pwRequest
},
},
}
</script>

View File

@@ -1,224 +0,0 @@
<!--
TODO:
- probably refactor and pass event arguments to modals directly without unpacking
-->
<template>
<pw-section class="yellow" :label="$t('collections')" ref="collections">
<addCollection :show="showModalAdd" @hide-modal="displayModalAdd(false)" />
<editCollection
:show="showModalEdit"
:editingCollection="editingCollection"
:editingCollectionIndex="editingCollectionIndex"
@hide-modal="displayModalEdit(false)"
/>
<addFolder
:show="showModalAddFolder"
:collection="editingCollection"
:collectionIndex="editingCollectionIndex"
@hide-modal="displayModalAddFolder(false)"
/>
<editFolder
:show="showModalEditFolder"
:collection="editingCollection"
:collectionIndex="editingCollectionIndex"
:folder="editingFolder"
:folderIndex="editingFolderIndex"
@hide-modal="displayModalEditFolder(false)"
/>
<editRequest
:show="showModalEditRequest"
:collectionIndex="editingCollectionIndex"
:folderIndex="editingFolderIndex"
:request="editingRequest"
:requestIndex="editingRequestIndex"
@hide-modal="displayModalEditRequest(false)"
/>
<importExportCollections
:show="showModalImportExport"
@hide-modal="displayModalImportExport(false)"
/>
<div class="flex-wrap">
<div>
<button class="icon" @click="displayModalAdd(true)">
<i class="material-icons">add</i>
<span>{{ $t("new") }}</span>
</button>
</div>
<div>
<button class="icon" @click="displayModalImportExport(true)">
{{ $t("import_export") }}
</button>
<!-- <a
href="https://github.com/liyasthomas/postwoman/wiki/Collections"
target="_blank"
rel="noopener"
>
<button class="icon" v-tooltip="'Wiki'">
<i class="material-icons">help_outline</i>
</button>
</a> -->
</div>
</div>
<p v-if="collections.length === 0" class="info">
<i class="material-icons">help_outline</i> Create new collection
</p>
<div class="virtual-list">
<ul>
<li v-for="(collection, index) in collections" :key="collection.name">
<collection
:collection-index="index"
:collection="collection"
:doc="doc"
@edit-collection="editCollection(collection, index)"
@add-folder="addFolder(collection, index)"
@edit-folder="editFolder($event)"
@edit-request="editRequest($event)"
@select-collection="$emit('use-collection', collection)"
/>
</li>
</ul>
</div>
</pw-section>
</template>
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 245px);
}
ul {
display: flex;
flex-direction: column;
}
</style>
<script>
import collection from "./collection"
import { fb } from "~/helpers/fb"
export default {
components: {
collection,
"pw-section": () => import("../layout/section"),
addCollection: () => import("./addCollection"),
addFolder: () => import("./addFolder"),
editCollection: () => import("./editCollection"),
editFolder: () => import("./editFolder"),
editRequest: () => import("./editRequest"),
importExportCollections: () => import("./importExportCollections"),
},
props: {
doc: Boolean,
},
data() {
return {
showModalAdd: false,
showModalEdit: false,
showModalImportExport: false,
showModalAddFolder: false,
showModalEditFolder: false,
showModalEditRequest: false,
editingCollection: undefined,
editingCollectionIndex: undefined,
editingFolder: undefined,
editingFolderIndex: undefined,
editingRequest: undefined,
editingRequestIndex: undefined,
}
},
computed: {
collections() {
return fb.currentUser !== null
? fb.currentCollections
: this.$store.state.postwoman.collections
},
},
async mounted() {
this._keyListener = function (e) {
if (e.key === "Escape") {
e.preventDefault()
this.showModalAdd = this.showModalEdit = this.showModalImportExport = this.showModalAddFolder = this.showModalEditFolder = this.showModalEditRequest = false
}
}
document.addEventListener("keydown", this._keyListener.bind(this))
},
methods: {
displayModalAdd(shouldDisplay) {
this.showModalAdd = shouldDisplay
},
displayModalEdit(shouldDisplay) {
this.showModalEdit = shouldDisplay
if (!shouldDisplay) this.resetSelectedData()
},
displayModalImportExport(shouldDisplay) {
this.showModalImportExport = shouldDisplay
},
displayModalAddFolder(shouldDisplay) {
this.showModalAddFolder = shouldDisplay
if (!shouldDisplay) this.resetSelectedData()
},
displayModalEditFolder(shouldDisplay) {
this.showModalEditFolder = shouldDisplay
if (!shouldDisplay) this.resetSelectedData()
},
displayModalEditRequest(shouldDisplay) {
this.showModalEditRequest = shouldDisplay
if (!shouldDisplay) this.resetSelectedData()
},
editCollection(collection, collectionIndex) {
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.displayModalEdit(true)
this.syncCollections()
},
addFolder(collection, collectionIndex) {
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.displayModalAddFolder(true)
this.syncCollections()
},
editFolder(payload) {
const { collectionIndex, folder, folderIndex } = payload
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.$data.editingFolder = folder
this.$data.editingFolderIndex = folderIndex
this.displayModalEditFolder(true)
this.syncCollections()
},
editRequest(payload) {
const { request, collectionIndex, folderIndex, requestIndex } = payload
this.$data.editingCollectionIndex = collectionIndex
this.$data.editingFolderIndex = folderIndex
this.$data.editingRequest = request
this.$data.editingRequestIndex = requestIndex
this.displayModalEditRequest(true)
this.syncCollections()
},
resetSelectedData() {
this.$data.editingCollection = undefined
this.$data.editingCollectionIndex = undefined
this.$data.editingFolder = undefined
this.$data.editingFolderIndex = undefined
this.$data.editingRequest = undefined
this.$data.editingRequestIndex = undefined
},
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
},
beforeDestroy() {
document.removeEventListener("keydown", this._keyListener)
},
}
</script>

View File

@@ -1,81 +0,0 @@
<template>
<div class="flex-wrap">
<div>
<button
class="icon"
@click="!doc ? selectRequest() : {}"
v-tooltip="!doc ? $t('use_request') : ''"
>
<i class="material-icons">insert_drive_file</i>
<span>{{ request.name }}</span>
</button>
</div>
<v-popover>
<button class="tooltip-target icon" v-tooltip="$t('more')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="$emit('edit-request')" v-close-popover>
<i class="material-icons">edit</i>
<span>{{ $t("edit") }}</span>
</button>
</div>
<div>
<button class="icon" @click="removeRequest" v-close-popover>
<i class="material-icons">delete</i>
<span>{{ $t("delete") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
</template>
<style scoped lang="scss">
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
padding-left: 16px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
request: Object,
collectionIndex: Number,
folderIndex: Number,
requestIndex: Number,
doc: Boolean,
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
selectRequest() {
this.$store.commit("postwoman/selectRequest", { request: this.request })
},
removeRequest() {
if (!confirm("Are you sure you want to remove this request?")) return
this.$store.commit("postwoman/removeRequest", {
collectionIndex: this.collectionIndex,
folderIndex: this.folderIndex,
requestIndex: this.requestIndex,
})
this.syncCollections()
},
},
}
</script>

View File

@@ -1,193 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("save_request_as") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<label for="selectLabel">{{ $t("label") }}</label>
<input
type="text"
id="selectLabel"
v-model="requestData.name"
:placeholder="defaultRequestName"
@keyup.enter="saveRequestAs"
/>
<label for="selectCollection">{{ $t("collection") }}</label>
<span class="select-wrapper">
<select type="text" id="selectCollection" v-model="requestData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>{{
$t("select_collection")
}}</option>
<option
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>
{{ collection.name }}
</option>
</select>
</span>
<label for="selectFolder">{{ $t("folder") }}</label>
<span class="select-wrapper">
<select type="text" id="selectFolder" v-model="requestData.folderIndex">
<option :key="undefined" :value="undefined">/</option>
<option v-for="(folder, index) in folders" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
</span>
<label for="selectRequest">{{ $t("request") }}</label>
<span class="select-wrapper">
<select type="text" id="selectRequest" v-model="requestData.requestIndex">
<option :key="undefined" :value="undefined">/</option>
<option v-for="(folder, index) in requests" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
</span>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="saveRequestAs">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
editingRequest: Object,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
defaultRequestName: "My Request",
requestData: {
name: undefined,
collectionIndex: undefined,
folderIndex: undefined,
requestIndex: undefined,
},
}
},
watch: {
"requestData.collectionIndex": function resetFolderAndRequestIndex() {
// if user choosen some folder, than selected other collection, which doesn't have any folders
// than `requestUpdateData.folderIndex` won't be reseted
this.$data.requestData.folderIndex = undefined
this.$data.requestData.requestIndex = undefined
},
"requestData.folderIndex": function resetRequestIndex() {
this.$data.requestData.requestIndex = undefined
},
editingRequest(request) {
this.defaultRequestName = request.label || "My Request"
},
},
computed: {
folders() {
const userSelectedAnyCollection = this.$data.requestData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
const noCollectionAvailable =
this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex] !==
undefined
if (!noCollectionAvailable) return []
return this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex].folders
},
requests() {
const userSelectedAnyCollection = this.$data.requestData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
const userSelectedAnyFolder = this.$data.requestData.folderIndex !== undefined
if (userSelectedAnyFolder) {
const collection = this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
]
const folder = collection.folders[this.$data.requestData.folderIndex]
const requests = folder.requests
return requests
} else {
const collection = this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
]
const noCollectionAvailable =
this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex] !==
undefined
if (!noCollectionAvailable) return []
const requests = collection.requests
return requests
}
},
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
saveRequestAs() {
const userDidntSpecifyCollection = this.$data.requestData.collectionIndex === undefined
if (userDidntSpecifyCollection) {
this.$toast.error(this.$t("select_collection"), {
icon: "error",
})
return
}
const requestUpdated = {
...this.$props.editingRequest,
name: this.$data.requestData.name || this.$data.defaultRequestName,
collection: this.$data.requestData.collectionIndex,
}
this.$store.commit("postwoman/saveRequestAs", {
request: requestUpdated,
collectionIndex: this.$data.requestData.collectionIndex,
folderIndex: this.$data.requestData.folderIndex,
requestIndex: this.$data.requestData.requestIndex,
})
this.hideModal()
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal")
this.$emit("hide-model") // for backward compatibility // TODO: use fixed event
},
},
}
</script>

View File

@@ -1,92 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("new_environment") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="$t('my_new_environment')"
@keyup.enter="addNewEnvironment"
/>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="addNewEnvironment">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
methods: {
syncEnvironments() {
if (fb.currentUser !== null) {
if (fb.currentSettings[1].value) {
fb.writeEnvironments(JSON.parse(JSON.stringify(this.$store.state.postwoman.environments)))
}
}
},
addNewEnvironment() {
if (!this.$data.name) {
this.$toast.info(this.$t("invalid_environment_name"))
return
}
let newEnvironment = [
{
name: this.$data.name,
variables: [],
},
]
this.$store.commit("postwoman/importAddEnvironments", {
environments: newEnvironment,
confirmation: "Environment added",
})
this.$emit("hide-modal")
this.syncEnvironments()
},
hideModal() {
this.$emit("hide-modal")
this.$data.name = undefined
},
},
}
</script>

View File

@@ -1,206 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("edit_environment") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="editingEnvironment.name"
@keyup.enter="saveEnvironment"
/>
</li>
</ul>
<ul>
<li>
<div class="flex-wrap">
<label for="variableList">{{ $t("env_variable_list") }}</label>
<div>
<button class="icon" @click="clearContent($event)" v-tooltip.bottom="$t('clear')">
<i class="material-icons">clear_all</i>
</button>
</div>
</div>
</li>
</ul>
<ul v-for="(variable, index) in this.editingEnvCopy.variables" :key="index">
<li>
<input
:placeholder="$t('parameter_count', { count: index + 1 })"
:name="'param' + index"
:value="variable.key"
@change="
$store.commit('postwoman/setVariableKey', {
index,
value: $event.target.value,
})
"
autofocus
/>
</li>
<li>
<input
:placeholder="$t('value_count', { count: index + 1 })"
:name="'value' + index"
:value="
typeof variable.value === 'string' ? variable.value : JSON.stringify(variable.value)
"
@change="
$store.commit('postwoman/setVariableValue', {
index,
value: $event.target.value,
})
"
/>
</li>
<div>
<li>
<button
class="icon"
@click="removeEnvironmentVariable(index)"
v-tooltip.bottom="$t('delete')"
id="variable"
>
<i class="material-icons">delete</i>
</button>
</li>
</div>
</ul>
<ul>
<li>
<button class="icon" @click="addEnvironmentVariable">
<i class="material-icons">add</i>
<span>{{ $t("add_new") }}</span>
</button>
</li>
</ul>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="saveEnvironment">
{{ $t("save") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
show: Boolean,
editingEnvironment: Object,
editingEnvironmentIndex: Number,
},
components: {
modal: () => import("~/components/ui/modal"),
},
data() {
return {
name: undefined,
}
},
watch: {
editingEnvironment: function (update) {
this.name =
this.$props.editingEnvironment && this.$props.editingEnvironment.name
? this.$props.editingEnvironment.name
: undefined
this.$store.commit("postwoman/setEditingEnvironment", this.$props.editingEnvironment)
},
},
computed: {
editingEnvCopy() {
return this.$store.state.postwoman.editingEnvironment
},
variableString() {
const result = this.editingEnvCopy.variables
return result === "" ? "" : JSON.stringify(result)
},
},
methods: {
syncEnvironments() {
if (fb.currentUser !== null) {
if (fb.currentSettings[1].value) {
fb.writeEnvironments(JSON.parse(JSON.stringify(this.$store.state.postwoman.environments)))
}
}
},
clearContent(e) {
this.$store.commit("postwoman/removeVariables", [])
e.target.innerHTML = this.doneButton
this.$toast.info(this.$t("cleared"), {
icon: "clear_all",
})
setTimeout(() => (e.target.innerHTML = '<i class="material-icons">clear_all</i>'), 1000)
},
addEnvironmentVariable() {
let value = { key: "", value: "" }
this.$store.commit("postwoman/addVariable", value)
this.syncEnvironments()
},
removeEnvironmentVariable(index) {
let variableIndex = index
const oldVariables = this.editingEnvCopy.variables.slice()
const newVariables = this.editingEnvCopy.variables.filter(
(variable, index) => variableIndex !== index
)
this.$store.commit("postwoman/removeVariable", newVariables)
this.$toast.error(this.$t("deleted"), {
icon: "delete",
action: {
text: this.$t("undo"),
onClick: (e, toastObject) => {
this.$store.commit("postwoman/removeVariable", oldVariables)
toastObject.remove()
},
},
})
this.syncEnvironments()
},
saveEnvironment() {
if (!this.$data.name) {
this.$toast.info(this.$t("invalid_environment_name"))
return
}
const environmentUpdated = {
...this.editingEnvCopy,
name: this.$data.name,
}
this.$store.commit("postwoman/saveEnvironment", {
environment: environmentUpdated,
environmentIndex: this.$props.editingEnvironmentIndex,
})
this.$emit("hide-modal")
this.syncEnvironments()
},
hideModal() {
this.$emit("hide-modal")
this.$data.name = undefined
},
},
}
</script>

View File

@@ -1,71 +0,0 @@
<template>
<div class="flex-wrap">
<div>
<button
class="icon"
@click="$emit('select-environment')"
v-tooltip.bottom="$t('use_environment')"
>
<i class="material-icons">insert_drive_file</i>
<span>{{ environment.name }}</span>
</button>
</div>
<v-popover>
<button class="tooltip-target icon" v-tooltip.left="$t('more')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="$emit('edit-environment')" v-close-popover>
<i class="material-icons">create</i>
<span>{{ $t("edit") }}</span>
</button>
</div>
<div>
<button class="icon" @click="removeEnvironment" v-close-popover>
<i class="material-icons">delete</i>
<span>{{ $t("delete") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
</template>
<style scoped lang="scss">
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
padding-left: 16px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
props: {
environment: Object,
environmentIndex: Number,
},
methods: {
syncEnvironments() {
if (fb.currentUser !== null) {
if (fb.currentSettings[1].value) {
fb.writeEnvironments(JSON.parse(JSON.stringify(this.$store.state.postwoman.environments)))
}
}
},
removeEnvironment() {
if (!confirm("Are you sure you want to remove this environment?")) return
this.$store.commit("postwoman/removeEnvironment", this.environmentIndex)
this.syncEnvironments()
},
},
}
</script>

View File

@@ -1,187 +0,0 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("import_export") }} {{ $t("environments") }}</h3>
<div>
<button class="icon" @click="hideModal">
<i class="material-icons">close</i>
</button>
</div>
</div>
<div class="flex-wrap">
<span
v-tooltip="{
content: !fb.currentUser ? $t('login_first') : $t('replace_current'),
}"
>
<button :disabled="!fb.currentUser" class="icon" @click="syncEnvironments">
<i class="material-icons">folder_shared</i>
<span>{{ $t("import_from_sync") }}</span>
</button>
</span>
<button
class="icon"
@click="openDialogChooseFileToReplaceWith"
v-tooltip="$t('replace_current')"
>
<i class="material-icons">create_new_folder</i>
<span>{{ $t("replace_json") }}</span>
<input
type="file"
@change="replaceWithJSON"
style="display: none;"
ref="inputChooseFileToReplaceWith"
accept="application/json"
/>
</button>
<button
class="icon"
@click="openDialogChooseFileToImportFrom"
v-tooltip="$t('preserve_current')"
>
<i class="material-icons">folder_special</i>
<span>{{ $t("import_json") }}</span>
<input
type="file"
@change="importFromJSON"
style="display: none;"
ref="inputChooseFileToImportFrom"
accept="application/json"
/>
</button>
</div>
</li>
</ul>
</div>
<div slot="body">
<textarea v-model="environmentJson" rows="8"></textarea>
</div>
<div slot="footer">
<div class="flex-wrap">
<span></span>
<span>
<button class="icon" @click="hideModal">
{{ $t("cancel") }}
</button>
<button class="icon primary" @click="exportJSON" v-tooltip="$t('download_file')">
{{ $t("export") }}
</button>
</span>
</div>
</div>
</modal>
</template>
<script>
import { fb } from "~/helpers/fb"
export default {
data() {
return {
fb,
}
},
props: {
show: Boolean,
},
components: {
modal: () => import("~/components/ui/modal"),
},
computed: {
environmentJson() {
return JSON.stringify(this.$store.state.postwoman.environments, null, 2)
},
},
methods: {
hideModal() {
this.$emit("hide-modal")
},
openDialogChooseFileToReplaceWith() {
this.$refs.inputChooseFileToReplaceWith.click()
},
openDialogChooseFileToImportFrom() {
this.$refs.inputChooseFileToImportFrom.click()
},
replaceWithJSON() {
let reader = new FileReader()
reader.onload = (event) => {
let content = event.target.result
let environments = JSON.parse(content)
this.$store.commit("postwoman/replaceEnvironments", environments)
}
reader.readAsText(this.$refs.inputChooseFileToReplaceWith.files[0])
this.fileImported()
this.syncToFBEnvironments()
},
importFromJSON() {
let reader = new FileReader()
reader.onload = (event) => {
let content = event.target.result
let importFileObj = JSON.parse(content)
if (
importFileObj["_postman_variable_scope"] === "environment" ||
importFileObj["_postman_variable_scope"] === "globals"
) {
this.importFromPostman(importFileObj)
} else {
this.importFromPostwoman(importFileObj)
}
}
reader.readAsText(this.$refs.inputChooseFileToImportFrom.files[0])
this.syncToFBEnvironments()
},
importFromPostwoman(environments) {
let confirmation = this.$t("file_imported")
this.$store.commit("postwoman/importAddEnvironments", {
environments,
confirmation,
})
},
importFromPostman(importFileObj) {
let environment = { name: importFileObj.name, variables: [] }
importFileObj.values.forEach((element) =>
environment.variables.push({ key: element.key, value: element.value })
)
let environments = [environment]
this.importFromPostwoman(environments)
},
exportJSON() {
let text = this.environmentJson
text = text.replace(/\n/g, "\r\n")
let blob = new Blob([text], {
type: "text/json",
})
let anchor = document.createElement("a")
anchor.download = "postwoman-environment.json"
anchor.href = window.URL.createObjectURL(blob)
anchor.target = "_blank"
anchor.style.display = "none"
document.body.appendChild(anchor)
anchor.click()
document.body.removeChild(anchor)
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
},
syncEnvironments() {
this.$store.commit("postwoman/replaceEnvironments", fb.currentEnvironments)
this.fileImported()
},
syncToFBEnvironments() {
if (fb.currentUser !== null) {
if (fb.currentSettings[1].value) {
fb.writeEnvironments(JSON.parse(JSON.stringify(this.$store.state.postwoman.environments)))
}
}
},
fileImported() {
this.$toast.info(this.$t("file_imported"), {
icon: "folder_shared",
})
},
},
}
</script>

View File

@@ -1,127 +0,0 @@
<template>
<pw-section class="green" icon="history" :label="$t('environments')" ref="environments">
<addEnvironment :show="showModalAdd" @hide-modal="displayModalAdd(false)" />
<editEnvironment
:show="showModalEdit"
:editingEnvironment="editingEnvironment"
:editingEnvironmentIndex="editingEnvironmentIndex"
@hide-modal="displayModalEdit(false)"
/>
<importExportEnvironment
:show="showModalImportExport"
@hide-modal="displayModalImportExport(false)"
/>
<div class="flex-wrap">
<div>
<button class="icon" @click="displayModalAdd(true)">
<i class="material-icons">add</i>
<span>{{ $t("new") }}</span>
</button>
</div>
<div>
<button class="icon" @click="displayModalImportExport(true)">
{{ $t("import_export") }}
</button>
</div>
</div>
<p v-if="environments.length === 0" class="info">
<i class="material-icons">help_outline</i> Create new environment
</p>
<div class="virtual-list">
<ul>
<li v-for="(environment, index) in environments" :key="environment.name">
<environment
:environmentIndex="index"
:environment="environment"
@edit-environment="editEnvironment(environment, index)"
@select-environment="$emit('use-environment', environment)"
/>
</li>
</ul>
</div>
</pw-section>
</template>
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 245px);
}
ul {
display: flex;
flex-direction: column;
}
</style>
<script>
import environment from "./environment"
import { fb } from "~/helpers/fb"
export default {
components: {
environment,
"pw-section": () => import("../layout/section"),
addEnvironment: () => import("./addEnvironment"),
editEnvironment: () => import("./editEnvironment"),
importExportEnvironment: () => import("./importExportEnvironment"),
},
data() {
return {
showModalImportExport: false,
showModalAdd: false,
showModalEdit: false,
editingEnvironment: undefined,
editingEnvironmentIndex: undefined,
}
},
computed: {
environments() {
return fb.currentUser !== null
? fb.currentEnvironments
: this.$store.state.postwoman.environments
},
},
async mounted() {
this._keyListener = function (e) {
if (e.key === "Escape") {
e.preventDefault()
this.showModalImportExport = this.showModalAdd = this.showModalEdit = false
}
}
document.addEventListener("keydown", this._keyListener.bind(this))
},
methods: {
displayModalAdd(shouldDisplay) {
this.showModalAdd = shouldDisplay
},
displayModalEdit(shouldDisplay) {
this.showModalEdit = shouldDisplay
if (!shouldDisplay) this.resetSelectedData()
},
displayModalImportExport(shouldDisplay) {
this.showModalImportExport = shouldDisplay
},
editEnvironment(environment, environmentIndex) {
this.$data.editingEnvironment = environment
this.$data.editingEnvironmentIndex = environmentIndex
this.displayModalEdit(true)
this.syncEnvironments()
},
resetSelectedData() {
this.$data.editingEnvironment = undefined
this.$data.editingEnvironmentIndex = undefined
},
syncEnvironments() {
if (fb.currentUser !== null) {
if (fb.currentSettings[1].value) {
fb.writeEnvironments(JSON.parse(JSON.stringify(this.$store.state.postwoman.environments)))
}
}
},
},
beforeDestroy() {
document.removeEventListener("keydown", this._keyListener)
},
}
</script>

View File

@@ -1,69 +0,0 @@
<template>
<div v-if="fb.currentFeeds.length !== 0" class="virtual-list">
<ul v-for="feed in fb.currentFeeds" :key="feed.id" class="entry">
<div class="show-on-large-screen">
<li class="info">
<label>
{{ feed.label || $t("no_label") }}
</label>
</li>
<button class="icon" @click="deleteFeed(feed)">
<i class="material-icons">delete</i>
</button>
</div>
<div class="show-on-large-screen">
<li class="info clamb-3">
<label>{{ feed.message || $t("empty") }}</label>
</li>
</div>
</ul>
</div>
<ul v-else>
<li>
<label class="info">{{ $t("empty") }}</label>
</li>
</ul>
</template>
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 298px);
}
ul,
ol {
flex-direction: column;
}
.entry {
border-bottom: 1px dashed var(--brd-color);
padding: 0 0 8px;
}
.clamb-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
data() {
return {
fb,
}
},
methods: {
deleteFeed(feed) {
fb.deleteFeed(feed.id)
this.$toast.error(this.$t("deleted"), {
icon: "delete",
})
},
},
}
</script>

View File

@@ -1,69 +0,0 @@
<template>
<div>
<ul>
<div class="show-on-large-screen">
<li>
<input
:aria-label="$t('label')"
type="text"
autofocus
v-model="message"
:placeholder="$t('paste_a_note')"
@keyup.enter="formPost"
/>
</li>
</div>
<div class="show-on-large-screen">
<li>
<input
:aria-label="$t('label')"
type="text"
autofocus
v-model="label"
:placeholder="$t('label')"
@keyup.enter="formPost"
/>
</li>
<button
class="icon"
:disabled="!(this.message || this.label)"
value="Save"
@click="formPost"
>
<i class="material-icons">add</i>
<span>Add</span>
</button>
</div>
</ul>
</div>
</template>
<style scoped lang="scss">
ul,
ol {
flex-direction: column;
}
</style>
<script>
import { fb } from "~/helpers/fb"
export default {
data() {
return {
message: null,
label: null,
}
},
methods: {
formPost() {
if (!(this.message || this.label)) {
return
}
fb.writeFeeds(this.message, this.label)
this.message = null
this.label = null
},
},
}
</script>

View File

@@ -1,244 +0,0 @@
<template>
<div>
<div>
<button class="icon" @click="signInWithGoogle" v-close-popover>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="material-icons">
<path
d="M12.24 10.285V14.4h6.806c-.275 1.765-2.056 5.174-6.806 5.174-4.095 0-7.439-3.389-7.439-7.574s3.345-7.574 7.439-7.574c2.33 0 3.891.989 4.785 1.849l3.254-3.138C18.189 1.186 15.479 0 12.24 0c-6.635 0-12 5.365-12 12s5.365 12 12 12c6.926 0 11.52-4.869 11.52-11.726 0-.788-.085-1.39-.189-1.989H12.24z"
/>
</svg>
<span>Google</span>
</button>
</div>
<div>
<button class="icon" @click="signInWithGithub" v-close-popover>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="material-icons">
<path
d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"
/>
</svg>
<span>GitHub</span>
</button>
</div>
</div>
</template>
<script>
import firebase from "firebase/app"
import { fb } from "~/helpers/fb"
export default {
data() {
return {
fb,
}
},
methods: {
showLoginSuccess() {
this.$toast.info(this.$t("login_success"), {
icon: "vpn_key",
})
},
signInWithGoogle() {
const provider = new firebase.auth.GoogleAuthProvider()
const self = this
firebase
.auth()
.signInWithPopup(provider)
.then(({ additionalUserInfo }) => {
if (additionalUserInfo.isNewUser) {
self.$toast.info(`${self.$t("turn_on")} ${self.$t("sync")}`, {
icon: "sync",
duration: null,
closeOnSwipe: false,
action: {
text: self.$t("yes"),
onClick: (e, toastObject) => {
fb.writeSettings("syncHistory", true)
fb.writeSettings("syncCollections", true)
fb.writeSettings("syncEnvironments", true)
self.$router.push({ path: "/settings" })
toastObject.remove()
},
},
})
}
self.showLoginSuccess()
})
.catch((err) => {
// An error happened.
if (err.code === "auth/account-exists-with-different-credential") {
// Step 2.
// User's email already exists.
// The pending Google credential.
const pendingCred = err.credential
// The provider account's email address.
const email = err.email
// Get sign-in methods for this email.
firebase
.auth()
.fetchSignInMethodsForEmail(email)
.then((methods) => {
// Step 3.
// If the user has several sign-in methods,
// the first method in the list will be the "recommended" method to use.
if (methods[0] === "password") {
// Asks the user their password.
// In real scenario, you should handle this asynchronously.
const password = promptUserForPassword() // TODO: implement promptUserForPassword.
auth
.signInWithEmailAndPassword(email, password)
.then((
user // Step 4a.
) => user.linkWithCredential(pendingCred))
.then(() => {
// Google account successfully linked to the existing Firebase user.
self.showLoginSuccess()
})
return
}
self.$toast.info(`${self.$t("login_with")}`, {
icon: "vpn_key",
duration: null,
closeOnSwipe: false,
action: {
text: self.$t("yes"),
onClick: (e, toastObject) => {
// All the other cases are external providers.
// Construct provider object for that provider.
// TODO: implement getProviderForProviderId.
const provider = new firebase.auth.GithubAuthProvider()
// At this point, you should let the user know that they already has an account
// but with a different provider, and let them validate the fact they want to
// sign in with this provider.
// Sign in to provider. Note: browsers usually block popup triggered asynchronously,
// so in real scenario you should ask the user to click on a "continue" button
// that will trigger the signInWithPopup.
firebase
.auth()
.signInWithPopup(provider)
.then(({ user }) => {
// Remember that the user may have signed in with an account that has a different email
// address than the first one. This can happen as Firebase doesn't control the provider's
// sign in flow and the user is free to login using whichever account they own.
// Step 4b.
// Link to Google credential.
// As we have access to the pending credential, we can directly call the link method.
user.linkAndRetrieveDataWithCredential(pendingCred).then((usercred) => {
// Google account successfully linked to the existing Firebase user.
self.showLoginSuccess()
})
})
toastObject.remove()
},
},
})
})
}
})
},
signInWithGithub() {
const provider = new firebase.auth.GithubAuthProvider()
const self = this
firebase
.auth()
.signInWithPopup(provider)
.then(({ additionalUserInfo }) => {
if (additionalUserInfo.isNewUser) {
self.$toast.info(`${self.$t("turn_on")} ${self.$t("sync")}`, {
icon: "sync",
duration: null,
closeOnSwipe: false,
action: {
text: self.$t("yes"),
onClick: (e, toastObject) => {
fb.writeSettings("syncHistory", true)
fb.writeSettings("syncCollections", true)
fb.writeSettings("syncEnvironments", true)
self.$router.push({ path: "/settings" })
toastObject.remove()
},
},
})
}
self.showLoginSuccess()
})
.catch((err) => {
// An error happened.
if (err.code === "auth/account-exists-with-different-credential") {
// Step 2.
// User's email already exists.
// The pending Google credential.
const pendingCred = err.credential
// The provider account's email address.
const email = err.email
// Get sign-in methods for this email.
firebase
.auth()
.fetchSignInMethodsForEmail(email)
.then((methods) => {
// Step 3.
// If the user has several sign-in methods,
// the first method in the list will be the "recommended" method to use.
if (methods[0] === "password") {
// Asks the user their password.
// In real scenario, you should handle this asynchronously.
const password = promptUserForPassword() // TODO: implement promptUserForPassword.
firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then((
user // Step 4a.
) => user.linkWithCredential(pendingCred))
.then(() => {
// Google account successfully linked to the existing Firebase user.
self.showLoginSuccess()
})
return
}
self.$toast.info(`${self.$t("login_with")}`, {
icon: "vpn_key",
duration: null,
closeOnSwipe: false,
action: {
text: self.$t("yes"),
onClick: (e, toastObject) => {
// All the other cases are external providers.
// Construct provider object for that provider.
// TODO: implement getProviderForProviderId.
const provider = new firebase.auth.GoogleAuthProvider()
// At this point, you should let the user know that they already has an account
// but with a different provider, and let them validate the fact they want to
// sign in with this provider.
// Sign in to provider. Note: browsers usually block popup triggered asynchronously,
// so in real scenario you should ask the user to click on a "continue" button
// that will trigger the signInWithPopup.
firebase
.auth()
.signInWithPopup(provider)
.then(({ user }) => {
// Remember that the user may have signed in with an account that has a different email
// address than the first one. This can happen as Firebase doesn't control the provider's
// sign in flow and the user is free to login using whichever account they own.
// Step 4b.
// Link to Google credential.
// As we have access to the pending credential, we can directly call the link method.
user.linkAndRetrieveDataWithCredential(pendingCred).then((usercred) => {
self.showLoginSuccess()
})
})
toastObject.remove()
},
},
})
})
}
})
},
},
}
</script>

View File

@@ -1,38 +0,0 @@
<template>
<div>
<button class="icon" @click="logout" v-close-popover>
<i class="material-icons">exit_to_app</i>
<span>{{ $t("logout") }}</span>
</button>
</div>
</template>
<script>
import firebase from "firebase/app"
import { fb } from "~/helpers/fb"
export default {
data() {
return {
fb,
}
},
methods: {
logout() {
fb.currentUser = null
const self = this
firebase
.auth()
.signOut()
.catch((err) => {
self.$toast.show(err.message || err, {
icon: "error",
})
})
self.$toast.info(this.$t("logged_out"), {
icon: "vpn_key",
})
},
},
}
</script>

View File

@@ -1,38 +0,0 @@
<template>
<span>
<span class="argumentName">
{{ argName }}
</span>
:
<typelink :type="argType" :jumpTypeCallback="jumpCallback" />
</span>
</template>
<style scoped lang="scss"></style>
<script>
import typelink from "./typelink"
export default {
components: {
typelink: typelink,
},
props: {
gqlArg: Object,
},
computed: {
argName() {
return this.gqlArg.name
},
argType() {
return this.gqlArg.type
},
},
methods: {
jumpCallback(typeName) {},
},
}
</script>

View File

@@ -1,85 +0,0 @@
<template>
<div class="field-box">
<div class="field-title">
{{ fieldName }}
<span v-if="fieldArgs.length > 0">
(
<span v-for="(field, index) in fieldArgs" :key="index">
{{ field.name }}:
<typelink :gqlType="field.type" :jumpTypeCallback="jumpTypeCallback" />
<span v-if="index !== fieldArgs.length - 1">
,
</span>
</span>
) </span
>:
<typelink :gqlType="gqlField.type" :jumpTypeCallback="jumpTypeCallback" />
</div>
<div class="field-desc" v-if="gqlField.description">
{{ gqlField.description }}
</div>
<div class="field-deprecated" v-if="gqlField.isDeprecated">
{{ $t("deprecated") }}
</div>
</div>
</template>
<style scoped lang="scss">
.field-box {
padding: 16px;
margin: 4px;
border-bottom: 1px dashed var(--brd-color);
}
.field-deprecated {
background-color: yellow;
color: black;
display: inline-block;
padding: 4px 8px;
margin: 4px 0;
border-radius: 8px;
font-size: 14px;
font-weight: 700;
}
.field-desc {
color: var(--fg-light-color);
margin-top: 4px;
}
</style>
<script>
import typelink from "./typelink"
export default {
components: {
typelink: typelink,
},
props: {
gqlField: Object,
jumpTypeCallback: Function,
},
computed: {
fieldString() {
const args = (this.gqlField.args || []).reduce(
(acc, { name, type }, index) =>
acc + `${name}: ${type.toString()}${index !== this.gqlField.args.length - 1 ? ", " : ""}`,
""
)
const argsString = args.length > 0 ? `(${args})` : ""
return `${this.gqlField.name}${argsString}: ${this.gqlField.type.toString()}`
},
fieldName() {
return this.gqlField.name
},
fieldArgs() {
return this.gqlField.args || []
},
},
}
</script>

View File

@@ -1,226 +0,0 @@
<template>
<div class="show-if-initialized" :class="{ initialized }">
<pre ref="editor"></pre>
</div>
</template>
<style lang="scss">
.show-if-initialized {
opacity: 0;
&.initialized {
opacity: 1;
}
& > * {
transition: none;
}
}
</style>
<script>
const DEFAULT_THEME = "twilight"
import ace from "ace-builds"
import "ace-builds/webpack-resolver"
import "ace-builds/src-noconflict/ext-language_tools"
import "ace-builds/src-noconflict/mode-graphqlschema"
import { defineGQLLanguageMode } from "~/helpers/syntax/gqlQueryLangMode"
import * as gql from "graphql"
import { getAutocompleteSuggestions } from "graphql-language-service-interface"
import debounce from "~/helpers/utils/debounce"
export default {
props: {
value: {
type: String,
default: "",
},
theme: {
type: String,
required: false,
},
onRunGQLQuery: {
type: Function,
default: () => {},
},
options: {
type: Object,
default: {},
},
},
data() {
return {
initialized: false,
editor: null,
cacheValue: "",
validationSchema: null,
}
},
watch: {
value(value) {
if (value !== this.cacheValue) {
this.editor.session.setValue(value, 1)
this.cacheValue = value
}
},
theme() {
this.initialized = false
this.editor.setTheme(`ace/theme/${this.defineTheme()}`, () => {
this.$nextTick().then(() => {
this.initialized = true
})
})
},
options(value) {
this.editor.setOptions(value)
},
},
mounted() {
defineGQLLanguageMode(ace)
let langTools = ace.require("ace/ext/language_tools")
const editor = ace.edit(this.$refs.editor, {
mode: `ace/mode/gql-query`,
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
...this.options,
})
// Set the theme and show the editor only after it's been set to prevent FOUC.
editor.setTheme(`ace/theme/${this.defineTheme()}`, () => {
this.$nextTick().then(() => {
this.initialized = true
})
})
// Set the theme and show the editor only after it's been set to prevent FOUC.
editor.setTheme(`ace/theme/${this.defineTheme()}`, () => {
this.$nextTick().then(() => {
this.initialized = true
})
})
const completer = {
getCompletions: (editor, _session, { row, column }, _prefix, callback) => {
if (this.validationSchema) {
const completions = getAutocompleteSuggestions(this.validationSchema, editor.getValue(), {
line: row,
character: column,
})
callback(
null,
completions.map(({ label, detail }) => ({
name: label,
value: label,
score: 1.0,
meta: detail,
}))
)
} else {
callback(null, [])
}
},
}
langTools.setCompleters([completer])
if (this.value) editor.setValue(this.value, 1)
this.editor = editor
this.cacheValue = this.value
editor.commands.addCommand({
name: "runGQLQuery",
exec: () => this.onRunGQLQuery(this.editor.getValue()),
bindKey: {
mac: "cmd-enter",
win: "ctrl-enter",
},
})
editor.commands.addCommand({
name: "prettifyGQLQuery",
exec: () => this.prettifyQuery(),
bindKey: {
mac: "cmd-p",
win: "ctrl-p",
},
})
editor.on("change", () => {
const content = editor.getValue()
this.$emit("input", content)
this.parseContents(content)
this.cacheValue = content
})
this.parseContents(this.value)
},
methods: {
prettifyQuery() {
try {
this.value = gql.print(gql.parse(this.editor.getValue()))
} catch (e) {
this.$toast.error(`${this.$t("gql_prettify_invalid_query")}`, {
icon: "error",
})
}
},
defineTheme() {
if (this.theme) {
return this.theme
} else {
return this.$store.state.postwoman.settings.THEME_ACE_EDITOR || DEFAULT_THEME
}
},
setValidationSchema(schema) {
this.validationSchema = schema
this.parseContents(this.cacheValue)
},
parseContents: debounce(function (content) {
if (content !== "") {
try {
const doc = gql.parse(content)
if (this.validationSchema) {
this.editor.session.setAnnotations(
gql.validate(this.validationSchema, doc).map(({ locations, message }) => ({
row: locations[0].line - 1,
column: locations[0].column - 1,
text: message,
type: "error",
}))
)
}
} catch (e) {
this.editor.session.setAnnotations([
{
row: e.locations[0].line - 1,
column: e.locations[0].column - 1,
text: e.message,
type: "error",
},
])
}
} else {
this.editor.session.setAnnotations([])
}
}, 2000),
},
beforeDestroy() {
this.editor.destroy()
},
}
</script>

View File

@@ -1,44 +0,0 @@
<template>
<div class="type-box">
<div class="type-title">{{ gqlType.name }}</div>
<div class="type-desc" v-if="gqlType.description">
{{ gqlType.description }}
</div>
<div v-if="gqlType.getFields">
<h5>{{ $t("fields") }}</h5>
<div v-for="field in gqlType.getFields()" :key="field.name">
<gql-field :gqlField="field" :jumpTypeCallback="jumpTypeCallback" />
</div>
</div>
</div>
</template>
<style scoped lang="scss">
.type-box {
padding: 16px;
margin: 4px 0;
}
.type-desc {
color: var(--fg-light-color);
margin-top: 4px;
}
.type-title {
font-weight: 700;
}
</style>
<script>
export default {
components: {
"gql-field": () => import("./field"),
},
props: {
gqlType: {},
jumpTypeCallback: Function,
},
}
</script>

View File

@@ -1,34 +0,0 @@
<template>
<span class="typelink" @click="jumpToType">{{ typeString }}</span>
</template>
<style scoped lang="scss">
.typelink {
color: var(--ac-color);
font-family: "Roboto Mono", monospace;
font-weight: 400;
cursor: pointer;
}
</style>
<script>
export default {
props: {
gqlType: null,
// (typeName: string) => void
jumpTypeCallback: Function,
},
computed: {
typeString() {
return this.gqlType.toString()
},
},
methods: {
jumpToType() {
this.jumpTypeCallback(this.gqlType)
},
},
}
</script>

View File

@@ -1,174 +0,0 @@
<template>
<div>
<p class="info">
{{ $t("donate_info1") }}
</p>
<p class="info">
{{ $t("donate_info2") }}
</p>
<div class="flex-wrap">
<span>
<a
href="https://github.com/sponsors/postwoman-io"
target="_blank"
rel="noopener"
v-tooltip.right="$t('recurring')"
>
<button class="icon">
<i class="material-icons">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
class="material-icons"
>
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"
/>
</svg>
</i>
<span>GitHub Sponsors</span>
</button>
</a>
</span>
</div>
<div class="flex-wrap">
<span>
<a
href="https://opencollective.com/postwoman"
target="_blank"
rel="noopener"
v-tooltip.right="$t('one_time_recurring')"
>
<button class="icon">
<i class="material-icons">donut_large</i>
<span>{{ $t("open_collective") }}</span>
</button>
</a>
</span>
</div>
<div>
<a
href="https://www.patreon.com/liyasthomas"
target="_blank"
rel="noopener"
v-tooltip.right="$t('recurring')"
>
<button class="icon">
<i class="material-icons">local_parking</i>
<span>{{ $t("patreon") }}</span>
</button>
</a>
</div>
<div>
<a
href="https://www.paypal.me/liyascthomas"
target="_blank"
rel="noopener"
v-tooltip.right="$t('one_time')"
>
<button class="icon">
<i class="material-icons">payment</i>
<span>{{ $t("paypal") }}</span>
</button>
</a>
</div>
<hr />
<h3 class="title">Financial Contributors</h3>
<p class="info">
Become a financial contributor and help us sustain our community.
<a class="link" href="https://opencollective.com/postwoman/contribute">Contribute</a>.
</p>
<h3 class="title">Organizations</h3>
<p class="info">
Support this project with your organization. Your logo will show up here with a link to your
website.
<a class="link" href="https://opencollective.com/postwoman/contribute">Contribute</a>.
</p>
<div class="contributors">
<a href="https://tyk.io" target="_blank" rel="noopener">
<img
style="max-width: 320px;"
src="~assets/images/Tyk-side-project-logo-tagline-blk.png"
alt="Tyk Banner"
/>
</a>
</div>
<div class="contributors">
<a href="https://opencollective.com/postwoman/organization/0/website">
<img src="https://opencollective.com/postwoman/organization/0/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/1/website">
<img src="https://opencollective.com/postwoman/organization/1/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/2/website">
<img src="https://opencollective.com/postwoman/organization/2/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/3/website">
<img src="https://opencollective.com/postwoman/organization/3/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/4/website">
<img src="https://opencollective.com/postwoman/organization/4/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/5/website">
<img src="https://opencollective.com/postwoman/organization/5/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/6/website">
<img src="https://opencollective.com/postwoman/organization/6/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/7/website">
<img src="https://opencollective.com/postwoman/organization/7/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/8/website">
<img src="https://opencollective.com/postwoman/organization/8/avatar.svg" />
</a>
<a href="https://opencollective.com/postwoman/organization/9/website">
<img src="https://opencollective.com/postwoman/organization/9/avatar.svg" />
</a>
</div>
<h3 class="title">Individuals</h3>
<p class="info">
Support this project with your organization. Your logo will show up here with a link to your
website.
<a class="link" href="https://opencollective.com/postwoman/contribute">Contribute</a>.
</p>
<div class="contributors">
<a href="http://tom.preston-werner.com" target="_blank" rel="noopener">
<img
style="max-width: 64px; max-height: 64px; border-radius: 100%;"
src="https://github.com/mojombo.png?size=64"
alt="Tom Preston-Werner"
/>
</a>
<a href="https://opencollective.com/postwoman">
<img src="https://opencollective.com/postwoman/individuals.svg" />
</a>
</div>
<h3 class="title">Code Contributors</h3>
<p class="info">
This project exists thanks to all the people who contribute.
</p>
<div class="contributors">
<a href="https://github.com/liyasthomas/postwoman/graphs/contributors">
<img src="https://opencollective.com/postwoman/contributors.svg" />
</a>
</div>
</div>
</template>
<style scoped lang="scss">
.contributors {
display: flex;
align-items: center;
flex-flow: row nowrap;
overflow: auto;
padding: 8px 0;
margin: 8px 0;
max-width: calc(100vw - 72px);
}
</style>
<script>
export default {}
</script>

View File

@@ -1,98 +0,0 @@
<template>
<footer class="footer">
<div class="flex-wrap">
<span v-if="version.name" class="mono">
<a
class="footer-link"
:href="'https://github.com/liyasthomas/postwoman/releases/tag/' + version.name"
target="_blank"
rel="noopener"
v-tooltip="'GitHub'"
>
{{ version.name }}
</a>
<a
class="footer-link hide-on-small-screen"
href="https://www.netlify.com"
target="_blank"
rel="noopener"
>
Powered by Netlify
</a>
<!-- <span v-if="version.hash">
-
<a
:href="'https://github.com/liyasthomas/postwoman/commit/' + version.hash"
target="_blank"
rel="noopener"
>{{version.hash}}</a>
</span> -->
<!-- <span v-if="version.variant">({{version.variant}})</span> -->
</span>
<span>
<a href="https://liyasthomas.web.app" target="_blank" rel="noopener">
<button class="icon" v-tooltip="'Liyas Thomas'">
🦄
</button>
</a>
<a href="mailto:hello@postwoman.io" target="_blank" rel="noopener">
<button class="icon" v-tooltip="$t('contact_us')">
<i class="material-icons">email</i>
</button>
</a>
<v-popover>
<button class="icon" v-tooltip="$t('choose_language')">
<i class="material-icons">translate</i>
</button>
<template slot="popover">
<div v-for="locale in availableLocales" :key="locale.code">
<nuxt-link :to="switchLocalePath(locale.code)">
<button class="icon" v-close-popover>
{{ locale.name }}
</button>
</nuxt-link>
</div>
</template>
</v-popover>
</span>
</div>
</footer>
</template>
<style scoped lang="scss">
.footer {
flex-flow: column nowrap;
}
.footer-link {
margin: 8px 16px;
color: var(--fg-light-color);
&:hover {
color: var(--fg-color);
}
}
</style>
<script>
import * as version from "../../.postwoman/version.json"
export default {
data() {
return {
version: {},
}
},
beforeMount() {
// Set version data
this.version = version.default
},
computed: {
availableLocales() {
return this.$i18n.locales.filter(({ code }) => code !== this.$i18n.locale)
},
},
}
</script>

View File

@@ -1,420 +0,0 @@
<template>
<header class="header">
<div class="flex-wrap">
<span class="slide-in">
<nuxt-link :to="localePath('index')">
<h1 class="logo">Postwoman</h1>
</nuxt-link>
</span>
<span>
<button
class="icon"
id="installPWA"
@click.prevent="showInstallPrompt()"
v-tooltip="$t('install_pwa')"
>
<i class="material-icons">offline_bolt</i>
</button>
<a
href="https://github.com/liyasthomas/postwoman"
target="_blank"
aria-label="GitHub"
rel="noopener"
>
<button class="icon" aria-label="GitHub" v-tooltip="'GitHub'">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="material-icons">
<path
d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"
/>
</svg>
</button>
</a>
<v-popover v-if="fb.currentUser === null">
<button class="icon" v-tooltip="$t('login_with')">
<i class="material-icons">login</i>
</button>
<template slot="popover">
<login />
</template>
</v-popover>
<v-popover v-else>
<button
class="icon"
v-tooltip="
(fb.currentUser.displayName || '<label><i>Name not found</i></label>') +
'<br>' +
(fb.currentUser.email || '<label><i>Email not found</i></label>')
"
aria-label="Account"
>
<img
v-if="fb.currentUser.photoURL"
:src="fb.currentUser.photoURL"
class="material-icons"
alt="Profile image"
/>
<i v-else class="material-icons">account_circle</i>
</button>
<template slot="popover">
<div>
<nuxt-link :to="localePath('settings')" v-close-popover>
<button class="icon">
<i class="material-icons">settings</i>
<span>
{{ $t("settings") }}
</span>
</button>
</nuxt-link>
</div>
<div>
<logout />
</div>
</template>
</v-popover>
<v-popover>
<button class="icon" v-tooltip="$t('more')">
<i class="material-icons">drag_indicator</i>
</button>
<template slot="popover">
<button class="icon" @click="showExtensions = true" v-close-popover>
<i class="material-icons">extension</i>
<span>{{ $t("extensions") }}</span>
</button>
<button class="icon" @click="showShortcuts = true" v-close-popover>
<i class="material-icons">keyboard</i>
<span>{{ $t("shortcuts") }}</span>
</button>
<button class="icon" @click="showSupport = true" v-close-popover>
<i class="material-icons">favorite</i>
<span>{{ $t("support_us") }}</span>
</button>
<button
class="icon"
onClick="window.open('https://twitter.com/share?text=👽 Postwoman • A free, fast and beautiful API request builder - Web alternative to Postman - Helps you create requests faster, saving precious time on development.&url=https://postwoman.io&hashtags=postwoman&via=liyasthomas');"
v-close-popover
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<path
d="M24 4.557a9.83 9.83 0 01-2.828.775 4.932 4.932 0 002.165-2.724 9.864 9.864 0 01-3.127 1.195 4.916 4.916 0 00-3.594-1.555c-3.179 0-5.515 2.966-4.797 6.045A13.978 13.978 0 011.671 3.149a4.93 4.93 0 001.523 6.574 4.903 4.903 0 01-2.229-.616c-.054 2.281 1.581 4.415 3.949 4.89a4.935 4.935 0 01-2.224.084 4.928 4.928 0 004.6 3.419A9.9 9.9 0 010 19.54a13.94 13.94 0 007.548 2.212c9.142 0 14.307-7.721 13.995-14.646A10.025 10.025 0 0024 4.557z"
/>
</svg>
<span>{{ $t("tweet") }}</span>
</button>
<button
v-if="navigatorShare"
class="icon"
@click="nativeShare"
v-close-popover
v-tooltip="$t('more')"
>
<i class="material-icons">share</i>
<span>Share</span>
</button>
</template>
</v-popover>
</span>
</div>
<modal v-if="showExtensions" @close="showExtensions = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("extensions") }}</h3>
<div>
<button class="icon" @click="showExtensions = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<p class="info">
{{ $t("extensions_info1") }}
</p>
<div>
<a
href="https://addons.mozilla.org/en-US/firefox/addon/postwoman"
target="_blank"
rel="noopener"
>
<button class="icon">
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<path
d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm8.003 8.657c-1.276-3.321-4.46-4.605-5.534-4.537 3.529 1.376 4.373 6.059 4.06 7.441-.307-1.621-1.286-3.017-1.872-3.385 3.417 8.005-4.835 10.465-7.353 7.687.649.168 1.931.085 2.891-.557.898-.602.983-.638 1.56-.683.686-.053-.041-1.406-1.539-1.177-.616.094-1.632.819-2.88.341-1.508-.576-1.46-2.634.096-2.015.337-.437.088-1.263.088-1.263.452-.414 1.022-.706 1.37-.911.228-.135.829-.507.795-1.23-.123-.096-.32-.219-.766-.193-1.736.11-1.852-.518-1.967-.808.078-.668.524-1.534 1.361-1.931-1.257-.193-2.28.397-2.789 1.154-.809-.174-1.305-.183-2.118-.031-.316-.24-.666-.67-.878-1.181C6.36 3.312 9.027 2 12 2c5.912 0 8.263 4.283 8.003 6.657z"
/>
</svg>
<span>Firefox</span>
<span class="icon" v-if="hasFirefoxExtInstalled" v-tooltip="$t('installed')">
<i class="material-icons">done</i>
</span>
</button>
</a>
</div>
<div>
<a
href="https://chrome.google.com/webstore/detail/postwoman-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld"
target="_blank"
rel="noopener"
>
<button class="icon">
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<path
d="M2.897 4.181A11.87 11.87 0 0111.969 0c4.288 0 8.535 2.273 10.717 6.554h-9.293c-1.674.001-2.755-.037-3.926.579-1.376.724-2.415 2.067-2.777 3.644L2.897 4.181zM8.007 12c0 2.2 1.789 3.99 3.988 3.99s3.988-1.79 3.988-3.99-1.789-3.991-3.988-3.991S8.007 9.8 8.007 12zm5.536 5.223c-2.238.666-4.858-.073-6.293-2.549-1.095-1.891-3.989-6.933-5.305-9.225A11.856 11.856 0 000 11.956c0 5.448 3.726 10.65 9.673 11.818l3.87-6.551zm2.158-9.214a5.463 5.463 0 011.007 6.719 1815.43 1815.43 0 01-5.46 9.248C18.437 24.419 24 18.616 24 12.004c0-1.313-.22-2.66-.69-3.995h-7.609z"
/>
</svg>
<span>Chrome</span>
<span class="icon" v-if="hasChromeExtInstalled" v-tooltip="$t('installed')">
<i class="material-icons">done</i>
</span>
</button>
</a>
</div>
</div>
<div slot="footer"></div>
</modal>
<modal v-if="showShortcuts" @close="showShortcuts = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("shortcuts") }}</h3>
<div>
<button class="icon" @click="showShortcuts = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<div>
<label>{{ $t("send_request") }}</label>
<kbd>{{ getSpecialKey() }} G</kbd>
</div>
<div>
<label>{{ $t("save_to_collections") }}</label>
<kbd>{{ getSpecialKey() }} S</kbd>
</div>
<div>
<label>{{ $t("copy_request_link") }}</label>
<kbd>{{ getSpecialKey() }} K</kbd>
</div>
<div>
<label>{{ $t("reset_request") }}</label>
<kbd>{{ getSpecialKey() }} L</kbd>
</div>
</div>
<div slot="footer"></div>
</modal>
<modal v-if="showSupport" @close="showSupport = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("support_us") }}</h3>
<div>
<button class="icon" @click="showSupport = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<contributors />
</div>
<div slot="footer"></div>
</modal>
</header>
</template>
<style scoped lang="scss">
@keyframes slideIn {
0% {
opacity: 0;
left: -16px;
}
100% {
opacity: 1;
left: 0px;
}
}
.slide-in {
position: relative;
animation: slideIn 0.2s forwards ease-in-out;
}
.logo {
font-size: 22px;
&:hover {
color: var(--ac-color);
}
}
</style>
<script>
import intializePwa from "~/assets/js/pwa"
import {
hasExtensionInstalled,
hasChromeExtensionInstalled,
hasFirefoxExtensionInstalled,
} from "~/helpers/strategies/ExtensionStrategy"
import { getPlatformSpecialKey } from "~/helpers/platformutils"
import firebase from "firebase/app"
import { fb } from "~/helpers/fb"
export default {
components: {
modal: () => import("../ui/modal"),
login: () => import("../firebase/login"),
logout: () => import("../firebase/logout"),
contributors: () => import("./contributors"),
},
data() {
return {
// Once the PWA code is initialized, this holds a method
// that can be called to show the user the installation
// prompt.
showInstallPrompt: null,
showExtensions: false,
hasChromeExtInstalled: hasChromeExtensionInstalled(),
hasFirefoxExtInstalled: hasFirefoxExtensionInstalled(),
showShortcuts: false,
showSupport: false,
fb,
navigatorShare: navigator.share,
}
},
mounted() {
// Initializes the PWA code - checks if the app is installed,
// etc.
;(async () => {
this.showInstallPrompt = await intializePwa()
let cookiesAllowed = localStorage.getItem("cookiesAllowed") === "yes"
if (!cookiesAllowed) {
this.$toast.show(this.$t("we_use_cookies"), {
icon: "info",
duration: 5000,
theme: "toasted-primary",
action: [
{
text: this.$t("dismiss"),
onClick: (e, toastObject) => {
localStorage.setItem("cookiesAllowed", "yes")
toastObject.goAway(0)
},
},
],
})
}
// let showAd = localStorage.getItem("showAd") === "no"
// if (!showAd) {
// setTimeout(() => {
// this.$toast.clear()
// this.$toast.show(
// "<span>Get <u><a href='https://gum.co/keky' target='_blank' rel='noopener'>De-Coding The Passion Project</a></u> book, expertly crafted by the creator of Postwoman. Whoosh this away to dismiss →</span>",
// {
// icon: "",
// duration: 0,
// theme: "toasted-ad",
// action: [
// {
// text: "Get",
// icon: "chevron_right",
// onClick: (e, toastObject) => {
// localStorage.setItem("showAd", "no")
// toastObject.goAway(0)
// window.open("https://gum.co/keky")
// },
// },
// ],
// onComplete() {
// localStorage.setItem("showAd", "no")
// },
// }
// )
// }, 11000)
// }
let showExtensionsToast = localStorage.getItem("showExtensionsToast") === "yes"
// Just return if showExtensionsToast is "no"
if (!showExtensionsToast) return
setTimeout(() => {
if (!hasExtensionInstalled()) {
this.$toast.show(this.$t("extensions_info2"), {
icon: "extension",
duration: 5000,
theme: "toasted-primary",
action: [
{
text: this.$t("yes"),
onClick: (e, toastObject) => {
this.showExtensions = true
localStorage.setItem("showExtensionsToast", "yes")
toastObject.goAway(0)
},
},
{
text: this.$t("no"),
onClick: (e, toastObject) => {
this.$store.commit("setMiscState", {
value: false,
attribute: "showExtensionsToast",
})
localStorage.setItem("showExtensionsToast", "no")
toastObject.goAway(0)
},
},
],
})
}
}, 5000)
this._keyListener = function (e) {
if (e.key === "Escape") {
e.preventDefault()
this.showExtensions = this.showShortcuts = this.showSupport = false
}
}
document.addEventListener("keydown", this._keyListener.bind(this))
})()
},
methods: {
getSpecialKey: getPlatformSpecialKey,
nativeShare() {
if (navigator.share) {
navigator
.share({
title: "Postwoman",
text:
"Postwoman • A free, fast and beautiful API request builder - Web alternative to Postman - Helps you create requests faster, saving precious time on development.",
url: "https://postwoman.io/",
})
.then(() => {})
.catch(console.error)
} else {
// fallback
}
},
},
computed: {
availableLocales() {
return this.$i18n.locales.filter((i) => i.code !== this.$i18n.locale)
},
},
}
</script>

View File

@@ -1,473 +0,0 @@
<template>
<pw-section class="green" icon="history" :label="$t('history')" ref="history">
<div class="show-on-large-screen">
<input aria-label="Search" type="search" :placeholder="$t('search')" v-model="filterText" />
<button class="icon">
<i class="material-icons">search</i>
</button>
</div>
<div class="virtual-list" :class="{ filled: filteredHistory.length }">
<ul v-for="(entry, index) in filteredHistory" :key="index" class="entry">
<div class="show-on-large-screen">
<button
class="icon"
:class="{ stared: entry.star }"
@click="toggleStar(entry)"
v-tooltip="{
content: !entry.star ? $t('add_star') : $t('remove_star'),
}"
>
<i class="material-icons">
{{ entry.star ? "star" : "star_border" }}
</i>
</button>
<li>
<input
:aria-label="$t('label')"
type="text"
readonly
:value="entry.label"
:placeholder="$t('no_label')"
class="bg-color"
/>
</li>
<!-- <li>
<button
class="icon"
v-tooltip="{
content: !entry.usesScripts
? 'No pre-request script'
: 'Used pre-request script'
}"
>
<i class="material-icons">
{{ !entry.usesScripts ? "http" : "code" }}
</i>
</button>
</li> -->
<v-popover>
<button class="tooltip-target icon" v-tooltip="$t('options')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button
class="icon"
:id="'use-button#' + index"
@click="useHistory(entry)"
:aria-label="$t('edit')"
v-close-popover
>
<i class="material-icons">restore</i>
<span>{{ $t("restore") }}</span>
</button>
</div>
<div>
<button
class="icon"
:id="'delete-button#' + index"
@click="deleteHistory(entry)"
:aria-label="$t('delete')"
v-close-popover
>
<i class="material-icons">delete</i>
<span>{{ $t("delete") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
<div class="show-on-large-screen">
<li class="method-list-item">
<input
:aria-label="$t('method')"
type="text"
readonly
:value="entry.method"
:class="findEntryStatus(entry).className"
:style="{ '--status-code': entry.status }"
/>
<span
class="entry-status-code"
:class="findEntryStatus(entry).className"
:style="{ '--status-code': entry.status }"
>{{ entry.status }}</span
>
</li>
</div>
<div class="show-on-large-screen">
<li>
<input
:aria-label="$t('url')"
type="text"
readonly
:value="entry.url"
:placeholder="$t('no_url')"
/>
</li>
<li>
<input
:aria-label="$t('path')"
type="text"
readonly
:value="entry.path"
:placeholder="$t('no_path')"
/>
</li>
</div>
<transition name="fade">
<div v-if="showMore" class="show-on-large-screen">
<li>
<input
:aria-label="$t('time')"
type="text"
readonly
:value="entry.time"
v-tooltip="entry.date"
/>
</li>
<li>
<input
:aria-label="$t('duration')"
type="text"
readonly
:value="entry.duration"
:placeholder="$t('no_duration')"
/>
</li>
<li>
<input
:aria-label="$t('prerequest_script')"
type="text"
readonly
:value="entry.preRequestScript"
:placeholder="$t('no_prerequest_script')"
/>
</li>
</div>
</transition>
</ul>
</div>
<ul :class="{ hidden: filteredHistory.length != 0 || history.length === 0 }">
<li>
<label>{{ $t("nothing_found") }} "{{ filterText }}"</label>
</li>
</ul>
<p v-if="history.length === 0" class="info">
<i class="material-icons">schedule</i> {{ $t("history_empty") }}
</p>
<div v-if="history.length !== 0">
<div class="flex-wrap" v-if="!isClearingHistory">
<button
class="icon"
id="clear-history-button"
:disabled="history.length === 0"
@click="enableHistoryClearing"
>
<i class="material-icons">clear_all</i>
<span>{{ $t("clear_all") }}</span>
</button>
<v-popover>
<button class="tooltip-target icon" v-tooltip="$t('sort')">
<i class="material-icons">sort</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="sort_by_label()" v-close-popover>
<i class="material-icons">sort_by_alpha</i>
<span>{{ $t("label") }}</span>
</button>
</div>
<div>
<button class="icon" @click="sort_by_time()" v-close-popover>
<i class="material-icons">access_time</i>
<span>{{ $t("time") }}</span>
</button>
</div>
<div>
<button class="icon" @click="sort_by_status_code()" v-close-popover>
<i class="material-icons">assistant</i>
<span>{{ $t("status") }}</span>
</button>
</div>
<div>
<button class="icon" @click="sort_by_url()" v-close-popover>
<i class="material-icons">language</i>
<span>{{ $t("url") }}</span>
</button>
</div>
<div>
<button class="icon" @click="sort_by_path()" v-close-popover>
<i class="material-icons">timeline</i>
<span>{{ $t("path") }}</span>
</button>
</div>
<div v-if="showMore">
<button class="icon" @click="sort_by_duration()" v-close-popover>
<i class="material-icons">timer</i>
<span>{{ $t("duration") }}</span>
</button>
</div>
<div>
<button class="icon" @click="toggleCollapse()">
<i class="material-icons">
{{ !showMore ? "first_page" : "last_page" }}
</i>
<span>{{ !showMore ? $t("show_more") : $t("hide_more") }}</span>
</button>
</div>
</template>
</v-popover>
</div>
<div class="flex-wrap" v-else>
<label for="clear-history-button" class="info">
<i class="material-icons">help_outline</i> {{ $t("are_you_sure") }}
</label>
<div>
<button
class="icon"
id="confirm-clear-history-button"
@click="clearHistory"
v-tooltip="$t('yes')"
>
<i class="material-icons">done</i>
</button>
<button
class="icon"
id="reject-clear-history-button"
@click="disableHistoryClearing"
v-tooltip="$t('no')"
>
<i class="material-icons">close</i>
</button>
</div>
</div>
</div>
</pw-section>
</template>
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 290px);
[readonly] {
cursor: default;
}
}
.fade-enter-active,
.fade-leave-active {
transition: all 0.2s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.stared {
color: #f8e81c !important;
}
ul,
ol {
flex-direction: column;
}
.method-list-item {
position: relative;
span {
position: absolute;
top: 10px;
right: 10px;
font-family: "Roboto Mono", monospace;
font-weight: 400;
background-color: transparent;
padding: 2px 6px;
border-radius: 8px;
}
}
.entry {
border-bottom: 1px dashed var(--brd-color);
padding: 0 0 8px;
}
@media (max-width: 720px) {
.virtual-list.filled {
min-height: 320px;
}
.labels {
display: none;
}
}
</style>
<script>
import { findStatusGroup } from "~/pages/index"
import { fb } from "~/helpers/fb"
const updateOnLocalStorage = (propertyName, property) =>
window.localStorage.setItem(propertyName, JSON.stringify(property))
export default {
components: {
"pw-section": () => import("../layout/section"),
},
data() {
return {
history:
fb.currentUser !== null
? fb.currentHistory
: JSON.parse(window.localStorage.getItem("history")) || [],
filterText: "",
showFilter: false,
isClearingHistory: false,
reverse_sort_label: false,
reverse_sort_time: false,
reverse_sort_status_code: false,
reverse_sort_url: false,
reverse_sort_path: false,
showMore: false,
}
},
computed: {
filteredHistory() {
this.history =
fb.currentUser !== null
? fb.currentHistory
: JSON.parse(window.localStorage.getItem("history")) || []
return this.history.filter((entry) => {
const filterText = this.filterText.toLowerCase()
return Object.keys(entry).some((key) => {
let value = entry[key]
value = typeof value !== "string" ? value.toString() : value
return value.toLowerCase().includes(filterText)
})
})
},
},
methods: {
clearHistory() {
if (fb.currentUser !== null) {
fb.clearHistory()
}
this.history = []
this.filterText = ""
this.disableHistoryClearing()
updateOnLocalStorage("history", this.history)
this.$toast.error(this.$t("history_deleted"), {
icon: "delete",
})
},
useHistory(entry) {
this.$emit("useHistory", entry)
},
findEntryStatus(entry) {
const foundStatusGroup = findStatusGroup(entry.status)
return (
foundStatusGroup || {
className: "",
}
)
},
deleteHistory(entry) {
if (fb.currentUser !== null) {
fb.deleteHistory(entry)
}
this.history.splice(this.history.indexOf(entry), 1)
if (this.history.length === 0) {
this.filterText = ""
}
updateOnLocalStorage("history", this.history)
this.$toast.error(this.$t("deleted"), {
icon: "delete",
})
},
addEntry(entry) {
this.history.push(entry)
updateOnLocalStorage("history", this.history)
},
enableHistoryClearing() {
if (!this.history || !this.history.length) return
this.isClearingHistory = true
},
disableHistoryClearing() {
this.isClearingHistory = false
},
sort_by_time() {
let byDate = this.history.slice(0)
byDate.sort((a, b) => {
let date_a = a.date.split("/")
let date_b = b.date.split("/")
let time_a = a.time.split(":")
let time_b = b.time.split(":")
let final_a = new Date(date_a[2], date_a[1], date_a[0], time_a[0], time_a[1], time_a[2])
let final_b = new Date(date_b[2], date_b[1], date_b[0], time_b[0], time_b[1], time_b[2])
if (this.reverse_sort_time) return final_b - final_a
else return final_a - final_b
})
this.history = byDate
this.reverse_sort_time = !this.reverse_sort_time
},
sort_by_status_code() {
let byCode = this.history.slice(0)
byCode.sort((a, b) => {
if (this.reverse_sort_status_code) return b.status - a.status
else return a.status - b.status
})
this.history = byCode
this.reverse_sort_status_code = !this.reverse_sort_status_code
},
sort_by_url() {
let byUrl = this.history.slice(0)
byUrl.sort((a, b) => {
if (this.reverse_sort_url) return a.url === b.url ? 0 : +(a.url < b.url) || -1
else return a.url === b.url ? 0 : +(a.url > b.url) || -1
})
this.history = byUrl
this.reverse_sort_url = !this.reverse_sort_url
},
sort_by_label() {
let byLabel = this.history.slice(0)
byLabel.sort((a, b) => {
if (this.reverse_sort_label) return a.label === b.label ? 0 : +(a.label < b.label) || -1
else return a.label === b.label ? 0 : +(a.label > b.label) || -1
})
this.history = byLabel
this.reverse_sort_label = !this.reverse_sort_label
},
sort_by_path() {
let byPath = this.history.slice(0)
byPath.sort((a, b) => {
if (this.reverse_sort_path) return a.path === b.path ? 0 : +(a.path < b.path) || -1
else return a.path === b.path ? 0 : +(a.path > b.path) || -1
})
this.history = byPath
this.reverse_sort_path = !this.reverse_sort_path
},
sort_by_duration() {
let byDuration = this.history.slice(0)
byDuration.sort((a, b) => {
if (this.reverse_sort_duration)
return a.duration === b.duration ? 0 : +(a.duration < b.duration) || -1
else return a.duration === b.duration ? 0 : +(a.duration > b.duration) || -1
})
this.history = byDuration
this.reverse_sort_duration = !this.reverse_sort_duration
},
toggleCollapse() {
this.showMore = !this.showMore
},
toggleStar(entry) {
if (fb.currentUser !== null) {
fb.toggleStar(entry, !entry.star)
}
entry.star = !entry.star
updateOnLocalStorage("history", this.history)
},
},
}
</script>

View File

@@ -1,21 +0,0 @@
<template>
<svg viewBox="0 0 612.001 612.001">
<path
:fill="color"
data-old_color="#202124"
class="active-path"
data-original="#202124"
d="M64.601 236.822C64.601 394.256 192.786 612 306.001 612 412.582 612 547.4 394.256 547.4 236.822S439.322 0 306 0 64.601 79.388 64.601 236.822zm304.12 116.415c29.475-29.475 70.598-40.195 108.552-32.173 8.021 37.954-2.698 79.077-32.173 108.552-29.475 29.476-70.598 40.196-108.552 32.174-8.022-37.955 2.698-79.078 32.173-108.552zm-233.994-32.174c37.954-8.02 79.077 2.698 108.552 32.173 29.475 29.475 40.195 70.598 32.173 108.552-37.954 8.021-79.077-2.698-108.552-32.173-29.475-29.476-40.194-70.598-32.173-108.552z"
/>
</svg>
</template>
<script>
export default {
props: {
color: {
type: String,
},
},
}
</script>

View File

@@ -1,116 +0,0 @@
<template>
<fieldset :id="label.toLowerCase()" :class="{ 'no-colored-frames': !frameColorsEnabled }">
<legend @click.prevent="collapse">
<span>{{ label }}</span>
<i class="material-icons">
{{ isCollapsed(label) ? "expand_more" : "expand_less" }}
</i>
</legend>
<div class="collapsible" :class="{ hidden: isCollapsed(label.toLowerCase()) }">
<slot />
</div>
</fieldset>
</template>
<style scoped lang="scss">
fieldset {
margin: 16px 0;
border-radius: 8px;
background-color: var(--bg-dark-color);
transition: all 0.2s ease-in-out;
legend {
display: inline-block;
align-items: center;
justify-content: center;
color: var(--fg-color);
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease-in-out;
* {
vertical-align: middle;
}
i {
margin-left: 8px;
}
}
&.blue legend {
color: #57b5f9;
}
&.gray legend {
color: #bcc2cd;
}
&.green legend {
color: #50fa7b;
}
&.cyan legend {
color: #8be9fd;
}
&.purple legend {
color: #bd93f9;
}
&.orange legend {
color: #ffb86c;
}
&.pink legend {
color: #ff79c6;
}
&.red legend {
color: #ff5555;
}
&.yellow legend {
color: #f1fa8c;
}
}
fieldset.no-colored-frames legend {
color: var(--fg-color);
}
</style>
<script>
export default {
computed: {
frameColorsEnabled() {
return this.$store.state.postwoman.settings.FRAME_COLORS_ENABLED || false
},
sectionString() {
return `${this.$route.path.replace(/\/+$/, "")}/${this.label}`
},
},
props: {
label: {
type: String,
default: "Section",
},
collapsed: {
type: Boolean,
},
},
methods: {
collapse({ target }) {
const parent = target.parentNode.parentNode
parent.querySelector(".collapsible").classList.toggle("hidden")
// Save collapsed section into the collapsedSections array
this.$store.commit("setCollapsedSection", this.sectionString)
},
isCollapsed(label) {
return this.$store.state.theme.collapsedSections.includes(this.sectionString) || false
},
},
}
</script>

View File

@@ -1,349 +0,0 @@
<template>
<aside class="nav-first">
<nav class="primary-nav">
<!--
We're using manual checks for linkActive because the query string
seems to mess up the nuxt-link active class.
-->
<nuxt-link
:to="localePath('index')"
:class="linkActive('/')"
v-tooltip.right="$t('home')"
:aria-label="$t('home')"
>
<logo alt class="material-icons" style="height: 24px;"></logo>
</nuxt-link>
<nuxt-link
:to="localePath('realtime')"
:class="linkActive('/realtime')"
v-tooltip.right="$t('realtime')"
>
<i class="material-icons">language</i>
</nuxt-link>
<nuxt-link
:to="localePath('graphql')"
:class="linkActive('/graphql')"
v-tooltip.right="$t('graphql')"
:aria-label="$t('graphql')"
>
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 29.999 30">
<path d="M4.08 22.864l-1.1-.636L15.248.98l1.1.636z" />
<path d="M2.727 20.53h24.538v1.272H2.727z" />
<path
d="M15.486 28.332L3.213 21.246l.636-1.1 12.273 7.086zm10.662-18.47L13.874 2.777l.636-1.1 12.273 7.086z"
/>
<path d="M3.852 9.858l-.636-1.1L15.5 1.67l.636 1.1z" />
<path
d="M25.922 22.864l-12.27-21.25 1.1-.636 12.27 21.25zM3.7 7.914h1.272v14.172H3.7zm21.328 0H26.3v14.172h-1.272z"
/>
<path d="M15.27 27.793l-.555-.962 10.675-6.163.555.962z" />
<path
d="M27.985 22.5a2.68 2.68 0 01-3.654.981 2.68 2.68 0 01-.981-3.654 2.68 2.68 0 013.654-.981 2.665 2.665 0 01.98 3.654M6.642 10.174a2.68 2.68 0 01-3.654.981A2.68 2.68 0 012.007 7.5a2.68 2.68 0 013.654-.981 2.68 2.68 0 01.981 3.654M2.015 22.5a2.68 2.68 0 01.981-3.654 2.68 2.68 0 013.654.981 2.68 2.68 0 01-.981 3.654c-1.287.735-2.92.3-3.654-.98m21.343-12.326a2.68 2.68 0 01.981-3.654 2.68 2.68 0 013.654.981 2.68 2.68 0 01-.981 3.654 2.68 2.68 0 01-3.654-.981M15 30a2.674 2.674 0 112.674-2.673A2.68 2.68 0 0115 30m0-24.652a2.67 2.67 0 01-2.674-2.674 2.67 2.67 0 115.347 0A2.67 2.67 0 0115 5.347"
/>
</svg>
</nuxt-link>
<nuxt-link
:to="localePath('doc')"
:class="linkActive('/doc')"
v-tooltip.right="$t('documentation')"
:aria-label="$t('documentation')"
>
<i class="material-icons">topic</i>
</nuxt-link>
<nuxt-link
:to="localePath('settings')"
:class="linkActive('/settings')"
v-tooltip.right="$t('settings')"
:aria-label="$t('settings')"
>
<i class="material-icons">settings</i>
</nuxt-link>
</nav>
<div v-if="$route.path == '/'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="$t('request')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#options" v-tooltip.right="$t('options')">
<i class="material-icons">toc</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('response')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path.includes('/realtime')">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="$t('request')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('communication')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path.includes('/graphql')">
<nav class="secondary-nav">
<ul>
<li>
<a href="#endpoint" v-tooltip.right="$t('endpoint')">
<i class="material-icons">cloud</i>
</a>
</li>
<li>
<a href="#schema" v-tooltip.right="$t('schema')">
<i class="material-icons">assignment_returned</i>
</a>
</li>
<li>
<a href="#query" v-tooltip.right="$t('query')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('response')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path.includes('/doc')">
<nav class="secondary-nav">
<ul>
<li>
<a href="#import" v-tooltip.right="$t('import')">
<i class="material-icons">folder</i>
</a>
</li>
<li>
<a href="#documentation" v-tooltip.right="'Documentation'">
<i class="material-icons">insert_drive_file</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path.includes('/settings')">
<nav class="secondary-nav">
<ul>
<li>
<a href="#account" v-tooltip.right="$t('account')">
<i class="material-icons">person</i>
</a>
</li>
<li>
<a href="#theme" v-tooltip.right="$t('theme')">
<i class="material-icons">brush</i>
</a>
</li>
<li>
<a href="#extensions" v-tooltip.right="$t('extensions')">
<i class="material-icons">extensions</i>
</a>
</li>
<li>
<a href="#proxy" v-tooltip.right="$t('proxy')">
<i class="material-icons">public</i>
</a>
</li>
</ul>
</nav>
</div>
</aside>
</template>
<style scoped lang="scss">
$responsiveWidth: 768px;
.nav-first {
z-index: 1;
height: 100vh;
padding: 0 8px;
background-color: var(--bg-dark-color);
transition: all 0.2s ease-in-out;
}
nav.primary-nav {
display: flex;
flex-flow: column nowrap;
align-items: center;
justify-content: center;
svg {
fill: var(--fg-light-color);
transition: all 0.2s ease-in-out;
}
a {
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 14px;
border-radius: 50%;
background-color: var(--bg-light-color);
color: var(--fg-light-color);
fill: var(--fg-light-color);
margin: 8px 0;
&:hover {
color: var(--fg-color);
fill: var(--fg-color);
svg {
fill: var(--fg-color);
}
}
&.nuxt-link-exact-active {
background-color: var(--ac-color);
color: var(--act-color);
fill: var(--act-color);
border-radius: 16px;
svg {
fill: var(--act-color);
}
}
}
}
nav.secondary-nav {
display: flex;
flex-flow: column nowrap;
align-items: center;
justify-content: center;
border-top: 2px dashed var(--brd-color);
margin-top: 4px;
ul {
display: flex;
flex-flow: column nowrap;
li {
display: flex;
a {
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 14px;
border-radius: 50%;
background-color: var(--bg-dark-color);
color: var(--fg-light-color);
fill: var(--fg-light-color);
margin: 8px 0;
&:hover {
color: var(--fg-color);
fill: var(--fg-color);
}
&.current {
color: var(--ac-color);
fill: var(--ac-color);
}
}
}
}
}
@media (max-width: $responsiveWidth) {
.nav-first {
position: fixed;
top: auto;
bottom: 0;
height: auto;
padding: 0;
width: 100%;
background-color: var(--bg-color);
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.45);
}
nav.primary-nav {
flex-flow: row nowrap;
overflow: auto;
justify-content: space-between;
background-color: var(--bg-dark-color);
a {
background-color: transparent;
margin: 8px;
flex: 1;
&.nuxt-link-exact-active {
background-color: transparent;
color: var(--ac-color);
fill: var(--ac-color);
svg {
fill: var(--ac-color);
}
}
}
}
nav.secondary-nav {
display: none;
}
}
</style>
<script>
export default {
components: {
logo: () => import("./logo"),
},
methods: {
linkActive(path) {
return {
"nuxt-link-exact-active": this.$route.path === path,
"nuxt-link-active": this.$route.path === path,
}
},
},
mounted() {
window.addEventListener("scroll", (event) => {
let mainNavLinks = document.querySelectorAll("nav ul li a")
let fromTop = window.scrollY
mainNavLinks.forEach(({ hash, classList }) => {
let section = document.querySelector(hash)
if (
section &&
section.offsetTop <= fromTop &&
section.offsetTop + section.offsetHeight > fromTop
) {
classList.add("current")
} else {
classList.remove("current")
}
})
})
},
watch: {
$route() {
// this.$toast.clear();
},
},
}
</script>

View File

@@ -1,44 +0,0 @@
<template>
<div>
<tabs>
<tab
v-for="(lens, index) in validLenses"
:key="lens.lensName"
:id="lens.lensName"
:label="lens.lensName"
:selected="index === 0"
>
<component :is="lens.renderer" :response="response" />
</tab>
<tab
v-if="Object.keys(response.headers).length !== 0"
id="headers"
:label="`Headers \xA0 • \xA0 ${Object.keys(response.headers).length}`"
>
<headers :headers="response.headers" />
</tab>
</tabs>
</div>
</template>
<script>
import { getSuitableLenses, getLensRenderers } from "~/helpers/lenses/lenses"
export default {
components: {
tabs: () => import("../ui/tabs"),
tab: () => import("../ui/tab"),
headers: () => import("./headers"),
// Lens Renderers
...getLensRenderers(),
},
props: {
response: {},
},
computed: {
validLenses() {
return getSuitableLenses(this.response)
},
},
}
</script>

View File

@@ -1,17 +0,0 @@
<template>
<div>
<ul v-for="(value, key) in headers" :key="key">
<li>
<input :value="`${key} → ${value}`" :name="key" class="bg-color" readonly />
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
headers: {},
},
}
</script>

View File

@@ -1,153 +0,0 @@
<template>
<ul>
<li>
<div class="flex-wrap">
<label for="body">{{ $t("response") }}</label>
<div>
<button
class="icon"
@click="ToggleExpandResponse"
ref="ToggleExpandResponse"
v-if="response.body"
v-tooltip="{
content: !expandResponse ? $t('expand_response') : $t('collapse_response'),
}"
>
<i class="material-icons">
{{ !expandResponse ? "unfold_more" : "unfold_less" }}
</i>
</button>
<button
v-if="response.body"
class="icon"
@click.prevent="togglePreview"
v-tooltip="{
content: previewEnabled ? $t('hide_preview') : $t('preview_html'),
}"
>
<i class="material-icons">
{{ !previewEnabled ? "visibility" : "visibility_off" }}
</i>
</button>
<button
class="icon"
@click="downloadResponse"
ref="downloadResponse"
v-if="response.body"
v-tooltip="$t('download_file')"
>
<i class="material-icons">save_alt</i>
</button>
<button
class="icon"
@click="copyResponse"
ref="copyResponse"
v-if="response.body"
v-tooltip="$t('copy_response')"
>
<i class="material-icons">content_copy</i>
</button>
</div>
</div>
<div id="response-details-wrapper">
<Editor
:value="responseBodyText"
:lang="'html'"
:options="{
maxLines: responseBodyMaxLines,
minLines: '16',
fontSize: '16px',
autoScrollEditorIntoView: true,
readOnly: true,
showPrintMargin: false,
useWorker: false,
}"
/>
<iframe
:class="{ hidden: !previewEnabled }"
class="covers-response"
ref="previewFrame"
src="about:blank"
></iframe>
</div>
</li>
</ul>
</template>
<script>
import AceEditor from "../../ui/ace-editor"
import TextContentRendererMixin from "./mixins/TextContentRendererMixin"
export default {
components: {
Editor: AceEditor,
},
mixins: [TextContentRendererMixin],
props: {
response: {},
},
data() {
return {
expandResponse: false,
responseBodyMaxLines: 16,
doneButton: '<i class="material-icons">done</i>',
downloadButton: '<i class="material-icons">save_alt</i>',
copyButton: '<i class="material-icons">content_copy</i>',
previewEnabled: false,
}
},
methods: {
ToggleExpandResponse() {
this.expandResponse = !this.expandResponse
this.responseBodyMaxLines = this.responseBodyMaxLines == Infinity ? 16 : Infinity
},
downloadResponse() {
const dataToWrite = this.responseBodyText
const file = new Blob([dataToWrite], { type: "text/html" })
const a = document.createElement("a")
const url = URL.createObjectURL(file)
a.href = url
// TODO get uri from meta
a.download = `response on ${Date()}`.replace(/\./g, "[dot]")
document.body.appendChild(a)
a.click()
this.$refs.downloadResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
setTimeout(() => {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
this.$refs.downloadResponse.innerHTML = this.downloadButton
}, 1000)
},
copyResponse() {
this.$refs.copyResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("copied_to_clipboard"), {
icon: "done",
})
const aux = document.createElement("textarea")
const copy = this.responseBodyText
aux.innerText = copy
document.body.appendChild(aux)
aux.select()
document.execCommand("copy")
document.body.removeChild(aux)
setTimeout(() => (this.$refs.copyResponse.innerHTML = this.copyButton), 1000)
},
togglePreview() {
this.previewEnabled = !this.previewEnabled
if (this.previewEnabled) {
if (this.$refs.previewFrame.getAttribute("data-previewing-url") === this.url) return
// Use DOMParser to parse document HTML.
const previewDocument = new DOMParser().parseFromString(this.responseBodyText, "text/html")
// Inject <base href="..."> tag to head, to fix relative CSS/HTML paths.
previewDocument.head.innerHTML =
`<base href="${this.url}">` + previewDocument.head.innerHTML
// Finally, set the iframe source to the resulting HTML.
this.$refs.previewFrame.srcdoc = previewDocument.documentElement.outerHTML
this.$refs.previewFrame.setAttribute("data-previewing-url", this.url)
}
},
},
}
</script>

View File

@@ -1,102 +0,0 @@
<template>
<ul>
<li>
<div class="flex-wrap">
<label for="body">{{ $t("response") }}</label>
<div>
<button
class="icon"
@click="downloadResponse"
ref="downloadResponse"
v-if="response.body"
v-tooltip="$t('download_file')"
>
<i class="material-icons">save_alt</i>
</button>
</div>
</div>
<div id="response-details-wrapper">
<img class="response-image" :src="imageSource" />
</div>
</li>
</ul>
</template>
<style scoped lang="scss">
.response-image {
max-width: 100%;
}
</style>
<script>
export default {
props: {
response: {},
},
data() {
return {
imageSource: "",
doneButton: '<i class="material-icons">done</i>',
downloadButton: '<i class="material-icons">save_alt</i>',
}
},
computed: {
responseType() {
return (this.response.headers["content-type"] || "").split(";")[0].toLowerCase()
},
},
watch: {
response: {
immediate: true,
handler(newValue) {
this.imageSource = ""
const buf = this.response.body
const bytes = new Uint8Array(buf)
const blob = new Blob([bytes.buffer])
const reader = new FileReader()
reader.onload = (e) => {
this.imageSource = e.target.result
}
reader.readAsDataURL(blob)
},
},
},
mounted() {
this.imageSource = ""
const buf = this.response.body
const bytes = new Uint8Array(buf)
const blob = new Blob([bytes.buffer])
const reader = new FileReader()
reader.onload = (e) => {
this.imageSource = e.target.result
}
reader.readAsDataURL(blob)
},
methods: {
downloadResponse() {
const dataToWrite = this.response.body
const file = new Blob([dataToWrite], { type: this.responseType })
const a = document.createElement("a")
const url = URL.createObjectURL(file)
a.href = url
// TODO get uri from meta
a.download = `response on ${Date()}`.replace(/\./g, "[dot]")
document.body.appendChild(a)
a.click()
this.$refs.downloadResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
setTimeout(() => {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
this.$refs.downloadResponse.innerHTML = this.downloadButton
}, 1000)
},
},
}
</script>

View File

@@ -1,149 +0,0 @@
<template>
<ul>
<li>
<div class="flex-wrap">
<label for="body">{{ $t("response") }}</label>
<div>
<button
class="icon"
@click="ToggleExpandResponse"
ref="ToggleExpandResponse"
v-if="response.body"
v-tooltip="{
content: !expandResponse ? $t('expand_response') : $t('collapse_response'),
}"
>
<i class="material-icons">
{{ !expandResponse ? "unfold_more" : "unfold_less" }}
</i>
</button>
<button
class="icon"
@click="downloadResponse"
ref="downloadResponse"
v-if="response.body && canDownloadResponse"
v-tooltip="$t('download_file')"
>
<i class="material-icons">save_alt</i>
</button>
<button
class="icon"
@click="copyResponse"
ref="copyResponse"
v-if="response.body"
v-tooltip="$t('copy_response')"
>
<i class="material-icons">content_copy</i>
</button>
</div>
</div>
<div class="valid-warning" v-if="jsonInvalid">
<p class="info"><i class="material-icons">error_outline</i> Invalid JSON</p>
</div>
<div id="response-details-wrapper">
<Editor
:value="jsonBodyText"
:lang="'json'"
:options="{
maxLines: responseBodyMaxLines,
minLines: '16',
fontSize: '16px',
autoScrollEditorIntoView: true,
readOnly: true,
showPrintMargin: false,
useWorker: false,
}"
/>
</div>
</li>
</ul>
</template>
<script>
import AceEditor from "../../ui/ace-editor"
import { isJSONContentType } from "~/helpers/utils/contenttypes"
import TextContentRendererMixin from "./mixins/TextContentRendererMixin"
export default {
components: {
Editor: AceEditor,
},
mixins: [TextContentRendererMixin],
props: {
response: {},
},
data() {
return {
expandResponse: false,
jsonInvalid: false,
responseBodyMaxLines: 16,
doneButton: '<i class="material-icons">done</i>',
downloadButton: '<i class="material-icons">save_alt</i>',
copyButton: '<i class="material-icons">content_copy</i>',
}
},
computed: {
jsonBodyText() {
try {
this.jsonInvalid = false
return JSON.stringify(JSON.parse(this.responseBodyText), null, 2)
} catch (e) {
// Most probs invalid JSON was returned, so drop prettification (should we warn ?)
this.jsonInvalid = true
return this.responseBodyText
}
},
responseType() {
return (this.response.headers["content-type"] || "").split(";")[0].toLowerCase()
},
canDownloadResponse() {
return (
this.response &&
this.response.headers &&
this.response.headers["content-type"] &&
isJSONContentType(this.response.headers["content-type"])
)
},
},
methods: {
ToggleExpandResponse() {
this.expandResponse = !this.expandResponse
this.responseBodyMaxLines = this.responseBodyMaxLines == Infinity ? 16 : Infinity
},
downloadResponse() {
const dataToWrite = this.responseBodyText
const file = new Blob([dataToWrite], { type: this.responseType })
const a = document.createElement("a")
const url = URL.createObjectURL(file)
a.href = url
// TODO get uri from meta
a.download = `response on ${Date()}`.replace(/\./g, "[dot]")
document.body.appendChild(a)
a.click()
this.$refs.downloadResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
setTimeout(() => {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
this.$refs.downloadResponse.innerHTML = this.downloadButton
}, 1000)
},
copyResponse() {
this.$refs.copyResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("copied_to_clipboard"), {
icon: "done",
})
const aux = document.createElement("textarea")
const copy = this.responseBodyText
aux.innerText = copy
document.body.appendChild(aux)
aux.select()
document.execCommand("copy")
document.body.removeChild(aux)
setTimeout(() => (this.$refs.copyResponse.innerHTML = this.copyButton), 1000)
},
},
}
</script>

View File

@@ -1,134 +0,0 @@
<template>
<ul>
<li>
<div class="flex-wrap">
<label for="body">{{ $t("response") }}</label>
<div>
<button
class="icon"
@click="ToggleExpandResponse"
ref="ToggleExpandResponse"
v-if="response.body"
v-tooltip="{
content: !expandResponse ? $t('expand_response') : $t('collapse_response'),
}"
>
<i class="material-icons">
{{ !expandResponse ? "unfold_more" : "unfold_less" }}
</i>
</button>
<button
class="icon"
@click="downloadResponse"
ref="downloadResponse"
v-if="response.body && canDownloadResponse"
v-tooltip="$t('download_file')"
>
<i class="material-icons">save_alt</i>
</button>
<button
class="icon"
@click="copyResponse"
ref="copyResponse"
v-if="response.body"
v-tooltip="$t('copy_response')"
>
<i class="material-icons">content_copy</i>
</button>
</div>
</div>
<div id="response-details-wrapper">
<Editor
:value="responseBodyText"
:lang="'plain_text'"
:options="{
maxLines: responseBodyMaxLines,
minLines: '16',
fontSize: '16px',
autoScrollEditorIntoView: true,
readOnly: true,
showPrintMargin: false,
useWorker: false,
}"
/>
</div>
</li>
</ul>
</template>
<script>
import AceEditor from "../../ui/ace-editor"
import { isJSONContentType } from "~/helpers/utils/contenttypes"
import TextContentRendererMixin from "./mixins/TextContentRendererMixin"
export default {
components: {
Editor: AceEditor,
},
mixins: [TextContentRendererMixin],
props: {
response: {},
},
data() {
return {
expandResponse: false,
responseBodyMaxLines: 16,
doneButton: '<i class="material-icons">done</i>',
downloadButton: '<i class="material-icons">save_alt</i>',
copyButton: '<i class="material-icons">content_copy</i>',
}
},
computed: {
responseType() {
return (this.response.headers["content-type"] || "").split(";")[0].toLowerCase()
},
canDownloadResponse() {
return (
this.response &&
this.response.headers &&
this.response.headers["content-type"] &&
isJSONContentType(this.response.headers["content-type"])
)
},
},
methods: {
ToggleExpandResponse() {
this.expandResponse = !this.expandResponse
this.responseBodyMaxLines = this.responseBodyMaxLines == Infinity ? 16 : Infinity
},
downloadResponse() {
const dataToWrite = this.responseBodyText
const file = new Blob([dataToWrite], { type: this.responseType })
const a = document.createElement("a")
const url = URL.createObjectURL(file)
a.href = url
// TODO get uri from meta
a.download = `response on ${Date()}`.replace(/\./g, "[dot]")
document.body.appendChild(a)
a.click()
this.$refs.downloadResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
setTimeout(() => {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
this.$refs.downloadResponse.innerHTML = this.downloadButton
}, 1000)
},
copyResponse() {
this.$refs.copyResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("copied_to_clipboard"), {
icon: "done",
})
const aux = document.createElement("textarea")
const copy = this.responseBodyText
aux.innerText = copy
document.body.appendChild(aux)
aux.select()
document.execCommand("copy")
document.body.removeChild(aux)
setTimeout(() => (this.$refs.copyResponse.innerHTML = this.copyButton), 1000)
},
},
}
</script>

View File

@@ -1,125 +0,0 @@
<template>
<ul>
<li>
<div class="flex-wrap">
<label for="body">{{ $t("response") }}</label>
<div>
<button
class="icon"
@click="ToggleExpandResponse"
ref="ToggleExpandResponse"
v-if="response.body"
v-tooltip="{
content: !expandResponse ? $t('expand_response') : $t('collapse_response'),
}"
>
<i class="material-icons">
{{ !expandResponse ? "unfold_more" : "unfold_less" }}
</i>
</button>
<button
class="icon"
@click="downloadResponse"
ref="downloadResponse"
v-if="response.body"
v-tooltip="$t('download_file')"
>
<i class="material-icons">save_alt</i>
</button>
<button
class="icon"
@click="copyResponse"
ref="copyResponse"
v-if="response.body"
v-tooltip="$t('copy_response')"
>
<i class="material-icons">content_copy</i>
</button>
</div>
</div>
<div id="response-details-wrapper">
<Editor
:value="responseBodyText"
:lang="'xml'"
:options="{
maxLines: responseBodyMaxLines,
minLines: '16',
fontSize: '16px',
autoScrollEditorIntoView: true,
readOnly: true,
showPrintMargin: false,
useWorker: false,
}"
/>
</div>
</li>
</ul>
</template>
<script>
import AceEditor from "../../ui/ace-editor"
import TextContentRendererMixin from "./mixins/TextContentRendererMixin"
export default {
components: {
Editor: AceEditor,
},
mixins: [TextContentRendererMixin],
props: {
response: {},
},
data() {
return {
expandResponse: false,
responseBodyMaxLines: 16,
doneButton: '<i class="material-icons">done</i>',
downloadButton: '<i class="material-icons">save_alt</i>',
copyButton: '<i class="material-icons">content_copy</i>',
}
},
computed: {
responseType() {
return (this.response.headers["content-type"] || "").split(";")[0].toLowerCase()
},
},
methods: {
ToggleExpandResponse() {
this.expandResponse = !this.expandResponse
this.responseBodyMaxLines = this.responseBodyMaxLines == Infinity ? 16 : Infinity
},
downloadResponse() {
const dataToWrite = this.responseBodyText
const file = new Blob([dataToWrite], { type: this.responseType })
const a = document.createElement("a")
const url = URL.createObjectURL(file)
a.href = url
// TODO get uri from meta
a.download = `response on ${Date()}`.replace(/\./g, "[dot]")
document.body.appendChild(a)
a.click()
this.$refs.downloadResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("download_started"), {
icon: "done",
})
setTimeout(() => {
document.body.removeChild(a)
window.URL.revokeObjectURL(url)
this.$refs.downloadResponse.innerHTML = this.downloadButton
}, 1000)
},
copyResponse() {
this.$refs.copyResponse.innerHTML = this.doneButton
this.$toast.success(this.$t("copied_to_clipboard"), {
icon: "done",
})
const aux = document.createElement("textarea")
const copy = this.responseBodyText
aux.innerText = copy
document.body.appendChild(aux)
aux.select()
document.execCommand("copy")
document.body.removeChild(aux)
setTimeout(() => (this.$refs.copyResponse.innerHTML = this.copyButton), 1000)
},
},
}
</script>

View File

@@ -1,11 +0,0 @@
export default {
props: {
response: {},
},
computed: {
responseBodyText() {
if (typeof this.response.body === "string") return this.response.body
return new TextDecoder("utf-8").decode(this.response.body)
},
},
}

View File

@@ -1,59 +0,0 @@
<template>
<div>
<label for="log">{{ title }}</label>
<div name="log" class="realtime-log" ref="log">
<span v-if="log">
<span v-for="(logEntry, index) in log" :style="{ color: logEntry.color }" :key="index"
>@ {{ logEntry.ts }}{{ getSourcePrefix(logEntry.source) }}{{ logEntry.payload }}</span
>
</span>
<span v-else>{{ $t("waiting_for_connection") }}</span>
</div>
</div>
</template>
<style scoped lang="scss">
div.realtime-log {
margin: 4px;
padding: 8px 16px;
width: calc(100% - 8px);
border-radius: 8px;
background-color: var(--bg-dark-color);
color: var(--fg-color);
height: 256px;
overflow: auto;
&,
span {
font-size: 16px;
font-family: "Roboto Mono", monospace;
font-weight: 400;
user-select: text;
}
span {
display: block;
white-space: pre-wrap;
word-wrap: break-word;
word-break: break-all;
}
}
</style>
<script>
import { getSourcePrefix } from "~/helpers/utils/string"
export default {
props: ["log", "title"],
methods: {
getSourcePrefix,
},
updated: function () {
this.$nextTick(function () {
if (this.$refs.log) {
this.$refs.log.scrollBy(0, this.$refs.log.scrollHeight + 100)
}
})
},
}
</script>

View File

@@ -1,261 +0,0 @@
<template>
<div>
<pw-section class="blue" :label="$t('request')">
<ul>
<li>
<label for="mqtt-url">{{ $t("url") }}</label>
<input id="mqtt-url" type="url" v-model="url" spellcheck="false" />
</li>
<div>
<li>
<label for="connect" class="hide-on-small-screen">&nbsp;</label>
<button id="connect" :disabled="!validUrl" @click="toggleConnection">
{{ this.connectionState ? $t("disconnect") : $t("connect") }}
<span>
<i class="material-icons">{{ !connectionState ? "sync" : "sync_disabled" }}</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
<pw-section class="blue" :label="$t('communication')">
<ul>
<li>
<realtime-log :title="$t('log')" :log="this.log" />
</li>
</ul>
<ul>
<li>
<label for="pub_topic">{{ $t("mqtt_topic") }}</label>
<input id="pub_topic" type="text" v-model="pub_topic" spellcheck="false" />
</li>
<li>
<label for="mqtt-message">{{ $t("message") }}</label>
<input id="mqtt-message" type="text" v-model="msg" spellcheck="false" />
</li>
<div>
<li>
<label for="publish" class="hide-on-small-screen">&nbsp;</label>
<button id="publish" name="get" :disabled="!canpublish" @click="publish">
{{ $t("mqtt_publish") }}
<span>
<i class="material-icons">send</i>
</span>
</button>
</li>
</div>
</ul>
<ul>
<li>
<label for="sub_topic">{{ $t("mqtt_topic") }}</label>
<input id="sub_topic" type="text" v-model="sub_topic" spellcheck="false" />
</li>
<div>
<li>
<label for="subscribe" class="hide-on-small-screen">&nbsp;</label>
<button id="subscribe" name="get" :disabled="!cansubscribe" @click="toggleSubscription">
{{ subscriptionState ? $t("mqtt_unsubscribe") : $t("mqtt_subscribe") }}
<span>
<i class="material-icons">{{ subscriptionState ? "sync_disabled" : "sync" }}</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
</div>
</template>
<script>
import Paho from "paho-mqtt"
import { wsValid } from "~/helpers/utils/valid"
export default {
components: {
"pw-section": () => import("~/components/layout/section"),
realtimeLog: () => import("./log"),
},
data: function () {
return {
url: "wss://test.mosquitto.org:8081",
client: null,
pub_topic: "",
sub_topic: "",
msg: "",
connectionState: false,
log: null,
manualDisconnect: false,
subscriptionState: false,
}
},
computed: {
validUrl() {
return wsValid(this.url)
},
canpublish() {
return this.pub_topic != "" && this.msg != "" && this.connectionState
},
cansubscribe() {
return this.sub_topic != "" && this.connectionState
},
},
methods: {
connect() {
this.log = [
{
payload: this.$t("connecting_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
},
]
let parseUrl = new URL(this.url)
this.client = new Paho.Client(
parseUrl.hostname,
parseUrl.port != "" ? Number(parseUrl.port) : 8081,
"postwoman"
)
this.client.connect({
onSuccess: this.onConnectionSuccess,
onFailure: this.onConnectionFailure,
useSSL: true,
})
this.client.onConnectionLost = this.onConnectionLost
this.client.onMessageArrived = this.onMessageArrived
},
onConnectionFailure() {
this.connectionState = false
this.log.push({
payload: this.$t("error_occurred"),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
onConnectionSuccess() {
this.connectionState = true
this.log.push({
payload: this.$t("connected_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
})
this.$toast.success(this.$t("connected"), {
icon: "sync",
})
},
onMessageArrived(message) {
this.log.push({
payload: `Message: ${message.payloadString} arrived on topic: ${message.destinationName}`,
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
})
},
toggleConnection() {
if (this.connectionState) {
this.disconnect()
} else {
this.connect()
}
},
disconnect() {
this.manualDisconnect = true
this.client.disconnect()
this.log.push({
payload: this.$t("disconnected_from", { name: this.url }),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
onConnectionLost() {
this.connectionState = false
if (this.manualDisconnect) {
this.$toast.error(this.$t("disconnected"), {
icon: "sync_disabled",
})
} else {
this.$toast.error(this.$t("something_went_wrong"), {
icon: "error",
})
}
this.manualDisconnect = false
this.subscriptionState = false
},
publish() {
try {
this.client.publish(this.pub_topic, this.msg, 0, false)
this.log.push({
payload: `Published message: ${this.msg} to topic: ${this.pub_topic}`,
ts: new Date().toLocaleTimeString(),
source: "info",
color: "var(--ac-color)",
})
} catch (e) {
this.log.push({
payload:
this.$t("error_occurred") +
`while publishing msg: ${this.msg} to topic: ${this.pub_topic}`,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
}
},
toggleSubscription() {
if (this.subscriptionState) {
this.unsubscribe()
} else {
this.subscribe()
}
},
subscribe() {
try {
this.client.subscribe(this.sub_topic, {
onSuccess: this.usubSuccess,
onFailure: this.usubFailure,
})
} catch (e) {
this.log.push({
payload: this.$t("error_occurred") + `while subscribing to topic: ${this.sub_topic}`,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
}
},
usubSuccess() {
this.subscriptionState = !this.subscriptionState
this.log.push({
payload:
`Successfully ` +
(this.subscriptionState ? "subscribed" : "unsubscribed") +
` to topic: ${this.sub_topic}`,
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
})
},
usubFailure() {
this.log.push({
payload:
`Failed to ` +
(this.subscriptionState ? "unsubscribe" : "subscribe") +
` to topic: ${this.sub_topic}`,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
unsubscribe() {
this.client.unsubscribe(this.sub_topic, {
onSuccess: this.usubSuccess,
onFailure: this.usubFailure,
})
},
},
}
</script>

View File

@@ -1,227 +0,0 @@
<template>
<div>
<pw-section class="blue" :label="$t('request')" ref="request">
<ul>
<li>
<label for="socketio-url">{{ $t("url") }}</label>
<input
id="socketio-url"
type="url"
spellcheck="false"
:class="{ error: !urlValid }"
v-model="url"
@keyup.enter="urlValid ? toggleConnection() : null"
/>
</li>
<div>
<li>
<label for="connect" class="hide-on-small-screen">&nbsp;</label>
<button :disabled="!urlValid" id="connect" name="connect" @click="toggleConnection">
{{ !connectionState ? $t("connect") : $t("disconnect") }}
<span>
<i class="material-icons">
{{ !connectionState ? "sync" : "sync_disabled" }}
</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
<pw-section class="purple" :label="$t('communication')" id="response" ref="response">
<ul>
<li>
<realtime-log :title="$t('log')" :log="communication.log" />
</li>
</ul>
<ul>
<li>
<label for="event_name">{{ $t("event_name") }}</label>
<input
id="event_name"
name="event_name"
type="text"
v-model="communication.eventName"
:readonly="!connectionState"
/>
</li>
</ul>
<ul>
<li>
<label for="socketio-message">{{ $t("message") }}</label>
<input
id="socketio-message"
name="message"
type="text"
v-model="communication.input"
:readonly="!connectionState"
@keyup.enter="connectionState ? sendMessage() : null"
/>
</li>
<div>
<li>
<label for="send" class="hide-on-small-screen">&nbsp;</label>
<button id="send" name="send" :disabled="!connectionState" @click="sendMessage">
{{ $t("send") }}
<span>
<i class="material-icons">send</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
</div>
</template>
<script>
import { socketioValid } from "~/helpers/utils/valid"
import io from "socket.io-client"
import wildcard from "socketio-wildcard"
export default {
components: {
"pw-section": () => import("~/components/layout/section"),
realtimeLog: () => import("./log"),
},
data() {
return {
url: "ws://",
connectionState: false,
io: null,
communication: {
log: null,
eventName: "",
input: "",
},
}
},
computed: {
urlValid() {
return socketioValid(this.url)
},
},
methods: {
toggleConnection() {
// If it is connecting:
if (!this.connectionState) return this.connect()
// Otherwise, it's disconnecting.
else return this.disconnect()
},
connect() {
this.communication.log = [
{
payload: this.$t("connecting_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
},
]
try {
this.io = new io(this.url)
// Add ability to listen to all events
wildcard(io.Manager)(this.io)
this.io.on("connect", () => {
this.connectionState = true
this.communication.log = [
{
payload: this.$t("connected_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
},
]
this.$toast.success(this.$t("connected"), {
icon: "sync",
})
})
this.io.on("*", ({ data }) => {
const [eventName, message] = data
this.communication.log.push({
payload: `[${eventName}] ${message ? JSON.stringify(message) : ""}`,
source: "server",
ts: new Date().toLocaleTimeString(),
})
})
this.io.on("connect_error", (error) => {
this.handleError(error)
})
this.io.on("reconnect_error", (error) => {
this.handleError(error)
})
this.io.on("error", (data) => {
this.handleError()
})
this.io.on("disconnect", () => {
this.connectionState = false
this.communication.log.push({
payload: this.$t("disconnected_from", { name: this.url }),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
this.$toast.error(this.$t("disconnected"), {
icon: "sync_disabled",
})
})
} catch (ex) {
this.handleError(ex)
this.$toast.error(this.$t("something_went_wrong"), {
icon: "error",
})
}
},
disconnect() {
this.io.close()
},
handleError(error) {
this.disconnect()
this.connectionState = false
this.communication.log.push({
payload: this.$t("error_occurred"),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
if (error !== null)
this.communication.log.push({
payload: error,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
sendMessage() {
const eventName = this.communication.eventName
let message
try {
message = JSON.parse(this.communication.input)
} catch (err) {
message = this.communication.input
}
if (this.io) {
// TODO: support only one argument now
// maybe should support more argument
this.io.emit(eventName, message, (data) => {
// receive response from server
this.communication.log.push({
payload: `[${eventName}] ${JSON.stringify(data)}`,
source: "server",
ts: new Date().toLocaleTimeString(),
})
})
this.communication.log.push({
payload: `[${eventName}] ${JSON.stringify(message)}`,
source: "client",
ts: new Date().toLocaleTimeString(),
})
this.communication.input = ""
}
},
},
}
</script>

View File

@@ -1,160 +0,0 @@
<template>
<div class="page">
<pw-section class="blue" :label="$t('request')" ref="request">
<ul>
<li>
<label for="server">{{ $t("server") }}</label>
<input
id="server"
type="url"
:class="{ error: !serverValid }"
v-model="server"
@keyup.enter="serverValid ? toggleSSEConnection() : null"
/>
</li>
<div>
<li>
<label for="start" class="hide-on-small-screen">&nbsp;</label>
<button :disabled="!serverValid" id="start" name="start" @click="toggleSSEConnection">
{{ !connectionSSEState ? $t("start") : $t("stop") }}
<span>
<i class="material-icons">
{{ !connectionSSEState ? "sync" : "sync_disabled" }}
</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
<pw-section class="purple" :label="$t('communication')" id="response" ref="response">
<ul>
<li>
<realtime-log :title="$t('events')" :log="events.log" />
<div id="result"></div>
</li>
</ul>
</pw-section>
</div>
</template>
<script>
import { httpValid } from "~/helpers/utils/valid"
export default {
components: {
"pw-section": () => import("../layout/section"),
realtimeLog: () => import("./log"),
},
data() {
return {
connectionSSEState: false,
server: "https://express-eventsource.herokuapp.com/events",
sse: null,
events: {
log: null,
input: "",
},
}
},
computed: {
serverValid() {
return httpValid(this.server)
},
},
methods: {
toggleSSEConnection() {
// If it is connecting:
if (!this.connectionSSEState) return this.start()
// Otherwise, it's disconnecting.
else return this.stop()
},
start() {
this.events.log = [
{
payload: this.$t("connecting_to", { name: this.server }),
source: "info",
color: "var(--ac-color)",
},
]
if (typeof EventSource !== "undefined") {
try {
this.sse = new EventSource(this.server)
this.sse.onopen = (event) => {
this.connectionSSEState = true
this.events.log = [
{
payload: this.$t("connected_to", { name: this.server }),
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
},
]
this.$toast.success(this.$t("connected"), {
icon: "sync",
})
}
this.sse.onerror = (event) => {
this.handleSSEError()
}
this.sse.onclose = (event) => {
this.connectionSSEState = false
this.events.log.push({
payload: this.$t("disconnected_from", { name: this.server }),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
this.$toast.error(this.$t("disconnected"), {
icon: "sync_disabled",
})
}
this.sse.onmessage = ({ data }) => {
this.events.log.push({
payload: data,
source: "server",
ts: new Date().toLocaleTimeString(),
})
}
} catch (ex) {
this.handleSSEError(ex)
this.$toast.error(this.$t("something_went_wrong"), {
icon: "error",
})
}
} else {
this.events.log = [
{
payload: this.$t("browser_support_sse"),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
},
]
}
},
handleSSEError(error) {
this.stop()
this.connectionSSEState = false
this.events.log.push({
payload: this.$t("error_occurred"),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
if (error !== null)
this.events.log.push({
payload: error,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
stop() {
this.sse.onclose()
this.sse.close()
},
},
}
</script>

View File

@@ -1,216 +0,0 @@
<template>
<div class="page">
<pw-section class="blue" :label="$t('request')" ref="request">
<ul>
<li>
<label for="websocket-url">{{ $t("url") }}</label>
<input
id="websocket-url"
type="url"
spellcheck="false"
:class="{ error: !urlValid }"
v-model="url"
@keyup.enter="urlValid ? toggleConnection() : null"
/>
</li>
<div>
<li>
<label for="connect" class="hide-on-small-screen">&nbsp;</label>
<button :disabled="!urlValid" id="connect" name="connect" @click="toggleConnection">
{{ !connectionState ? $t("connect") : $t("disconnect") }}
<span>
<i class="material-icons">
{{ !connectionState ? "sync" : "sync_disabled" }}
</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
<pw-section class="purple" :label="$t('communication')" id="response" ref="response">
<ul>
<li>
<realtime-log :title="$t('log')" :log="communication.log" />
</li>
</ul>
<ul>
<li>
<label for="websocket-message">{{ $t("message") }}</label>
<input
id="websocket-message"
name="message"
type="text"
v-model="communication.input"
:readonly="!connectionState"
@keyup.enter="connectionState ? sendMessage() : null"
@keyup.up="connectionState ? walkHistory('up') : null"
@keyup.down="connectionState ? walkHistory('down') : null"
/>
</li>
<div>
<li>
<label for="send" class="hide-on-small-screen">&nbsp;</label>
<button id="send" name="send" :disabled="!connectionState" @click="sendMessage">
{{ $t("send") }}
<span>
<i class="material-icons">send</i>
</span>
</button>
</li>
</div>
</ul>
</pw-section>
</div>
</template>
<script>
import { wsValid } from "~/helpers/utils/valid"
export default {
components: {
"pw-section": () => import("../layout/section"),
realtimeLog: () => import("./log"),
},
data() {
return {
connectionState: false,
url: "wss://echo.websocket.org",
socket: null,
communication: {
log: null,
input: "",
},
currentIndex: -1, //index of the message log array to put in input box
}
},
computed: {
urlValid() {
return wsValid(this.url)
},
},
methods: {
toggleConnection() {
// If it is connecting:
if (!this.connectionState) return this.connect()
// Otherwise, it's disconnecting.
else return this.disconnect()
},
connect() {
this.communication.log = [
{
payload: this.$t("connecting_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
},
]
try {
this.socket = new WebSocket(this.url)
this.socket.onopen = (event) => {
this.connectionState = true
this.communication.log = [
{
payload: this.$t("connected_to", { name: this.url }),
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString(),
},
]
this.$toast.success(this.$t("connected"), {
icon: "sync",
})
}
this.socket.onerror = (event) => {
this.handleError()
}
this.socket.onclose = (event) => {
this.connectionState = false
this.communication.log.push({
payload: this.$t("disconnected_from", { name: this.url }),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
this.$toast.error(this.$t("disconnected"), {
icon: "sync_disabled",
})
}
this.socket.onmessage = ({ data }) => {
this.communication.log.push({
payload: data,
source: "server",
ts: new Date().toLocaleTimeString(),
})
}
} catch (ex) {
this.handleError(ex)
this.$toast.error(this.$t("something_went_wrong"), {
icon: "error",
})
}
},
disconnect() {
this.socket.close()
},
handleError(error) {
this.disconnect()
this.connectionState = false
this.communication.log.push({
payload: this.$t("error_occurred"),
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
if (error !== null)
this.communication.log.push({
payload: error,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString(),
})
},
sendMessage() {
const message = this.communication.input
this.socket.send(message)
this.communication.log.push({
payload: message,
source: "client",
ts: new Date().toLocaleTimeString(),
})
this.communication.input = ""
},
walkHistory(direction) {
const clientMessages = this.communication.log.filter(({ source }) => source === "client")
const length = clientMessages.length
switch (direction) {
case "up":
if (length > 0 && this.currentIndex !== 0) {
//does nothing if message log is empty or the currentIndex is 0 when up arrow is pressed
if (this.currentIndex === -1) {
this.currentIndex = length - 1
this.communication.input = clientMessages[this.currentIndex].payload
} else if (this.currentIndex === 0) {
this.communication.input = clientMessages[0].payload
} else if (this.currentIndex > 0) {
this.currentIndex = this.currentIndex - 1
this.communication.input = clientMessages[this.currentIndex].payload
}
}
break
case "down":
if (length > 0 && this.currentIndex > -1) {
if (this.currentIndex === length - 1) {
this.currentIndex = -1
this.communication.input = ""
} else if (this.currentIndex < length - 1) {
this.currentIndex = this.currentIndex + 1
this.communication.input = clientMessages[this.currentIndex].payload
}
}
break
}
},
},
}
</script>

View File

@@ -1,59 +0,0 @@
<template>
<div
class="color"
:data-color="color"
:class="{ active: active }"
v-tooltip="{ content: name || color }"
:style="{ backgroundColor: color }"
>
<i v-if="active" class="material-icons activeTick">done</i>
</div>
</template>
<style scoped lang="scss">
.color {
display: inline-flex;
align-items: center;
justify-content: center;
margin: 8px;
padding: 16px;
border-radius: 100%;
border: 3px solid var(--bg-dark-color);
cursor: pointer;
transition: all 0.2s ease-in-out;
&.fg {
color: var(--act-color);
}
&.active {
border: 3px solid var(--ac-color);
}
&.fg.active {
border: 3px solid var(--fg-color);
}
.activeTick {
position: absolute;
}
}
</style>
<script>
export default {
props: {
color: {
type: String,
required: true,
},
name: {
type: String,
},
active: {
type: Boolean,
default: false,
},
},
}
</script>

View File

@@ -1,147 +0,0 @@
<template>
<div class="show-if-initialized" :class="{ initialized }">
<pre ref="editor"></pre>
</div>
</template>
<style lang="scss">
.show-if-initialized {
opacity: 0;
&.initialized {
opacity: 1;
}
& > * {
transition: none;
}
}
</style>
<script>
const DEFAULT_THEME = "twilight"
import ace from "ace-builds"
import "ace-builds/webpack-resolver"
import jsonParse from "~/helpers/jsonParse"
import debounce from "~/helpers/utils/debounce"
export default {
props: {
value: {
type: String,
default: "",
},
theme: {
type: String,
required: false,
},
lang: {
type: String,
default: "json",
},
lint: {
type: Boolean,
default: true,
required: false,
},
options: {
type: Object,
default: {},
},
},
data() {
return {
initialized: false,
editor: null,
cacheValue: "",
}
},
watch: {
value(value) {
if (value !== this.cacheValue) {
this.editor.session.setValue(value, 1)
this.cacheValue = value
if (this.lint) this.provideLinting(value)
}
},
theme() {
this.initialized = false
this.editor.setTheme(`ace/theme/${this.defineTheme()}`, () => {
this.$nextTick().then(() => {
this.initialized = true
})
})
},
lang(value) {
this.editor.getSession().setMode("ace/mode/" + value)
},
options(value) {
this.editor.setOptions(value)
},
},
mounted() {
const editor = ace.edit(this.$refs.editor, {
mode: `ace/mode/${this.lang}`,
...this.options,
})
// Set the theme and show the editor only after it's been set to prevent FOUC.
editor.setTheme(`ace/theme/${this.defineTheme()}`, () => {
this.$nextTick().then(() => {
this.initialized = true
})
})
if (this.value) editor.setValue(this.value, 1)
this.editor = editor
this.cacheValue = this.value
editor.on("change", () => {
const content = editor.getValue()
this.$emit("input", content)
this.cacheValue = content
if (this.lint) this.provideLinting(content)
})
// Disable linting, if lint prop is false
if (this.lint) this.provideLinting(this.value)
},
methods: {
defineTheme() {
if (this.theme) {
return this.theme
}
return this.$store.state.postwoman.settings.THEME_ACE_EDITOR || DEFAULT_THEME
},
provideLinting: debounce(function (code) {
if (this.lang === "json") {
try {
jsonParse(code)
this.editor.session.setAnnotations([])
} catch (e) {
const pos = this.editor.session.getDocument().indexToPosition(e.start, 0)
this.editor.session.setAnnotations([
{
row: pos.row,
column: pos.column,
text: e.message,
type: "error",
},
])
}
}
}, 2000),
},
destroyed() {
this.editor.destroy()
},
}
</script>

View File

@@ -1,101 +0,0 @@
<template>
<transition name="modal" appear>
<div class="modal-backdrop">
<div class="modal-wrapper">
<div class="modal-container">
<div class="modal-header">
<slot name="header"></slot>
</div>
<div class="modal-body">
<slot name="body"></slot>
<!-- <div class="fade top"></div>
<div class="fade bottom"></div> -->
</div>
<div class="modal-footer">
<slot name="footer"></slot>
</div>
</div>
</div>
</div>
</transition>
</template>
<style scoped lang="scss">
.modal-backdrop {
position: fixed;
z-index: 998;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.32);
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
}
.modal-wrapper {
display: flex;
align-items: center;
justify-content: center;
flex-grow: 1;
}
.modal-container {
position: relative;
display: flex;
flex-grow: 1;
flex-direction: column;
margin: 16px;
padding: 16px;
transition: all 0.2s ease;
background-color: var(--bg-color);
border-radius: 8px;
box-shadow: 0px 16px 70px rgba(0, 0, 0, 0.5);
max-height: calc(100vh - 128px);
max-width: 720px;
}
.modal-body {
overflow: auto;
}
/*
* The following styles are auto-applied to elements with
* transition="modal" when their visibility is toggled
* by Vue.js.
*
* You can easily play with the modal transition by editing
* these styles.
*/
.modal-enter,
.modal-leave-active {
opacity: 0;
}
.modal-enter .modal-container,
.modal-leave-active .modal-container {
transform: scale(0.8);
transition: all 0.2s ease-in-out;
}
.fade {
position: absolute;
left: 16px;
right: 20px;
display: block;
height: 32px;
transition: all 0.2s;
&.top {
top: 68px;
background: linear-gradient(to bottom, var(--bg-color), transparent);
}
&.bottom {
bottom: 16px;
background: linear-gradient(to top, var(--bg-color), transparent);
}
}
</style>

View File

@@ -1,36 +0,0 @@
<template>
<div v-show="isActive">
<slot></slot>
</div>
</template>
<style scoped lang="scss"></style>
<script>
export default {
props: {
label: { type: String },
icon: { type: String },
id: { required: true },
selected: {
default: false,
},
},
data() {
return {
isActive: false,
}
},
// computed: {
// href() {
// return `#${this.label.toLowerCase().replace(/ /g, "-")}`
// },
// },
mounted() {
this.isActive = this.selected
},
}
</script>

View File

@@ -1,106 +0,0 @@
<template>
<div class="tabs-wrapper">
<div class="tabs">
<ul>
<li
v-for="(tab, index) in tabs"
:class="{ 'is-active': tab.isActive }"
:key="index"
:tabindex="0"
@keyup.enter="selectTab(tab)"
>
<a :href="tab.href" @click="selectTab(tab)">
<i v-if="tab.icon" class="material-icons">
{{ tab.icon }}
</i>
<span v-if="tab.label">{{ tab.label }}</span>
</a>
</li>
</ul>
</div>
<div class="tabs-details">
<slot></slot>
</div>
</div>
</template>
<style scoped lang="scss">
.tabs-wrapper {
display: flex;
flex-flow: column nowrap;
flex-grow: 1;
overflow: hidden;
.tabs {
-webkit-overflow-scrolling: touch;
display: flex;
white-space: nowrap;
overflow: auto;
ul {
display: flex;
width: 0px;
}
li {
display: inline-flex;
a {
display: flex;
align-items: center;
justify-content: center;
padding: 8px 16px;
color: var(--fg-light-color);
border-radius: 8px;
cursor: pointer;
.material-icons {
margin-right: 8px;
}
&:hover {
color: var(--fg-color);
}
}
&:focus a {
color: var(--fg-color);
}
&.is-active a {
background-color: var(--brd-color);
color: var(--fg-color);
}
}
}
}
@media (max-width: 768px) {
ul,
ol {
flex-flow: row nowrap;
}
}
</style>
<script>
export default {
data() {
return {
tabs: [],
}
},
created() {
this.tabs = this.$children
},
methods: {
selectTab({ id }) {
this.tabs.forEach((tab) => {
tab.isActive = tab.id == id
})
},
},
}
</script>

View File

@@ -1,98 +0,0 @@
<template>
<div @click="toggle()">
<label class="toggle" :class="{ on: on }" ref="toggle">
<span class="handle"></span>
</label>
<label class="caption">
<slot />
</label>
</div>
</template>
<style scoped lang="scss">
$useBorder: false;
$borderColor: var(--fg-light-color);
$activeColor: var(--ac-color);
$inactiveColor: var(--fg-light-color);
$inactiveHandleColor: var(--bg-color);
$activeHandleColor: var(--act-color);
$width: 32px;
$height: 16px;
$handleSpacing: 4px;
$transition: all 0.2s ease-in-out;
div {
display: inline-block;
cursor: pointer;
}
label.caption {
vertical-align: middle;
cursor: pointer;
}
label.toggle {
position: relative;
display: inline-block;
width: $width;
height: $height;
border: if($useBorder, 2px solid $borderColor, none);
background-color: if($useBorder, transparent, $inactiveColor);
vertical-align: middle;
border-radius: 32px;
transition: $transition;
box-sizing: initial;
padding: 0;
margin: 8px 4px;
cursor: pointer;
.handle {
position: absolute;
display: inline-block;
top: 0;
bottom: 0;
left: 0;
margin: $handleSpacing;
background-color: $inactiveHandleColor;
width: #{$height - ($handleSpacing * 2)};
height: #{$height - ($handleSpacing * 2)};
border-radius: 100px;
pointer-events: none;
transition: $transition;
}
&.on {
background-color: $activeColor;
border-color: $activeColor;
.handle {
background-color: $activeHandleColor;
left: #{$width - $height};
}
}
}
</style>
<script>
export default {
props: {
on: {
type: Boolean,
default: false,
},
},
methods: {
toggle() {
const containsOnClass = this.$refs.toggle.classList.toggle("on")
this.$emit("change", containsOnClass)
},
},
}
</script>

View File

@@ -1,9 +0,0 @@
{
"baseUrl": "http://localhost:3000",
"integrationFolder": "tests/e2e/integration",
"screenshotsFolder": "tests/e2e/screenshots",
"fixturesFolder": "tests/e2e/fixtures",
"supportFile": "tests/e2e/support",
"pluginsFile": false,
"video": false
}

View File

@@ -1,6 +0,0 @@
{
"rules": {
".read": false,
".write": false
}
}

View File

@@ -5,7 +5,7 @@ services:
build:
context: .
volumes:
- "./.postwoman:/app/.postwoman"
- "./.hoppscotch:/app/.hoppscotch"
- "./assets:/app/assets"
- "./directives:/app/directives"
- "./layouts:/app/layouts"
@@ -15,6 +15,9 @@ services:
- "./static:/app/static"
- "./store:/app/store"
- "./components:/app/components"
- "./helpers:/app/helpers"
ports:
- "3000:3000"
environment:
HOST: 0.0.0.0
command: "npm run dev"

View File

@@ -1,15 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Postwoman</title>
<meta http-equiv="refresh" content="0; url=https://postwoman.io" />
<link rel="canonical" href="https://postwoman.io" />
</head>
<body>
Redirecting to postwoman.io
</body>
</html>

View File

@@ -1,18 +1,19 @@
{
"database": {
"rules": "database.rules.json"
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"hosting": {
"target": "postwoman",
"public": "dist",
"cleanUrls": true,
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
},
"storage": {
"rules": "storage.rules"
"predeploy": [
"cd packages/hoppscotch-app && mv .env.example .env && cd ../.. && npm install -g pnpm && pnpm i && pnpm run generate"
],
"public": "packages/hoppscotch-app/dist",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}

View File

@@ -1,26 +1,4 @@
{
// Example:
//
// "indexes": [
// {
// "collectionGroup": "widgets",
// "queryScope": "COLLECTION",
// "fields": [
// { "fieldPath": "foo", "arrayConfig": "CONTAINS" },
// { "fieldPath": "bar", "mode": "DESCENDING" }
// ]
// },
//
// "fieldOverrides": [
// {
// "collectionGroup": "widgets",
// "fieldPath": "baz",
// "indexes": [
// { "order": "ASCENDING", "queryScope": "COLLECTION" }
// ]
// },
// ]
// ]
"indexes": [],
"fieldOverrides": []
}

View File

@@ -3,7 +3,7 @@ service cloud.firestore {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
// Make sure the uid of the requesting user matches name of the user
// Make sure the uid of the requesting user matches the name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {

View File

@@ -1 +0,0 @@
node_modules/

View File

@@ -1,8 +0,0 @@
// const functions = require('firebase-functions');
// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"dependencies": {
"firebase-admin": "^8.0.0",
"firebase-functions": "^3.1.0"
},
"devDependencies": {
"firebase-functions-test": "^0.1.6"
},
"private": true
}

View File

@@ -1,11 +0,0 @@
const mimeToMode = {
"text/plain": "plain_text",
"text/html": "html",
"application/xml": "xml",
"application/hal+json": "json",
"application/json": "json",
}
export function getEditorLangForMimeType(mimeType) {
return mimeToMode[mimeType] || "plain_text"
}

View File

@@ -1,225 +0,0 @@
import firebase from "firebase/app"
import "firebase/firestore"
import "firebase/auth"
// Initialize Firebase, copied from cloud console
const firebaseConfig = {
apiKey: process.env.API_KEY || "AIzaSyCMsFreESs58-hRxTtiqQrIcimh4i1wbsM",
authDomain: process.env.AUTH_DOMAIN || "postwoman-api.firebaseapp.com",
databaseURL: process.env.DATABASE_URL || "https://postwoman-api.firebaseio.com",
projectId: process.env.PROJECT_ID || "postwoman-api",
storageBucket: process.env.STORAGE_BUCKET || "postwoman-api.appspot.com",
messagingSenderId: process.env.MESSAGING_SENDER_ID || "421993993223",
appId: process.env.APP_ID || "1:421993993223:web:ec0baa8ee8c02ffa1fc6a2",
measurementId: process.env.MEASUREMENT_ID || "G-ERJ6025CEB",
}
firebase.initializeApp(firebaseConfig)
// a reference to the users collection
const usersCollection = firebase.firestore().collection("users")
// the shared state object that any vue component
// can get access to
export const fb = {
currentUser: null,
currentFeeds: [],
currentSettings: [],
currentHistory: [],
currentCollections: [],
currentEnvironments: [],
writeFeeds: async (message, label) => {
const dt = {
createdOn: new Date(),
author: fb.currentUser.uid,
author_name: fb.currentUser.displayName,
author_image: fb.currentUser.photoURL,
message,
label,
}
usersCollection
.doc(fb.currentUser.uid)
.collection("feeds")
.add(dt)
.catch((e) => console.error("error inserting", dt, e))
},
deleteFeed: (id) => {
usersCollection
.doc(fb.currentUser.uid)
.collection("feeds")
.doc(id)
.delete()
.catch((e) => console.error("error deleting", id, e))
},
writeSettings: async (setting, value) => {
const st = {
updatedOn: new Date(),
author: fb.currentUser.uid,
author_name: fb.currentUser.displayName,
author_image: fb.currentUser.photoURL,
name: setting,
value,
}
usersCollection
.doc(fb.currentUser.uid)
.collection("settings")
.doc(setting)
.set(st)
.catch((e) => console.error("error updating", st, e))
},
writeHistory: async (entry) => {
const hs = entry
usersCollection
.doc(fb.currentUser.uid)
.collection("history")
.add(hs)
.catch((e) => console.error("error inserting", hs, e))
},
deleteHistory: (entry) => {
usersCollection
.doc(fb.currentUser.uid)
.collection("history")
.doc(entry.id)
.delete()
.catch((e) => console.error("error deleting", entry, e))
},
clearHistory: () => {
usersCollection
.doc(fb.currentUser.uid)
.collection("history")
.get()
.then(({ docs }) => {
docs.forEach((e) => fb.deleteHistory(e))
})
},
toggleStar: (entry, value) => {
usersCollection
.doc(fb.currentUser.uid)
.collection("history")
.doc(entry.id)
.update({ star: value })
.catch((e) => console.error("error deleting", entry, e))
},
writeCollections: async (collection) => {
const cl = {
updatedOn: new Date(),
author: fb.currentUser.uid,
author_name: fb.currentUser.displayName,
author_image: fb.currentUser.photoURL,
collection,
}
usersCollection
.doc(fb.currentUser.uid)
.collection("collections")
.doc("sync")
.set(cl)
.catch((e) => console.error("error updating", cl, e))
},
writeEnvironments: async (environment) => {
const ev = {
updatedOn: new Date(),
author: fb.currentUser.uid,
author_name: fb.currentUser.displayName,
author_image: fb.currentUser.photoURL,
environment,
}
usersCollection
.doc(fb.currentUser.uid)
.collection("environments")
.doc("sync")
.set(ev)
.catch((e) => console.error("error updating", ev, e))
},
}
// When a user logs in or out, save that in the store
firebase.auth().onAuthStateChanged((user) => {
if (user) {
fb.currentUser = user
fb.currentUser.providerData.forEach((profile) => {
let us = {
updatedOn: new Date(),
provider: profile.providerId,
name: profile.displayName,
email: profile.email,
photoUrl: profile.photoURL,
uid: profile.uid,
}
usersCollection
.doc(fb.currentUser.uid)
.set(us)
.catch((e) => console.error("error updating", us, e))
})
usersCollection
.doc(fb.currentUser.uid)
.collection("feeds")
.orderBy("createdOn", "desc")
.onSnapshot((feedsRef) => {
const feeds = []
feedsRef.forEach((doc) => {
const feed = doc.data()
feed.id = doc.id
feeds.push(feed)
})
fb.currentFeeds = feeds
})
usersCollection
.doc(fb.currentUser.uid)
.collection("settings")
.onSnapshot((settingsRef) => {
const settings = []
settingsRef.forEach((doc) => {
const setting = doc.data()
setting.id = doc.id
settings.push(setting)
})
fb.currentSettings = settings
})
usersCollection
.doc(fb.currentUser.uid)
.collection("history")
.onSnapshot((historyRef) => {
const history = []
historyRef.forEach((doc) => {
const entry = doc.data()
entry.id = doc.id
history.push(entry)
})
fb.currentHistory = history
})
usersCollection
.doc(fb.currentUser.uid)
.collection("collections")
.onSnapshot((collectionsRef) => {
const collections = []
collectionsRef.forEach((doc) => {
const collection = doc.data()
collection.id = doc.id
collections.push(collection)
})
if (collections.length > 0) {
fb.currentCollections = collections[0].collection
}
})
usersCollection
.doc(fb.currentUser.uid)
.collection("environments")
.onSnapshot((environmentsRef) => {
const environments = []
environmentsRef.forEach((doc) => {
const environment = doc.data()
environment.id = doc.id
environments.push(environment)
})
if (environments.length > 0) {
fb.currentEnvironments = environments[0].environment
}
})
} else {
fb.currentUser = null
}
})

View File

@@ -1,8 +0,0 @@
const htmlLens = {
lensName: "HTML",
supportedContentTypes: ["text/html"],
renderer: "htmlres",
rendererImport: () => import("~/components/lenses/renderers/HTMLLensRenderer"),
}
export default htmlLens

View File

@@ -1,16 +0,0 @@
const imageLens = {
lensName: "Image",
supportedContentTypes: [
"image/gif",
"image/jpeg",
"image/png",
"image/bmp",
"image/svg+xml",
"image/x-icon",
"image/vnd.microsoft.icon",
],
renderer: "imageres",
rendererImport: () => import("~/components/lenses/renderers/ImageLensRenderer"),
}
export default imageLens

View File

@@ -1,8 +0,0 @@
const jsonLens = {
lensName: "JSON",
supportedContentTypes: ["application/json", "application/hal+json", "application/vnd.api+json"],
renderer: "json",
rendererImport: () => import("~/components/lenses/renderers/JSONLensRenderer"),
}
export default jsonLens

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