Compare commits

..

626 Commits

Author SHA1 Message Date
Liyas Thomas
caed1a2f3c Bump version 1.0.0 2019-11-04 16:31:48 +05:30
Liyas Thomas
57f932851a docs: add liyasthomas as a contributor (#264)
docs: add liyasthomas as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 16:11:30 +05:30
allcontributors[bot]
cc956edf2d docs: update .all-contributorsrc 2019-11-04 10:40:23 +00:00
allcontributors[bot]
10f3a7193a docs: update README.md 2019-11-04 10:40:22 +00:00
Liyas Thomas
f08865eedc Badge position 2019-11-04 16:08:33 +05:30
Liyas Thomas
cf67df3bf9 docs: add jamesgeorge007 as a contributor (#263)
docs: add jamesgeorge007 as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:59:39 +05:30
Liyas Thomas
86c14a1d78 Merge pull request #262 from liyasthomas/all-contributors/add-NBTX
docs: add NBTX as a contributor
2019-11-04 15:58:40 +05:30
allcontributors[bot]
6411901200 docs: update .all-contributorsrc 2019-11-04 10:26:35 +00:00
allcontributors[bot]
af110337ce docs: update README.md 2019-11-04 10:26:34 +00:00
allcontributors[bot]
789b934996 docs: update .all-contributorsrc 2019-11-04 10:23:39 +00:00
allcontributors[bot]
9ec5c91a8d docs: update README.md 2019-11-04 10:23:38 +00:00
allcontributors[bot]
f89a901f6b docs: update .all-contributorsrc 2019-11-04 10:21:32 +00:00
allcontributors[bot]
063496e738 docs: update README.md 2019-11-04 10:21:31 +00:00
John Harker
847fb4d52c Merge pull request #260 from liyasthomas/fix/readme-contributors-badge
️ Fix .all-contributorsrc badge position.
2019-11-04 10:20:05 +00:00
Liyas Thomas
3157de7e8b Fixed all-contributors badge position 2019-11-04 15:48:42 +05:30
John Harker
3cd0eaaf58 Update .all-contributorsrc 2019-11-04 10:14:30 +00:00
John Harker
184aa59799 Update README.md 2019-11-04 10:14:04 +00:00
Liyas Thomas
b6e88e713d ✏️ Removed badge 2019-11-04 15:26:27 +05:30
John Harker
09eabbf848 Fix .all-contributorsrc badge template. 2019-11-04 09:55:51 +00:00
Liyas Thomas
84d0e5c39e docs: add hosseinnedaee as a contributor (#259)
docs: add hosseinnedaee as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:20:47 +05:30
allcontributors[bot]
c63caa6015 docs: update .all-contributorsrc 2019-11-04 09:50:29 +00:00
allcontributors[bot]
b9cf079a85 docs: update README.md 2019-11-04 09:50:28 +00:00
Liyas Thomas
ce4059a68e docs: add nityanandagohain as a contributor (#257)
docs: add nityanandagohain as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:20:04 +05:30
allcontributors[bot]
65a4ca8925 docs: update .all-contributorsrc 2019-11-04 09:49:32 +00:00
allcontributors[bot]
2a049433eb docs: update README.md 2019-11-04 09:49:31 +00:00
Liyas Thomas
89ca42dabd docs: add JacobAnavisca as a contributor (#256)
docs: add JacobAnavisca as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:19:08 +05:30
allcontributors[bot]
12f6a324b9 docs: update .all-contributorsrc 2019-11-04 09:48:36 +00:00
allcontributors[bot]
f3d2ad55f6 docs: update README.md 2019-11-04 09:48:35 +00:00
Liyas Thomas
62a911161d docs: add izerozlu as a contributor (#255)
docs: add izerozlu as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:18:12 +05:30
allcontributors[bot]
f4adfc4757 docs: update .all-contributorsrc 2019-11-04 09:47:36 +00:00
allcontributors[bot]
2de0dfb81c docs: update README.md 2019-11-04 09:47:35 +00:00
Liyas Thomas
abe95a0876 docs: add vlad0337187 as a contributor (#254)
docs: add vlad0337187 as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:16:37 +05:30
allcontributors[bot]
0f0baf904f docs: update .all-contributorsrc 2019-11-04 09:45:54 +00:00
allcontributors[bot]
ef0eb6b047 docs: update README.md 2019-11-04 09:45:53 +00:00
Liyas Thomas
323dd6b6f4 docs: add AndrewBastin as a contributor (#253)
docs: add AndrewBastin as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:14:49 +05:30
allcontributors[bot]
7edf8e4f3f docs: update .all-contributorsrc 2019-11-04 09:44:04 +00:00
allcontributors[bot]
b76980de14 docs: update README.md 2019-11-04 09:44:03 +00:00
Liyas Thomas
a13b4bc514 docs: add terranblake as a contributor (#252)
docs: add terranblake as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:12:13 +05:30
allcontributors[bot]
cf58ee1d1f docs: update .all-contributorsrc 2019-11-04 09:41:32 +00:00
allcontributors[bot]
f7774f7ed0 docs: update README.md 2019-11-04 09:41:31 +00:00
Liyas Thomas
8417e925a9 docs: add nickpalenchar as a contributor (#251)
docs: add nickpalenchar as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:04:24 +05:30
allcontributors[bot]
068d6dff6e docs: update .all-contributorsrc 2019-11-04 09:32:09 +00:00
allcontributors[bot]
f96dac147f docs: update README.md 2019-11-04 09:32:08 +00:00
Liyas Thomas
9b212fa9e7 docs: add yubathom as a contributor (#250)
docs: add yubathom as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 15:01:38 +05:30
allcontributors[bot]
185e6093ed docs: update .all-contributorsrc 2019-11-04 09:30:31 +00:00
allcontributors[bot]
999499b840 docs: update README.md 2019-11-04 09:30:30 +00:00
Liyas Thomas
0279af9f57 docs: add larouxn as a contributor (#249)
docs: add larouxn as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 14:57:27 +05:30
allcontributors[bot]
8305f1a8cb docs: update .all-contributorsrc 2019-11-04 09:21:44 +00:00
allcontributors[bot]
39019f03ed docs: update README.md 2019-11-04 09:21:43 +00:00
Liyas Thomas
e0d4312cbe docs: add NBTX as a contributor (#248)
docs: add NBTX as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 14:50:18 +05:30
allcontributors[bot]
c0a364ef57 docs: update .all-contributorsrc 2019-11-04 09:14:45 +00:00
allcontributors[bot]
b1e5c3b361 docs: update README.md 2019-11-04 09:14:44 +00:00
Liyas Thomas
fa9e955fc2 ✏️ Typo 2019-11-04 14:43:12 +05:30
Liyas Thomas
0504c35f2b ✏️ Added all-contributors 2019-11-04 14:41:11 +05:30
Liyas Thomas
4b8882f222 docs: add liyasthomas as a contributor (#247)
docs: add liyasthomas as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-11-04 14:37:55 +05:30
allcontributors[bot]
35e1a8e821 docs: create .all-contributorsrc 2019-11-04 08:56:31 +00:00
allcontributors[bot]
35be891910 docs: update README.md 2019-11-04 08:56:30 +00:00
liyasthomas
2400556da3 Moved styles from layouts to assets 2019-11-04 00:09:08 +05:30
John Harker
09d3d26b45 Merge pull request #246 from liyasthomas/bugfix/page-fluidity
Make page changes more fluid
2019-11-03 17:33:33 +00:00
John Harker
a51fd1d35e Make page changes more fluid 2019-11-03 16:36:46 +00:00
liyasthomas
dd4b388452 🔍 Fixed sitemap location 2019-11-03 12:15:56 +05:30
liyasthomas
f6eb1e9652 🔍 Fixed sitemap location 2019-11-03 12:03:28 +05:30
liyasthomas
6ab7a92184 Improved font render 2019-11-03 11:53:48 +05:30
liyasthomas
5523cece62 🔍 Fixed sitemap location 2019-11-03 11:47:59 +05:30
liyasthomas
3198f6172b 🔍 Improving SEO 2019-11-03 11:36:41 +05:30
liyasthomas
ae2d07838c ✏️ Minor update 2019-11-03 11:02:20 +05:30
Liyas Thomas
c81394fe66 Add brand new logo to the project (#244)
Add brand new logo to the project

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2019-11-03 10:05:26 +05:30
liyasthomas
389f9366e0 🎨 simple-icons 2019-11-03 09:56:31 +05:30
liyasthomas
9921133d14 Square logo 2019-11-03 04:21:18 +05:30
liyasthomas
f751457313 ✏️ Updated tagline 2019-11-03 03:59:38 +05:30
liyasthomas
33fe4d51e7 🐛 Fixed broken badges 2019-11-03 03:29:31 +05:30
liyasthomas
0d0b20e60e New icons 2019-11-03 03:26:08 +05:30
liyasthomas
7e99be469d Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-11-03 01:59:15 +05:30
liyasthomas
acdb26d476 📦 Fixed audit warnings 2019-11-03 01:59:03 +05:30
Liyas Thomas
7cc7e56f73 Minor tweaks (#245)
Minor tweaks
2019-11-03 01:55:02 +05:30
liyasthomas
18bbe98cc6 🐛 Fixed broken use request from collections 2019-11-03 01:44:56 +05:30
Caneco
3f042d71f2 improvement: add brand new logo to the project 2019-11-02 19:51:31 +00:00
liyasthomas
5db9ca9786 Minor tweaks 2019-11-03 01:20:40 +05:30
Liyas Thomas
b95eaf1aed 🚨 Lint 2019-11-02 11:02:21 +05:30
Liyas Thomas
9023e62fb4 Merge pull request #243 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/google-tag-manager-2.3.1
⬆️ Bump @nuxtjs/google-tag-manager from 2.3.0 to 2.3.1
2019-11-02 10:56:31 +05:30
Liyas Thomas
45bab0cc00 ⬆️ Bump yargs-parser from 15.0.0 to 16.1.0 (#242)
⬆️ Bump yargs-parser from 15.0.0 to 16.1.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-11-02 10:32:37 +05:30
dependabot-preview[bot]
70fb0c1c6b ⬆️ Bump @nuxtjs/google-tag-manager from 2.3.0 to 2.3.1
Bumps [@nuxtjs/google-tag-manager](https://github.com/nuxt-community/modules) from 2.3.0 to 2.3.1.
- [Release notes](https://github.com/nuxt-community/modules/releases)
- [Commits](https://github.com/nuxt-community/modules/compare/@nuxtjs/google-tag-manager@2.3.0...@nuxtjs/google-tag-manager@2.3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-02 04:35:54 +00:00
Liyas Thomas
95ee8d101f ⬆️ Bump @nuxtjs/toast from 3.2.1 to 3.3.0 (#241)
⬆️ Bump @nuxtjs/toast from 3.2.1 to 3.3.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-11-02 10:02:40 +05:30
dependabot-preview[bot]
fa91c4b4d5 ⬆️ Bump yargs-parser from 15.0.0 to 16.1.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 15.0.0 to 16.1.0.
- [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/v15.0.0...v16.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-02 03:09:43 +00:00
dependabot-preview[bot]
2108cb8e1c ⬆️ Bump @nuxtjs/toast from 3.2.1 to 3.3.0
Bumps [@nuxtjs/toast](https://github.com/nuxt/modules) from 3.2.1 to 3.3.0.
- [Release notes](https://github.com/nuxt/modules/releases)
- [Commits](https://github.com/nuxt/modules/compare/@nuxtjs/toast@3.2.1...@nuxtjs/toast@3.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-02 03:09:32 +00:00
Liyas Thomas
e5d9a25cff ⬆️ Bump highlight.js from 9.15.10 to 9.16.2 (#240)
⬆️ Bump highlight.js from 9.15.10 to 9.16.2

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-11-02 08:19:12 +05:30
Liyas Thomas
c06cb8d9a7 ⬆️ Bump cypress from 3.5.0 to 3.6.0 (#239)
⬆️ Bump cypress from 3.5.0 to 3.6.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-11-02 08:11:58 +05:30
dependabot-preview[bot]
da0f5f2bd1 ⬆️ Bump highlight.js from 9.15.10 to 9.16.2
Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.15.10 to 9.16.2.
- [Release notes](https://github.com/highlightjs/highlight.js/releases)
- [Changelog](https://github.com/highlightjs/highlight.js/blob/master/CHANGES.md)
- [Commits](https://github.com/highlightjs/highlight.js/compare/9.15.10...9.16.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-02 01:31:35 +00:00
dependabot-preview[bot]
8e9af90289 ⬆️ Bump cypress from 3.5.0 to 3.6.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 3.5.0 to 3.6.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v3.5.0...v3.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-02 01:30:57 +00:00
Liyas Thomas
3f66d87a8a Minor UI tweaks 2019-11-01 20:42:17 +05:30
Liyas Thomas
c019ef0a24 Minor animations 2019-11-01 19:42:40 +05:30
Liyas Thomas
eac2e1548a :Minor UI tweaks: 2019-11-01 17:23:30 +05:30
Liyas Thomas
2934a5517d Added tooltips to sidebar nav 2019-11-01 17:13:55 +05:30
Liyas Thomas
4e1d3e9fe9 Major UI redesign 2019-11-01 16:45:53 +05:30
John Harker
47e88ff055 Merge pull request #238 from NBTX/master
Fix legend labels in Firefox, fix colored labels slider
2019-10-31 16:44:18 +00:00
NBTX
9ee398af19 Fix legend labels in Firefox, fix colored labels slider 2019-10-31 16:37:09 +00:00
Liyas Thomas
e369791f37 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-10-31 15:35:52 +05:30
Liyas Thomas
986abd5549 ✏️ Added Badges, initial Wiki etc 2019-10-31 15:33:43 +05:30
Liyas Thomas
e61ec3e576 Merge pull request #231 from liyasthomas/feature/pre-request-script
Feature/pre request script
2019-10-30 08:50:28 +05:30
Liyas Thomas
430fde9ea9 Updated feature list 2019-10-30 08:46:44 +05:30
Liyas Thomas
ad1c7450ab Added β symbol to , few minor UI updates before production deployment 2019-10-30 08:30:29 +05:30
Liyas Thomas
02f28eb87c Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-10-30 08:01:26 +05:30
Liyas Thomas
b2645c50e7 📸 Updating snapshots 2019-10-30 07:55:56 +05:30
Nicholas Palenchar
1bf17d5514 Merge branch 'master' into feature/pre-request-script 2019-10-29 22:12:37 -04:00
Nicholas Palenchar
36fb51705b update search tearm and parse more data 2019-10-29 22:11:07 -04:00
Nicholas Palenchar
668f99c37f pre-request script working 2019-10-29 21:28:44 -04:00
John Harker
a53c7ce08c Merge pull request #230 from amitdash291/master
Documentation Cleanup
2019-10-29 23:47:11 +00:00
Amit Dash
1068f8a664 Documentation cleanup and typo fixes 2019-10-30 01:07:12 +05:30
John Harker
8c98e7fcd7 Merge pull request #228 from reefqi037/toogle-exclude-credentials
Fix #227 Exclude credentials from permalink
2019-10-29 14:37:57 +00:00
Abdul Rifqi Al Abqary
282749166a Fix excluding credentials in permalink 2019-10-29 22:41:45 +09:00
Liyas Thomas
1f3d1fd344 Theme color fix 2019-10-29 16:37:56 +05:30
Liyas Thomas
1250a46274 Few UI tweaks 2019-10-29 13:36:41 +05:30
Liyas Thomas
e7a7c7b5ac Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-10-29 12:18:01 +05:30
Liyas Thomas
be00a6fd60 Browser tab color matches selected theme 2019-10-29 12:17:57 +05:30
Liyas Thomas
0647fc3297 Merge pull request #211 from breno-pereira/master
bug: keeping information on page change
2019-10-26 10:12:52 -07:00
breno-pereira
6c28ebe057 refactoring 2019-10-26 09:18:23 -03:00
breno-pereira
db0826d43a merge and fix 2019-10-26 09:02:17 -03:00
liyasthomas
b1157a0615 ✏️ Updated features list, minor UI tweaks 2019-10-26 01:41:57 -07:00
John Harker
e9830479af Merge pull request #224 from liyasthomas/dependabot/npm_and_yarn/cypress-3.5.0
⬆️ Bump cypress from 3.4.1 to 3.5.0
2019-10-26 02:44:56 +01:00
John Harker
55cacc2a81 Merge pull request #223 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.8.0
⬆️ Bump @nuxtjs/axios from 5.6.0 to 5.8.0
2019-10-26 02:44:28 +01:00
Liyas Thomas
201fe59983 ⬆️ Bump nuxt from 2.10.1 to 2.10.2 (#221)
⬆️ Bump nuxt from 2.10.1 to 2.10.2

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-25 18:36:46 -07:00
dependabot-preview[bot]
22a50571e6 ⬆️ Bump cypress from 3.4.1 to 3.5.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 3.4.1 to 3.5.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v3.4.1...v3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 01:29:57 +00:00
Liyas Thomas
1245ecf8fb ⬆️ Bump node-sass from 4.12.0 to 4.13.0 (#222)
⬆️ Bump node-sass from 4.12.0 to 4.13.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-25 18:28:02 -07:00
dependabot-preview[bot]
312d4c1721 ⬆️ Bump nuxt from 2.10.1 to 2.10.2
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.10.1 to 2.10.2.
- [Release notes](https://github.com/nuxt/nuxt.js/releases)
- [Changelog](https://github.com/nuxt/nuxt.js/blob/dev/RELEASE_PLAN.md)
- [Commits](https://github.com/nuxt/nuxt.js/compare/v2.10.1...v2.10.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 01:20:07 +00:00
dependabot-preview[bot]
236a38f6c9 ⬆️ Bump @nuxtjs/axios from 5.6.0 to 5.8.0
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.6.0 to 5.8.0.
- [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.6.0...v5.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 01:20:04 +00:00
Liyas Thomas
df8da24b5a ⬆️ Bump @nuxtjs/google-analytics from 2.2.0 to 2.2.1 (#220)
⬆️ Bump @nuxtjs/google-analytics from 2.2.0 to 2.2.1
2019-10-25 18:17:52 -07:00
Liyas Thomas
9c28042fdd ⬆️ Bump vuex-persist from 2.1.0 to 2.1.1 (#219)
⬆️ Bump vuex-persist from 2.1.0 to 2.1.1

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-25 17:50:47 -07:00
dependabot-preview[bot]
91310a803c ⬆️ Bump node-sass from 4.12.0 to 4.13.0
Bumps [node-sass](https://github.com/sass/node-sass) from 4.12.0 to 4.13.0.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.12.0...v4.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 00:15:56 +00:00
dependabot-preview[bot]
a4aeb83a01 ⬆️ Bump @nuxtjs/google-analytics from 2.2.0 to 2.2.1
Bumps [@nuxtjs/google-analytics](https://github.com/nuxt-community/analytics-module) from 2.2.0 to 2.2.1.
- [Release notes](https://github.com/nuxt-community/analytics-module/releases)
- [Changelog](https://github.com/nuxt-community/analytics-module/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/analytics-module/compare/v2.2.0...v2.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 00:14:26 +00:00
dependabot-preview[bot]
fc82976cf0 ⬆️ Bump vuex-persist from 2.1.0 to 2.1.1
Bumps [vuex-persist](https://github.com/championswimmer/vuex-persist) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/championswimmer/vuex-persist/releases)
- [Changelog](https://github.com/championswimmer/vuex-persist/blob/master/CHANGELOG.md)
- [Commits](https://github.com/championswimmer/vuex-persist/compare/v2.1.0...v2.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-26 00:13:45 +00:00
John Harker
17adfeb553 Merge pull request #217 from NBTX/master
Add the ApolloTV proxy server
2019-10-25 21:22:20 +01:00
NBTX
41c82e1ea9 Remove legacy proxy server middleware 2019-10-25 21:14:49 +01:00
NBTX
f51bcc2406 Add the proxy server 2019-10-25 20:54:27 +01:00
John Harker
84eda99dc0 Merge pull request #216 from mateusppereira/bug-fix-frame-colors
Fixed frame colors toggle
2019-10-25 19:47:17 +01:00
John Harker
fa268fd092 Merge pull request #215 from NBTX/master
Re-order sections and add toggle for including authentication in URL
2019-10-25 19:40:41 +01:00
mateusppereira
9103ceeb1e using toggleSetting method 2019-10-25 15:07:51 -03:00
mateusppereira
224079674b fix mistake 2019-10-25 15:03:06 -03:00
mateusppereira
2f13546b8b fixed frame colors bug 2019-10-25 14:56:24 -03:00
John Harker
2ac8a45446 Merge pull request #214 from jamesgeorge007/feat/minor-refactor
chore: minor code refactor
2019-10-25 17:30:41 +01:00
NBTX
0673cf0bbb Re-order sections and add toggle for including authentication in URL 2019-10-25 17:03:50 +01:00
jamesgeorge007
55dfb12358 feat: refactor 2019-10-25 20:24:32 +05:30
Liyas Thomas
27d3e9e6b7 ✏️ Better Save request modal 2019-10-25 14:49:47 +05:30
Liyas Thomas
a09d7d76d3 : rotating_light: Lint 2019-10-25 13:44:34 +05:30
Liyas Thomas
96adfa0b5a Fix #212 Clear bearer token value (#213)
Fix #212 Clear bearer token value
2019-10-25 12:08:49 +05:30
RifqiAlAbqary
4ee7ff45e3 Fix #212 Clear bearer token value 2019-10-25 11:44:53 +09:00
breno-pereira
8334441f2d fix conflicts 2019-10-24 20:48:20 -03:00
breno-pereira
36ec17a06c add vuex-persist 2019-10-24 20:28:08 -03:00
Liyas Thomas
2f47fc534d Merge pull request #209 from vlad0337187/feature/allow-collections-importing
Work in Progress: feature/allow-collections-importing
2019-10-24 19:14:12 +05:30
vlad0337187
bd64e4a45b refactor, fix: split 'components/collections/saveRequest.vue' to 'editRequest', 'saveRequestAs'; fix saving bugs 2019-10-24 13:46:18 +03:00
vlad0337187
3743ff96ff refactor: split 'components/collections/addFolder.vue' to 'addFolder', 'editFolder' 2019-10-24 05:20:52 +03:00
vlad0337187
932b92e67d refactor: split 'components/collections/addCollection.vue' to 'addCollection', 'editCollection' 2019-10-24 02:38:52 +03:00
vlad0337187
770556aa74 feature: allow importing collections from local JSON files 2019-10-23 23:11:11 +03:00
Liyas Thomas
26bc275f0f Merge pull request #208 from vlad0337187/fix/collection-is-empty-label
fix: don't display 'Collection is empty' label if collection has any requests
2019-10-24 00:40:35 +05:30
vlad0337187
ae8dccf292 fix: don't display 'Collection is empty' label if collection has any requests 2019-10-23 20:49:47 +03:00
Liyas Thomas
9e9a73efc6 💄 Minor UI updates 2019-10-23 15:22:42 +05:30
Liyas Thomas
94364f0dad 🎨 UI tweaks, added empty state prompts in Collections 2019-10-23 12:34:28 +05:30
Liyas Thomas
635c82c316 Added 'Export JSON' button to download collections as json file 2019-10-23 08:54:05 +05:30
Liyas Thomas
e2bae8a61f Merge pull request #207 from liyasthomas/feature/log-errors
Feature/log errors
2019-10-23 07:25:50 +05:30
Nicholas Palenchar
93300a4932 update toast error 2019-10-22 21:48:55 -04:00
Nicholas Palenchar
613f3c5cbc closes #206 always display errors in the console 2019-10-22 21:24:08 -04:00
Liyas Thomas
04f55cd9c4 Formatting exported Collection 2019-10-23 03:37:44 +05:30
Liyas Thomas
7f7d509212 Merge pull request #205 from hosseinnedaee/code_refinment
Use returned value from toggle component on change event
2019-10-23 02:56:56 +05:30
Hossein Nedaee
cbbc0e5efa Use returned value from toggle component on change event 2019-10-22 23:04:17 +03:30
Liyas Thomas
3208cec882 🎨 Minor UI update on collections 2019-10-22 21:27:48 +05:30
Liyas Thomas
4b3cee7f43 💄 UI stylings 2019-10-22 17:32:26 +05:30
Liyas Thomas
705fd9971f Merge pull request #176 from TheHollidayInn/feat/collections
Collections
2019-10-22 14:49:53 +05:30
Liyas Thomas
ee58075d3f 🎨 Basic stylings 2019-10-22 14:43:54 +05:30
thehollidayinn
7ad6cd83db Added save selected request. 2019-10-21 23:07:35 -06:00
thehollidayinn
3f5307ef79 Added export modal. 2019-10-21 23:00:13 -06:00
thehollidayinn
b244ee8580 Save icon. 2019-10-21 22:52:01 -06:00
thehollidayinn
16bcb65d94 Updates to editing request. 2019-10-21 22:50:09 -06:00
Liyas Thomas
1b9db42114 Better Proxy toast prompt 2019-10-21 15:50:05 +05:30
Liyas Thomas
de63ff558d 💩 Badges 2019-10-21 11:22:57 +05:30
Liyas Thomas
307daf2a7a Better tooltip color, Added scroll to History section 2019-10-20 15:48:07 +05:30
John Harker
5e551b4ffe Merge pull request #201 from NBTX/master
Fix proxy URL
2019-10-20 02:23:46 +01:00
NBTX
f6316ca956 Fix proxy URL 2019-10-20 02:22:24 +01:00
Liyas Thomas
4d764b6bac Merge pull request #200 from NBTX/master
Fix CORS and Mixed-Content issue & Bug Fixes
2019-10-20 06:43:28 +05:30
Liyas Thomas
1070260476 Merge pull request #199 from hosseinnedaee/Proxy_Server
Fix CORS and mixed content issue
2019-10-20 06:36:54 +05:30
NBTX
f839189121 Fix CORS and Mixed-Content issue & Bug Fixes
This fixes the following issues:
- Text selection color was incorrect
- The 'send again' button glitched on page load

This also adds some finishing touches to the proxy code (closes #199)
and that in turn resolves #175 and resolves #2

Finally, this adds the fonts to the application assets allowing
them to be cached by the service worker.
2019-10-20 02:00:41 +01:00
John Harker
a73d8053b1 Merge pull request #2 from hosseinnedaee/Proxy_Server
Proxy server
2019-10-20 00:16:03 +01:00
Hossein Nedaee
395029489a Use vue router to link proxy toast to settings page 2019-10-20 00:19:07 +03:30
Hossein Nedaee
1c99ffa3cc Create and use proxy server middleware
Because
- Get over of CORS and mixed content browser errors
2019-10-19 23:27:16 +03:30
Liyas Thomas
18178741c8 ✏️ Added new collaborators 2019-10-19 19:43:45 +05:30
Liyas Thomas
6bf9fc29e7 Merge pull request #198 from liyasthomas/dependabot/npm_and_yarn/start-server-and-test-1.10.6
⬆️ Bump start-server-and-test from 1.10.5 to 1.10.6
2019-10-19 05:49:48 +05:30
dependabot-preview[bot]
299d8bbc90 ⬆️ Bump start-server-and-test from 1.10.5 to 1.10.6
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.5 to 1.10.6.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.5...v1.10.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-19 00:14:27 +00:00
Liyas Thomas
7c37123216 Merge pull request #197 from AndrewBastin/master
Added Tooltips
2019-10-19 05:08:19 +05:30
Andrew Bastin
ab06ee6bd4 Added tooltip for Settings icon on the header 2019-10-18 16:30:40 -04:00
Andrew Bastin
719928f5e5 Icons in the history entries have tooltips now 2019-10-18 16:29:54 -04:00
Andrew Bastin
0d55dc2b38 Added tooltip styling 2019-10-18 16:29:24 -04:00
Andrew Bastin
b229bf6197 Registered v-tooltip dependency with Vue 2019-10-18 16:28:51 -04:00
Andrew Bastin
35b47b83d7 Added v-tooltip dependency 2019-10-18 16:28:31 -04:00
Keith Holliday
85d6c3ac34 Edit request. 2019-10-17 10:57:58 -06:00
Keith Holliday
5847f0b16e Added save and remove requests. 2019-10-17 10:57:19 -06:00
Keith Holliday
cad907125b Added initial save request 2019-10-17 10:57:18 -06:00
Keith Holliday
d989da2811 Added edit folder. 2019-10-17 10:57:18 -06:00
Keith Holliday
ed53b433b5 Added edit and remove collection. 2019-10-17 10:57:18 -06:00
Liyas Thomas
18a0c391f6 Merge branch 'master' into feat/collections 2019-10-16 18:12:35 +05:30
Liyas Thomas
d78c4041a3 Optimized cookie consent toast 2019-10-16 15:31:26 +05:30
Liyas Thomas
c62b65b012 Added Cookie Consent toast 2019-10-15 17:27:16 +05:30
Liyas Thomas
6a9d026052 ✏️ Meta 2019-10-14 19:20:13 +05:30
liyasthomas
f562dc9e2a ✏️ Updated feature list 2019-10-12 23:51:50 +05:30
liyasthomas
0fdb4197a1 Better elapsed request time calculation 2019-10-12 23:13:37 +05:30
liyasthomas
39cbe8a858 Added elapsed request time toast 2019-10-12 22:18:42 +05:30
Liyas Thomas
ac29f7eeb0 ⬆️ Bump start-server-and-test from 1.10.3 to 1.10.5 (#194)
⬆️ Bump start-server-and-test from 1.10.3 to 1.10.5

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-11 14:54:25 +05:30
Liyas Thomas
6de37b5ed9 ⬆️ Bump @nuxtjs/google-tag-manager from 2.2.1 to 2.3.0 (#193)
⬆️ Bump @nuxtjs/google-tag-manager from 2.2.1 to 2.3.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-11 14:46:39 +05:30
Liyas Thomas
35163086f9 ⬆️ Bump nuxt from 2.10.0 to 2.10.1 (#192)
⬆️ Bump nuxt from 2.10.0 to 2.10.1

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-11 14:41:15 +05:30
Liyas Thomas
14ce62ed50 ⬆️ Bump yargs-parser from 14.0.0 to 15.0.0 (#191)
⬆️ Bump yargs-parser from 14.0.0 to 15.0.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-10-11 14:40:00 +05:30
dependabot-preview[bot]
81736b77a3 ⬆️ Bump start-server-and-test from 1.10.3 to 1.10.5
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.3 to 1.10.5.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.3...v1.10.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-11 09:07:11 +00:00
dependabot-preview[bot]
26bb639b67 ⬆️ Bump @nuxtjs/google-tag-manager from 2.2.1 to 2.3.0
Bumps [@nuxtjs/google-tag-manager](https://github.com/nuxt-community/modules) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/nuxt-community/modules/releases)
- [Commits](https://github.com/nuxt-community/modules/compare/@nuxtjs/google-tag-manager@2.2.1...@nuxtjs/google-tag-manager@2.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-11 09:06:28 +00:00
dependabot-preview[bot]
d56401c347 ⬆️ Bump nuxt from 2.10.0 to 2.10.1
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/nuxt/nuxt.js/releases)
- [Changelog](https://github.com/nuxt/nuxt.js/blob/dev/RELEASE_PLAN.md)
- [Commits](https://github.com/nuxt/nuxt.js/compare/v2.10.0...v2.10.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-11 09:05:49 +00:00
dependabot-preview[bot]
1213cf3140 ⬆️ Bump yargs-parser from 14.0.0 to 15.0.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 14.0.0 to 15.0.0.
- [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/v14.0.0...v15.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-11 09:04:51 +00:00
Liyas Thomas
e70e448b77 Added 'Loding indicator' 2019-10-11 14:23:07 +05:30
Liyas Thomas
f0bff83fa0 Better monospace font 2019-10-09 15:42:15 +05:30
liyasthomas
249af016a0 Added label to request and History. Fixes #133 2019-10-07 21:21:48 +05:30
Liyas Thomas
c8a480b0e3 Add Request name label for every requests (#184)
Add Request name label for every requests

Co-authored-by: Gopishankar Haridas <gopih@thoughtworks.com>
2019-10-07 16:18:26 +05:30
Gopishankar Haridas
ccd96e67b1 🔥 Removing unwanted code 2019-10-07 13:21:22 +05:30
liyasthomas
9317b5b983 🎨 Minor UI updates 2019-10-06 07:46:48 +05:30
Liyas Thomas
11e6a8838c Add basic e2e tests (#181)
Add basic e2e tests
2019-10-06 05:46:14 +05:30
Liyas Thomas
82ad9cbf5e 💄 Minor stylings 2019-10-05 14:57:24 +05:30
Liyas Thomas
21386b924e Add quotation marks for generated code (#187)
Add quotation marks for generated code
2019-10-05 12:24:23 +05:30
John
87087c7eac Add quotation marks to fetch url 2019-10-04 21:25:39 -07:00
John
8ccbe56282 Add quotation marks to XHR method, url 2019-10-04 21:21:15 -07:00
Liyas Thomas
6e5e974767 ✏️ Updated links 2019-10-05 08:20:21 +05:30
Liyas Thomas
7c0987dc88 Merge pull request #185 from AndrewBastin/master
Added auto theme
2019-10-05 07:11:31 +05:30
Andrew Bastin
2f16882c1b Added auto theme 2019-10-04 19:38:20 -04:00
Gopishankar Haridas
0377232e1e Reverting code changes which are introduced accidentally 2019-10-04 14:41:08 +05:30
Gopishankar Haridas
51dd5c5900 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-10-04 14:29:41 +05:30
Gopishankar Haridas
4f75e5d631 Added label field for requests 2019-10-04 14:29:13 +05:30
Liyas Thomas
3d116decbe updated threshold and rootMargin for IntersectionObserver (#182)
updated threshold and rootMargin for IntersectionObserver
2019-10-04 10:27:16 +05:30
Edison Augusthy
12317d9649 updated threshold and rootMargin for IntersectionObserver
added updated threshold and rootMargin for IntersectionObserver to avoid the flickering issue in mobile devices
2019-10-04 10:12:21 +05:30
yubathom
ade7733d47 Add e2e tests 2019-10-03 21:47:41 -03:00
Liyas Thomas
3ad814ebb7 Merge pull request #179 from liyasthomas/dependabot/npm_and_yarn/nuxt-2.10.0
⬆️ Bump nuxt from 2.9.2 to 2.10.0
2019-10-04 05:12:38 +05:30
dependabot-preview[bot]
f5798438ac ⬆️ Bump nuxt from 2.9.2 to 2.10.0
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.9.2 to 2.10.0.
- [Release notes](https://github.com/nuxt/nuxt.js/releases)
- [Changelog](https://github.com/nuxt/nuxt.js/blob/dev/RELEASE_PLAN.md)
- [Commits](https://github.com/nuxt/nuxt.js/compare/v2.9.2...v2.10.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-10-03 23:30:46 +00:00
Liyas Thomas
cf21a20f05 💚 Fixing CI build 2019-10-03 15:40:29 +05:30
Liyas Thomas
13784db34d 💚 Fixing CI build 2019-10-03 15:31:16 +05:30
Liyas Thomas
2fced1dd60 💚 Fixing CI build 2019-10-03 15:28:45 +05:30
Liyas Thomas
c54b019d55 🔥 Firebase Hosting 2019-10-03 15:16:39 +05:30
Liyas Thomas
fe1034ce1a 📦 Meta 2019-10-02 16:17:29 +05:30
Liyas Thomas
2068556ca5 🐛 Fixed sitemap configuration (#177)
🐛 Fixed sitemap configuration
2019-10-02 13:02:15 +05:30
Nicolas PENNEC
55d1283320 🐛 Fixed sitemap configuration
hostname is mandatory on spa mode
2019-10-02 09:10:47 +02:00
Liyas Thomas
65aeddd717 📦 Added sitemap 2019-10-02 10:24:33 +05:30
Liyas Thomas
6e24ee30e1 🐛 Fixed invalid env variable 2019-10-02 10:10:19 +05:30
Liyas Thomas
42394c9c56 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-10-02 08:41:55 +05:30
Keith Holliday
e5b72c7072 Initial collections 2019-10-01 16:20:23 -06:00
Liyas Thomas
befb151ea4 GA_ID moved to env 2019-10-01 17:13:23 +05:30
Liyas Thomas
efbe5f946e Code Refactoring (#173)
Code Refactoring
2019-10-01 13:17:39 +05:30
Liyas Thomas
c994b7232a Merge pull request #172 from AndrewBastin/master
Added Black Theme
2019-10-01 03:47:23 +05:30
Andrew Bastin
6008e3da03 Added Black Theme 2019-09-30 16:21:30 -04:00
Edison Augusthy
2d321bc27d Code Refactoring
Removed multiple else if with Switch, for better readability and perfomance
2019-09-30 11:29:58 +05:30
liyasthomas
0afd0205ed Theme color 2019-09-29 21:22:39 +05:30
Liyas Thomas
78aae759e4 Merge pull request #171 from liyasthomas/nuxt-new-pwa-config
Update PWA configuration
2019-09-29 20:57:09 +05:30
John Harker
b6b3216f55 Update PWA configuration 2019-09-29 14:21:43 +01:00
liyasthomas
bb671547d6 ✏️ Meta 2019-09-28 15:22:16 +05:30
liyasthomas
b561f6c8ae ✏️ Meta 2019-09-28 15:03:16 +05:30
liyasthomas
bc2a723e80 ✏️ Meta 2019-09-27 23:33:12 +05:30
liyasthomas
b506e45bee ✏️ Meta 2019-09-27 23:23:09 +05:30
liyasthomas
7df140d226 ✏️ Meta 2019-09-27 23:00:23 +05:30
liyasthomas
271008d748 ✏️ Meta 2019-09-27 22:59:21 +05:30
Liyas Thomas
d5759286fa Merge pull request #170 from opencollective/opencollective
Activating Open Collective
2019-09-27 22:40:04 +05:30
Liyas Thomas
7fc58666ad Merge pull request #169 from liyasthomas/feature/docker-compose
Feature/docker compose
2019-09-27 18:41:49 +05:30
Jess
a95666ab1d Added financial contributors to the README 2019-09-27 05:36:57 -07:00
Nicholas Palenchar
be1d94909b add docker-compose development instructions 2019-09-27 08:24:03 -04:00
Nicholas Palenchar
a7442e9623 docker-compose for development 2019-09-27 08:06:51 -04:00
Liyas Thomas
abfaf24627 100/100 Lighthouse score 2019-09-27 14:44:15 +05:30
Liyas Thomas
a36b4207c8 🐳 Resolves #164 2019-09-27 09:06:50 +05:30
Liyas Thomas
13f6cfd601 🐳 Automated Builds using GitHub and Docker Hub 2019-09-26 17:10:31 +05:30
Liyas Thomas
75b69cad21 More toasts 2019-09-26 15:25:37 +05:30
Liyas Thomas
26326d8878 📸 Updated screenshots 2019-09-26 13:00:19 +05:30
Liyas Thomas
612b518198 ✏️ Meta 2019-09-26 12:05:51 +05:30
John Harker
6f04d9e8c0 Merge pull request #143 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/pwa-3.0.0-beta.19
⬆️ Bump @nuxtjs/pwa from 3.0.0-beta.16 to 3.0.0-beta.19
2019-09-25 15:36:29 +01:00
Liyas Thomas
940d2a8b45 💄 Updated inline SVGs to Material Icons 2019-09-25 17:13:42 +05:30
dependabot-preview[bot]
4c3a6c0952 ⬆️ Bump @nuxtjs/pwa from 3.0.0-beta.16 to 3.0.0-beta.19
Bumps [@nuxtjs/pwa](https://github.com/nuxt-community/pwa-module) from 3.0.0-beta.16 to 3.0.0-beta.19.
- [Release notes](https://github.com/nuxt-community/pwa-module/releases)
- [Changelog](https://github.com/nuxt-community/pwa-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/pwa-module/compare/v3.0.0-beta.16...v3.0.0-beta.19)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-25 09:17:13 +00:00
Liyas Thomas
e4381c974f 📦 Added toast, Material Icon font 2019-09-25 14:44:44 +05:30
Liyas Thomas
393a02f98b 🎨 Minor UI update 2019-09-25 10:40:36 +05:30
Liyas Thomas
855a3925fa 🐛 Fixed bug on request body 2019-09-25 10:20:08 +05:30
Liyas Thomas
14274b20fd 🐛 Fixed #166 2019-09-25 09:14:22 +05:30
Liyas Thomas
351e694448 💄 Better clear buttons 2019-09-25 08:57:04 +05:30
Liyas Thomas
dc3b069c23 Merge pull request #161 from nityanandagohain/master
clear buttons added
2019-09-25 08:23:12 +05:30
Liyas Thomas
60bae8253f Merge pull request #165 from jgroom33/feature/docker
add docker
2019-09-25 07:29:44 +05:30
Jeff Groom
30ad96322d add docker 2019-09-24 18:52:25 -06:00
Nityananda Gohain
079c84f2df header's fix 2019-09-24 18:02:21 +05:30
Nityananda Gohain
50badac708 clear buttons added for entire requests and for individual authentication, headers, parameters 2019-09-24 15:02:13 +05:30
Liyas Thomas
fdb9a351f4 Sync path and parameters (#156)
Sync path and parameters
2019-09-24 11:05:01 +05:30
Liyas Thomas
b106126565 Merge pull request #160 from AndrewBastin/master
Fixed bug where hal+json responses are not rendered properly
2019-09-24 04:38:14 +05:30
Andrew Bastin
51823b1a96 Fixed bug where hal+json responses are not rendered properly 2019-09-23 15:54:08 -04:00
Liyas Thomas
6d0c18fce3 Merge pull request #159 from jamesgeorge007/feat/minor-refactor
chore: minor code refactor
2019-09-24 00:24:54 +05:30
jamesgeorge007
51c500fd83 fix: typo 2019-09-24 00:12:24 +05:30
jamesgeorge007
9481587151 Minor stylistic update 2019-09-24 00:05:12 +05:30
jamesgeorge007
e6387c694e Use includes() to check for existence 2019-09-24 00:01:50 +05:30
jamesgeorge007
53f3af6944 Minor stylistic update 2019-09-24 00:00:44 +05:30
jamesgeorge007
901162c8b6 minor refactor 2019-09-23 23:59:24 +05:30
jamesgeorge007
13be809cfe minor refactor 2019-09-23 23:58:52 +05:30
jamesgeorge007
8857821716 minor refactor 2019-09-23 23:58:04 +05:30
jamesgeorge007
0c873a1c02 remove redundant wording 2019-09-23 23:54:24 +05:30
jamesgeorge007
74d2119f31 use a concise approach to fetch the last element 2019-09-23 23:50:16 +05:30
jamesgeorge007
20a8296cd5 avoid redundant checks 2019-09-23 23:45:18 +05:30
jamesgeorge007
f42e0329da use array destructuring approach 2019-09-23 23:42:07 +05:30
Hossein Nedaee
918ef57c78 Use url and querystring libraries to parse the url and query. 2019-09-23 00:54:02 +03:30
Hossein Nedaee
1b93ece0de Merge branch 'master' into sync-path-and-parameters 2019-09-23 00:47:36 +03:30
liyasthomas
4bb6981cbb Better icons, buttons & animations 2019-09-22 02:01:07 +05:30
Liyas Thomas
2878207170 ✏️ Added Discord to README
🐛 Fixed PWA button
2019-09-21 08:35:46 +05:30
Liyas Thomas
ad41d265b3 🐛 Fixed theme color 2019-09-20 18:41:35 +05:30
Liyas Thomas
df8d176a34 🎨 UI update, moved POST request parameter section to Request section 2019-09-20 18:34:42 +05:30
Liyas Thomas
e764df0687 Merge pull request #154 from neilveil/master
Post request headers issue resolved
2019-09-20 15:12:17 +05:30
Neil Arya
182590ef92 Post request headers issue resolved 2019-09-20 12:53:32 +05:30
Liyas Thomas
fdf0d63665 Merge pull request #153 from jamesgeorge007/patch-1
chore: minor code refactor
2019-09-18 15:39:30 +05:30
jamesgeorge007
3ecc170fd2 minor refactor 2019-09-18 15:18:25 +05:30
jamesgeorge007
d1a2786c7c refactor 2019-09-18 15:10:59 +05:30
James George
e4db91e35b fix typo 2019-09-18 14:40:27 +05:30
James George
b861c4a7b4 chore: minor code refactor 2019-09-18 14:32:54 +05:30
Liyas Thomas
ddb86da459 💄 Minor UI update 2019-09-18 14:25:17 +05:30
Liyas Thomas
ac36618de8 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-09-18 14:20:52 +05:30
Liyas Thomas
8dadec6220 ✏️ Added Telegram group link 2019-09-18 14:08:43 +05:30
Liyas Thomas
dd4402fca5 Merge pull request #152 from hosseinnedaee/sync-path-and-parameters
Sync path and parameters
2019-09-18 13:58:55 +05:30
Liyas Thomas
00e0e797b0 Added .htaccess file to static root directory 2019-09-18 12:44:18 +05:30
Liyas Thomas
5038551165 Merge pull request #146 from realabbas/master
.htaccess file added
2019-09-18 12:19:09 +05:30
Liyas Thomas
1d677a7ea5 Merge pull request #150 from nityanandagohain/master
sort functionality added in history
2019-09-18 09:29:45 +05:30
Hossein Nedaee
3781445e5d Clean code. 2019-09-18 02:10:12 +04:30
Nityananda Gohain
e1e060859b sort functionality added in history 2019-09-17 23:45:09 +05:30
Liyas Thomas
0cc59898b1 Better Tweet button 2019-09-17 18:26:54 +05:30
Liyas Thomas
1660373153 Added Tweet button, updated light theme 2019-09-17 17:04:39 +05:30
Liyas Thomas
a5b0626792 Improved Lighthouse score 2019-09-17 16:13:31 +05:30
Liyas Thomas
a0fa933430 Improving Lighthouse score 2019-09-17 15:25:32 +05:30
Liyas Thomas
43e8f31f6a Improving Lighthouse score 2019-09-17 14:01:41 +05:30
Liyas Thomas
42411038e4 🎨 Major UI update 2019-09-17 13:43:12 +05:30
Hossein Nedaee
164624786d Sync path and parameters. 2019-09-17 03:24:11 +04:30
Liyas Thomas
945da8bf92 Improving Lighthouse score 2019-09-16 18:27:07 +05:30
Liyas Thomas
95eb7b86c9 🐛 Fixed a typo which broke cURL import feature 2019-09-16 14:30:37 +05:30
Basil K
e34662baec 💄 Introducing tabs, minor UI changes 2019-09-16 13:50:28 +05:30
Liyas Thomas
d93c76373c ⬆️ Bump yargs-parser from 13.1.1 to 14.0.0 (#145)
⬆️ Bump yargs-parser from 13.1.1 to 14.0.0

Co-authored-by: null <27856297+dependabot-preview[bot]@users.noreply.github.com>
2019-09-16 11:22:58 +05:30
realabbas5
3fa9c22a04 .htaccess file added 2019-09-15 12:41:49 +05:30
realabbas5
2cde1a6e02 .htaccess file added 2019-09-15 12:37:00 +05:30
realabbas5
61b38b4405 .htaccess file added 2019-09-14 20:44:54 +05:30
dependabot-preview[bot]
5ed3650f7b ⬆️ Bump yargs-parser from 13.1.1 to 14.0.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 13.1.1 to 14.0.0.
- [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/v13.1.1...v14.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-14 00:17:42 +00:00
liyasthomas
b7ac58b31a 💄 Minor UI update 2019-09-13 23:17:34 +05:30
liyasthomas
c86d4e8060 💄 Minor UI update 2019-09-13 22:22:11 +05:30
Liyas Thomas
cb2240c71d Merge pull request #144 from nityanandagohain/master
added functionality to import data from curl post request
2019-09-13 12:15:16 +05:30
Nityananda Gohain
d4bffba010 Merge branch 'master' into master 2019-09-13 11:49:54 +05:30
Nityananda Gohain
aef118880a added functionality to import data from curl post request 2019-09-13 11:44:32 +05:30
Liyas Thomas
2f39f7f68b Added show/hide button for password input
 Updated vector icons
2019-09-13 10:32:49 +05:30
Liyas Thomas
d67e22e57b 🎨 minor UI tweaks 2019-09-12 17:47:13 +05:30
Liyas Thomas
96750cd04f ✏️ Updated collaborators 2019-09-12 16:55:41 +05:30
Liyas Thomas
5960aea37a 💄 Icon buttons 2019-09-12 16:39:59 +05:30
Liyas Thomas
a7b70cc947 🎨 Better icon buttons 2019-09-12 14:31:17 +05:30
Liyas Thomas
54d9897048 Added close button on modal 2019-09-12 11:19:16 +05:30
Jacob Anavisca
296f31e7a1 Fixes response bug 2019-09-11 23:34:50 -04:00
Jacob Anavisca
0ad76be012 Code highlighting (#142)
* Code highlight js

* Updated copyResponse
2019-09-11 06:59:33 -04:00
Liyas Thomas
d1b4d135c8 🎨 Minor UI improvements 2019-09-09 15:50:28 +05:30
Liyas Thomas
268748f85f 🚨 Removing linter warnings 2019-09-09 14:22:17 +05:30
Liyas Thomas
28068fb5d5 🐛 Fixing some ESLint 2019-09-09 12:42:31 +05:30
Liyas Thomas
c0c7036ada 🎨 Fixed some UI glitch 2019-09-09 11:27:00 +05:30
John Harker
68ce66e881 Merge pull request #138 from nityanandagohain/master
curl import added
2019-09-08 14:44:22 +01:00
Nityananda Gohain
9b010ee633 changed IMPORT to Import 2019-09-08 08:06:42 +05:30
Nityananda Gohain
8cf80c7bbf Merge remote-tracking branch 'origin/master' 2019-09-07 19:11:25 +05:30
Nityananda Gohain
1038b4b349 requested changes made: renamed to 'Import cURL' and moved the html code inside a pw-section 2019-09-07 19:10:22 +05:30
Nityananda Gohain
a993e21387 Merge branch 'master' into master 2019-09-06 16:28:00 +05:30
Nityananda Gohain
46ee372c0f small fixes 2019-09-06 16:20:28 +05:30
Nityananda Gohain
afd466b516 curl import added 2019-09-06 16:11:18 +05:30
liyasthomas
b6051d6fc2 🐛 all-contributors bot seems to be faulty. Updated README manually 2019-09-06 07:45:38 +05:30
liyasthomas
a23c3424ba ✏️ Project follows all-contributors 2019-09-06 07:04:14 +05:30
Liyas Thomas
5ae371db18 Merge pull request #137 from liyasthomas/all-contributors/add-NBTX
docs: add NBTX as a contributor

Co-authored-by: null <46447321+allcontributors[bot]@users.noreply.github.com>
2019-09-06 06:52:31 +05:30
allcontributors[bot]
0c255bae22 docs: create .all-contributorsrc 2019-09-06 01:20:08 +00:00
allcontributors[bot]
464d550f3b docs: update README.md 2019-09-06 01:20:07 +00:00
Thomas Yuba
c86dd978b5 Merge pull request #136 from yubathom/master
Update url at keyup and at bodyParam/rawParam toggle state changes
2019-09-05 16:35:46 -03:00
yubathom
8a4f9ed33e Update url at keyup at key-value params (bodyParams and headers) and bodyParam/rawParam at toggle state changes 2019-09-05 15:28:29 -03:00
Liyas Thomas
039fbcd809 🔍 Improving SEO 2019-09-05 20:29:16 +05:30
Liyas Thomas
7a8d629a81 Finalized share request URL 2019-09-05 17:16:13 +05:30
Liyas Thomas
0816fc6682 🐛 Fixed invinsible title 2019-09-05 17:09:03 +05:30
Liyas Thomas
163be1f1b5 Added date to shared request URL content 2019-09-05 17:00:30 +05:30
Liyas Thomas
f246df572b Append time of sharing with content 2019-09-05 16:42:08 +05:30
Liyas Thomas
a3463a6ac1 Added native share feature 2019-09-05 16:16:52 +05:30
Liyas Thomas
265ec57efe 🚀 Deployed to https://postwoman.io 2019-09-05 15:14:35 +05:30
Nicholas La Roux
c2b284175f Merge pull request #135 from larouxn/linkify_footer_content
Linkify footer version and commit sha
2019-09-05 18:36:56 +09:00
Liyas Thomas
c33d7e9ada ⚗️ Preparing for deployment 2019-09-05 14:53:54 +05:30
Liyas Thomas
755e758f75 🐛 Fixed favicon URL 2019-09-05 14:32:24 +05:30
Nicholas La Roux
5d1c13ce2b Linkify footer version and commit sha 2019-09-05 17:49:38 +09:00
RifqiAlAbqary
25bc37294b 📝 Updated readme with new UI screenshots 2019-09-05 10:35:28 +09:00
Liyas Thomas
ec7a45db92 🐛 Fixed default request body content type 2019-09-04 17:09:06 +05:30
Liyas Thomas
f2837b1b2d 🐛 Fixed a console warning 2019-09-04 16:29:09 +05:30
Liyas Thomas
e95a4a9782 State focus on input 2019-09-04 15:52:16 +05:30
Liyas Thomas
0a91fb66e3 ⚗️ Adjusted route 2019-09-04 14:11:55 +05:30
Liyas Thomas
5e71831019 ⚗️ Adjusted route 2019-09-04 14:05:10 +05:30
Liyas Thomas
e0d66a2346 ⚗️ Adjusted route 2019-09-04 13:57:12 +05:30
Liyas Thomas
5602d2fd62 🐛 Fixed start_url' 2019-09-04 12:19:17 +05:30
Liyas Thomas
6545a9343d Better button context 2019-09-04 10:35:11 +05:30
Liyas Thomas
0350355626 💄 Fixed light theme colors 2019-09-04 10:07:08 +05:30
Liyas Thomas
0aec1e1607 💄 Fixed default accent color 2019-09-04 09:44:16 +05:30
liyasthomas
077cb583b6 🎨 Updated color codes 2019-09-04 08:18:24 +05:30
liyasthomas
c62e368cee Updated features list 2019-09-04 07:35:47 +05:30
liyasthomas
cb1f366d35 Copy generated code to clipboard 2019-09-04 07:15:19 +05:30
Liyas Thomas
acba29add9 Merge pull request #132 from JacobAnavisca/copy-request
Copy requests

Co-authored-by: Jacob Anavisca <jacobanavisca@jacobs-imac.lan>
2019-09-04 05:55:31 +05:30
Jacob Anavisca
29b0f3b1bf Added request copying 2019-09-03 19:50:22 -04:00
Liyas Thomas
15c564fc61 Added prompt to copied button 2019-09-03 10:24:08 +05:30
liyasthomas
17639e94da 🎨 Minor UI update 2019-09-02 23:38:24 +05:30
Liyas Thomas
928545e7eb Added Copy Request URL button 2019-09-02 17:35:59 +05:30
Liyas Thomas
80a0669c69 🎨 Minor UI update 2019-09-02 17:08:59 +05:30
Liyas Thomas
7aee2f4211 🎨 Minor UI update 2019-09-02 16:32:29 +05:30
Liyas Thomas
a43ec422c0 Merge pull request #129 from NBTX/master
Fix "⌨️Add autocomplete widget with command line completion"
2019-09-02 16:14:30 +05:30
NBTX
4147bac094 Fix and Revert "Revert "⌨️Add autocomplete widget with command line completion""
This reverts commit dd5dfdbabd.
2019-09-02 11:27:24 +01:00
Liyas Thomas
16d9e1e34a 🎨 Minor UI update 2019-09-02 13:08:49 +05:30
Liyas Thomas
7645d0d2c9 🎨 Minor UI glitches fix 2019-09-02 10:18:01 +05:30
liyasthomas
db31dbeb0e Merge branch 'master' of https://github.com/liyasthomas/postwoman
Even
2019-09-02 07:58:16 +05:30
Liyas Thomas
a84eac06d3 Merge pull request #131 from yubathom/master
Bind raw body input to url of requests
2019-09-02 21:45:06 +05:30
yubathom
41e6f7d61e Bind raw body input to url of requests 2019-09-02 12:44:53 -03:00
liyasthomas
aa1d3c6943 🎨 New vector icon buttons 2019-09-02 07:58:03 +05:30
Liyas Thomas
f3fa8d4e73 Merge pull request #125 from NileshSP/defaultmenuoptionhighlight
update with PR for issue/bug #100
2019-09-02 05:17:33 +05:30
Liyas Thomas
55816acc99 Merge pull request #127 from guastallaigor/change-to-disable-click-clear-history
Clear history is now disabled when there aren't any histories
2019-09-02 05:01:44 +05:30
Igor Guastalla de Lima
8226d0a1ae Clear history is now disabled when there aren't any histories 2019-09-01 11:19:23 -03:00
Liyas Thomas
4d4a55cd3a Merge pull request #126 from liyasthomas/revert-123-master
Revert "⌨️Add autocomplete widget with command line completion"
2019-08-31 22:31:53 +05:30
Liyas Thomas
dd5dfdbabd Revert "⌨️Add autocomplete widget with command line completion" 2019-08-31 22:29:32 +05:30
Liyas Thomas
7c49f58565 Merge pull request #123 from NBTX/master
⌨️Add autocomplete widget with command line completion
2019-08-31 22:18:07 +05:30
NBTX
32218cff9f Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-31 17:07:55 +01:00
Liyas Thomas
0b5b342542 Merge pull request #118 from yubathom/master
Bind history state and query params of requests
2019-08-31 16:19:10 +05:30
yubathom
19a57e8ecf Spelling correction 2019-08-31 07:37:41 -03:00
yubathom
a696c33bca Bind history state and query params of requests 2019-08-31 07:37:41 -03:00
Liyas Thomas
b6a759ab29 Merge pull request #119 from liyasthomas/dependabot/npm_and_yarn/vuex-persist-2.1.0
Bump vuex-persist from 2.0.1 to 2.1.0
2019-08-31 07:46:48 +05:30
NBTX
a3acf34b39 Stringify request data - fixes https://github.com/liyasthomas/postwoman/issues/124 2019-08-31 03:07:07 +01:00
Nilesh P
3d1b4f0ee2 update for issue/bug #100 2019-08-30 22:01:47 -04:00
NBTX
aa1cb313b8 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-31 02:28:33 +01:00
John Harker
1c5ee17d00 Merge pull request #121 from NBTX/master
⚠️ Ensure build code doesn't fail if version can't be obtained from GitHub
2019-08-31 02:27:43 +01:00
John Harker
de3a409a1c 🏷️ Fix version number 2019-08-31 02:26:53 +01:00
NBTX
19a4156b1c ⌨️Add autocomplete widget with command line completion 2019-08-31 02:21:19 +01:00
dependabot-preview[bot]
aad76bc9d9 Bump vuex-persist from 2.0.1 to 2.1.0
Bumps [vuex-persist](https://github.com/championswimmer/vuex-persist) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/championswimmer/vuex-persist/releases)
- [Changelog](https://github.com/championswimmer/vuex-persist/blob/master/CHANGELOG.md)
- [Commits](https://github.com/championswimmer/vuex-persist/compare/v2.0.1...v2.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-31 01:17:55 +00:00
dependabot-preview[bot]
25f94341ad Merge pull request #120 from liyasthomas/dependabot/npm_and_yarn/nuxt-2.9.2 2019-08-31 01:15:50 +00:00
NBTX
cafead69f6 ⚠️ Ensure code doesn't fail if version can't be obtained from GitHub 2019-08-31 01:42:34 +01:00
dependabot-preview[bot]
a359ebae02 Bump nuxt from 2.9.1 to 2.9.2
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.9.1 to 2.9.2.
- [Release notes](https://github.com/nuxt/nuxt.js/releases)
- [Changelog](https://github.com/nuxt/nuxt.js/blob/dev/RELEASE_PLAN.md)
- [Commits](https://github.com/nuxt/nuxt.js/compare/v2.9.1...v2.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-31 00:14:43 +00:00
John Harker
c1abf5f07c Merge pull request #117 from NBTX/master
Add version number to footer and improves .editorconfig
2019-08-30 23:38:38 +01:00
Liyas Thomas
fc5d98c05c Merge pull request #116 from ahmedsayedabdelsalam/fix-styling
fix styling issue of send again button
2019-08-31 03:53:02 +05:30
NBTX
9eb9365c89 🏷️Adds automatically generated version information 2019-08-30 19:58:55 +01:00
Ahmed Sayed
be4cb4efc8 fix styling issue of send again button
the button appears below the response section when scrolling down.
2019-08-30 20:49:21 +02:00
NBTX
0c543908d3 Resolves liyasthomas#115 2019-08-30 18:42:49 +01:00
Liyas Thomas
3786ef90fe Merge pull request #114 from NBTX/master
😬 Actually send the request body
2019-08-30 22:49:16 +05:30
NBTX
6ca847bdde 😬 Actually send the request body 2019-08-30 18:14:25 +01:00
Liyas Thomas
bc43291a0c Merge pull request #111 from izerozlu/auto-resize-textareas
Auto resize textareas
2019-08-30 20:26:17 +05:30
izerozlu
3b285f088f textareaAutoResize directive added and applied to textareas. 2019-08-30 17:40:39 +03:00
izerozlu
9e26882b5f Merge remote-tracking branch 'upstream/master' into auto-resize-textareas 2019-08-30 17:39:48 +03:00
Liyas Thomas
a038b59ef4 Merge pull request #110 from izerozlu/sticky-send-button-fix
Sticky send button fix enhanced
2019-08-30 19:28:45 +05:30
izerozlu
ad073427b3 Sticky button fix for firefox. 2019-08-30 16:49:05 +03:00
izerozlu
6bceab7488 Merge remote-tracking branch 'upstream/master' 2019-08-30 16:41:12 +03:00
izerozlu
3d617811b5 Merge pull request #109 from guastallaigor/fix-intersection-button-send
Works in chrome. Ok for now but needs checks and improvements on other browsers, eg. Firefox.
2019-08-30 16:40:16 +03:00
Igor Guastalla de Lima
daa491cd17 Change again the way of showing by adding and clearing the className 2019-08-30 09:36:16 -03:00
Igor Guastalla de Lima
4b4e6ca31a Fix intersection button send again (removed validation inside forEach) 2019-08-30 09:11:30 -03:00
Igor Guastalla de Lima
0c9977a92a Merge remote-tracking branch 'liyasthomas/master' 2019-08-30 08:56:14 -03:00
Liyas Thomas
8d90875e18 Merge pull request #108
History fieldset height problem on mobile.
2019-08-30 16:30:52 +05:30
Liyas Thomas
09872f6b26 Merge pull request #107 from izerozlu/sticky-send-button
Sticky send button
2019-08-30 16:24:42 +05:30
izerozlu
6f0698bae2 Bug, on mobile screens too short history section, fixed. 2019-08-30 13:32:17 +03:00
izerozlu
414d24262b Merge remote-tracking branch 'upstream/master' 2019-08-30 13:14:15 +03:00
izerozlu
e424128a60 Request button made to be sticky upon scroll. 2019-08-30 13:13:58 +03:00
izerozlu
23ca857154 Merge remote-tracking branch 'upstream/master' into sticky-send-button 2019-08-30 13:11:14 +03:00
Liyas Thomas
542b912090 Added 'Not found' prompt for empty filtered history 2019-08-30 15:37:51 +05:30
izerozlu
7750a7bd58 Merge remote-tracking branch 'upstream/master' into sticky-send-button 2019-08-30 11:34:55 +03:00
Liyas Thomas
2514a60fb3 Merge pull request #106 from izerozlu/history-fieldset-filtering
History component added
2019-08-30 14:03:14 +05:30
izerozlu
8c8d4a129e History filtering added, added confirm mechanism for clearing history. 2019-08-30 10:57:46 +03:00
izerozlu
a3f8abba1a Bug : not adding to history and a failed request, fixed. 2019-08-30 09:56:52 +03:00
izerozlu
e0dc8ea46d History component added. 2019-08-30 09:52:10 +03:00
izerozlu
bc91487388 Merge remote-tracking branch 'upstream/master' 2019-08-30 09:04:23 +03:00
Liyas Thomas
cc971e7e6d Merge pull request #72 from yubathom/master
Enable shareable requests with parameters in url queries
2019-08-30 07:26:21 +05:30
Liyas Thomas
f485af3e21 Merge pull request #96 from NBTX/master
Use axios for requests, UI tweaks, and more...
2019-08-30 06:50:57 +05:30
NBTX
edc8259b6f Change request library to axios. Resolves https://github.com/liyasthomas/postwoman/issues/61 2019-08-30 01:05:40 +01:00
NBTX
ca568cd3eb UI tweaks, finish proxy settings input 2019-08-29 23:58:10 +01:00
NBTX
bac9dd1eec Add toggle switch 2019-08-29 22:55:06 +01:00
NBTX
bb76c6c3da Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-29 22:15:15 +01:00
yubathom
d71a4ba0bb Enable shareable requests with preseted attributes in url queries 2019-08-29 12:13:42 -03:00
Liyas Thomas
4237dfc9d1 🐛 Fixes #81
 Added Local Date to history entry and will be shown on hovering timestamp
2019-08-29 17:19:45 +05:30
Liyas Thomas
dc6ac391d7 ✏️ Updated methods list 2019-08-29 12:14:11 +05:30
Liyas Thomas
d96b734639 Added HEAD and PATCH methods 2019-08-29 11:25:56 +05:30
Liyas Thomas
4796fe4024 Merge pull request #89 from pmankar/master
Websocket log auto scroll to bottom
2019-08-29 08:03:01 +05:30
pmankar
f37aedc3b2 indent correction 2019-08-29 01:53:27 +02:00
pmankar
5ec993f9f4 GitHub Logo on theme background change
the contrast is improved while the theme is switched.
Handled the case if there is no storage value for the selected class.
2019-08-29 01:51:47 +02:00
pmankar
11791deec5 Websocket log auto scroll to bottom
also added timestamp in the log
2019-08-29 01:20:20 +02:00
Liyas Thomas
0861a7f303 Merge pull request #86 from pkfrank/patch-1
Fix typo "CUP" to "CPU" in readme
2019-08-28 21:04:29 +05:30
Peter Frank
dac6862b31 Fix typo "CUP" to "CUP" in readme
Just fixing a single typo, as I assume the sentence should read:
>  Low RAM/memory and CPU usage
2019-08-28 10:45:14 -04:00
Liyas Thomas
51bde261e5 Merge pull request #85 from liyasthomas/revert-80-master
Revert "Readable GitHub logo"
2019-08-28 19:52:33 +05:30
Liyas Thomas
7c9188ed03 Revert "Readable GitHub logo" 2019-08-28 19:50:59 +05:30
Liyas Thomas
090f72eedb Merge pull request #80 from pmankar/master
Readable GitHub logo
2019-08-28 19:02:03 +05:30
Pratik
780c35e804 removed .vs index. 2019-08-28 14:59:12 +02:00
Pratik
f037a0eb17 updated for Visual Studio 2019-08-28 14:56:32 +02:00
Pratik
834850fd98 Resolution of
9868a7d31e (r318532213)
2019-08-28 14:40:57 +02:00
Pratik
e632b04b16 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-28 14:37:08 +02:00
Liyas Thomas
a7058a9e05 Merge pull request #82 from sfrankian/add-editorconfig
Add editorconfig
2019-08-28 18:06:20 +05:30
Stephanie Frankian
6bf8a6cbb3 Fix typo. 2019-08-28 08:18:56 -04:00
Liyas Thomas
acedaf27d9 🎨 Fixed minor UI glitch 2019-08-28 17:15:11 +05:30
Pratik
9868a7d31e Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-28 13:22:32 +02:00
Liyas Thomas
af51c48ede Merge pull request #79 from izerozlu/history-fieldset-virtualscroll
Virtual scroll addition for history section.
2019-08-28 16:42:50 +05:30
Pratik
b5f812512f GitHub logo in footer updates as per theme background. 2019-08-28 13:07:45 +02:00
izerozlu
df2ceb3fe9 Virtual scrolling added for history section. 2019-08-28 13:35:14 +03:00
izerozlu
b1588d4553 Merge remote-tracking branch 'upstream/master' into history-fieldset-virtualscroll
# Conflicts:
#	pages/index.vue
2019-08-28 12:48:31 +03:00
Liyas Thomas
f004a9c322 ✏️ Updated features list and added 'Story behind Postwoman' 2019-08-28 14:27:42 +05:30
Liyas Thomas
1652381444 🎨 Styled input checkbox 2019-08-28 10:47:31 +05:30
Liyas Thomas
ae2d996754 🎨 Fixed few UI glitches 2019-08-28 10:02:40 +05:30
Liyas Thomas
0a4839eaf7 Merge pull request #75 from nickpalenchar/master
fixes #74 fallback for findEntryStatus when match is missing or other…
2019-08-28 06:57:47 +05:30
NBTX
85d51b2362 Add proxy settings. 2019-08-28 02:24:49 +01:00
Nicholas Palenchar
1a38f519f4 fixes #74 fallback for findEntryStatus when match is missing or otherwise invalid 2019-08-27 21:01:01 -04:00
Liyas Thomas
7bd87c4113 Merge pull request #73 from NBTX/master
Adds HTML preview.
2019-08-28 06:11:04 +05:30
NBTX
38f6f4ef2e Close preview when a new request is made 2019-08-28 01:32:37 +01:00
NBTX
8912004dcc Adds HTML preview, solves https://github.com/liyasthomas/postwoman/issues/41 2019-08-28 01:10:00 +01:00
Stephanie Frankian
be044dbcce Remove .editorconfig from gitignore 2019-08-27 17:45:15 -04:00
Stephanie Frankian
2d89b6fc27 Initialize .editorconfig 2019-08-27 17:45:00 -04:00
Liyas Thomas
f265046676 🚨 Lint 2019-08-27 17:22:24 +05:30
izerozlu
515ea7e83d Virtual List added for history section. 2019-08-27 13:33:31 +03:00
Liyas Thomas
36a07290f2 ✏️ Typo 2019-08-27 13:04:06 +05:30
Liyas Thomas
0d0ec37edf ✏️ Updated features 2019-08-27 13:02:44 +05:30
Liyas Thomas
66268b194c 💄 Minor UI update 2019-08-27 10:18:41 +05:30
Liyas Thomas
0377013d47 Merge pull request #68 from JacobAnavisca/request-headers
Request headers

Co-authored-by: Jacob Anavisca <jacobanavisca@jacobs-imac.lan>
2019-08-27 09:54:13 +05:30
Jacob Anavisca
30a42907b5 Removing test option 2019-08-27 00:09:40 -04:00
Jacob Anavisca
52431e67a4 Added support for headers 2019-08-27 00:07:41 -04:00
izerozlu
dabb7c370a Virtualscroll added for the history fieldset. 2019-08-26 19:09:09 +03:00
izerozlu
71393a3cf7 Merge remote-tracking branch 'upstream/master' 2019-08-26 19:07:16 +03:00
Liyas Thomas
c31a758435 Merge pull request #67
Last entry bug fixed.
2019-08-26 21:21:59 +05:30
izerozlu
0411b205ff Not saving last entry bug fixed. 2019-08-26 18:29:14 +03:00
izerozlu
8a754a5c89 Merge branch 'master' into history-fieldset-entry-status-colors 2019-08-26 18:27:19 +03:00
izerozlu
accc439d75 Merge remote-tracking branch 'upstream/master' 2019-08-26 18:25:53 +03:00
Liyas Thomas
271bd06176 Merge pull request #59 from izerozlu/history-fieldset-entry-status-colors
Status code colors added for history entries.

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2019-08-26 16:16:32 +05:30
Liyas Thomas
872d2c09cd Merge branch 'master' into history-fieldset-entry-status-colors 2019-08-26 16:13:47 +05:30
Liyas Thomas
b4bc7cb709 🔍 Added meta keywords, updated CI deployment link 2019-08-26 15:25:11 +05:30
Liyas Thomas
e1889c1db0 🎨 Updated status color codes 2019-08-26 14:37:02 +05:30
Liyas Thomas
997c095f35 Merge pull request #64 from edisonaugusthy/master
Added Copy response Button
2019-08-26 13:55:30 +05:30
Edison Augusthy
6f7fd2fc7b Update index.vue 2019-08-26 12:08:01 +05:30
Edison Augusthy
2b1a73e04d Merge branch 'master' into master 2019-08-26 12:04:08 +05:30
Liyas Thomas
8403b9c409 ✏️ Updated contributors list 2019-08-26 11:51:47 +05:30
Edison Augusthy
40c27f5139 Button css changes 2019-08-26 11:49:23 +05:30
Edison Augusthy
6bed41b8c1 response copy Script Changes 2019-08-26 11:48:36 +05:30
Edison Augusthy
3cd8d94ceb added Copy Response button 2019-08-26 11:46:18 +05:30
Liyas Thomas
c23fb7bfb2 Merge pull request #63 from nickpalenchar/feature/raw-input
Feature/raw input
2019-08-26 11:29:58 +05:30
Nick Palenchar
54876e6db3 ohter updates that didn't get included 2019-08-25 17:20:14 -04:00
Nick Palenchar
b46b2c1e8e Update index.vue
remove stubborn debugger statement
2019-08-25 17:16:13 -04:00
Nicholas Palenchar
bfffdbc4d8 closes #36 raw body option 2019-08-25 17:10:17 -04:00
Nicholas Palenchar
fddd41f6b4 wip - some raw text formtting with one small return bug to fix 2019-08-25 14:41:34 -04:00
Nicholas Palenchar
8759b245ea wip - basic functionality achieved 2019-08-25 11:53:23 -04:00
izerozlu
1a89a1b5f5 Entry status color added. 2019-08-25 11:37:21 +03:00
Liyas Thomas
f80a0cbd07 Fixing CI build errors 2019-08-25 14:03:15 +05:30
izerozlu
9da753b915 Merge remote-tracking branch 'upstream/master' 2019-08-25 10:49:12 +03:00
Liyas Thomas
5a8c9f5533 ⚗️ Typo 2019-08-25 11:26:55 +05:30
Liyas Thomas
8a6ec093d3 Merge pull request #55 from NBTX/master
🎨 Add theme support (and settings storage)
2019-08-25 07:27:33 +05:30
NBTX
bd434ff285 Improve URL validation check. (See https://github.com/liyasthomas/postwoman/issues/56) 2019-08-25 02:41:30 +01:00
NBTX
0571ec723d Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-25 02:28:21 +01:00
Liyas Thomas
7545c83547 Merge pull request #52 from izerozlu/colored-resonse-codes
Response status colors added.
2019-08-25 05:43:18 +05:30
NBTX
d66fadecda Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-25 01:02:12 +01:00
NBTX
4d238b8ac6 Merge branch 'master' of github.com:NBTX/postwoman-vue 2019-08-25 00:50:23 +01:00
NBTX
02ef69f0f7 🎨 Add theme support
- Move root (var) style properties to `/assets/css/themes.scss`
- Improve mobile navigation
- Create section component for the collapsable sections.
- Create logo component, so color can be changed.

- Add settings page
- Add option to select theme color
- Add option to select theme background
- Add option to enable/disable multi-colored frames.

- Add settings to VueX Store
- Persist VueX store in LocalStorage.
2019-08-25 00:42:41 +01:00
izerozlu
5584928489 Response status colors added. 2019-08-24 22:40:47 +03:00
NBTX
67f0600702 Improve mobile navigation 2019-08-24 19:35:39 +01:00
Liyas Thomas
3d9b3099f2 Merge pull request #51 from liyasthomas/migrate-nuxt
Migrate nuxt
2019-08-24 23:30:53 +05:30
Liyas Thomas
c11d56279f Merge pull request #48 from NBTX/feat/websocket
🔌 Add websocket support
2019-08-24 23:25:44 +05:30
John Harker
37ed800d6a Merge pull request #1 from NBTX/feat/websocket
🔌 Add websocket page
2019-08-24 18:28:51 +01:00
NBTX
35d7e1b32e 🔌 Add websocket page 2019-08-24 18:26:49 +01:00
Liyas Thomas
5a6a14d1f3 Merge pull request #49 from NBTX/master
Fix GitHub Pages deployment
2019-08-24 22:53:21 +05:30
NBTX
8d35e7d3bd Fix reload button 2019-08-24 18:16:52 +01:00
NBTX
b678d848db Merge branch 'master' of https://github.com/liyasthomas/postwoman 2019-08-24 18:04:04 +01:00
NBTX
d86b2c410f Tidy up paths 2019-08-24 18:01:57 +01:00
Liyas Thomas
45bf7a234f Merge pull request #50 from liyasthomas/revert-47-revert-44-master
Revert "Revert "Migrate Postwoman to Nuxt.js (full Vue and SCSS support)""
2019-08-24 22:13:50 +05:30
Liyas Thomas
b027eeb846 Revert "Revert "Migrate Postwoman to Nuxt.js (full Vue and SCSS support)"" 2019-08-24 22:09:29 +05:30
NBTX
424df8c1ae Fix icon locations 2019-08-24 17:27:46 +01:00
NBTX
d095b355cc Remove unnecessary envs (for some reason, they create extra build stages) 2019-08-24 17:21:53 +01:00
NBTX
70126748fd Set up travis for GitHub Pages deployment 2019-08-24 17:20:19 +01:00
NBTX
835e030c65 🔌 Add websocket page 2019-08-24 16:25:59 +01:00
Liyas Thomas
dbcd7442fe Merge pull request #47 from larouxn/revert-44-master
Revert "Migrate Postwoman to Nuxt.js (full Vue and SCSS support)"
2019-08-24 20:13:06 +05:30
Nicholas La Roux
746361d495 Revert "Update .travis.yml"
This reverts commit aae579c650.
2019-08-24 23:35:21 +09:00
Nicholas La Roux
8fd43e8cff Revert "Migrate Postwoman to Nuxt.js (full Vue and SCSS support)" 2019-08-24 23:35:10 +09:00
Liyas Thomas
8198872972 Update .travis.yml 2019-08-24 19:57:49 +05:30
Liyas Thomas
aae579c650 Update .travis.yml 2019-08-24 19:06:36 +05:30
Liyas Thomas
43c2bdf777 Merge pull request #44 from NBTX/master
Migrate Postwoman to Nuxt.js (full Vue and SCSS support)
2019-08-24 18:38:25 +05:30
NBTX
b7172da209 Fix PWA install button 2019-08-24 13:59:41 +01:00
NBTX
575f8335d6 📝 Ensure 404.html is generated by Nuxt. 2019-08-24 04:24:43 +01:00
NBTX
a27be71b13 👽 Vue-ify Postwoman with Nuxt.js! 2019-08-24 04:09:22 +01:00
NBTX
677bb041e9 🔧 Add gitignore entries for webstorm 2019-08-24 01:31:07 +01:00
Liyas Thomas
190ae5a0bc Merge pull request #39 from larouxn/add_dependabot
Add Dependabot config
2019-08-23 19:23:25 +05:30
Nicholas La Roux
bec12cdd55 Add Dependabot config 2019-08-23 22:40:45 +09:00
Liyas Thomas
1c8406ce3c 🎨 Styled scrollbars 2019-08-23 16:12:33 +05:30
Liyas Thomas
eb69ddfef9 Better error messages, updated sample test API 2019-08-23 16:03:39 +05:30
Liyas Thomas
06db7c0641 🔥 Updated icons 2019-08-23 14:36:57 +05:30
Liyas Thomas
542cfdf47d 💲 Updated sponsor/funding URLs 2019-08-23 13:59:10 +05:30
Liyas Thomas
07b8e8fcf7 💲 Updated sponsor/funding URLs 2019-08-23 13:23:09 +05:30
Liyas Thomas
f3640446d2 💲 Updated sponsor/funding URLs 2019-08-23 13:14:15 +05:30
Liyas Thomas
0e74687910 💲 Updated sponsor/funding URLs 2019-08-23 13:10:11 +05:30
Liyas Thomas
417aeff21d Merge pull request #28 from reefqi037/add-bearer-token-auth
Added token based authentication type

Co-authored-by: rifqi <rifqi.alabqary@gmail.com>
2019-08-23 12:57:54 +05:30
Liyas Thomas
46bc7d206d 🐛 Fixed broken links 2019-08-23 12:07:23 +05:30
rifqi
3c4cb60cda Added token based authentication type
User can choose Bearer Token authentication type to access apis protected with access/id token.
2019-08-23 15:34:40 +09:00
Liyas Thomas
f05a61e8a8 Fixed 404 page 2019-08-23 11:44:37 +05:30
Liyas Thomas
181bc0c189 🔍 Improving SEO 2019-08-23 11:36:04 +05:30
Liyas Thomas
452c4ac89e Open GitHub link in a new tab 2019-08-23 11:17:24 +05:30
Liyas Thomas
8164e9712b Merge pull request #24 from AndrewBastin/master
Added Clear History button

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2019-08-23 10:57:54 +05:30
Liyas Thomas
a2c9fdb715 Merge branch 'master' into master 2019-08-23 10:56:22 +05:30
Liyas Thomas
5c9b8addf3 On clicking use button from history, view will scroll to request section, moved history section below response section 2019-08-23 10:49:35 +05:30
Andrew Bastin
e6f6c17c80 Clear History button will look disabled when there is no history 2019-08-23 10:49:17 +05:30
Andrew Bastin
b8f9f23684 Added a Clear History button 2019-08-23 10:48:27 +05:30
Liyas Thomas
8f03f709fb Merge pull request #23 from reefqi037/add-enter-key-function
Add send request on Enter Key press. 

Co-authored-by: rifqi <rifqi.alabqary@gmail.com>
2019-08-23 10:30:05 +05:30
rifqi
6616f835af Update index.html
Added send request on Enter Key press.
2019-08-23 13:48:05 +09:00
liyasthomas
a7c29e4016 ✏️ Added contributors 2019-08-23 09:34:48 +05:30
Liyas Thomas
5adbd9519b Merge pull request #22 from abraham/patch-1
start_url should be project directory
2019-08-23 09:27:30 +05:30
Abraham Williams
d785f169c6 start_url should be project directory 2019-08-22 22:47:46 -05:00
Liyas Thomas
81252fd8bd Merge pull request #21 from brandonhawi/master
Update
2019-08-23 09:06:08 +05:30
Brandon Hawi
02b80c2c6a Revert "Pull most recent changes" 2019-08-22 20:08:17 -07:00
Brandon Hawi
7080ce72f6 Merge pull request #1 from liyasthomas/master
Pull most recent changes
2019-08-22 20:07:47 -07:00
Liyas Thomas
133fdf03db Merge pull request #20 from NileshSP/pwainstallissue
fix for pwa install issue
2019-08-23 06:20:31 +05:30
Nilesh Patel
8511821160 fix for pwa install issue 2019-08-22 18:25:10 -04:00
Liyas Thomas
0c78f29907 Merge pull request #15 from abraham/catch
Display error message
2019-08-23 02:09:27 +05:30
Abraham Williams
cd10b56aa6 Display error message 2019-08-22 15:34:17 -05:00
Liyas Thomas
0531d0699a Merge pull request #14 from abraham/cache
Disable dev server cache
2019-08-23 02:01:01 +05:30
Abraham Williams
07dce5d474 Disable dev server cache 2019-08-22 15:27:46 -05:00
Liyas Thomas
bce85b6e45 Merge pull request #13 from abraham/start
Add npm start script and development instructions
2019-08-23 01:51:39 +05:30
Abraham Williams
f551b2c810 Add npm start script and development instructions 2019-08-22 15:13:12 -05:00
Liyas Thomas
d2a1d7df44 Merge pull request #9 from chrispiccaro18/misspellings
fixed spelling of at least
2019-08-23 00:40:51 +05:30
chrispiccaro
df090d7970 fixed spelling of at least 2019-08-22 11:53:17 -07:00
liyasthomas
dc278cc0e5 🐛 Squashed a minor bug in URL validation 2019-08-22 21:53:18 +05:30
liyasthomas
cdea0ff01b 🎨 Updated color codes 2019-08-22 21:23:08 +05:30
Liyas Thomas
1a02837ada Merge pull request #7 from AndrewBastin/master
Added validation for URL
2019-08-22 21:10:58 +05:30
Andrew Bastin
a59aba453f Added validation for URL 2019-08-22 20:11:08 +05:30
liyasthomas
29f3ac9645 🐛 Removed history index 2019-08-22 19:27:01 +05:30
Liyas Thomas
7c677f0fa1 Merge pull request #6 from AndrewBastin/master
History is sorted from latest to oldest
2019-08-22 19:16:08 +05:30
Andrew Bastin
362ab73026 History is sorted from latest to oldest 2019-08-22 19:09:03 +05:30
liyasthomas
fcdaf64268 ✏️ Fixed bad unicode for up and down arrow symbol 2019-08-22 18:41:33 +05:30
liyasthomas
fd4dcad80c 📝 Typo 2019-08-22 18:34:31 +05:30
liyasthomas
3e3fd327d1 Merge branch 'master' of https://github.com/liyasthomas/postwoman
Even
2019-08-22 18:29:06 +05:30
liyasthomas
2e194361b3 Used short hand to fetch time 2019-08-22 18:28:58 +05:30
Liyas Thomas
92a852d28f Merge pull request #3 from AndrewBastin/master
History is persisted in local storage
2019-08-22 18:27:28 +05:30
liyasthomas
f548f410b9 ✏️ Typo 2019-08-22 17:46:17 +05:30
Andrew Bastin
07f5b57f4c History is persisted in local storage 2019-08-22 17:13:09 +05:30
liyasthomas
2c792975e0 Added index number on history entries 2019-08-22 16:41:27 +05:30
Liyas Thomas
0c771ca506 Merge pull request #1 from AndrewBastin/master
Response section expands if hidden when sending a request

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2019-08-22 16:03:45 +05:30
Liyas Thomas
1ab691108e Merge branch 'master' into master 2019-08-22 15:54:03 +05:30
liyasthomas
f0962e112a Added History support 2019-08-22 15:45:27 +05:30
Andrew Bastin
819e8bfecf Removed the unwanted logging 2019-08-22 15:15:57 +05:30
Andrew Bastin
d403bebfa0 Response section expands if hidden when sending a request 2019-08-22 15:13:16 +05:30
liyasthomas
a3ed07b3dc 💲 Added sponsor button 2019-08-22 14:32:40 +05:30
liyasthomas
99e57ba888 🔥 Updated favicon 2019-08-22 13:57:28 +05:30
127 changed files with 22157 additions and 1134 deletions

133
.all-contributorsrc Normal file
View File

@@ -0,0 +1,133 @@
{
"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": "terranblake",
"name": "Terran Blake",
"avatar_url": "https://avatars3.githubusercontent.com/u/8795767?v=4",
"profile": "https://www.lumahealth.io/",
"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"
]
}
],
"contributorsPerLine": 7,
"projectName": "postwoman",
"projectOwner": "liyasthomas",
"repoType": "github",
"repoHost": "https://github.com"
}

9
.dependabot/config.yml Normal file
View File

@@ -0,0 +1,9 @@
version: 1
update_configs:
- package_manager: "javascript"
directory: "/"
update_schedule: "weekly"
default_labels:
- "Dependency upgrade"
default_reviewers:
- "liyasthomas"

104
.dockerignore Normal file
View File

@@ -0,0 +1,104 @@
Dockerfile
.vscode
.github
# Created by .ignore support plugin (hsz.mobi)
# Firebase
.firebase
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# Nuxt generate
dist
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# IDE / Editor
.idea
# Service worker
sw.*
# Mac OSX
.DS_Store
# Vim swap files
*.swp
# Postwoman build data
.postwoman
# File explorer
.directory

11
.editorconfig Normal file
View File

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

14
.firebaserc Normal file
View File

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

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

@@ -0,0 +1,4 @@
ko_fi: liyasthomas
open_collective: liyasthomas
patreon: liyasthomas
custom: https://www.paypal.me/liyascthomas

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

10
.github/ISSUE_TEMPLATE/custom.md vendored Normal file
View File

@@ -0,0 +1,10 @@
---
name: Custom issue template
about: Describe this issue template's purpose here.
title: ''
labels: ''
assignees: ''
---

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

100
.gitignore vendored Normal file
View File

@@ -0,0 +1,100 @@
# Created by .ignore support plugin (hsz.mobi)
# Firebase
.firebase
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# Nuxt generate
dist
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# IDE / Editor
.idea
# Service worker
sw.*
# Mac OSX
.DS_Store
# Vim swap files
*.swp
# Postwoman build data
.postwoman
# File explorer
.directory

View File

@@ -1,8 +1,53 @@
# == INSTRUCTIONS FOR SETTING UP TRAVIS (and GitHub Pages) ==
#
# 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.
# 3. Set the GitHub Pages source in the GitHub repository settings to the
# gh-pages branch.
language: node_js
node_js:
- "node"
- "12"
addons:
apt:
packages:
- libgconf-2-4 # cypress binary dependency
env:
- DEPLOY_ENV=POSTWOMAN_IO
cache:
npm: true
directories:
- "node_modules"
- ~/.cache
branches:
only:
- "master"
install:
- "npm install firebase-tools"
- "npm install"
before_script:
- "npm run test"
script:
- "cd functions"
- "npm install"
- "cd .."
- "npm run generate"
notifications:
webhooks: https://www.travisbuddy.com
env:
- MY_VAR=EverythignIsAwesome
- NODE_ENV=TEST
after_success:
- firebase deploy --token $FIREBASE_TOKEN

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"deepcode.review.results.hideInformationIssues": false
}

View File

@@ -1,80 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script src="head.js"></script>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, shrink-to-fit=no">
<title>mnmlurl - Minimal URL is a modern URL shortener with support for custom alias</title>
<meta name="description" content="Minimal URL is a modern URL shortener with support for custom alias">
<link rel="icon" href="favicon.ico">
<meta itemprop="name" content="mnmlurl">
<meta itemprop="description" content="Minimal URL is a modern URL shortener with support for custom alias">
<meta itemprop="image" content="icons/icon-192x192.png">
<!-- See https://goo.gl/OOhYW5 -->
<link rel="manifest" href="manifest.json">
<!-- See https://goo.gl/qRE0vM -->
<meta name="theme-color" content="#ffffff">
<!-- Add to homescreen for Chrome on Android. Fallback for manifest.json -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="mnmlurl">
<!-- Add to homescreen for Safari on iOS -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="white-translucent">
<meta name="apple-mobile-web-app-title" content="mnmlurl">
<!-- Homescreen icons -->
<link rel="apple-touch-icon" href="icons/icon-48x48.png">
<link rel="apple-touch-icon" sizes="72x72" href="icons/icon-72x72.png">
<link rel="apple-touch-icon" sizes="96x96" href="icons/icon-96x96.png">
<link rel="apple-touch-icon" sizes="144x144" href="icons/icon-144x144.png">
<link rel="apple-touch-icon" sizes="192x192" href="icons/icon-192x192.png">
<!-- Tile icon for Windows 8 (144x144 + tile color) -->
<meta name="msapplication-TileImage" content="icons/icon-144x144.png">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-tap-highlight" content="no">
<!-- OpenGraph -->
<meta property="og:site_name" content="mnmlurl">
<meta property="og:url" content="https://mnmlurl.ml">
<meta property="og:type" content="website">
<meta property="og:title" content="mnmlurl">
<meta property="og:description" content="Minimal URL is a modern URL shortener with support for custom alias">
<meta property="og:image" content="icons/icon-144x144.png">
<!-- Twitter -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@liyasthomas">
<meta name="twitter:creator" content="@liyasthomas">
<meta name="twitter:url" content="https://mnmlurl.ml">
<meta name="twitter:title" content="mnmlurl">
<meta name="twitter:description" content="Minimal URL is a modern URL shortener with support for custom alias">
<meta name="twitter:image" content="icons/icon-144x144.png">
<!-- Web Fonts -->
<link href="https://fonts.googleapis.com/css?family=Poppins:700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="index.css">
</head>
<body>
<main class="main">
<div id="erbox">
<h1>404</h1>
page not found
</div>
<div class="flex"></div>
<footer>
<a href="https://mnmlurl.ml">
<img src="icons/logo.svg" alt="logo" style="height: 24px; margin-right: 8px;">Home
</a>
<a href="https://github.com/liyasthomas/mnmlurl" target="_blank" rel="noopener">
<img src="icons/github.svg" alt="GitHub" style="margin-right: 8px;">GitHub
</a>
<a href="https://github.com/liyasthomas/mnmlurl-extension" target="_blank" rel="noopener">
Get browser extension
</a>
<button id="installPWA" onclick="installPWA()" style="padding: 16px;">
<img src="icons/pwalogo.svg" alt="PWA" style="height: 16px;">
</button>
</footer>
</main>
</body>
</html>

View File

@@ -1,38 +1,3 @@
# Changelog
# Title
### Description by [Liyas Thomas](https://github.com/liyasthomas)
---
# 1.0.0
## This is it, Title 1.0.0!
We are finally out of beta, therefore many bugs were fixed and camera received a brand new look.
* **NEW**: Camera redesign
* **NEW**: Camera redesign
* **NEW**: macOS and iOS support
* **IMPROVEMENT**: Major improvements
* **IMPROVEMENT**: Updated libraries
* **FIX**: Fixed many bugs and crashes
* **FIX**: Graphic glitches
* **FIX**: Statusbar too dark
* **TRANSLATION**: Updated translations
* **REVERT**: Brought back the "Help" button
* **OTHER**: Removed all analytics
---
# 0.9.0
## I worked a lot on Web apps, WebAR, WebGL & PWAs
So I think Lvr is now ready to be released :)
I will keep the usual branch model.
* Stable release on `master` branch
---
## Thanks
* [Google](https://www.google.com) - for [Polymer](https://polymer-project.org)
* [v0.1.0](https://github.com/liyasthomas/postwoman/releases/tag/v0.1.0) - Initial 🎉 Initial public release

View File

@@ -1,180 +1,92 @@
# Introduction
# Contributing
### Write something nice here!
When contributing to this repository, please first discuss the change you wish to make via issue,
email, or any other method with the owners of this repository before making a change.
>First off, thank you for considering contributing to Active Admin. It's people like you that make Active Admin such a great tool.
Please note we have a code of conduct, please follow it in all your interactions with the project.
[source: [Active Admin](https://github.com/activeadmin/activeadmin/blob/master/CONTRIBUTING.md)] **Need more inspiration?** [1] [Read The Docs](http://read-the-docs.readthedocs.org/en/latest/contribute.html) [2] [Mustache.js](https://github.com/janl/mustache.js/#contributing)
## Pull Request Process
### Tell them why they should read your guidelines.
1. Ensure any install or build dependencies are removed before the end of the layer when doing a
build.
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/).
4. You may merge the Pull Request in 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 to merge it for you.
>Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests.
## Code of Conduct
[source: [Hoodie](https://github.com/hoodiehq/hoodie/blob/master/CONTRIBUTING.md)]
### Our Pledge
### Explain what kinds of contributions you are looking for.
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.
Keep an open mind! Improving documentation, bug triaging, or writing tutorials are all examples of helpful contributions that mean less work for you.
### Our Standards
> Elasticsearch is an open source project and we love to receive contributions from our community — you! There are many ways to contribute, from writing tutorials or blog posts, improving the documentation, submitting bug reports and feature requests or writing code which can be incorporated into Elasticsearch itself.
Examples of behavior that contributes to creating a positive environment
include:
[source: [Elasticsearch](https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md)] **Need more inspiration?** [1] [Devise](https://github.com/plataformatec/devise/wiki/Contributing) [2] [Geocoder](https://github.com/alexreisner/geocoder#known-issue) (“known issue”)
* 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
### Explain contributions you are NOT looking for (if any).
Examples of unacceptable behavior by participants include:
Again, defining this up front means less work for you. If someone ignores your guide and submits something you dont want, you can simply close it and point to your policy.
* 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
> Please, don't use the issue tracker for [support questions]. Check whether the #pocoo IRC channel on Freenode can help with your issue. If your problem is not strictly Werkzeug or Flask specific, #python is generally more active. Stack Overflow is also worth considering.
### Our Responsibilities
[source: [Flask](https://github.com/pallets/flask/blob/master/CONTRIBUTING.rst)] **Need more inspiration?** [1] [cucumber-ruby](https://github.com/cucumber/cucumber-ruby/blob/master/CONTRIBUTING.md#about-to-create-a-new-github-issue) [2] [Read the Docs](http://read-the-docs.readthedocs.org/en/latest/open-source-philosophy.html#unsupported)
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
# Ground Rules
### Set expectations for behavior (yours, and theirs).
This includes not just how to communicate with others (being respectful, considerate, etc) but also technical responsibilities (importance of testing, project dependencies, etc). Mention and link to your code of conduct, if you have one.
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 to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
> Responsibilities
> * Ensure cross-platform compatibility for every change that's accepted. Windows, Mac, Debian & Ubuntu Linux.
> * Ensure that code that goes into core meets all requirements in this checklist: https://gist.github.com/audreyr/4feef90445b9680475f2
> * Create issues for any major changes and enhancements that you wish to make. Discuss things transparently and get community feedback.
> * Don't add any classes to the codebase unless absolutely needed. Err on the side of using functions.
> * Keep feature versions as small as possible, preferably one new feature per version.
> * Be welcoming to newcomers and encourage diverse new contributors from all backgrounds. See the [Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/).
### Scope
[source: [cookiecutter](https://github.com/audreyr/cookiecutter/blob/master/CONTRIBUTING.rst)] **Need more inspiration?** [1] [Celery](https://github.com/celery/celery/blob/master/CONTRIBUTING.rst#community-code-of-conduct) [2] [geocoder](https://github.com/alexreisner/geocoder#contributing)
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.
# Your First Contribution
Help people who are new to your project understand where they can be most helpful. This is also a good time to let people know if you follow a label convention for flagging beginner issues.
### Enforcement
> Unsure where to begin contributing to Atom? You can start by looking through these beginner and help-wanted issues:
> Beginner issues - issues which should only require a few lines of code, and a test or two.
> Help wanted issues - issues which should be a bit more involved than beginner issues.
> Both issue lists are sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have.
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.
[source: [Atom](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#your-first-code-contribution)] **Need more inspiration?** [1] [Read the Docs](http://docs.readthedocs.org/en/latest/contribute.html#contributing-to-development) [2] [Django](https://docs.djangoproject.com/en/dev/internals/contributing/new-contributors/#first-steps) (scroll down to "Guidelines" as well)
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.
### Bonus points: Add a link to a resource for people who have never contributed to open source before.
Here are a couple of friendly tutorials you can include: http://makeapullrequest.com/ and http://www.firsttimersonly.com/
### Attribution
> Working on your first Pull Request? You can learn how from this *free* series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[source: [React](https://github.com/facebook/react/blob/master/CONTRIBUTING.md#pull-requests)]
As a side note, it helps to use newcomer-friendly language throughout the rest of your document. Here are a couple of examples from [Active Admin](https://github.com/activeadmin/activeadmin/blob/master/CONTRIBUTING.md):
>At this point, you're ready to make your changes! Feel free to ask for help; everyone is a beginner at first :smile_cat:
>
>If a maintainer asks you to "rebase" your PR, they're saying that a lot of code has changed, and that you need to update your branch so it's easier to merge.
# Getting started
### Give them a quick walkthrough of how to submit a contribution.
How you write this is up to you, but some things you may want to include:
* Let them know if they need to sign a CLA, agree to a DCO, or get any other legal stuff out of the way
* If tests are required for contributions, let them know, and explain how to run the tests
* If you use anything other than GitHub to manage issues (ex. JIRA or Trac), let them know which tools theyll need to contribute
>For something that is bigger than a one or two line fix:
>1. Create your own fork of the code
>2. Do the changes in your fork
>3. If you like the change and think the project could use it:
* Be sure you have followed the code style for the project.
* Sign the Contributor License Agreement, CLA, with the jQuery Foundation.
* Note the jQuery Foundation Code of Conduct.
* Send a pull request indicating that you have a CLA on file.
[source: [Requirejs](http://requirejs.org/docs/contributing.html)] **Need more inspiration?** [1] [Active Admin](https://github.com/activeadmin/activeadmin/blob/master/CONTRIBUTING.md#1-where-do-i-go-from-here) [2] [Node.js](https://github.com/nodejs/node/blob/master/CONTRIBUTING.md#code-contributions) [3] [Ember.js](https://github.com/emberjs/ember.js/blob/master/CONTRIBUTING.md#pull-requests)
### If you have a different process for small or "obvious" fixes, let them know.
> Small contributions such as fixing spelling errors, where the content is small enough to not be considered intellectual property, can be submitted by a contributor as a patch, without a CLA.
>
>As a rule of thumb, changes are obvious fixes if they do not introduce any new functionality or creative thinking. As long as the change does not affect functionality, some likely examples include the following:
>* Spelling / grammar fixes
>* Typo correction, white space and formatting changes
>* Comment clean up
>* Bug fixes that change default return values or error codes stored in constants
>* Adding logging messages or debugging output
>* Changes to metadata files like Gemfile, .gitignore, build scripts, etc.
>* Moving source files from one directory or package to another
[source: [Chef](https://github.com/chef/chef/blob/master/CONTRIBUTING.md#chef-obvious-fix-policy)] **Need more inspiration?** [1] [Puppet](https://github.com/puppetlabs/puppet/blob/master/CONTRIBUTING.md#making-trivial-changes)
# How to report a bug
### Explain security disclosures first!
At bare minimum, include this sentence:
> If you find a security vulnerability, do NOT open an issue. Email XXXX instead.
If you dont want to use your personal contact information, set up a “security@” email address. Larger projects might have more formal processes for disclosing security, including encrypted communication. (Disclosure: I am not a security expert.)
> Any security issues should be submitted directly to security@travis-ci.org
> In order to determine whether you are dealing with a security issue, ask yourself these two questions:
> * Can I access something that's not mine, or something I shouldn't have access to?
> * Can I disable something for other people?
>
> If the answer to either of those two questions are "yes", then you're probably dealing with a security issue. Note that even if you answer "no" to both questions, you may still be dealing with a security issue, so if you're unsure, just email us at security@travis-ci.org.
[source: [Travis CI](https://github.com/travis-ci/travis-ci/blob/master/CONTRIBUTING.md)] **Need more inspiration?** [1] [Celery](https://github.com/celery/celery/blob/master/CONTRIBUTING.rst#security) [2] [Express.js](https://github.com/expressjs/express/blob/master/Security.md)
### Tell your contributors how to file a bug report.
You can even include a template so people can just copy-paste (again, less work for you).
> When filing an issue, make sure to answer these five questions:
>
> 1. What version of Go are you using (go version)?
> 2. What operating system and processor architecture are you using?
> 3. What did you do?
> 4. What did you expect to see?
> 5. What did you see instead?
> General questions should go to the golang-nuts mailing list instead of the issue tracker. The gophers there will answer or ask you to file an issue if you've tripped over a bug.
[source: [Go](https://github.com/golang/go/blob/master/CONTRIBUTING.md#filing-issues)] **Need more inspiration?** [1] [Celery](https://github.com/celery/celery/blob/master/CONTRIBUTING.rst#other-bugs ) [2] [Atom](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#reporting-bugs) (includes template)
# How to suggest a feature or enhancement
### If you have a particular roadmap, goals, or philosophy for development, share it here.
This information will give contributors context before they make suggestions that may not align with the projects needs.
> The Express philosophy is to provide small, robust tooling for HTTP servers, making it a great solution for single page applications, web sites, hybrids, or public HTTP APIs.
>
> Express does not force you to use any specific ORM or template engine. With support for over 14 template engines via Consolidate.js, you can quickly craft your perfect framework.
[source: [Express](https://github.com/expressjs/express#philosophy)] **Need more inspiration?** [Active Admin](https://github.com/activeadmin/activeadmin#goals)
### Explain your desired process for suggesting a feature.
If there is back-and-forth or signoff required, say so. Ask them to scope the feature, thinking through why its needed and how it might work.
> If you find yourself wishing for a feature that doesn't exist in Elasticsearch, you are probably not alone. There are bound to be others out there with similar needs. Many of the features that Elasticsearch has today have been added because our users saw the need. Open an issue on our issues list on GitHub which describes the feature you would like to see, why you need it, and how it should work.
[source: [Elasticsearch](https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md#feature-requests)] **Need more inspiration?** [1] [Hoodie](https://github.com/hoodiehq/hoodie/blob/master/CONTRIBUTING.md#feature-requests) [2] [Ember.js](https://github.com/emberjs/ember.js/blob/master/CONTRIBUTING.md#requesting-a-feature)
# Code review process
### Explain how a contribution gets accepted after its been submitted.
Who reviews it? Who needs to sign off before its accepted? When should a contributor expect to hear from you? How can contributors get commit access, if at all?
> The core team looks at Pull Requests on a regular basis in a weekly triage meeting that we hold in a public Google Hangout. The hangout is announced in the weekly status updates that are sent to the puppet-dev list. Notes are posted to the Puppet Community community-triage repo and include a link to a YouTube recording of the hangout.
> After feedback has been given we expect responses within two weeks. After two weeks we may close the pull request if it isn't showing any activity.
[source: [Puppet](https://github.com/puppetlabs/puppet/blob/master/CONTRIBUTING.md#submitting-changes)] **Need more inspiration?** [1] [Meteor](https://meteor.hackpad.com/Responding-to-GitHub-Issues-SKE2u3tkSiH ) [2] [Express.js](https://github.com/expressjs/express/blob/master/Contributing.md#becoming-a-committer)
# Community
If there are other channels you use besides GitHub to discuss contributions, mention them here. You can also list the author, maintainers, and/or contributors here, or set expectations for response time.
> You can chat with the core team on https://gitter.im/cucumber/cucumber. We try to have office hours on Fridays.
[source: [cucumber-ruby](https://github.com/cucumber/cucumber-ruby/blob/master/CONTRIBUTING.md#talking-with-other-devs)] **Need more inspiration?**
[1] [Chef](https://github.com/chef/chef/blob/master/CONTRIBUTING.md#-developer-office-hours) [2] [Cookiecutter](https://github.com/audreyr/cookiecutter#community)
# BONUS: Code, commit message and labeling conventions
These sections are not necessary, but can help streamline the contributions you receive.
### Explain your preferred style for code, if you have any.
**Need inspiration?** [1] [Requirejs](http://requirejs.org/docs/contributing.html#codestyle) [2] [Elasticsearch](https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md#contributing-to-the-elasticsearch-codebase)
### Explain if you use any commit message conventions.
**Need inspiration?** [1] [Angular](https://github.com/angular/material/blob/master/.github/CONTRIBUTING.md#submit) [2] [Node.js](https://github.com/nodejs/node/blob/master/CONTRIBUTING.md#step-3-commit)
### Explain if you use any labeling conventions for issues.
**Need inspiration?** [1] [StandardIssueLabels](https://github.com/wagenet/StandardIssueLabels#standardissuelabels) [2] [Atom](https://github.com/atom/atom/blob/master/CONTRIBUTING.md#issue-and-pull-request-labels)
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

14
Dockerfile Normal file
View File

@@ -0,0 +1,14 @@
FROM node:12.10.0-buster
LABEL maintainer="Liyas Thomas (liyascthomas@gmail.com)"
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start"]

328
README.md
View File

@@ -1,46 +1,173 @@
```
When I wrote this, only God and I understood what I was doing. Now, only God knows.
```
<div align="center">
<a href="https://liyas-thomas.firebaseapp.com"><img src="https://raw.githubusercontent.com/liyasthomas/templates/master/assets/logo.gif" alt="Liyas Thomas" width="200"></a>
<a href="https://postwoman.io"><img src="static/logo.png" alt="Postwoman.io logo" height="160"></a>
<br>
<h1>Liyas Thomas</h1>
<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>
<br>
<p>
API request builder - A free, fast, and beautiful alternative to Postman
</p>
<p>
Helps you create your requests faster, saving you precious time on your development - <a href="https://postwoman.launchaco.com">Subscribe</a>
</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)](https://postwoman.io) [![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?style=flat)](CONTRIBUTING.md) [![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors) [![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)
</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>
</p>
</div>
---
[![Build Status](https://travis-ci.org/liyasthomas/postwoman.svg?branch=master)](https://travis-ci.org/liyasthomas/postwoman) [![GitHub release](https://img.shields.io/github/release/liyasthomas/postwoman/all.svg)](https://github.com/liyasthomas/postwoman/releases/latest) [![repo size](https://img.shields.io/github/repo-size/liyasthomas/postwoman.svg)](https://github.com/liyasthomas/postwoman/archive/master.zip) [![license](https://img.shields.io/github/license/liyasthomas/postwoman.svg)](https://github.com/liyasthomas/postwoman/blob/master/LICENSE) [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/liyasthomas/postwoman/issues) [![Website](https://img.shields.io/website-up-down-green-red/https/shields.io.svg?label=website)](https://liyas-thomas.firebaseapp.com) [![Donate](https://img.shields.io/badge/$-donate-ff69b4.svg)](https://www.paypal.me/liyascthomas)
**Start here: _[Story behind Postwoman](https://dev.to/liyasthomas/i-created-postwoman-an-online-open-source-api-request-builder-41md)_**
# <img src="icons/icon-48x48.png" alt="postwoman" width="32"> Postwoman
**Chat here: _[Telegram](https://t.me/postwoman_app), [Discord](https://discord.gg/GAMWxmR)_**
### 👽 API request builder by [Liyas Thomas](https://github.com/liyasthomas)
**Donate here: _[PayPal](https://www.paypal.me/liyascthomas), [Open Collective](https://opencollective.com/postwoman), [Patreon](https://www.patreon.com/liyasthomas)_**
<div align="center">
<br>
<img src="icons/screely.png" alt="postwoman" width="100%">
<img src="icons/screely2.png" alt="postwoman" width="100%">
<img src="static/images/screenshot1.png" alt="Screenshot1" width="100%">
<img src="static/images/screenshot2.png" alt="Screenshot2" width="100%">
<br>
</div>
### Features :sparkles:
### Features
:heart: **Lightweight and minimal**: Crafted with minimalistic UI design
❤️ **Lightweight**: Crafted with minimalistic UI design. Simple design is the best design.
:electric_plug: **Real-time demo**: Send requests and get response right away!
- Faster, lighter, cleaner, minimal & responsive
:robot: **VIBGYOR**: Neon combination of colors for background and foreground
⚡️ **Fast**: Send requests and get/copy responses in real-time! Fast software is the best software.
:sparkles: **PWA**: Install as a PWA on your device
**Methods:**
- `GET` - Retrieve information about the REST API resource
- `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
- `OPTIONS` - Describe the communication options for the target resource
- `PATCH` - Apply partial modifications to a REST API resource
---
_History entries are synced with local session storage_
## Demo
🌈 **Make it yours**: Customizable combinations for background, foreground and accent colors: because customization === freedom. [Customize now ✨](https://postwoman.io/settings).
[https://liyasthomas.github.io/postwoman](https://liyasthomas.github.io/postwoman)
**Customizations:**
- 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 frames
_Customized themes are also synced with local session storage_
🔥 **PWA**: Install as a [PWA](https://developers.google.com/web/progressive-web-apps) on your device.
**Features:**
- Instant loading with [Service Workers](https://developers.google.com/web/fundamentals/primers/service-workers)
- Offline support
- Low RAM/memory and CPU usage
- [Add to Home Screen](https://developers.google.com/web/fundamentals/app-install-banners) (button in footer)
- [Desktop PWA](https://developers.google.com/web/progressive-web-apps/desktop) support (button in footer)
- ([full features](https://developers.google.com/web/progressive-web-apps))
🚀 **Request**: Retrieve data from a URL without having to do a full page refresh.
- Choose `method`
- Enter `URL`
- Enter `Path`
**Features:**
- Copy/share public "Share URL"
- Generate request code for JavaScript XHR, Fetch and cURL
- Copy generated request code to clipboard
- Import cURL
- Label requests
🔌 **Web Socket**: Establish full-duplex communication channels over a single TCP connection.
- Send and receive data
🔐 **Authentication**: Allows to identity the end user.
**Types:**
- None
- Basic authentication using username and password
- Token based authentication
📢 **Headers**: Describes the format the body of your request is being sent as.
- Add or remove Header list
📫 **Parameters**: Use request parameters to set varying parts in simulated requests.
📃 **Request Body**: Used to send and receive data via the REST API.
**Options:**
- Set Content Type
- Add or remove Parameter list
- Toggle between key-value and RAW input Parameter list
👋 **Responses**: Contains the status line, headers and the message/response body.
- Copy response to clipboard
- View preview for HTML responses
_HTML responses have "Preview HTML" feature_
**History**: Request entries are synced with local session storage to reuse with a single click.
**Fields:**
- Label
- Timestamp
- Method
- Status code
- URL
- Path
_History entries can be sorted by any fields_
_Histories can deleted one-by-one or all together_
📁 **Collections**: Keep your API requests organized with collections and folders. Reuse them with a single click.
**Options:**
- Create infinite collections, folders and requests
- Edit, delete, move, export, import and replace
_Export, import and replace collections with JSON files_
_Collections are synced with local session storage_
🌐 **Proxy**: Enable Proxy Mode from Settings to access blocked APIs.
**Features:**
- 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://`, `localhost`, etc.)
_Proxy is hosted by ApolloTV - [Privacy policy](https://apollotv.xyz/legal)_
📜 **Pre-Request Scripts β**: Snippets of code associated with a request that are executed before the request is sent.
**Use-cases:**
- Including the timestamp in the request headers
- Sending a random alphanumeric string in the URL parameters
_Pre-Request Scripts is an experimental feature and is in Public Beta testing_
_Requests with Pre-Request Scripts are indicated in History entries_
**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)](https://postwoman.io)
[https://postwoman.io](https://postwoman.io)
## Usage 💡
1. Specify your request method
2. Type in your API URL
@@ -50,67 +177,160 @@ When I wrote this, only God and I understood what I was doing. Now, only God kno
You're done!
---
## Built with 🔧
## Built with
* **[Chromium](https://github.com/chromium/chromium)** - Thanks for being so fast!
* [Chromium](https://github.com/chromium/chromium) - Thanks for being so fast!
* HTML - For the web framework
* CSS - For styling components
* JavaScript - For magic!
* [Vue](https://vuejs.org/) - To add to the JavaScript magic!
* [Nuxt](https://nuxtjs.org/) - To add to the Vue magic!
---
## Developing 👷
## Contributing
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.
#### Or, with 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)
```bash
#pull
docker pull liyasthomas/postwoman
#run
docker run -p 3000:3000 liyasthomas/postwoman:latest
#build
docker build -t postwoman:latest
```
## 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`.
## Contributing 🍰
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 [Travis CI](https://travis-ci.com) for continuous integration. Check out our [Travis CI Status](https://travis-ci.org/liyasthomas/postwoman).
---
## Versioning
## 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
## Change log 📝
See the [CHANGELOG](CHANGELOG.md) file for details.
---
## Authors
## Authors 🔮
### Lead Developers
* [**Liyas Thomas**](https://github.com/liyasthomas) - *Author*
* **[Liyas Thomas](https://github.com/liyasthomas)** - *Author*
* **[Caneco](https://twitter.com/caneco)** - *Designer*
### Testing and Debugging
* [Liyas Thomas](https://github.com/liyasthomas)
### Contributors
* [Liyas Thomas](https://github.com/liyasthomas)
* ([contributors](https://github.com/liyasthomas/postwoman/graphs/contributors))
### Thanks
* [Dribbble](https://dribbble.com)
### Collaborators <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
<!-- ALL-CONTRIBUTORS-BADGE:END -->
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore -->
<table>
<tr>
<td align="center"><a href="https://liyasthomas.web.app"><img src="https://avatars1.githubusercontent.com/u/10395817?v=4" width="100px;" alt="Liyas Thomas"/><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="John Harker"/><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="Nicholas La Roux"/><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="Thomas Yuba"/><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="Nick Palenchar"/><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://www.lumahealth.io/"><img src="https://avatars3.githubusercontent.com/u/8795767?v=4" width="100px;" alt="Terran Blake"/><br /><sub><b>Terran Blake</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=terranblake" 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="Andrew Bastin"/><br /><sub><b>Andrew Bastin</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=AndrewBastin" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/vlad0337187"><img src="https://avatars1.githubusercontent.com/u/12682937?v=4" width="100px;" alt="Vladislav"/><br /><sub><b>Vladislav</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=vlad0337187" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/izerozlu"><img src="https://avatars3.githubusercontent.com/u/17386157?v=4" width="100px;" alt="izerozlu"/><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="Jacob Anavisca"/><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="Nityananda Gohain"/><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="Hossein Nedaee"/><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="James George"/><br /><sub><b>James George</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=jamesgeorge007" title="Code">💻</a></td>
</tr>
</table>
<!-- ALL-CONTRIBUTORS-LIST:END -->
See the list of [contributors](https://github.com/liyasthomas/postwoman/graphs/contributors) who participated in this project.
---
### Thanks
## License
* [dev.to 👩‍💻👨‍💻](https://dev.to)
### 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>
### Financial Contributors
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/postwoman/contribute)]
#### Individuals
<a href="https://opencollective.com/postwoman"><img src="https://opencollective.com/postwoman/individuals.svg"></a>
#### 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>
## License 📄
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [LICENSE](LICENSE) file for details.
---
## Acknowledgements 🙏
## Acknowledgments
* Hat tip to anyone who's code was used
* Hat tip to anyone whose code was used
* Inspirations:
* [Dribbble](https://dribbble.com)
* [Dribbble](https://dribbble.com)
## Badges
| Status | Preview | Markdown Code (copy & paste into `readme.md`) |
| ----------- | ----------- | ----------- |
| **Default** | [![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-50fa7b)](https://postwoman.io) | `[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-50fa7b)](https://postwoman.io)` |
| **Success** | [![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-success)](https://postwoman.io) | `[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-success)](https://postwoman.io)` |
| **Critical** | [![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-critical)](https://postwoman.io) | `[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-critical)](https://postwoman.io)` |
| **Custom** | [![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-blueviolet)](https://postwoman.io) | `[![Postwoman](https://img.shields.io/badge/Tested_on-Postwoman-blueviolet)](https://postwoman.io)` |
| Make your own badge! | [![Postwoman](https://img.shields.io/badge/your_text-Postwoman-hex_color_code)](https://postwoman.io) | `[![Postwoman](https://img.shields.io/badge/your_text-Postwoman-hex_color_code)](https://postwoman.io)` |
<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>
</div>

7
assets/README.md Normal file
View File

@@ -0,0 +1,7 @@
# ASSETS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your un-compiled assets such as LESS, SASS, or JavaScript.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked).

63
assets/css/fonts.scss Normal file
View File

@@ -0,0 +1,63 @@
/* Material Design Icons */
@font-face {
font-family: "Material Icons";
font-display: swap;
font-style: normal;
font-weight: 400;
src: url(~@/assets/fonts/material-icons-v48.woff2) format("woff2");
}
.material-icons {
font-family: "Material Icons";
font-weight: normal;
font-style: normal;
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;
}
/* Roboto Mono 400 */
@font-face {
font-family: "Roboto Mono";
font-display: swap;
font-style: normal;
font-weight: 400;
src: local("Roboto Mono"), local("RobotoMono-Regular"),
url("~@/assets/fonts/roboto-mono-v7-latin-regular.woff2") format("woff2"),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url("~@/assets/fonts/roboto-mono-v7-latin-regular.woff") format("woff");
/* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* Poppins 500 */
@font-face {
font-family: "Poppins";
font-display: swap;
font-style: normal;
font-weight: 500;
src: local("Poppins Medium"), local("Poppins-Medium"),
url("~@/assets/fonts/poppins-v9-latin-500.woff2") format("woff2"),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url("~@/assets/fonts/poppins-v9-latin-500.woff") format("woff");
/* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}
/* poppins-700 - latin */
@font-face {
font-family: "Poppins";
font-display: swap;
font-style: normal;
font-weight: 700;
src: local("Poppins Bold"), local("Poppins-Bold"),
url("~@/assets/fonts/poppins-v9-latin-700.woff2") format("woff2"),
/* Chrome 26+, Opera 23+, Firefox 39+ */
url("~@/assets/fonts/poppins-v9-latin-700.woff") format("woff");
/* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
}

765
assets/css/styles.scss Normal file
View File

@@ -0,0 +1,765 @@
$responsiveWidth: 720px;
html {
scroll-behavior: smooth;
}
::selection {
background-color: var(--ac-sel-color);
color: var(--act-color);
}
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-thumb {
background-color: var(--fg-light-color);
border-radius: 8px;
border: 2px solid var(--bg-color);
}
::-webkit-scrollbar-thumb:hover {
background-color: var(--fg-color);
}
::placeholder {
color: var(--fg-light-color);
opacity: 0.3;
}
* {
box-sizing: border-box;
outline: 0;
border: 0;
}
body {
background-color: var(--bg-color);
color: var(--fg-color);
font-weight: 500;
font-size: 16px;
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;
}
// Make theme transition smoother.
body.afterLoad {
&,
& * {
transition: background-color 0.2s ease-in-out, border 0.2s ease-in-out;
}
}
body.sticky-footer footer {
opacity: 0.25;
}
a {
display: inline-flex;
color: inherit;
text-decoration: none;
font-weight: 700;
}
header,
footer {
& > div {
display: flex;
padding: 16px;
width: 100%;
align-items: center;
justify-content: space-between;
}
}
.wrapper {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.wrapper .content {
min-height: 100vh;
}
.header,
.content,
.columns,
.footer {
display: flex;
flex: 1;
}
.slide-in {
position: relative;
animation: slideIn 0.2s forwards ease-in-out;
}
@keyframes slideIn {
0% {
opacity: 0;
left: -16px;
}
100% {
opacity: 1;
left: 0px;
}
}
.logo {
font-size: 22px;
color: var(--ac-color);
}
.tagline {
font-size: 18px;
}
.nav-first {
display: flex;
order: 1;
flex-flow: column;
position: sticky;
top: 0;
align-self: flex-start;
z-index: 1;
}
.main {
flex: 1;
order: 2;
position: relative;
padding: 0 16px;
}
.nav-second {
display: flex;
width: 10%;
order: 3;
// comment this to display
display: none;
}
nav.primary-nav {
display: flex;
flex-flow: column nowrap;
border-bottom: 1px solid var(--brd-color);
svg {
fill: var(--fg-light-color);
}
a {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 16px;
border-radius: 50%;
background-color: var(--brd-color);
color: var(--fg-light-color);
margin: 8px;
transition: all 0.2s ease-in-out;
&:hover {
color: var(--fg-color);
svg {
fill: var(--fg-color);
}
}
&.nuxt-link-exact-active {
background-color: var(--ac-color);
color: var(--act-color);
border-radius: 16px;
svg {
fill: var(--act-color);
}
}
}
}
nav.secondary-nav {
display: flex;
ul {
display: flex;
flex-flow: column nowrap;
li {
display: flex;
a {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 16px;
border-radius: 50%;
background-color: var(--bg-dark-color);
color: var(--fg-light-color);
margin: 8px;
&:hover {
color: var(--fg-color);
}
&.current {
color: var(--ac-color);
fill: var(--ac-color);
}
}
}
}
}
.footer {
flex-direction: column;
}
$responsiveWidth: 720px;
@media (max-width: $responsiveWidth) {
.columns {
flex-flow: column;
}
.nav-first {
width: 100%;
background-color: var(--bg-color);
}
nav.primary-nav {
flex-flow: row;
}
nav.secondary-nav {
display: none;
}
.main {
padding: 0 8px;
}
}
h1,
h2,
h3 {
margin: 0;
font-weight: 700;
}
.tooltip {
display: block !important;
z-index: 10000;
.tooltip-inner {
background: black;
color: white;
border-radius: 8px;
padding: 8px 16px;
font-size: 14px;
}
.tooltip-arrow {
width: 0;
height: 0;
border-style: solid;
position: absolute;
margin: 5px;
border-color: black;
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 {
$color: #f9f9f9;
.popover-inner {
background: $color;
color: black;
padding: 24px;
border-radius: 5px;
box-shadow: 0 5px 30px rgba(black, 0.1);
}
.popover-arrow {
border-color: $color;
}
}
&[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;
}
}
h3.title {
margin: 4px;
}
button {
display: inline-flex;
align-items: center;
justify-content: center;
margin: 4px;
padding: 0 16px;
border-radius: 20px;
background-color: var(--ac-color);
color: var(--act-color);
font-weight: 700;
font-size: 16px;
font-family: "Poppins", "Roboto", "Noto", sans-serif;
transition: all 0.2s ease-in-out;
fill: var(--act-color);
height: 40px;
cursor: pointer;
span {
display: inline-flex;
margin-left: 8px;
}
&.icon {
background-color: var(--bg-color);
color: var(--fg-light-color);
fill: var(--fg-light-color);
&:not([disabled]):hover {
color: var(--fg-color);
fill: var(--fg-color);
}
}
&:not([disabled]):hover {
color: var(--act-color);
fill: var(--act-color);
}
}
fieldset {
margin: 16px 0;
border: 1px solid var(--brd-color);
border-radius: 8px;
background-color: var(--bg-color);
}
legend {
display: inline-block;
align-items: center;
justify-content: center;
color: var(--fg-color);
font-weight: 700;
cursor: pointer;
* {
vertical-align: middle;
}
i {
margin-left: 8px;
}
}
fieldset.blue legend {
color: #57b5f9;
}
fieldset.gray legend {
color: #bcc2cd;
}
fieldset.green legend {
color: #50fa7b;
}
fieldset.cyan legend {
color: #8be9fd;
}
fieldset.purple legend {
color: #bd93f9;
}
fieldset.orange legend {
color: #ffb86c;
}
fieldset.pink legend {
color: #ff79c6;
}
fieldset.red legend {
color: #ff5555;
}
fieldset.yellow legend {
color: #f1fa8c;
}
.hidden {
display: none;
}
select,
input,
option,
textarea,
pre {
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;
transition: all 0.2s ease-in-out;
user-select: text;
width: calc(100% - 8px);
min-height: 40px;
resize: vertical;
text-overflow: ellipsis;
&:not([readonly]):hover {
background-color: var(--bg-dark-color);
}
}
pre {
display: grid;
}
code {
height: 336px;
border-radius: 8px;
}
.hljs,
.hljs-subst {
background-color: var(--bg-dark-color) !important;
color: var(--fg-color) !important;
font-family: 'Roboto Mono', monospace;
}
select,
input,
option {
height: 40px;
}
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,
.disabled,
[disabled] {
background-color: var(--err-color);
color: var(--fg-light-color);
fill: var(--fg-light-color);
cursor: default;
&.icon {
color: var(--bg-color);
fill: var(--bg-color);
}
}
label {
padding: 4px;
color: var(--fg-light-color);
}
ul,
ol {
display: flex;
margin: 4px 0 4px;
padding: 0;
list-style-type: none;
}
ul li,
ol li {
display: inline-flex;
flex-direction: column;
flex-grow: 1;
}
.flex-wrap {
display: flex;
align-items: center;
justify-content: space-between;
}
.show-on-small-screen {
display: flex;
}
@media (max-width: $responsiveWidth) {
ul,
ol {
flex-direction: column;
}
ul li,
ol li {
display: flex;
}
.hide-on-small-screen {
display: none;
}
.show-on-small-screen {
display: inline-flex;
}
}
#installPWA {
display: none;
}
.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);
}
.virtual-list::-webkit-scrollbar {
width: 0;
}
fieldset#history {
.method-list-item {
position: relative;
span {
position: absolute;
top: 12px;
right: 12px;
font-family: 'Roboto Mono', monospace;
}
}
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
#response-details-wrapper {
position: relative;
overflow: hidden;
border-radius: 8px;
textarea {
margin: 0;
width: 100%;
}
.covers-response {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: white;
height: 100%;
width: 100%;
}
}
#send {
#hidden-message {
display: none;
}
&.show {
display: flex;
position: fixed;
top: 12px;
right: 12px;
z-index: 1;
#hidden-message {
display: block;
margin-left: 4px;
}
}
}
section {
display: flex;
flex-wrap: wrap;
}
div.tab {
width: 100%;
order: 1;
}
input[type="radio"],
div.tab {
display: none;
}
input[type="radio"] + label {
padding: 8px 16px;
border-bottom: 2px solid transparent;
cursor: pointer;
transition: all 0.2s ease-in-out;
&:hover {
border-color: var(--brd-color);
}
}
input[type="radio"]:checked + label {
border-color: var(--fg-color);
}
input[type="radio"]:checked + label + div.tab {
display: block;
}
.toasted-container .toasted {
justify-content: start !important;
}
.toasted.info {
background-color: var(--ac-color) !important;
color: var(--act-color) !important;
}
.toasted.bubble .action {
color: inherit !important;
}

98
assets/css/themes.scss Normal file
View File

@@ -0,0 +1,98 @@
/**
Main Themes:
- dark (default)
- light
- black
- auto
*/
// Dark is the default theme variant.
@mixin darkTheme {
// Dark Background color
--bg-dark-color: rgb(41, 42, 45);
// Background color
--bg-color: rgb(37, 38, 40);
// Auto-complete color
--atc-color: rgb(49, 49, 55);
// Text color
--fg-color: rgb(247, 248, 248);
// Light Text color
--fg-light-color: rgb(150, 155, 160);
// Border color
--brd-color: rgb(48, 47, 55);
// Error color
--err-color: rgb(41, 42, 45);
// Acent color
--ac-color: #50fa7b;
--ac-sel-color: rgb(80, 250, 123, 0.8);
// Active text color
--act-color: rgb(37, 38, 40);
}
:root {
@include darkTheme;
}
@media(prefers-color-scheme: dark) {
:root.auto {
@include darkTheme;
}
}
@mixin lightTheme {
// Dark Background color
--bg-dark-color: #f6f6f6;
// Background color
--bg-color: #ffffff;
// Auto-complete color
--atc-color: #ebebeb;
// Text color
--fg-color: #525252;
// Light Text color
--fg-light-color: rgb(150, 155, 160);
// Border color
--brd-color: #eeeeed;
// Error color
--err-color: #f6f6f6;
// Acent color
--ac-color: #57b5f9;
--ac-sel-color: #57b5f9;
// Active text color
--act-color: #ffffff;
}
:root.light {
@include lightTheme;
}
@media(prefers-color-scheme: light) {
:root.auto {
@include lightTheme;
}
}
@mixin blackTheme {
// Dark Background color
--bg-dark-color: rgb(8, 8, 8);
// Background color
--bg-color: #000000;
// Auto-complete color
--atc-color: rgb(18, 18, 18);
// Text color
--fg-color: rgb(250, 250, 250);
// Light Text color
--fg-light-color: rgb(100, 100, 100);
// Border color
--brd-color: rgb(16, 16, 16);
// Error color
--err-color: rgb(8, 8, 8);
// Acent color
--ac-color: #50fa7b;
--ac-sel-color: rgb(80, 250, 123, 0.8);
// Active text color
--act-color: #000000;
}
:root.black {
@include blackTheme;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

228
assets/js/curlparser.js Normal file
View File

@@ -0,0 +1,228 @@
import * as cookie from "cookie";
import * as URL from "url";
import * as querystring from "querystring";
/**
* given this: [ 'msg1=value1', 'msg2=value2' ]
* output this: 'msg1=value1&msg2=value2'
* @param dataArguments
*/
function joinDataArguments(dataArguments) {
let data = "";
dataArguments.forEach(function (argument, i) {
if (i === 0) {
data += argument;
} else {
data += "&" + argument;
}
});
return data;
}
function parseCurlCommand(curlCommand) {
let newlineFound = /\r|\n/.exec(curlCommand);
if (newlineFound) {
// remove newlines
curlCommand = curlCommand.replace(/\\\r|\\\n/g, "");
}
// yargs parses -XPOST as separate arguments. just prescreen for it.
curlCommand = curlCommand.replace(/ -XPOST/, " -X POST");
curlCommand = curlCommand.replace(/ -XGET/, " -X GET");
curlCommand = curlCommand.replace(/ -XPUT/, " -X PUT");
curlCommand = curlCommand.replace(/ -XPATCH/, " -X PATCH");
curlCommand = curlCommand.replace(/ -XDELETE/, " -X DELETE");
curlCommand = curlCommand.trim();
let parsedArguments = require("yargs-parser")(curlCommand);
let cookieString;
let cookies;
let url = parsedArguments._[1];
if (!url) {
for (let argName in parsedArguments) {
if (typeof parsedArguments[argName] === "string") {
if (["http", "www."].includes(parsedArguments[argName])) {
url = parsedArguments[argName];
}
}
}
}
let headers;
let parseHeaders = function (headerFieldName) {
if (parsedArguments[headerFieldName]) {
if (!headers) {
headers = {};
}
if (!Array.isArray(parsedArguments[headerFieldName])) {
parsedArguments[headerFieldName] = [parsedArguments[headerFieldName]];
}
parsedArguments[headerFieldName].forEach(function (header) {
if (header.includes("Cookie")) {
// stupid javascript tricks: closure
cookieString = header;
} else {
let colonIndex = header.indexOf(":");
let headerName = header.substring(0, colonIndex);
let headerValue = header.substring(colonIndex + 1).trim();
headers[headerName] = headerValue;
}
});
}
};
parseHeaders("H");
parseHeaders("header");
if (parsedArguments.A) {
if (!headers) {
headers = [];
}
headers["User-Agent"] = parsedArguments.A;
} else if (parsedArguments["user-agent"]) {
if (!headers) {
headers = [];
}
headers["User-Agent"] = parsedArguments["user-agent"];
}
if (parsedArguments.b) {
cookieString = parsedArguments.b;
}
if (parsedArguments.cookie) {
cookieString = parsedArguments.cookie;
}
let multipartUploads;
if (parsedArguments.F) {
multipartUploads = {};
if (!Array.isArray(parsedArguments.F)) {
parsedArguments.F = [parsedArguments.F];
}
parsedArguments.F.forEach(function (multipartArgument) {
// input looks like key=value. value could be json or a file path prepended with an @
const [key, value] = multipartArgument.split("=", 2);
multipartUploads[key] = value;
});
}
if (cookieString) {
let cookieParseOptions = {
decode: function (s) {
return s;
}
};
// separate out cookie headers into separate data structure
// note: cookie is case insensitive
cookies = cookie.parse(
cookieString.replace(/^Cookie: /gi, ""),
cookieParseOptions
);
}
let method;
if (parsedArguments.X === "POST") {
method = "post";
} else if (parsedArguments.X === "PUT" || parsedArguments["T"]) {
method = "put";
} else if (parsedArguments.X === "PATCH") {
method = "patch";
} else if (parsedArguments.X === "DELETE") {
method = "delete";
} else if (parsedArguments.X === "OPTIONS") {
method = "options";
} else if (
(parsedArguments["d"] ||
parsedArguments["data"] ||
parsedArguments["data-ascii"] ||
parsedArguments["data-binary"] ||
parsedArguments["F"] ||
parsedArguments["form"]) &&
!(parsedArguments["G"] || parsedArguments["get"])
) {
method = "post";
} else if (parsedArguments["I"] || parsedArguments["head"]) {
method = "head";
} else {
method = "get";
}
let compressed = !!parsedArguments.compressed;
let urlObject = URL.parse(url); // eslint-disable-line
// if GET request with data, convert data to query string
// NB: the -G flag does not change the http verb. It just moves the data into the url.
if (parsedArguments["G"] || parsedArguments["get"]) {
urlObject.query = urlObject.query ? urlObject.query : "";
let option =
"d" in parsedArguments ? "d" : "data" in parsedArguments ? "data" : null;
if (option) {
let urlQueryString = "";
if (!url.includes("?")) {
url += "?";
} else {
urlQueryString += "&";
}
if (typeof parsedArguments[option] === "object") {
urlQueryString += parsedArguments[option].join("&");
} else {
urlQueryString += parsedArguments[option];
}
urlObject.query += urlQueryString;
url += urlQueryString;
delete parsedArguments[option];
}
}
let query = querystring.parse(urlObject.query, null, null, {
maxKeys: 10000
});
urlObject.search = null; // Clean out the search/query portion.
let request = {
url: url,
urlWithoutQuery: URL.format(urlObject)
};
if (compressed) {
request["compressed"] = true;
}
if (Object.keys(query).length > 0) {
request.query = query;
}
if (headers) {
request.headers = headers;
}
request["method"] = method;
if (cookies) {
request.cookies = cookies;
request.cookieString = cookieString.replace("Cookie: ", "");
}
if (multipartUploads) {
request.multipartUploads = multipartUploads;
}
if (parsedArguments.data) {
request.data = parsedArguments.data;
} else if (parsedArguments["data-binary"]) {
request.data = parsedArguments["data-binary"];
request.isDataBinary = true;
} else if (parsedArguments["d"]) {
request.data = parsedArguments["d"];
} else if (parsedArguments["data-ascii"]) {
request.data = parsedArguments["data-ascii"];
}
if (parsedArguments["u"]) {
request.auth = parsedArguments["u"];
}
if (parsedArguments["user"]) {
request.auth = parsedArguments["user"];
}
if (Array.isArray(request.data)) {
request.dataArray = request.data;
request.data = joinDataArguments(request.data);
}
if (parsedArguments["k"] || parsedArguments["insecure"]) {
request.insecure = true;
}
return request;
}
export default parseCurlCommand;

52
assets/js/pwa.js Normal file
View File

@@ -0,0 +1,52 @@
export default () => {
//*** Determine whether or not the PWA has been installed. ***//
// Step 1: Check local storage
let pwaInstalled = localStorage.getItem('pwaInstalled') === 'yes';
// Step 2: Check if the display-mode is standalone. (Only permitted for PWAs.)
if (!pwaInstalled && window.matchMedia('(display-mode: standalone)').matches) {
localStorage.setItem('pwaInstalled', 'yes');
pwaInstalled = true;
}
// Step 3: Check if the navigator is in standalone mode. (Again, only permitted for PWAs.)
if (!pwaInstalled && window.navigator.standalone === true) {
localStorage.setItem('pwaInstalled', 'yes');
pwaInstalled = true;
}
//*** If the PWA has not been installed, show the install PWA prompt.. ***//
let deferredPrompt = null;
window.addEventListener('beforeinstallprompt', (event) => {
deferredPrompt = event;
// Show the install button if the prompt appeared.
if (!pwaInstalled) {
document.querySelector('#installPWA').style.display = 'inline-flex';
}
});
// When the app is installed, remove install prompts.
window.addEventListener('appinstalled', (event) => {
localStorage.setItem('pwaInstalled', 'yes');
pwaInstalled = true;
document.getElementById('installPWA').style.display = 'none';
});
// When the app is uninstalled, add the prompts back
return async () => {
if (deferredPrompt) {
deferredPrompt.prompt();
let outcome = await deferredPrompt.userChoice;
if (outcome === 'accepted') {
console.log('Postwoman was installed successfully.')
} else {
console.log('Postwoman could not be installed. (Installation rejected by user.)')
}
deferredPrompt = null;
}
};
};

58
build.js Normal file
View File

@@ -0,0 +1,58 @@
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"]);
// 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);
}

7
components/README.md Normal file
View File

@@ -0,0 +1,7 @@
# COMPONENTS
**This directory is not required, you can delete it if you don't want to use it.**
The components directory contains your Vue.js Components.
_Nuxt.js doesn't supercharge these components._

210
components/autocomplete.vue Normal file
View File

@@ -0,0 +1,210 @@
<template>
<div class="autocomplete-wrapper">
<input
type="text"
:placeholder="placeholder"
v-model="value"
@input="updateSuggestions"
@keyup="updateSuggestions"
@click="updateSuggestions"
@keydown="handleKeystroke"
ref="acInput"
:spellcheck="spellcheck"
:autocapitalize="spellcheck"
:autocorrect="spellcheck"
/>
<ul
class="suggestions"
v-if="suggestions.length > 0 && suggestionsVisible"
:style="{ transform: `translate(${suggestionsOffsetLeft}px, 0)` }"
>
<li
v-for="(suggestion, index) in suggestions"
@click.prevent="forceSuggestion(suggestion)"
:class="{ active: currentSuggestionIndex === index }"
:key="index"
>{{ suggestion }}</li>
</ul>
</div>
</template>
<style lang="scss" scoped>
.autocomplete-wrapper {
position: relative;
input:focus + ul.suggestions,
ul.suggestions:hover {
display: block;
}
ul.suggestions {
display: none;
background-color: var(--atc-color);
position: absolute;
top: calc(100% - 4px);
margin: 0 4px;
left: 0;
padding: 0;
border-radius: 0 0 4px 4px;
z-index: 9999;
transition: transform 200ms ease-out;
li {
width: 100%;
display: block;
padding: 8px 16px;
font-size: 18px;
font-family: "Roboto Mono", monospace;
white-space: pre-wrap;
&:last-child {
border-radius: 0 0 4px 4px;
}
&:hover,
&.active {
background-color: var(--ac-color);
color: var(--act-color);
cursor: pointer;
}
}
}
}
</style>
<script>
const KEY_TAB = 9;
const KEY_ESC = 27;
const KEY_ARROW_UP = 38;
const KEY_ARROW_DOWN = 40;
export default {
props: {
spellcheck: {
type: Boolean,
default: true,
required: false
},
placeholder: {
type: String,
default: "Start typing...",
required: false
},
source: {
type: Array,
required: true
}
},
watch: {
value() {
this.$emit("input", this.value);
}
},
data() {
return {
value: "application/json",
selectionStart: 0,
suggestionsOffsetLeft: 0,
currentSuggestionIndex: -1,
suggestionsVisible: false
};
},
methods: {
updateSuggestions(event) {
// Hide suggestions if ESC pressed.
if (event.which && event.which === KEY_ESC) {
event.preventDefault();
this.suggestionsVisible = false;
this.currentSuggestionIndex = -1;
return;
}
// As suggestions is a reactive property, this implicitly
// causes suggestions to update.
this.selectionStart = this.$refs.acInput.selectionStart;
this.suggestionsOffsetLeft = 12 * this.selectionStart;
this.suggestionsVisible = true;
},
forceSuggestion(text) {
let input = this.value.substring(0, this.selectionStart);
this.value = input + text;
this.selectionStart = this.value.length;
this.suggestionsVisible = true;
this.currentSuggestionIndex = -1;
},
handleKeystroke(event) {
switch (event.which) {
case KEY_ARROW_UP:
event.preventDefault();
this.currentSuggestionIndex =
this.currentSuggestionIndex - 1 >= 0
? this.currentSuggestionIndex - 1
: 0;
break;
case KEY_ARROW_DOWN:
event.preventDefault();
this.currentSuggestionIndex =
this.currentSuggestionIndex < this.suggestions.length - 1
? this.currentSuggestionIndex + 1
: this.suggestions.length - 1;
break;
case KEY_TAB:
event.preventDefault();
let activeSuggestion = this.suggestions[
this.currentSuggestionIndex >= 0 ? this.currentSuggestionIndex : 0
];
if (activeSuggestion) {
let input = this.value.substring(0, this.selectionStart);
this.value = input + activeSuggestion;
}
break;
default:
break;
}
}
},
computed: {
/**
* Gets the suggestions list to be displayed under the input box.
*
* @returns {default.props.source|{type, required}}
*/
suggestions() {
let input = this.value.substring(0, this.selectionStart);
return (
this.source
.filter(entry => {
return (
entry.toLowerCase().startsWith(input.toLowerCase()) &&
input.toLowerCase() !== entry.toLowerCase()
);
})
// Cut off the part that's already been typed.
.map(entry => entry.substring(this.selectionStart))
// We only want the top 3 suggestions.
.slice(0, 3)
);
}
},
mounted() {
this.updateSuggestions({
target: this.$refs.acInput
});
}
};
</script>

View File

@@ -0,0 +1,64 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">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="My New Collection" />
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="addNewCollection">
<i class="material-icons">add</i>
<span>Create</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean
},
components: {
modal
},
data() {
return {
name: undefined
};
},
methods: {
addNewCollection() {
this.$store.commit("postwoman/addNewCollection", {
name: this.$data.name
});
this.$emit("hide-modal");
},
hideModal() {
this.$emit("hide-modal");
}
}
};
</script>

View File

@@ -0,0 +1,67 @@
<template>
<modal v-if="show" @close="show = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">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="My New Folder" />
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="addNewFolder">
<i class="material-icons">add</i>
<span>Create</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean,
collection: Object,
collectionIndex: Number
},
components: {
modal
},
data() {
return {
name: undefined
};
},
methods: {
addNewFolder() {
this.$store.commit("postwoman/addNewFolder", {
folder: { name: this.$data.name },
collectionIndex: this.$props.collectionIndex
});
this.hideModal();
},
hideModal() {
this.$emit("hide-modal");
}
}
};
</script>

View File

@@ -0,0 +1,102 @@
<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</i>
<span>{{collection.name}}</span>
</button>
</div>
<div>
<button class="icon" @click="removeCollection" v-tooltip="'Delete collection'">
<i class="material-icons">delete</i>
</button>
<button class="icon" @click="$emit('edit-collection')" v-tooltip="'Edit collection'">
<i class="material-icons">create</i>
</button>
<button class="icon" @click="$emit('add-folder')" v-tooltip="'New Folder'">
<i class="material-icons">create_new_folder</i>
</button>
</div>
</div>
<div v-show="showChildren">
<ul>
<li v-for="(folder, index) in collection.folders" :key="folder.name">
<folder
v-bind:folder="folder"
v-bind:folderIndex="index"
v-bind:collection-index="collectionIndex"
v-on:edit-folder="editFolder(collectionIndex, folder, index)"
v-on:edit-request="$emit('edit-request', $event)"
/>
</li>
<li v-if="(collection.folders.length === 0) && (collection.requests.length === 0)">
<label>Collection is empty</label>
</li>
</ul>
<ul>
<li v-for="(request, index) in collection.requests" :key="index">
<request
v-bind:request="request"
v-bind:collection-index="collectionIndex"
v-bind:folder-index="-1"
v-bind:request-index="index"
v-on:edit-request="$emit('edit-request', { request, collectionIndex, folderIndex: undefined, requestIndex: index })"
></request>
</li>
</ul>
</div>
</div>
</template>
<style scoped>
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
margin-left: 32px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import folder from "./folder";
import request from "./request";
export default {
components: {
folder,
request
},
props: {
collectionIndex: Number,
collection: Object
},
data() {
return {
showChildren: false,
selectedFolder: {}
};
},
methods: {
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
});
},
editFolder(collectionIndex, folder, folderIndex) {
this.$emit("edit-folder", { collectionIndex, folder, folderIndex });
}
}
};
</script>

View File

@@ -0,0 +1,71 @@
<template>
<modal v-if="show" @close="hideModel">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">Edit Collection</h3>
<div>
<button class="icon" @click="hideModel">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<ul>
<li>
<input type="text" v-model="name" v-bind:placeholder="editingCollection.name" />
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="saveCollection">
<i class="material-icons">save</i>
<span>Save</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean,
editingCollection: Object,
editingCollectionIndex: Number
},
components: {
modal
},
data() {
return {
name: undefined
};
},
methods: {
saveCollection() {
const collectionUpdated = {
...this.$props.editingCollection,
name: this.$data.name
};
this.$store.commit("postwoman/editCollection", {
collection: collectionUpdated,
collectionIndex: this.$props.editingCollectionIndex
});
this.$emit("hide-modal");
},
hideModel() {
this.$emit("hide-modal");
}
}
};
</script>

View File

@@ -0,0 +1,70 @@
<template>
<modal v-if="show" @close="show = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">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" v-bind:placeholder="folder.name" />
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="editFolder">
<i class="material-icons">add</i>
<span>Save</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean,
collection: Object,
collectionIndex: Number,
folder: Object,
folderIndex: Number
},
components: {
modal
},
data() {
return {
name: undefined
};
},
methods: {
editFolder() {
this.$store.commit("postwoman/editFolder", {
collectionIndex: this.$props.collectionIndex,
folder: { ...this.$props.folder, name: this.$data.name },
folderIndex: this.$props.folderIndex
});
this.hideModal();
},
hideModal() {
this.$emit("hide-modal");
}
}
};
</script>

View File

@@ -0,0 +1,126 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">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">Label</label>
<input type="text" id="selectLabel" v-model="requestUpdateData.name" :placeholder="request.name" />
<label for="selectCollection">Collection</label>
<select type="text" id="selectCollection" v-model="requestUpdateData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>Current Collection</option>
<option
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>{{ collection.name }}</option>
</select>
<label for="selectFolder">Folder</label>
<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>
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="saveRequest">
<i class="material-icons">save</i>
<span>Save</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean,
collectionIndex: Number,
folderIndex: Number,
request: Object,
requestIndex: Number
},
components: {
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: {
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", {
requestOld: this.$props.request,
requestOldCollectionIndex: this.$props.collectionIndex,
requestOldFolderIndex: this.$props.folderIndex,
requestOldIndex: this.$props.requestIndex,
requestNew: requestUpdated,
requestNewCollectionIndex: requestUpdated.collection,
requestNewFolderIndex: requestUpdated.folder
});
this.hideModal();
},
hideModal() {
this.$emit("hide-modal");
}
}
};
</script>

View File

@@ -0,0 +1,90 @@
<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>
<div>
<button class="icon" @click="removeFolder" v-tooltip="'Delete folder'">
<i class="material-icons">delete</i>
</button>
<button class="icon" @click="editFolder" v-tooltip="'Edit folder'">
<i class="material-icons">edit</i>
</button>
</div>
</div>
<div v-show="showChildren">
<ul>
<li v-for="(request, index) in folder.requests" :key="index">
<request
v-bind:request="request"
v-bind:collection-index="collectionIndex"
v-bind:folder-index="folderIndex"
v-bind:request-index="index"
v-on:edit-request="$emit('edit-request', { request, collectionIndex, folderIndex, requestIndex: index })"
></request>
</li>
<li v-if="folder.requests.length === 0">
<label>Folder is empty</label>
</li>
</ul>
</div>
</div>
</template>
<style scoped>
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
margin-left: 32px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
import request from "./request";
export default {
props: {
folder: Object,
collectionIndex: Number,
folderIndex: Number
},
components: {
request
},
data() {
return {
showChildren: false
};
},
methods: {
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
});
},
editFolder() {
this.$emit("edit-folder");
}
}
};
</script>

View File

@@ -0,0 +1,125 @@
<template>
<modal v-if="show" @close="hideModel">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">Import / Export Collections</h3>
<div>
<button class="icon" @click="hideModel">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<textarea v-model="collectionJson" rows="8"></textarea>
</div>
<div slot="footer">
<ul>
<li>
<button
class="icon"
@click="openDialogChooseFileToReplaceWith"
v-tooltip="'Replace current'"
>
<i class="material-icons">create_new_folder</i>
<span>Replace with JSON</span>
<input
type="file"
@change="replaceWithJSON"
style="display: none;"
ref="inputChooseFileToReplaceWith"
/>
</button>
</li>
<li>
<button
class="icon"
@click="openDialogChooseFileToImportFrom"
v-tooltip="'Preserve current'"
>
<i class="material-icons">folder_shared</i>
<span>Import from JSON</span>
<input
type="file"
@change="importFromJSON"
style="display: none;"
ref="inputChooseFileToImportFrom"
/>
</button>
</li>
<li>
<button class="icon" @click="exportJSON" v-tooltip="'Download file'">
<i class="material-icons">get_app</i>
<span>Export to JSON</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean
},
components: {
modal
},
computed: {
collectionJson() {
return JSON.stringify(this.$store.state.postwoman.collections, null, 2);
}
},
methods: {
hideModel() {
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);
this.$store.commit("postwoman/replaceCollections", collections);
};
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);
this.$store.commit("postwoman/importCollections", collections);
};
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);
}
}
};
</script>

View File

@@ -0,0 +1,185 @@
<!--
TODO:
- probably refactor and pass event arguments to modals directly without unpacking
-->
<template>
<div class="collections-wrapper">
<addCollection v-bind:show="showModalAdd" v-on:hide-modal="displayModalAdd(false)"></addCollection>
<editCollection
v-bind:show="showModalEdit"
v-bind:editingCollection="editingCollection"
v-bind:editingCollectionIndex="editingCollectionIndex"
v-on:hide-modal="displayModalEdit(false)"
></editCollection>
<addFolder
v-bind:show="showModalAddFolder"
v-bind:collection="editingCollection"
v-bind:collectionIndex="editingCollectionIndex"
v-on:hide-modal="displayModalAddFolder(false)"
></addFolder>
<editFolder
v-bind:show="showModalEditFolder"
v-bind:collection="editingCollection"
v-bind:collectionIndex="editingCollectionIndex"
v-bind:folder="editingFolder"
v-bind:folderIndex="editingFolderIndex"
v-on:hide-modal="displayModalEditFolder(false)"
></editFolder>
<editRequest
v-bind:show="showModalEditRequest"
v-bind:collectionIndex="editingCollectionIndex"
v-bind:folderIndex="editingFolderIndex"
v-bind:request="editingRequest"
v-bind:requestIndex="editingRequestIndex"
v-on:hide-modal="displayModalEditRequest(false)"
></editRequest>
<importExportCollections
v-bind:show="showModalImportExport"
v-on:hide-modal="displayModalImportExport(false)"
></importExportCollections>
<div class="flex-wrap">
<div>
<button class="icon" @click="displayModalAdd(true)">
<i class="material-icons">add</i>
<span>New</span>
</button>
</div>
<div>
<button class="icon" @click="displayModalImportExport(true)">
<i class="material-icons">import_export</i>
<span>Import / Export</span>
</button>
</div>
</div>
<ul>
<li v-for="(collection, index) in collections" :key="collection.name">
<collection
v-bind:collection-index="index"
v-bind:collection="collection"
v-on:edit-collection="editCollection(collection, index)"
v-on:add-folder="addFolder(collection, index)"
v-on:edit-folder="editFolder($event)"
v-on:edit-request="editRequest($event)"
></collection>
</li>
<li v-if="collections.length === 0">
<label>Collections are empty</label>
</li>
</ul>
</div>
</template>
<style lang="scss" scoped>
ul {
display: flex;
flex-direction: column;
}
</style>
<script>
import addCollection from "./addCollection";
import addFolder from "./addFolder";
import collection from "./collection";
import editCollection from "./editCollection";
import editFolder from "./editFolder";
import editRequest from "./editRequest";
import importExportCollections from "./importExportCollections";
export default {
components: {
addCollection,
addFolder,
collection,
editCollection,
editFolder,
editRequest,
importExportCollections
},
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 this.$store.state.postwoman.collections;
}
},
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);
},
addFolder(collection, collectionIndex) {
this.$data.editingCollection = collection;
this.$data.editingCollectionIndex = collectionIndex;
this.displayModalAddFolder(true);
},
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);
},
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);
},
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;
}
}
};
</script>

View File

@@ -0,0 +1,55 @@
<template>
<div class="flex-wrap">
<div>
<button class="icon" @click="selectRequest()" v-tooltip="'Use request'">
<i class="material-icons">insert_drive_file</i>
<span>{{request.name}}</span>
</button>
</div>
<div>
<button class="icon" @click="removeRequest" v-tooltip="'Delete request'">
<i class="material-icons">delete</i>
</button>
<button class="icon" @click="$emit('edit-request')" v-tooltip="'Edit request'">
<i class="material-icons">edit</i>
</button>
</div>
</div>
</template>
<style scoped>
ul {
display: flex;
flex-direction: column;
}
ul li {
display: flex;
padding-left: 16px;
border-left: 1px solid var(--brd-color);
}
</style>
<script>
export default {
props: {
request: Object,
collectionIndex: Number,
folderIndex: Number,
requestIndex: Number
},
methods: {
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
});
}
}
};
</script>

View File

@@ -0,0 +1,164 @@
<template>
<modal v-if="show" @close="hideModal">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">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">Label</label>
<input
type="text"
id="selectLabel"
v-model="requestData.name"
v-bind:placeholder="defaultRequestName"
/>
<label for="selectCollection">Collection</label>
<select type="text" id="selectCollection" v-model="requestData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>Select a Collection</option>
<option
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>{{ collection.name }}</option>
</select>
<label for="selectFolder">Folder</label>
<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>
<label for="selectRequest">Request</label>
<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>
</li>
</ul>
</div>
<div slot="footer">
<ul>
<li>
<button class="icon" @click="saveRequestAs">
<i class="material-icons">save</i>
<span>Save</span>
</button>
</li>
</ul>
</div>
</modal>
</template>
<script>
import modal from "../../components/modal";
export default {
props: {
show: Boolean,
editingRequest: Object
},
components: {
modal
},
data() {
return {
defaultRequestName: "My New 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;
}
},
computed: {
folders() {
const userSelectedAnyCollection =
this.$data.requestData.collectionIndex !== undefined;
if (!userSelectedAnyCollection) 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 requests = collection.requests;
return requests;
}
}
},
methods: {
saveRequestAs() {
const userDidntSpecifyCollection =
this.$data.requestData.collectionIndex === undefined;
if (userDidntSpecifyCollection) {
this.$toast.error("Select a 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();
},
hideModal() {
this.$emit("hide-modal");
this.$emit("hide-model"); // for backward compatibility // TODO: use fixed event
}
}
};
</script>

332
components/history.vue Normal file
View File

@@ -0,0 +1,332 @@
<template>
<pw-section class="green" icon="history" label="History" ref="history">
<ul>
<li id="filter-history">
<input
aria-label="Search"
type="text"
placeholder="search history"
:readonly="history.length === 0"
v-model="filterText"
/>
</li>
</ul>
<ul>
<li></li>
<li @click="sort_by_label()">
<label>
Label
</label>
</li>
<li @click="sort_by_time()">
<label>
Time
</label>
</li>
<li @click="sort_by_status_code()">
<label>
Status
</label>
</li>
<li @click="sort_by_url()">
<label>
URL
</label>
</li>
<li @click="sort_by_path()">
<label>
Path
</label>
</li>
<li></li>
</ul>
<virtual-list
class="virtual-list"
:class="{filled: filteredHistory.length}"
:size="54"
:remain="Math.min(5, filteredHistory.length)"
>
<ul v-for="(entry, index) in filteredHistory" :key="index" class="entry">
<li>
<button v-if="entry.usesScripts"
v-tooltip="'This entry used pre-request scripts'"
class="icon"
>
<i class="material-icons">code</i>
</button>
<button v-else
v-tooltip="'No pre-request scripts'"
class="icon"
>
<i class="material-icons">http</i>
</button>
</li>
<li>
<input
aria-label="Label"
type="text"
readonly
:value="entry.label"
placeholder="No label"
/>
</li>
<li>
<input aria-label="Time" type="text" readonly :value="entry.time" v-tooltip="entry.date" />
</li>
<li class="method-list-item">
<input
aria-label="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>
<li>
<input aria-label="URL" type="text" readonly :value="entry.url" />
</li>
<li>
<input aria-label="Path" type="text" readonly :value="entry.path" placeholder="No path" />
</li>
<div class="show-on-small-screen">
<li>
<button
v-tooltip="'Delete entry'"
class="icon"
:id="'delete-button#'+index"
@click="deleteHistory(entry)"
aria-label="Delete"
>
<i class="material-icons">delete</i>
</button>
</li>
<li>
<button
v-tooltip="'Edit entry'"
class="icon"
:id="'use-button#'+index"
@click="useHistory(entry)"
aria-label="Edit"
>
<i class="material-icons">edit</i>
</button>
</li>
</div>
</ul>
</virtual-list>
<ul :class="{hidden: filteredHistory.length != 0 || history.length === 0 }">
<li>
<label>Nothing found "{{filterText}}"</label>
</li>
</ul>
<ul v-if="history.length === 0">
<li>
<label>History is empty</label>
</li>
</ul>
<ul v-if="history.length !== 0">
<li v-if="!isClearingHistory">
<button
class="icon"
id="clear-history-button"
:disabled="history.length === 0"
@click="enableHistoryClearing"
>
<i class="material-icons">clear_all</i>
<span>Clear All</span>
</button>
</li>
<li v-else>
<div class="flex-wrap">
<label for="clear-history-button">Are you sure?</label>
<div>
<button class="icon" id="confirm-clear-history-button" @click="clearHistory">Yes</button>
<button class="icon" id="reject-clear-history-button" @click="disableHistoryClearing">No</button>
</div>
</div>
</li>
</ul>
</pw-section>
</template>
<style scoped lang="scss">
.virtual-list {
[readonly] {
cursor: default;
}
}
label {
&:hover {
cursor: pointer;
color: var(--fg-color);
}
}
@media (max-width: 720px) {
.virtual-list.filled {
min-height: 200px;
}
}
</style>
<script>
import VirtualList from "vue-virtual-scroll-list";
import section from "./section";
import { findStatusGroup } from "../pages/index";
const updateOnLocalStorage = (propertyName, property) =>
window.localStorage.setItem(propertyName, JSON.stringify(property));
export default {
components: {
"pw-section": section,
VirtualList
},
data() {
const localStorageHistory = JSON.parse(
window.localStorage.getItem("history")
);
return {
history: localStorageHistory || [],
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
};
},
computed: {
filteredHistory() {
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() {
this.history = [];
this.filterText = "";
this.disableHistoryClearing();
updateOnLocalStorage("history", this.history);
this.$toast.error("History Deleted", {
icon: "delete"
});
},
useHistory(entry) {
this.$emit("useHistory", entry);
},
findEntryStatus(entry) {
const foundStatusGroup = findStatusGroup(entry.status);
return (
foundStatusGroup || {
className: ""
}
);
},
deleteHistory(entry) {
this.history.splice(this.history.indexOf(entry), 1);
if (this.history.length === 0) {
this.filterText = "";
}
updateOnLocalStorage("history", this.history);
this.$toast.error("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;
}
}
};
</script>

56
components/logo.vue Normal file
View File

@@ -0,0 +1,56 @@
<template>
<svg
version="1.1"
id="Capa_1"
x="0px"
y="0px"
viewBox="0 0 612.001 612.001"
style="enable-background:new 0 0 612.001 612.001;"
xml:space="preserve"
>
<defs id="defs11" />
<g id="g3826" transform="translate(-516.40798,-163.88978)">
<circle
:fill="color"
transform="scale(1,-1)"
style="stroke-width:1.19531453"
r="178.70923"
cy="-501.55591"
cx="822.40845"
id="circle3814"
/>
<g id="g3820" transform="translate(516.40798,163.89028)">
<g id="g3818">
<path
:fill="color"
id="path3816"
data-old_color="#121212"
class="active-path"
data-original="#121212"
d="M 64.601,236.822 C 64.601,394.256 192.786,612 306.001,612 412.582,612 547.4,394.256 547.4,236.822 547.4,79.388 439.322,0 306,0 172.678,0 64.601,79.388 64.601,236.822 Z m 304.12,116.415 c 29.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.475 -70.598,40.195 -108.552,32.173 -8.022,-37.955 2.698,-79.078 32.173,-108.552 z M 134.727,321.063 c 37.954,-8.021 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.552 z"
/>
</g>
</g>
</g>
</svg>
</template>
<style>
#circle3814 {
/* fill: var(--fg-color); */
fill: transparent;
}
/* #path3816 {
fill: var(--bg-color);
} */
</style>
<script>
export default {
props: {
color: {
type: String
}
}
};
</script>

74
components/modal.vue Normal file
View File

@@ -0,0 +1,74 @@
<template>
<transition name="modal-fade">
<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>
<div class="modal-footer">
<slot name="footer"></slot>
</div>
</div>
</div>
</div>
</transition>
</template>
<style scoped>
.modal-backdrop {
position: fixed;
z-index: 998;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
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;
max-width: 800px;
}
.modal-container {
display: flex;
flex-grow: 1;
flex-direction: column;
margin: 8px;
padding: 12px;
transition: all 0.2s ease;
background-color: var(--bg-color);
border-radius: 8px;
box-shadow: rgba(0, 0, 0, 0.5) 0px 16px 70px;
}
/*
* 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-fade-enter,
.modal-fade-leave-active {
opacity: 0;
}
.modal-fade-enter .modal-container,
.modal-fade-leave-active .modal-container {
transform: scale(0.8);
transition: all 0.2s ease-in-out;
}
</style>

52
components/section.vue Normal file
View File

@@ -0,0 +1,52 @@
<template>
<fieldset :id="label.toLowerCase()" :class="{ 'no-colored-frames': !frameColorsEnabled }">
<legend @click.prevent="collapse">
<span>{{ label }}</span>
<i class="material-icons" v-if="isCollapsed">expand_more</i>
<i class="material-icons" v-if="!isCollapsed">expand_less</i>
</legend>
<div class="collapsible" :class="{ hidden: collapsed }">
<slot />
</div>
</fieldset>
</template>
<style>
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;
}
},
data() {
return {
isCollapsed: false
};
},
props: {
label: {
type: String,
default: "Section"
},
collapsed: {
type: Boolean
}
},
methods: {
collapse({ target }) {
const parent = target.parentNode.parentNode;
parent.querySelector(".collapsible").classList.toggle("hidden");
this.isCollapsed = !this.isCollapsed;
}
}
};
</script>

View File

@@ -0,0 +1,68 @@
<template>
<div class="color" :data-color="color">
<span :style="{backgroundColor: color}" class="preview">
<i v-if="active" class="material-icons activeTick">done</i>
</span>
{{ name || color }}
</div>
</template>
<style lang="scss">
.color {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 16px 0 4px;
margin: 4px;
background-color: var(--bg-dark-color);
color: var(--fg-color);
border-radius: 20px;
cursor: pointer;
height: 40px;
&.active {
background-color: var(--bg-dark-color);
}
.preview {
vertical-align: middle;
display: inline-block;
border-radius: 100%;
margin-right: 8px;
padding: 16px;
position: relative;
.activeTick {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #ffffff;
}
}
}
.color.vibrant {
.preview .activeTick {
color: var(--act-color);
}
}
</style>
<script>
export default {
props: {
color: {
type: String,
required: true
},
name: {
type: String
},
active: {
type: Boolean,
default: false
}
}
};
</script>

98
components/toggle.vue Normal file
View File

@@ -0,0 +1,98 @@
<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 lang="scss" scoped>
$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>

9
cypress.json Normal file
View File

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

7
database.rules.json Normal file
View File

@@ -0,0 +1,7 @@
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": false,
".write": false
}
}

View File

@@ -0,0 +1,8 @@
export default {
name: "textareaAutoHeight",
update(element) {
if (element.scrollHeight !== element.clientHeight) {
element.style.minHeight = `${element.scrollHeight}px`;
}
}
}

19
docker-compose.yml Normal file
View File

@@ -0,0 +1,19 @@
version: "3.7"
services:
web:
build:
context: .
volumes:
- "./.postwoman:/app/.postwoman"
- "./assets:/app/assets"
- "./directives:/app/directives"
- "./layouts:/app/layouts"
- "./middleware:/app/middleware"
- "./pages:/app/pages"
- "./plugins:/app/plugins"
- "./static:/app/static"
- "./store:/app/store"
ports:
- "3000:3000"
command: "npm run dev"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

22
firebase.json Normal file
View File

@@ -0,0 +1,22 @@
{
"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"
}
}

26
firestore.indexes.json Normal file
View File

@@ -0,0 +1,26 @@
{
// 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": []
}

7
firestore.rules Normal file
View File

@@ -0,0 +1,7 @@
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}

1
functions/.gitignore vendored Normal file
View File

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

8
functions/index.js Normal file
View File

@@ -0,0 +1,8 @@
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!");
// });

1915
functions/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

22
functions/package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"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
}

17
functions/preRequest.js Normal file
View File

@@ -0,0 +1,17 @@
export default function getEnvironmentVariablesFromScript(script) {
let _variables = {};
// the pw object is the proxy by which pre-request scripts can pass variables to the request.
// for security and control purposes, this is the only way a pre-request script should modify variables.
let pw = {
environment: {
set: (key, value) => _variables[key] = value,
},
// globals that the script is allowed to have access to.
};
// run pre-request script within this function so that it has access to the pw object.
(new Function('pw', script))(pw);
return _variables;
}

7
functions/templating.js Normal file
View File

@@ -0,0 +1,7 @@
export default function parseTemplateString(string, variables) {
if(!variables || !string) {
return string;
}
const searchTerm = /<<([^>]*)>>/g; // "<<myVariable>>"
return string.replace(searchTerm, (match, p1) => variables[p1] || '');
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 612.001 612.001" style="enable-background:new 0 0 612.001 612.001;" xml:space="preserve" width="512px" height="512px" class=""><g><g>
<path d="M64.601,236.822c0,157.434,128.185,375.178,241.4,375.178c106.581,0,241.399-217.744,241.399-375.178S439.322,0,306,0 S64.601,79.388,64.601,236.822z M368.721,353.237c29.475-29.475,70.598-40.195,108.552-32.173 c8.021,37.954-2.698,79.077-32.173,108.552c-29.475,29.475-70.598,40.195-108.552,32.173 C328.526,423.834,339.246,382.711,368.721,353.237z M134.727,321.063c37.954-8.021,79.077,2.698,108.552,32.173 c29.475,29.475,40.195,70.598,32.173,108.552c-37.954,8.021-79.077-2.698-108.552-32.173 C137.425,400.139,126.706,359.017,134.727,321.063z" data-original="#000000" class="active-path" data-old_color="#000000" fill="#51FF0D"/>
</g></g> </svg>

Before

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

View File

@@ -1,276 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset='utf-8'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, shrink-to-fit=no">
<title>Postwoman - API request builder</title>
<meta name="description" content="API request builder">
<link rel="icon" href="favicon.ico">
<meta itemprop="name" content="Postwoman">
<meta itemprop="description" content="API request builder">
<meta itemprop="image" content="icons/icon-192x192.png">
<!-- See https://goo.gl/OOhYW5 -->
<link rel="manifest" href="manifest.json">
<!-- See https://goo.gl/qRE0vM -->
<meta name="theme-color" content="#121212">
<!-- Add to homescreen for Chrome on Android. Fallback for manifest.json -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="application-name" content="Postwoman">
<!-- Add to homescreen for Safari on iOS -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="Postwoman">
<!-- Homescreen icons -->
<link rel="apple-touch-icon" href="icons/icon-48x48.png">
<link rel="apple-touch-icon" sizes="72x72" href="icons/icon-72x72.png">
<link rel="apple-touch-icon" sizes="96x96" href="icons/icon-96x96.png">
<link rel="apple-touch-icon" sizes="144x144" href="icons/icon-144x144.png">
<link rel="apple-touch-icon" sizes="192x192" href="icons/icon-192x192.png">
<!-- Tile icon for Windows 8 (144x144 + tile color) -->
<meta name="msapplication-TileImage" content="icons/icon-144x144.png">
<meta name="msapplication-TileColor" content="#121212">
<meta name="msapplication-tap-highlight" content="no">
<!-- OpenGraph -->
<meta property="og:site_name" content="Postwoman">
<meta property="og:url" content="https://Postwoman.ml">
<meta property="og:type" content="website">
<meta property="og:title" content="Postwoman">
<meta property="og:description" content="API request builder">
<meta property="og:image" content="icons/icon-144x144.png">
<!-- Twitter -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@liyasthomas">
<meta name="twitter:creator" content="@liyasthomas">
<meta name="twitter:url" content="https://Postwoman.ml">
<meta name="twitter:title" content="Postwoman">
<meta name="twitter:description" content="API request builder">
<meta name="twitter:image" content="icons/icon-144x144.png">
<!-- Web Fonts -->
<link href="https://fonts.googleapis.com/css?family=Poppins:500,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('sw.js').then(function(registration) {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err) {
console.log('ServiceWorker registration failed: ', err);
});
});
}
</script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js'></script>
</head>
<body>
<main id="app">
<header>
<div>
<a href="">
<h1 class="logo"><img src="icons/logo.svg" alt="" style="height: 24px; margin-right: 16px">Postwoman</h1>
</a>
<h3>API request builder</h3>
</div>
</header>
<fieldset class="request">
<legend v-on:click="collapse">Request ⭥</legend>
<div class="collapsible">
<ul>
<li>
<label for="method">Method</label>
<select v-model="method">
<option>GET</option>
<option>POST</option>
<option>PUT</option>
<option>DELETE</option>
<option>OPTIONS</option>
</select>
</li>
<li>
<label for="url">URL</label>
<input v-model="url">
</li>
<li>
<label for="path">Path</label>
<input v-model="path">
</li>
<li>
<label for="action">&nbsp;</label>
<button name="action" @click="sendRequest">Send</button>
</li>
</ul>
</div>
</fieldset>
<fieldset class="reqbody" v-if="method === 'POST' || method === 'PUT'">
<legend v-on:click="collapse">Request Body ⭥</legend>
<div class="collapsible">
<ul>
<li>
<label>Content Type</label>
<select v-model="contentType">
<option>application/json</option>
<option>www-form/urlencoded</option>
</select>
</li>
</ul>
<ol v-for="(param, index) in bodyParams">
<li>
<label :for="'bparam'+index">Key {{index + 1}}</label>
<input :name="'bparam'+index" v-model="param.key">
</li>
<li>
<label :for="'bvalue'+index">Value {{index + 1}}</label>
<input :name="'bvalue'+index" v-model="param.value">
</li>
<li>
<label for="request">&nbsp;</label>
<button name="request" @click="removeRequestBodyParam(index)">Remove</button>
</li>
</ol>
<ul>
<li>
<label for="addrequest">Action</label>
<button name="addrequest" @click="addRequestBodyParam">Add</button>
</li>
</ul>
<ul>
<li>
<label for="request">Parameter List</label>
<textarea name="request" rows="1" readonly>{{rawRequestBody || '(add atleast one parameter)'}}</textarea>
</li>
</ul>
</div>
</fieldset>
<fieldset class="authentication hidden">
<legend v-on:click="collapse">Authentication ⭥</legend>
<div class="collapsible">
<ul>
<li>
<label for="auth">Authentication Type</label>
<select v-model="auth">
<option>None</option>
<option>Basic</option>
</select>
</li>
</ul>
<ul v-if="auth === 'Basic'">
<li>
<label for="http_basic_user">User</label>
<input v-model="httpUser">
</li>
<li>
<label for="http_basic_passwd">Password</label>
<input v-model="httpPassword" type="password">
</li>
</ul>
</div>
</fieldset>
<fieldset class="parameters hidden">
<legend v-on:click="collapse">Parameters ⭥</legend>
<div class="collapsible">
<ol v-for="(param, index) in params">
<li>
<label :for="'param'+index">Key {{index + 1}}</label>
<input :name="'param'+index" v-model="param.key">
</li>
<li>
<label :for="'value'+index">Value {{index + 1}}</label>
<input :name="'value'+index" v-model="param.value">
</li>
<li>
<label for="param">&nbsp;</label>
<button name="param" @click="removeRequestParam(index)">Remove</button>
</li>
</ol>
<ul>
<li>
<label for="add">Action</label>
<button name="add" @click="addRequestParam">Add</button>
</li>
</ul>
<ul>
<li>
<label for="request">Parameter List</label>
<textarea name="request" rows="1" readonly>{{queryString || '(add atleast one parameter)'}}</textarea>
</li>
</ul>
</div>
</fieldset>
<fieldset class="response" id="response" ref="response">
<legend v-on:click="collapse">Response ⭥</legend>
<div class="collapsible">
<ul>
<li>
<label for="status">status</label>
<input name="status" type="text" readonly :value="response.status || '(waiting to send request)'">
</li>
</ul>
<ul v-for="(value, key) in response.headers">
<li>
<label for="value">{{key}}</label>
<input name="value" :value="value" readonly>
</li>
</ul>
<ul>
<li>
<label for="body">response</label>
<textarea name="body" rows="6" readonly>{{response.body || '(waiting to send request)'}}</textarea>
</li>
</ul>
</div>
</fieldset>
<footer>
<a href="https://github.com/liyasthomas/postwoman"><img src="icons/github.svg" alt="" style="margin-right: 16px">GitHub</a>
<button id="installPWA" onclick="installPWA()">
Install PWA
</button>
</footer>
</main>
<script src="script.js"></script>
<script>
let pwaInstalled = localStorage.getItem('pwaInstalled') == 'yes'
if (window.matchMedia('(display-mode: standalone)').matches) {
localStorage.setItem('pwaInstalled', 'yes')
pwaInstalled = true
}
if (window.navigator.standalone === true) {
localStorage.setItem('pwaInstalled', 'yes')
pwaInstalled = true
}
if (pwaInstalled) {
document.getElementById('installPWA').style.display = 'none'
} else {
document.getElementById('installPWA').style.display = 'block'
}
let deferredPrompt = null
window.addEventListener('beforeinstallprompt', (e) => {
deferredPrompt = e
})
async function installPWA() {
if (deferredPrompt) {
deferredPrompt.prompt()
deferredPrompt.userChoice.then(({
outcome
}) => {
if (outcome === 'accepted') {
console.log('Your PWA has been installed')
} else {
console.log('User chose to not install your PWA')
}
deferredPrompt = null
})
}
}
window.addEventListener('appinstalled', (evt) => {
localStorage.setItem('pwaInstalled', 'yes')
pwaInstalled = true
document.getElementById('installPWA').style.display = 'none'
})
</script>
</body>
</html>

12
jsconfig.json Normal file
View File

@@ -0,0 +1,12 @@
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"~/*": ["./*"],
"@/*": ["./*"],
"~~/*": ["./*"],
"@@/*": ["./*"]
}
},
"exclude": ["node_modules", ".nuxt", "dist"]
}

7
layouts/README.md Normal file
View File

@@ -0,0 +1,7 @@
# LAYOUTS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your Application Layouts.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts).

279
layouts/default.vue Normal file
View File

@@ -0,0 +1,279 @@
<template>
<div class="wrapper">
<header class="header">
<div>
<div class="slide-in">
<nuxt-link to="/">
<h1 class="logo">Postwoman</h1>
</nuxt-link>
<h3 class="tagline">API request builder</h3>
</div>
<a href="https://github.com/liyasthomas/postwoman" target="_blank" rel="noopener">
<button class="icon">
<img id="imgGitHub" src="~static/icons/github.svg" alt="GitHub" :style="logoStyle()" />
<span>GitHub</span>
</button>
</a>
</div>
</header>
<div class="content">
<div class="columns">
<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="/" :class="linkActive('/')" v-tooltip.right="'Home'" aria-label="Home">
<logo alt style="height: 24px;"></logo>
</nuxt-link>
<nuxt-link
to="/websocket"
:class="linkActive('/websocket')"
v-tooltip.right="'WebSocket'"
>
<i class="material-icons">cloud</i>
</nuxt-link>
<nuxt-link
to="/settings"
:class="linkActive('/settings')"
v-tooltip.right="'Settings'"
aria-label="Settings"
>
<i class="material-icons">settings</i>
</nuxt-link>
</nav>
<div v-if="['/'].includes($route.path)">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="'Request'">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#options" v-tooltip.right="'Options'">
<i class="material-icons">toc</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="'Response'">
<i class="material-icons">cloud_download</i>
</a>
</li>
<li>
<a href="#collections" v-tooltip.right="'Collections'">
<i class="material-icons">folder_special</i>
</a>
</li>
<li>
<a href="#history" v-tooltip.right="'History'">
<i class="material-icons">watch_later</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="['/websocket'].includes($route.path)">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="'Request'">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="'Response'">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="['/settings'].includes($route.path)">
<nav class="secondary-nav">
<ul>
<li>
<a href="#theme" v-tooltip.right="'Theme'">
<i class="material-icons">brush</i>
</a>
</li>
<li>
<a href="#proxy" v-tooltip.right="'Proxy'">
<i class="material-icons">public</i>
</a>
</li>
</ul>
</nav>
</div>
</aside>
<nuxt id="main" class="main" />
<aside class="nav-second"></aside>
</div>
</div>
<footer class="footer">
<!-- Top section of footer: GitHub/install links -->
<div class="flex-wrap">
<button class="icon" id="installPWA" @click.prevent="showInstallPrompt()">
<i class="material-icons">add_to_home_screen</i>
<span>Install PWA</span>
</button>
<button
class="icon"
onClick="window.open('https://twitter.com/share?text=👽 Postwoman • API request builder - Helps you create your requests faster, saving you precious time on your development&url=https://postwoman.io&hashtags=postwoman&via=liyasthomas');"
>
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
<path
d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"
/>
</svg>
<span>Tweet</span>
</button>
</div>
<!-- Bottom section of footer: version/author information -->
<p class="align-center">
<span v-if="version.name">
<a
v-bind:href="'https://github.com/liyasthomas/postwoman/releases/tag/' + version.name"
target="_blank"
rel="noopener"
>{{version.name}}</a>
<span v-if="version.hash">
-
<a
v-bind: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>
&#x2022;
</span> by
<a href="https://liyasthomas.web.app" target="_blank" rel="noopener">Liyas Thomas 🦄</a> &#x2022;
<a href="https://postwoman.launchaco.com" target="_blank" rel="noopener">Subscribe</a>
</p>
</footer>
</div>
</template>
<style lang="scss">
</style>
<script>
import intializePwa from "../assets/js/pwa";
import logo from "../components/logo";
import * as version from "../.postwoman/version.json";
export default {
components: {
logo
},
methods: {
linkActive(path) {
return {
"nuxt-link-exact-active": this.$route.path === path,
"nuxt-link-active": this.$route.path === path
};
}
},
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,
logoStyle() {
return (
this.$store.state.postwoman.settings.THEME_CLASS || ""
).includes("light")
? " filter: invert(100%); -webkit-filter: invert(100%);"
: "";
},
version: {}
};
},
beforeMount() {
// Set version data
this.version = version.default;
// Load theme settings
(() => {
// Apply theme from settings.
document.documentElement.className =
this.$store.state.postwoman.settings.THEME_CLASS || "";
// Load theme color data from settings, or use default color.
let color = this.$store.state.postwoman.settings.THEME_COLOR || "#50fa7b";
let vibrant = this.$store.state.postwoman.settings.THEME_COLOR_VIBRANT;
if (vibrant == null) vibrant = true;
document.documentElement.style.setProperty("--ac-color", color);
document.documentElement.style.setProperty(
"--act-color",
vibrant ? "rgb(37, 38, 40)" : "#ffffff"
);
})();
},
mounted() {
if (process.client) {
document.body.classList.add("afterLoad");
}
document
.querySelector("meta[name=theme-color]")
.setAttribute(
"content",
this.$store.state.postwoman.settings.THEME_TAB_COLOR || "#252628"
);
// 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("We use cookies", {
icon: "info",
duration: 5000,
theme: "toasted-primary",
action: [
{
text: "Dismiss",
onClick: (e, toastObject) => {
localStorage.setItem("cookiesAllowed", "yes");
toastObject.goAway(0);
}
}
]
});
}
})();
window.addEventListener("scroll", event => {
let mainNavLinks = document.querySelectorAll("nav ul li a");
let fromTop = window.scrollY;
mainNavLinks.forEach(link => {
let section = document.querySelector(link.hash);
if (
section.offsetTop <= fromTop &&
section.offsetTop + section.offsetHeight > fromTop
) {
link.classList.add("current");
} else {
link.classList.remove("current");
}
});
});
},
watch: {
$route() {
this.$toast.clear();
}
}
};
</script>

50
layouts/error.vue Normal file
View File

@@ -0,0 +1,50 @@
<template>
<div class="page page-error">
<img src="~static/icons/error.svg" alt="Error" class="error_banner" />
<h2>{{ error.statusCode }}</h2>
<h3>{{ error.message }}</h3>
<p>
<nuxt-link to="/">
<button>Go Home</button>
</nuxt-link>
</p>
<p>
<a href @click.prevent="reloadApplication">Reload</a>
</p>
</div>
</template>
<style lang="scss">
// Center the error page in the viewport.
.page-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
text-align: center;
}
.error_banner {
width: 256px;
}
</style>
<script>
export default {
props: ["error"],
methods: {
reloadApplication() {
this.$router.push("/", () => window.location.reload());
}
},
head() {
return {
bodyAttrs: {
class: "sticky-footer"
}
};
}
};
</script>

View File

@@ -1,41 +0,0 @@
{
"name": "Postwoman",
"short_name": "Postwoman",
"description": "API request builder",
"icons": [
{
"src": "icons/icon-48x48.png",
"sizes": "48x48",
"type": "image/png"
},
{
"src": "icons/icon-72x72.png",
"sizes": "72x72",
"type": "image/png"
},
{
"src": "icons/icon-96x96.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src": "icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#121212",
"background_color": "#121212"
}

7
middleware/README.md Normal file
View File

@@ -0,0 +1,7 @@
# MIDDLEWARE
<br/>
parsedefaulturl.js - parse default url for appropriate path
<br/>
<br/>
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware).

View File

@@ -0,0 +1,8 @@
export default function ({
route,
redirect
}) {
if (route.fullPath !== '/') {
return redirect('/');
}
}

299
nuxt.config.js Normal file
View File

@@ -0,0 +1,299 @@
// Some helpful application constants.
// TODO: Use these when rendering the pages (rather than just for head/meta tags...)
export const meta = {
name: "Postwoman",
shortDescription: "API request builder",
description: "The Postwoman API request builder helps you create your requests faster, saving you precious time on your development."
};
// Sets the base path for the router.
// Important for deploying to GitHub pages.
// -- Travis includes the author in the repo slug,
// so if there's a /, we need to get everything after it.
let repoName = (process.env.TRAVIS_REPO_SLUG || '').split('/').pop();
export const routerBase = process.env.DEPLOY_ENV === 'GH_PAGES' ? {
router: {
base: `/${repoName}/`
}
} : {
router: {
base: '/'
}
};
export default {
mode: 'spa',
/*
** Headers of the page
*/
server: {
host: '0.0.0.0', // default: localhost
},
head: {
title: `${meta.name} \u2022 ${meta.shortDescription}`,
meta: [{
charset: 'utf-8'
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1, minimum-scale=1, shrink-to-fit=no, minimal-ui'
},
{
hid: 'description',
name: 'description',
content: meta.description || ''
},
{
name: 'keywords',
content: 'postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket'
},
{
name: 'X-UA-Compatible',
content: "IE=edge, chrome=1"
},
{
itemprop: "name",
content: `${meta.name} \u2022 ${meta.shortDescription}`
},
{
itemprop: "description",
content: meta.description
},
{
itemprop: "image",
content: `${routerBase.router.base}icons/icon-192x192.png`
},
// Add to homescreen for Chrome on Android. Fallback for PWA (handled by nuxt)
{
name: 'application-name',
content: meta.name
},
// Add to homescreen for Safari on iOS
{
name: 'apple-mobile-web-app-capable',
content: 'yes'
},
{
name: 'apple-mobile-web-app-status-bar-style',
content: 'black-translucent'
},
{
name: 'apple-mobile-web-app-title',
content: meta.name
},
// Windows phone tile icon
{
name: 'msapplication-TileImage',
content: `${routerBase.router.base}icons/icon-144x144.png`
},
{
name: 'msapplication-TileColor',
content: '#252628'
},
{
name: 'msapplication-tap-highlight',
content: 'no'
},
// OpenGraph
{
property: 'og:site_name',
content: meta.name
},
{
property: 'og:url',
content: 'https://postwoman.io'
},
{
property: 'og:type',
content: 'website'
},
{
property: 'og:title',
content: `${meta.name} \u2022 ${meta.shortDescription}`
},
{
property: 'og:description',
content: meta.description
},
{
property: 'og:image',
content: `${routerBase.router.base}icons/icon-144x144.png`
},
// Twitter
{
name: 'twitter:card',
content: "summary"
},
{
name: 'twitter:site',
content: "@liyasthomas"
},
{
name: 'twitter:creator',
content: "@liyasthomas"
},
{
name: 'twitter:url',
content: "https://postwoman.io"
},
{
name: 'twitter:title',
content: meta.name
},
{
name: 'twitter:description',
content: meta.shortDescription
},
{
name: 'twitter:image',
content: `${routerBase.router.base}icons/icon-144x144.png`
},
],
link: [{
rel: 'icon',
type: 'image/x-icon',
href: `${routerBase.router.base}favicon.ico`
},
// Home-screen icons (iOS)
{
rel: 'apple-touch-icon',
href: `${routerBase.router.base}icons/icon-48x48.png`
},
{
rel: 'apple-touch-icon',
sizes: '72x72',
href: `${routerBase.router.base}icons/icon-72x72.png`
},
{
rel: 'apple-touch-icon',
sizes: '96x96',
href: `${routerBase.router.base}icons/icon-96x96.png`
},
{
rel: 'apple-touch-icon',
sizes: '144x144',
href: `${routerBase.router.base}icons/icon-144x144.png`
},
{
rel: 'apple-touch-icon',
sizes: '192x192',
href: `${routerBase.router.base}icons/icon-192x192.png`
},
]
},
/*
** Customize the progress-bar color
*/
loading: {
color: 'var(--ac-color)'
},
/*
** Customize the loading indicator
*/
loadingIndicator: {
name: 'pulse',
color: 'var(--ac-color)',
background: 'var(--bg-color)'
},
/*
** Global CSS
*/
css: [
'@/assets/css/themes.scss',
'@/assets/css/fonts.scss',
'@/assets/css/styles.scss'
],
/*
** Plugins to load before mounting the App
*/
plugins: [{
src: '~/plugins/vuex-persist'
},
{
src: '~/plugins/v-tooltip'
}
],
/*
** Nuxt.js dev-modules
*/
buildModules: [],
/*
** Nuxt.js modules
*/
modules: [
// See https://goo.gl/OOhYW5
['@nuxtjs/pwa'],
['@nuxtjs/axios'],
['@nuxtjs/toast'],
['@nuxtjs/google-analytics'],
['@nuxtjs/sitemap'],
['@nuxtjs/google-tag-manager', {
id: process.env.GTM_ID || 'GTM-MXWD8NQ'
}],
['@nuxtjs/robots']
],
pwa: {
manifest: {
name: meta.name,
short_name: meta.name,
display: "standalone",
theme_color: "#252628",
background_color: "#252628",
start_url: `${routerBase.router.base}`
},
meta: {
description: meta.shortDescription,
theme_color: "#252628",
},
icons: ((sizes) => {
let icons = [];
for (let size of sizes) {
icons.push({
"src": `${routerBase.router.base}icons/icon-${size}x${size}.png`,
"type": "image/png",
"sizes": `${size}x${size}`
});
}
return icons;
})([48, 72, 96, 144, 192, 512])
},
toast: {
position: 'bottom-center',
duration: 3000,
theme: 'bubble',
keepOnHover: true
},
googleAnalytics: {
id: process.env.GA_ID || 'UA-61422507-2'
},
sitemap: {
hostname: 'https://postwoman.io'
},
robots: {
UserAgent: '*',
Disallow: '',
Allow: '/',
Sitemap: 'https://postwoman.io/sitemap.xml'
},
/*
** Build configuration
*/
build: {
/*
** You can extend webpack config here
*/
extend(config, ctx) {}
},
/*
** Generate configuration
*/
generate: {
fallback: true
},
/*
** Router configuration
*/
...routerBase
}

12364
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,42 @@
{
"name": "Banner",
"repository": {
"type": "git",
"url": "https://github.com/liyasthomas/banner.git"
},
"description": "A simple and clean banner generator",
"author": "liyasthomas",
"version": "0.1.9",
"devDependencies": {
"jshint": "^2.10.2"
},
"scripts": {
"test": "jshint travis.js"
}
"name": "postwoman",
"version": "1.0.0",
"description": "A free, fast, and beautiful API request builder",
"author": "liyasthomas",
"private": true,
"scripts": {
"predev": "node build.js --dev",
"dev": "nuxt",
"prebuild": "node build.js",
"build": "nuxt build",
"start": "nuxt start",
"pregenerate": "node build.js",
"generate": "nuxt generate",
"e2e": "cypress run",
"e2e:open": "cypress open",
"dev:e2e": "start-server-and-test dev http://localhost:3000 e2e:open",
"test": "start-server-and-test dev http://localhost:3000 e2e"
},
"dependencies": {
"@nuxtjs/axios": "^5.8.0",
"@nuxtjs/google-analytics": "^2.2.1",
"@nuxtjs/google-tag-manager": "^2.3.1",
"@nuxtjs/pwa": "^3.0.0-beta.19",
"@nuxtjs/robots": "^2.4.2",
"@nuxtjs/sitemap": "^2.0.0",
"@nuxtjs/toast": "^3.3.0",
"highlight.js": "^9.16.2",
"nuxt": "^2.10.2",
"v-tooltip": "^2.0.2",
"vue-virtual-scroll-list": "^1.4.2",
"vuejs-auto-complete": "^0.9.0",
"vuex-persist": "^2.1.1",
"yargs-parser": "^16.1.0"
},
"devDependencies": {
"cypress": "^3.6.0",
"node-sass": "^4.13.0",
"sass-loader": "^7.3.1",
"start-server-and-test": "^1.10.6"
}
}

6
pages/README.md Normal file
View File

@@ -0,0 +1,6 @@
# PAGES
This directory contains your Application Views and Routes.
The framework reads all the `*.vue` files inside this directory and creates the router of your application.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing).

1769
pages/index.vue Normal file

File diff suppressed because it is too large Load Diff

279
pages/settings.vue Normal file
View File

@@ -0,0 +1,279 @@
<template>
<div class="page">
<pw-section class="cyan" label="Theme" ref="theme">
<ul>
<li>
<h3 class="title">Background</h3>
<div class="backgrounds">
<span
:key="theme.class"
@click="applyTheme(theme.class, theme.color)"
v-for="theme in themes"
>
<swatch
:active="settings.THEME_CLASS === theme.class"
:class="{ vibrant: theme.vibrant }"
:color="theme.color"
:name="theme.name"
></swatch>
</span>
</div>
</li>
</ul>
<ul>
<li>
<h3 class="title">Color</h3>
<div class="colors">
<span
:key="entry.color"
@click.prevent="setActiveColor(entry.color, entry.vibrant)"
v-for="entry in colors"
>
<swatch
:active="settings.THEME_COLOR === entry.color.toUpperCase()"
:class="{ vibrant: entry.vibrant }"
:color="entry.color"
:name="entry.name"
/>
</span>
</div>
</li>
</ul>
<ul>
<li>
<h3 class="title">Labels</h3>
<span>
<pw-toggle
:on="settings.FRAME_COLORS_ENABLED"
@change="toggleSetting('FRAME_COLORS_ENABLED')"
>Multi-color {{ settings.FRAME_COLORS_ENABLED ? "Enabled" : "Disabled" }}</pw-toggle>
</span>
</li>
</ul>
</pw-section>
<br />
<pw-section class="blue" label="Proxy" ref="proxy">
<ul>
<li>
<span>
<pw-toggle
:on="settings.PROXY_ENABLED"
@change="toggleSetting('PROXY_ENABLED')"
>Proxy {{ settings.PROXY_ENABLED ? "enabled" : "disabled" }}</pw-toggle>
</span>
</li>
</ul>
<ul class="info">
<li>
<p>
Postwoman's Proxy is hosted by ApolloTV.
<br />Read the ApolloTV privacy policy
<a
href="https://apollotv.xyz/legal"
target="_blank"
>here</a>.
</p>
</li>
</ul>
<!--
PROXY SETTINGS URL AND KEY
--------------
This feature is currently not finished.
<ul>
<li>
<label for="url">URL</label>
<input id="url" type="url" v-model="settings.PROXY_URL" :disabled="!settings.PROXY_ENABLED">
</li>
<li>
<label for="key">Key</label>
<input id="key" type="password" v-model="settings.PROXY_KEY" :disabled="!settings.PROXY_ENABLED" @change="applySetting('PROXY_KEY', $event)">
</li>
</ul>
-->
</pw-section>
</div>
</template>
<style scoped>
.info {
margin-left: 4px;
color: var(--fg-light-color);
}
</style>
<script>
import section from "../components/section";
import swatch from "../components/settings/swatch";
import toggle from "../components/toggle";
export default {
components: {
"pw-section": section,
"pw-toggle": toggle,
swatch: swatch
},
data() {
return {
// NOTE:: You need to first set the CSS for your theme in /assets/css/themes.scss
// You should copy the existing light theme as a template and then just
// set the relevant values.
themes: [
{
color: "#252628",
name: "Kinda Dark",
class: ""
},
{
color: "#ffffff",
name: "Clearly White",
vibrant: true,
class: "light"
},
{
color: "#000000",
name: "Just Black",
class: "black"
},
{
color: "var(--bg-color)",
name: "Auto (system)",
vibrant: window.matchMedia("(prefers-color-scheme: light)").matches,
class: "auto"
}
],
// You can define a new color here! It will simply store the color value.
colors: [
// If the color is vibrant, black is used as the active foreground color.
{
color: "#50fa7b",
name: "Green",
vibrant: true
},
{
color: "#f1fa8c",
name: "Yellow",
vibrant: true
},
{
color: "#ff79c6",
name: "Pink",
vibrant: true
},
{
color: "#ff5555",
name: "Red",
vibrant: false
},
{
color: "#bd93f9",
name: "Purple",
vibrant: true
},
{
color: "#ffb86c",
name: "Orange",
vibrant: true
},
{
color: "#8be9fd",
name: "Cyan",
vibrant: true
},
{
color: "#57b5f9",
name: "Blue",
vibrant: false
}
],
settings: {
THEME_CLASS: this.$store.state.postwoman.settings.THEME_CLASS || "",
THEME_COLOR: "",
THEME_TAB_COLOR: "",
THEME_COLOR_VIBRANT: true,
FRAME_COLORS_ENABLED:
this.$store.state.postwoman.settings.FRAME_COLORS_ENABLED || false,
PROXY_ENABLED:
this.$store.state.postwoman.settings.PROXY_ENABLED || false,
PROXY_URL: this.$store.state.postwoman.settings.PROXY_URL || "",
PROXY_KEY: this.$store.state.postwoman.settings.PROXY_KEY || ""
}
};
},
watch: {
proxySettings: {
deep: true,
handler(value) {
this.applySetting("PROXY_URL", value.url);
this.applySetting("PROXY_KEY", value.key);
}
}
},
methods: {
applyTheme(name, color) {
this.applySetting("THEME_CLASS", name);
document
.querySelector("meta[name=theme-color]")
.setAttribute("content", color);
this.applySetting("THEME_TAB_COLOR", color);
document.documentElement.className = name;
let imgGitHub = document.getElementById("imgGitHub");
imgGitHub.style["filter"] = "";
imgGitHub.style["webkit-filter"] = "invert(100%)";
if (name.includes("light")) {
imgGitHub.style["filter"] = "invert(100%)";
imgGitHub.style["webkit-filter"] = "invert(100%)";
}
},
setActiveColor(color, vibrant) {
// By default, the color is vibrant.
if (vibrant == null) vibrant = true;
document.documentElement.style.setProperty("--ac-color", color);
document.documentElement.style.setProperty(
"--act-color",
vibrant ? "rgb(37, 38, 40)" : "#f8f8f2"
);
this.applySetting("THEME_COLOR", color.toUpperCase());
this.applySetting("THEME_COLOR_VIBRANT", vibrant);
},
getActiveColor() {
// This strips extra spaces and # signs from the strings.
const strip = str => str.replace(/#/g, "").replace(/ /g, "");
return `#${strip(
window
.getComputedStyle(document.documentElement)
.getPropertyValue("--ac-color")
).toUpperCase()}`;
},
applySetting(key, value) {
this.settings[key] = value;
this.$store.commit("postwoman/applySetting", [key, value]);
},
toggleSetting(key) {
this.settings[key] = !this.settings[key];
this.$store.commit("postwoman/applySetting", [key, this.settings[key]]);
this.$router.replace("/settings", {
force: true
});
}
},
beforeMount() {
this.settings.THEME_COLOR = this.getActiveColor();
},
computed: {
proxySettings() {
return {
url: this.settings.PROXY_URL,
key: this.settings.PROXY_KEY
};
}
}
};
</script>

244
pages/websocket.vue Normal file
View File

@@ -0,0 +1,244 @@
<template>
<div class="page">
<pw-section class="blue" label="Request" ref="request">
<ul>
<li>
<label for="url">URL</label>
<input
id="url"
type="url"
:class="{ error: !urlValid }"
v-model="url"
@keyup.enter="urlValid ? toggleConnection() : null"
/>
</li>
<li>
<label for="connect" class="hide-on-small-screen">&nbsp;</label>
<button :disabled="!urlValid" id="connect" name="connect" @click="toggleConnection">
{{ toggleConnectionVerb }}
<span>
<i class="material-icons" v-if="!connectionState">sync</i>
<i class="material-icons" v-if="connectionState">sync_disabled</i>
</span>
</button>
</li>
</ul>
</pw-section>
<br />
<pw-section class="purple" label="Communication" id="response" ref="response">
<ul>
<li>
<label for="log">Log</label>
<div id="log" name="log" class="log">
<span v-if="communication.log">
<span
v-for="(logEntry, index) in communication.log"
:style="{ color: logEntry.color }"
:key="index"
>@ {{ logEntry.ts }} {{ getSourcePrefix(logEntry.source) }} {{ logEntry.payload }}</span>
</span>
<span v-else>(waiting for connection)</span>
</div>
</li>
</ul>
<ul>
<li>
<label for="message">Message</label>
<input
id="message"
name="message"
type="text"
v-model="communication.input"
:readonly="!connectionState"
@keyup.enter="connectionState ? sendMessage() : null"
/>
</li>
<li>
<label for="send" class="hide-on-small-screen">&nbsp;</label>
<button id="send" name="send" :disabled="!connectionState" @click="sendMessage">
Send
<span>
<i class="material-icons">send</i>
</span>
</button>
</li>
</ul>
</pw-section>
</div>
</template>
<style lang="scss">
div.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: 18px;
font-family: "Roboto Mono", monospace;
}
span {
display: block;
white-space: pre-wrap;
}
}
</style>
<script>
import section from "../components/section";
export default {
components: {
"pw-section": section
},
data() {
return {
connectionState: false,
url: "wss://echo.websocket.org",
socket: null,
communication: {
log: null,
input: ""
}
};
},
computed: {
toggleConnectionVerb() {
return !this.connectionState ? "Connect" : "Disconnect";
},
urlValid() {
const pattern = new RegExp(
"^(wss?:\\/\\/)?" +
"((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" +
"((\\d{1,3}\\.){3}\\d{1,3}))" +
"(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" +
"(\\?[;&a-z\\d%_.~+=-]*)?" +
"(\\#[-a-z\\d_]*)?$",
"i"
);
return pattern.test(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: `Connecting to ${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: `Connected to ${this.url}.`,
source: "info",
color: "var(--ac-color)",
ts: new Date().toLocaleTimeString()
}
];
this.$toast.success("Connected", {
icon: "sync"
});
};
this.socket.onerror = event => {
this.handleError();
};
this.socket.onclose = event => {
this.connectionState = false;
this.communication.log.push({
payload: `Disconnected from ${this.url}.`,
source: "info",
color: "#ff5555",
ts: new Date().toLocaleTimeString()
});
this.$toast.error("Disconnected", {
icon: "sync_disabled"
});
};
this.socket.onmessage = event => {
this.communication.log.push({
payload: event.data,
source: "server",
ts: new Date().toLocaleTimeString()
});
};
} catch (ex) {
this.handleError(ex);
this.$toast.error("Something went wrong!", {
icon: "error"
});
}
},
disconnect() {
if (this.socket != null) this.socket.close();
},
handleError(error) {
this.disconnect();
this.connectionState = false;
this.communication.log.push({
payload: `An error has 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 = "";
},
collapse({ target }) {
const el = target.parentNode.className;
document.getElementsByClassName(el)[0].classList.toggle("hidden");
},
getSourcePrefix(source) {
const sourceEmojis = {
// Source used for info messages.
info: "\t [INFO]:\t",
// Source used for client to server messages.
client: "\t👽 [SENT]:\t",
// Source used for server to client messages.
server: "\t📥 [RECEIVED]:\t"
};
if (Object.keys(sourceEmojis).includes(source))
return sourceEmojis[source];
return "";
}
},
updated: function() {
this.$nextTick(function() {
var divLog = document.getElementById("log");
divLog.scrollBy(0, divLog.scrollHeight + 100);
});
}
};
</script>

7
plugins/README.md Normal file
View File

@@ -0,0 +1,7 @@
# PLUGINS
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains Javascript plugins that you want to run before mounting the root Vue.js application.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/plugins).

4
plugins/v-tooltip.js Normal file
View File

@@ -0,0 +1,4 @@
import Vue from 'vue';
import VTooltip from 'v-tooltip';
Vue.use(VTooltip);

7
plugins/vuex-persist.js Normal file
View File

@@ -0,0 +1,7 @@
import VuexPersistence from "vuex-persist";
export default ({
store
}) => {
new VuexPersistence().plugin(store);
}

123
script.js
View File

@@ -1,123 +0,0 @@
const parseHeaders = xhr => {
const headers = xhr.getAllResponseHeaders().trim().split(/[\r\n]+/)
const headerMap = {}
headers.forEach(line => {
const parts = line.split(': ')
const header = parts.shift().toLowerCase()
const value = parts.join(': ')
headerMap[header] = value
})
return headerMap
}
const app = new Vue({
el: '#app',
data: {
method: 'GET',
url: 'https://yesno.wtf',
auth: 'None',
path: '/api',
httpUser: '',
httpPassword: '',
params: [],
bodyParams: [],
contentType: 'application/json',
response: {
status: '',
headers: '',
body: ''
}
},
computed: {
rawRequestBody() {
const {
bodyParams
} = this
if (this.contentType === 'application/json') {
try {
const obj = JSON.parse(`{${bodyParams.filter(({ key }) => !!key).map(({ key, value }) => `
"${key}": "${value}"
`).join()}}`)
return JSON.stringify(obj)
} catch (ex) {
return 'invalid'
}
} else {
return bodyParams
.filter(({
key
}) => !!key)
.map(({
key,
value
}) => `${key}=${encodeURIComponent(value)}`).join('&')
}
},
queryString() {
const result = this.params
.filter(({
key
}) => !!key)
.map(({
key,
value
}) => `${key}=${encodeURIComponent(value)}`).join('&')
return result == '' ? '' : `?${result}`
}
},
methods: {
collapse({
target
}) {
const el = target.parentNode.className
document.getElementsByClassName(el)[0].classList.toggle('hidden')
},
sendRequest() {
this.$refs.response.scrollIntoView({
behavior: 'smooth'
})
this.response.status = 'Fetching...'
this.response.body = 'Loading...'
const xhr = new XMLHttpRequest()
const user = this.auth === 'Basic' ? this.httpUser : null
const pswd = this.auth === 'Basic' ? this.httpPassword : null
xhr.open(this.method, this.url + this.path + this.queryString, true, user, pswd)
if (this.method === 'POST' || this.method === 'PUT') {
const requestBody = this.rawRequestBody
xhr.setRequestHeader('Content-Length', requestBody.length)
xhr.setRequestHeader('Content-Type', `${this.contentType}; charset=utf-8`)
xhr.send(requestBody)
} else {
xhr.send()
}
xhr.onload = e => {
this.response.status = xhr.status
const headers = this.response.headers = parseHeaders(xhr)
if ((headers['content-type'] || '').startsWith('application/json')) {
this.response.body = JSON.stringify(JSON.parse(xhr.responseText), null, 2)
} else {
this.response.body = xhr.responseText
}
}
},
addRequestParam() {
this.params.push({
key: '',
value: ''
})
return false
},
removeRequestParam(index) {
this.params.splice(index, 1)
},
addRequestBodyParam() {
this.bodyParams.push({
key: '',
value: ''
})
return false
},
removeRequestBodyParam(index) {
this.bodyParams.splice(index, 1)
}
}
})

16
static/.htaccess Normal file
View File

@@ -0,0 +1,16 @@
<IfModule mod_expires.c>
ExpiresActive On
# Images
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# CSS, JavaScript
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>

1
static/CNAME Normal file
View File

@@ -0,0 +1 @@
postwoman.io

11
static/README.md Normal file
View File

@@ -0,0 +1,11 @@
# STATIC
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your static files.
Each file inside this directory is mapped to `/`.
Thus you'd want to delete this README.md before deploying to production.
Example: `/static/robots.txt` is mapped as `/robots.txt`.
More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).

BIN
static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

1
static/icons/error.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

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