Compare commits

..

645 Commits

Author SHA1 Message Date
Liyas Thomas
f2b4aec4dd 🔖 v1.9.7 2020-05-12 19:50:34 +05:30
Liyas Thomas
bad0604d0c 🚑 Critical dotenv hotfix 2020-05-12 19:15:17 +05:30
Liyas Thomas
a8ba2bf70f 🔖 dotenv 2020-05-12 17:51:39 +05:30
Liyas Thomas
da85a7ca87 🐛 Fixing save Collections/Environments on enabling sync 2020-05-12 15:37:32 +05:30
Liyas Thomas
2a9cc0eebf Merge pull request #856 from liyasthomas/feat/dotenv 2020-05-12 15:14:34 +05:30
Liyas Thomas
e0ee4f5249 Merge branch 'master' into feat/dotenv 2020-05-12 13:34:34 +05:30
Liyas Thomas
2ffb6d6a9d dotenv 2020-05-12 13:29:02 +05:30
Liyas Thomas
c285217ed2 📦 Updating compiled files or packages 2020-05-12 08:27:58 +05:30
Liyas Thomas
c30a0b534c Merge pull request #864 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/sitemap-2.3.0 2020-05-12 06:37:41 +05:30
dependabot-preview[bot]
ff0b35fd01 chore(deps): bump @nuxtjs/sitemap from 2.2.1 to 2.3.0
Bumps [@nuxtjs/sitemap](https://github.com/nuxt-community/sitemap-module) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/nuxt-community/sitemap-module/releases)
- [Changelog](https://github.com/nuxt-community/sitemap-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/sitemap-module/compare/v2.2.1...v2.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-12 00:56:41 +00:00
Liyas Thomas
c11161d294 Merge branch 'master' into feat/dotenv 2020-05-12 00:20:59 +05:30
Liyas Thomas
26c05586e7 Merge pull request #863 from liyasthomas/all-contributors/add-sboulema 2020-05-11 19:44:08 +05:30
allcontributors[bot]
1a3ff5dbb7 docs: update .all-contributorsrc [skip ci] 2020-05-11 14:07:14 +00:00
allcontributors[bot]
942ef6a752 docs: update README.md [skip ci] 2020-05-11 14:07:13 +00:00
Liyas Thomas
f88158e61f Merge pull request #862 from sboulema/feature/#759
We're currently facing a delayed production deploy issue with Netlify. Kindly be patient while changes are propagated to live site. Hopefully Netlify will fix this technical issue asap. I'll ping once changes are up on live.
2020-05-11 15:23:58 +05:30
Samir Boulema
d447029cdc Merge branch 'master' into feature/#759 2020-05-11 11:20:15 +02:00
Samir L. Boulema
39a7d73430 Allow importing environment variables via Postman environment json files 2020-05-11 11:15:42 +02:00
Liyas Thomas
5c31cf5c4d Merge pull request #857 from Hydrophobefireman/master 2020-05-11 14:22:52 +05:30
Hydrophobefireman
7c941bbc25 Merge branch 'master' into master 2020-05-11 13:55:20 +05:30
Liyas Thomas
44ef2cf02c Merge pull request #861 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.11.1 2020-05-11 06:03:04 +05:30
dependabot-preview[bot]
38949bf4b0 chore(deps): bump nuxt-i18n from 6.11.0 to 6.11.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.11.0 to 6.11.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.11.0...v6.11.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 00:28:57 +00:00
Hydrophobefireman
e0aede3fc4 Update index.vue 2020-05-10 21:26:44 +05:30
Hydrophobefireman
fec3c309be fix for xhr and keep code style intact 2020-05-10 20:48:12 +05:30
Hydrophobefireman
764d001ef6 produce valid output when showing/copying code
Currently when copying a json request as fetch, it outputs a javascript object instead of a stringified version, which is not valid for a fetch request.
2020-05-10 20:44:51 +05:30
Liyas Thomas
6f034ad878 dotenv 2020-05-10 13:18:40 +05:30
Liyas Thomas
b598d846bb dotenv 2020-05-10 12:36:40 +05:30
Liyas Thomas
e3fb11cce0 dotenv 2020-05-10 12:17:25 +05:30
Liyas Thomas
d4aa3699f2 dotenv 2020-05-10 12:10:17 +05:30
Liyas Thomas
80d0925ed7 🐛 Fixed #731 2020-05-10 07:10:32 +05:30
Liyas Thomas
77471a5f56 Merge pull request #851 from sboulema/feature/environment-variables-in-collections-#642
Environment variables in collections
2020-05-09 06:18:52 +05:30
Samir L. Boulema
c655d55197 Always save non replaced uri, but display replaced url in the UI 2020-05-08 23:04:02 +02:00
Samir Boulema
ab6de361ab Merge branch 'master' into feature/environment-variables-in-collections-#642 2020-05-08 17:27:52 +02:00
Liyas Thomas
113210b08e Merge pull request #854 from sboulema/feature/save-collections-on-account-sync-turn-on-#679 2020-05-08 20:44:38 +05:30
Liyas Thomas
db43181733 Merge branch 'master' into feature/save-collections-on-account-sync-turn-on-#679 2020-05-08 20:29:03 +05:30
Samir L. Boulema
d60939211a Save Collections/Environments on enabling sync 2020-05-08 16:34:53 +02:00
Samir Boulema
7c945a674d Merge branch 'master' into feature/environment-variables-in-collections-#642 2020-05-08 09:53:27 +02:00
Liyas Thomas
f0a70d945a Merge pull request #853 from liyasthomas/dependabot/npm_and_yarn/firebase-7.14.3 2020-05-08 06:39:01 +05:30
dependabot-preview[bot]
fdca00b198 chore(deps): bump firebase from 7.14.2 to 7.14.3
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.14.2 to 7.14.3.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.14.2...firebase@7.14.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-08 00:30:44 +00:00
Samir L. Boulema
8b961fb8cd Environment variables in collections #642 2020-05-07 20:54:38 +02:00
Andrew Bastin
7e3c775f70 Merge pull request #847 from sboulema/feature/add-format-body-option-#767
Add format body option
2020-05-07 03:19:09 -04:00
Samir L. Boulema
a25b0d0349 Only show prettify button when raw input is enabled 2020-05-07 09:14:10 +02:00
Samir L. Boulema
5c5fa5c4bc Only show prettify button when request body is JSON 2020-05-06 23:02:22 +02:00
Samir L. Boulema
98cb9b3234 Add format body option 2020-05-06 21:23:50 +02:00
Liyas Thomas
eb5f51249b Merge pull request #846 from AndrewBastin/feat/cache-gql-docs
Save GraphQL Docs
2020-05-06 06:45:47 +05:30
Andrew Bastin
d81c45fef1 Merge remote-tracking branch 'upstream/master' into feat/cache-gql-docs 2020-05-05 17:41:44 -04:00
Andrew Bastin
22178a6c2e Docs are persisted and regenerated from the schema introspection data 2020-05-05 17:28:43 -04:00
Andrew Bastin
6644e3b606 Refactor Docs generation from GQL Schema to a separate function 2020-05-05 17:22:59 -04:00
Andrew Bastin
d42f842b2f Added store entry to store GQL schema introspection data 2020-05-05 17:22:04 -04:00
Liyas Thomas
9163e27a5f Merge pull request #840 from sboulema/feature/URL-Path-Parameters-#834
URL Path Parameters #834
2020-05-05 22:43:21 +05:30
Liyas Thomas
f4d6958491 Merge branch 'master' into feature/URL-Path-Parameters-#834 2020-05-05 22:34:18 +05:30
Samir L. Boulema
9cb6486c71 Proper path parameter replacement 2020-05-05 14:12:41 +02:00
Liyas Thomas
ad7bff102d Merge pull request #844 from liyasthomas/dependabot/npm_and_yarn/node-sass-4.14.1 2020-05-05 17:11:37 +05:30
dependabot-preview[bot]
3a8b31a5a7 chore(deps-dev): bump node-sass from 4.14.0 to 4.14.1
Bumps [node-sass](https://github.com/sass/node-sass) from 4.14.0 to 4.14.1.
- [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.14.0...v4.14.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-05 11:34:01 +00:00
Liyas Thomas
5461392516 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2020-05-05 16:59:38 +05:30
Liyas Thomas
fc90ca3815 🌐 Internationalization and localization 2020-05-05 16:57:41 +05:30
Andrew Bastin
ec2f4ea547 Added eslint and eslint-plugin vue as dev dependency 2020-05-05 01:23:25 -04:00
Andrew Bastin
5f06eb5116 Fixed typo in default state gql query value 2020-05-05 00:27:45 -04:00
Liyas Thomas
ae10af2464 Merge pull request #842 from AndrewBastin/cleanup/remove-index-conflict-file
Remove not-deleted index.vue merge file
2020-05-05 06:06:05 +05:30
Andrew Bastin
9092c06e71 Remove not-deleted index.vue merge file 2020-05-04 17:52:35 -04:00
Samir Boulema
54e0130216 Merge branch 'master' into feature/URL-Path-Parameters-#834 2020-05-03 13:36:24 +02:00
Liyas Thomas
0fc47e07d4 💄 Moved response body up, near to response status 2020-05-03 15:49:38 +05:30
Liyas Thomas
ae72c5a8fe Merge pull request #839 from liyasthomas/deps
chore(deps): remove stale dependency
2020-05-03 15:08:37 +05:30
jamesgeorge007
a65a4796ca chore: remove stale dep 2020-05-03 13:04:05 +05:30
Andrew Bastin
4789b76e66 Merge pull request #838 from AndrewBastin/feat/gql-query-highlight
GraphQL Query Editor Syntax Highlighting
2020-05-02 20:44:48 -04:00
Andrew Bastin
7b52637c5f Removed unnecessary lang parameter for GQL Query Editor 2020-05-02 15:42:02 -04:00
Andrew Bastin
db2429d1cb Added syntax highlighting to GQL Queries 2020-05-02 15:42:02 -04:00
Samir L. Boulema
25f014ef3b URL Path Parameters #834 2020-05-02 19:34:16 +02:00
Liyas Thomas
44cff354f2 Merge pull request #835 from jameslahm/master
chore(store): better code structure
2020-05-02 20:21:40 +05:30
Liyas Thomas
6276c1df97 Merge branch 'master' into master 2020-05-02 13:41:58 +05:30
Liyas Thomas
8c2420fd03 Merge pull request #837 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.2.2 2020-05-02 13:30:14 +05:30
dependabot-preview[bot]
011b19b62d chore(deps-dev): bump lint-staged from 10.2.1 to 10.2.2
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.1 to 10.2.2.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.1...v10.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-02 07:38:37 +00:00
wangao
fbd41bc2d8 chore(store): better code structure 2020-05-01 22:45:12 +08:00
Liyas Thomas
950d9b1a8f Merge pull request #832 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.10.3 2020-05-01 06:30:56 +05:30
dependabot-preview[bot]
9c6b7b005f chore(deps): bump @nuxtjs/axios from 5.10.2 to 5.10.3
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.10.2 to 5.10.3.
- [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.10.2...v5.10.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 00:46:07 +00:00
Liyas Thomas
74ce8dcfce Merge pull request #831 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.11.0 2020-05-01 06:13:32 +05:30
dependabot-preview[bot]
3c892eb1aa chore(deps): bump nuxt-i18n from 6.10.1 to 6.11.0
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.10.1 to 6.11.0.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.10.1...v6.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 00:31:40 +00:00
Liyas Thomas
7907508240 Merge pull request #830 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.2.1 2020-05-01 05:59:19 +05:30
dependabot-preview[bot]
602a13660a chore(deps-dev): bump lint-staged from 10.2.0 to 10.2.1
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.0 to 10.2.1.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.0...v10.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 00:17:44 +00:00
Liyas Thomas
2adead91bf Merge pull request #828 from jinyus/wsockdev 2020-04-30 15:16:18 +05:30
Liyas Thomas
ca6e27b1f7 Merge branch 'master' into wsockdev 2020-04-30 14:46:26 +05:30
David Reid
76082a2e61 Use built in log instead of creating a new array 2020-04-30 01:41:22 -05:00
David Reid
83b1993cd2 Add message history to websocket client 2020-04-30 01:18:26 -05:00
David Reid
18d569aad8 Add message history to websocket client 2020-04-30 01:12:34 -05:00
David Reid
30987d5ad0 Add message history to websocket client 2020-04-30 01:10:29 -05:00
Liyas Thomas
b71c95192e 🐛 Fixed #826 2020-04-30 08:01:56 +05:30
Liyas Thomas
f6269ad0ce 🐛 Fixed #825 2020-04-30 05:37:31 +05:30
Liyas Thomas
8f374e5244 Merge pull request #823 from jameslahm/master 2020-04-29 10:40:58 +05:30
wangao
c497faa07a chore(config): delete render option 2020-04-29 12:55:43 +08:00
Liyas Thomas
2033eec0e8 Merge pull request #816 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.10.2 2020-04-29 06:31:57 +05:30
dependabot-preview[bot]
76ffc0c509 chore(deps): bump @nuxtjs/axios from 5.10.1 to 5.10.2
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.10.1 to 5.10.2.
- [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.10.1...v5.10.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-29 00:42:59 +00:00
Liyas Thomas
538377034f Merge pull request #822 from liyasthomas/dependabot/npm_and_yarn/cypress-4.5.0 2020-04-29 06:10:15 +05:30
dependabot-preview[bot]
33e0084e93 chore(deps-dev): bump cypress from 4.4.1 to 4.5.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.4.1 to 4.5.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.4.1...v4.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-29 00:30:11 +00:00
Liyas Thomas
1fa58cab6b Merge pull request #821 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.2.0 2020-04-29 05:57:28 +05:30
dependabot-preview[bot]
9747f19343 chore(deps-dev): bump lint-staged from 10.1.7 to 10.2.0
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.7 to 10.2.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.7...v10.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-29 00:15:55 +00:00
Liyas Thomas
51004da441 Merge pull request #820 from feydan/socketio-json-support 2020-04-29 05:21:39 +05:30
Dan Fey
266cb83ba9 Trying to json parse user input so that the socket io library can properly emit json data. Falls back to string input 2020-04-28 13:20:47 -07:00
Liyas Thomas
1d7b3523ae 🐛 Fixed #765 2020-04-26 15:40:44 +05:30
Liyas Thomas
3924077b97 Merge pull request #813 from shtakai/feature/json_array 2020-04-26 10:24:44 +05:30
alyson t
868eab0344 Modify responseType by Object(json) or Array(json5)
Editor component can't recognize json Array.
(It accepts json Object.)
If json Array, set this.responseBodyType 'json5'.
2020-04-26 13:27:51 +09:00
Liyas Thomas
9aec950593 Merge pull request #807 from liyasthomas/dependabot/npm_and_yarn/node-sass-4.14.0
chore(deps-dev): bump node-sass from 4.13.1 to 4.14.0
2020-04-24 07:01:46 +05:30
dependabot-preview[bot]
dc5ab92a62 chore(deps-dev): bump node-sass from 4.13.1 to 4.14.0
Bumps [node-sass](https://github.com/sass/node-sass) from 4.13.1 to 4.14.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.13.1...v4.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 01:27:59 +00:00
Liyas Thomas
55d61e3282 Merge pull request #808 from liyasthomas/dependabot/npm_and_yarn/firebase-7.14.2
chore(deps): bump firebase from 7.14.1 to 7.14.2
2020-04-24 06:55:28 +05:30
dependabot-preview[bot]
60965c1b37 chore(deps): bump firebase from 7.14.1 to 7.14.2
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.14.1 to 7.14.2.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.14.1...firebase@7.14.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 01:21:53 +00:00
Liyas Thomas
f5c595fa2e Merge pull request #806 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/sitemap-2.2.1
chore(deps): bump @nuxtjs/sitemap from 2.2.0 to 2.2.1
2020-04-24 06:49:20 +05:30
dependabot-preview[bot]
8a3e4b2041 chore(deps): bump @nuxtjs/sitemap from 2.2.0 to 2.2.1
Bumps [@nuxtjs/sitemap](https://github.com/nuxt-community/sitemap-module) from 2.2.0 to 2.2.1.
- [Release notes](https://github.com/nuxt-community/sitemap-module/releases)
- [Changelog](https://github.com/nuxt-community/sitemap-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/sitemap-module/compare/v2.2.0...v2.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 01:10:15 +00:00
Liyas Thomas
de90a73a83 Merge pull request #809 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.10.1
chore(deps): bump nuxt-i18n from 6.9.2 to 6.10.1
2020-04-24 06:37:46 +05:30
dependabot-preview[bot]
4721f5fda2 chore(deps): bump nuxt-i18n from 6.9.2 to 6.10.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.9.2 to 6.10.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.9.2...v6.10.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 00:18:42 +00:00
Liyas Thomas
50f9364f7a Merge pull request #802 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.9.2
chore(deps): bump nuxt-i18n from 6.9.1 to 6.9.2
2020-04-23 08:06:43 +05:30
dependabot-preview[bot]
ceb9eafe27 chore(deps): bump nuxt-i18n from 6.9.1 to 6.9.2
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.9.1 to 6.9.2.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.9.1...v6.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-23 01:20:04 +00:00
Liyas Thomas
4e15117746 Merge pull request #803 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.10.1
chore(deps): bump @nuxtjs/axios from 5.10.0 to 5.10.1
2020-04-23 06:47:40 +05:30
dependabot-preview[bot]
b87b43cfa8 chore(deps): bump @nuxtjs/axios from 5.10.0 to 5.10.1
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.10.0 to 5.10.1.
- [Release notes](https://github.com/nuxt-community/axios-module/releases)
- [Changelog](https://github.com/nuxt-community/axios-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/axios-module/compare/v5.10.0...v5.10.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-23 00:18:45 +00:00
Liyas Thomas
caf056caf1 Merge pull request #799 from liyasthomas/dependabot/npm_and_yarn/prettier-2.0.5
chore(deps-dev): bump prettier from 2.0.4 to 2.0.5
2020-04-22 09:54:29 +05:30
dependabot-preview[bot]
c5953b584f chore(deps-dev): bump prettier from 2.0.4 to 2.0.5
Bumps [prettier](https://github.com/prettier/prettier) from 2.0.4 to 2.0.5.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.4...2.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-22 04:14:59 +00:00
Liyas Thomas
de053edeab Merge pull request #800 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.7
chore(deps-dev): bump lint-staged from 10.1.6 to 10.1.7
2020-04-22 09:42:19 +05:30
dependabot-preview[bot]
392e675bd4 chore(deps-dev): bump lint-staged from 10.1.6 to 10.1.7
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.6 to 10.1.7.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.6...v10.1.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-22 04:04:18 +00:00
Liyas Thomas
e53c8bd43f Merge pull request #798 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.10.0
chore(deps): bump @nuxtjs/axios from 5.9.7 to 5.10.0
2020-04-22 09:31:47 +05:30
dependabot-preview[bot]
976d5e2bb3 chore(deps): bump @nuxtjs/axios from 5.9.7 to 5.10.0
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.9.7 to 5.10.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.9.7...v5.10.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-22 00:18:10 +00:00
Liyas Thomas
d1a1c9308a Merge pull request #797 from liyasthomas/dependabot/npm_and_yarn/cypress-4.4.1
chore(deps-dev): bump cypress from 4.4.0 to 4.4.1
2020-04-21 07:37:23 +05:30
dependabot-preview[bot]
1a8e162eb9 chore(deps-dev): bump cypress from 4.4.0 to 4.4.1
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.4.0 to 4.4.1.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.4.0...v4.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-21 01:06:40 +00:00
Liyas Thomas
fbac03e9e1 Merge pull request #795 from konradkalemba/master
Listen to all events in socket.io connection
2020-04-21 06:34:19 +05:30
Konrad Kalemba
b89a1cd066 Listen to all events in socket.io connection 2020-04-20 20:45:11 +02:00
Liyas Thomas
780e80a4f9 Merge pull request #791 from Nikita240/master
Fix postman import with empty url
2020-04-20 19:11:06 +05:30
Nikita Rushmanov
d6bc1b8eb1 Fixed postman import with empty url 2020-04-19 21:48:41 -07:00
Liyas Thomas
5783d10696 Merge pull request #789 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.6
chore(deps-dev): bump lint-staged from 10.1.5 to 10.1.6
2020-04-20 07:15:20 +05:30
dependabot-preview[bot]
97e06b6284 chore(deps-dev): bump lint-staged from 10.1.5 to 10.1.6
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.5 to 10.1.6.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.5...v10.1.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-20 00:37:56 +00:00
Liyas Thomas
09f7f1f5e0 Merge pull request #787 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.5
chore(deps-dev): bump lint-staged from 10.1.3 to 10.1.5
2020-04-19 10:41:15 +05:30
dependabot-preview[bot]
943d116b69 chore(deps-dev): bump lint-staged from 10.1.3 to 10.1.5
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.3 to 10.1.5.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.3...v10.1.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-19 05:06:41 +00:00
Liyas Thomas
55224aa221 Fixed #760 2020-04-19 05:21:49 +05:30
Liyas Thomas
05cd1fd0a8 Merge pull request #781 from liyasthomas/dependabot/npm_and_yarn/yargs-parser-18.1.3
chore(deps): bump yargs-parser from 18.1.2 to 18.1.3
2020-04-17 08:13:38 +05:30
dependabot-preview[bot]
e8762bfb25 chore(deps): bump yargs-parser from 18.1.2 to 18.1.3
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.2 to 18.1.3.
- [Release notes](https://github.com/yargs/yargs-parser/releases)
- [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.2...v18.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-17 02:37:52 +00:00
Liyas Thomas
242d212402 Merge pull request #782 from liyasthomas/dependabot/npm_and_yarn/firebase-7.14.1
chore(deps): bump firebase from 7.14.0 to 7.14.1
2020-04-17 08:05:25 +05:30
dependabot-preview[bot]
b14522f22d chore(deps): bump firebase from 7.14.0 to 7.14.1
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.14.0 to 7.14.1.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.14.0...firebase@7.14.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-17 00:20:28 +00:00
Liyas Thomas
4f43756c0e Merge branch 'master' of https://github.com/liyasthomas/postwoman 2020-04-17 00:07:52 +05:30
Liyas Thomas
4e9b724070 Merge pull request #778 from liyasthomas/dependabot/npm_and_yarn/start-server-and-test-1.11.0
chore(deps-dev): bump start-server-and-test from 1.10.11 to 1.11.0
2020-04-17 00:04:47 +05:30
Liyas Thomas
774c1678be 🔥 Removing unwanted files 2020-04-16 23:58:44 +05:30
dependabot-preview[bot]
bb18a7278e chore(deps-dev): bump start-server-and-test from 1.10.11 to 1.11.0
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.11 to 1.11.0.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.11...v1.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 18:24:52 +00:00
Liyas Thomas
f2609dba56 Merge pull request #775 from liyasthomas/dependabot/npm_and_yarn/ace-builds-1.4.11
chore(deps): bump ace-builds from 1.4.9 to 1.4.11
2020-04-16 23:52:28 +05:30
dependabot-preview[bot]
071c57c5a2 chore(deps): bump ace-builds from 1.4.9 to 1.4.11
Bumps [ace-builds](https://github.com/ajaxorg/ace-builds) from 1.4.9 to 1.4.11.
- [Release notes](https://github.com/ajaxorg/ace-builds/releases)
- [Changelog](https://github.com/ajaxorg/ace-builds/blob/master/ChangeLog.txt)
- [Commits](https://github.com/ajaxorg/ace-builds/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 17:36:48 +00:00
Liyas Thomas
caf76f9cd9 Merge pull request #776 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.9.1
chore(deps): bump nuxt-i18n from 6.8.1 to 6.9.1
2020-04-16 23:03:59 +05:30
dependabot-preview[bot]
012b61ae8e chore(deps): bump nuxt-i18n from 6.8.1 to 6.9.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.8.1 to 6.9.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.8.1...v6.9.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 17:27:44 +00:00
Liyas Thomas
936f91f204 Merge pull request #774 from liyasthomas/dependabot/npm_and_yarn/cypress-4.4.0
chore(deps-dev): bump cypress from 4.3.0 to 4.4.0
2020-04-16 22:55:21 +05:30
dependabot-preview[bot]
de28bd4660 chore(deps-dev): bump cypress from 4.3.0 to 4.4.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.3.0...v4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 17:17:34 +00:00
Liyas Thomas
e60a333aff Merge pull request #758 from liyasthomas/dependabot/npm_and_yarn/firebase-7.14.0
chore(deps): bump firebase from 7.13.2 to 7.14.0
2020-04-11 06:42:41 +05:30
dependabot-preview[bot]
b9664906d1 chore(deps): bump firebase from 7.13.2 to 7.14.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.13.2 to 7.14.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.13.2...firebase@7.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-11 01:09:17 +00:00
Liyas Thomas
910cf73515 Merge pull request #757 from liyasthomas/dependabot/npm_and_yarn/husky-4.2.5
chore(deps-dev): bump husky from 4.2.3 to 4.2.5
2020-04-11 06:36:04 +05:30
dependabot-preview[bot]
c70bea5f62 chore(deps-dev): bump husky from 4.2.3 to 4.2.5
Bumps [husky](https://github.com/typicode/husky) from 4.2.3 to 4.2.5.
- [Release notes](https://github.com/typicode/husky/releases)
- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)
- [Commits](https://github.com/typicode/husky/compare/v4.2.3...v4.2.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-11 00:55:16 +00:00
Liyas Thomas
cefb6463c5 Merge pull request #756 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.3
chore(deps-dev): bump lint-staged from 10.1.2 to 10.1.3
2020-04-11 06:22:12 +05:30
dependabot-preview[bot]
7059b64948 chore(deps-dev): bump lint-staged from 10.1.2 to 10.1.3
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.2 to 10.1.3.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.2...v10.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-11 00:15:11 +00:00
Liyas Thomas
76bf91bc0a Merge pull request #748 from levrik/fix-extension-installed-indicator
Fix indicator if extension is installed
2020-04-08 22:41:02 +05:30
Levin Rickert
3679eecfc2 Fix indicator if extension is installed 2020-04-08 19:02:19 +02:00
Andrew Bastin
ac7875011d Merge pull request #747 from levrik/remove-legacy-extension-strategies
Remove support for legacy extensions
2020-04-08 12:53:53 -04:00
Levin Rickert
83b708368f Remove support for legacy extensions 2020-04-08 12:19:17 +02:00
Andrew Bastin
140d585122 Merge pull request #745 from levrik/fix-gql-get-schema
Fix GQL introspection query not sent through extension
2020-04-07 12:10:06 -04:00
Levin Rickert
848535a343 Fix GQL introspection query not sent through extension 2020-04-07 14:24:44 +02:00
Liyas Thomas
3fcf90edd7 Merge pull request #744 from liyasthomas/dependabot/npm_and_yarn/prettier-2.0.4
chore(deps-dev): bump prettier from 2.0.2 to 2.0.4
2020-04-07 10:58:18 +05:30
dependabot-preview[bot]
0e7597edcc chore(deps-dev): bump prettier from 2.0.2 to 2.0.4
Bumps [prettier](https://github.com/prettier/prettier) from 2.0.2 to 2.0.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.2...2.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-07 05:22:39 +00:00
Liyas Thomas
5f6c60656d Merge pull request #743 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/sitemap-2.2.0
chore(deps): bump @nuxtjs/sitemap from 2.1.0 to 2.2.0
2020-04-07 10:49:51 +05:30
dependabot-preview[bot]
b85220fc65 chore(deps): bump @nuxtjs/sitemap from 2.1.0 to 2.2.0
Bumps [@nuxtjs/sitemap](https://github.com/nuxt-community/sitemap-module) from 2.1.0 to 2.2.0.
- [Release notes](https://github.com/nuxt-community/sitemap-module/releases)
- [Changelog](https://github.com/nuxt-community/sitemap-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/sitemap-module/compare/v2.1.0...v2.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-07 05:14:41 +00:00
Liyas Thomas
8c038ae662 Merge pull request #740 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.2
chore(deps-dev): bump lint-staged from 10.1.1 to 10.1.2
2020-04-05 18:01:25 +05:30
dependabot-preview[bot]
84e3fdb4ac chore(deps-dev): bump lint-staged from 10.1.1 to 10.1.2
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.1 to 10.1.2.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.1...v10.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-05 12:26:21 +00:00
Liyas Thomas
a0eb2d5a8d Merge pull request #736 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.8.1
chore(deps): bump nuxt-i18n from 6.8.0 to 6.8.1
2020-04-04 06:12:11 +05:30
dependabot-preview[bot]
ed03bc372d chore(deps): bump nuxt-i18n from 6.8.0 to 6.8.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.8.0 to 6.8.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.8.0...v6.8.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-04 00:38:41 +00:00
James George
ecc2d70c3c Merge pull request #734 from liyasthomas/dependabot/npm_and_yarn/firebase-7.13.2
chore(deps): bump firebase from 7.13.1 to 7.13.2
2020-04-03 12:27:54 +05:30
dependabot-preview[bot]
2995cf9fa6 chore(deps): bump firebase from 7.13.1 to 7.13.2
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.13.1 to 7.13.2.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.13.1...firebase@7.13.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-03 06:50:28 +00:00
Liyas Thomas
2823a0f52a Merge pull request #735 from liyasthomas/dependabot/npm_and_yarn/ace-builds-1.4.9
chore(deps): bump ace-builds from 1.4.8 to 1.4.9
2020-04-03 12:17:57 +05:30
dependabot-preview[bot]
04fe61bf94 chore(deps): bump ace-builds from 1.4.8 to 1.4.9
Bumps [ace-builds](https://github.com/ajaxorg/ace-builds) from 1.4.8 to 1.4.9.
- [Release notes](https://github.com/ajaxorg/ace-builds/releases)
- [Changelog](https://github.com/ajaxorg/ace-builds/blob/master/ChangeLog.txt)
- [Commits](https://github.com/ajaxorg/ace-builds/compare/v1.4.8...v1.4.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-03 05:54:04 +00:00
Liyas Thomas
4b13c8db90 Merge pull request #733 from liyasthomas/dependabot/npm_and_yarn/vue-virtual-scroll-list-1.4.7
chore(deps): bump vue-virtual-scroll-list from 1.4.6 to 1.4.7
2020-04-03 11:21:24 +05:30
dependabot-preview[bot]
33af2f1e44 chore(deps): bump vue-virtual-scroll-list from 1.4.6 to 1.4.7
Bumps [vue-virtual-scroll-list](https://github.com/tangbc/vue-virtual-scroll-list) from 1.4.6 to 1.4.7.
- [Release notes](https://github.com/tangbc/vue-virtual-scroll-list/releases)
- [Commits](https://github.com/tangbc/vue-virtual-scroll-list/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-03 05:44:23 +00:00
Liyas Thomas
ac477c3d0d Merge pull request #732 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.8.0
chore(deps): bump nuxt-i18n from 6.7.2 to 6.8.0
2020-04-03 11:11:59 +05:30
dependabot-preview[bot]
0fd7a1287b chore(deps): bump nuxt-i18n from 6.7.2 to 6.8.0
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.7.2 to 6.8.0.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.7.2...v6.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-03 05:36:57 +00:00
Liyas Thomas
8fa09a41ff 📸 Updating screenshots 2020-04-02 06:59:17 +05:30
Liyas Thomas
d932f9f1e2 Delete crowdin.yml 2020-04-02 06:36:41 +05:30
Liyas Thomas
16e54284fb Update Crowdin configuration file 2020-04-02 06:31:51 +05:30
Liyas Thomas
61e1f87d18 Merge pull request #729 from liyasthomas/dependabot/npm_and_yarn/nuxt-2.12.2
chore(deps): bump nuxt from 2.12.1 to 2.12.2
2020-04-01 12:55:20 +05:30
dependabot-preview[bot]
65a460a9c3 chore(deps): bump nuxt from 2.12.1 to 2.12.2
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.12.1 to 2.12.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.12.1...v2.12.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-01 07:20:51 +00:00
Liyas Thomas
3cd58548db Merge pull request #727 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.1
chore(deps-dev): bump lint-staged from 10.1.0 to 10.1.1
2020-04-01 12:48:18 +05:30
dependabot-preview[bot]
7f5609a3eb chore(deps-dev): bump lint-staged from 10.1.0 to 10.1.1
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.0 to 10.1.1.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.0...v10.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-01 07:08:39 +00:00
Liyas Thomas
23bab5a2b9 Merge pull request #728 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.7.2
chore(deps): bump nuxt-i18n from 6.7.1 to 6.7.2
2020-04-01 12:36:12 +05:30
dependabot-preview[bot]
9919904c97 chore(deps): bump nuxt-i18n from 6.7.1 to 6.7.2
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.7.1 to 6.7.2.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.7.1...v6.7.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-01 06:48:53 +00:00
Liyas Thomas
5df569d9d3 Merge pull request #726 from liyasthomas/dependabot/npm_and_yarn/cypress-4.3.0
chore(deps-dev): bump cypress from 4.2.0 to 4.3.0
2020-03-31 10:00:55 +05:30
dependabot-preview[bot]
e8c9a5ecea chore(deps-dev): bump cypress from 4.2.0 to 4.3.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.2.0...v4.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-31 04:26:23 +00:00
Liyas Thomas
87bc0b957c Merge pull request #724 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.7.1
chore(deps): bump nuxt-i18n from 6.7.0 to 6.7.1
2020-03-31 09:53:50 +05:30
dependabot-preview[bot]
65d01303c5 chore(deps): bump nuxt-i18n from 6.7.0 to 6.7.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.7.0 to 6.7.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.7.0...v6.7.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-31 04:16:47 +00:00
Liyas Thomas
887e00ca37 Merge pull request #725 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.1.0
chore(deps-dev): bump lint-staged from 10.0.10 to 10.1.0
2020-03-31 09:44:18 +05:30
dependabot-preview[bot]
3443bf9941 chore(deps-dev): bump lint-staged from 10.0.10 to 10.1.0
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.0.10 to 10.1.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.0.10...v10.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-31 04:08:42 +00:00
Liyas Thomas
28452a343b Merge pull request #723 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.9.7
chore(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7
2020-03-31 09:36:17 +05:30
dependabot-preview[bot]
c8f94a4cae chore(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.9.6 to 5.9.7.
- [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.9.6...v5.9.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-31 04:00:08 +00:00
Liyas Thomas
807491a8fd Merge pull request #721 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.0.10
chore(deps-dev): bump lint-staged from 10.0.9 to 10.0.10
2020-03-29 19:03:02 +05:30
dependabot-preview[bot]
9dbe8d2a71 chore(deps-dev): bump lint-staged from 10.0.9 to 10.0.10
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.0.9 to 10.0.10.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.0.9...v10.0.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-29 13:27:52 +00:00
Liyas Thomas
ab400af39e Merge pull request #718 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/sitemap-2.1.0
chore(deps): bump @nuxtjs/sitemap from 2.0.1 to 2.1.0
2020-03-28 06:15:49 +05:30
dependabot-preview[bot]
a8dc7c08e6 chore(deps): bump @nuxtjs/sitemap from 2.0.1 to 2.1.0
Bumps [@nuxtjs/sitemap](https://github.com/nuxt-community/sitemap-module) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/nuxt-community/sitemap-module/releases)
- [Changelog](https://github.com/nuxt-community/sitemap-module/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/sitemap-module/compare/v2.0.1...v2.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-28 00:40:56 +00:00
Liyas Thomas
fc9f2a23fb Merge pull request #719 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.9.6
chore(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6
2020-03-28 06:08:30 +05:30
dependabot-preview[bot]
0bbbc5f4cd chore(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.9.5 to 5.9.6.
- [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.9.5...v5.9.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-28 00:31:56 +00:00
Liyas Thomas
e5f8259981 Merge pull request #717 from liyasthomas/dependabot/npm_and_yarn/firebase-7.13.1
chore(deps): bump firebase from 7.13.0 to 7.13.1
2020-03-28 05:59:18 +05:30
dependabot-preview[bot]
359b6de304 chore(deps): bump firebase from 7.13.0 to 7.13.1
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.13.0 to 7.13.1.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.13.0...firebase@7.13.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-28 00:14:39 +00:00
Liyas Thomas
c321f138e9 Merge pull request #713 from liyasthomas/dependabot/npm_and_yarn/yargs-parser-18.1.2
chore(deps): bump yargs-parser from 18.1.1 to 18.1.2
2020-03-27 17:27:51 +05:30
dependabot-preview[bot]
5b10939269 chore(deps): bump yargs-parser from 18.1.1 to 18.1.2
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.2.
- [Release notes](https://github.com/yargs/yargs-parser/releases)
- [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-27 11:50:08 +00:00
Liyas Thomas
b0184ca756 Merge pull request #712 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.7.0
chore(deps): bump nuxt-i18n from 6.6.1 to 6.7.0
2020-03-27 17:17:37 +05:30
dependabot-preview[bot]
e092e256c5 chore(deps): bump nuxt-i18n from 6.6.1 to 6.7.0
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.6.1 to 6.7.0.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.6.1...v6.7.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-27 11:37:56 +00:00
Liyas Thomas
7383043837 Merge pull request #711 from liyasthomas/dependabot/npm_and_yarn/nuxt-2.12.1
chore(deps): bump nuxt from 2.12.0 to 2.12.1
2020-03-27 17:05:30 +05:30
dependabot-preview[bot]
22e255f706 chore(deps): bump nuxt from 2.12.0 to 2.12.1
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.12.0 to 2.12.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.12.0...v2.12.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-27 11:29:40 +00:00
Liyas Thomas
9d8d5d0cd5 Merge pull request #710 from liyasthomas/dependabot/npm_and_yarn/firebase-7.13.0
chore(deps): bump firebase from 7.12.0 to 7.13.0
2020-03-27 16:56:42 +05:30
dependabot-preview[bot]
f2c0c9acf8 chore(deps): bump firebase from 7.12.0 to 7.13.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.12.0 to 7.13.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.12.0...firebase@7.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-27 11:21:53 +00:00
Liyas Thomas
33597d5232 💄 Updating the UI and style files 2020-03-27 06:30:13 +05:30
Liyas Thomas
228d22f9f0 Improving accessibility 2020-03-26 22:33:08 +05:30
Liyas Thomas
754a1d0f06 Improving accessibility 2020-03-26 22:21:41 +05:30
Liyas Thomas
ec7951bd93 🐛 Fixed #709 2020-03-26 16:04:46 +05:30
Liyas Thomas
ac0a89ae26 Tests and pre-request scripts are saved to collections. Fixes #643 2020-03-26 07:11:24 +05:30
Liyas Thomas
8568f4c2a9 🐛 Fixed URI not recognizing query parameters 2020-03-25 22:37:38 +05:30
Liyas Thomas
6ef198e705 Merge pull request #705 from liyasthomas/refactor/nuxt
Updating the UI and style files
2020-03-25 06:40:12 +05:30
Liyas Thomas
8fc379f30d Merge branch 'master' into refactor/nuxt 2020-03-25 06:34:23 +05:30
Liyas Thomas
46306db274 🎨 Updating the UI and style files 2020-03-25 06:29:39 +05:30
Liyas Thomas
b13e130f7c Merge pull request #703 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.0.9
chore(deps-dev): bump lint-staged from 10.0.8 to 10.0.9
2020-03-24 14:11:51 +05:30
dependabot-preview[bot]
76b784319d chore(deps-dev): bump lint-staged from 10.0.8 to 10.0.9
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.0.8 to 10.0.9.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.0.8...v10.0.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-24 08:17:51 +00:00
Liyas Thomas
6342e3263b Merge pull request #702 from liyasthomas/refactor/nuxt
Improving performance
2020-03-24 13:19:29 +05:30
Liyas Thomas
49e1d2107e 🍱 Updated og:image 2020-03-24 13:11:11 +05:30
Liyas Thomas
36de22ef1c Merge branch 'master' into refactor/nuxt 2020-03-24 13:01:31 +05:30
Liyas Thomas
865fe1917f ♻️ Improving performance 2020-03-24 12:36:37 +05:30
Liyas Thomas
c00673ffcb Merge pull request #701 from liyasthomas/refactor/nuxt
📦 Updating packages
2020-03-24 08:00:40 +05:30
Liyas Thomas
7ae92c1c2f Merge branch 'master' into refactor/nuxt 2020-03-24 07:53:52 +05:30
Liyas Thomas
f0e55abab5 📦 Updating packages 2020-03-24 07:49:09 +05:30
Liyas Thomas
ce03c56030 Merge pull request #700 from liyasthomas/dependabot/npm_and_yarn/prettier-2.0.2
chore(deps-dev): bump prettier from 2.0.1 to 2.0.2
2020-03-24 07:33:31 +05:30
dependabot-preview[bot]
5bb01f47ff chore(deps-dev): bump prettier from 2.0.1 to 2.0.2
Bumps [prettier](https://github.com/prettier/prettier) from 2.0.1 to 2.0.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.1...2.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-24 02:00:01 +00:00
Liyas Thomas
a0f2803a80 📦 Updating packages 2020-03-23 12:30:10 +05:30
Liyas Thomas
5679500c76 Merge pull request #697 from liyasthomas/dependabot/npm_and_yarn/prettier-2.0.1
chore(deps-dev): bump prettier from 1.19.1 to 2.0.1
2020-03-23 12:10:46 +05:30
dependabot-preview[bot]
7e1846dfda chore(deps-dev): bump prettier from 1.19.1 to 2.0.1
Bumps [prettier](https://github.com/prettier/prettier) from 1.19.1 to 2.0.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/1.19.1...2.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-23 06:29:12 +00:00
Liyas Thomas
e5fb3bd9b1 🔖 v1.9.5 2020-03-22 11:44:25 +05:30
Liyas Thomas
da5f52db74 🐛 Fixed #696 2020-03-22 11:05:26 +05:30
Liyas Thomas
e7e960e5ec Merge pull request #693 from leomp12/fix/raw-input
Fix raw input (JSON)
2020-03-22 10:01:40 +05:30
Liyas Thomas
ed4f1fe6f8 Update index.vue 2020-03-22 09:56:53 +05:30
Leonardo Matos
2a8ba00024 Merge branch 'master' into fix/raw-input 2020-03-21 23:40:04 -03:00
Leonardo Matos
3f9ae7fecc fix(raw-input): allow list parameter for any content type ending with 'json' 2020-03-21 23:37:55 -03:00
Leonardo Matos
76786f7a01 fix(raw-input): allow list parameters for json, set true when raw params is changed 2020-03-21 23:31:56 -03:00
Liyas Thomas
99ae80cc12 Merge pull request #695 from allthesignals/add-vnd-api-json-content-type
Add application/vnd.api+json
2020-03-21 08:08:29 +05:30
Matt Gardner
b925f7e419 Merge branch 'master' into add-vnd-api-json-content-type 2020-03-20 22:14:51 -04:00
Liyas Thomas
14d5461085 🎨 Minor UI fixes 2020-03-21 07:42:28 +05:30
Matt Gardner
88cbbe69b2 Add application/vnd.api+json
Add application/vnd.api+json to the places where content type matters
2020-03-20 22:08:05 -04:00
Leonardo Matos
90bd8d45b4 style(js): minor code style fix 2020-03-20 16:06:52 -03:00
Leonardo Matos
c370ee8018 fix: canListParameters prop must return 2020-03-20 15:58:52 -03:00
Leonardo Matos
9a4e64e13f fix: fix canListParameter (undefined) to canListParameters 2020-03-20 15:56:29 -03:00
Leonardo Matos
dc771f51e8 fix(req-body): ensure raw input if !canListParameters 2020-03-20 15:40:04 -03:00
Leonardo Matos
86ee80f607 Merge pull request #2 from liyasthomas/master
Update with master
2020-03-20 15:31:31 -03:00
Liyas Thomas
b14adc29f5 🐛 Hotfix: Enable RAW body for JSON Content-Type 2020-03-20 19:39:48 +05:30
Liyas Thomas
ec9954fc34 Merge pull request #688 from liyasthomas/dependabot/npm_and_yarn/vuefire-2.2.2
chore(deps): bump vuefire from 2.2.1 to 2.2.2
2020-03-20 07:57:49 +05:30
dependabot-preview[bot]
675d44c798 chore(deps): bump vuefire from 2.2.1 to 2.2.2
Bumps [vuefire](https://github.com/vuejs/vuefire) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/vuejs/vuefire/releases)
- [Changelog](https://github.com/vuejs/vuefire/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vuefire/compare/vuefire@2.2.1...vuefire@2.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-20 02:22:04 +00:00
Liyas Thomas
1f3f1a95ce Merge pull request #689 from liyasthomas/dependabot/npm_and_yarn/firebase-7.12.0
chore(deps): bump firebase from 7.11.0 to 7.12.0
2020-03-20 07:49:41 +05:30
dependabot-preview[bot]
83c2b4ff3c chore(deps): bump firebase from 7.11.0 to 7.12.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.11.0 to 7.12.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.11.0...firebase@7.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-20 02:16:10 +00:00
Liyas Thomas
3b2934d4ae 🐛 Hotfix: Broken toast and edit/save operations 2020-03-19 16:18:52 +05:30
Liyas Thomas
d95c53bbb6 ⬆️ Upgrading dependencies 2020-03-18 04:46:23 +05:30
Liyas Thomas
131c58fdae Merge pull request #685 from liyasthomas/dependabot/npm_and_yarn/cypress-4.2.0
chore(deps-dev): bump cypress from 4.1.0 to 4.2.0
2020-03-18 03:53:13 +05:30
dependabot-preview[bot]
3cb2c43003 chore(deps-dev): bump cypress from 4.1.0 to 4.2.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.1.0...v4.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 22:15:39 +00:00
Liyas Thomas
222d145753 Merge pull request #684 from liyasthomas/dependabot/npm_and_yarn/start-server-and-test-1.10.11
chore(deps-dev): bump start-server-and-test from 1.10.10 to 1.10.11
2020-03-18 03:43:19 +05:30
dependabot-preview[bot]
3225f283cb chore(deps-dev): bump start-server-and-test from 1.10.10 to 1.10.11
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.10 to 1.10.11.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.10...v1.10.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 22:05:41 +00:00
Liyas Thomas
95b9c7c421 Merge pull request #683 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.6.1
chore(deps): bump nuxt-i18n from 6.6.0 to 6.6.1
2020-03-18 03:33:16 +05:30
dependabot-preview[bot]
3a64907ce2 chore(deps): bump nuxt-i18n from 6.6.0 to 6.6.1
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.6.0 to 6.6.1.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.6.0...v6.6.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 21:57:50 +00:00
Liyas Thomas
00921b2603 Merge pull request #682 from liyasthomas/dependabot/npm_and_yarn/nuxt-2.12.0
chore(deps): bump nuxt from 2.11.0 to 2.12.0
2020-03-18 03:25:29 +05:30
dependabot-preview[bot]
811ed57b14 chore(deps): bump nuxt from 2.11.0 to 2.12.0
Bumps [nuxt](https://github.com/nuxt/nuxt.js) from 2.11.0 to 2.12.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.11.0...v2.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-17 21:47:33 +00:00
Liyas Thomas
6cfea0ce5b Merge pull request #681 from leomp12/fix/raw-params
Fix setting default raw params
2020-03-18 03:01:46 +05:30
Leonardo Matos
f2c3bd54d6 fix(raw-params): syntax fix, set default only when params is empty or old default 2020-03-17 16:30:15 -03:00
Leonardo Matos
b0c327854c Merge pull request #1 from liyasthomas/master
Update with master
2020-03-17 16:05:48 -03:00
Liyas Thomas
c7a9b5ccf6 Merge pull request #678 from leomp12/fix/parameter-list
Fix handling content type and raw input
2020-03-17 20:56:48 +05:30
Leonardo Matos
8469d13a12 fix(req-body): fix preseting default body (raw) by content type 2020-03-17 11:30:45 -03:00
Leonardo Matos
1f38c25e6a fix(req-body): enable parameters list for form encoded only
disable raw input toggle when not content type 'application/x-www-form-urlencoded'
2020-03-17 10:53:36 -03:00
Leonardo Matos
90a6315e2b perf(vue): 'validContentTypes' and 'knownContentTypes' can be computed 2020-03-17 10:40:23 -03:00
Liyas Thomas
651251b371 Merge pull request #674 from liyasthomas/snyk-fix-b9e7d4cfb17d1aa3480ad2a65cf267de
[Snyk] Security upgrade yargs-parser from 18.1.0 to 18.1.1
2020-03-17 05:52:18 +05:30
snyk-bot
992fee5620 fix: package.json & package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-YARGSPARSER-560381
2020-03-16 23:59:13 +00:00
Liyas Thomas
8f867540ba Merge pull request #672 from liyasthomas/dependabot/npm_and_yarn/start-server-and-test-1.10.10
chore(deps-dev): bump start-server-and-test from 1.10.9 to 1.10.10
2020-03-14 06:41:59 +05:30
dependabot-preview[bot]
f7fc9ec32e chore(deps-dev): bump start-server-and-test from 1.10.9 to 1.10.10
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.9 to 1.10.10.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.9...v1.10.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-14 00:50:21 +00:00
Liyas Thomas
b5aefd251e Merge pull request #671 from liyasthomas/dependabot/npm_and_yarn/firebase-7.11.0
chore(deps): bump firebase from 7.10.0 to 7.11.0
2020-03-14 06:17:56 +05:30
dependabot-preview[bot]
b7941187ff chore(deps): bump firebase from 7.10.0 to 7.11.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.10.0 to 7.11.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.10.0...firebase@7.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-14 00:14:48 +00:00
Liyas Thomas
5b2fc12480 🌱 Added GitHub sponsor link 2020-03-13 09:44:43 +05:30
Liyas Thomas
86830f91ef 🌱 Added GitHub sponsor link 2020-03-13 08:38:27 +05:30
Liyas Thomas
b5f66408fc Merge pull request #669 from liyasthomas/feature/api
 Updating tests
2020-03-12 23:35:06 +05:30
Liyas Thomas
9a318db6fb Updating tests 2020-03-12 23:29:23 +05:30
Liyas Thomas
a95de9ff99 Merge branch 'feature/api' of https://github.com/liyasthomas/postwoman into feature/api 2020-03-12 23:25:01 +05:30
Liyas Thomas
e83ca8425f Updating tests 2020-03-12 23:23:01 +05:30
Liyas Thomas
b95e381a56 Merge branch 'master' into feature/api 2020-03-12 23:14:46 +05:30
Liyas Thomas
6a2c59700e Updating tests 2020-03-12 23:12:09 +05:30
Liyas Thomas
49d91fb127 Merge pull request #668 from liyasthomas/feature/api
Updating tests
2020-03-12 22:56:35 +05:30
Liyas Thomas
564f659778 Updating tests 2020-03-12 22:49:43 +05:30
Liyas Thomas
fa31f8667f Merge branch 'feature/api' of https://github.com/liyasthomas/postwoman into feature/api 2020-03-12 22:30:43 +05:30
Liyas Thomas
7d5c246a1f Updating tests 2020-03-12 22:28:25 +05:30
Liyas Thomas
4900cfd402 Merge branch 'master' into feature/api 2020-03-12 22:20:55 +05:30
Liyas Thomas
5e5cdb181d Updating tests 2020-03-12 21:46:37 +05:30
Liyas Thomas
1f65980f26 Merge pull request #667 from liyasthomas/feature/api
APIs
2020-03-12 20:30:06 +05:30
Liyas Thomas
bd1d81c1b8 👽 API 2020-03-12 20:15:49 +05:30
Liyas Thomas
5de3dc7737 Merge pull request #666 from rahulnpadalkar/master
Insecure Websocket connection issue while connecting to MQTT broker.
2020-03-12 10:57:49 +05:30
Rahul
f7bf010cfa Merge remote-tracking branch 'upstream/master'
Synced fork
2020-03-12 10:44:26 +05:30
Rahul
68375469c5 Added useSSL option while creating connection 2020-03-12 10:40:51 +05:30
Liyas Thomas
4c73ee7d82 Merge pull request #664 from liyasthomas/patch/i18n
Improving performance
2020-03-12 08:26:12 +05:30
Liyas Thomas
32aeb97c34 Merge branch 'master' into patch/i18n 2020-03-12 07:51:30 +05:30
Liyas Thomas
b576f34893 Improving performance 2020-03-12 07:47:59 +05:30
Liyas Thomas
39015d79d4 Merge pull request #663 from liyasthomas/feature/mqtt
Feature/mqtt
2020-03-12 01:44:59 +05:30
Liyas Thomas
87c0702959 ♻️ Refactor 2020-03-12 01:31:54 +05:30
Liyas Thomas
6fa8a46a8a Merge pull request #662 from rahulnpadalkar/master
Added Support for MQTT
2020-03-12 00:28:56 +05:30
Rahul
7d465ca489 Fixed conflicts 2020-03-12 00:00:56 +05:30
Rahul
49bb77c098 Added MQTT entry to readme 2020-03-11 23:46:43 +05:30
Rahul
7345cc9943 Added MQTT support 2020-03-11 23:46:43 +05:30
Liyas Thomas
f7e71100f0 Merge pull request #660 from liyasthomas/dependabot/npm_and_yarn/yargs-parser-18.1.0
chore(deps): bump yargs-parser from 18.0.0 to 18.1.0
2020-03-11 19:51:59 +05:30
dependabot-preview[bot]
e2788b86a4 chore(deps): bump yargs-parser from 18.0.0 to 18.1.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.0.0 to 18.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/v18.0.0...v18.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-11 11:40:22 +00:00
Liyas Thomas
2cb350468b Merge pull request #659 from liyasthomas/dependabot/npm_and_yarn/start-server-and-test-1.10.9
chore(deps-dev): bump start-server-and-test from 1.10.8 to 1.10.9
2020-03-11 17:07:54 +05:30
dependabot-preview[bot]
d962af1f18 chore(deps-dev): bump start-server-and-test from 1.10.8 to 1.10.9
Bumps [start-server-and-test](https://github.com/bahmutov/start-server-and-test) from 1.10.8 to 1.10.9.
- [Release notes](https://github.com/bahmutov/start-server-and-test/releases)
- [Commits](https://github.com/bahmutov/start-server-and-test/compare/v1.10.8...v1.10.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-11 10:45:58 +00:00
Liyas Thomas
292343660c 🐛 Hotfix: History entries refusing to add 2020-03-09 18:45:43 +05:30
Liyas Thomas
84458fb660 Merge pull request #657 from liyasthomas/refactor/ui
Added icon slot to tabs
2020-03-08 22:03:18 +05:30
Liyas Thomas
94b0021453 Merge branch 'master' into refactor/ui 2020-03-08 21:57:19 +05:30
Liyas Thomas
05b45aa65a Added icon slot to tabs 2020-03-08 21:52:04 +05:30
Liyas Thomas
37b6dd19f0 Merge pull request #655 from liyasthomas/refactor/ui
Refactor/ui
2020-03-08 18:12:07 +05:30
Liyas Thomas
995e0c6c51 Fixed tab switch 2020-03-08 09:11:25 +05:30
Liyas Thomas
799c650f32 Fixed error on tab switch 2020-03-07 20:27:47 +05:30
Liyas Thomas
33f5474033 Tabs 2020-03-07 18:40:37 +05:30
Liyas Thomas
bc3bdb835e Merge pull request #654 from liyasthomas/master
even
2020-03-07 08:38:56 +05:30
Liyas Thomas
1a1d4111fb Merge pull request #653 from liyasthomas/dependabot/npm_and_yarn/yargs-parser-18.0.0
chore(deps): bump yargs-parser from 17.0.0 to 18.0.0
2020-03-07 08:07:31 +05:30
dependabot-preview[bot]
53a4760034 chore(deps): bump yargs-parser from 17.0.0 to 18.0.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 17.0.0 to 18.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/v17.0.0...v18.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-07 00:21:54 +00:00
Liyas Thomas
ca03fc2fc3 Merge pull request #652 from liyasthomas/dependabot/npm_and_yarn/firebase-7.10.0
chore(deps): bump firebase from 7.9.3 to 7.10.0
2020-03-07 05:49:26 +05:30
dependabot-preview[bot]
35fe734ddf chore(deps): bump firebase from 7.9.3 to 7.10.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.9.3 to 7.10.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.9.3...firebase@7.10.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-07 00:14:57 +00:00
Andrew Bastin
edf544ec93 Merge pull request #650 from AndrewBastin/feat/gql-query-prettify
Added the ability to prettify GraphQL queries
2020-03-05 20:22:46 -05:00
Andrew Bastin
e4abe4efd5 Added prettify query button for GraphQL queries 2020-03-05 14:58:32 -05:00
Andrew Bastin
30ee570ef7 Added i10n entry for prettify query 2020-03-05 14:53:27 -05:00
Andrew Bastin
64091c1f29 GQL Query Editor shows toast on prettifying invalid queries 2020-03-05 14:36:30 -05:00
Andrew Bastin
cb0de46e7d Added i10n entry for invalid GQL Query prettification 2020-03-05 14:35:34 -05:00
Andrew Bastin
a9ba2b50f9 Added error handling to query prettify to prevent event propagation 2020-03-05 14:25:00 -05:00
Andrew Bastin
7dd4db13a1 Added prettifying to GQL Query Editor 2020-03-05 14:20:15 -05:00
Liyas Thomas
41c33e0626 Merge pull request #648 from moonrailgun/bug/fix-socketio-urlvalid
Add http/https support to socketio url valid
2020-03-05 10:19:01 +05:30
moonrailgun
94b2688073 Add http/https support to socketio url valid 2020-03-05 11:20:10 +08:00
Liyas Thomas
08e578b4b4 Rollback modal fade 2020-03-05 08:33:06 +05:30
Liyas Thomas
e68ec2eb56 Merge pull request #647 from liyasthomas/refactor/ui
Refactor/ui
2020-03-05 07:09:33 +05:30
Liyas Thomas
0f2686a102 ♻️ Refactoring code 2020-03-05 06:48:10 +05:30
Liyas Thomas
da628ca26d Merge pull request #646 from liyasthomas/master
Even
2020-03-05 06:46:03 +05:30
Liyas Thomas
31fde475a3 Merge pull request #645 from liyasthomas/hotfix/tests
Run tests even after failed request
2020-03-04 20:21:05 +05:30
Liyas Thomas
0533f3a070 🐛 Fixed #644 2020-03-04 20:04:38 +05:30
Liyas Thomas
1a93ce1d43 📝 Updated feature list 2020-03-04 16:08:12 +05:30
Liyas Thomas
71764ad364 Merge pull request #640 from moonrailgun/feature/socketio
Feature: add socket io support
2020-03-04 15:43:51 +05:30
Liyas Thomas
6a96729055 Merge branch 'master' into feature/socketio 2020-03-04 15:37:32 +05:30
moonrailgun
356d736f4e Trans and docs for socketio feature 2020-03-04 14:50:47 +08:00
moonrailgun
14701369bd Add Socketio support
and modify some websocket and sse code to pick up common function and component
2020-03-04 14:40:44 +08:00
Liyas Thomas
b14e475db0 Hotfix: Select current theme swatch 2020-03-04 09:21:48 +05:30
Liyas Thomas
d6fd01d210 Merge pull request #639 from AndrewBastin/fix/collection-import-turnoff-linter
Removed linting for the collection docs import editor
2020-03-04 07:28:09 +05:30
Andrew Bastin
77edec5f76 Removed linting for the collection docs import editor 2020-03-03 20:49:37 -05:00
Liyas Thomas
e843203bb6 Merge pull request #638 from liyasthomas/refactor/ui
Moving or renaming files
2020-03-04 07:05:22 +05:30
Liyas Thomas
89d43ae52d Merge branch 'master' into refactor/ui 2020-03-04 06:52:20 +05:30
Liyas Thomas
10e13ce8f8 🚚 Moving or renaming files 2020-03-04 06:47:02 +05:30
Liyas Thomas
1f43a68612 Merge pull request #636 from liyasthomas/refactor/ui
Refactor/ui
2020-03-03 18:51:30 +05:30
Liyas Thomas
3afdce151b 🚚 Moving or renaming files 2020-03-03 17:45:16 +05:30
Liyas Thomas
378d9e7758 🚚 Moving or renaming files 2020-03-03 17:27:53 +05:30
Liyas Thomas
f564ca1eb5 🌱 Added contributors section 2020-03-03 07:02:27 +05:30
Liyas Thomas
09d2878e1d Merge pull request #633 from AndrewBastin/feat/non-gql-url-detect
Updated messages for when GraphQL Get Schema fails
2020-03-02 05:35:53 +05:30
Andrew Bastin
afdf4a268a Updated messages for when getSchema fails 2020-03-01 18:47:00 -05:00
Liyas Thomas
0958376bb4 Merge pull request #628 from liyasthomas/dependabot/npm_and_yarn/cypress-4.1.0
chore(deps-dev): bump cypress from 4.0.2 to 4.1.0
2020-03-01 12:19:46 +05:30
dependabot-preview[bot]
3c2307dca8 chore(deps-dev): bump cypress from 4.0.2 to 4.1.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.0.2 to 4.1.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.0.2...v4.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-01 02:39:10 +00:00
Liyas Thomas
0d0eca89c2 Merge pull request #627 from liyasthomas/dependabot/npm_and_yarn/nuxt-i18n-6.6.0
chore(deps): bump nuxt-i18n from 6.5.0 to 6.6.0
2020-03-01 08:06:35 +05:30
dependabot-preview[bot]
a279085526 chore(deps): bump nuxt-i18n from 6.5.0 to 6.6.0
Bumps [nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n) from 6.5.0 to 6.6.0.
- [Release notes](https://github.com/nuxt-community/nuxt-i18n/releases)
- [Changelog](https://github.com/nuxt-community/nuxt-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nuxt-community/nuxt-i18n/compare/v6.5.0...v6.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-01 02:28:02 +00:00
Liyas Thomas
a9fdba83cc Merge pull request #610 from liyasthomas/update-proxy-info
Update proxy information.
2020-03-01 07:55:20 +05:30
John Harker
78ef6e56e0 Merge branch 'master' into update-proxy-info 2020-02-29 21:29:09 +00:00
Liyas Thomas
54ce6aaffa Merge pull request #625 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/google-tag-manager-2.3.2
chore(deps): bump @nuxtjs/google-tag-manager from 2.3.1 to 2.3.2
2020-03-01 01:03:09 +05:30
dependabot-preview[bot]
7c5e82e31d chore(deps): bump @nuxtjs/google-tag-manager from 2.3.1 to 2.3.2
Bumps @nuxtjs/google-tag-manager from 2.3.1 to 2.3.2.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-29 19:24:58 +00:00
Liyas Thomas
a2b4a36414 Merge pull request #626 from liyasthomas/dependabot/npm_and_yarn/firebase-7.9.3
chore(deps): bump firebase from 7.9.1 to 7.9.3
2020-03-01 00:52:28 +05:30
dependabot-preview[bot]
4772b58454 chore(deps): bump firebase from 7.9.1 to 7.9.3
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.9.1 to 7.9.3.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.9.1...firebase@7.9.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-29 19:13:01 +00:00
Liyas Thomas
fc615a04f6 Merge pull request #631 from dmitryyankowski/gql/editor-updates
Minor GraphQL page improvements
2020-03-01 00:39:51 +05:30
Liyas Thomas
1f03db1ec0 Merge branch 'master' into update-proxy-info 2020-03-01 00:31:20 +05:30
Liyas Thomas
898d703a67 Merge branch 'master' into gql/editor-updates 2020-03-01 00:29:52 +05:30
Liyas Thomas
3248910174 Merge pull request #623 from yubathom/ci/optimize-travis-build
test: purge travis
2020-03-01 00:20:27 +05:30
Dmitry Yankowski
88e7f35995 Merge branch 'master' into gql/editor-updates 2020-02-29 11:57:03 -05:00
Dmitry Yankowski
69a7f86559 Merge pull request #629 from AndrewBastin/fix/gql-variable-empty
Ignore empty GQL Variable Strings
2020-02-29 11:56:51 -05:00
Dmitry Yankowski
57950e2637 Fixed default query 2020-02-29 11:51:38 -05:00
Dmitry Yankowski
e56fa732fa Added some GraphQL page updates 2020-02-29 11:42:12 -05:00
Andrew Bastin
d2945913ce Empty gql variable string is substituted with an empty JSON object 2020-02-28 20:15:20 -05:00
Dmitry Yankowski
fc4d9260bf Merge remote-tracking branch 'liyasthomas/master' 2020-02-28 15:46:09 -05:00
Dmitry Yankowski
ff6ecb81d7 Merge branch 'master' into update-proxy-info 2020-02-28 15:11:36 -05:00
Dmitry Yankowski
d1becb3b1e Merge branch 'master' into ci/optimize-travis-build 2020-02-28 15:11:26 -05:00
Dmitry Yankowski
8df5a5ec4b Merge pull request #620 from AndrewBastin/feat/quick-query-run
Added shortcut to quickly run the GraphQL query
2020-02-28 15:11:07 -05:00
Dmitry Yankowski
37e63cc610 Merge branch 'master' into feat/quick-query-run 2020-02-28 13:19:14 -05:00
yubathom
44de8438ef test: purge travis 2020-02-28 04:19:46 -03:00
Dmitry Yankowski
011f8c65f5 Merge pull request #619 from liyasthomas/all-contributors/add-dmitryyankowski
docs: add dmitryyankowski as a contributor
2020-02-27 22:52:17 -05:00
Dmitry Yankowski
e7f1f019d6 Merge branch 'master' into all-contributors/add-dmitryyankowski 2020-02-27 22:25:16 -05:00
Dmitry Yankowski
be0f7b0067 Merge branch 'master' into feat/quick-query-run 2020-02-27 22:16:49 -05:00
Dmitry Yankowski
0694f46fcd Merge pull request #618 from liyasthomas/feature/auth
Link multiple auth providers
2020-02-27 22:15:55 -05:00
Andrew Bastin
e5e66d8cc0 Added shortcut key to the Run Query button tooltip 2020-02-27 21:53:47 -05:00
Andrew Bastin
d4c6065e45 Refactor default.vue to use getPlatformSpecialKey 2020-02-27 21:53:47 -05:00
Andrew Bastin
2208403c20 Added platformutils file with the platform special key character
function
2020-02-27 21:52:08 -05:00
Andrew Bastin
2f2580d2d3 Hooked up onRunGQLQuery editor command 2020-02-27 21:52:08 -05:00
Andrew Bastin
5daf4a19b7 Added Ctrl+Enter as a short cut to run GraphQL Query 2020-02-27 21:52:08 -05:00
Dmitry Yankowski
154c2b2da3 Fix scoping and toast notifications for auth/settings page 2020-02-27 21:50:00 -05:00
allcontributors[bot]
ab7ee92112 docs: update .all-contributorsrc [skip ci] 2020-02-28 00:29:03 +00:00
allcontributors[bot]
3a2bb63c98 docs: update README.md [skip ci] 2020-02-28 00:29:02 +00:00
Liyas Thomas
241e16dd06 Merge branch 'master' into feature/auth 2020-02-28 05:40:50 +05:30
Liyas Thomas
3bbe71f2c9 ⚗️ Link multiple auth providers 2020-02-28 05:35:28 +05:30
Dmitry Yankowski
ba798287f9 Merge pull request #617 from dmitryyankowski/fix/pretty-quick-stage
Add --staged parameter to pretty-quick pre-commit
2020-02-27 18:43:59 -05:00
Dmitry Yankowski
e1c34a3689 Add --staged parameter to pretty-quick
Makes it so you don't have to re-stage manually after pre-commit hook is run
2020-02-27 18:20:21 -05:00
Liyas Thomas
257e6dfb1c Merge branch 'master' into update-proxy-info 2020-02-28 03:53:55 +05:30
Dmitry Yankowski
05d1535823 Merge branch 'master' into liyasthomas/master 2020-02-27 00:28:36 -05:00
Dmitry Yankowski
21e8277dd9 Merge remote-tracking branch 'liyasthomas/master' 2020-02-27 00:27:38 -05:00
Dmitry Yankowski
1ed4179b70 Merge pull request #612 from liyasthomas/hotfix/URI
🐛 FIxed URI not updating on Clear content, minor formData improve…
2020-02-26 22:21:18 -05:00
Liyas Thomas
448c239f9f 🐛 FIxed URI not updating on Clear content, minor formData improvement 2020-02-27 07:46:39 +05:30
Liyas Thomas
b947c96858 Merge branch 'master' into update-proxy-info 2020-02-27 05:51:03 +05:30
Liyas Thomas
b1c76c0ba6 Merge pull request #609 from AndrewBastin/bug/install-toast-even-on-installed
Fixed install extension toast appearing even when extension is installed
2020-02-27 05:50:28 +05:30
John Harker
4c3248065e Merge branch 'master' into update-proxy-info 2020-02-26 23:56:39 +00:00
NBTX
f609d36818 Update proxy information. 2020-02-26 23:48:24 +00:00
Andrew Bastin
e3eba8b39f Fixed install extension toast appearing even when extension is installed 2020-02-26 18:40:54 -05:00
Liyas Thomas
679ef22438 Merge pull request #603 from liyasthomas/feature/fast-url
Added regex to handle url parts
2020-02-26 22:33:27 +05:30
Liyas Thomas
7148738112 Merge branch 'master' into feature/fast-url 2020-02-26 13:33:26 +05:30
Liyas Thomas
02c4d40f94 Merge pull request #606 from liyasthomas/dependabot/npm_and_yarn/lint-staged-10.0.8
chore(deps-dev): bump lint-staged from 10.0.7 to 10.0.8
2020-02-26 13:20:12 +05:30
dependabot-preview[bot]
4239b1358e chore(deps-dev): bump lint-staged from 10.0.7 to 10.0.8
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.0.7 to 10.0.8.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.0.7...v10.0.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 06:45:23 +00:00
Liyas Thomas
21e99598fc Merge pull request #602 from dmitryyankowski/feature/fix-gql-state
GraphQL page improvements, and more
2020-02-26 12:13:00 +05:30
Jacob Anavisca
54207e3f33 uri update when selecting request 2020-02-26 00:02:22 -05:00
Jacob Anavisca
5849d351c2 Minor ui update 2020-02-25 23:43:27 -05:00
Jacob Anavisca
eac8381981 Minor get uri update 2020-02-25 22:52:58 -05:00
Dmitry Yankowski
50339a2480 Moved both prettier config and husky config into package.json 2020-02-25 22:48:36 -05:00
Dmitry Yankowski
dddd8f32e8 Re-trigger build 2020-02-25 22:41:08 -05:00
Jacob Anavisca
caf07cd8ba url api and updated test 2020-02-25 22:40:51 -05:00
Dmitry Yankowski
2802e04688 Re-trigger build 2020-02-25 22:40:50 -05:00
Jacob Anavisca
492d1cfa8f url api and updated test 2020-02-25 22:36:14 -05:00
Dmitry Yankowski
f36b91c3cc Switch to semantic if checks
Should stick to semantic code here.. rather than doing the shorthand way
2020-02-25 21:38:54 -05:00
Dmitry Yankowski
60f2482082 Set response to proper error message
Was setting the response to an empty string. But this makes it show the correct error.
2020-02-25 21:22:32 -05:00
Dmitry Yankowski
8d7c6f46b7 Remove shouldLint variable 2020-02-25 20:49:19 -05:00
Dmitry Yankowski
590403650e Remove unnecessary variable 2020-02-25 20:48:48 -05:00
Dmitry Yankowski
f4b46763a4 Pretty-quick commited files 2020-02-25 20:44:03 -05:00
Dmitry Yankowski
68c749b378 Allow the passing of a lint prop to disable linting on an editor 2020-02-25 20:43:34 -05:00
Dmitry Yankowski
2a1eca1539 Merge branch 'master' into feature/fix-gql-state 2020-02-25 18:38:26 -05:00
Jacob Anavisca
8cc7b525d9 Added regex to handle url parts 2020-02-25 18:25:56 -05:00
Andrew Bastin
711cabcf9b Merge pull request #605 from AndrewBastin/feat/lint-json
JSON linting in the code editor
2020-02-25 17:48:46 -05:00
Andrew Bastin
b9b0745f30 Added linting for JSON in the Code Editor 2020-02-25 12:09:46 -05:00
Andrew Bastin
f7f4f02d4a Added a JSON parser to evaluate JSON code 2020-02-25 12:08:33 -05:00
Dmitry Yankowski
3d32377cb9 Final push for WIP 2020-02-25 11:41:02 -05:00
Dmitry Yankowski
0cfcfa0026 Final push for WIP 2020-02-25 11:40:36 -05:00
Dmitry Yankowski
2a0322541d Re-push formatted files 2020-02-25 11:39:10 -05:00
Dmitry Yankowski
fb0c6d42eb Remove trailing slash from url if it exists 2020-02-25 11:32:40 -05:00
Dmitry Yankowski
4867df5fe8 Push updated files 2020-02-25 11:10:40 -05:00
Dmitry Yankowski
e88f98418a Remove duplicate code 2020-02-25 11:10:18 -05:00
Dmitry Yankowski
6769ca8905 Merge branch 'master' into feature/fix-gql-state 2020-02-25 10:57:44 -05:00
Dmitry Yankowski
8e9d6ae084 Merge remote-tracking branch 'origin/feature/fix-gql-state' into feature/fix-gql-state 2020-02-25 10:56:47 -05:00
Dmitry Yankowski
ef7f1334fe Re-trigger build 2020-02-25 10:56:36 -05:00
Dmitry Yankowski
45b2b81fe4 Disable spell check on input fields 2020-02-25 10:56:36 -05:00
Dmitry Yankowski
ab4004fae0 Fix: Set showExtensionsToast to false in local storage if no is clicked 2020-02-25 10:56:36 -05:00
Dmitry Yankowski
cd91bc0628 Set showExtensionsToast to false in local storage if no is clicked 2020-02-25 10:56:36 -05:00
Dmitry Yankowski
6d534d312f Fix auto scroll
Wasn't actually working with the last PR. This one fixes it.
2020-02-25 10:56:30 -05:00
Dmitry Yankowski
ab49a125b2 Add loading message in response box for "Run query" action 2020-02-25 10:56:23 -05:00
Dmitry Yankowski
2d5b70ab85 Save collapsed sections to state
When you refresh or navigate to a new page and back, your collapsed sections will be as you set them.
2020-02-25 10:56:23 -05:00
Dmitry Yankowski
6b675d5def Change from v-model to value as this is not set by the user 2020-02-25 10:55:57 -05:00
Dmitry Yankowski
5779cddf22 Save GraphQL schema and response in state
Allows the user to go to the settings page, and back to the GraphQL page, without having to re-request the schema or response.
2020-02-25 10:55:57 -05:00
Liyas Thomas
77b50c0be3 Updating tests 2020-02-25 20:06:58 +05:30
Liyas Thomas
aeebe5015e Updating tests 2020-02-25 19:03:07 +05:30
James George
fbbe1a05a0 Merge pull request #596 from dmitryyankowski/feature/prettier-formatting
Feature: Add prettier/pretty-quick formatting w/ Husky pre-commit
2020-02-25 18:22:37 +05:30
James George
19bfa3a7c3 Merge branch 'master' into feature/prettier-formatting 2020-02-25 14:40:25 +05:30
ahpo
13c85b3a45 feat(i18n): add Korean 2020-02-25 04:08:19 -05:00
Liyas Thomas
8e0adc9514 🐛 Fixed primary theme swatch active state 2020-02-25 04:08:11 -05:00
NBTX
94ee60b832 Improve page load/unload experience (remove FOUCs) 2020-02-25 04:07:58 -05:00
Liyas Thomas
00b623d823 Updating tests 2020-02-25 04:07:32 -05:00
Dmitry Yankowski
d39b190788 Add on to prettier with pretty-quick
Pretty-quick will only format files that have been changed since the last commit.
2020-02-25 03:59:48 -05:00
Dmitry Yankowski
b8ba6e39e2 Re-trigger build 2020-02-25 02:04:10 -05:00
Dmitry Yankowski
90d347dc89 Disable spell check on input fields 2020-02-25 01:43:55 -05:00
Jacob Anavisca
77ea9dfac9 Added regex to handle url parts 2020-02-25 01:35:15 -05:00
Dmitry Yankowski
1d616c7ec6 Fix: Set showExtensionsToast to false in local storage if no is clicked 2020-02-25 01:03:29 -05:00
Dmitry Yankowski
0eab54cbdc Set showExtensionsToast to false in local storage if no is clicked 2020-02-25 00:59:10 -05:00
Dmitry Yankowski
62a970e8c3 Fix auto scroll
Wasn't actually working with the last PR. This one fixes it.
2020-02-25 00:32:03 -05:00
Dmitry Yankowski
7c23cd7c4c Add loading message in response box for "Run query" action 2020-02-24 23:59:18 -05:00
Liyas Thomas
e233e9be16 Merge branch 'master' into feature/fix-gql-state 2020-02-25 10:11:13 +05:30
Liyas Thomas
09d98cff7d Merge pull request #601 from liyasthomas/i18n
i18n
2020-02-25 10:10:30 +05:30
Dmitry Yankowski
a3d6573d93 Save collapsed sections to state
When you refresh or navigate to a new page and back, your collapsed sections will be as you set them.
2020-02-24 23:34:06 -05:00
Liyas Thomas
38ec50bf0e Merge branch 'master' into i18n 2020-02-25 09:10:20 +05:30
Liyas Thomas
a8c380c67a Merge pull request #599 from liyasthomas/fix/fouc-page-load-unload
Improve page load/unload experience (remove FOUCs)
2020-02-25 09:07:13 +05:30
Liyas Thomas
b8a8aa53ba Merge pull request #600 from 9j/i18n
feat(i18n): add Korean
2020-02-25 09:06:44 +05:30
ahpo
3b1f232bc0 feat(i18n): add Korean 2020-02-25 12:21:33 +09:00
Dmitry Yankowski
f846cf32fd Update proxy spec 2020-02-24 21:51:36 -05:00
Dmitry Yankowski
48100ead55 Commit code with double quotes instead of single quotes 2020-02-24 21:06:23 -05:00
Dmitry Yankowski
3bd7c00038 Set semi to false in .prettierrc 2020-02-24 21:05:52 -05:00
Liyas Thomas
6962d22142 🐛 Fixed primary theme swatch active state 2020-02-25 06:43:39 +05:30
John Harker
a4014c3f39 Merge branch 'master' into fix/fouc-page-load-unload 2020-02-25 00:13:09 +00:00
NBTX
4758acc413 Improve page load/unload experience (remove FOUCs) 2020-02-25 00:09:56 +00:00
Liyas Thomas
939ffcd42a Updating tests 2020-02-25 05:06:40 +05:30
Dmitry Yankowski
403254a983 Change from v-model to value as this is not set by the user 2020-02-24 16:16:06 -05:00
Dmitry Yankowski
21c6c07b39 Save GraphQL schema and response in state
Allows the user to go to the settings page, and back to the GraphQL page, without having to re-request the schema or response.
2020-02-24 16:12:02 -05:00
Dmitry Yankowski
070a830eaa Fix local build 2020-02-24 15:13:20 -05:00
Dmitry Yankowski
c635d21180 Fix package-lock.json file 2020-02-24 15:11:01 -05:00
Dmitry Yankowski
19c9c5491b Revert "Ignore build.js file (Prettier)"
This reverts commit c2befaee46.
2020-02-24 14:56:39 -05:00
Dmitry Yankowski
c2befaee46 Ignore build.js file (Prettier) 2020-02-24 14:54:32 -05:00
Dmitry Yankowski
7dc702c626 Merge branch 'master' into feature/prettier-formatting 2020-02-24 14:26:43 -05:00
Dmitry Yankowski
b8b2dfda76 Change yarn to npm run 2020-02-24 13:59:12 -05:00
Dmitry Yankowski
97f5ffc8ae Remove the ts,tsx from prettier function
We aren't using Typescript here, so let's remove it
2020-02-24 13:55:04 -05:00
Dmitry Yankowski
241abd3c50 Final prettier formatted file 2020-02-24 13:45:18 -05:00
Dmitry Yankowski
777e629b3d Initial prettier formatted files 2020-02-24 13:44:50 -05:00
Dmitry Yankowski
1543c990ca Fix prettier function 2020-02-24 13:44:14 -05:00
Dmitry Yankowski
b0f5ab9776 Add prettier/husky config 2020-02-24 13:38:24 -05:00
Andrew Bastin
fdedaa073a Merge pull request #595 from dmitryyankowski/master
Added settings toggle for enabling/disabling auto scrolling (scrollInto functionality)
2020-02-24 12:53:50 -05:00
jamesgeorge007
f8d032d9fc fix: regression 2020-02-24 22:57:35 +05:30
jamesgeorge007
64e20a1350 fix: enable auto scroll by default 2020-02-24 22:26:13 +05:30
Dmitry Yankowski
0c8eea65a5 Added toggle for enabling/disabling auto scrolling (scrollInto functionality) 2020-02-24 10:54:22 -05:00
Liyas Thomas
08bb47da1d 🔖 v1.9.0 2020-02-24 18:43:14 +05:30
Liyas Thomas
4fad3808a2 🔖 v1.9.0 2020-02-24 18:36:14 +05:30
Liyas Thomas
f05a875a05 Merge pull request #591 from liyasthomas/feature/env-manager
Environment Mangement
2020-02-24 14:14:18 +05:30
Liyas Thomas
4f7f2ba361 Merge branch 'master' into feature/env-manager 2020-02-24 13:52:30 +05:30
Liyas Thomas
0cfe87e65c Updated contributors list 2020-02-24 12:21:00 +05:30
Andrew Bastin
5ec9944f2a Merge pull request #594 from AndrewBastin/feat/post-raw-type-handle
POST request body editor reacts to the content type
2020-02-24 00:44:16 -05:00
Andrew Bastin
fa339a5183 Updated POST request body to react to the Content Type 2020-02-23 23:24:23 -05:00
Andrew Bastin
5936a06ad1 Added editorutils file with a utility function to convert mimetype to editor modes 2020-02-23 23:23:18 -05:00
Jacob Anavisca
c21bbf1022 Merge branch 'master' into feature/env-manager 2020-02-23 22:21:55 -05:00
Jacob Anavisca
00fa17b31f Review Updates 2020-02-23 22:21:10 -05:00
John Harker
6e03c8d236 Merge pull request #593 from dmitryyankowski/patch-1
Fix variablesJSONString store default for GraphQL page
2020-02-24 01:06:15 +00:00
Dmitry Yankowski
7022ef5f7e Fix variables JSON string
I don't have any variables set, and when running a mutation; I get the following error:

```
Error SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at VueComponent._callee$ (graphql.vue?f047:505)
    at tryCatch (runtime.js?96cf:45)
    at Generator.invoke [as _invoke] (runtime.js?96cf:271)
    at Generator.prototype.<computed> [as next] (runtime.js?96cf:97)
    at asyncGeneratorStep (asyncToGenerator.js?1da1:3)
    at _next (asyncToGenerator.js?1da1:25)
    at eval (asyncToGenerator.js?1da1:32)
    at new Promise (<anonymous>)
    at VueComponent.eval (asyncToGenerator.js?1da1:21)
```

Setting the `variablesJSONString` variable to the correct default (`{}`) fixes this issue :)
2020-02-23 19:42:59 -05:00
Liyas Thomas
54d590765f Typo 2020-02-24 00:48:39 +05:30
Liyas Thomas
d24c572d7f Firebase sync 2020-02-24 00:30:22 +05:30
Liyas Thomas
010be95ed5 Lint + few best practices 2020-02-23 22:43:12 +05:30
Jacob Anavisca
59ca8cb2c6 Merge branch 'master' into feature/env-manager 2020-02-23 11:39:44 -05:00
Jacob Anavisca
15dc0ad9ac Env management 2020-02-23 11:38:15 -05:00
Andrew Bastin
f690ea01c4 Merge pull request #590 from AndrewBastin/feat/gql-hints
GraphQL Query Autocompletion
2020-02-22 22:04:08 -05:00
Liyas Thomas
9c09a8128a Lint 2020-02-23 06:58:13 +05:30
Andrew Bastin
16779d496e Updated GQL Query Editor code to show autocompletion 2020-02-22 19:25:34 -05:00
Andrew Bastin
3ab7318b25 Added graphql-language-service-interface as dependency 2020-02-22 19:24:59 -05:00
Liyas Thomas
a2b7e039d5 Merge pull request #589 from liyasthomas/refactor/lint
Refactor/lint
2020-02-22 23:49:12 +05:30
Liyas Thomas
a68e88826f Merge branch 'refactor/lint' of https://github.com/liyasthomas/postwoman into refactor/lint 2020-02-22 23:14:32 +05:30
Liyas Thomas
7c8545c21b Merge pull request #588 from liyasthomas/master
Even
2020-02-22 23:13:53 +05:30
Liyas Thomas
d17c3b4aa3 Merge branch 'refactor/lint' of https://github.com/liyasthomas/postwoman into refactor/lint 2020-02-22 23:09:13 +05:30
Liyas Thomas
a0529b1cdd 💫 Butter smooth animations and transitions 2020-02-22 23:06:32 +05:30
Liyas Thomas
1f0c77c3bf Merge pull request #587 from liyasthomas/dependabot/npm_and_yarn/firebase-7.9.1
chore(deps): bump firebase from 7.9.0 to 7.9.1
2020-02-22 06:21:12 +05:30
dependabot-preview[bot]
56acfab2b2 chore(deps): bump firebase from 7.9.0 to 7.9.1
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.9.0 to 7.9.1.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.9.0...firebase@7.9.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-22 00:14:02 +00:00
Liyas Thomas
256cef9047 Merge pull request #585 from liyasthomas/dependabot/npm_and_yarn/firebase-7.9.0
chore(deps): bump firebase from 7.8.2 to 7.9.0
2020-02-21 13:18:41 +05:30
dependabot-preview[bot]
7d3750e54c chore(deps): bump firebase from 7.8.2 to 7.9.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.8.2 to 7.9.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.8.2...firebase@7.9.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-21 07:17:25 +00:00
Liyas Thomas
f021d080af Merge pull request #584 from liyasthomas/dependabot/npm_and_yarn/vue-virtual-scroll-list-1.4.6
chore(deps): bump vue-virtual-scroll-list from 1.4.5 to 1.4.6
2020-02-21 12:45:04 +05:30
Liyas Thomas
293400fd76 Merge pull request #586 from liyasthomas/master
Even
2020-02-21 12:16:41 +05:30
dependabot-preview[bot]
c495ca5256 chore(deps): bump vue-virtual-scroll-list from 1.4.5 to 1.4.6
Bumps [vue-virtual-scroll-list](https://github.com/tangbc/vue-virtual-scroll-list) from 1.4.5 to 1.4.6.
- [Release notes](https://github.com/tangbc/vue-virtual-scroll-list/releases)
- [Commits](https://github.com/tangbc/vue-virtual-scroll-list/compare/v1.4.5...v1.4.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-21 06:25:12 +00:00
Liyas Thomas
956c7bf93a Merge pull request #582 from levrik/patch-1
Update link to extension repo in README
2020-02-21 08:13:30 +05:30
Andrew Bastin
219d88851e Merge branch 'master' into patch-1 2020-02-20 19:30:29 -05:00
Andrew Bastin
9b9fb62596 Merge pull request #583 from levrik/extension-check
Adapt extension check to new extensions
2020-02-20 19:29:16 -05:00
Levin Rickert
f636e7dbd4 Adapt extension check to new extensions 2020-02-20 19:36:30 +01:00
Levin Rickert
33f2341f7f Update link to extension repo in README 2020-02-20 19:22:10 +01:00
Liyas Thomas
f5bbcb2777 Merge pull request #578 from liyasthomas/refactor/lint
Refactor/lint
2020-02-20 10:12:53 +05:30
jamesgeorge007
5a56081a29 fix: remove unused code snippet 2020-02-20 09:46:07 +05:30
jamesgeorge007
d2b73a8942 refactor: nested destructuring 2020-02-20 09:45:19 +05:30
Liyas Thomas
09a35cf10a 🚨 Lint 2020-02-20 08:52:42 +05:30
Liyas Thomas
eb7ac7bfc4 Merge pull request #579 from liyasthomas/master
Even
2020-02-20 08:45:15 +05:30
Liyas Thomas
a98636ed39 Merge pull request #573 from levrik/unify-extensions
Unify Chrome and Firefox extensions
2020-02-20 08:06:33 +05:30
Liyas Thomas
73a2a0a127 Updated color codes, minor UI tweaks 2020-02-20 08:01:22 +05:30
Andrew Bastin
494dc72eb9 Merge branch 'master' into unify-extensions 2020-02-19 21:14:57 -05:00
Liyas Thomas
4665dbc372 🚨 Lint 2020-02-19 09:29:49 +05:30
Liyas Thomas
0b6671d538 🎨 Improving structure / format of the code 2020-02-18 23:56:22 +05:30
Liyas Thomas
392c97f35f Even 2020-02-18 22:13:07 +05:30
Liyas Thomas
8629eda6d4 📱 Working on responsive design 2020-02-18 22:10:53 +05:30
Liyas Thomas
8507f11175 Merge pull request #576 from liyasthomas/dependabot/npm_and_yarn/vue-virtual-scroll-list-1.4.5
chore(deps): bump vue-virtual-scroll-list from 1.4.4 to 1.4.5
2020-02-18 07:20:20 +05:30
dependabot-preview[bot]
ae6d33febd chore(deps): bump vue-virtual-scroll-list from 1.4.4 to 1.4.5
Bumps [vue-virtual-scroll-list](https://github.com/tangbc/vue-virtual-scroll-list) from 1.4.4 to 1.4.5.
- [Release notes](https://github.com/tangbc/vue-virtual-scroll-list/releases)
- [Commits](https://github.com/tangbc/vue-virtual-scroll-list/compare/v1.4.4...v1.4.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-18 01:05:27 +00:00
Liyas Thomas
54e11170fb Merge pull request #574 from liyasthomas/feature/postmanParsing
Postman collection parsing
2020-02-17 14:26:12 +05:30
Levin Rickert
66eecf5e37 Unify Chrome and Firefox extensions 2020-02-16 15:48:10 +01:00
Jacob Anavisca
f7b1e876ad Merge branch 'master' into feature/postmanParsing 2020-02-15 17:39:28 -05:00
Jacob Anavisca
ccff68ad18 Postman collection parsing 2020-02-15 17:36:38 -05:00
James George
112c140ce7 Merge pull request #572 from liyasthomas/hotfix/share
fix: drop the toast which doesn't show up
2020-02-15 13:40:48 +05:30
jamesgeorge007
c2cd9f0865 fix: drop toast 2020-02-15 12:00:45 +05:30
Liyas Thomas
749e89e362 Merge pull request #571 from liyasthomas/feature/native-share
 Native share + updated meta description
2020-02-15 11:42:18 +05:30
jamesgeorge007
7241bbbb6d feat: show toast info if Web Share API is not supported 2020-02-15 11:19:38 +05:30
jamesgeorge007
edb7bef5a3 fix: use Vue.js on-click directive 2020-02-15 11:17:43 +05:30
Liyas Thomas
436de528e9 Native share + updated meta description 2020-02-15 09:53:26 +05:30
Liyas Thomas
7f0f932aca Merge pull request #570 from liyasthomas/dependabot/npm_and_yarn/firebase-7.8.2
chore(deps): bump firebase from 7.8.1 to 7.8.2
2020-02-15 07:12:59 +05:30
dependabot-preview[bot]
73d2d58da9 chore(deps): bump firebase from 7.8.1 to 7.8.2
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.8.1 to 7.8.2.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.8.1...firebase@7.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-15 01:24:58 +00:00
Liyas Thomas
777b201c1f Merge pull request #569 from liyasthomas/dependabot/npm_and_yarn/cypress-4.0.2
chore(deps-dev): bump cypress from 4.0.1 to 4.0.2
2020-02-15 06:52:32 +05:30
dependabot-preview[bot]
11ff85c56c chore(deps-dev): bump cypress from 4.0.1 to 4.0.2
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.0.1 to 4.0.2.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.0.1...v4.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-15 00:14:39 +00:00
Liyas Thomas
a9ed1c0fe8 🔧 Minor under the hood changes according to HTML specs 2020-02-13 17:13:11 +05:30
Liyas Thomas
9a06b19288 Merge pull request #568 from liyasthomas/fix/collection-sync
Added create collection and save request syncs
2020-02-13 15:28:31 +05:30
Liyas Thomas
516610a820 Better Collections Sync 2020-02-13 15:12:17 +05:30
Jacob Anavisca
8b989924a4 Added create collection and save request syncs 2020-02-13 00:00:19 -05:00
Liyas Thomas
bd3e1b7592 Merge pull request #566 from AndrewBastin/refactor/headers
Moved common headers to a separate file
2020-02-11 17:46:05 +05:30
James George
af18b95ffa Merge branch 'master' into refactor/headers 2020-02-11 15:52:54 +05:30
jamesgeorge007
9ecec8ce17 refactor: object shorthand 2020-02-11 15:14:03 +05:30
jamesgeorge007
f2f097bb7e refactor: use relative imports 2020-02-11 15:09:07 +05:30
jamesgeorge007
27da1c8e49 refactor: use relative imports 2020-02-11 15:07:43 +05:30
Liyas Thomas
015fd24e03 Minor UI tweaks 2020-02-11 08:51:34 +05:30
Liyas Thomas
1306b78f63 Merge branch 'master' into refactor/headers 2020-02-11 07:02:32 +05:30
Liyas Thomas
ad0b342d89 Merge pull request #565 from liyasthomas/dependabot/npm_and_yarn/cypress-4.0.1
chore(deps-dev): bump cypress from 4.0.0 to 4.0.1
2020-02-11 07:00:51 +05:30
Andrew Bastin
6d463dcfef Updated commonHeaders definition to use the imported ones 2020-02-10 18:12:31 -05:00
Andrew Bastin
965923116d Added Common Headers to a separate file 2020-02-10 18:12:21 -05:00
dependabot-preview[bot]
3281adce65 chore(deps-dev): bump cypress from 4.0.0 to 4.0.1
Bumps [cypress](https://github.com/cypress-io/cypress) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v4.0.0...v4.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-10 22:49:31 +00:00
Liyas Thomas
74f6be6123 Merge pull request #564 from liyasthomas/dependabot/npm_and_yarn/yargs-parser-17.0.0
chore(deps): bump yargs-parser from 16.1.0 to 17.0.0
2020-02-11 04:17:27 +05:30
dependabot-preview[bot]
74b997ba49 chore(deps): bump yargs-parser from 16.1.0 to 17.0.0
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 16.1.0 to 17.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/v16.1.0...v17.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-10 22:30:43 +00:00
Liyas Thomas
b7c6f3e2bb Merge pull request #561 from liyasthomas/dependabot/npm_and_yarn/firebase-7.8.1
chore(deps): bump firebase from 7.8.0 to 7.8.1
2020-02-08 06:17:47 +05:30
dependabot-preview[bot]
8506275f90 chore(deps): bump firebase from 7.8.0 to 7.8.1
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.8.0 to 7.8.1.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.8.0...firebase@7.8.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-08 00:32:17 +00:00
Liyas Thomas
64c3a82189 Merge pull request #562 from liyasthomas/dependabot/npm_and_yarn/cypress-4.0.0
chore(deps-dev): bump cypress from 3.8.3 to 4.0.0
2020-02-08 06:00:08 +05:30
dependabot-preview[bot]
23b1d94808 chore(deps-dev): bump cypress from 3.8.3 to 4.0.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 3.8.3 to 4.0.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Commits](https://github.com/cypress-io/cypress/compare/v3.8.3...v4.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-08 00:14:37 +00:00
James George
0a9712d227 Merge pull request #559 from liyasthomas/tweaks
chore: use typeof as an operator and make use of localizable strings
2020-02-07 15:28:31 +05:30
jamesgeorge007
6575d03f45 refactor: use localizable string 2020-02-07 14:58:03 +05:30
jamesgeorge007
6037daedcd refactor: use localizable string 2020-02-07 14:57:57 +05:30
jamesgeorge007
a351abd5d9 refactor: use typeof as an operator 2020-02-07 14:44:14 +05:30
jamesgeorge007
8b00bb59de refactor: use typeof as an operator 2020-02-07 14:43:13 +05:30
Liyas Thomas
910c20bd00 📱 Working on responsive design 2020-02-07 09:06:52 +05:30
Liyas Thomas
885318623f Merge pull request #556 from AndrewBastin/master
Fixed typo in translation file for Auto theme
2020-02-07 07:02:06 +05:30
Andrew Bastin
e1df6105ed Fixed typo in translation file for Auto theme 2020-02-06 12:48:54 -05:00
Andrew Bastin
c4879d598b Merge pull request #551 from AndrewBastin/feat/extension-toggle
Added toggle to decide whether extensions should be used
2020-02-05 13:34:20 -05:00
Andrew Bastin
cc9cfa53fa Merge branch 'master' into feat/extension-toggle 2020-02-05 13:17:30 -05:00
Liyas Thomas
996bb206c6 Merge pull request #554 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/pwa-3.0.0-beta.20
chore(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20
2020-02-05 23:42:27 +05:30
Liyas Thomas
df0ac3b7c8 Merge pull request #555 from liyasthomas/formdata
Support for Formdata
2020-02-05 23:29:56 +05:30
dependabot-preview[bot]
df68f9ac25 chore(deps): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20
Bumps [@nuxtjs/pwa](https://github.com/nuxt-community/pwa-module) from 3.0.0-beta.19 to 3.0.0-beta.20.
- [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.19...v3.0.0-beta.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 17:46:08 +00:00
Liyas Thomas
a639ee63dd Merge pull request #553 from liyasthomas/dependabot/npm_and_yarn/nuxtjs/axios-5.9.5
chore(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5
2020-02-05 23:14:01 +05:30
Liyas Thomas
04feb3cdbe Support for Formdata 2020-02-05 23:04:46 +05:30
dependabot-preview[bot]
f77f0a59ec chore(deps): bump @nuxtjs/axios from 5.9.4 to 5.9.5
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.9.4 to 5.9.5.
- [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.9.4...v5.9.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 17:21:32 +00:00
Liyas Thomas
fdc5695fb4 🎨 Fixes 2020-02-05 19:22:03 +05:30
Liyas Thomas
f24477e7b4 🎉 Initial formdata support and UI tweaks 2020-02-05 09:20:04 +05:30
Andrew Bastin
0e561e7bc2 Removed logging 2020-02-04 19:01:26 +00:00
Andrew Bastin
257cb5141b Merge branch 'master' into feat/extension-toggle 2020-02-04 13:17:46 -05:00
Andrew Bastin
89312347d1 Updated strategy identification to consider extensions toggle 2020-02-04 13:13:20 -05:00
Andrew Bastin
f1e752892d Added toggle for using extensions to send requests 2020-02-04 13:09:29 -05:00
Liyas Thomas
6a13b8c3c5 🎨 Better drop-down for method field 2020-02-04 20:52:52 +05:30
Liyas Thomas
c43a864480 Merge branch 'master' of https://github.com/liyasthomas/postwoman 2020-02-04 07:06:41 +05:30
Liyas Thomas
06d58547c8 Custom methods support (follow up of #398) 2020-02-04 07:05:37 +05:30
Andrew Bastin
173e3a3fc0 Merge pull request #549 from AndrewBastin/feat/proper-key-def
Show Ctrl instead of Command for shortcuts non-Apple platforms
2020-02-03 18:38:12 -05:00
Andrew Bastin
d0cf780ea2 Show Ctrl instead of Command for shortcuts non-Apple platforms 2020-02-03 17:47:48 -05:00
James George
493538ae70 Merge pull request #548 from liyasthomas/hotfix/validate-collection
fix(chore): Take letter casing into account while checking for duplicate collection
2020-02-03 18:47:41 +05:30
jamesgeorge007
955bb5c99d fix: account for letter casing while creating editing a collection 2020-02-03 17:38:38 +05:30
jamesgeorge007
88fc45975f fix: account for letter casing while creating new collection 2020-02-03 17:38:07 +05:30
Liyas Thomas
09a88b4a97 💄 Updating the UI and style files 2020-02-03 08:38:40 +05:30
Liyas Thomas
67e98ef46b Merge pull request #546 from yubathom/fix/start-server-and-test
update e2e tests
2020-02-02 11:07:16 +05:30
yubathom
85c5f16e93 tests(fix): update start-server-and-test, update e2e tests, change build test command at ci 2020-02-02 02:01:21 -03:00
Liyas Thomas
7cf5345c5a ️ Sync Collection -> Notes 2020-02-02 08:31:06 +05:30
James George
4c62baa577 Merge pull request #543 from liyasthomas/refactor
Refactor
2020-02-01 23:44:54 +05:30
jamesgeorge007
0f55b8ee8a refactor: minor tweak 2020-02-01 22:56:29 +05:30
jamesgeorge007
ad041a5cf1 refactor: tweaks 2020-02-01 22:49:09 +05:30
jamesgeorge007
3bd22f6b78 refactor: let to const 2020-02-01 22:48:06 +05:30
jamesgeorge007
fa15457ce4 refactor: let to const 2020-02-01 22:44:24 +05:30
jamesgeorge007
ef434ca804 refactor: destructuring assignment 2020-02-01 22:30:35 +05:30
jamesgeorge007
2b165a065c refactor: stick with the enforced style 2020-02-01 22:26:31 +05:30
James George
12b7e22c31 Merge branch 'master' into refactor 2020-02-01 20:23:30 +05:30
jamesgeorge007
d77e3745bb refactor: stylistic update 2020-01-31 19:50:24 +05:30
jamesgeorge007
5429e493ea refactor: stylistic update 2020-01-31 19:47:19 +05:30
jamesgeorge007
b05cd2e6e4 refactor: stick with Es6 semantics 2020-01-31 19:45:52 +05:30
jamesgeorge007
a9564086b0 refactor: destructuring assignment and other tweaks 2020-01-31 19:44:49 +05:30
Liyas Thomas
c32c6e0363 ♻️ Refactor 2020-01-31 18:25:55 +05:30
Liyas Thomas
f9008df1c6 chore(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4 (#545)
chore(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4
2020-01-31 07:07:41 +05:30
dependabot-preview[bot]
9a2fa9e2c7 chore(deps): bump @nuxtjs/axios from 5.9.3 to 5.9.4
Bumps [@nuxtjs/axios](https://github.com/nuxt-community/axios-module) from 5.9.3 to 5.9.4.
- [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.9.3...v5.9.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-31 01:25:41 +00:00
Liyas Thomas
dd8f7d078b chore(deps): bump graphql from 14.5.8 to 14.6.0 (#541)
chore(deps): bump graphql from 14.5.8 to 14.6.0
2020-01-31 06:53:37 +05:30
dependabot-preview[bot]
b40d5a75f2 chore(deps): bump graphql from 14.5.8 to 14.6.0
Bumps [graphql](https://github.com/graphql/graphql-js) from 14.5.8 to 14.6.0.
- [Release notes](https://github.com/graphql/graphql-js/releases)
- [Commits](https://github.com/graphql/graphql-js/compare/v14.5.8...v14.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-31 01:07:32 +00:00
Liyas Thomas
01e41ba1b2 chore(deps): bump firebase from 7.7.0 to 7.8.0 (#542)
chore(deps): bump firebase from 7.7.0 to 7.8.0
2020-01-31 06:35:34 +05:30
dependabot-preview[bot]
1ed28a717c chore(deps): bump firebase from 7.7.0 to 7.8.0
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 7.7.0 to 7.8.0.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@7.7.0...firebase@7.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-31 00:50:57 +00:00
Liyas Thomas
1d6d8af748 ♻️ Refactor 2020-01-31 00:18:20 +05:30
Liyas Thomas
f80c5d6a46 ♻️ Refactor 2020-01-30 23:45:38 +05:30
Liyas Thomas
6c7643a4c3 Press Escape to close modal, Enter to return. Fixes #539 2020-01-30 20:35:22 +05:30
Liyas Thomas
563ac1d2fb Merge pull request #538 from liyasthomas/i18n
i18n
2020-01-30 10:24:17 +05:30
Andrew Bastin
91511c09f3 Merge pull request #534 from AndrewBastin/feat/gql-variable-update
Updated GraphQL Query Variable Editor
2020-01-29 22:17:45 -05:00
Liyas Thomas
82180a54f1 Modification of French translations (#537)
Modification of French translations
2020-01-30 08:33:45 +05:30
Thomas Bnt
aee2863caf Modification of French language 2020-01-30 03:03:16 +01:00
Liyas Thomas
ac705a6900 Merge pull request #535 from liyasthomas/master
Even
2020-01-30 07:30:40 +05:30
Andrew Bastin
5b4f3f5b67 Merge branch 'master' into feat/gql-variable-update 2020-01-29 20:49:05 -05:00
Andrew Bastin
94c2440832 Hooked the new variable editor to the persistent store 2020-01-29 20:35:54 -05:00
Andrew Bastin
5d2ba22988 Removed mutations for GraphQL variables 2020-01-29 20:21:23 -05:00
Andrew Bastin
cf9fe0c02c Removed old variable store mechanisms 2020-01-29 20:05:59 -05:00
Liyas Thomas
4c57139cdc Improving Lighthouse score 2020-01-28 20:03:31 +05:30
Liyas Thomas
2c0b8b5f8e Improving Lighthouse score 2020-01-28 20:02:07 +05:30
Liyas Thomas
2634eb10be 🔖 v1.8.0 2020-01-28 07:37:14 +05:30
Andrew Bastin
d35d3061e5 Added variable editor and removed the old variable system 2020-01-27 18:42:38 -05:00
Liyas Thomas
aca53be909 Updating spanish translation (#529)
Updating spanish translation
2020-01-27 05:44:51 +05:30
Liyas Thomas
e3221aedaa even merge (#528)
even merge
2020-01-27 05:36:22 +05:30
Alfredo Finol
363902a588 Updating spanish translation 2020-01-26 17:00:55 -03:00
135 changed files with 16138 additions and 10382 deletions

View File

@@ -114,11 +114,30 @@
"contributions": [
"code"
]
},
{
"login": "dmitryyankowski",
"name": "Dmitry Yankowski",
"avatar_url": "https://avatars0.githubusercontent.com/u/20114263?v=4",
"profile": "https://dmitryyankowski.com",
"contributions": [
"code"
]
},
{
"login": "sboulema",
"name": "Samir Boulema",
"avatar_url": "https://avatars2.githubusercontent.com/u/1820661?v=4",
"profile": "http://www.sboulema.nl",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,
"projectName": "postwoman",
"projectOwner": "liyasthomas",
"repoType": "github",
"repoHost": "https://github.com"
"repoHost": "https://github.com",
"skipCi": true
}

View File

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

15
.env.example Normal file
View File

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

1
.github/FUNDING.yml vendored
View File

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

6
.gitignore vendored
View File

@@ -98,3 +98,9 @@ sw.*
# File explorer
.directory
# Tests screenshots
tests/*/screenshots
# Tests videos
tests/*/videos

7
.prettierignore Normal file
View File

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

View File

@@ -1,4 +1,4 @@
# == INSTRUCTIONS FOR SETTING UP TRAVIS (and GitHub Pages) ==
# == INSTRUCTIONS FOR SETTING UP TRAVIS ==
#
# 1. Find this repository in your Travis-CI dashboard.
# open settings and add an environment variable called
@@ -8,12 +8,10 @@
# **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:
- "12"
- lts/*
os: linux
@@ -22,34 +20,20 @@ addons:
packages:
- libgconf-2-4 # cypress binary dependency
env:
- DEPLOY_ENV=POSTWOMAN_IO
cache:
npm: true
directories:
- "node_modules"
- ~/.cache
cache: npm
branches:
only:
- "master"
- master
install:
- "npm install firebase-tools"
- "npm install"
- npm ci
before_script:
- "npm run test"
- npm run build # use nuxt build and start to run tests
script:
- "cd functions"
- "npm install"
- "cd .."
- "npm run generate"
- npm test
notifications:
webhooks: https://www.travisbuddy.com
after_success:
- firebase deploy --token $FIREBASE_TOKEN

View File

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

View File

@@ -1,5 +1,409 @@
# Changelog
## [v1.9.7](https://github.com/liyasthomas/postwoman/tree/v1.9.7) (2020-05-12)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.9.5...v1.9.7)
**Implemented enhancements:**
- Unable to use postwoman with latest docker image from docker hub [\#866](https://github.com/liyasthomas/postwoman/issues/866)
- support response json array [\#805](https://github.com/liyasthomas/postwoman/issues/805)
- Add Format Body option [\#767](https://github.com/liyasthomas/postwoman/issues/767)
- Allow importing environment variables via Postman environment json files [\#759](https://github.com/liyasthomas/postwoman/issues/759)
- Request headers kept same after changing request type [\#752](https://github.com/liyasthomas/postwoman/issues/752)
- Add compatibility for postman collections & environments [\#746](https://github.com/liyasthomas/postwoman/issues/746)
- Add GraphQL syntax highlighting [\#741](https://github.com/liyasthomas/postwoman/issues/741)
- Add docker Images for all Tags [\#722](https://github.com/liyasthomas/postwoman/issues/722)
- Provide post-build resources and default setting files [\#714](https://github.com/liyasthomas/postwoman/issues/714)
- Theme lacks of contrast [\#709](https://github.com/liyasthomas/postwoman/issues/709)
- Save collections on account sync turn on [\#679](https://github.com/liyasthomas/postwoman/issues/679)
- Tests should be saved together with requests [\#643](https://github.com/liyasthomas/postwoman/issues/643)
- npm modules of postwoman's vue components [\#384](https://github.com/liyasthomas/postwoman/issues/384)
- \[request\] VS code extension [\#313](https://github.com/liyasthomas/postwoman/issues/313)
- remove prerequest \<\< \>\> bindings when pre-request script is toggled off [\#234](https://github.com/liyasthomas/postwoman/issues/234)
- Dynamic Headers [\#91](https://github.com/liyasthomas/postwoman/issues/91)
- Allow importing environment variables via Postman environment json files [\#862](https://github.com/liyasthomas/postwoman/pull/862) ([sboulema](https://github.com/sboulema))
- Add format body option [\#847](https://github.com/liyasthomas/postwoman/pull/847) ([sboulema](https://github.com/sboulema))
- Save GraphQL Docs [\#846](https://github.com/liyasthomas/postwoman/pull/846) ([AndrewBastin](https://github.com/AndrewBastin))
- GraphQL Query Editor Syntax Highlighting [\#838](https://github.com/liyasthomas/postwoman/pull/838) ([AndrewBastin](https://github.com/AndrewBastin))
**Fixed bugs:**
- Empty header in headers list results in SyntaxError: Failed to execute 'setRequestHeader' [\#765](https://github.com/liyasthomas/postwoman/issues/765)
- Getting cannot read value of undefined [\#731](https://github.com/liyasthomas/postwoman/issues/731)
- Environment variables in collections [\#642](https://github.com/liyasthomas/postwoman/issues/642)
**Closed issues:**
- Import/Export collections from private github repos to share among teams. [\#867](https://github.com/liyasthomas/postwoman/issues/867)
- Access to nonexistent routes will not be redirect to page 404 [\#849](https://github.com/liyasthomas/postwoman/issues/849)
- Error: Network Error. Check console for details. [\#827](https://github.com/liyasthomas/postwoman/issues/827)
- 'Documentation Generated' response stacking past top of page if submit clicked enough times/fast enough [\#826](https://github.com/liyasthomas/postwoman/issues/826)
- The UI could use some improvements [\#825](https://github.com/liyasthomas/postwoman/issues/825)
- Postwoman won't build, produces 'FATAL Nuxt build error' [\#824](https://github.com/liyasthomas/postwoman/issues/824)
- Improve contrast of UI components in all themes [\#819](https://github.com/liyasthomas/postwoman/issues/819)
- Add an option to hide and/or collapse the right panel [\#818](https://github.com/liyasthomas/postwoman/issues/818)
- Docker Cannot log in normally in the container [\#817](https://github.com/liyasthomas/postwoman/issues/817)
- Body in Request [\#815](https://github.com/liyasthomas/postwoman/issues/815)
- How to run postwoman under reverse proxy [\#812](https://github.com/liyasthomas/postwoman/issues/812)
- Call local support [\#811](https://github.com/liyasthomas/postwoman/issues/811)
- feature [\#810](https://github.com/liyasthomas/postwoman/issues/810)
- socket binnery support [\#801](https://github.com/liyasthomas/postwoman/issues/801)
- Ability to join and leave rooms in Socket.IO connection [\#796](https://github.com/liyasthomas/postwoman/issues/796)
- How can I synchronize my data on local? [\#794](https://github.com/liyasthomas/postwoman/issues/794)
- I cant login [\#792](https://github.com/liyasthomas/postwoman/issues/792)
- Unresolved merge conflict in index.vue.orig [\#786](https://github.com/liyasthomas/postwoman/issues/786)
- You send data my request to Google [\#780](https://github.com/liyasthomas/postwoman/issues/780)
- I have question by \#750, it's closed,but my problem is still.... [\#770](https://github.com/liyasthomas/postwoman/issues/770)
- Body scroll after modal is open [\#766](https://github.com/liyasthomas/postwoman/issues/766)
- text.match is not a function [\#764](https://github.com/liyasthomas/postwoman/issues/764)
- Request : Copy response headers [\#763](https://github.com/liyasthomas/postwoman/issues/763)
- The accordion \(expand\) labels are out of place on mobile [\#762](https://github.com/liyasthomas/postwoman/issues/762)
- why does the graphql case can't be saved? [\#761](https://github.com/liyasthomas/postwoman/issues/761)
- Mobile responsiveness issues [\#760](https://github.com/liyasthomas/postwoman/issues/760)
- Report abuse: liyasthomas/postwoman \(Contact Links\) [\#754](https://github.com/liyasthomas/postwoman/issues/754)
- Report abuse: liyasthomas/postwoman \(Contact Links\) [\#753](https://github.com/liyasthomas/postwoman/issues/753)
- I used it to post test,but response network error [\#750](https://github.com/liyasthomas/postwoman/issues/750)
- Improve documentation on how to use environments [\#742](https://github.com/liyasthomas/postwoman/issues/742)
- Broken link to translations branch [\#737](https://github.com/liyasthomas/postwoman/issues/737)
- Postwoman raiase a connection error when communicate with localhost. [\#708](https://github.com/liyasthomas/postwoman/issues/708)
- CORS issue when hosting [\#707](https://github.com/liyasthomas/postwoman/issues/707)
- Add a description to the request or collection when saving it [\#706](https://github.com/liyasthomas/postwoman/issues/706)
- Error: Network Error. Check console for details [\#704](https://github.com/liyasthomas/postwoman/issues/704)
**Merged pull requests:**
- chore\(deps\): bump @nuxtjs/sitemap from 2.2.1 to 2.3.0 [\#864](https://github.com/liyasthomas/postwoman/pull/864) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- docs: add sboulema as a contributor [\#863](https://github.com/liyasthomas/postwoman/pull/863) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- chore\(deps\): bump nuxt-i18n from 6.11.0 to 6.11.1 [\#861](https://github.com/liyasthomas/postwoman/pull/861) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Produce valid output when showing/copying as code [\#857](https://github.com/liyasthomas/postwoman/pull/857) ([Hydrophobefireman](https://github.com/Hydrophobefireman))
- dotenv [\#856](https://github.com/liyasthomas/postwoman/pull/856) ([liyasthomas](https://github.com/liyasthomas))
- Save Collections/Environments on enabling sync [\#854](https://github.com/liyasthomas/postwoman/pull/854) ([sboulema](https://github.com/sboulema))
- chore\(deps\): bump firebase from 7.14.2 to 7.14.3 [\#853](https://github.com/liyasthomas/postwoman/pull/853) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Environment variables in collections [\#851](https://github.com/liyasthomas/postwoman/pull/851) ([sboulema](https://github.com/sboulema))
- chore\(deps-dev\): bump node-sass from 4.14.0 to 4.14.1 [\#844](https://github.com/liyasthomas/postwoman/pull/844) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Remove not-deleted index.vue merge file [\#842](https://github.com/liyasthomas/postwoman/pull/842) ([AndrewBastin](https://github.com/AndrewBastin))
- chore\(deps\): remove stale dependency [\#839](https://github.com/liyasthomas/postwoman/pull/839) ([jamesgeorge007](https://github.com/jamesgeorge007))
- chore\(deps-dev\): bump lint-staged from 10.2.1 to 10.2.2 [\#837](https://github.com/liyasthomas/postwoman/pull/837) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(store\): better code structure [\#835](https://github.com/liyasthomas/postwoman/pull/835) ([jameslahm](https://github.com/jameslahm))
- chore\(deps\): bump @nuxtjs/axios from 5.10.2 to 5.10.3 [\#832](https://github.com/liyasthomas/postwoman/pull/832) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.10.1 to 6.11.0 [\#831](https://github.com/liyasthomas/postwoman/pull/831) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.2.0 to 10.2.1 [\#830](https://github.com/liyasthomas/postwoman/pull/830) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Add ability to navigate through message history [\#828](https://github.com/liyasthomas/postwoman/pull/828) ([jinyus](https://github.com/jinyus))
- chore\(config\): delete render option [\#823](https://github.com/liyasthomas/postwoman/pull/823) ([jameslahm](https://github.com/jameslahm))
- chore\(deps-dev\): bump cypress from 4.4.1 to 4.5.0 [\#822](https://github.com/liyasthomas/postwoman/pull/822) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.7 to 10.2.0 [\#821](https://github.com/liyasthomas/postwoman/pull/821) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Realtime SocketIO support for json user input [\#820](https://github.com/liyasthomas/postwoman/pull/820) ([feydan](https://github.com/feydan))
- chore\(deps\): bump @nuxtjs/axios from 5.10.1 to 5.10.2 [\#816](https://github.com/liyasthomas/postwoman/pull/816) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Modify responseType by Object\(json\) or Array\(json5\) [\#813](https://github.com/liyasthomas/postwoman/pull/813) ([shtakai](https://github.com/shtakai))
- chore\(deps\): bump nuxt-i18n from 6.9.2 to 6.10.1 [\#809](https://github.com/liyasthomas/postwoman/pull/809) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.14.1 to 7.14.2 [\#808](https://github.com/liyasthomas/postwoman/pull/808) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump node-sass from 4.13.1 to 4.14.0 [\#807](https://github.com/liyasthomas/postwoman/pull/807) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/sitemap from 2.2.0 to 2.2.1 [\#806](https://github.com/liyasthomas/postwoman/pull/806) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.10.0 to 5.10.1 [\#803](https://github.com/liyasthomas/postwoman/pull/803) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.9.1 to 6.9.2 [\#802](https://github.com/liyasthomas/postwoman/pull/802) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.6 to 10.1.7 [\#800](https://github.com/liyasthomas/postwoman/pull/800) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump prettier from 2.0.4 to 2.0.5 [\#799](https://github.com/liyasthomas/postwoman/pull/799) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.9.7 to 5.10.0 [\#798](https://github.com/liyasthomas/postwoman/pull/798) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 4.4.0 to 4.4.1 [\#797](https://github.com/liyasthomas/postwoman/pull/797) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Listen to all events in socket.io connection [\#795](https://github.com/liyasthomas/postwoman/pull/795) ([konradkalemba](https://github.com/konradkalemba))
- Fix postman import with empty url [\#791](https://github.com/liyasthomas/postwoman/pull/791) ([Nikita240](https://github.com/Nikita240))
- chore\(deps-dev\): bump lint-staged from 10.1.5 to 10.1.6 [\#789](https://github.com/liyasthomas/postwoman/pull/789) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.3 to 10.1.5 [\#787](https://github.com/liyasthomas/postwoman/pull/787) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.14.0 to 7.14.1 [\#782](https://github.com/liyasthomas/postwoman/pull/782) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump yargs-parser from 18.1.2 to 18.1.3 [\#781](https://github.com/liyasthomas/postwoman/pull/781) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump start-server-and-test from 1.10.11 to 1.11.0 [\#778](https://github.com/liyasthomas/postwoman/pull/778) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.8.1 to 6.9.1 [\#776](https://github.com/liyasthomas/postwoman/pull/776) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump ace-builds from 1.4.9 to 1.4.11 [\#775](https://github.com/liyasthomas/postwoman/pull/775) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 4.3.0 to 4.4.0 [\#774](https://github.com/liyasthomas/postwoman/pull/774) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.13.2 to 7.14.0 [\#758](https://github.com/liyasthomas/postwoman/pull/758) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump husky from 4.2.3 to 4.2.5 [\#757](https://github.com/liyasthomas/postwoman/pull/757) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.2 to 10.1.3 [\#756](https://github.com/liyasthomas/postwoman/pull/756) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Fix indicator if extension is installed [\#748](https://github.com/liyasthomas/postwoman/pull/748) ([levrik](https://github.com/levrik))
- Remove support for legacy extensions [\#747](https://github.com/liyasthomas/postwoman/pull/747) ([levrik](https://github.com/levrik))
- Fix GQL introspection query not sent through extension [\#745](https://github.com/liyasthomas/postwoman/pull/745) ([levrik](https://github.com/levrik))
- chore\(deps-dev\): bump prettier from 2.0.2 to 2.0.4 [\#744](https://github.com/liyasthomas/postwoman/pull/744) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/sitemap from 2.1.0 to 2.2.0 [\#743](https://github.com/liyasthomas/postwoman/pull/743) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.1 to 10.1.2 [\#740](https://github.com/liyasthomas/postwoman/pull/740) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.8.0 to 6.8.1 [\#736](https://github.com/liyasthomas/postwoman/pull/736) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump ace-builds from 1.4.8 to 1.4.9 [\#735](https://github.com/liyasthomas/postwoman/pull/735) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.13.1 to 7.13.2 [\#734](https://github.com/liyasthomas/postwoman/pull/734) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump vue-virtual-scroll-list from 1.4.6 to 1.4.7 [\#733](https://github.com/liyasthomas/postwoman/pull/733) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.7.2 to 6.8.0 [\#732](https://github.com/liyasthomas/postwoman/pull/732) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt from 2.12.1 to 2.12.2 [\#729](https://github.com/liyasthomas/postwoman/pull/729) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.7.1 to 6.7.2 [\#728](https://github.com/liyasthomas/postwoman/pull/728) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.1.0 to 10.1.1 [\#727](https://github.com/liyasthomas/postwoman/pull/727) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 4.2.0 to 4.3.0 [\#726](https://github.com/liyasthomas/postwoman/pull/726) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.0.10 to 10.1.0 [\#725](https://github.com/liyasthomas/postwoman/pull/725) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.7.0 to 6.7.1 [\#724](https://github.com/liyasthomas/postwoman/pull/724) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.9.6 to 5.9.7 [\#723](https://github.com/liyasthomas/postwoman/pull/723) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump lint-staged from 10.0.9 to 10.0.10 [\#721](https://github.com/liyasthomas/postwoman/pull/721) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.9.5 to 5.9.6 [\#719](https://github.com/liyasthomas/postwoman/pull/719) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/sitemap from 2.0.1 to 2.1.0 [\#718](https://github.com/liyasthomas/postwoman/pull/718) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.13.0 to 7.13.1 [\#717](https://github.com/liyasthomas/postwoman/pull/717) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump yargs-parser from 18.1.1 to 18.1.2 [\#713](https://github.com/liyasthomas/postwoman/pull/713) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.6.1 to 6.7.0 [\#712](https://github.com/liyasthomas/postwoman/pull/712) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt from 2.12.0 to 2.12.1 [\#711](https://github.com/liyasthomas/postwoman/pull/711) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.12.0 to 7.13.0 [\#710](https://github.com/liyasthomas/postwoman/pull/710) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Updating the UI and style files [\#705](https://github.com/liyasthomas/postwoman/pull/705) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps-dev\): bump lint-staged from 10.0.8 to 10.0.9 [\#703](https://github.com/liyasthomas/postwoman/pull/703) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Improving performance [\#702](https://github.com/liyasthomas/postwoman/pull/702) ([liyasthomas](https://github.com/liyasthomas))
- :package: Updating packages [\#701](https://github.com/liyasthomas/postwoman/pull/701) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps-dev\): bump prettier from 1.19.1 to 2.0.1 [\#697](https://github.com/liyasthomas/postwoman/pull/697) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
## [v1.9.5](https://github.com/liyasthomas/postwoman/tree/v1.9.5) (2020-03-22)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.9.0...v1.9.5)
**Implemented enhancements:**
- Support preview of JSON:API's "application/vnd.api+json" Content-Type [\#694](https://github.com/liyasthomas/postwoman/issues/694)
- Support SocketIO connections on Realtime page [\#611](https://github.com/liyasthomas/postwoman/issues/611)
- Parameter list not showing JSON object fields \(force raw?\) [\#597](https://github.com/liyasthomas/postwoman/issues/597)
- Add setting to disable scroll animations [\#592](https://github.com/liyasthomas/postwoman/issues/592)
- Bigger URL and/or Path input field [\#581](https://github.com/liyasthomas/postwoman/issues/581)
- \[request\] Offline cross-platform native build [\#267](https://github.com/liyasthomas/postwoman/issues/267)
- On Save Update existing API [\#204](https://github.com/liyasthomas/postwoman/issues/204)
- Import and export environments from JSON [\#190](https://github.com/liyasthomas/postwoman/issues/190)
- Fast URL entry [\#62](https://github.com/liyasthomas/postwoman/issues/62)
- Added the ability to prettify GraphQL queries [\#650](https://github.com/liyasthomas/postwoman/pull/650) ([AndrewBastin](https://github.com/AndrewBastin))
- Updated messages for when GraphQL Get Schema fails [\#633](https://github.com/liyasthomas/postwoman/pull/633) ([AndrewBastin](https://github.com/AndrewBastin))
- Ignore empty GQL Variable Strings [\#629](https://github.com/liyasthomas/postwoman/pull/629) ([AndrewBastin](https://github.com/AndrewBastin))
- test: purge travis [\#623](https://github.com/liyasthomas/postwoman/pull/623) ([yubathom](https://github.com/yubathom))
- Added shortcut to quickly run the GraphQL query [\#620](https://github.com/liyasthomas/postwoman/pull/620) ([AndrewBastin](https://github.com/AndrewBastin))
- JSON linting in the code editor [\#605](https://github.com/liyasthomas/postwoman/pull/605) ([AndrewBastin](https://github.com/AndrewBastin))
- GraphQL page improvements, and more [\#602](https://github.com/liyasthomas/postwoman/pull/602) ([dmitryyankowski](https://github.com/dmitryyankowski))
**Fixed bugs:**
- Test script is not run after failing request [\#644](https://github.com/liyasthomas/postwoman/issues/644)
- \[HELP\] Auth permission denied [\#621](https://github.com/liyasthomas/postwoman/issues/621)
- Can't login on Brave Browser [\#607](https://github.com/liyasthomas/postwoman/issues/607)
**Closed issues:**
- \[UI/UX\] - Change place of Send button [\#696](https://github.com/liyasthomas/postwoman/issues/696)
- Report Portal integration [\#691](https://github.com/liyasthomas/postwoman/issues/691)
- Docs request: how to prevent secrets from leaving local storage wrt. sync. [\#686](https://github.com/liyasthomas/postwoman/issues/686)
- \[bug\] - Can't make a request to HTTP [\#676](https://github.com/liyasthomas/postwoman/issues/676)
- Looking forward to that the postwoman Compatible 'swagger ' at next version [\#675](https://github.com/liyasthomas/postwoman/issues/675)
- Error: Network Error. Check console for details. [\#673](https://github.com/liyasthomas/postwoman/issues/673)
- \[Bug\] - Can't login to Github and Google [\#661](https://github.com/liyasthomas/postwoman/issues/661)
- A question that has been raised but not resolved [\#658](https://github.com/liyasthomas/postwoman/issues/658)
- An unknown error occurred whilst the proxy was processing your request. [\#656](https://github.com/liyasthomas/postwoman/issues/656)
- Running app from downloaded zip fails to compile [\#651](https://github.com/liyasthomas/postwoman/issues/651)
- Environment variable in path won't update [\#641](https://github.com/liyasthomas/postwoman/issues/641)
- Info: The current domain is not authorized for OAuth operations Error [\#637](https://github.com/liyasthomas/postwoman/issues/637)
- A suggestion for UI [\#635](https://github.com/liyasthomas/postwoman/issues/635)
- How to use postwoman for local development and testing [\#634](https://github.com/liyasthomas/postwoman/issues/634)
- How to debug localhost \(cors\) [\#630](https://github.com/liyasthomas/postwoman/issues/630)
- Requests to local API returning error response [\#608](https://github.com/liyasthomas/postwoman/issues/608)
- Why does the URL input field display only one line [\#604](https://github.com/liyasthomas/postwoman/issues/604)
**Merged pull requests:**
- Add application/vnd.api+json [\#695](https://github.com/liyasthomas/postwoman/pull/695) ([allthesignals](https://github.com/allthesignals))
- Fix raw input \(JSON\) [\#693](https://github.com/liyasthomas/postwoman/pull/693) ([leomp12](https://github.com/leomp12))
- chore\(deps\): bump firebase from 7.11.0 to 7.12.0 [\#689](https://github.com/liyasthomas/postwoman/pull/689) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump vuefire from 2.2.1 to 2.2.2 [\#688](https://github.com/liyasthomas/postwoman/pull/688) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 4.1.0 to 4.2.0 [\#685](https://github.com/liyasthomas/postwoman/pull/685) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump start-server-and-test from 1.10.10 to 1.10.11 [\#684](https://github.com/liyasthomas/postwoman/pull/684) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.6.0 to 6.6.1 [\#683](https://github.com/liyasthomas/postwoman/pull/683) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt from 2.11.0 to 2.12.0 [\#682](https://github.com/liyasthomas/postwoman/pull/682) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Fix setting default raw params [\#681](https://github.com/liyasthomas/postwoman/pull/681) ([leomp12](https://github.com/leomp12))
- Fix handling content type and raw input [\#678](https://github.com/liyasthomas/postwoman/pull/678) ([leomp12](https://github.com/leomp12))
- \[Snyk\] Security upgrade yargs-parser from 18.1.0 to 18.1.1 [\#674](https://github.com/liyasthomas/postwoman/pull/674) ([snyk-bot](https://github.com/snyk-bot))
- chore\(deps-dev\): bump start-server-and-test from 1.10.9 to 1.10.10 [\#672](https://github.com/liyasthomas/postwoman/pull/672) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.10.0 to 7.11.0 [\#671](https://github.com/liyasthomas/postwoman/pull/671) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ✅ Updating tests [\#669](https://github.com/liyasthomas/postwoman/pull/669) ([liyasthomas](https://github.com/liyasthomas))
- Updating tests [\#668](https://github.com/liyasthomas/postwoman/pull/668) ([liyasthomas](https://github.com/liyasthomas))
- APIs [\#667](https://github.com/liyasthomas/postwoman/pull/667) ([liyasthomas](https://github.com/liyasthomas))
- Insecure Websocket connection issue while connecting to MQTT broker. [\#666](https://github.com/liyasthomas/postwoman/pull/666) ([rahulnpadalkar](https://github.com/rahulnpadalkar))
- Improving performance [\#664](https://github.com/liyasthomas/postwoman/pull/664) ([liyasthomas](https://github.com/liyasthomas))
- Feature/mqtt [\#663](https://github.com/liyasthomas/postwoman/pull/663) ([liyasthomas](https://github.com/liyasthomas))
- Added Support for MQTT [\#662](https://github.com/liyasthomas/postwoman/pull/662) ([rahulnpadalkar](https://github.com/rahulnpadalkar))
- chore\(deps\): bump yargs-parser from 18.0.0 to 18.1.0 [\#660](https://github.com/liyasthomas/postwoman/pull/660) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump start-server-and-test from 1.10.8 to 1.10.9 [\#659](https://github.com/liyasthomas/postwoman/pull/659) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Added icon slot to tabs [\#657](https://github.com/liyasthomas/postwoman/pull/657) ([liyasthomas](https://github.com/liyasthomas))
- Refactor/ui [\#655](https://github.com/liyasthomas/postwoman/pull/655) ([liyasthomas](https://github.com/liyasthomas))
- even [\#654](https://github.com/liyasthomas/postwoman/pull/654) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump yargs-parser from 17.0.0 to 18.0.0 [\#653](https://github.com/liyasthomas/postwoman/pull/653) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.9.3 to 7.10.0 [\#652](https://github.com/liyasthomas/postwoman/pull/652) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Add http/https support to socketio url valid [\#648](https://github.com/liyasthomas/postwoman/pull/648) ([moonrailgun](https://github.com/moonrailgun))
- Refactor/ui [\#647](https://github.com/liyasthomas/postwoman/pull/647) ([liyasthomas](https://github.com/liyasthomas))
- Even [\#646](https://github.com/liyasthomas/postwoman/pull/646) ([liyasthomas](https://github.com/liyasthomas))
- Run tests even after failed request [\#645](https://github.com/liyasthomas/postwoman/pull/645) ([liyasthomas](https://github.com/liyasthomas))
- Feature: add socket io support [\#640](https://github.com/liyasthomas/postwoman/pull/640) ([moonrailgun](https://github.com/moonrailgun))
- Removed linting for the collection docs import editor [\#639](https://github.com/liyasthomas/postwoman/pull/639) ([AndrewBastin](https://github.com/AndrewBastin))
- Moving or renaming files [\#638](https://github.com/liyasthomas/postwoman/pull/638) ([liyasthomas](https://github.com/liyasthomas))
- Refactor/ui [\#636](https://github.com/liyasthomas/postwoman/pull/636) ([liyasthomas](https://github.com/liyasthomas))
- Minor GraphQL page improvements [\#631](https://github.com/liyasthomas/postwoman/pull/631) ([dmitryyankowski](https://github.com/dmitryyankowski))
- chore\(deps-dev\): bump cypress from 4.0.2 to 4.1.0 [\#628](https://github.com/liyasthomas/postwoman/pull/628) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump nuxt-i18n from 6.5.0 to 6.6.0 [\#627](https://github.com/liyasthomas/postwoman/pull/627) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.9.1 to 7.9.3 [\#626](https://github.com/liyasthomas/postwoman/pull/626) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/google-tag-manager from 2.3.1 to 2.3.2 [\#625](https://github.com/liyasthomas/postwoman/pull/625) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- docs: add dmitryyankowski as a contributor [\#619](https://github.com/liyasthomas/postwoman/pull/619) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- Link multiple auth providers [\#618](https://github.com/liyasthomas/postwoman/pull/618) ([liyasthomas](https://github.com/liyasthomas))
- Add --staged parameter to pretty-quick pre-commit [\#617](https://github.com/liyasthomas/postwoman/pull/617) ([dmitryyankowski](https://github.com/dmitryyankowski))
- :bug: FIxed URI not updating on Clear content, minor formData improve… [\#612](https://github.com/liyasthomas/postwoman/pull/612) ([liyasthomas](https://github.com/liyasthomas))
- Update proxy information. [\#610](https://github.com/liyasthomas/postwoman/pull/610) ([NBTX](https://github.com/NBTX))
- Fixed install extension toast appearing even when extension is installed [\#609](https://github.com/liyasthomas/postwoman/pull/609) ([AndrewBastin](https://github.com/AndrewBastin))
- chore\(deps-dev\): bump lint-staged from 10.0.7 to 10.0.8 [\#606](https://github.com/liyasthomas/postwoman/pull/606) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Added regex to handle url parts [\#603](https://github.com/liyasthomas/postwoman/pull/603) ([JacobAnavisca](https://github.com/JacobAnavisca))
- I18n [\#601](https://github.com/liyasthomas/postwoman/pull/601) ([liyasthomas](https://github.com/liyasthomas))
- feat\(i18n\): add Korean [\#600](https://github.com/liyasthomas/postwoman/pull/600) ([9j](https://github.com/9j))
- Improve page load/unload experience \(remove FOUCs\) [\#599](https://github.com/liyasthomas/postwoman/pull/599) ([NBTX](https://github.com/NBTX))
## [v1.9.0](https://github.com/liyasthomas/postwoman/tree/v1.9.0) (2020-02-24)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.8.0...v1.9.0)
**Implemented enhancements:**
- Disable SSL cert for websockets [\#557](https://github.com/liyasthomas/postwoman/issues/557)
- Feature request: Keyboard shortcuts for folder creation [\#539](https://github.com/liyasthomas/postwoman/issues/539)
- Friendly minded GraphQL [\#468](https://github.com/liyasthomas/postwoman/issues/468)
- Environment management and configuration [\#147](https://github.com/liyasthomas/postwoman/issues/147)
- POST request body editor reacts to the content type [\#594](https://github.com/liyasthomas/postwoman/pull/594) ([AndrewBastin](https://github.com/AndrewBastin))
- GraphQL Query Autocompletion [\#590](https://github.com/liyasthomas/postwoman/pull/590) ([AndrewBastin](https://github.com/AndrewBastin))
- Postman collection parsing [\#574](https://github.com/liyasthomas/postwoman/pull/574) ([JacobAnavisca](https://github.com/JacobAnavisca))
- Added toggle to decide whether extensions should be used [\#551](https://github.com/liyasthomas/postwoman/pull/551) ([AndrewBastin](https://github.com/AndrewBastin))
- Show Ctrl instead of Command for shortcuts non-Apple platforms [\#549](https://github.com/liyasthomas/postwoman/pull/549) ([AndrewBastin](https://github.com/AndrewBastin))
- Updated GraphQL Query Variable Editor [\#534](https://github.com/liyasthomas/postwoman/pull/534) ([AndrewBastin](https://github.com/AndrewBastin))
**Fixed bugs:**
- Auto Theme Selection is kinda difficult to see [\#563](https://github.com/liyasthomas/postwoman/issues/563)
- Can't send request to localhost via Chrome extention [\#560](https://github.com/liyasthomas/postwoman/issues/560)
- Validation for duplicate collection ignores letter case [\#547](https://github.com/liyasthomas/postwoman/issues/547)
- Multiple collections with the same name shouldn't exist [\#509](https://github.com/liyasthomas/postwoman/issues/509)
- Build failed [\#327](https://github.com/liyasthomas/postwoman/issues/327)
- Fixed typo in translation file for Auto theme [\#556](https://github.com/liyasthomas/postwoman/pull/556) ([AndrewBastin](https://github.com/AndrewBastin))
**Closed issues:**
- don't run [\#577](https://github.com/liyasthomas/postwoman/issues/577)
- Get correct response data but occurs with error "Cannot read property 'value' of undefined" [\#575](https://github.com/liyasthomas/postwoman/issues/575)
- firebase\_app\_\_WEBPACK\_IMPORTED\_MODULE\_2\_\_\_default.a.firestore is not a function [\#558](https://github.com/liyasthomas/postwoman/issues/558)
- relative module not found during start [\#552](https://github.com/liyasthomas/postwoman/issues/552)
- Feature Request: Subfolders [\#540](https://github.com/liyasthomas/postwoman/issues/540)
- Add max-height and overflow: auto to "parameter list" textarea [\#532](https://github.com/liyasthomas/postwoman/issues/532)
- IE Support [\#386](https://github.com/liyasthomas/postwoman/issues/386)
- ⏬ Import a Postman's Collection [\#333](https://github.com/liyasthomas/postwoman/issues/333)
**Merged pull requests:**
- Feature: Add prettier/pretty-quick formatting w/ Husky pre-commit [\#596](https://github.com/liyasthomas/postwoman/pull/596) ([dmitryyankowski](https://github.com/dmitryyankowski))
- Fix variablesJSONString store default for GraphQL page [\#593](https://github.com/liyasthomas/postwoman/pull/593) ([dmitryyankowski](https://github.com/dmitryyankowski))
- Refactor/lint [\#589](https://github.com/liyasthomas/postwoman/pull/589) ([liyasthomas](https://github.com/liyasthomas))
- Even [\#588](https://github.com/liyasthomas/postwoman/pull/588) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump firebase from 7.9.0 to 7.9.1 [\#587](https://github.com/liyasthomas/postwoman/pull/587) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Even [\#586](https://github.com/liyasthomas/postwoman/pull/586) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump firebase from 7.8.2 to 7.9.0 [\#585](https://github.com/liyasthomas/postwoman/pull/585) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump vue-virtual-scroll-list from 1.4.5 to 1.4.6 [\#584](https://github.com/liyasthomas/postwoman/pull/584) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Adapt extension check to new extensions [\#583](https://github.com/liyasthomas/postwoman/pull/583) ([levrik](https://github.com/levrik))
- Update link to extension repo in README [\#582](https://github.com/liyasthomas/postwoman/pull/582) ([levrik](https://github.com/levrik))
- Even [\#579](https://github.com/liyasthomas/postwoman/pull/579) ([liyasthomas](https://github.com/liyasthomas))
- Refactor/lint [\#578](https://github.com/liyasthomas/postwoman/pull/578) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump vue-virtual-scroll-list from 1.4.4 to 1.4.5 [\#576](https://github.com/liyasthomas/postwoman/pull/576) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Unify Chrome and Firefox extensions [\#573](https://github.com/liyasthomas/postwoman/pull/573) ([levrik](https://github.com/levrik))
- fix: drop the toast which doesn't show up [\#572](https://github.com/liyasthomas/postwoman/pull/572) ([jamesgeorge007](https://github.com/jamesgeorge007))
- :sparkles: Native share + updated meta description [\#571](https://github.com/liyasthomas/postwoman/pull/571) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump firebase from 7.8.1 to 7.8.2 [\#570](https://github.com/liyasthomas/postwoman/pull/570) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 4.0.1 to 4.0.2 [\#569](https://github.com/liyasthomas/postwoman/pull/569) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Added create collection and save request syncs [\#568](https://github.com/liyasthomas/postwoman/pull/568) ([JacobAnavisca](https://github.com/JacobAnavisca))
- Moved common headers to a separate file [\#566](https://github.com/liyasthomas/postwoman/pull/566) ([AndrewBastin](https://github.com/AndrewBastin))
- chore\(deps-dev\): bump cypress from 4.0.0 to 4.0.1 [\#565](https://github.com/liyasthomas/postwoman/pull/565) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump yargs-parser from 16.1.0 to 17.0.0 [\#564](https://github.com/liyasthomas/postwoman/pull/564) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 3.8.3 to 4.0.0 [\#562](https://github.com/liyasthomas/postwoman/pull/562) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.8.0 to 7.8.1 [\#561](https://github.com/liyasthomas/postwoman/pull/561) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore: use typeof as an operator and make use of localizable strings [\#559](https://github.com/liyasthomas/postwoman/pull/559) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Support for Formdata [\#555](https://github.com/liyasthomas/postwoman/pull/555) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump @nuxtjs/pwa from 3.0.0-beta.19 to 3.0.0-beta.20 [\#554](https://github.com/liyasthomas/postwoman/pull/554) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.9.4 to 5.9.5 [\#553](https://github.com/liyasthomas/postwoman/pull/553) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- fix\(chore\): Take letter casing into account while checking for duplicate collection [\#548](https://github.com/liyasthomas/postwoman/pull/548) ([jamesgeorge007](https://github.com/jamesgeorge007))
- update e2e tests [\#546](https://github.com/liyasthomas/postwoman/pull/546) ([yubathom](https://github.com/yubathom))
- chore\(deps\): bump @nuxtjs/axios from 5.9.3 to 5.9.4 [\#545](https://github.com/liyasthomas/postwoman/pull/545) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump firebase from 7.7.0 to 7.8.0 [\#542](https://github.com/liyasthomas/postwoman/pull/542) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump graphql from 14.5.8 to 14.6.0 [\#541](https://github.com/liyasthomas/postwoman/pull/541) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- i18n [\#538](https://github.com/liyasthomas/postwoman/pull/538) ([liyasthomas](https://github.com/liyasthomas))
- Modification of French translations [\#537](https://github.com/liyasthomas/postwoman/pull/537) ([thomasbnt](https://github.com/thomasbnt))
- Even [\#535](https://github.com/liyasthomas/postwoman/pull/535) ([liyasthomas](https://github.com/liyasthomas))
- Updating spanish translation [\#529](https://github.com/liyasthomas/postwoman/pull/529) ([liyasthomas](https://github.com/liyasthomas))
- even merge [\#528](https://github.com/liyasthomas/postwoman/pull/528) ([liyasthomas](https://github.com/liyasthomas))
## [v1.8.0](https://github.com/liyasthomas/postwoman/tree/v1.8.0) (2020-01-28)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.5.0...v1.8.0)
**Implemented enhancements:**
- Sync collection with a cloud storage \(e.g: Google drive\) [\#507](https://github.com/liyasthomas/postwoman/issues/507)
- Application contains many hard-coded strings that aren't translatable [\#488](https://github.com/liyasthomas/postwoman/issues/488)
- ULR parsing and var auto creation [\#469](https://github.com/liyasthomas/postwoman/issues/469)
- What about additional loaders: + Pug, TypeScript, SASS, material-vue ? [\#467](https://github.com/liyasthomas/postwoman/issues/467)
- \[suggestion\] - Tests tab [\#465](https://github.com/liyasthomas/postwoman/issues/465)
- cookie not found support [\#443](https://github.com/liyasthomas/postwoman/issues/443)
- Feature Request: Consumer Driven Contract Testing [\#420](https://github.com/liyasthomas/postwoman/issues/420)
- Feature Request: Support OAuth2/OIDC [\#337](https://github.com/liyasthomas/postwoman/issues/337)
- Add DB cache [\#26](https://github.com/liyasthomas/postwoman/issues/26)
- Auth [\#513](https://github.com/liyasthomas/postwoman/pull/513) ([liyasthomas](https://github.com/liyasthomas))
- Support for Google Chrome Extension [\#512](https://github.com/liyasthomas/postwoman/pull/512) ([AndrewBastin](https://github.com/AndrewBastin))
- GraphQL query validation based on schema [\#508](https://github.com/liyasthomas/postwoman/pull/508) ([AndrewBastin](https://github.com/AndrewBastin))
- Syntax Error marking in GraphQL query editor [\#505](https://github.com/liyasthomas/postwoman/pull/505) ([AndrewBastin](https://github.com/AndrewBastin))
- Refactoring proxy handling to be done in strategies [\#500](https://github.com/liyasthomas/postwoman/pull/500) ([AndrewBastin](https://github.com/AndrewBastin))
- Firefox Extension compatibility [\#494](https://github.com/liyasthomas/postwoman/pull/494) ([AndrewBastin](https://github.com/AndrewBastin))
- Network Strategies [\#487](https://github.com/liyasthomas/postwoman/pull/487) ([AndrewBastin](https://github.com/AndrewBastin))
- chore\(oauth\): Added method signatures as per JSDoc conventions [\#486](https://github.com/liyasthomas/postwoman/pull/486) ([jamesgeorge007](https://github.com/jamesgeorge007))
- GraphQL Type Highlight and Links [\#479](https://github.com/liyasthomas/postwoman/pull/479) ([AndrewBastin](https://github.com/AndrewBastin))
**Fixed bugs:**
- Warn the user if name field was left blank while creating a new collection [\#515](https://github.com/liyasthomas/postwoman/issues/515)
- GraphQL String variables are null [\#497](https://github.com/liyasthomas/postwoman/issues/497)
- Post request body is empty [\#473](https://github.com/liyasthomas/postwoman/issues/473)
- WebSocket page freezes when pasting long URL [\#471](https://github.com/liyasthomas/postwoman/issues/471)
**Closed issues:**
- Allow importing Postman collections [\#524](https://github.com/liyasthomas/postwoman/issues/524)
- Request descriptions [\#511](https://github.com/liyasthomas/postwoman/issues/511)
- Ability to run all requests of a folder/collection [\#498](https://github.com/liyasthomas/postwoman/issues/498)
- Change import/export collection on requests page icon [\#495](https://github.com/liyasthomas/postwoman/issues/495)
- import cURL error [\#477](https://github.com/liyasthomas/postwoman/issues/477)
- move to postwoman org [\#475](https://github.com/liyasthomas/postwoman/issues/475)
- Create standalone vue components of the request builder. [\#474](https://github.com/liyasthomas/postwoman/issues/474)
- Enable running proxy as a backend for Request Capture [\#325](https://github.com/liyasthomas/postwoman/issues/325)
- Label doesn't change when switching between collection requests [\#291](https://github.com/liyasthomas/postwoman/issues/291)
**Merged pull requests:**
- Refactor [\#543](https://github.com/liyasthomas/postwoman/pull/543) ([liyasthomas](https://github.com/liyasthomas))
- Enhancements [\#531](https://github.com/liyasthomas/postwoman/pull/531) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Merge pull request \#530 from liyasthomas/feature/post-request-tests [\#530](https://github.com/liyasthomas/postwoman/pull/530) ([liyasthomas](https://github.com/liyasthomas))
- Refactor [\#523](https://github.com/liyasthomas/postwoman/pull/523) ([liyasthomas](https://github.com/liyasthomas))
- chore\(deps\): bump nuxt-i18n from 6.4.1 to 6.5.0 [\#522](https://github.com/liyasthomas/postwoman/pull/522) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump v-tooltip from 2.0.2 to 2.0.3 [\#521](https://github.com/liyasthomas/postwoman/pull/521) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump cypress from 3.8.2 to 3.8.3 [\#520](https://github.com/liyasthomas/postwoman/pull/520) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Feature/post request tests [\#518](https://github.com/liyasthomas/postwoman/pull/518) ([nickpalenchar](https://github.com/nickpalenchar))
- Validations for edit and create collections activity [\#516](https://github.com/liyasthomas/postwoman/pull/516) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Validate duplicate collections [\#510](https://github.com/liyasthomas/postwoman/pull/510) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Lint and refactor [\#506](https://github.com/liyasthomas/postwoman/pull/506) ([liyasthomas](https://github.com/liyasthomas))
- Merge pull request \#504 from liyasthomas/dependabot/npm\_and\_yarn/node-sass-4.13.1 [\#504](https://github.com/liyasthomas/postwoman/pull/504) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump @nuxtjs/axios from 5.9.2 to 5.9.3 [\#503](https://github.com/liyasthomas/postwoman/pull/503) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps-dev\): bump sass-loader from 8.0.1 to 8.0.2 [\#502](https://github.com/liyasthomas/postwoman/pull/502) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- chore\(deps\): bump ace-builds from 1.4.7 to 1.4.8 [\#501](https://github.com/liyasthomas/postwoman/pull/501) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- 💚 Fixed \#497 [\#499](https://github.com/liyasthomas/postwoman/pull/499) ([pushrbx](https://github.com/pushrbx))
- Feat/firefox strategy [\#496](https://github.com/liyasthomas/postwoman/pull/496) ([liyasthomas](https://github.com/liyasthomas))
- i18n Japanese: Added new translations [\#492](https://github.com/liyasthomas/postwoman/pull/492) ([reefqi037](https://github.com/reefqi037))
- Merge pull request \#491 from liyasthomas/i18n [\#491](https://github.com/liyasthomas/postwoman/pull/491) ([liyasthomas](https://github.com/liyasthomas))
- Replaced hard-coded strings with localizable strings [\#490](https://github.com/liyasthomas/postwoman/pull/490) ([liyasthomas](https://github.com/liyasthomas))
- chore: Minor tweaks [\#485](https://github.com/liyasthomas/postwoman/pull/485) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Porting \(most of\) code to typescript [\#484](https://github.com/liyasthomas/postwoman/pull/484) ([AndrewBastin](https://github.com/AndrewBastin))
- ⬆️ Bump sass-loader from 8.0.0 to 8.0.1 [\#482](https://github.com/liyasthomas/postwoman/pull/482) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/google-analytics from 2.2.2 to 2.2.3 [\#481](https://github.com/liyasthomas/postwoman/pull/481) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- OAuth 2.0/OIDC Access Token Retrieval Support [\#476](https://github.com/liyasthomas/postwoman/pull/476) ([reefqi037](https://github.com/reefqi037))
## [v1.5.0](https://github.com/liyasthomas/postwoman/tree/v1.5.0) (2020-01-04)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v1.0.0...v1.5.0)
@@ -8,11 +412,13 @@
- Can WSDL be implemented, similar to SoapUI? [\#461](https://github.com/liyasthomas/postwoman/issues/461)
- Raw Request Body should be supported to format the JSON string [\#446](https://github.com/liyasthomas/postwoman/issues/446)
- multipart/form-data support [\#434](https://github.com/liyasthomas/postwoman/issues/434)
- Ability to send Binary data using Postwoman [\#415](https://github.com/liyasthomas/postwoman/issues/415)
- Custom request method [\#398](https://github.com/liyasthomas/postwoman/issues/398)
- \[request\]: CLI possibilities [\#363](https://github.com/liyasthomas/postwoman/issues/363)
- Feature request: OAuth header support/integration [\#358](https://github.com/liyasthomas/postwoman/issues/358)
- i18n support [\#348](https://github.com/liyasthomas/postwoman/issues/348)
- Ability to connect to a MQTT broker [\#342](https://github.com/liyasthomas/postwoman/issues/342)
- Separate layers in dockerfile to improve image build [\#339](https://github.com/liyasthomas/postwoman/issues/339)
- Internal server environment usage requirements [\#336](https://github.com/liyasthomas/postwoman/issues/336)
- Server Sent Events [\#329](https://github.com/liyasthomas/postwoman/issues/329)
@@ -29,6 +435,7 @@
- Missing Focus on Inputs [\#279](https://github.com/liyasthomas/postwoman/issues/279)
- Download the request result into a file. [\#278](https://github.com/liyasthomas/postwoman/issues/278)
- Improve UI Contrast [\#277](https://github.com/liyasthomas/postwoman/issues/277)
- \[UI\] \[UX\] Allow app to take width of browser [\#236](https://github.com/liyasthomas/postwoman/issues/236)
- Extend syntax highlighting with ACE for pre-request script textarea [\#235](https://github.com/liyasthomas/postwoman/issues/235)
- Store pre-request scripts in history [\#233](https://github.com/liyasthomas/postwoman/issues/233)
- Store the time spent on fetching a response [\#225](https://github.com/liyasthomas/postwoman/issues/225)
@@ -40,11 +447,9 @@
- Basic i18n support [\#351](https://github.com/liyasthomas/postwoman/pull/351) ([liyasthomas](https://github.com/liyasthomas))
- Undo header/param/body param deletion [\#350](https://github.com/liyasthomas/postwoman/pull/350) ([AndrewBastin](https://github.com/AndrewBastin))
- Added ability to run GraphQL queries [\#346](https://github.com/liyasthomas/postwoman/pull/346) ([AndrewBastin](https://github.com/AndrewBastin))
- refactor: minor improvements [\#343](https://github.com/liyasthomas/postwoman/pull/343) ([jamesgeorge007](https://github.com/jamesgeorge007))
**Fixed bugs:**
- WebSocket page freezes when pasting long URL [\#471](https://github.com/liyasthomas/postwoman/issues/471)
- API Documentation won't be generated [\#456](https://github.com/liyasthomas/postwoman/issues/456)
- Sharing Requests via link is not working [\#435](https://github.com/liyasthomas/postwoman/issues/435)
- URL input text is so stutters [\#412](https://github.com/liyasthomas/postwoman/issues/412)
@@ -86,7 +491,6 @@
- Intent to translate [\#367](https://github.com/liyasthomas/postwoman/issues/367)
- Static builds on releases [\#352](https://github.com/liyasthomas/postwoman/issues/352)
- fix:SSE onclose handle [\#349](https://github.com/liyasthomas/postwoman/issues/349)
- ⏬ Import a Postman's Collection [\#333](https://github.com/liyasthomas/postwoman/issues/333)
- \[Request\] Use responses for next request? [\#324](https://github.com/liyasthomas/postwoman/issues/324)
- Make response body area expandable [\#294](https://github.com/liyasthomas/postwoman/issues/294)
- Mobile can't see console for request errors [\#283](https://github.com/liyasthomas/postwoman/issues/283)
@@ -99,6 +503,7 @@
**Merged pull requests:**
- ⬆️ Bump cypress from 3.8.1 to 3.8.2 [\#483](https://github.com/liyasthomas/postwoman/pull/483) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/axios from 5.9.0 to 5.9.2 [\#472](https://github.com/liyasthomas/postwoman/pull/472) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Added variables to graphql page. [\#464](https://github.com/liyasthomas/postwoman/pull/464) ([pushrbx](https://github.com/pushrbx))
- i18n [\#463](https://github.com/liyasthomas/postwoman/pull/463) ([liyasthomas](https://github.com/liyasthomas))
@@ -147,6 +552,160 @@
- Added Farsi language support [\#357](https://github.com/liyasthomas/postwoman/pull/357) ([hosseinnedaee](https://github.com/hosseinnedaee))
- Adding french language basic [\#355](https://github.com/liyasthomas/postwoman/pull/355) ([thomasbnt](https://github.com/thomasbnt))
- Add Proxy URL option [\#345](https://github.com/liyasthomas/postwoman/pull/345) ([NBTX](https://github.com/NBTX))
- ♻️ Refactor Functions [\#344](https://github.com/liyasthomas/postwoman/pull/344) ([athul](https://github.com/athul))
## [v1.0.0](https://github.com/liyasthomas/postwoman/tree/v1.0.0) (2019-11-04)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/v0.1.0...v1.0.0)
**Implemented enhancements:**
- Implement pre-request and post-request scripts \(and request chaining\) [\#218](https://github.com/liyasthomas/postwoman/issues/218)
- Chain requests. Execute a bunch of requests one by one and produce results [\#196](https://github.com/liyasthomas/postwoman/issues/196)
- Allow User to Choose Whether to Include Authentication in Permalink [\#178](https://github.com/liyasthomas/postwoman/issues/178)
- Allow HTTP \(not HTTPS\) on postwoman.io [\#175](https://github.com/liyasthomas/postwoman/issues/175)
- Docker-compose in development [\#168](https://github.com/liyasthomas/postwoman/issues/168)
- Add Docker [\#164](https://github.com/liyasthomas/postwoman/issues/164)
- Clear Input [\#155](https://github.com/liyasthomas/postwoman/issues/155)
- introduce some script language to parse the response and pass environment variable as request parameter [\#139](https://github.com/liyasthomas/postwoman/issues/139)
- Add links to the footer version and commit sha [\#134](https://github.com/liyasthomas/postwoman/issues/134)
- Please add a label for each request. It will be helpful. [\#133](https://github.com/liyasthomas/postwoman/issues/133)
- Use 'icon buttons' instead of 'text buttons' [\#130](https://github.com/liyasthomas/postwoman/issues/130)
- Change .editorconfig [\#115](https://github.com/liyasthomas/postwoman/issues/115)
- \[UX\] Provide Focus State for Buttons, etc. [\#112](https://github.com/liyasthomas/postwoman/issues/112)
- Add linter semistandard [\#98](https://github.com/liyasthomas/postwoman/issues/98)
- Show "Send" button all over the page or enable hotkeys [\#94](https://github.com/liyasthomas/postwoman/issues/94)
- Import request from cURL [\#93](https://github.com/liyasthomas/postwoman/issues/93)
- Search on History [\#92](https://github.com/liyasthomas/postwoman/issues/92)
- Add support for "application/hal+json" Content-Type [\#88](https://github.com/liyasthomas/postwoman/issues/88)
- The query string is built incorrectly when the path contains a parameter [\#87](https://github.com/liyasthomas/postwoman/issues/87)
- Option to Copy request as Fetch or XHR Or CURL [\#76](https://github.com/liyasthomas/postwoman/issues/76)
- Add Tests [\#65](https://github.com/liyasthomas/postwoman/issues/65)
- Request Headers [\#57](https://github.com/liyasthomas/postwoman/issues/57)
- Colored response codes based on status code [\#46](https://github.com/liyasthomas/postwoman/issues/46)
- Improve SEO [\#45](https://github.com/liyasthomas/postwoman/issues/45)
- Add html preview to response section [\#41](https://github.com/liyasthomas/postwoman/issues/41)
- websocket support [\#40](https://github.com/liyasthomas/postwoman/issues/40)
- Raw request body for POST requests and Authorization key/value in Header [\#36](https://github.com/liyasthomas/postwoman/issues/36)
- Code highlight on response body [\#33](https://github.com/liyasthomas/postwoman/issues/33)
- Template selector [\#32](https://github.com/liyasthomas/postwoman/issues/32)
- Vue template [\#31](https://github.com/liyasthomas/postwoman/issues/31)
- Add copy response to clipboard button [\#30](https://github.com/liyasthomas/postwoman/issues/30)
- Ability to store/share/create collections [\#29](https://github.com/liyasthomas/postwoman/issues/29)
- Send request on Enter Key press [\#17](https://github.com/liyasthomas/postwoman/issues/17)
- Readable [\#5](https://github.com/liyasthomas/postwoman/issues/5)
- Serialize a request into JSON? [\#4](https://github.com/liyasthomas/postwoman/issues/4)
- Add brand new logo to the project [\#244](https://github.com/liyasthomas/postwoman/pull/244) ([caneco](https://github.com/caneco))
- Feature/pre request script [\#231](https://github.com/liyasthomas/postwoman/pull/231) ([nickpalenchar](https://github.com/nickpalenchar))
- Add the ApolloTV proxy server [\#217](https://github.com/liyasthomas/postwoman/pull/217) ([NBTX](https://github.com/NBTX))
- bug: keeping information on page change [\#211](https://github.com/liyasthomas/postwoman/pull/211) ([breno-pereira](https://github.com/breno-pereira))
- Work in Progress: feature/allow-collections-importing [\#209](https://github.com/liyasthomas/postwoman/pull/209) ([vlad0337187](https://github.com/vlad0337187))
- Feature/log errors [\#207](https://github.com/liyasthomas/postwoman/pull/207) ([nickpalenchar](https://github.com/nickpalenchar))
- Use returned value from toggle component on change event [\#205](https://github.com/liyasthomas/postwoman/pull/205) ([hosseinnedaee](https://github.com/hosseinnedaee))
- Fix CORS and mixed content issue [\#199](https://github.com/liyasthomas/postwoman/pull/199) ([hosseinnedaee](https://github.com/hosseinnedaee))
- Added Tooltips [\#197](https://github.com/liyasthomas/postwoman/pull/197) ([AndrewBastin](https://github.com/AndrewBastin))
- Added auto theme [\#185](https://github.com/liyasthomas/postwoman/pull/185) ([AndrewBastin](https://github.com/AndrewBastin))
- Add Request name label for every requests [\#184](https://github.com/liyasthomas/postwoman/pull/184) ([sharath2106](https://github.com/sharath2106))
- Collections [\#176](https://github.com/liyasthomas/postwoman/pull/176) ([TheHollidayInn](https://github.com/TheHollidayInn))
**Fixed bugs:**
- Bearer Token value still left even after being cleared [\#212](https://github.com/liyasthomas/postwoman/issues/212)
- All changes in input fields lost when you switch to another page [\#203](https://github.com/liyasthomas/postwoman/issues/203)
- POST request json bodies aren't sent [\#180](https://github.com/liyasthomas/postwoman/issues/180)
- Headers turn into 0 : \[Object object\] [\#166](https://github.com/liyasthomas/postwoman/issues/166)
- Send Again Button Constantly Flickering [\#157](https://github.com/liyasthomas/postwoman/issues/157)
- There are cross-domain problems [\#128](https://github.com/liyasthomas/postwoman/issues/128)
- Raw requests are not being sent [\#124](https://github.com/liyasthomas/postwoman/issues/124)
- Request Body Is Not Sent [\#113](https://github.com/liyasthomas/postwoman/issues/113)
- default menu option - 'Http' is not highlighted when launched from installed pwa app \(UI bug\) [\#100](https://github.com/liyasthomas/postwoman/issues/100)
- App is broken with old history in localStorage [\#74](https://github.com/liyasthomas/postwoman/issues/74)
- Last added history entry is removed automatically after refresh [\#66](https://github.com/liyasthomas/postwoman/issues/66)
- Cannot use localhost as base url [\#56](https://github.com/liyasthomas/postwoman/issues/56)
- \[CORS\] No 'Access-Control-Allow-Origin' header is present on the requested resource [\#2](https://github.com/liyasthomas/postwoman/issues/2)
**Closed issues:**
- Section labels don't display properly in Firefox [\#237](https://github.com/liyasthomas/postwoman/issues/237)
- Unsupported URLs \[BUG\]? [\#229](https://github.com/liyasthomas/postwoman/issues/229)
- Credentials are still being included in Permalink even when "Include in URL" is turned off [\#227](https://github.com/liyasthomas/postwoman/issues/227)
- Display sendRequest runtime errors in the console [\#206](https://github.com/liyasthomas/postwoman/issues/206)
- Missing "Landing/start page" [\#162](https://github.com/liyasthomas/postwoman/issues/162)
- Response with content-type "application/hal+json" shows as \[Object object\] [\#158](https://github.com/liyasthomas/postwoman/issues/158)
- A place to discuss [\#149](https://github.com/liyasthomas/postwoman/issues/149)
- Inconsistent version name [\#141](https://github.com/liyasthomas/postwoman/issues/141)
- Autoresize the textarea [\#102](https://github.com/liyasthomas/postwoman/issues/102)
- Content-Type revamping [\#99](https://github.com/liyasthomas/postwoman/issues/99)
- Add version number in footer [\#97](https://github.com/liyasthomas/postwoman/issues/97)
- The history doesn't show a date with the timestamp. [\#81](https://github.com/liyasthomas/postwoman/issues/81)
- Not working on Brave Browser anymore [\#71](https://github.com/liyasthomas/postwoman/issues/71)
- Why da fuq is your name plastered all over the README? [\#70](https://github.com/liyasthomas/postwoman/issues/70)
- Comparison with Postman is missing [\#69](https://github.com/liyasthomas/postwoman/issues/69)
- HTTP request with different library [\#61](https://github.com/liyasthomas/postwoman/issues/61)
- Editorconfig file [\#60](https://github.com/liyasthomas/postwoman/issues/60)
- 500 this.isValidURL is not a function [\#58](https://github.com/liyasthomas/postwoman/issues/58)
- Styling with Tailwindcss [\#38](https://github.com/liyasthomas/postwoman/issues/38)
- Not Working in IE 11 [\#37](https://github.com/liyasthomas/postwoman/issues/37)
- PWA not installable [\#19](https://github.com/liyasthomas/postwoman/issues/19)
- Simple Misspelling [\#8](https://github.com/liyasthomas/postwoman/issues/8)
**Merged pull requests:**
- docs: add liyasthomas as a contributor [\#264](https://github.com/liyasthomas/postwoman/pull/264) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add jamesgeorge007 as a contributor [\#263](https://github.com/liyasthomas/postwoman/pull/263) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add NBTX as a contributor [\#262](https://github.com/liyasthomas/postwoman/pull/262) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- Fix .all-contributorsrc badge template. [\#260](https://github.com/liyasthomas/postwoman/pull/260) ([NBTX](https://github.com/NBTX))
- docs: add hosseinnedaee as a contributor [\#259](https://github.com/liyasthomas/postwoman/pull/259) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add nityanandagohain as a contributor [\#257](https://github.com/liyasthomas/postwoman/pull/257) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add JacobAnavisca as a contributor [\#256](https://github.com/liyasthomas/postwoman/pull/256) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add izerozlu as a contributor [\#255](https://github.com/liyasthomas/postwoman/pull/255) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add vlad0337187 as a contributor [\#254](https://github.com/liyasthomas/postwoman/pull/254) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add AndrewBastin as a contributor [\#253](https://github.com/liyasthomas/postwoman/pull/253) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add terranblake as a contributor [\#252](https://github.com/liyasthomas/postwoman/pull/252) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add nickpalenchar as a contributor [\#251](https://github.com/liyasthomas/postwoman/pull/251) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add yubathom as a contributor [\#250](https://github.com/liyasthomas/postwoman/pull/250) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add larouxn as a contributor [\#249](https://github.com/liyasthomas/postwoman/pull/249) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add NBTX as a contributor [\#248](https://github.com/liyasthomas/postwoman/pull/248) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- docs: add liyasthomas as a contributor [\#247](https://github.com/liyasthomas/postwoman/pull/247) ([allcontributors[bot]](https://github.com/apps/allcontributors))
- Make page changes more fluid [\#246](https://github.com/liyasthomas/postwoman/pull/246) ([NBTX](https://github.com/NBTX))
- Minor tweaks [\#245](https://github.com/liyasthomas/postwoman/pull/245) ([liyasthomas](https://github.com/liyasthomas))
- ⬆️ Bump @nuxtjs/google-tag-manager from 2.3.0 to 2.3.1 [\#243](https://github.com/liyasthomas/postwoman/pull/243) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump yargs-parser from 15.0.0 to 16.1.0 [\#242](https://github.com/liyasthomas/postwoman/pull/242) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/toast from 3.2.1 to 3.3.0 [\#241](https://github.com/liyasthomas/postwoman/pull/241) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump highlight.js from 9.15.10 to 9.16.2 [\#240](https://github.com/liyasthomas/postwoman/pull/240) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump cypress from 3.5.0 to 3.6.0 [\#239](https://github.com/liyasthomas/postwoman/pull/239) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Fix legend labels in Firefox, fix colored labels slider [\#238](https://github.com/liyasthomas/postwoman/pull/238) ([NBTX](https://github.com/NBTX))
- Documentation Cleanup [\#230](https://github.com/liyasthomas/postwoman/pull/230) ([amitdash291](https://github.com/amitdash291))
- Fix \#227 Exclude credentials from permalink [\#228](https://github.com/liyasthomas/postwoman/pull/228) ([reefqi037](https://github.com/reefqi037))
- ⬆️ Bump cypress from 3.4.1 to 3.5.0 [\#224](https://github.com/liyasthomas/postwoman/pull/224) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/axios from 5.6.0 to 5.8.0 [\#223](https://github.com/liyasthomas/postwoman/pull/223) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump node-sass from 4.12.0 to 4.13.0 [\#222](https://github.com/liyasthomas/postwoman/pull/222) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump nuxt from 2.10.1 to 2.10.2 [\#221](https://github.com/liyasthomas/postwoman/pull/221) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/google-analytics from 2.2.0 to 2.2.1 [\#220](https://github.com/liyasthomas/postwoman/pull/220) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump vuex-persist from 2.1.0 to 2.1.1 [\#219](https://github.com/liyasthomas/postwoman/pull/219) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Fixed frame colors toggle [\#216](https://github.com/liyasthomas/postwoman/pull/216) ([mateusppereira](https://github.com/mateusppereira))
- Re-order sections and add toggle for including authentication in URL [\#215](https://github.com/liyasthomas/postwoman/pull/215) ([NBTX](https://github.com/NBTX))
- chore: minor code refactor [\#214](https://github.com/liyasthomas/postwoman/pull/214) ([jamesgeorge007](https://github.com/jamesgeorge007))
- Fix \#212 Clear bearer token value [\#213](https://github.com/liyasthomas/postwoman/pull/213) ([reefqi037](https://github.com/reefqi037))
- fix: don't display 'Collection is empty' label if collection has any … [\#208](https://github.com/liyasthomas/postwoman/pull/208) ([vlad0337187](https://github.com/vlad0337187))
- Fix proxy URL [\#201](https://github.com/liyasthomas/postwoman/pull/201) ([NBTX](https://github.com/NBTX))
- Fix CORS and Mixed-Content issue & Bug Fixes [\#200](https://github.com/liyasthomas/postwoman/pull/200) ([NBTX](https://github.com/NBTX))
- ⬆️ Bump start-server-and-test from 1.10.5 to 1.10.6 [\#198](https://github.com/liyasthomas/postwoman/pull/198) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump start-server-and-test from 1.10.3 to 1.10.5 [\#194](https://github.com/liyasthomas/postwoman/pull/194) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump @nuxtjs/google-tag-manager from 2.2.1 to 2.3.0 [\#193](https://github.com/liyasthomas/postwoman/pull/193) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump nuxt from 2.10.0 to 2.10.1 [\#192](https://github.com/liyasthomas/postwoman/pull/192) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- ⬆️ Bump yargs-parser from 14.0.0 to 15.0.0 [\#191](https://github.com/liyasthomas/postwoman/pull/191) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- Add quotation marks for generated code [\#187](https://github.com/liyasthomas/postwoman/pull/187) ([johnhenry](https://github.com/johnhenry))
- updated threshold and rootMargin for IntersectionObserver [\#182](https://github.com/liyasthomas/postwoman/pull/182) ([edisonaugusthy](https://github.com/edisonaugusthy))
- Add basic e2e tests [\#181](https://github.com/liyasthomas/postwoman/pull/181) ([yubathom](https://github.com/yubathom))
- ⬆️ Bump nuxt from 2.9.2 to 2.10.0 [\#179](https://github.com/liyasthomas/postwoman/pull/179) ([dependabot-preview[bot]](https://github.com/apps/dependabot-preview))
- 🐛 Fixed sitemap configuration [\#177](https://github.com/liyasthomas/postwoman/pull/177) ([NicoPennec](https://github.com/NicoPennec))
- Code Refactoring [\#173](https://github.com/liyasthomas/postwoman/pull/173) ([edisonaugusthy](https://github.com/edisonaugusthy))
- Added Black Theme [\#172](https://github.com/liyasthomas/postwoman/pull/172) ([AndrewBastin](https://github.com/AndrewBastin))
## [v0.1.0](https://github.com/liyasthomas/postwoman/tree/v0.1.0) (2019-08-22)
[Full Changelog](https://github.com/liyasthomas/postwoman/compare/91c08a5e6305cc95a0df46a33fdd0013bf7339b4...v0.1.0)

View File

@@ -3,7 +3,7 @@
<br>
<br>
<p>
<b>A free, fast & beautiful API request builder</b>
<b>A free, fast and beautiful API request builder</b>
</p>
<p>
<i>Web alternative to Postman - Helps you create requests faster, saving precious time on development - <a href="https://postwoman.launchaco.com">Subscribe</a></i>
@@ -92,6 +92,10 @@ _Customized themes are synced with local session storage_
📡 **Server Sent Events**: Receive a stream of updates from a server over a HTTP connection without resorting to polling.
🌩 **Socket.IO**: Send and Receive data with socketio server. SocketIO is popular websocket solution.
🦟 **MQTT**: Subscribe and Publish to topics of a MQTT Broker.
🔮 **GraphQL**: GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.
- Set endpoint and get schemas
@@ -161,7 +165,7 @@ _Collections are synced with local session storage_
- Access APIs served in non-HTTPS (`http://`)
- Use custom Proxy URL
_Official Postwoman Proxy is hosted by ApolloTV - **[Privacy policy](https://apollotv.xyz/legal)**_
_Official Postwoman Proxy is hosted by Apollo Software - **[Privacy Policy](https://apollosoftware.xyz/legal/postwoman)**_
📜 **Pre-Request Scripts β**: Snippets of code associated with a request that are executed before the request is sent.
@@ -204,7 +208,7 @@ _**All `i18n` contributions are welcome to `i18n` [branch](https://github.com/li
- **[CLI β](https://github.com/postwoman-io/postwoman-cli)** - A CLI solution for Postwoman
- **Browser Extensions** - Browser extensions that simplifies access to Postwoman
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/postwoman) ([GitHub](https://github.com/AndrewBastin/postwoman-firefox)) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/postwoman-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld) ([GitHub](https://github.com/AndrewBastin/postwoman-chrome))
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/postwoman) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/postwoman-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld) ([GitHub](https://github.com/AndrewBastin/postwoman-extension))
>**Extensions fixes `CORS` issues.**
@@ -219,6 +223,8 @@ _Add-ons are developed and maintained under **[Official Postwoman Organization](
**Sync:**
- History
- Collections
- Environments
- Notes
**Post-Request Tests β**: Write tests associated with a request that are executed after the request response.
@@ -227,6 +233,17 @@ _Add-ons are developed and maintained under **[Official Postwoman Organization](
- Filter response headers
- Parse the response data
📝 **Notes** : Instantly jot down notes, tasks or whatever you feel like as they come to your mind.
_Notes are only available for signed-in users_
🌱 **Environments** : Environment variables allow you to store and reuse values in your requests and scripts.
**Use-cases:**
- By storing a value in a variable, you can reference it throughout your request section
- If you need to update the value, you only have to change it in one place
- Using variables increases your ability to work efficiently and minimizes the likelihood of error
**To find out more, please check out [Postwoman Wiki](https://github.com/liyasthomas/postwoman/wiki).**
## Demo 🚀 [![Website](https://img.shields.io/website?url=https%3A%2F%2Fpostwoman.io&logo=Postwoman)](https://postwoman.io)
@@ -257,6 +274,10 @@ You're done!
## Developing 👷
0. Update [`.env.example`](https://github.com/liyasthomas/postwoman/blob/master/.env.example) file found in repository's root directory with your own keys and rename it to `.env`.
_Sample keys only works with the [production build](https://postwoman.io)._
#### Use a browser based development environment:
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/liyasthomas/postwoman)
@@ -315,36 +336,45 @@ See the [CHANGELOG](CHANGELOG.md) file for details.
### Lead Developers
* **[Liyas Thomas](https://github.com/liyasthomas)** - *Author*
* **[Caneco](https://twitter.com/caneco)** - *Designer*
* **[John Harker](https://github.com/NBTX)** - *Lead developer*
* **[Andrew Bastin](https://github.com/andrewbastin)** - *Lead developer*
* **[James George](https://github.com/jamesgeorge007)** - *Lead maintainer*
* **[Caneco](https://twitter.com/caneco)** - *Logo and banner designer*
### Testing and Debugging
* ([contributors](https://github.com/liyasthomas/postwoman/graphs/contributors))
### Collaborators <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://liyasthomas.web.app"><img src="https://avatars1.githubusercontent.com/u/10395817?v=4" width="100px;" alt="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://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>
<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://liyasthomas.web.app"><img src="https://avatars1.githubusercontent.com/u/10395817?v=4" width="100px;" alt=""/><br /><sub><b>Liyas Thomas</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=liyasthomas" title="Code">💻</a> <a href="#design-liyasthomas" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/NBTX"><img src="https://avatars3.githubusercontent.com/u/43181178?v=4" width="100px;" alt=""/><br /><sub><b>John Harker</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=NBTX" title="Code">💻</a> <a href="#design-NBTX" title="Design">🎨</a></td>
<td align="center"><a href="https://nicholaslaroux.com"><img src="https://avatars0.githubusercontent.com/u/1557529?v=4" width="100px;" alt=""/><br /><sub><b>Nicholas La Roux</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=larouxn" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/yubathom"><img src="https://avatars3.githubusercontent.com/u/4117768?v=4" width="100px;" alt=""/><br /><sub><b>Thomas Yuba</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=yubathom" title="Code">💻</a></td>
<td align="center"><a href="http://www.linkedin.com/in/nickpalenchar"><img src="https://avatars1.githubusercontent.com/u/7539781?v=4" width="100px;" alt=""/><br /><sub><b>Nick Palenchar</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=nickpalenchar" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/AndrewBastin"><img src="https://avatars2.githubusercontent.com/u/9131943?v=4" width="100px;" alt=""/><br /><sub><b>Andrew Bastin</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=AndrewBastin" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/vlad0337187"><img src="https://avatars1.githubusercontent.com/u/12682937?v=4" width="100px;" alt=""/><br /><sub><b>Vladislav</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=vlad0337187" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/izerozlu"><img src="https://avatars3.githubusercontent.com/u/17386157?v=4" width="100px;" alt="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>
<td align="center"><a href="https://github.com/izerozlu"><img src="https://avatars3.githubusercontent.com/u/17386157?v=4" width="100px;" alt=""/><br /><sub><b>izerozlu</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=izerozlu" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/JacobAnavisca"><img src="https://avatars2.githubusercontent.com/u/21232366?v=4" width="100px;" alt=""/><br /><sub><b>Jacob Anavisca</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=JacobAnavisca" title="Code">💻</a></td>
<td align="center"><a href="http://nityanandagohain.github.io"><img src="https://avatars3.githubusercontent.com/u/26831659?v=4" width="100px;" alt=""/><br /><sub><b>Nityananda Gohain</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=nityanandagohain" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/hosseinnedaee"><img src="https://avatars2.githubusercontent.com/u/42691357?v=4" width="100px;" alt=""/><br /><sub><b>Hossein Nedaee</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=hosseinnedaee" title="Code">💻</a></td>
<td align="center"><a href="https://ghuser.io/jamesgeorge007"><img src="https://avatars2.githubusercontent.com/u/25279263?v=4" width="100px;" alt=""/><br /><sub><b>James George</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=jamesgeorge007" title="Code">💻</a></td>
<td align="center"><a href="https://dmitryyankowski.com"><img src="https://avatars0.githubusercontent.com/u/20114263?v=4" width="100px;" alt=""/><br /><sub><b>Dmitry Yankowski</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=dmitryyankowski" title="Code">💻</a></td>
<td align="center"><a href="http://www.sboulema.nl"><img src="https://avatars2.githubusercontent.com/u/1820661?v=4" width="100px;" alt=""/><br /><sub><b>Samir Boulema</b></sub></a><br /><a href="https://github.com/liyasthomas/postwoman/commits?author=sboulema" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
See the list of [contributors](https://github.com/liyasthomas/postwoman/graphs/contributors) who participated in this project.
@@ -353,20 +383,10 @@ See the list of [contributors](https://github.com/liyasthomas/postwoman/graphs/c
* [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)]
@@ -382,6 +402,16 @@ Support this project with your organization. Your logo will show up here with a
<a href="https://opencollective.com/postwoman/organization/8/website"><img src="https://opencollective.com/postwoman/organization/8/avatar.svg"></a>
<a href="https://opencollective.com/postwoman/organization/9/website"><img src="https://opencollective.com/postwoman/organization/9/avatar.svg"></a>
#### Individuals
<a href="https://opencollective.com/postwoman"><img src="https://opencollective.com/postwoman/individuals.svg"></a>
### Code Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="https://github.com/liyasthomas/postwoman/graphs/contributors"><img src="https://opencollective.com/postwoman/contributors.svg?width=890&button=false" /></a>
## License 📄
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [LICENSE](LICENSE) file for details.

View File

@@ -6,7 +6,9 @@
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
font-display: swap;
// Do not use font-display: swap for the icon font - it looks really bad when the page
// loads.
font-display: block;
src: url("~static/fonts/material-icons-v48.woff2") format("woff2");
}

View File

@@ -1,17 +1,3 @@
.page-enter-active,
.page-leave-active,
.layout-enter-active,
.layout-leave-active {
transition: opacity 0.2s;
}
.page-enter,
.page-leave-active,
.layout-enter,
.layout-leave-active {
opacity: 0;
}
$responsiveWidth: 768px;
::selection {
@@ -23,12 +9,12 @@ $responsiveWidth: 768px;
width: 4px;
height: 4px;
border-radius: 4px;
background-color: var(--bg-light-color);
background-color: var(--bg-dark-color);
}
::-webkit-scrollbar-thumb {
border-radius: 4px;
background-color: var(--fg-light-color);
border-radius: 8px;
&:hover {
background-color: var(--fg-color);
@@ -60,9 +46,9 @@ body {
padding: 0;
margin: 0;
scroll-behavior: smooth;
transition: all 0.2s ease-in-out;
}
// Make theme transition smoother.
body.afterLoad {
transition: background-color 0.2s ease-in-out;
}
@@ -76,6 +62,10 @@ a {
color: inherit;
text-decoration: none;
transition: all 0.2s ease-in-out;
&.link {
color: var(--ac-color);
}
}
header,
@@ -89,10 +79,24 @@ footer {
}
}
.page-enter-active,
.page-leave-active,
.layout-enter-active,
.layout-leave-active {
transition: opacity 0.2s;
}
.page-enter,
.page-leave-active,
.layout-enter,
.layout-leave-active {
opacity: 0;
}
.wrapper {
min-height: 100vh;
display: flex;
flex-direction: column;
flex-flow: column nowrap;
}
.wrapper .page {
@@ -107,31 +111,6 @@ footer {
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;
&:hover {
color: var(--ac-color);
}
}
.nav-first,
.sticky-inner {
display: flex;
@@ -146,7 +125,8 @@ footer {
z-index: 1;
height: 100vh;
padding: 0 8px;
background-color: var(--bg-light-color);
background-color: var(--bg-dark-color);
transition: all 0.2s ease-in-out;
}
.main {
@@ -156,7 +136,6 @@ footer {
order: 2;
position: relative;
padding: 0 16px;
height: 100%;
}
.nav-second {
@@ -173,6 +152,7 @@ nav.primary-nav {
svg {
fill: var(--fg-light-color);
transition: all 0.2s ease-in-out;
}
a {
@@ -186,7 +166,7 @@ nav.primary-nav {
color: var(--fg-light-color);
fill: var(--fg-light-color);
margin: 8px 0;
transition: all 0.2s ease-in-out;
height: 52px;
&:hover {
color: var(--fg-color);
@@ -245,10 +225,6 @@ nav.secondary-nav {
}
}
.footer {
flex-direction: column;
}
h1,
h2,
h3,
@@ -261,6 +237,11 @@ h4 {
hr {
border-bottom: 1px dashed var(--brd-color);
margin: 16px 0;
}
p {
transition: all 0.2s ease-in-out;
}
.tooltip {
@@ -268,6 +249,7 @@ hr {
$fgcolor: var(--fg-color);
display: block !important;
z-index: 10000;
transition: all 0.2s ease-in-out;
.tooltip-inner {
background: $bgcolor;
@@ -386,7 +368,7 @@ h3.title {
margin: 4px;
}
.info {
.info:not(.toasted) {
margin-left: 4px;
color: var(--fg-light-color);
}
@@ -422,7 +404,6 @@ button {
color: var(--act-color);
fill: var(--act-color);
box-shadow: inset 0 0 0 2px var(--fg-color);
transition: all 0.2s ease-in-out;
}
&.icon {
@@ -437,7 +418,6 @@ button {
color: var(--fg-color);
fill: var(--fg-color);
box-shadow: none;
transition: all 0.2s ease-in-out;
}
}
@@ -472,72 +452,84 @@ button {
fieldset {
margin: 16px 0;
border-radius: 16px;
transition: all 0.2s ease-in-out;
background-color: var(--bg-dark-color);
}
transition: all 0.2s ease-in-out;
legend {
display: inline-block;
align-items: center;
justify-content: center;
color: var(--fg-color);
font-weight: 700;
cursor: pointer;
legend {
display: inline-block;
align-items: center;
justify-content: center;
color: var(--fg-color);
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease-in-out;
* {
vertical-align: middle;
* {
vertical-align: middle;
}
i {
margin-left: 8px;
}
}
i {
margin-left: 8px;
&.blue legend {
color: #57b5f9;
}
&.gray legend {
color: #bcc2cd;
}
&.green legend {
color: #50fa7b;
}
&.cyan legend {
color: #8be9fd;
}
&.purple legend {
color: #bd93f9;
}
&.orange legend {
color: #ffb86c;
}
&.pink legend {
color: #ff79c6;
}
&.red legend {
color: #ff5555;
}
&.yellow legend {
color: #f1fa8c;
}
}
fieldset.blue legend {
color: #57b5f9;
fieldset:target,
section:target {
animation: highlight 2s ease;
}
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;
@keyframes highlight {
50% {
box-shadow: 0 0 0 2px var(--ac-color);
}
}
input[type="file"],
input[type="radio"],
.tab,
.hide-on-large-screen,
#installPWA,
.hidden {
display: none;
}
.method,
kbd,
select,
input,
@@ -564,7 +556,16 @@ code {
&:not([readonly]):not(.ace_editor):active,
&:not([readonly]):not(.ace_editor):focus {
box-shadow: inset 0 0 0 2px var(--fg-light-color);
transition: all 0.2s ease-in-out;
}
}
.method {
cursor: pointer;
&:hover,
&:active,
&:focus {
box-shadow: inset 0 0 0 2px var(--fg-light-color);
}
}
@@ -587,6 +588,15 @@ pre {
.select-wrapper {
position: relative;
input {
text-transform: uppercase;
min-width: 128px;
}
.trigger {
width: 100%;
}
&:after {
display: inline-block;
position: absolute;
@@ -661,6 +671,7 @@ input[type="checkbox"] {
label {
padding: 4px;
color: var(--fg-light-color);
transition: all 0.2s ease-in-out;
}
ul,
@@ -670,6 +681,11 @@ ol {
padding: 0;
list-style-type: none;
&.response-headers {
display: inline-flex;
width: 50%;
}
ul,
ol {
margin: 0;
@@ -679,9 +695,13 @@ ol {
ul li,
ol li {
display: inline-flex;
flex-direction: column;
flex-grow: 1;
flex-flow: column nowrap;
flex: 1;
justify-content: center;
&.shrink {
flex-grow: 0;
}
}
.flex-wrap {
@@ -693,7 +713,7 @@ ol li {
* {
display: inline-flex;
flex-wrap: wrap;
flex-flow: row wrap;
align-items: center;
justify-content: center;
}
@@ -704,7 +724,7 @@ ol li {
}
.show-on-large-screen {
display: inline-flex;
display: flex;
flex: 1;
}
@@ -773,54 +793,22 @@ ol li {
}
#send {
// #hidden-message {
// display: none;
// }
&.show {
display: flex;
position: fixed;
top: 12px;
right: 12px;
z-index: 2;
// #hidden-message {
// display: block;
// margin-left: 4px;
// }
bottom: 86px;
left: 50%;
z-index: 10001;
transform: translateX(-50%);
box-shadow: 0 4px 24px rgba(black, 0.2);
transition: all 0.2s ease-in-out;
}
}
section {
display: flex;
flex-wrap: wrap;
}
.tab {
width: 100%;
order: 1;
}
input[type="radio"] + label {
padding: 8px 16px;
border-bottom: 2px solid transparent;
cursor: pointer;
transition: all 0.2s ease-in-out;
&:hover,
&:active,
&:focus {
border-color: var(--brd-color);
}
}
input[type="radio"]:checked + label {
border-color: var(--fg-color);
color: var(--fg-color);
}
input[type="radio"]:checked + label + .tab {
display: block;
border-radius: 16px;
}
.toasted-container .toasted {
@@ -873,18 +861,19 @@ input[type="radio"]:checked + label + .tab {
padding: 0;
width: 100%;
background-color: var(--bg-color);
transition: all 0.2s ease-in-out;
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.45);
}
nav.primary-nav {
flex-flow: row nowrap;
overflow: auto;
justify-content: space-around;
justify-content: space-between;
background-color: var(--bg-dark-color);
a {
background-color: transparent;
margin: 8px;
flex: 1;
&.nuxt-link-exact-active {
background-color: transparent;
@@ -908,7 +897,7 @@ input[type="radio"]:checked + label + .tab {
ul,
ol {
flex-direction: column;
flex-flow: column nowrap;
}
ul li,

View File

@@ -11,9 +11,9 @@
// Background color
--bg-color: rgba(32, 33, 36, 1);
// Light Background color
--bg-light-color: rgba(255, 255, 255, 0.02);
--bg-light-color: rgba(255, 255, 255, 0.04);
// Dark Background color
--bg-dark-color: rgba(0, 0, 0, 0.1);
--bg-dark-color: rgba(0, 0, 0, 0.2);
// Text color
--fg-color: rgba(255, 255, 255, 0.9);
// Light Text color
@@ -36,7 +36,7 @@
// Background color
--bg-color: rgba(255, 255, 255, 1);
// Light Background color
--bg-light-color: rgba(0, 0, 0, 0.02);
--bg-light-color: rgba(0, 0, 0, 0.05);
// Dark Background color
--bg-dark-color: rgba(0, 0, 0, 0.02);
// Text color
@@ -63,7 +63,7 @@
// Light Background color
--bg-light-color: rgba(255, 255, 255, 0.02);
// Dark Background color
--bg-dark-color: rgba(255, 255, 255, 0.02);
--bg-dark-color: rgba(255, 255, 255, 0.04);
// Text color
--fg-color: rgba(255, 255, 255, 0.9);
// Light Text color

View File

@@ -1,6 +1,6 @@
import * as cookie from "cookie";
import * as URL from "url";
import * as querystring from "querystring";
import * as cookie from "cookie"
import * as URL from "url"
import * as querystring from "querystring"
/**
* given this: [ 'msg1=value1', 'msg2=value2' ]
@@ -8,121 +8,118 @@ import * as querystring from "querystring";
* @param dataArguments
*/
const joinDataArguments = dataArguments => {
let data = "";
let data = ""
dataArguments.forEach((argument, i) => {
if (i === 0) {
data += argument;
data += argument
} else {
data += `&${argument}`;
data += `&${argument}`
}
});
return data;
};
})
return data
}
const parseCurlCommand = curlCommand => {
let newlineFound = /\r|\n/.exec(curlCommand);
let newlineFound = /\r|\n/.exec(curlCommand)
if (newlineFound) {
// remove newlines
curlCommand = curlCommand.replace(/\r|\n/g, "");
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];
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];
url = parsedArguments[argName]
}
}
}
}
let headers;
let headers
const parseHeaders = headerFieldName => {
if (parsedArguments[headerFieldName]) {
if (!headers) {
headers = {};
headers = {}
}
if (!Array.isArray(parsedArguments[headerFieldName])) {
parsedArguments[headerFieldName] = [parsedArguments[headerFieldName]];
parsedArguments[headerFieldName] = [parsedArguments[headerFieldName]]
}
parsedArguments[headerFieldName].forEach(header => {
if (header.includes("Cookie")) {
// stupid javascript tricks: closure
cookieString = header;
cookieString = header
} else {
let colonIndex = header.indexOf(":");
let headerName = header.substring(0, colonIndex);
let headerValue = header.substring(colonIndex + 1).trim();
headers[headerName] = headerValue;
let colonIndex = header.indexOf(":")
let headerName = header.substring(0, colonIndex)
let headerValue = header.substring(colonIndex + 1).trim()
headers[headerName] = headerValue
}
});
})
}
};
}
parseHeaders("H");
parseHeaders("header");
parseHeaders("H")
parseHeaders("header")
if (parsedArguments.A) {
if (!headers) {
headers = [];
headers = []
}
headers["User-Agent"] = parsedArguments.A;
headers["User-Agent"] = parsedArguments.A
} else if (parsedArguments["user-agent"]) {
if (!headers) {
headers = [];
headers = []
}
headers["User-Agent"] = parsedArguments["user-agent"];
headers["User-Agent"] = parsedArguments["user-agent"]
}
if (parsedArguments.b) {
cookieString = parsedArguments.b;
cookieString = parsedArguments.b
}
if (parsedArguments.cookie) {
cookieString = parsedArguments.cookie;
cookieString = parsedArguments.cookie
}
let multipartUploads;
let multipartUploads
if (parsedArguments.F) {
multipartUploads = {};
multipartUploads = {}
if (!Array.isArray(parsedArguments.F)) {
parsedArguments.F = [parsedArguments.F];
parsedArguments.F = [parsedArguments.F]
}
parsedArguments.F.forEach(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;
});
const [key, value] = multipartArgument.split("=", 2)
multipartUploads[key] = value
})
}
if (cookieString) {
const cookieParseOptions = {
decode: s => s
};
decode: s => s,
}
// separate out cookie headers into separate data structure
// note: cookie is case insensitive
cookies = cookie.parse(
cookieString.replace(/^Cookie: /gi, ""),
cookieParseOptions
);
cookies = cookie.parse(cookieString.replace(/^Cookie: /gi, ""), cookieParseOptions)
}
let method;
let method
if (parsedArguments.X === "POST") {
method = "post";
method = "post"
} else if (parsedArguments.X === "PUT" || parsedArguments["T"]) {
method = "put";
method = "put"
} else if (parsedArguments.X === "PATCH") {
method = "patch";
method = "patch"
} else if (parsedArguments.X === "DELETE") {
method = "delete";
method = "delete"
} else if (parsedArguments.X === "OPTIONS") {
method = "options";
method = "options"
} else if (
(parsedArguments["d"] ||
parsedArguments["data"] ||
@@ -132,95 +129,94 @@ const parseCurlCommand = curlCommand => {
parsedArguments["form"]) &&
!(parsedArguments["G"] || parsedArguments["get"])
) {
method = "post";
method = "post"
} else if (parsedArguments["I"] || parsedArguments["head"]) {
method = "head";
method = "head"
} else {
method = "get";
method = "get"
}
let compressed = !!parsedArguments.compressed;
let urlObject = URL.parse(url); // eslint-disable-line
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;
urlObject.query = urlObject.query ? urlObject.query : ""
let option = "d" in parsedArguments ? "d" : "data" in parsedArguments ? "data" : null
if (option) {
let urlQueryString = "";
let urlQueryString = ""
if (!url.includes("?")) {
url += "?";
url += "?"
} else {
urlQueryString += "&";
urlQueryString += "&"
}
if (typeof parsedArguments[option] === "object") {
urlQueryString += parsedArguments[option].join("&");
urlQueryString += parsedArguments[option].join("&")
} else {
urlQueryString += parsedArguments[option];
urlQueryString += parsedArguments[option]
}
urlObject.query += urlQueryString;
url += urlQueryString;
delete parsedArguments[option];
urlObject.query += urlQueryString
url += urlQueryString
delete parsedArguments[option]
}
}
let query = querystring.parse(urlObject.query, null, null, {
maxKeys: 10000
});
maxKeys: 10000,
})
urlObject.search = null; // Clean out the search/query portion.
urlObject.search = null // Clean out the search/query portion.
const request = {
url,
urlWithoutQuery: URL.format(urlObject)
};
urlWithoutQuery: URL.format(urlObject),
}
if (compressed) {
request["compressed"] = true;
request["compressed"] = true
}
if (Object.keys(query).length > 0) {
request.query = query;
request.query = query
}
if (headers) {
request.headers = headers;
request.headers = headers
}
request["method"] = method;
request["method"] = method
if (cookies) {
request.cookies = cookies;
request.cookieString = cookieString.replace("Cookie: ", "");
request.cookies = cookies
request.cookieString = cookieString.replace("Cookie: ", "")
}
if (multipartUploads) {
request.multipartUploads = multipartUploads;
request.multipartUploads = multipartUploads
}
if (parsedArguments.data) {
request.data = parsedArguments.data;
request.data = parsedArguments.data
} else if (parsedArguments["data-binary"]) {
request.data = parsedArguments["data-binary"];
request.isDataBinary = true;
request.data = parsedArguments["data-binary"]
request.isDataBinary = true
} else if (parsedArguments["d"]) {
request.data = parsedArguments["d"];
request.data = parsedArguments["d"]
} else if (parsedArguments["data-ascii"]) {
request.data = parsedArguments["data-ascii"];
request.data = parsedArguments["data-ascii"]
}
if (parsedArguments["u"]) {
request.auth = parsedArguments["u"];
request.auth = parsedArguments["u"]
}
if (parsedArguments["user"]) {
request.auth = parsedArguments["user"];
request.auth = parsedArguments["user"]
}
if (Array.isArray(request.data)) {
request.dataArray = request.data;
request.data = joinDataArguments(request.data);
request.dataArray = request.data
request.data = joinDataArguments(request.data)
}
if (parsedArguments["k"] || parsedArguments["insecure"]) {
request.insecure = true;
request.insecure = true
}
return request;
};
return request
}
export default parseCurlCommand;
export default parseCurlCommand

View File

@@ -1,4 +1,4 @@
const redirectUri = `${window.location.origin}/`;
const redirectUri = `${window.location.origin}/`
// GENERAL HELPER FUNCTIONS
@@ -13,23 +13,23 @@ const redirectUri = `${window.location.origin}/`;
const sendPostRequest = async (url, params) => {
const body = Object.keys(params)
.map(key => `${key}=${params[key]}`)
.join("&");
.join("&")
const options = {
method: "post",
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
body
};
try {
const response = await fetch(url, options);
const data = await response.json();
return data;
} catch (err) {
console.error("Request failed", err);
throw err;
body,
}
};
try {
const response = await fetch(url, options)
const data = await response.json()
return data
} catch (err) {
console.error("Request failed", err)
throw err
}
}
/**
* Parse a query string into an object
@@ -40,15 +40,12 @@ const sendPostRequest = async (url, params) => {
const parseQueryString = searchQuery => {
if (searchQuery === "") {
return {};
return {}
}
const segments = searchQuery.split("&").map(s => s.split("="));
const queryString = segments.reduce(
(obj, el) => ({ ...obj, [el[0]]: el[1] }),
{}
);
return queryString;
};
const segments = searchQuery.split("&").map(s => s.split("="))
const queryString = segments.reduce((obj, el) => ({ ...obj, [el[0]]: el[1] }), {})
return queryString
}
/**
* Get OAuth configuration from OpenID Discovery endpoint
@@ -60,18 +57,18 @@ const getTokenConfiguration = async endpoint => {
const options = {
method: "GET",
headers: {
"Content-type": "application/json"
}
};
try {
const response = await fetch(endpoint, options);
const config = await response.json();
return config;
} catch (err) {
console.error("Request failed", err);
throw err;
"Content-type": "application/json",
},
}
};
try {
const response = await fetch(endpoint, options)
const config = await response.json()
return config
} catch (err) {
console.error("Request failed", err)
throw err
}
}
// PKCE HELPER FUNCTIONS
@@ -82,10 +79,10 @@ const getTokenConfiguration = async endpoint => {
*/
const generateRandomString = () => {
const array = new Uint32Array(28);
window.crypto.getRandomValues(array);
return Array.from(array, dec => `0${dec.toString(16)}`.substr(-2)).join("");
};
const array = new Uint32Array(28)
window.crypto.getRandomValues(array)
return Array.from(array, dec => `0${dec.toString(16)}`.substr(-2)).join("")
}
/**
* Calculate the SHA256 hash of the input text
@@ -94,10 +91,10 @@ const generateRandomString = () => {
*/
const sha256 = plain => {
const encoder = new TextEncoder();
const data = encoder.encode(plain);
return window.crypto.subtle.digest("SHA-256", data);
};
const encoder = new TextEncoder()
const data = encoder.encode(plain)
return window.crypto.subtle.digest("SHA-256", data)
}
/**
* Encodes the input string into Base64 format
@@ -115,7 +112,7 @@ const base64urlencode = (
btoa(String.fromCharCode.apply(null, new Uint8Array(str)))
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=+$/, "");
.replace(/=+$/, "")
/**
* Return the base64-urlencoded sha256 hash for the PKCE challenge
@@ -125,9 +122,9 @@ const base64urlencode = (
*/
const pkceChallengeFromVerifier = async v => {
const hashed = await sha256(v);
return base64urlencode(hashed);
};
const hashed = await sha256(v)
return base64urlencode(hashed)
}
// OAUTH REQUEST
@@ -144,32 +141,29 @@ const tokenRequest = async ({
authUrl,
accessTokenUrl,
clientId,
scope
scope,
}) => {
// Check oauth configuration
if (oidcDiscoveryUrl !== "") {
const {
authorization_endpoint,
token_endpoint
} = await getTokenConfiguration(oidcDiscoveryUrl);
authUrl = authorization_endpoint;
accessTokenUrl = token_endpoint;
const { authorization_endpoint, token_endpoint } = await getTokenConfiguration(oidcDiscoveryUrl)
authUrl = authorization_endpoint
accessTokenUrl = token_endpoint
}
// Store oauth information
localStorage.setItem("token_endpoint", accessTokenUrl);
localStorage.setItem("client_id", clientId);
localStorage.setItem("token_endpoint", accessTokenUrl)
localStorage.setItem("client_id", clientId)
// Create and store a random state value
const state = generateRandomString();
localStorage.setItem("pkce_state", state);
const state = generateRandomString()
localStorage.setItem("pkce_state", state)
// Create and store a new PKCE code_verifier (the plaintext random secret)
const code_verifier = generateRandomString();
localStorage.setItem("pkce_code_verifier", code_verifier);
const code_verifier = generateRandomString()
localStorage.setItem("pkce_code_verifier", code_verifier)
// Hash and base64-urlencode the secret to use as the challenge
const code_challenge = await pkceChallengeFromVerifier(code_verifier);
const code_challenge = await pkceChallengeFromVerifier(code_verifier)
// Build the authorization URL
const buildUrl = () =>
@@ -177,15 +171,13 @@ const tokenRequest = async ({
clientId
)}&state=${encodeURIComponent(state)}&scope=${encodeURIComponent(
scope
)}&redirect_uri=${encodeURIComponent(
redirectUri
)}&code_challenge=${encodeURIComponent(
)}&redirect_uri=${encodeURIComponent(redirectUri)}&code_challenge=${encodeURIComponent(
code_challenge
)}&code_challenge_method=S256`;
)}&code_challenge_method=S256`
// Redirect to the authorization server
window.location = buildUrl();
};
window.location = buildUrl()
}
// OAUTH REDIRECT HANDLING
@@ -197,42 +189,39 @@ const tokenRequest = async ({
*/
const oauthRedirect = async () => {
let tokenResponse = "";
let q = parseQueryString(window.location.search.substring(1));
let tokenResponse = ""
let q = parseQueryString(window.location.search.substring(1))
// Check if the server returned an error string
if (q.error) {
alert(`Error returned from authorization server: ${q.error}`);
alert(`Error returned from authorization server: ${q.error}`)
}
// If the server returned an authorization code, attempt to exchange it for an access token
if (q.code) {
// Verify state matches what we set at the beginning
if (localStorage.getItem("pkce_state") != q.state) {
alert("Invalid state");
alert("Invalid state")
} else {
try {
// Exchange the authorization code for an access token
tokenResponse = await sendPostRequest(
localStorage.getItem("token_endpoint"),
{
grant_type: "authorization_code",
code: q.code,
client_id: localStorage.getItem("client_id"),
redirect_uri: redirectUri,
code_verifier: localStorage.getItem("pkce_code_verifier")
}
);
tokenResponse = await sendPostRequest(localStorage.getItem("token_endpoint"), {
grant_type: "authorization_code",
code: q.code,
client_id: localStorage.getItem("client_id"),
redirect_uri: redirectUri,
code_verifier: localStorage.getItem("pkce_code_verifier"),
})
} catch (err) {
console.log(`${error.error}\n\n${error.error_description}`);
console.log(`${error.error}\n\n${error.error_description}`)
}
}
// Clean these up since we don't need them anymore
localStorage.removeItem("pkce_state");
localStorage.removeItem("pkce_code_verifier");
localStorage.removeItem("token_endpoint");
localStorage.removeItem("client_id");
return tokenResponse;
localStorage.removeItem("pkce_state")
localStorage.removeItem("pkce_code_verifier")
localStorage.removeItem("token_endpoint")
localStorage.removeItem("client_id")
return tokenResponse
}
return tokenResponse;
};
return tokenResponse
}
export { tokenRequest, oauthRedirect };
export { tokenRequest, oauthRedirect }

View File

@@ -2,55 +2,50 @@ export default () => {
//*** Determine whether or not the PWA has been installed. ***//
// Step 1: Check local storage
let pwaInstalled = localStorage.getItem("pwaInstalled") === "yes";
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;
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;
localStorage.setItem("pwaInstalled", "yes")
pwaInstalled = true
}
//*** If the PWA has not been installed, show the install PWA prompt.. ***//
let deferredPrompt = null;
let deferredPrompt = null
window.addEventListener("beforeinstallprompt", event => {
deferredPrompt = event;
deferredPrompt = event
// Show the install button if the prompt appeared.
if (!pwaInstalled) {
document.querySelector("#installPWA").style.display = "inline-flex";
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";
});
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;
deferredPrompt.prompt()
let outcome = await deferredPrompt.userChoice
if (outcome === "accepted") {
console.log("Postwoman was installed successfully.");
console.log("Postwoman was installed successfully.")
} else {
console.log(
"Postwoman could not be installed. (Installation rejected by user.)"
);
console.log("Postwoman could not be installed. (Installation rejected by user.)")
}
deferredPrompt = null;
deferredPrompt = null
}
};
};
}
}

View File

@@ -1,27 +1,26 @@
const axios = require("axios");
const fs = require("fs");
const { spawnSync } = require("child_process");
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, "");
.replace(/\n/g, "")
const FAIL_ON_ERROR = false;
const PW_BUILD_DATA_DIR = "./.postwoman";
const IS_DEV_MODE = process.argv.includes("--dev");
const FAIL_ON_ERROR = false
const PW_BUILD_DATA_DIR = "./.postwoman"
const IS_DEV_MODE = process.argv.includes("--dev")
try {
(async () => {
;(async () => {
// Create the build data directory if it does not exist.
if (!fs.existsSync(PW_BUILD_DATA_DIR)) {
fs.mkdirSync(PW_BUILD_DATA_DIR);
fs.mkdirSync(PW_BUILD_DATA_DIR)
}
let version = {};
let version = {}
// Get the current version name as the tag from Git.
version.name =
process.env.TRAVIS_TAG ||
runCommand("git", ["tag --sort=committerdate | tail -1"]);
process.env.TRAVIS_TAG || runCommand("git", ["tag --sort=committerdate | tail -1"])
// FALLBACK: If version.name was unset, let's grab it from GitHub.
if (!version.name) {
@@ -32,32 +31,29 @@ try {
.catch(ex => ({
data: [
{
tag_name: require("./package.json").version
}
]
tag_name: require("./package.json").version,
},
],
}))
).data[0]["tag_name"];
).data[0]["tag_name"]
}
// Get the current version hash as the short hash from Git.
version.hash = runCommand("git", ["rev-parse", "--short", "HEAD"]);
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" : "");
.split(" ")[0] + (IS_DEV_MODE ? " - DEV MODE" : "")
if (["", "master"].includes(version.variant)) {
delete version.variant;
delete version.variant
}
// Write version data into a file
fs.writeFileSync(
`${PW_BUILD_DATA_DIR}/version.json`,
JSON.stringify(version)
);
})();
fs.writeFileSync(`${PW_BUILD_DATA_DIR}/version.json`, JSON.stringify(version))
})()
} catch (ex) {
console.error(ex);
process.exit(FAIL_ON_ERROR ? 1 : 0);
console.error(ex)
process.exit(FAIL_ON_ERROR ? 1 : 0)
}

View File

@@ -1,92 +0,0 @@
<template>
<pre ref="editor"></pre>
</template>
<script>
const DEFAULT_THEME = "twilight";
import ace from "ace-builds";
import "ace-builds/webpack-resolver";
export default {
props: {
value: {
type: String,
default: ""
},
theme: {
type: String,
required: false
},
lang: {
type: String,
default: "json"
},
options: {
type: Object,
default: {}
}
},
data() {
return {
editor: null,
cacheValue: ""
};
},
watch: {
value(value) {
if (value !== this.cacheValue) {
this.editor.session.setValue(value, 1);
this.cacheValue = value;
}
},
theme() {
this.editor.setTheme("ace/theme/" + this.defineTheme());
},
lang(value) {
this.editor.getSession().setMode("ace/mode/" + value);
},
options(value) {
this.editor.setOptions(value);
}
},
mounted() {
const editor = ace.edit(this.$refs.editor, {
theme: "ace/theme/" + this.defineTheme(),
mode: "ace/mode/" + this.lang,
...this.options
});
if (this.value) editor.setValue(this.value, 1);
this.editor = editor;
this.cacheValue = this.value;
editor.on("change", () => {
const content = editor.getValue();
this.$emit("input", content);
this.cacheValue = content;
});
},
methods: {
defineTheme() {
if (this.theme) {
return this.theme;
} else {
return (
this.$store.state.postwoman.settings.THEME_ACE_EDITOR || DEFAULT_THEME
);
}
}
},
beforeDestroy() {
this.editor.destroy();
this.editor.container.remove();
}
};
</script>

View File

@@ -21,6 +21,7 @@
type="text"
v-model="name"
:placeholder="$t('my_new_collection')"
@keyup.enter="addNewCollection"
/>
</li>
</ul>
@@ -42,32 +43,42 @@
</template>
<script>
import { fb } from "../../functions/fb"
export default {
props: {
show: Boolean
show: Boolean,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
name: undefined
};
name: undefined,
}
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
addNewCollection() {
if (!this.$data.name) {
this.$toast.info("Please provide a valid name for the collection");
return;
this.$toast.info(this.$t("invalid_collection_name"))
return
}
this.$store.commit("postwoman/addNewCollection", {
name: this.$data.name
});
this.$emit("hide-modal");
name: this.$data.name,
})
this.$emit("hide-modal")
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal");
}
}
};
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -21,6 +21,7 @@
type="text"
v-model="name"
:placeholder="$t('my_new_folder')"
@keyup.enter="addNewFolder"
/>
</li>
</ul>
@@ -46,27 +47,27 @@ export default {
props: {
show: Boolean,
collection: Object,
collectionIndex: Number
collectionIndex: Number,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
name: undefined
};
name: undefined,
}
},
methods: {
addNewFolder() {
this.$store.commit("postwoman/addNewFolder", {
folder: { name: this.$data.name },
collectionIndex: this.$props.collectionIndex
});
this.hideModal();
collectionIndex: this.$props.collectionIndex,
})
this.hideModal()
},
hideModal() {
this.$emit("hide-modal");
}
}
};
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -21,11 +21,7 @@
</button>
</div>
<div>
<button
class="icon"
@click="$emit('edit-collection')"
v-close-popover
>
<button class="icon" @click="$emit('edit-collection')" v-close-popover>
<i class="material-icons">create</i>
<span>{{ $t("edit") }}</span>
</button>
@@ -51,11 +47,7 @@
@edit-request="$emit('edit-request', $event)"
/>
</li>
<li
v-if="
collection.folders.length === 0 && collection.requests.length === 0
"
>
<li v-if="collection.folders.length === 0 && collection.requests.length === 0">
<label>{{ $t("collection_empty") }}</label>
</li>
</ul>
@@ -71,7 +63,7 @@
request,
collectionIndex,
folderIndex: undefined,
requestIndex: index
requestIndex: index,
})
"
/>
@@ -98,31 +90,31 @@ ul li {
export default {
components: {
folder: () => import("./folder"),
request: () => import("./request")
request: () => import("./request"),
},
props: {
collectionIndex: Number,
collection: Object
collection: Object,
},
data() {
return {
showChildren: false,
selectedFolder: {}
};
selectedFolder: {},
}
},
methods: {
toggleShowChildren() {
this.showChildren = !this.showChildren;
this.showChildren = !this.showChildren
},
removeCollection() {
if (!confirm("Are you sure you want to remove this Collection?")) return;
if (!confirm("Are you sure you want to remove this Collection?")) return
this.$store.commit("postwoman/removeCollection", {
collectionIndex: this.collectionIndex
});
collectionIndex: this.collectionIndex,
})
},
editFolder(collectionIndex, folder, folderIndex) {
this.$emit("edit-folder", { collectionIndex, folder, folderIndex });
}
}
};
this.$emit("edit-folder", { collectionIndex, folder, folderIndex })
},
},
}
</script>

View File

@@ -47,35 +47,35 @@ export default {
props: {
show: Boolean,
editingCollection: Object,
editingCollectionIndex: Number
editingCollectionIndex: Number,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
name: undefined
};
name: undefined,
}
},
methods: {
saveCollection() {
if (!this.$data.name) {
this.$toast.info("Please provide a valid name for the collection");
return;
this.$toast.info(this.$t("invalid_collection_name"))
return
}
const collectionUpdated = {
...this.$props.editingCollection,
name: this.$data.name
};
name: this.$data.name,
}
this.$store.commit("postwoman/editCollection", {
collection: collectionUpdated,
collectionIndex: this.$props.editingCollectionIndex
});
this.$emit("hide-modal");
collectionIndex: this.$props.editingCollectionIndex,
})
this.$emit("hide-modal")
},
hideModal() {
this.$emit("hide-modal");
}
}
};
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -17,12 +17,7 @@
<div slot="body">
<ul>
<li>
<input
type="text"
v-model="name"
:placeholder="folder.name"
@keyup.enter="editFolder"
/>
<input type="text" v-model="name" :placeholder="folder.name" @keyup.enter="editFolder" />
</li>
</ul>
</div>
@@ -49,28 +44,28 @@ export default {
collection: Object,
collectionIndex: Number,
folder: Object,
folderIndex: Number
folderIndex: Number,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
name: undefined
};
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();
folderIndex: this.$props.folderIndex,
})
this.hideModal()
},
hideModal() {
this.$emit("hide-modal");
}
}
};
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -27,22 +27,12 @@
/>
<label for="selectCollection">{{ $t("collection") }}</label>
<span class="select-wrapper">
<select
type="text"
id="selectCollection"
v-model="requestUpdateData.collectionIndex"
>
<select type="text" id="selectCollection" v-model="requestUpdateData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>{{
$t("current_collection")
}}</option>
<option
:key="undefined"
:value="undefined"
hidden
disabled
selected
>{{ $t("current_collection") }}</option
>
<option
v-for="(collection, index) in $store.state.postwoman
.collections"
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>
@@ -52,17 +42,9 @@
</span>
<label for="selectFolder">{{ $t("folder") }}</label>
<span class="select-wrapper">
<select
type="text"
id="selectFolder"
v-model="requestUpdateData.folderIndex"
>
<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"
>
<option v-for="(folder, index) in folders" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
@@ -93,42 +75,39 @@ export default {
collectionIndex: Number,
folderIndex: Number,
request: Object,
requestIndex: Number
requestIndex: Number,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
requestUpdateData: {
name: undefined,
collectionIndex: undefined,
folderIndex: 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;
}
this.$data.requestUpdateData.folderIndex = undefined
},
},
computed: {
folders() {
const userSelectedAnyCollection =
this.$data.requestUpdateData.collectionIndex !== undefined;
if (!userSelectedAnyCollection) return [];
const userSelectedAnyCollection = this.$data.requestUpdateData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
return this.$store.state.postwoman.collections[
this.$data.requestUpdateData.collectionIndex
].folders;
}
return this.$store.state.postwoman.collections[this.$data.requestUpdateData.collectionIndex]
.folders
},
},
methods: {
saveRequest() {
const userSelectedAnyCollection =
this.$data.requestUpdateData.collectionIndex !== undefined;
const userSelectedAnyCollection = this.$data.requestUpdateData.collectionIndex !== undefined
const requestUpdated = {
...this.$props.request,
@@ -136,8 +115,8 @@ export default {
collection: userSelectedAnyCollection
? this.$data.requestUpdateData.collectionIndex
: this.$props.collectionIndex,
folder: this.$data.requestUpdateData.folderIndex
};
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
@@ -147,14 +126,14 @@ export default {
requestOldIndex: this.$props.requestIndex,
requestNew: requestUpdated,
requestNewCollectionIndex: requestUpdated.collection,
requestNewFolderIndex: requestUpdated.folder
});
requestNewFolderIndex: requestUpdated.folder,
})
this.hideModal();
this.hideModal()
},
hideModal() {
this.$emit("hide-modal");
}
}
};
this.$emit("hide-modal")
},
},
}
</script>

View File

@@ -43,7 +43,7 @@
request,
collectionIndex,
folderIndex,
requestIndex: index
requestIndex: index,
})
"
/>
@@ -74,33 +74,33 @@ export default {
props: {
folder: Object,
collectionIndex: Number,
folderIndex: Number
folderIndex: Number,
},
components: {
request: () => import("./request")
request: () => import("./request"),
},
data() {
return {
showChildren: false
};
showChildren: false,
}
},
methods: {
toggleShowChildren() {
this.showChildren = !this.showChildren;
this.showChildren = !this.showChildren
},
selectRequest(request) {
this.$store.commit("postwoman/selectRequest", { request });
this.$store.commit("postwoman/selectRequest", { request })
},
removeFolder() {
if (!confirm("Are you sure you want to remove this folder?")) return;
if (!confirm("Are you sure you want to remove this folder?")) return
this.$store.commit("postwoman/removeFolder", {
collectionIndex: this.collectionIndex,
folderIndex: this.folderIndex
});
folderIndex: this.folderIndex,
})
},
editFolder() {
this.$emit("edit-folder");
}
}
};
this.$emit("edit-folder")
},
},
}
</script>

View File

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

View File

@@ -4,7 +4,7 @@ TODO:
-->
<template>
<div class="collections-wrapper">
<pw-section class="yellow" :label="$t('collections')" ref="collections">
<addCollection :show="showModalAdd" @hide-modal="displayModalAdd(false)" />
<editCollection
:show="showModalEdit"
@@ -92,12 +92,12 @@ TODO:
<span>{{ $t("generate_docs") }}</span>
</button>
</nuxt-link>
</div>
</pw-section>
</template>
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 276px);
max-height: calc(100vh - 286px);
}
ul {
@@ -107,19 +107,20 @@ ul {
</style>
<script>
import collection from "./collection";
import { fb } from "../../functions/fb";
import collection from "./collection"
import { fb } from "../../functions/fb"
export default {
components: {
collection,
"pw-section": () => import("../layout/section"),
addCollection: () => import("./addCollection"),
addFolder: () => import("./addFolder"),
editCollection: () => import("./editCollection"),
editFolder: () => import("./editFolder"),
editRequest: () => import("./editRequest"),
importExportCollections: () => import("./importExportCollections"),
VirtualList: () => import("vue-virtual-scroll-list")
VirtualList: () => import("vue-virtual-scroll-list"),
},
data() {
return {
@@ -134,88 +135,98 @@ export default {
editingFolder: undefined,
editingFolderIndex: undefined,
editingRequest: undefined,
editingRequestIndex: undefined
};
editingRequestIndex: undefined,
}
},
computed: {
collections() {
return this.$store.state.postwoman.collections;
return this.$store.state.postwoman.collections
},
},
async mounted() {
this._keyListener = function(e) {
if (e.key === "Escape") {
e.preventDefault()
this.showModalAdd = this.showModalEdit = this.showModalImportExport = this.showModalAddFolder = this.showModalEditFolder = this.showModalEditRequest = false
}
}
document.addEventListener("keydown", this._keyListener.bind(this))
},
methods: {
displayModalAdd(shouldDisplay) {
this.showModalAdd = shouldDisplay;
this.showModalAdd = shouldDisplay
},
displayModalEdit(shouldDisplay) {
this.showModalEdit = shouldDisplay;
this.showModalEdit = shouldDisplay
if (!shouldDisplay) this.resetSelectedData();
if (!shouldDisplay) this.resetSelectedData()
},
displayModalImportExport(shouldDisplay) {
this.showModalImportExport = shouldDisplay;
this.showModalImportExport = shouldDisplay
},
displayModalAddFolder(shouldDisplay) {
this.showModalAddFolder = shouldDisplay;
this.showModalAddFolder = shouldDisplay
if (!shouldDisplay) this.resetSelectedData();
if (!shouldDisplay) this.resetSelectedData()
},
displayModalEditFolder(shouldDisplay) {
this.showModalEditFolder = shouldDisplay;
this.showModalEditFolder = shouldDisplay
if (!shouldDisplay) this.resetSelectedData();
if (!shouldDisplay) this.resetSelectedData()
},
displayModalEditRequest(shouldDisplay) {
this.showModalEditRequest = shouldDisplay;
this.showModalEditRequest = shouldDisplay
if (!shouldDisplay) this.resetSelectedData();
if (!shouldDisplay) this.resetSelectedData()
},
editCollection(collection, collectionIndex) {
this.$data.editingCollection = collection;
this.$data.editingCollectionIndex = collectionIndex;
this.displayModalEdit(true);
this.syncCollections();
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.displayModalEdit(true)
this.syncCollections()
},
addFolder(collection, collectionIndex) {
this.$data.editingCollection = collection;
this.$data.editingCollectionIndex = collectionIndex;
this.displayModalAddFolder(true);
this.syncCollections();
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.displayModalAddFolder(true)
this.syncCollections()
},
editFolder(payload) {
const { collectionIndex, folder, folderIndex } = payload;
this.$data.editingCollection = collection;
this.$data.editingCollectionIndex = collectionIndex;
this.$data.editingFolder = folder;
this.$data.editingFolderIndex = folderIndex;
this.displayModalEditFolder(true);
this.syncCollections();
const { collectionIndex, folder, folderIndex } = payload
this.$data.editingCollection = collection
this.$data.editingCollectionIndex = collectionIndex
this.$data.editingFolder = folder
this.$data.editingFolderIndex = folderIndex
this.displayModalEditFolder(true)
this.syncCollections()
},
editRequest(payload) {
const { request, collectionIndex, folderIndex, requestIndex } = payload;
this.$data.editingCollectionIndex = collectionIndex;
this.$data.editingFolderIndex = folderIndex;
this.$data.editingRequest = request;
this.$data.editingRequestIndex = requestIndex;
this.displayModalEditRequest(true);
this.syncCollections();
const { request, collectionIndex, folderIndex, requestIndex } = payload
this.$data.editingCollectionIndex = collectionIndex
this.$data.editingFolderIndex = folderIndex
this.$data.editingRequest = request
this.$data.editingRequestIndex = requestIndex
this.displayModalEditRequest(true)
this.syncCollections()
},
resetSelectedData() {
this.$data.editingCollection = undefined;
this.$data.editingCollectionIndex = undefined;
this.$data.editingFolder = undefined;
this.$data.editingFolderIndex = undefined;
this.$data.editingRequest = undefined;
this.$data.editingRequestIndex = undefined;
this.$data.editingCollection = undefined
this.$data.editingCollectionIndex = undefined
this.$data.editingFolder = undefined
this.$data.editingFolderIndex = undefined
this.$data.editingRequest = undefined
this.$data.editingRequestIndex = undefined
},
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(
JSON.parse(JSON.stringify(this.$store.state.postwoman.collections))
);
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
}
}
};
},
},
beforeDestroy() {
document.removeEventListener("keydown", this._keyListener)
},
}
</script>

View File

@@ -1,11 +1,7 @@
<template>
<div class="flex-wrap">
<div>
<button
class="icon"
@click="selectRequest()"
v-tooltip="$t('use_request')"
>
<button class="icon" @click="selectRequest()" v-tooltip="$t('use_request')">
<i class="material-icons">insert_drive_file</i>
<span>{{ request.name }}</span>
</button>
@@ -51,20 +47,20 @@ export default {
request: Object,
collectionIndex: Number,
folderIndex: Number,
requestIndex: Number
requestIndex: Number,
},
methods: {
selectRequest() {
this.$store.commit("postwoman/selectRequest", { request: this.request });
this.$store.commit("postwoman/selectRequest", { request: this.request })
},
removeRequest() {
if (!confirm("Are you sure you want to remove this request?")) return;
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
});
}
}
};
requestIndex: this.requestIndex,
})
},
},
}
</script>

View File

@@ -27,22 +27,12 @@
/>
<label for="selectCollection">{{ $t("collection") }}</label>
<span class="select-wrapper">
<select
type="text"
id="selectCollection"
v-model="requestData.collectionIndex"
>
<select type="text" id="selectCollection" v-model="requestData.collectionIndex">
<option :key="undefined" :value="undefined" hidden disabled selected>{{
$t("select_collection")
}}</option>
<option
:key="undefined"
:value="undefined"
hidden
disabled
selected
>{{ $t("select_collection") }}</option
>
<option
v-for="(collection, index) in $store.state.postwoman
.collections"
v-for="(collection, index) in $store.state.postwoman.collections"
:key="index"
:value="index"
>
@@ -52,34 +42,18 @@
</span>
<label for="selectFolder">{{ $t("folder") }}</label>
<span class="select-wrapper">
<select
type="text"
id="selectFolder"
v-model="requestData.folderIndex"
>
<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"
>
<option v-for="(folder, index) in folders" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
</span>
<label for="selectRequest">{{ $t("request") }}</label>
<span class="select-wrapper">
<select
type="text"
id="selectRequest"
v-model="requestData.requestIndex"
>
<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"
>
<option v-for="(folder, index) in requests" :key="index" :value="index">
{{ folder.name }}
</option>
</select>
@@ -104,13 +78,15 @@
</template>
<script>
import { fb } from "../../functions/fb"
export default {
props: {
show: Boolean,
editingRequest: Object
editingRequest: Object,
},
components: {
modal: () => import("../../components/modal")
modal: () => import("../../components/ui/modal"),
},
data() {
return {
@@ -119,96 +95,96 @@ export default {
name: undefined,
collectionIndex: undefined,
folderIndex: undefined,
requestIndex: 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;
this.$data.requestData.folderIndex = undefined
this.$data.requestData.requestIndex = undefined
},
"requestData.folderIndex": function resetRequestIndex() {
this.$data.requestData.requestIndex = undefined;
}
this.$data.requestData.requestIndex = undefined
},
},
computed: {
folders() {
const userSelectedAnyCollection =
this.$data.requestData.collectionIndex !== undefined;
if (!userSelectedAnyCollection) return [];
const userSelectedAnyCollection = this.$data.requestData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
const noCollectionAvailable =
this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
] !== undefined;
if (!noCollectionAvailable) return [];
this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex] !==
undefined
if (!noCollectionAvailable) return []
return this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
].folders;
return this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex].folders
},
requests() {
const userSelectedAnyCollection =
this.$data.requestData.collectionIndex !== undefined;
if (!userSelectedAnyCollection) return [];
const userSelectedAnyCollection = this.$data.requestData.collectionIndex !== undefined
if (!userSelectedAnyCollection) return []
const userSelectedAnyFolder =
this.$data.requestData.folderIndex !== undefined;
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;
]
const folder = collection.folders[this.$data.requestData.folderIndex]
const requests = folder.requests
return requests
} else {
const collection = this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
];
]
const noCollectionAvailable =
this.$store.state.postwoman.collections[
this.$data.requestData.collectionIndex
] !== undefined;
if (!noCollectionAvailable) return [];
this.$store.state.postwoman.collections[this.$data.requestData.collectionIndex] !==
undefined
if (!noCollectionAvailable) return []
const requests = collection.requests;
return requests;
const requests = collection.requests
return requests
}
}
},
},
methods: {
syncCollections() {
if (fb.currentUser !== null) {
if (fb.currentSettings[0].value) {
fb.writeCollections(JSON.parse(JSON.stringify(this.$store.state.postwoman.collections)))
}
}
},
saveRequestAs() {
const userDidntSpecifyCollection =
this.$data.requestData.collectionIndex === undefined;
const userDidntSpecifyCollection = this.$data.requestData.collectionIndex === undefined
if (userDidntSpecifyCollection) {
this.$toast.error(this.$t("select_collection"), {
icon: "error"
});
return;
icon: "error",
})
return
}
const requestUpdated = {
...this.$props.editingRequest,
name: this.$data.requestData.name || this.$data.defaultRequestName,
collection: this.$data.requestData.collectionIndex
};
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
});
requestIndex: this.$data.requestData.requestIndex,
})
this.hideModal();
this.hideModal()
this.syncCollections()
},
hideModal() {
this.$emit("hide-modal");
this.$emit("hide-model"); // for backward compatibility // TODO: use fixed event
}
}
};
this.$emit("hide-modal")
this.$emit("hide-model") // for backward compatibility // TODO: use fixed event
},
},
}
</script>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,28 +3,25 @@
v-if="fb.currentFeeds.length !== 0"
class="virtual-list"
:class="{ filled: fb.currentFeeds.length }"
:size="56"
:remain="Math.min(8, fb.currentFeeds.length)"
:size="180"
:remain="Math.min(6, fb.currentFeeds.length)"
>
<ul v-for="feed in fb.currentFeeds" :key="feed.id">
<ul v-for="feed in fb.currentFeeds" :key="feed.id" class="entry">
<div class="show-on-large-screen">
<li>
<input
:aria-label="$t('label')"
type="text"
readonly
:value="feed.label"
:placeholder="$t('no_label')"
class="bg-color"
/>
<li class="info">
<label>
{{ feed.label || $t("no_label") }}
</label>
</li>
<button class="icon" @click="saveFeed(feed)">
<i class="material-icons">get_app</i>
</button>
<button class="icon" @click="deleteFeed(feed)">
<i class="material-icons">delete</i>
</button>
</div>
<div class="show-on-large-screen">
<li class="info clamb-3">
<label>{{ feed.message || $t("empty") }}</label>
</li>
</div>
</ul>
</virtual-list>
<ul v-else>
@@ -36,46 +33,46 @@
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 288px);
max-height: calc(100vh - 294px);
}
ul,
ol {
flex-direction: column;
}
.entry {
border-bottom: 1px dashed var(--brd-color);
padding: 0 0 8px;
}
.clamb-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
</style>
<script>
import { fb } from "../../functions/fb";
import { fb } from "../../functions/fb"
export default {
components: {
VirtualList: () => import("vue-virtual-scroll-list")
VirtualList: () => import("vue-virtual-scroll-list"),
},
data() {
return {
fb
};
fb,
}
},
methods: {
deleteFeed(feed) {
fb.deleteFeed(feed.id);
fb.deleteFeed(feed.id)
this.$toast.error(this.$t("deleted"), {
icon: "delete"
});
icon: "delete",
})
},
saveFeed(feed) {
const dataToWrite = JSON.stringify(feed.message, null, 2);
const file = new Blob([dataToWrite], { type: "application/json" });
const a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = (feed.label + " on " + Date()).replace(/\./g, "[dot]");
document.body.appendChild(a);
a.click();
this.$toast.success(this.$t("download_started"), {
icon: "done"
});
setTimeout(() => {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 1000);
}
}
};
},
}
</script>

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,10 +6,7 @@
(
<span v-for="(field, index) in fieldArgs" :key="index">
{{ field.name }}:
<typelink
:gqlType="field.type"
:jumpTypeCallback="jumpTypeCallback"
/>
<typelink :gqlType="field.type" :jumpTypeCallback="jumpTypeCallback" />
<span v-if="index !== fieldArgs.length - 1">
,
</span>
@@ -28,7 +25,7 @@
</div>
</template>
<style>
<style scoped lang="scss">
.field-box {
padding: 16px;
margin: 4px;
@@ -53,16 +50,16 @@
</style>
<script>
import typelink from "./typelink";
import typelink from "./typelink"
export default {
components: {
typelink: typelink
typelink: typelink,
},
props: {
gqlField: Object,
jumpTypeCallback: Function
jumpTypeCallback: Function,
},
computed: {
@@ -73,21 +70,19 @@ export default {
`${arg.name}: ${arg.type.toString()}${
index !== this.gqlField.args.length - 1 ? ", " : ""
}`
);
}, "");
const argsString = args.length > 0 ? `(${args})` : "";
return `${
this.gqlField.name
}${argsString}: ${this.gqlField.type.toString()}`;
)
}, "")
const argsString = args.length > 0 ? `(${args})` : ""
return `${this.gqlField.name}${argsString}: ${this.gqlField.type.toString()}`
},
fieldName() {
return this.gqlField.name;
return this.gqlField.name
},
fieldArgs() {
return this.gqlField.args || [];
}
}
};
return this.gqlField.args || []
},
},
}
</script>

View File

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

View File

@@ -14,7 +14,7 @@
</div>
</template>
<style>
<style scoped lang="scss">
.type-box {
padding: 16px;
margin: 4px 0;
@@ -33,12 +33,12 @@
<script>
export default {
components: {
"gql-field": () => import("./field")
"gql-field": () => import("./field"),
},
props: {
gqlType: {},
jumpTypeCallback: Function
}
};
jumpTypeCallback: Function,
},
}
</script>

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,416 @@
<template>
<header class="header">
<div class="flex-wrap">
<span class="slide-in">
<nuxt-link :to="localePath('index')">
<h1 class="logo">Postwoman</h1>
</nuxt-link>
</span>
<span>
<a
href="https://github.com/liyasthomas/postwoman"
target="_blank"
aria-label="GitHub"
rel="noopener"
>
<button class="icon" aria-label="GitHub" v-tooltip="'GitHub'">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
class="material-icons"
>
<path
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"
/>
</svg>
</button>
</a>
<button
class="icon"
id="installPWA"
@click.prevent="showInstallPrompt()"
v-tooltip="$t('install_pwa')"
>
<i class="material-icons">offline_bolt</i>
</button>
<v-popover v-if="fb.currentUser === null">
<button class="icon" v-tooltip="$t('login_with')">
<i class="material-icons">vpn_key</i>
</button>
<template slot="popover">
<login />
</template>
</v-popover>
<v-popover v-else>
<button
class="icon"
v-tooltip="
(fb.currentUser.displayName || '<label><i>Name not found</i></label>') +
'<br>' +
(fb.currentUser.email || '<label><i>Email not found</i></label>')
"
aria-label="Account"
>
<img
v-if="fb.currentUser.photoURL"
:src="fb.currentUser.photoURL"
class="material-icons"
alt="Profile image"
/>
<i v-else class="material-icons">account_circle</i>
</button>
<template slot="popover">
<div>
<nuxt-link :to="localePath('settings')" v-close-popover>
<button class="icon">
<i class="material-icons">settings</i>
<span>
{{ $t("settings") }}
</span>
</button>
</nuxt-link>
</div>
<div>
<logout />
</div>
</template>
</v-popover>
<v-popover>
<button class="icon" v-tooltip="$t('more')">
<i class="material-icons">more_vert</i>
</button>
<template slot="popover">
<div>
<button class="icon" @click="showExtensions = true" v-close-popover>
<i class="material-icons">extension</i>
<span>{{ $t("extensions") }}</span>
</button>
</div>
<div>
<button class="icon" @click="showShortcuts = true" v-close-popover>
<i class="material-icons">keyboard</i>
<span>{{ $t("shortcuts") }}</span>
</button>
</div>
<div>
<button class="icon" @click="showSupport = true" v-close-popover>
<i class="material-icons">favorite</i>
<span>{{ $t("support_us") }}</span>
</button>
</div>
<div>
<button
class="icon"
onClick="window.open('https://twitter.com/share?text=👽 Postwoman • A free, fast and beautiful API request builder - Web alternative to Postman - Helps you create requests faster, saving precious time on development.&url=https://postwoman.io&hashtags=postwoman&via=liyasthomas');"
v-close-popover
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" 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>{{ $t("tweet") }}</span>
</button>
<button
v-if="navigatorShare"
class="icon"
@click="nativeShare"
v-close-popover
v-tooltip="$t('more')"
>
<i class="material-icons">share</i>
</button>
</div>
</template>
</v-popover>
</span>
</div>
<modal v-if="showExtensions" @close="showExtensions = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("extensions") }}</h3>
<div>
<button class="icon" @click="showExtensions = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<p class="info">
{{ $t("extensions_info1") }}
</p>
<div>
<a
href="https://addons.mozilla.org/en-US/firefox/addon/postwoman"
target="_blank"
rel="noopener"
>
<button class="icon">
<svg
class="material-icons"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
>
<path
d="M12 0c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm8.003 8.657c-1.276-3.321-4.46-4.605-5.534-4.537 3.529 1.376 4.373 6.059 4.06 7.441-.307-1.621-1.286-3.017-1.872-3.385 3.417 8.005-4.835 10.465-7.353 7.687.649.168 1.931.085 2.891-.557.898-.602.983-.638 1.56-.683.686-.053-.041-1.406-1.539-1.177-.616.094-1.632.819-2.88.341-1.508-.576-1.46-2.634.096-2.015.337-.437.088-1.263.088-1.263.452-.414 1.022-.706 1.37-.911.228-.135.829-.507.795-1.23-.123-.096-.32-.219-.766-.193-1.736.11-1.852-.518-1.967-.808.078-.668.524-1.534 1.361-1.931-1.257-.193-2.28.397-2.789 1.154-.809-.174-1.305-.183-2.118-.031-.316-.24-.666-.67-.878-1.181 1.832-2.066 4.499-3.378 7.472-3.378 5.912 0 8.263 4.283 8.003 6.657z"
/>
</svg>
<span>Firefox</span>
<span class="icon" v-if="hasFirefoxExtInstalled" v-tooltip="$t('installed')">
<i class="material-icons">done</i>
</span>
</button>
</a>
</div>
<div>
<a
href="https://chrome.google.com/webstore/detail/postwoman-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld"
target="_blank"
rel="noopener"
>
<button class="icon">
<svg
class="material-icons"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
>
<path
d="M2.897 4.181c2.43-2.828 5.763-4.181 9.072-4.181 4.288 0 8.535 2.273 10.717 6.554-2.722.001-6.984 0-9.293 0-1.674.001-2.755-.037-3.926.579-1.376.724-2.415 2.067-2.777 3.644l-3.793-6.596zm5.11 7.819c0 2.2 1.789 3.99 3.988 3.99s3.988-1.79 3.988-3.99-1.789-3.991-3.988-3.991-3.988 1.791-3.988 3.991zm5.536 5.223c-2.238.666-4.858-.073-6.293-2.549-1.095-1.891-3.989-6.933-5.305-9.225-1.33 2.04-1.945 4.294-1.945 6.507 0 5.448 3.726 10.65 9.673 11.818l3.87-6.551zm2.158-9.214c1.864 1.734 2.271 4.542 1.007 6.719-.951 1.641-3.988 6.766-5.46 9.248 7.189.443 12.752-5.36 12.752-11.972 0-1.313-.22-2.66-.69-3.995h-7.609z"
/>
</svg>
<span>Chrome</span>
<span class="icon" v-if="hasChromeExtInstalled" v-tooltip="$t('installed')">
<i class="material-icons">done</i>
</span>
</button>
</a>
</div>
</div>
<div slot="footer"></div>
</modal>
<modal v-if="showShortcuts" @close="showShortcuts = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("shortcuts") }}</h3>
<div>
<button class="icon" @click="showShortcuts = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<div>
<label>{{ $t("send_request") }}</label>
<kbd>{{ getSpecialKey() }} G</kbd>
</div>
<div>
<label>{{ $t("save_to_collections") }}</label>
<kbd>{{ getSpecialKey() }} S</kbd>
</div>
<div>
<label>{{ $t("copy_request_link") }}</label>
<kbd>{{ getSpecialKey() }} K</kbd>
</div>
<div>
<label>{{ $t("reset_request") }}</label>
<kbd>{{ getSpecialKey() }} L</kbd>
</div>
</div>
<div slot="footer"></div>
</modal>
<modal v-if="showSupport" @close="showSupport = false">
<div slot="header">
<ul>
<li>
<div class="flex-wrap">
<h3 class="title">{{ $t("support_us") }}</h3>
<div>
<button class="icon" @click="showSupport = false">
<i class="material-icons">close</i>
</button>
</div>
</div>
</li>
</ul>
</div>
<div slot="body">
<contributors />
</div>
<div slot="footer"></div>
</modal>
</header>
</template>
<style scoped lang="scss">
@keyframes slideIn {
0% {
opacity: 0;
left: -16px;
}
100% {
opacity: 1;
left: 0px;
}
}
.slide-in {
position: relative;
animation: slideIn 0.2s forwards ease-in-out;
}
.logo {
font-size: 22px;
&:hover {
color: var(--ac-color);
}
}
</style>
<script>
import intializePwa from "../../assets/js/pwa"
import {
hasExtensionInstalled,
hasChromeExtensionInstalled,
hasFirefoxExtensionInstalled,
} from "../../functions/strategies/ExtensionStrategy"
import { getPlatformSpecialKey } from "../../functions/platformutils"
import firebase from "firebase/app"
import { fb } from "../../functions/fb"
export default {
components: {
modal: () => import("../ui/modal"),
login: () => import("../firebase/login"),
logout: () => import("../firebase/logout"),
contributors: () => import("./contributors"),
},
data() {
return {
// Once the PWA code is initialized, this holds a method
// that can be called to show the user the installation
// prompt.
showInstallPrompt: null,
showExtensions: false,
hasChromeExtInstalled: hasChromeExtensionInstalled(),
hasFirefoxExtInstalled: hasFirefoxExtensionInstalled(),
showShortcuts: false,
showSupport: false,
fb,
navigatorShare: navigator.share,
}
},
mounted() {
// Initializes the PWA code - checks if the app is installed,
// etc.
;(async () => {
this.showInstallPrompt = await intializePwa()
let cookiesAllowed = localStorage.getItem("cookiesAllowed") === "yes"
if (!cookiesAllowed) {
this.$toast.show(this.$t("we_use_cookies"), {
icon: "info",
duration: 5000,
theme: "toasted-primary",
action: [
{
text: this.$t("dismiss"),
onClick: (e, toastObject) => {
localStorage.setItem("cookiesAllowed", "yes")
toastObject.goAway(0)
},
},
],
})
}
let showExtensionsToast = localStorage.getItem("showExtensionsToast") === "yes"
// Just return if showExtensionsToast is "no"
if (!showExtensionsToast) return
setTimeout(() => {
if (!hasExtensionInstalled()) {
this.$toast.show(this.$t("extensions_info2"), {
icon: "extension",
duration: 5000,
theme: "toasted-primary",
action: [
{
text: this.$t("yes"),
onClick: (e, toastObject) => {
this.showExtensions = true
localStorage.setItem("showExtensionsToast", "yes")
toastObject.goAway(0)
},
},
{
text: this.$t("no"),
onClick: (e, toastObject) => {
this.$store.commit("setMiscState", {
value: false,
attribute: "showExtensionsToast",
})
localStorage.setItem("showExtensionsToast", "no")
toastObject.goAway(0)
},
},
],
})
}
}, 15000)
this._keyListener = function (e) {
if (e.key === "Escape") {
e.preventDefault()
this.showExtensions = this.showShortcuts = this.showSupport = false
}
}
document.addEventListener("keydown", this._keyListener.bind(this))
})()
},
methods: {
getSpecialKey: getPlatformSpecialKey,
nativeShare() {
if (navigator.share) {
navigator
.share({
title: "Postwoman",
text:
"Postwoman • A free, fast and beautiful API request builder - Web alternative to Postman - Helps you create requests faster, saving precious time on development.",
url: "https://postwoman.io/",
})
.then(() => {})
.catch(console.error)
} else {
// fallback
}
},
},
computed: {
availableLocales() {
return this.$i18n.locales.filter((i) => i.code !== this.$i18n.locale)
},
},
}
</script>

View File

@@ -1,15 +1,11 @@
<template>
<pw-section class="green" icon="history" :label="$t('history')" ref="history">
<ul>
<li id="filter-history">
<input
aria-label="Search"
type="text"
:placeholder="$t('search_history')"
v-model="filterText"
/>
</li>
</ul>
<div class="show-on-large-screen">
<input aria-label="Search" type="search" :placeholder="$t('search')" v-model="filterText" />
<button class="icon">
<i class="material-icons">search</i>
</button>
</div>
<virtual-list
class="virtual-list"
:class="{ filled: filteredHistory.length }"
@@ -23,7 +19,7 @@
:class="{ stared: entry.star }"
@click="toggleStar(entry)"
v-tooltip="{
content: !entry.star ? $t('add_star') : $t('remove_star')
content: !entry.star ? $t('add_star') : $t('remove_star'),
}"
>
<i class="material-icons">
@@ -157,9 +153,7 @@
</transition>
</ul>
</virtual-list>
<ul
:class="{ hidden: filteredHistory.length != 0 || history.length === 0 }"
>
<ul :class="{ hidden: filteredHistory.length != 0 || history.length === 0 }">
<li>
<label>{{ $t("nothing_found") }} "{{ filterText }}"</label>
</li>
@@ -196,11 +190,7 @@
</button>
</div>
<div>
<button
class="icon"
@click="sort_by_status_code()"
v-close-popover
>
<button class="icon" @click="sort_by_status_code()" v-close-popover>
<i class="material-icons">assistant</i>
<span>{{ $t("status") }}</span>
</button>
@@ -263,7 +253,7 @@
<style scoped lang="scss">
.virtual-list {
max-height: calc(100vh - 284px);
max-height: calc(100vh - 294px);
[readonly] {
cursor: default;
@@ -289,11 +279,6 @@ ol {
flex-direction: column;
}
ul li,
ol li {
display: flex;
}
.method-list-item {
position: relative;
@@ -326,16 +311,16 @@ ol li {
</style>
<script>
import { findStatusGroup } from "../pages/index";
import { fb } from "../functions/fb";
import { findStatusGroup } from "../../pages/index"
import { fb } from "../../functions/fb"
const updateOnLocalStorage = (propertyName, property) =>
window.localStorage.setItem(propertyName, JSON.stringify(property));
window.localStorage.setItem(propertyName, JSON.stringify(property))
export default {
components: {
"pw-section": () => import("./section"),
VirtualList: () => import("vue-virtual-scroll-list")
"pw-section": () => import("../layout/section"),
VirtualList: () => import("vue-virtual-scroll-list"),
},
data() {
return {
@@ -351,166 +336,144 @@ export default {
reverse_sort_status_code: false,
reverse_sort_url: false,
reverse_sort_path: false,
showMore: false
};
showMore: false,
}
},
computed: {
filteredHistory() {
this.history =
fb.currentUser !== null
? fb.currentHistory
: JSON.parse(window.localStorage.getItem("history")) || [];
return this.history.filter(entry => {
const filterText = this.filterText.toLowerCase();
return Object.keys(entry).some(key => {
let value = entry[key];
value = typeof value !== "string" ? value.toString() : value;
return value.toLowerCase().includes(filterText);
});
});
}
: JSON.parse(window.localStorage.getItem("history")) || []
return this.history.filter((entry) => {
const filterText = this.filterText.toLowerCase()
return Object.keys(entry).some((key) => {
let value = entry[key]
value = typeof value !== "string" ? value.toString() : value
return value.toLowerCase().includes(filterText)
})
})
},
},
methods: {
clearHistory() {
if (fb.currentUser !== null) {
fb.clearHistory();
fb.clearHistory()
}
this.history = [];
this.filterText = "";
this.disableHistoryClearing();
updateOnLocalStorage("history", this.history);
this.history = []
this.filterText = ""
this.disableHistoryClearing()
updateOnLocalStorage("history", this.history)
this.$toast.error(this.$t("history_deleted"), {
icon: "delete"
});
icon: "delete",
})
},
useHistory(entry) {
this.$emit("useHistory", entry);
this.$emit("useHistory", entry)
},
findEntryStatus(entry) {
const foundStatusGroup = findStatusGroup(entry.status);
const foundStatusGroup = findStatusGroup(entry.status)
return (
foundStatusGroup || {
className: ""
className: "",
}
);
)
},
deleteHistory(entry) {
if (fb.currentUser !== null) {
fb.deleteHistory(entry);
fb.deleteHistory(entry)
}
this.history.splice(this.history.indexOf(entry), 1);
this.history.splice(this.history.indexOf(entry), 1)
if (this.history.length === 0) {
this.filterText = "";
this.filterText = ""
}
updateOnLocalStorage("history", this.history);
updateOnLocalStorage("history", this.history)
this.$toast.error(this.$t("deleted"), {
icon: "delete"
});
icon: "delete",
})
},
addEntry(entry) {
this.history.push(entry);
updateOnLocalStorage("history", this.history);
this.history.push(entry)
updateOnLocalStorage("history", this.history)
},
enableHistoryClearing() {
if (!this.history || !this.history.length) return;
this.isClearingHistory = true;
if (!this.history || !this.history.length) return
this.isClearingHistory = true
},
disableHistoryClearing() {
this.isClearingHistory = false;
this.isClearingHistory = false
},
sort_by_time() {
let byDate = this.history.slice(0);
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;
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);
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;
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);
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;
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);
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;
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);
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;
if (this.reverse_sort_path) return a.path === b.path ? 0 : +(a.path < b.path) || -1
else return a.path === b.path ? 0 : +(a.path > b.path) || -1
})
this.history = byPath
this.reverse_sort_path = !this.reverse_sort_path
},
sort_by_duration() {
let byDuration = this.history.slice(0);
let byDuration = this.history.slice(0)
byDuration.sort((a, b) => {
if (this.reverse_sort_duration)
return a.duration === b.duration
? 0
: +(a.duration < b.duration) || -1;
else
return a.duration === b.duration
? 0
: +(a.duration > b.duration) || -1;
});
this.history = byDuration;
this.reverse_sort_duration = !this.reverse_sort_duration;
return a.duration === b.duration ? 0 : +(a.duration < b.duration) || -1
else return a.duration === b.duration ? 0 : +(a.duration > b.duration) || -1
})
this.history = byDuration
this.reverse_sort_duration = !this.reverse_sort_duration
},
toggleCollapse() {
this.showMore = !this.showMore;
this.showMore = !this.showMore
},
toggleStar(entry) {
if (fb.currentUser !== null) {
fb.toggleStar(entry, !entry.star);
fb.toggleStar(entry, !entry.star)
}
entry.star = !entry.star;
updateOnLocalStorage("history", this.history);
}
}
};
entry.star = !entry.star
updateOnLocalStorage("history", this.history)
},
},
}
</script>

View File

@@ -49,8 +49,8 @@
export default {
props: {
color: {
type: String
}
}
};
type: String,
},
},
}
</script>

View File

@@ -0,0 +1,55 @@
<template>
<fieldset :id="label.toLowerCase()" :class="{ 'no-colored-frames': !frameColorsEnabled }">
<legend @click.prevent="collapse">
<span>{{ label }}</span>
<i class="material-icons">
{{ isCollapsed(label) ? "expand_more" : "expand_less" }}
</i>
</legend>
<div class="collapsible" :class="{ hidden: isCollapsed(label.toLowerCase()) }">
<slot />
</div>
</fieldset>
</template>
<style scoped lang="scss">
fieldset.no-colored-frames legend {
color: var(--fg-color);
}
</style>
<script>
export default {
computed: {
frameColorsEnabled() {
return this.$store.state.postwoman.settings.FRAME_COLORS_ENABLED || false
},
sectionString() {
return `${this.$route.path.replace(/\/+$/, "")}/${this.label}`
},
},
props: {
label: {
type: String,
default: "Section",
},
collapsed: {
type: Boolean,
},
},
methods: {
collapse({ target }) {
const parent = target.parentNode.parentNode
parent.querySelector(".collapsible").classList.toggle("hidden")
// Save collapsed section into the collapsedSections array
this.$store.commit("setCollapsedSection", this.sectionString)
},
isCollapsed(label) {
return this.$store.state.theme.collapsedSections.includes(this.sectionString) || false
},
},
}
</script>

View File

@@ -0,0 +1,304 @@
<template>
<aside class="nav-first">
<nav class="primary-nav">
<!--
We're using manual checks for linkActive because the query string
seems to mess up the nuxt-link active class.
-->
<nuxt-link
:to="localePath('index')"
:class="linkActive('/')"
v-tooltip.right="$t('home')"
:aria-label="$t('home')"
>
<logo alt class="material-icons" style="height: 24px;"></logo>
</nuxt-link>
<nuxt-link
:to="localePath('realtime')"
:class="linkActive('/realtime')"
v-tooltip.right="$t('realtime')"
>
<i class="material-icons">settings_input_hdmi</i>
</nuxt-link>
<nuxt-link
:to="localePath('graphql')"
:class="linkActive('/graphql')"
v-tooltip.right="$t('graphql')"
:aria-label="$t('graphql')"
>
<svg
class="material-icons"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
x="0px"
y="0px"
viewBox="0 0 400 400"
>
<g>
<g>
<g>
<rect
x="122"
y="-0.4"
transform="matrix(-0.866 -0.5 0.5 -0.866 163.3196 363.3136)"
width="16.6"
height="320.3"
/>
</g>
</g>
<g>
<g>
<rect x="39.8" y="272.2" width="320.3" height="16.6" />
</g>
</g>
<g>
<g>
<rect
x="37.9"
y="312.2"
transform="matrix(-0.866 -0.5 0.5 -0.866 83.0693 663.3409)"
width="185"
height="16.6"
/>
</g>
</g>
<g>
<g>
<rect
x="177.1"
y="71.1"
transform="matrix(-0.866 -0.5 0.5 -0.866 463.3409 283.0693)"
width="185"
height="16.6"
/>
</g>
</g>
<g>
<g>
<rect
x="122.1"
y="-13"
transform="matrix(-0.5 -0.866 0.866 -0.5 126.7903 232.1221)"
width="16.6"
height="185"
/>
</g>
</g>
<g>
<g>
<rect
x="109.6"
y="151.6"
transform="matrix(-0.5 -0.866 0.866 -0.5 266.0828 473.3766)"
width="320.3"
height="16.6"
/>
</g>
</g>
<g>
<g><rect x="52.5" y="107.5" width="16.6" height="185" /></g>
</g>
<g>
<g>
<rect x="330.9" y="107.5" width="16.6" height="185" />
</g>
</g>
<g>
<g>
<rect
x="262.4"
y="240.1"
transform="matrix(-0.5 -0.866 0.866 -0.5 126.7953 714.2875)"
width="14.5"
height="160.9"
/>
</g>
</g>
<path
d="M369.5,297.9c-9.6,16.7-31,22.4-47.7,12.8c-16.7-9.6-22.4-31-12.8-47.7c9.6-16.7,31-22.4,47.7-12.8C373.5,259.9,379.2,281.2,369.5,297.9"
/>
<path
d="M90.9,137c-9.6,16.7-31,22.4-47.7,12.8c-16.7-9.6-22.4-31-12.8-47.7c9.6-16.7,31-22.4,47.7-12.8C94.8,99,100.5,120.3,90.9,137"
/>
<path
d="M30.5,297.9c-9.6-16.7-3.9-38,12.8-47.7c16.7-9.6,38-3.9,47.7,12.8c9.6,16.7,3.9,38-12.8,47.7C61.4,320.3,40.1,314.6,30.5,297.9"
/>
<path
d="M309.1,137c-9.6-16.7-3.9-38,12.8-47.7c16.7-9.6,38-3.9,47.7,12.8c9.6,16.7,3.9,38-12.8,47.7C340.1,159.4,318.7,153.7,309.1,137"
/>
<path
d="M200,395.8c-19.3,0-34.9-15.6-34.9-34.9c0-19.3,15.6-34.9,34.9-34.9c19.3,0,34.9,15.6,34.9,34.9C234.9,380.1,219.3,395.8,200,395.8"
/>
<path
d="M200,74c-19.3,0-34.9-15.6-34.9-34.9c0-19.3,15.6-34.9,34.9-34.9c19.3,0,34.9,15.6,34.9,34.9C234.9,58.4,219.3,74,200,74"
/>
</g>
</svg>
</nuxt-link>
<nuxt-link
:to="localePath('doc')"
:class="linkActive('/doc')"
v-tooltip.right="$t('documentation')"
:aria-label="$t('documentation')"
>
<i class="material-icons">books</i>
</nuxt-link>
<nuxt-link
:to="localePath('settings')"
:class="linkActive('/settings')"
v-tooltip.right="$t('settings')"
:aria-label="$t('settings')"
>
<i class="material-icons">settings</i>
</nuxt-link>
</nav>
<div v-if="$route.path === '/'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="$t('request')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#options" v-tooltip.right="$t('options')">
<i class="material-icons">toc</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('response')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path === '/realtime'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#request" v-tooltip.right="$t('request')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('communication')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path === '/graphql'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#endpoint" v-tooltip.right="$t('endpoint')">
<i class="material-icons">cloud</i>
</a>
</li>
<li>
<a href="#schema" v-tooltip.right="$t('schema')">
<i class="material-icons">assignment_returned</i>
</a>
</li>
<li>
<a href="#query" v-tooltip.right="$t('query')">
<i class="material-icons">cloud_upload</i>
</a>
</li>
<li>
<a href="#response" v-tooltip.right="$t('response')">
<i class="material-icons">cloud_download</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path === '/doc'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#collections" v-tooltip.right="$t('collections')">
<i class="material-icons">folder</i>
</a>
</li>
<li>
<a href="#documentation" v-tooltip.right="'Documentation'">
<i class="material-icons">insert_drive_file</i>
</a>
</li>
</ul>
</nav>
</div>
<div v-else-if="$route.path === '/settings'">
<nav class="secondary-nav">
<ul>
<li>
<a href="#account" v-tooltip.right="$t('account')">
<i class="material-icons">person</i>
</a>
</li>
<li>
<a href="#theme" v-tooltip.right="$t('theme')">
<i class="material-icons">brush</i>
</a>
</li>
<li>
<a href="#extensions" v-tooltip.right="$t('extensions')">
<i class="material-icons">extensions</i>
</a>
</li>
<li>
<a href="#proxy" v-tooltip.right="$t('proxy')">
<i class="material-icons">public</i>
</a>
</li>
</ul>
</nav>
</div>
</aside>
</template>
<script>
export default {
components: {
logo: () => import("./logo"),
},
methods: {
linkActive(path) {
return {
"nuxt-link-exact-active": this.$route.path === path,
"nuxt-link-active": this.$route.path === path,
}
},
},
mounted() {
window.addEventListener("scroll", event => {
let mainNavLinks = document.querySelectorAll("nav ul li a")
let fromTop = window.scrollY
mainNavLinks.forEach(link => {
let section = document.querySelector(link.hash)
if (
section &&
section.offsetTop <= fromTop &&
section.offsetTop + section.offsetHeight > fromTop
) {
link.classList.add("current")
} else {
link.classList.remove("current")
}
})
})
},
watch: {
$route() {
// this.$toast.clear();
},
},
}
</script>

View File

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

View File

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

View File

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

160
components/realtime/sse.vue Normal file
View File

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

View File

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

View File

@@ -1,56 +0,0 @@
<template>
<fieldset
:id="label.toLowerCase()"
:class="{ 'no-colored-frames': !frameColorsEnabled }"
>
<legend @click.prevent="collapse">
<span>{{ label }}</span>
<i class="material-icons">
{{ isCollapsed ? "expand_more" : "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

@@ -4,10 +4,9 @@
:data-color="color"
:class="{ active: active }"
v-tooltip="{ content: name || color }"
:style="{ backgroundColor: color }"
>
<span :style="{ backgroundColor: color }" class="preview">
<i v-if="active" class="material-icons activeTick">done</i>
</span>
<i v-if="active" class="material-icons activeTick">done</i>
</div>
</template>
@@ -17,9 +16,11 @@
align-items: center;
justify-content: center;
margin: 8px;
padding: 16px;
border-radius: 100%;
border: 3px solid var(--bg-dark-color);
cursor: pointer;
transition: all 0.2s ease-in-out;
&.fg {
color: var(--act-color);
@@ -33,19 +34,8 @@
border: 3px solid var(--fg-color);
}
.preview {
vertical-align: middle;
display: inline-block;
border-radius: 100%;
padding: 16px;
position: relative;
.activeTick {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.activeTick {
position: absolute;
}
}
</style>
@@ -55,15 +45,15 @@ export default {
props: {
color: {
type: String,
required: true
required: true,
},
name: {
type: String
type: String,
},
active: {
type: Boolean,
default: false
}
}
};
default: false,
},
},
}
</script>

View File

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

View File

@@ -76,42 +76,42 @@
</style>
<script>
const KEY_TAB = 9;
const KEY_ESC = 27;
const KEY_TAB = 9
const KEY_ESC = 27
const KEY_ARROW_UP = 38;
const KEY_ARROW_DOWN = 40;
const KEY_ARROW_UP = 38
const KEY_ARROW_DOWN = 40
export default {
props: {
spellcheck: {
type: Boolean,
default: true,
required: false
required: false,
},
placeholder: {
type: String,
default: "",
required: false
required: false,
},
source: {
type: Array,
required: true
required: true,
},
value: {
type: String,
default: "",
required: false
}
required: false,
},
},
watch: {
text() {
this.$emit("input", this.text);
}
this.$emit("input", this.text)
},
},
data() {
@@ -120,69 +120,67 @@ export default {
selectionStart: 0,
suggestionsOffsetLeft: 0,
currentSuggestionIndex: -1,
suggestionsVisible: false
};
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;
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;
this.selectionStart = this.$refs.acInput.selectionStart
this.suggestionsOffsetLeft = 12 * this.selectionStart
this.suggestionsVisible = true
},
forceSuggestion(text) {
let input = this.text.substring(0, this.selectionStart);
this.text = input + text;
let input = this.text.substring(0, this.selectionStart)
this.text = input + text
this.selectionStart = this.text.length;
this.suggestionsVisible = true;
this.currentSuggestionIndex = -1;
this.selectionStart = this.text.length
this.suggestionsVisible = true
this.currentSuggestionIndex = -1
},
handleKeystroke(event) {
switch (event.which) {
case KEY_ARROW_UP:
event.preventDefault();
event.preventDefault()
this.currentSuggestionIndex =
this.currentSuggestionIndex - 1 >= 0
? this.currentSuggestionIndex - 1
: 0;
break;
this.currentSuggestionIndex - 1 >= 0 ? this.currentSuggestionIndex - 1 : 0
break
case KEY_ARROW_DOWN:
event.preventDefault();
event.preventDefault()
this.currentSuggestionIndex =
this.currentSuggestionIndex < this.suggestions.length - 1
? this.currentSuggestionIndex + 1
: this.suggestions.length - 1;
break;
: this.suggestions.length - 1
break
case KEY_TAB:
event.preventDefault();
event.preventDefault()
let activeSuggestion = this.suggestions[
this.currentSuggestionIndex >= 0 ? this.currentSuggestionIndex : 0
];
]
if (activeSuggestion) {
let input = this.text.substring(0, this.selectionStart);
this.text = input + activeSuggestion;
let input = this.text.substring(0, this.selectionStart)
this.text = input + activeSuggestion
}
break;
break
default:
break;
break
}
}
},
},
computed: {
@@ -192,7 +190,7 @@ export default {
* @returns {default.props.source|{type, required}}
*/
suggestions() {
let input = this.text.substring(0, this.selectionStart);
let input = this.text.substring(0, this.selectionStart)
return (
this.source
@@ -200,20 +198,20 @@ export default {
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 6 suggestions.
.slice(0, 6)
);
}
)
},
},
mounted() {
this.updateSuggestions({
target: this.$refs.acInput
});
}
};
target: this.$refs.acInput,
})
},
}
</script>

View File

@@ -8,6 +8,8 @@
</div>
<div class="modal-body">
<slot name="body"></slot>
<!-- <div class="fade top"></div>
<div class="fade bottom"></div> -->
</div>
<div class="modal-footer">
<slot name="footer"></slot>
@@ -25,7 +27,7 @@
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.87);
background-color: rgba(0, 0, 0, 0.32);
display: flex;
align-items: center;
justify-content: center;
@@ -37,10 +39,10 @@
align-items: center;
justify-content: center;
flex-grow: 1;
max-width: 720px;
}
.modal-container {
position: relative;
display: flex;
flex-grow: 1;
flex-direction: column;
@@ -50,7 +52,8 @@
background-color: var(--bg-color);
border-radius: 16px;
box-shadow: 0px 16px 70px rgba(0, 0, 0, 0.5);
max-height: calc(100vh - 32px);
max-height: calc(100vh - 128px);
max-width: 720px;
}
.modal-body {
@@ -76,4 +79,23 @@
transform: scale(0.8);
transition: all 0.2s ease-in-out;
}
.fade {
position: absolute;
left: 16px;
right: 20px;
display: block;
height: 32px;
transition: all 0.2s;
&.top {
top: 68px;
background: linear-gradient(to bottom, var(--bg-color), transparent);
}
&.bottom {
bottom: 16px;
background: linear-gradient(to top, var(--bg-color), transparent);
}
}
</style>

36
components/ui/tab.vue Normal file
View File

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

96
components/ui/tabs.vue Normal file
View File

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

View File

@@ -84,15 +84,15 @@ export default {
props: {
on: {
type: Boolean,
default: false
}
default: false,
},
},
methods: {
toggle() {
const containsOnClass = this.$refs.toggle.classList.toggle("on");
this.$emit("change", containsOnClass);
}
}
};
const containsOnClass = this.$refs.toggle.classList.toggle("on")
this.$emit("change", containsOnClass)
},
},
}
</script>

View File

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

View File

@@ -10,11 +10,7 @@
"target": "postwoman",
"public": "dist",
"cleanUrls": true,
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
},
"storage": {
"rules": "storage.rules"

View File

@@ -23,4 +23,4 @@
// ]
"indexes": [],
"fieldOverrides": []
}
}

21
functions/api.js Normal file
View File

@@ -0,0 +1,21 @@
// Docs on event and context https://www.netlify.com/docs/functions/#the-handler-method
exports.handler = async (event, context) => {
switch (event.httpMethod) {
case "GET":
try {
const name = event.queryStringParameters.name || "World"
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ message: `Hello ${name}` }),
}
} catch (err) {
return { statusCode: 500, body: err.toString() }
}
default:
return { statusCode: 405, body: "Method Not Allowed" }
}
}

11
functions/editorutils.js Normal file
View File

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

View File

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

124
functions/headers.js Normal file
View File

@@ -0,0 +1,124 @@
export const commonHeaders = [
"WWW-Authenticate",
"Authorization",
"Proxy-Authenticate",
"Proxy-Authorization",
"Age",
"Cache-Control",
"Clear-Site-Data",
"Expires",
"Pragma",
"Warning",
"Accept-CH",
"Accept-CH-Lifetime",
"Early-Data",
"Content-DPR",
"DPR",
"Device-Memory",
"Save-Data",
"Viewport-Width",
"Width",
"Last-Modified",
"ETag",
"If-Match",
"If-None-Match",
"If-Modified-Since",
"If-Unmodified-Since",
"Vary",
"Connection",
"Keep-Alive",
"Accept",
"Accept-Charset",
"Accept-Encoding",
"Accept-Language",
"Expect",
"Max-Forwards",
"Cookie",
"Set-Cookie",
"Cookie2",
"Set-Cookie2",
"Access-Control-Allow-Origin",
"Access-Control-Allow-Credentials",
"Access-Control-Allow-Headers",
"Access-Control-Allow-Methods",
"Access-Control-Expose-Headers",
"Access-Control-Max-Age",
"Access-Control-Request-Headers",
"Access-Control-Request-Method",
"Origin",
"Service-Worker-Allowed",
"Timing-Allow-Origin",
"X-Permitted-Cross-Domain-Policies",
"DNT",
"Tk",
"Content-Disposition",
"Content-Length",
"Content-Type",
"Content-Encoding",
"Content-Language",
"Content-Location",
"Forwarded",
"X-Forwarded-For",
"X-Forwarded-Host",
"X-Forwarded-Proto",
"Via",
"Location",
"From",
"Host",
"Referer",
"Referrer-Policy",
"User-Agent",
"Allow",
"Server",
"Accept-Ranges",
"Range",
"If-Range",
"Content-Range",
"Cross-Origin-Opener-Policy",
"Cross-Origin-Resource-Policy",
"Content-Security-Policy",
"Content-Security-Policy-Report-Only",
"Expect-CT",
"Feature-Policy",
"Public-Key-Pins",
"Public-Key-Pins-Report-Only",
"Strict-Transport-Security",
"Upgrade-Insecure-Requests",
"X-Content-Type-Options",
"X-Download-Options",
"X-Frame-Options",
"X-Powered-By",
"X-XSS-Protection",
"Last-Event-ID",
"NEL",
"Ping-From",
"Ping-To",
"Report-To",
"Transfer-Encoding",
"TE",
"Trailer",
"Sec-WebSocket-Key",
"Sec-WebSocket-Extensions",
"Sec-WebSocket-Accept",
"Sec-WebSocket-Protocol",
"Sec-WebSocket-Version",
"Accept-Push-Policy",
"Accept-Signature",
"Alt-Svc",
"Date",
"Large-Allocation",
"Link",
"Push-Policy",
"Retry-After",
"Signature",
"Signed-Headers",
"Server-Timing",
"SourceMap",
"Upgrade",
"X-DNS-Prefetch-Control",
"X-Firefox-Spdy",
"X-Pingback",
"X-Requested-With",
"X-Robots-Tag",
"X-UA-Compatible",
]

310
functions/jsonParse.js Normal file
View File

@@ -0,0 +1,310 @@
/**
* Copyright (c) 2019 GraphQL Contributors
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
/**
* This JSON parser simply walks the input, generating an AST. Use this in lieu
* of JSON.parse if you need character offset parse errors and an AST parse tree
* with location information.
*
* If an error is encountered, a SyntaxError will be thrown, with properties:
*
* - message: string
* - start: int - the start inclusive offset of the syntax error
* - end: int - the end exclusive offset of the syntax error
*
*/
export default function jsonParse(str) {
string = str
strLen = str.length
start = end = lastEnd = -1
ch()
lex()
const ast = parseObj()
expect("EOF")
return ast
}
let string
let strLen
let start
let end
let lastEnd
let code
let kind
function parseObj() {
const nodeStart = start
const members = []
expect("{")
if (!skip("}")) {
do {
members.push(parseMember())
} while (skip(","))
expect("}")
}
return {
kind: "Object",
start: nodeStart,
end: lastEnd,
members,
}
}
function parseMember() {
const nodeStart = start
const key = kind === "String" ? curToken() : null
expect("String")
expect(":")
const value = parseVal()
return {
kind: "Member",
start: nodeStart,
end: lastEnd,
key,
value,
}
}
function parseArr() {
const nodeStart = start
const values = []
expect("[")
if (!skip("]")) {
do {
values.push(parseVal())
} while (skip(","))
expect("]")
}
return {
kind: "Array",
start: nodeStart,
end: lastEnd,
values,
}
}
function parseVal() {
switch (kind) {
case "[":
return parseArr()
case "{":
return parseObj()
case "String":
case "Number":
case "Boolean":
case "Null":
const token = curToken()
lex()
return token
}
return expect("Value")
}
function curToken() {
return { kind, start, end, value: JSON.parse(string.slice(start, end)) }
}
function expect(str) {
if (kind === str) {
lex()
return
}
let found
if (kind === "EOF") {
found = "[end of file]"
} else if (end - start > 1) {
found = "`" + string.slice(start, end) + "`"
} else {
const match = string.slice(start).match(/^.+?\b/)
found = "`" + (match ? match[0] : string[start]) + "`"
}
throw syntaxError(`Expected ${str} but found ${found}.`)
}
function syntaxError(message) {
return { message, start, end }
}
function skip(k) {
if (kind === k) {
lex()
return true
}
}
function ch() {
if (end < strLen) {
end++
code = end === strLen ? 0 : string.charCodeAt(end)
}
}
function lex() {
lastEnd = end
while (code === 9 || code === 10 || code === 13 || code === 32) {
ch()
}
if (code === 0) {
kind = "EOF"
return
}
start = end
switch (code) {
// "
case 34:
kind = "String"
return readString()
// -, 0-9
case 45:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
kind = "Number"
return readNumber()
// f
case 102:
if (string.slice(start, start + 5) !== "false") {
break
}
end += 4
ch()
kind = "Boolean"
return
// n
case 110:
if (string.slice(start, start + 4) !== "null") {
break
}
end += 3
ch()
kind = "Null"
return
// t
case 116:
if (string.slice(start, start + 4) !== "true") {
break
}
end += 3
ch()
kind = "Boolean"
return
}
kind = string[start]
ch()
}
function readString() {
ch()
while (code !== 34 && code > 31) {
if (code === 92) {
// \
ch()
switch (code) {
case 34: // "
case 47: // /
case 92: // \
case 98: // b
case 102: // f
case 110: // n
case 114: // r
case 116: // t
ch()
break
case 117: // u
ch()
readHex()
readHex()
readHex()
readHex()
break
default:
throw syntaxError("Bad character escape sequence.")
}
} else if (end === strLen) {
throw syntaxError("Unterminated string.")
} else {
ch()
}
}
if (code === 34) {
ch()
return
}
throw syntaxError("Unterminated string.")
}
function readHex() {
if (
(code >= 48 && code <= 57) || // 0-9
(code >= 65 && code <= 70) || // A-F
(code >= 97 && code <= 102) // a-f
) {
return ch()
}
throw syntaxError("Expected hexadecimal digit.")
}
function readNumber() {
if (code === 45) {
// -
ch()
}
if (code === 48) {
// 0
ch()
} else {
readDigits()
}
if (code === 46) {
// .
ch()
readDigits()
}
if (code === 69 || code === 101) {
// E e
ch()
if (code === 43 || code === 45) {
// + -
ch()
}
readDigits()
}
}
function readDigits() {
if (code < 48 || code > 57) {
// 0 - 9
throw syntaxError("Expected decimal digit.")
}
do {
ch()
} while (code >= 48 && code <= 57) // 0 - 9
}

View File

@@ -1,24 +1,19 @@
import AxiosStrategy from "./strategies/AxiosStrategy";
import FirefoxStrategy from "./strategies/FirefoxStrategy";
import ChromeStrategy, { hasChromeExtensionInstalled } from "./strategies/ChromeStrategy";
import AxiosStrategy from "./strategies/AxiosStrategy"
import ExtensionStrategy, { hasExtensionInstalled } from "./strategies/ExtensionStrategy"
const isExtensionsAllowed = ({ state }) =>
typeof state.postwoman.settings.EXTENSIONS_ENABLED === "undefined" ||
state.postwoman.settings.EXTENSIONS_ENABLED
const runAppropriateStrategy = (req, store) => {
// Chrome Provides a chrome object for scripts to access
// Check its availability to say whether you are in Google Chrome
if (window.chrome && hasChromeExtensionInstalled()) {
return ChromeStrategy(req, store);
}
// The firefox plugin injects a function to send requests through it
// If that is available, then we can use the FirefoxStrategy
if (window.firefoxExtSendRequest) {
return FirefoxStrategy(req, store);
if (isExtensionsAllowed(store) && hasExtensionInstalled()) {
return ExtensionStrategy(req, store)
}
return AxiosStrategy(req, store);
return AxiosStrategy(req, store)
}
const sendNetworkRequest = (req, store) =>
runAppropriateStrategy(req, store)
.finally(() => window.$nuxt.$loading.finish());
const sendNetworkRequest = (req, store) =>
runAppropriateStrategy(req, store).finally(() => window.$nuxt.$loading.finish())
export { sendNetworkRequest };
export { sendNetworkRequest }

View File

@@ -0,0 +1,3 @@
export function getPlatformSpecialKey() {
return /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? "⌘" : "Ctrl"
}

View File

@@ -1,13 +1,13 @@
const PASS = "PASS";
const FAIL = "FAIL";
const ERROR = "ERROR";
const PASS = "PASS"
const FAIL = "FAIL"
const ERROR = "ERROR"
const styles = {
[PASS]: { icon: "check", class: "success-response" },
[FAIL]: { icon: "close", class: "cl-error-response" },
[ERROR]: { icon: "close", class: "cl-error-response" },
none: { icon: "", class: "" }
};
none: { icon: "", class: "" },
}
// TODO: probably have to use a more global state for `test`
@@ -18,158 +18,130 @@ export default function runTestScriptWithVariables(script, variables) {
_report: "",
expect(value) {
try {
return expect(value, this._testReports);
return expect(value, this._testReports)
} catch (e) {
pw._testReports.push({ result: ERROR, message: e });
pw._testReports.push({ result: ERROR, message: e })
}
},
test: (descriptor, func) => test(descriptor, func, pw._testReports)
test: (descriptor, func) => test(descriptor, func, pw._testReports),
// globals that the script is allowed to have access to.
};
Object.assign(pw, variables);
}
Object.assign(pw, variables)
// run pre-request script within this function so that it has access to the pw object.
new Function("pw", script)(pw);
new Function("pw", script)(pw)
//
const testReports = pw._testReports.map(item => {
if (item.result) {
item.styles = styles[item.result];
item.styles = styles[item.result]
} else {
item.styles = styles.none;
item.styles = styles.none
}
return item;
});
return { report: pw._report, errors: pw._errors, testResults: testReports };
return item
})
return { report: pw._report, errors: pw._errors, testResults: testReports }
}
function test(descriptor, func, _testReports) {
_testReports.push({ startBlock: descriptor });
_testReports.push({ startBlock: descriptor })
try {
func();
func()
} catch (e) {
_testReports.push({ result: ERROR, message: e });
_testReports.push({ result: ERROR, message: e })
}
_testReports.push({ endBlock: true });
_testReports.push({ endBlock: true })
// TODO: Organize and generate text report of each {descriptor: true} section in testReports.
// add checkmark or x depending on if each testReport is pass=true or pass=false
}
function expect(expectValue, _testReports) {
return new Expectation(expectValue, null, _testReports);
return new Expectation(expectValue, null, _testReports)
}
class Expectation {
constructor(expectValue, _not, _testReports) {
this.expectValue = expectValue;
this.not = _not || new Expectation(this.expectValue, true, _testReports);
this._testReports = _testReports; // this values is used within Test.it, which wraps Expectation and passes _testReports value.
this.expectValue = expectValue
this.not = _not || new Expectation(this.expectValue, true, _testReports)
this._testReports = _testReports // this values is used within Test.it, which wraps Expectation and passes _testReports value.
this._satisfies = function(expectValue, targetValue) {
// Used for testing if two values match the expectation, which could be === OR !==, depending on if not
// was used. Expectation#_satisfies prevents the need to have an if(this.not) branch in every test method.
// Signature is _satisfies([expectValue,] targetValue): if only one argument is given, it is assumed the targetValue, and expectValue is set to this.expectValue
if (!targetValue) {
targetValue = expectValue;
expectValue = this.expectValue;
targetValue = expectValue
expectValue = this.expectValue
}
if (this.not === true) {
// test the inverse. this.not is always truthly, but an Expectation that is inverted will always be strictly `true`
return expectValue !== targetValue;
return expectValue !== targetValue
} else {
return expectValue === targetValue;
return expectValue === targetValue
}
};
}
}
_fmtNot(message) {
// given a string with "(not)" in it, replaces with "not" or "", depending if the expectation is expecting the positive or inverse (this._not)
if (this.not === true) {
return message.replace("(not)", "not ");
return message.replace("(not)", "not ")
} else {
return message.replace("(not)", "");
return message.replace("(not)", "")
}
}
_fail(message) {
this._testReports.push({ result: FAIL, message });
this._testReports.push({ result: FAIL, message })
}
_pass(message) {
this._testReports.push({ result: PASS });
this._testReports.push({ result: PASS })
}
// TEST METHODS DEFINED BELOW
// these are the usual methods that would follow expect(...)
toBe(value) {
return this._satisfies(value)
? this._pass()
: this._fail(
this._fmtNot(`Expected ${this.expectValue} (not)to be ${value}`)
);
: this._fail(this._fmtNot(`Expected ${this.expectValue} (not)to be ${value}`))
}
toHaveProperty(value) {
return this._satisfies(this.expectValue.hasOwnProperty(value), true)
? this._pass()
: this._fail(
this._fmtNot(
`Expected object ${this.expectValue} to (not)have property ${value}`
)
);
this._fmtNot(`Expected object ${this.expectValue} to (not)have property ${value}`)
)
}
toBeLevel2xx() {
const code = parseInt(this.expectValue);
const code = parseInt(this.expectValue)
if (Number.isNaN(code)) {
return this._fail(
`Expected 200-level status but could not parse value ${this.expectValue}`
);
return this._fail(`Expected 200-level status but could not parse value ${this.expectValue}`)
}
return this._satisfies(code >= 200 && code < 300)
? this._pass()
: this._fail(
this._fmtNot(
`Expected ${this.expectValue} to (not)be 200-level status`
)
);
: this._fail(this._fmtNot(`Expected ${this.expectValue} to (not)be 200-level status`))
}
toBeLevel3xx() {
const code = parseInt(this.expectValue);
const code = parseInt(this.expectValue)
if (Number.isNaN(code)) {
return this._fail(
`Expected 300-level status but could not parse value ${this.expectValue}`
);
return this._fail(`Expected 300-level status but could not parse value ${this.expectValue}`)
}
return this._satisfies(code >= 300 && code < 400)
? this._pass()
: this._fail(
this._fmtNot(
`Expected ${this.expectValue} to (not)be 300-level status`
)
);
: this._fail(this._fmtNot(`Expected ${this.expectValue} to (not)be 300-level status`))
}
toBeLevel4xx() {
const code = parseInt(this.expectValue);
const code = parseInt(this.expectValue)
if (Number.isNaN(code)) {
return this._fail(
`Expected 400-level status but could not parse value ${this.expectValue}`
);
return this._fail(`Expected 400-level status but could not parse value ${this.expectValue}`)
}
return this._satisfies(code >= 400 && code < 500)
? this._pass()
: this._fail(
this._fmtNot(
`Expected ${this.expectValue} to (not)be 400-level status`
)
);
: this._fail(this._fmtNot(`Expected ${this.expectValue} to (not)be 400-level status`))
}
toBeLevel5xx() {
const code = parseInt(this.expectValue);
const code = parseInt(this.expectValue)
if (Number.isNaN(code)) {
return this._fail(
`Expected 500-level status but could not parse value ${this.expectValue}`
);
return this._fail(`Expected 500-level status but could not parse value ${this.expectValue}`)
}
return this._satisfies(code >= 500 && code < 600)
? this._pass()
: this._fail(
this._fmtNot(
`Expected ${this.expectValue} to (not)be 500-level status`
)
);
: this._fail(this._fmtNot(`Expected ${this.expectValue} to (not)be 500-level status`))
}
}

View File

@@ -1,20 +1,20 @@
export default function getEnvironmentVariablesFromScript(script) {
let _variables = {};
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)
set: (key, value) => (_variables[key] = value),
},
env: {
set: (key, value) => (_variables[key] = value)
}
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);
new Function("pw", script)(pw)
return _variables;
return _variables
}

View File

@@ -0,0 +1,17 @@
export function hasPathParams(params) {
return params.some((p) => p.type === "path")
}
export function addPathParamsToVariables(params, variables) {
params
.filter(({ key }) => !!key)
.filter(({ type }) => type === "path")
.forEach(p => variables[p.key] = p.value)
return variables;
}
export function getQueryParams(params) {
return params
.filter(({ key }) => !!key)
.filter(({ type }) => type != "path")
}

View File

@@ -1,23 +1,23 @@
import axios from "axios";
import axios from "axios"
const axiosWithProxy = async (req, { state }) => {
const { data } = await axios.post(
state.postwoman.settings.PROXY_URL || "https://postwoman.apollotv.xyz/",
state.postwoman.settings.PROXY_URL || "https://postwoman.apollosoftware.xyz/",
req
);
return data;
};
)
return data
}
const axiosWithoutProxy = async (req, _store) => {
const res = await axios(req);
return res;
};
const res = await axios(req)
return res
}
const axiosStrategy = (req, store) => {
if (store.state.postwoman.settings.PROXY_ENABLED) {
return axiosWithProxy(req, store);
return axiosWithProxy(req, store)
}
return axiosWithoutProxy(req, store);
};
return axiosWithoutProxy(req, store)
}
export default axiosStrategy;
export default axiosStrategy

View File

@@ -1,56 +0,0 @@
const EXTENSION_ID = "amknoiejhlmhancpahfcfcfhllgkpbld";
// Check if the Chrome Extension is present
// The Chrome extension injects an empty span to help detection.
// Also check for the presence of window.chrome object to confirm smooth operations
export const hasChromeExtensionInstalled = () => {
return document.getElementById("chromePWExtensionDetect") !== null;
}
const chromeWithoutProxy = (req, _store) => new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
EXTENSION_ID, {
messageType: "send-req",
data: {
config: req
}
}, (message) => {
if (message.data.error) {
reject(message.data.error);
} else {
resolve(message.data.response);
}
}
);
});
const chromeWithProxy = (req, { state }) => new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
EXTENSION_ID, {
messageType: "send-req",
data: {
config: {
method: "post",
url: state.postwoman.settings.PROXY_URL || "https://postwoman.apollotv.xyz/",
data: req
}
}
}, (message) => {
if (message.data.error) {
reject(error);
} else {
resolve(message.data.response.data);
}
}
)
});
const chromeStrategy = (req, store) => {
if (store.state.postwoman.settings.PROXY_ENABLED) {
return chromeWithProxy(req, store);
} else {
return chromeWithoutProxy(req, store);
}
}
export default chromeStrategy;

View File

@@ -0,0 +1,31 @@
export const hasExtensionInstalled = () =>
typeof window.__POSTWOMAN_EXTENSION_HOOK__ !== "undefined"
export const hasChromeExtensionInstalled = () =>
hasExtensionInstalled() && /Chrome/i.test(navigator.userAgent) && /Google/i.test(navigator.vendor)
export const hasFirefoxExtensionInstalled = () =>
hasExtensionInstalled() && /Firefox/i.test(navigator.userAgent)
const extensionWithProxy = async (req, { state }) => {
const { data } = await window.__POSTWOMAN_EXTENSION_HOOK__.sendRequest({
method: "post",
url: state.postwoman.settings.PROXY_URL || "https://postwoman.apollosoftware.xyz/",
data: req,
})
return data
}
const extensionWithoutProxy = async (req, _store) => {
const res = await window.__POSTWOMAN_EXTENSION_HOOK__.sendRequest(req)
return res
}
const extensionStrategy = (req, store) => {
if (store.state.postwoman.settings.PROXY_ENABLED) {
return extensionWithProxy(req, store)
}
return extensionWithoutProxy(req, store)
}
export default extensionStrategy

View File

@@ -1,50 +0,0 @@
const firefoxWithProxy = (req, { state }) =>
new Promise((resolve, reject) => {
const eventListener = event => {
window.removeEventListener("firefoxExtSendRequestComplete", event);
if (event.detail.error) {
reject(JSON.parse(event.detail.error));
} else {
resolve(JSON.parse(event.detail.response).data);
}
};
window.addEventListener("firefoxExtSendRequestComplete", eventListener);
window.firefoxExtSendRequest({
method: "post",
url:
state.postwoman.settings.PROXY_URL || "https://postwoman.apollotv.xyz/",
data: req
});
});
const firefoxWithoutProxy = (req, _store) =>
new Promise((resolve, reject) => {
const eventListener = ({ detail }) => {
window.removeEventListener(
"firefoxExtSendRequestComplete",
eventListener
);
if (detail.error) {
reject(JSON.parse(detail.error));
} else {
resolve(JSON.parse(detail.response));
}
};
window.addEventListener("firefoxExtSendRequestComplete", eventListener);
window.firefoxExtSendRequest(req);
});
const firefoxStrategy = (req, store) => {
if (store.state.postwoman.settings.PROXY_ENABLED) {
return firefoxWithProxy(req, store);
}
return firefoxWithoutProxy(req, store);
};
export default firefoxStrategy;

View File

@@ -0,0 +1,115 @@
export function defineGQLLanguageMode(ace) {
// Highlighting
ace.define(
"ace/mode/gql-query-highlight",
["require", "exports", "ace/lib/oop", "ace/mode/text_highlight_rules"],
(aceRequire, exports) => {
const oop = aceRequire("ace/lib/oop")
const TextHighlightRules = aceRequire("ace/mode/text_highlight_rules").TextHighlightRules
const GQLQueryTextHighlightRules = function () {
var keywords =
"type|interface|union|enum|schema|input|implements|extends|scalar|fragment|query|mutation|subscription"
var dataTypes = "Int|Float|String|ID|Boolean"
var literalValues = "true|false|null"
var escapeRe = /\\(?:u[\da-fA-f]{4}|.)/
var keywordMapper = this.createKeywordMapper(
{
keyword: keywords,
"storage.type": dataTypes,
"constant.language": literalValues,
},
"identifier"
)
this.$rules = {
start: [
{
token: "comment",
regex: "#.*$",
},
{
token: "paren.lparen",
regex: /[\[({]/,
next: "start",
},
{
token: "paren.rparen",
regex: /[\])}]/,
},
{
token: keywordMapper,
regex: "[a-zA-Z_][a-zA-Z0-9_$]*\\b",
},
{
token: "string", // character
regex: "'(?:" + escapeRe + "|.)?'",
},
{
token: "string.start",
regex: '"',
stateName: "qqstring",
next: [
{ token: "string", regex: /\\\s*$/, next: "qqstring" },
{ token: "constant.language.escape", regex: escapeRe },
{ token: "string.end", regex: '"|$', next: "start" },
{ defaultToken: "string" },
],
},
{
token: "string.start",
regex: "'",
stateName: "singleQuoteString",
next: [
{ token: "string", regex: /\\\s*$/, next: "singleQuoteString" },
{ token: "constant.language.escape", regex: escapeRe },
{ token: "string.end", regex: "'|$", next: "start" },
{ defaultToken: "string" },
],
},
{
token: "constant.numeric",
regex: /\d+\.?\d*[eE]?[\+\-]?\d*/,
},
{
token: "variable",
regex: /\$[_A-Za-z][_0-9A-Za-z]*/,
},
],
}
this.normalizeRules()
}
oop.inherits(GQLQueryTextHighlightRules, TextHighlightRules)
exports.GQLQueryTextHighlightRules = GQLQueryTextHighlightRules
}
)
// Language Mode Definition
ace.define(
"ace/mode/gql-query",
["require", "exports", "ace/mode/text", "ace/mode/gql-query-highlight"],
(aceRequire, exports) => {
const oop = aceRequire("ace/lib/oop")
const TextMode = aceRequire("ace/mode/text").Mode
const GQLQueryTextHighlightRules = aceRequire("ace/mode/gql-query-highlight")
.GQLQueryTextHighlightRules
const FoldMode = aceRequire("ace/mode/folding/cstyle").FoldMode
const Mode = function () {
this.HighlightRules = GQLQueryTextHighlightRules
this.foldingRules = new FoldMode()
}
oop.inherits(Mode, TextMode)
exports.Mode = Mode
}
)
}

View File

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

View File

@@ -3,13 +3,13 @@
// functions which might be called frequently
// NOTE : Don't use lambda functions as this doesn't get bound properly in them, use the 'function (args) {}' format
const debounce = (func, delay) => {
let inDebounce;
let inDebounce
return function() {
const context = this;
const args = arguments;
clearTimeout(inDebounce);
inDebounce = setTimeout(() => func.apply(context, args), delay);
};
};
const context = this
const args = arguments
clearTimeout(inDebounce)
inDebounce = setTimeout(() => func.apply(context, args), delay)
}
}
export default debounce;
export default debounce

12
functions/utils/string.js Normal file
View File

@@ -0,0 +1,12 @@
export function 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 ""
}

13
functions/utils/uri.js Normal file
View File

@@ -0,0 +1,13 @@
export function parseUrlAndPath(value) {
let result = {}
try {
let url = new URL(value)
result.url = url.origin
result.path = url.pathname
} catch (error) {
let uriRegex = value.match(/^((http[s]?:\/\/)?(<<[^\/]+>>)?[^\/]*|)(\/?.*)$/)
result.url = uriRegex[1]
result.path = uriRegex[4]
}
return result;
}

40
functions/utils/valid.js Normal file
View File

@@ -0,0 +1,40 @@
function generateIPRE(protocol) {
return new RegExp(
`${protocol}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`
)
}
function generateHostnameRE(protocol) {
return new RegExp(
`${protocol}(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9/])$`
)
}
/**
* valid url for ws/wss
*/
export function wsValid(url) {
const protocol = "^(wss?:\\/\\/)?"
const validIP = generateIPRE(protocol)
const validHostname = generateHostnameRE(protocol)
return validIP.test(url) || validHostname.test(url)
}
/**
* valid url for http/https
*/
export function sseValid(url) {
const protocol = "^(https?:\\/\\/)?"
const validIP = generateIPRE(protocol)
const validHostname = generateHostnameRE(protocol)
return validIP.test(url) || validHostname.test(url)
}
/**
* valid url for ws/wss/http/https
*/
export function socketioValid(url) {
const protocol = "^((wss?:\\/\\/)|(https?:\\/\\/))?"
const validIP = generateIPRE(protocol)
const validHostname = generateHostnameRE(protocol)
return validIP.test(url) || validHostname.test(url)
}

View File

@@ -1,90 +0,0 @@
export default {
home: "Startseite",
realtime: "Echtzeit",
graphql: "GraphQL",
settings: "Einstellungen",
request: "Anfrage",
install_pwa: "PWA installieren",
support_us: "Unterstütze uns",
tweet: "Twittern",
options: "Optionen",
communication: "Kommunikation",
endpoint: "Endpunkt",
schema: "Schema",
theme: "Design",
subscribe: "Abonnieren",
choose_language: "Sprache auswählen",
shortcuts: "Tastenkombinationen",
send_request: "Anfrage senden",
save_to_collections: "In Sammlungen speichern",
copy_request_link: "Anfragelink kopieren",
reset_request: "Anfrage zurücksetzen",
support_us_on: "Unterstütze uns auf",
open_collective: "Open Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "JavaScript-Code",
method: "Methode",
path: "Pfad",
label: "Beschriftung",
again: "Wiederholen",
content_type: "Content-Typ",
raw_input: "Rohdaten-Eingabe",
parameter_list: "Parameterliste",
raw_request_body: "Rohdaten der Anfrage",
show_code: "Code zeigen",
hide_code: "Code ausblenden",
show_prerequest_script: "Preanfrageskript anzeigen",
hide_prerequest_script: "Preanfrageskript ausblenden",
authentication: "Authentifizierung",
authentication_type: "Authentifizierungs-Typ",
include_in_url: "In URL einfügen",
parameters: "Parameter",
expand_response: "Antwort ausklappen",
collapse_response: "Antwort einklappen",
hide_preview: "Vorschau verstecken",
preview_html: "HTML-Vorschau",
history: "Verlauf",
collections: "Kollektionen",
import_curl: "cURL importieren",
import: "Importieren",
generate_code: "Code generieren",
request_type: "Anfrage-Typ",
generated_code: "Generierter Code",
status: "Status",
headers: "Headers",
websocket: "WebSocket",
waiting_for_connection: "(warte auf Verbindung)",
message: "Nachricht",
sse: "SSE",
server: "Server",
events: "Ereignisse",
url: "URL",
get_schema: "Schema abrufen",
header_list: "Headerliste",
add_new: "Neu hinzufügen",
response: "Antwort",
query: "Abfrage",
queries: "Abfragen",
query_variables: "Variablen",
mutations: "Mutationen",
subscriptions: "Abonnements",
types: "Typen",
send: "Senden",
background: "Hintergrund",
color: "Farbe",
labels: "Bezeichner",
multi_color: "Mehrfarbig",
enabled: "Aktiviert",
disabled: "Deaktiviert",
proxy: "Proxy",
postwoman_official_proxy_hosting:
"Postwomans offizieller Proxy wird durch ApolloTV bereitgestellt.",
read_the: "Lies die",
apollotv_privacy_policy: "ApolloTV Datenschutzerklärung",
contact_us: "Kontaktiere uns",
connect: "Verbinden",
disconnect: "Trennen",
start: "Start",
stop: "Stopp"
};

92
lang/de-DE.json Normal file
View File

@@ -0,0 +1,92 @@
{
"home": "Startseite",
"realtime": "Echtzeit",
"graphql": "GraphQL",
"settings": "Einstellungen",
"request": "Anfrage",
"install_pwa": "PWA installieren",
"support_us": "Unterstütze uns",
"tweet": "Twittern",
"options": "Optionen",
"communication": "Kommunikation",
"endpoint": "Endpunkt",
"schema": "Schema",
"theme": "Design",
"subscribe": "Abonnieren",
"choose_language": "Sprache auswählen",
"shortcuts": "Tastenkombinationen",
"send_request": "Anfrage senden",
"save_to_collections": "In Sammlungen speichern",
"copy_request_link": "Anfragelink kopieren",
"reset_request": "Anfrage zurücksetzen",
"support_us_on": "Unterstütze uns auf",
"open_collective": "Open Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "JavaScript-Code",
"method": "Methode",
"path": "Pfad",
"label": "Beschriftung",
"again": "Wiederholen",
"content_type": "Content-Typ",
"raw_input": "Rohdaten-Eingabe",
"parameter_list": "Parameterliste",
"raw_request_body": "Rohdaten der Anfrage",
"show_code": "Code zeigen",
"hide_code": "Code ausblenden",
"show_prerequest_script": "Preanfrageskript anzeigen",
"hide_prerequest_script": "Preanfrageskript ausblenden",
"authentication": "Authentifizierung",
"authentication_type": "Authentifizierungs-Typ",
"include_in_url": "In URL einfügen",
"parameters": "Parameter",
"expand_response": "Antwort ausklappen",
"collapse_response": "Antwort einklappen",
"hide_preview": "Vorschau verstecken",
"preview_html": "HTML-Vorschau",
"history": "Verlauf",
"collections": "Kollektionen",
"import_curl": "cURL importieren",
"import": "Importieren",
"generate_code": "Code generieren",
"request_type": "Anfrage-Typ",
"generated_code": "Generierter Code",
"status": "Status",
"headers": "Headers",
"websocket": "WebSocket",
"waiting_for_connection": "(warte auf Verbindung)",
"message": "Nachricht",
"sse": "SSE",
"server": "Server",
"events": "Ereignisse",
"url": "URL",
"get_schema": "Schema abrufen",
"header_list": "Headerliste",
"add_new": "Neu hinzufügen",
"response": "Antwort",
"query": "Abfrage",
"queries": "Abfragen",
"query_variables": "Variablen",
"mutations": "Mutationen",
"subscriptions": "Abonnements",
"types": "Typen",
"send": "Senden",
"background": "Hintergrund",
"color": "Farbe",
"labels": "Bezeichner",
"multi_color": "Mehrfarbig",
"enabled": "Aktiviert",
"disabled": "Deaktiviert",
"proxy": "Proxy",
"postwoman_official_proxy_hosting": "Postwomans offizieller Proxy wird durch Apollo Software bereitgestellt.",
"read_the": "Lies die",
"apollosw_privacy_policy": "Apollo Software Datenschutzerklärung",
"contact_us": "Kontaktiere uns",
"connect": "Verbinden",
"disconnect": "Trennen",
"start": "Start",
"stop": "Stopp",
"syncHistory": "History",
"syncCollections": "Collections",
"syncEnvironments": "Environments"
}

View File

@@ -1,264 +0,0 @@
export default {
home: "Home",
realtime: "Realtime",
graphql: "GraphQL",
settings: "Settings",
request: "Request",
install_pwa: "Install PWA",
support_us: "Support us",
tweet: "Tweet",
options: "Options",
communication: "Communication",
endpoint: "Endpoint",
schema: "Schema",
theme: "Theme",
subscribe: "Subscribe",
choose_language: "Choose Language",
shortcuts: "Shortcuts",
send_request: "Send Request",
save_to_collections: "Save to Collections",
copy_request_link: "Copy Request Link",
reset_request: "Reset Request",
support_us_on: "Support us on",
open_collective: "Open Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "JavaScript Code",
method: "Method",
path: "Path",
label: "Label",
again: "Again",
content_type: "Content Type",
raw_input: "Raw input",
parameter_list: "Parameter List",
raw_request_body: "Raw Request Body",
show_code: "Show Code",
hide_code: "Hide Code",
show_prerequest_script: "Show Pre-Request Script",
hide_prerequest_script: "Hide Pre-Request Script",
authentication: "Authentication",
authentication_type: "Authentication type",
include_in_url: "Include in URL",
parameters: "Parameters",
expand_response: "Expand response",
collapse_response: "Collapse response",
hide_preview: "Hide Preview",
preview_html: "Preview HTML",
history: "History",
collections: "Collections",
import_curl: "Import cURL",
import: "Import",
generate_code: "Generate code",
request_type: "Request type",
generated_code: "Generated code",
status: "Status",
headers: "Headers",
websocket: "WebSocket",
waiting_for_connection: "(waiting for connection)",
message: "Message",
sse: "SSE",
server: "Server",
events: "Events",
url: "URL",
get_schema: "Get schema",
header_list: "Header list",
add_new: "Add new",
response: "Response",
query: "Query",
queries: "Queries",
query_variables: "Variables",
mutations: "Mutations",
subscriptions: "Subscriptions",
types: "Types",
send: "Send",
background: "Background",
color: "Color",
labels: "Labels",
multi_color: "Multi-color",
enabled: "Enabled",
disabled: "Disabled",
proxy: "Proxy",
postwoman_official_proxy_hosting:
"Postwoman's Official Proxy is hosted by ApolloTV.",
read_the: "Read the",
apollotv_privacy_policy: "ApolloTV privacy policy",
contact_us: "Contact us",
connect: "Connect",
disconnect: "Disconnect",
start: "Start",
stop: "Stop",
access_token: "Access Token",
token_list: "Token List",
get_token: "Get New Token",
manage_token: "Manage Access Token",
save_token: "Save Access Token",
use_token: "Use Saved Token",
request_token: "Request Token",
save_token_req: "Save Token Request",
manage_token_req: "Manage Token Request",
use_token_req: "Use Token Request",
token_req_name: "Request Name",
token_req_details: "Request Details",
token_name: "Token Name",
oidc_discovery_url: "OIDC Discovery URL",
auth_url: "Auth URL",
access_token_url: "Access Token URL",
client_id: "Client ID",
scope: "Scope",
state: "State",
token_req_list: "Token Request List",
no_path: "No path",
no_label: "No label",
prerequest_script: "Pre-Request Script",
no_prerequest_script: "No pre-request script",
search_history: "search history",
history_empty: "History is empty",
history_deleted: "History Deleted",
clear: "Clear",
clear_all: "Clear All",
cleared: "Cleared",
close: "Close",
sort: "Sort",
time: "Time",
duration: "Duration",
no_duration: "No duration",
show_more: "Show more",
hide_more: "Hide more",
collection: "Collection",
current_collection: "Current Collection",
select_collection: "Select a Collection",
create_collection: "Create a Collection",
new: "New",
import_export: "Import / Export",
more: "More",
folder: "Folder",
new_folder: "New Folder",
my_new_folder: "My New Folder",
folder_empty: "Folder is empty",
edit_folder: "Edit Folder",
edit: "Edit",
delete: "Delete",
deleted: "Deleted",
undo: "Undo",
collection_empty: "Collection is empty",
new_collection: "New Collection",
my_new_collection: "My New Collection",
edit_collection: "Edit Collection",
edit_request: "Edit Request",
save_request_as: "Save Request As",
export: "Export",
connecting_to: "Connecting to {name}...",
connected: "Connected",
connected_to: "Connected to {name}",
disconnected: "Disconnected",
disconnected_from: "Disconnected from {name}",
something_went_wrong: "Something went wrong!",
error_occurred: "An error has occurred.",
browser_support_sse:
"This browser doesn't seems to have Server Sent Events support.",
log: "Log",
no_url: "No URL",
run_query: "Run Query",
copy_query: "Copy Query",
kinda_dark: "Kinda Dark",
clearly_white: "Clearly White",
just_black: "Just Black",
auto_system: "Auth (system)",
green: "Green",
yellow: "Yellow",
pink: "Pink",
red: "Red",
purple: "Purple",
orange: "Orange",
cyan: "Cyan",
blue: "Blue",
loading: "Loading...",
fetching: "Fetching...",
waiting_send_req: "(waiting to send request)",
cancel: "Cancel",
save: "Save",
dismiss: "Dismiss",
are_you_sure: "Are you sure?",
yes: "Yes",
no: "No",
restore: "Restore",
add_star: "Add star",
remove_star: "Remove star",
nothing_found: "Nothing found",
replace_current: "Replace current",
replace_json: "Replace with JSON",
preserve_current: "Preserve current",
import_json: "Import from JSON",
download_file: "Download file",
upload_file: "Upload file",
copy_response: "Copy response",
copy_code: "Copy code",
copy_schema: "Copy Schema",
use_request: "Use request",
documentation: "Documentation",
docs: "Docs",
reset_default: "Reset to default",
fields: "FIELDS",
deprecated: "DEPRECATED",
add_one_header: "(add at least one header)",
add_one_parameter: "(add at least one parameter)",
header_count: "header {count}",
parameter_count: "parameter {count}",
variable_count: "variable {count}",
value_count: "value {count}",
send_request_first: "Send a request first",
generate_docs: "Generate Documentation",
generate_docs_message:
"Import any Postwoman Collection to Generate Documentation on-the-go.",
generate_docs_first: "Generate documentation first",
docs_generated: "Documentation generated",
import_collections: "Import collections",
optional: "(optional)",
json: "JSON",
none: "None",
username: "Username",
password: "Password",
token: "Token",
payload: "Payload",
choose_file: "Choose a file",
file_imported: "File imported",
f12_details: "(F12 for details)",
we_use_cookies: "We use cookies",
copied_to_clipboard: "Copied to clipboard",
finished_in: "Finished in {duration}ms",
check_console_details: "Check console for details.",
download_started: "Download started",
url_invalid_format: "URL is not formatted properly",
curl_invalid_format: "cURL is not formatted properly",
enable_proxy: "Try enabling Proxy",
complete_config_urls: "Please complete configuration urls.",
token_request_saved: "Token request saved",
donate_info1:
"If you have enjoyed the productivity of using Postwoman, consider donating as a sign of appreciation.",
donate_info2:
"You can support Postwoman development via the following methods:",
one_time_recurring: "One-time or recurring",
one_time: "One-time",
recurring: "Recurring",
wiki: "Wiki",
error: "Error",
go_home: "Go Home",
reload: "Reload",
enter_curl: "Enter cURL",
empty: "Empty",
extensions: "Extensions",
extensions_info1: "Browser extension that simplifies access to Postwoman",
extensions_info2: "Get Postwoman browser extension!",
installed: "Installed",
login_with: "Login with",
logged_out: "Logged out",
logout: "Logout",
account: "Account",
sync: "Sync",
syncHistory: "History",
syncCollections: "Collections",
turn_on: "Turn on",
login_first: "Login first",
paste_a_collection: "Paste a Collection",
import_from_sync: "Import from Sync"
};

288
lang/en-US.json Normal file
View File

@@ -0,0 +1,288 @@
{
"home": "Home",
"realtime": "Realtime",
"graphql": "GraphQL",
"settings": "Settings",
"request": "Request",
"install_pwa": "Install PWA",
"support_us": "Support us",
"tweet": "Tweet",
"options": "Options",
"communication": "Communication",
"endpoint": "Endpoint",
"schema": "Schema",
"theme": "Theme",
"subscribe": "Subscribe",
"choose_language": "Choose Language",
"shortcuts": "Shortcuts",
"send_request": "Send Request",
"save_to_collections": "Save to Collections",
"copy_request_link": "Copy Request Link",
"reset_request": "Reset Request",
"open_collective": "Open Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "JavaScript Code",
"method": "Method",
"path": "Path",
"label": "Label",
"content_type": "Content Type",
"raw_input": "Raw input",
"parameter_list": "Parameter List",
"raw_request_body": "Raw Request Body",
"show_code": "Show Code",
"hide_code": "Hide Code",
"show_prerequest_script": "Show Pre-Request Script",
"hide_prerequest_script": "Hide Pre-Request Script",
"authentication": "Authentication",
"authentication_type": "Authentication type",
"include_in_url": "Include in URL",
"parameters": "Parameters",
"expand_response": "Expand response",
"collapse_response": "Collapse response",
"hide_preview": "Hide Preview",
"preview_html": "Preview HTML",
"history": "History",
"collections": "Collections",
"environments": "Environments",
"new_environment": "New Environment",
"my_new_environment": "My New Environment",
"edit_environment": "Edit Environment",
"env_variable_list": "Variable List",
"invalid_environment_name": "Please provide a valid name for the environment",
"use_environment": "Use Environment",
"add_one_variable": "(add at least one variable)",
"import_curl": "Import cURL",
"import": "Import",
"generate_code": "Generate code",
"request_type": "Request type",
"generated_code": "Generated code",
"status": "Status",
"headers": "Headers",
"websocket": "WebSocket",
"waiting_for_connection": "(waiting for connection)",
"message": "Message",
"sse": "SSE",
"server": "Server",
"events": "Events",
"url": "URL",
"get_schema": "Get schema",
"header_list": "Header list",
"add_new": "Add new",
"response": "Response",
"query": "Query",
"queries": "Queries",
"query_variables": "Variables",
"mutations": "Mutations",
"subscriptions": "Subscriptions",
"types": "Types",
"send": "Send",
"background": "Background",
"color": "Color",
"labels": "Labels",
"multi_color": "Multi-color",
"enabled": "Enabled",
"disabled": "Disabled",
"proxy": "Proxy",
"postwoman_official_proxy_hosting": "Postwoman's Official Proxy is hosted by Apollo Software.",
"read_the": "Read the",
"apollosw_privacy_policy": "Apollo Software privacy policy",
"contact_us": "Contact us",
"connect": "Connect",
"disconnect": "Disconnect",
"start": "Start",
"stop": "Stop",
"access_token": "Access Token",
"token_list": "Token List",
"get_token": "Get New Token",
"manage_token": "Manage Access Token",
"save_token": "Save Access Token",
"use_token": "Use Saved Token",
"request_token": "Request Token",
"save_token_req": "Save Token Request",
"manage_token_req": "Manage Token Request",
"use_token_req": "Use Token Request",
"token_req_name": "Request Name",
"token_req_details": "Request Details",
"token_name": "Token Name",
"oidc_discovery_url": "OIDC Discovery URL",
"auth_url": "Auth URL",
"access_token_url": "Access Token URL",
"client_id": "Client ID",
"scope": "Scope",
"state": "State",
"token_req_list": "Token Request List",
"no_path": "No path",
"no_label": "No label",
"prerequest_script": "Pre-Request Script",
"no_prerequest_script": "No pre-request script",
"search": "Search",
"history_empty": "History is empty",
"history_deleted": "History Deleted",
"clear": "Clear",
"clear_all": "Clear All",
"cleared": "Cleared",
"close": "Close",
"sort": "Sort",
"time": "Time",
"duration": "Duration",
"no_duration": "No duration",
"show_more": "Show more",
"hide_more": "Hide more",
"collection": "Collection",
"current_collection": "Current Collection",
"select_collection": "Select a Collection",
"create_collection": "Create a Collection",
"new": "New",
"import_export": "Import / Export",
"more": "More",
"folder": "Folder",
"new_folder": "New Folder",
"my_new_folder": "My New Folder",
"folder_empty": "Folder is empty",
"edit_folder": "Edit Folder",
"edit": "Edit",
"delete": "Delete",
"deleted": "Deleted",
"undo": "Undo",
"collection_empty": "Collection is empty",
"invalid_collection_name": "Please provide a valid name for the collection",
"new_collection": "New Collection",
"my_new_collection": "My New Collection",
"edit_collection": "Edit Collection",
"edit_request": "Edit Request",
"save_request_as": "Save Request As",
"export": "Export",
"connecting_to": "Connecting to {name}...",
"connected": "Connected",
"connected_to": "Connected to {name}",
"disconnected": "Disconnected",
"disconnected_from": "Disconnected from {name}",
"something_went_wrong": "Something went wrong!",
"error_occurred": "An error has occurred.",
"browser_support_sse": "This browser doesn't seems to have Server Sent Events support.",
"log": "Log",
"no_url": "No URL",
"run_query": "Run Query",
"copy_query": "Copy Query",
"kinda_dark": "Kinda Dark",
"clearly_white": "Clearly White",
"just_black": "Just Black",
"auto_system": "Auto (system)",
"green": "Green",
"yellow": "Yellow",
"pink": "Pink",
"red": "Red",
"purple": "Purple",
"orange": "Orange",
"cyan": "Cyan",
"blue": "Blue",
"loading": "Loading...",
"fetching": "Fetching...",
"waiting_send_req": "(waiting to send request)",
"waiting_receive_response": "(waiting to receive response)",
"waiting_receive_schema": "(waiting to receive schema)",
"gql_prettify_invalid_query": "Couldn't prettify an invalid query, solve query syntax errors and try again",
"prettify_query": "Prettify Query",
"json_prettify_invalid_body": "Couldn't prettify an invalid body, solve json syntax errors and try again",
"prettify_body": "Prettify body",
"cancel": "Cancel",
"save": "Save",
"dismiss": "Dismiss",
"are_you_sure": "Are you sure?",
"yes": "Yes",
"no": "No",
"restore": "Restore",
"add_star": "Add star",
"remove_star": "Remove star",
"nothing_found": "Nothing found",
"replace_current": "Replace current",
"replace_json": "Replace with JSON",
"preserve_current": "Preserve current",
"import_json": "Import from JSON",
"download_file": "Download file",
"upload_file": "Upload file",
"copy_response": "Copy response",
"copy_code": "Copy code",
"copy_schema": "Copy Schema",
"use_request": "Use request",
"documentation": "Documentation",
"docs": "Docs",
"reset_default": "Reset to default",
"fields": "FIELDS",
"deprecated": "DEPRECATED",
"add_one_header": "(add at least one header)",
"add_one_parameter": "(add at least one parameter)",
"header_count": "header {count}",
"parameter_count": "parameter {count}",
"variable_count": "variable {count}",
"value_count": "value {count}",
"send_request_first": "Send a request first",
"generate_docs": "Generate Documentation",
"generate_docs_message": "Import any Postwoman Collection to Generate Documentation on-the-go.",
"generate_docs_first": "Generate documentation first",
"docs_generated": "Documentation generated",
"import_collections": "Import collections",
"optional": "(optional)",
"json": "JSON",
"none": "None",
"username": "Username",
"password": "Password",
"token": "Token",
"payload": "Payload",
"choose_file": "Choose a file",
"file_imported": "File imported",
"import_failed": "Import failed",
"f12_details": "(F12 for details)",
"we_use_cookies": "We use cookies",
"copied_to_clipboard": "Copied to clipboard",
"finished_in": "Finished in {duration}ms",
"check_console_details": "Check console for details.",
"check_graphql_valid": "Check the URL to see if it is a valid GraphQL endpoint",
"graphql_introspect_failed": "Failed fetching schema details.",
"download_started": "Download started",
"url_invalid_format": "URL is not formatted properly",
"curl_invalid_format": "cURL is not formatted properly",
"enable_proxy": "Try enabling Proxy",
"complete_config_urls": "Please complete configuration urls.",
"token_request_saved": "Token request saved",
"donate_info1": "If you have enjoyed the productivity of using Postwoman, consider donating as a sign of appreciation.",
"donate_info2": "You can support Postwoman development via the following methods:",
"one_time_recurring": "One-time or recurring",
"one_time": "One-time",
"recurring": "Recurring",
"wiki": "Wiki",
"error": "Error",
"go_home": "Go Home",
"reload": "Reload",
"enter_curl": "Enter cURL",
"empty": "Empty",
"extensions": "Extensions",
"extensions_use_toggle": "Use the browser extension to send requests (if present)",
"extensions_info1": "Browser extension that simplifies access to Postwoman",
"extensions_info2": "Get Postwoman browser extension!",
"installed": "Installed",
"login_with": "Login with",
"logged_out": "Logged out",
"login_success": "Successfully logged in",
"logout": "Logout",
"account": "Account",
"scrollInto_use_toggle": "Auto scroll",
"sync": "Sync",
"syncHistory": "History",
"syncCollections": "Collections",
"syncEnvironments": "Environments",
"turn_on": "Turn on",
"login_first": "Login first",
"paste_a_note": "Paste a note",
"import_from_sync": "Import from Sync",
"notes": "Notes",
"socketio": "Socket.IO",
"event_name": "Event Name",
"mqtt": "MQTT",
"mqtt_topic": "Topic",
"mqtt_topic_title": "Publish / Subscribe topic",
"mqtt_publish": "Publish",
"mqtt_subscribe": "Subscribe",
"mqtt_unsubscribe": "Unsubscribe"
}

View File

@@ -1,90 +0,0 @@
export default {
home: "Inicio",
realtime: "Tiempo real",
graphql: "GraphQL",
settings: "Ajustes",
request: "Petición",
install_pwa: "Instalar PWA",
support_us: "Ayúdanos",
tweet: "Tweet",
options: "Opciones",
communication: "Comunicación",
endpoint: "Endpoint",
schema: "Esquema",
theme: "Tema",
subscribe: "Subscribirse",
choose_language: "Seleccione un idioma",
shortcuts: "Atajos",
send_request: "Enviar petición",
save_to_collections: "Guardar en las Colecciones",
copy_request_link: "Copiar enlace de la petición",
reset_request: "Reiniciar Petición",
support_us_on: "Ayúdanos en",
open_collective: "Open Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "Código JavaScript",
method: "Método",
path: "Ruta",
label: "Etiqueta",
again: "De nuevo",
content_type: "Tipo de Contenido",
raw_input: "Datos sin Procesar",
parameter_list: "Lista de Parámetros",
raw_request_body: "Cuerpo de la Solicitud sin Procesar",
show_code: "Mostrar el código",
hide_code: "Ocultar el código",
show_prerequest_script: "Mostrar Script pre solicitud",
hide_prerequest_script: "Ocultar Script pre solicitud",
authentication: "Autenticación",
authentication_type: "Tipo de autenticación",
include_in_url: "Incluir en el URL",
parameters: "Parámetros",
expand_response: "Ampliar Respuesta",
collapse_response: "Contraer Respuesta",
hide_preview: "Ocultar la vista previa",
preview_html: "Vista Previa del HTML",
history: "Historial",
collections: "Colecciones",
import_curl: "Importar cURL",
import: "Importar",
generate_code: "Generar código",
request_type: "Tipo de Petición",
generated_code: "Código Generado",
status: "Estado",
headers: "Cabeceras",
websocket: "WebSocket",
waiting_for_connection: "(esperando por conexión)",
message: "Mensaje",
sse: "SSE",
server: "Servidor",
events: "Eventos",
url: "URL",
get_schema: "Obtener esquema",
header_list: "Lista de Cabeceras",
add_new: "Agregar nuevo",
response: "Respuesta",
query: "Consulta",
queries: "Consultas",
query_variables: "Variables",
mutations: "Mutaciones",
subscriptions: "Subscripciones",
types: "Tipos",
send: "Enviar",
background: "Fondo",
color: "Color",
labels: "Etiquetas",
multi_color: "Multicolor",
enabled: "Habilitado",
disabled: "Deshabilitado",
proxy: "Proxy",
postwoman_official_proxy_hosting:
"Proxy Oficial de Postwoman está hospedado en ApolloTV.",
read_the: "Leer la",
apollotv_privacy_policy: "Política de Privacidad de ApolloTV",
contact_us: "Contáctenos",
connect: "Conectar",
disconnect: "Desconectar",
start: "Comienzo",
stop: "Detener"
};

260
lang/es-ES.json Normal file
View File

@@ -0,0 +1,260 @@
{
"home": "Inicio",
"realtime": "Tiempo real",
"graphql": "GraphQL",
"settings": "Ajustes",
"request": "Petición",
"install_pwa": "Instalar PWA",
"support_us": "Ayúdanos",
"tweet": "Tweet",
"options": "Opciones",
"communication": "Comunicación",
"endpoint": "Endpoint",
"schema": "Esquema",
"theme": "Tema",
"subscribe": "Subscribirse",
"choose_language": "Seleccione un idioma",
"shortcuts": "Atajos",
"send_request": "Enviar petición",
"save_to_collections": "Guardar en las Colecciones",
"copy_request_link": "Copiar enlace de la petición",
"reset_request": "Reiniciar Petición",
"support_us_on": "Ayúdanos en",
"open_collective": "Open Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "Código JavaScript",
"method": "Método",
"path": "Ruta",
"label": "Etiqueta",
"again": "De nuevo",
"content_type": "Tipo de Contenido",
"raw_input": "Datos sin Procesar",
"parameter_list": "Lista de Parámetros",
"raw_request_body": "Cuerpo de la Solicitud sin Procesar",
"show_code": "Mostrar el código",
"hide_code": "Ocultar el código",
"show_prerequest_script": "Mostrar Script pre solicitud",
"hide_prerequest_script": "Ocultar Script pre solicitud",
"authentication": "Autenticación",
"authentication_type": "Tipo de autenticación",
"include_in_url": "Incluir en el URL",
"parameters": "Parámetros",
"expand_response": "Ampliar Respuesta",
"collapse_response": "Contraer Respuesta",
"hide_preview": "Ocultar la vista previa",
"preview_html": "Vista Previa del HTML",
"history": "Historial",
"collections": "Colecciones",
"import_curl": "Importar cURL",
"import": "Importar",
"generate_code": "Generar código",
"request_type": "Tipo de Petición",
"generated_code": "Código Generado",
"status": "Estado",
"headers": "Cabeceras",
"websocket": "WebSocket",
"waiting_for_connection": "(esperando por conexión)",
"message": "Mensaje",
"sse": "SSE",
"server": "Servidor",
"events": "Eventos",
"url": "URL",
"get_schema": "Obtener esquema",
"header_list": "Lista de Cabeceras",
"add_new": "Agregar nuevo",
"response": "Respuesta",
"query": "Consulta",
"queries": "Consultas",
"query_variables": "Variables",
"mutations": "Mutaciones",
"subscriptions": "Subscripciones",
"types": "Tipos",
"send": "Enviar",
"background": "Fondo",
"color": "Color",
"labels": "Etiquetas",
"multi_color": "Multicolor",
"enabled": "Habilitado",
"disabled": "Deshabilitado",
"proxy": "Proxy",
"postwoman_official_proxy_hosting": "Proxy Oficial de Postwoman está hospedado en Apollo Software.",
"read_the": "Leer la",
"apollosw_privacy_policy": "Política de Privacidad de Apollo Software",
"contact_us": "Contáctenos",
"connect": "Conectar",
"disconnect": "Desconectar",
"start": "Comienzo",
"stop": "Detener",
"access_token": "Token de acceso",
"token_list": "Lista de token",
"get_token": "Obtener un nuevo token",
"manage_token": "Gestionar el token de acceso",
"save_token": "Guardar el token de acceso",
"use_token": "Usar token guardado",
"request_token": "Petición del token",
"save_token_req": "Guardar la petición del token",
"manage_token_req": "Gestionar la petición del token",
"use_token_req": "Usar el token de la petición",
"token_req_name": "Nombre de la petición",
"token_req_details": "Petición de detalles",
"token_name": "Nombre del token",
"oidc_discovery_url": "URL de descubrimiento de OIDC",
"auth_url": "URL de autenticación",
"access_token_url": "URL de token de acceso",
"client_id": "ID del cliente",
"scope": "Alcance",
"state": "Estado",
"token_req_list": "Lista de solicitud de token",
"no_path": "Sin ruta",
"no_label": "Sin etiqueta",
"prerequest_script": "Pre-Request Script",
"no_prerequest_script": "Script sin pre-requisito",
"search": "buscar historial",
"history_empty": "Historial vacío",
"history_deleted": "Historial borrado",
"clear": "Limpiar",
"clear_all": "Limpiar todo",
"cleared": "Limpiado",
"close": "Cerrar",
"sort": "Ordenar",
"time": "Tiempo",
"duration": "Duración",
"no_duration": "Sin duración",
"show_more": "Mostrar más",
"hide_more": "Ocultar más",
"collection": "Colección",
"current_collection": "Actual colección",
"select_collection": "Seleccionar una colección",
"create_collection": "Crear una colección",
"new": "Nuevo",
"import_export": "Importar / Exportar",
"more": "Más",
"folder": "Directorio",
"new_folder": "Nuevo directorio",
"my_new_folder": "Mi nuevo directorio",
"folder_empty": "Directorio vacío",
"edit_folder": "Editar directorio",
"edit": "Editar",
"delete": "Borrar",
"deleted": "Borrado",
"undo": "Deshacer",
"collection_empty": "Colección vacía",
"new_collection": "Nueva colección",
"my_new_collection": "Mi nueva colección",
"edit_collection": "Editar colección",
"edit_request": "Editar petición",
"save_request_as": "Guardar petición como",
"export": "Exportar",
"connecting_to": "Conectando a {name}...",
"connected": "Conectado",
"connected_to": "Conectado a {name}",
"disconnected": "Desconectado",
"disconnected_from": "Desconectado desde {name}",
"something_went_wrong": "Algo ha salido mal!",
"error_occurred": "Ha ocurrido un error.",
"browser_support_sse": "Este navegador parace no tener soporte a los eventos enviados desde el servidor.",
"log": "Bitácora",
"no_url": "Sin URL",
"run_query": "Ejecutar consulta",
"copy_query": "Copiar consulta",
"kinda_dark": "Un poco oscúro",
"clearly_white": "Claramento blanco",
"just_black": "Solo Negro",
"auto_system": "Autenticación (sistema)",
"green": "Verde",
"yellow": "Amarillo",
"pink": "Rosado",
"red": "Rojo",
"purple": "Púrpura",
"orange": "Anaranjado",
"cyan": "Cian",
"blue": "Azul",
"loading": "Cargando...",
"fetching": "Recuperando...",
"waiting_send_req": "(esperando para enviar la petición)",
"cancel": "Cancelar",
"save": "Guardar",
"dismiss": "Descartar",
"are_you_sure": "Está seguro?",
"yes": "Sí",
"no": "No",
"restore": "Restaurar",
"add_star": "Agregar estrella",
"remove_star": "Eliminar estrella",
"nothing_found": "No se encontró nada",
"replace_current": "Reemplaza el actual",
"replace_json": "Reemplazar con JSON",
"preserve_current": "Preservar el actual",
"import_json": "Importar desde JSON",
"download_file": "Descargar archivo",
"upload_file": "Cargar archivo",
"copy_response": "Copiar respuesta",
"copy_code": "Copiar codigo",
"copy_schema": "Copiar Esquema",
"use_request": "Usar la petición",
"documentation": "Documentación",
"docs": "Documentos",
"reset_default": "Reiniciar valores por defecto",
"fields": "CAMPOS",
"deprecated": "OBSOLETO",
"add_one_header": "(agregar al menos una cabecera)",
"add_one_parameter": "(agregar al menos un parámetro)",
"header_count": "cabecera {count}",
"parameter_count": "parámetro {count}",
"variable_count": "variable {count}",
"value_count": "valor {count}",
"send_request_first": "Enviar primero la petición",
"generate_docs": "Generar la Documentación",
"generate_docs_message": "Importar cualquier Colección de Postwoman para Generar la Documentación sobre la marcha.",
"generate_docs_first": "Generar primero la documentación",
"docs_generated": "Documentación generada",
"import_collections": "Importar colecciones",
"optional": "(opcional)",
"json": "JSON",
"none": "Nada",
"username": "Nombre de usuario",
"password": "Contrasaeña",
"token": "Token",
"payload": "Carga",
"choose_file": "Seleccione un archivo",
"file_imported": "Archivo imporado",
"f12_details": "(F12 para ver detalles)",
"we_use_cookies": "Usamos las cookies",
"copied_to_clipboard": "Copiado al portapapeles",
"finished_in": "Terminado en {duration}ms",
"check_console_details": "Verifique la consola para más detalles.",
"download_started": "Inició la descarga",
"url_invalid_format": "La URL no está formateado apropiadamente",
"curl_invalid_format": "El cURL no está formateado apropiadamente",
"enable_proxy": "Pruebe habilitando el Proxy",
"complete_config_urls": "Por favor, termine la configuración de las urls.",
"token_request_saved": "La petición de tToken ha sido guardada",
"donate_info1": "Si le ha gustado su productividad usando Postwoman, considere hacer una donación como un signo de su apreciación.",
"donate_info2": "Puede ayudar al desarrollo de Postwoman mediante los siguientes métodos:",
"one_time_recurring": "Una vez o recurrente",
"one_time": "Una vez",
"recurring": "Recurrente",
"wiki": "Wiki",
"error": "Error",
"go_home": "Ir al inicio",
"reload": "Recargar",
"enter_curl": "Intruduzca cURL",
"empty": "Vacío",
"extensions": "Extensiones",
"extensions_info1": "Extensión del navegador que simplifica el acceso a Postwoman",
"extensions_info2": "Obtener la extensión del navegador de Postwoman!",
"installed": "Instalado",
"login_with": "Iniciar sesión con",
"logged_out": "Sesión cerreda",
"logout": "Cerrar sesión",
"account": "Cuenta",
"sync": "Sync",
"syncHistory": "Historial",
"syncCollections": "Colecciones",
"syncEnvironments": "Environments",
"turn_on": "Encender",
"login_first": "Inicie sesión primero",
"paste_a_collection": "Pegar una Colección",
"import_from_sync": "Importar desde Sync"
}

View File

@@ -1,90 +0,0 @@
export default {
home: "خانه",
realtime: "بلادرنگ",
graphql: "GraphQL",
settings: "تنظیمات",
request: "درخواست",
install_pwa: "نصب PWA",
support_us: "از ما حمایت کنید",
tweet: "Tweet",
options: "گزینه‌ها",
communication: "ارتباط",
endpoint: "Endpoint",
schema: "Schema",
theme: "پوسته",
subscribe: "اشتراک",
choose_language: "تغییر زبان",
shortcuts: "میانبرها",
send_request: "ارسال درخواست",
save_to_collections: "ذخیره در کلکسیون",
copy_request_link: "کپی لینک درخواست",
reset_request: "بازنشانی درخواست",
support_us_on: "حمایت از ما از طریق",
open_collective: "Open Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "کد JavaScript",
method: "متد",
path: "مسیر",
label: "برچسب",
again: "دوباره",
content_type: "Content Type",
raw_input: "ورودی raw",
parameter_list: "لیست پارامترها",
raw_request_body: "Raw Request Body",
show_code: "نمایش کد",
hide_code: "عدم نمایش کد",
show_prerequest_script: "Show Pre-Request Script",
hide_prerequest_script: "Hide Pre-Request Script",
authentication: "Authentication",
authentication_type: "Authentication type",
include_in_url: "در URL گنجانده شود",
parameters: "پارامترها",
expand_response: "نمایش کامل پاسخ",
collapse_response: "نمایش مختصر پاسخ",
hide_preview: "مخفی کردن نمایش",
preview_html: "نمایش HTML",
history: "تاریخچه",
collections: "کلکسیون",
import_curl: "وارد کردن cURL",
import: "وارد کردن",
generate_code: "تولید کد",
request_type: "Request type",
generated_code: "کد تولید شده",
status: "Status",
headers: "Headers",
websocket: "WebSocket",
waiting_for_connection: "(منتظر برقراری اتصال)",
message: "پیام",
sse: "SSE",
server: "سرور",
events: "رویداد",
url: "URL",
get_schema: "دریافت Schema",
header_list: "لیست Header",
add_new: "افزودن",
response: "Response",
query: "Query",
queries: "Queries",
query_variables: "Variables",
mutations: "Mutations",
subscriptions: "Subscriptions",
types: "Types",
send: "ارسال",
background: "پس زمینه",
color: "رنگ",
labels: "برچسب‌ها",
multi_color: "چند رنگی",
enabled: "فعال",
disabled: "غیر فعال",
proxy: "پراکسی",
postwoman_official_proxy_hosting:
"پراکسی Postwoman برروی هاست ApolloTV قرار دارد.",
read_the: "بخوانید",
apollotv_privacy_policy: "خط مشی رازداری ApolloTV",
contact_us: "Contact us",
connect: "Connect",
disconnect: "Disconnect",
start: "Start",
stop: "Stop"
};

92
lang/fa-IR.json Normal file
View File

@@ -0,0 +1,92 @@
{
"home": "خانه",
"realtime": "بلادرنگ",
"graphql": "GraphQL",
"settings": "تنظیمات",
"request": "درخواست",
"install_pwa": "نصب PWA",
"support_us": "از ما حمایت کنید",
"tweet": "Tweet",
"options": "گزینه‌ها",
"communication": "ارتباط",
"endpoint": "Endpoint",
"schema": "Schema",
"theme": "پوسته",
"subscribe": "اشتراک",
"choose_language": "تغییر زبان",
"shortcuts": "میانبرها",
"send_request": "ارسال درخواست",
"save_to_collections": "ذخیره در کلکسیون",
"copy_request_link": "کپی لینک درخواست",
"reset_request": "بازنشانی درخواست",
"support_us_on": "حمایت از ما از طریق",
"open_collective": "Open Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "کد JavaScript",
"method": "متد",
"path": "مسیر",
"label": "برچسب",
"again": "دوباره",
"content_type": "Content Type",
"raw_input": "ورودی raw",
"parameter_list": "لیست پارامترها",
"raw_request_body": "Raw Request Body",
"show_code": "نمایش کد",
"hide_code": "عدم نمایش کد",
"show_prerequest_script": "Show Pre-Request Script",
"hide_prerequest_script": "Hide Pre-Request Script",
"authentication": "Authentication",
"authentication_type": "Authentication type",
"include_in_url": "در URL گنجانده شود",
"parameters": "پارامترها",
"expand_response": "نمایش کامل پاسخ",
"collapse_response": "نمایش مختصر پاسخ",
"hide_preview": "مخفی کردن نمایش",
"preview_html": "نمایش HTML",
"history": "تاریخچه",
"collections": "کلکسیون",
"import_curl": "وارد کردن cURL",
"import": "وارد کردن",
"generate_code": "تولید کد",
"request_type": "Request type",
"generated_code": "کد تولید شده",
"status": "Status",
"headers": "Headers",
"websocket": "WebSocket",
"waiting_for_connection": "(منتظر برقراری اتصال)",
"message": "پیام",
"sse": "SSE",
"server": "سرور",
"events": "رویداد",
"url": "URL",
"get_schema": "دریافت Schema",
"header_list": "لیست Header",
"add_new": "افزودن",
"response": "Response",
"query": "Query",
"queries": "Queries",
"query_variables": "Variables",
"mutations": "Mutations",
"subscriptions": "Subscriptions",
"types": "Types",
"send": "ارسال",
"background": "پس زمینه",
"color": "رنگ",
"labels": "برچسب‌ها",
"multi_color": "چند رنگی",
"enabled": "فعال",
"disabled": "غیر فعال",
"proxy": "پراکسی",
"postwoman_official_proxy_hosting": "پراکسی Postwoman برروی هاست Apollo Software قرار دارد.",
"read_the": "بخوانید",
"apollosw_privacy_policy": "خط مشی رازداری Apollo Software",
"contact_us": "Contact us",
"connect": "Connect",
"disconnect": "Disconnect",
"start": "Start",
"stop": "Stop",
"syncHistory": "History",
"syncCollections": "Collections",
"syncEnvironments": "Environments"
}

View File

@@ -1,90 +0,0 @@
export default {
home: "Accueil",
realtime: "Temps réel",
graphql: "GraphQL",
settings: "Paramètres",
request: "Request",
install_pwa: "Installer la PWA",
support_us: "Nous supporter",
tweet: "Tweeter",
options: "Options",
communication: "Communication",
endpoint: "Endpoint",
schema: "Schéma",
theme: "Thème",
subscribe: "S'inscrire",
choose_language: "Sélectionner une langue",
shortcuts: "Raccourcis",
send_request: "Envoyer la requête",
save_to_collections: "Sauvegarder dans les collections",
copy_request_link: "Copier le lien de la requête",
reset_request: "Réinitialiser la requête",
support_us_on: "Supportez-nous sur",
open_collective: "Ouvrir Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "Code JavaScript",
method: "Méthode",
path: "Chemin d'accès",
label: "Libellé",
again: "Réessayer",
content_type: "Type de contenu",
raw_input: "Texte brut",
parameter_list: "Liste des paramètres",
raw_request_body: "Corps de la requête en texte brut",
show_code: "Afficher le code",
hide_code: "Masquer le code",
show_prerequest_script: "Afficher le script de pré-requête",
hide_prerequest_script: "Masquer le script de pré-requête",
authentication: "Authentification",
authentication_type: "Type d'authentification",
include_in_url: "Inclure dans l'URL",
parameters: "Paramètres",
expand_response: "Agrandir la réponse",
collapse_response: "Réduire la réponse",
hide_preview: "Masquer la prévisualisation",
preview_html: "Prévisualiser le HTML",
history: "Historique",
collections: "Collections",
import_curl: "Importer en cURL",
importer: "Importer",
generate_code: "Générer le code",
request_type: "Type de requête",
generated_code: "Code généré",
status: "Statut",
headers: "En-têtes",
websocket: "WebSocket",
waiting_for_connection: "(en attente de connexion)",
message: "Message",
sse: "SSE",
server: "Serveur",
events: "Évènements",
url: "URL",
get_schema: "Récuperer le schéma",
header_list: "Liste d'en-têtes",
add_new: "Ajouter",
response: "Réponse",
query: "Requête",
queries: "Requêtes",
query_variables: "Variables",
mutations: "Mutations",
subscriptions: "Abonnements",
types: "Types",
send: "Envoyer",
background: "Arrière-plan",
color: "Couleur",
labels: "Libellés",
multi_color: "Multi-couleurs",
enabled: "Activé",
disabled: "Désactivé",
proxy: "Proxy",
postwoman_official_proxy_hosting:
"Le proxy officiel de Postwoman est hébergé par ApolloTV.",
read_the: "Lire la",
apollotv_privacy_policy: "politique de confidentialité ApolloTV",
contact_us: "Contactez nous",
connect: "Relier",
disconnect: "Déconnecter",
start: "Début",
stop: "Arrêtez"
};

260
lang/fr-FR.json Normal file
View File

@@ -0,0 +1,260 @@
{
"home": "Accueil",
"realtime": "Temps réel",
"graphql": "GraphQL",
"settings": "Paramètres",
"request": "Request",
"install_pwa": "Installer la PWA",
"support_us": "Nous supporter",
"tweet": "Tweeter",
"options": "Options",
"communication": "Communication",
"endpoint": "Endpoint",
"schema": "Schéma",
"theme": "Thème",
"subscribe": "S'inscrire",
"choose_language": "Sélectionner une langue",
"shortcuts": "Raccourcis",
"send_request": "Envoyer la requête",
"save_to_collections": "Sauvegarder dans les collections",
"copy_request_link": "Copier le lien de la requête",
"reset_request": "Réinitialiser la requête",
"support_us_on": "Supportez-nous sur",
"open_collective": "Ouvrir Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "Code JavaScript",
"method": "Méthode",
"path": "Chemin d'accès",
"label": "Libellé",
"again": "Réessayer",
"content_type": "Type de contenu",
"raw_input": "Texte brut",
"parameter_list": "Liste des paramètres",
"raw_request_body": "Corps de la requête en texte brut",
"show_code": "Afficher le code",
"hide_code": "Masquer le code",
"show_prerequest_script": "Afficher le script de pré-requête",
"hide_prerequest_script": "Masquer le script de pré-requête",
"authentication": "Authentification",
"authentication_type": "Type d'authentification",
"include_in_url": "Inclure dans l'URL",
"parameters": "Paramètres",
"expand_response": "Agrandir la réponse",
"collapse_response": "Réduire la réponse",
"hide_preview": "Masquer la prévisualisation",
"preview_html": "Prévisualiser le HTML",
"history": "Historique",
"collections": "Collections",
"import_curl": "Importer en cURL",
"importer": "Importer",
"generate_code": "Générer le code",
"request_type": "Type de requête",
"generated_code": "Code généré",
"status": "Statut",
"headers": "En-têtes",
"websocket": "WebSocket",
"waiting_for_connection": "(en attente de connexion)",
"message": "Message",
"sse": "SSE",
"server": "Serveur",
"events": "Évènements",
"url": "URL",
"get_schema": "Récuperer le schéma",
"header_list": "Liste d'en-têtes",
"add_new": "Ajouter",
"response": "Réponse",
"query": "Requête",
"queries": "Requêtes",
"query_variables": "Variables",
"mutations": "Mutations",
"subscriptions": "Abonnements",
"types": "Types",
"send": "Envoyer",
"background": "Arrière-plan",
"color": "Couleur",
"labels": "Libellés",
"multi_color": "Multi-couleurs",
"enabled": "Activé",
"disabled": "Désactivé",
"proxy": "Proxy",
"postwoman_official_proxy_hosting": "Le proxy officiel de Postwoman est hébergé par Apollo Software.",
"read_the": "Lire la",
"apollosw_privacy_policy": "politique de confidentialité Apollo Software",
"contact_us": "Contactez nous",
"connect": "Relier",
"disconnect": "Déconnecter",
"start": "Début",
"stop": "Arrêtez",
"access_token": "Token d'accès",
"token_list": "Liste des Tokens",
"get_token": "Obtenir un nouveau Token",
"manage_token": "Gérer le Token",
"save_token": "Sauvegarder le Token",
"use_token": "Utiliser un Token",
"request_token": "Demander un Token",
"save_token_req": "Sauvegarder la requête ",
"manage_token_req": "Gérer la requête avec Token",
"use_token_req": "Utiliser la requête avec Token",
"token_req_name": "Nom de la requête",
"token_req_details": "Détails de la requête",
"token_name": "Nom du Token",
"oidc_discovery_url": "OIDC Discovery URL",
"auth_url": "Auth URL",
"access_token_url": "URL du Token d'accès",
"client_id": "Client ID",
"scope": "Scope",
"state": "État",
"token_req_list": "Liste des requêtes avec Token",
"no_path": "Aucun chemin",
"no_label": "Aucun label",
"prerequest_script": "Pre-Request Script",
"no_prerequest_script": "No pre-request script",
"search": "Historique de la recherche",
"history_empty": "L'historique est vide",
"history_deleted": "Historique supprimé",
"clear": "Nettoyer",
"clear_all": "Tout nettoyer",
"cleared": "Nettoyé",
"close": "Fermer",
"sort": "Trier",
"time": "Temps",
"duration": "Durée",
"no_duration": "Aucune durée",
"show_more": "Plus d'informations",
"hide_more": "Moins d'informations",
"collection": "Collection",
"current_collection": "Collection Actuelle",
"select_collection": "Selectionner une Collection",
"create_collection": "Créer une Collection",
"new": "Nouveau",
"import_export": "Importer / Exporter",
"more": "Plus",
"folder": "Dossier",
"new_folder": "Nouveau Dossier",
"my_new_folder": "Mon Nouveau Dossier",
"folder_empty": "Ce Dossier est vide",
"edit_folder": "Éditer le Dossier",
"edit": "Éditer",
"delete": "Supprimer",
"deleted": "Supprimé",
"undo": "Annuler",
"collection_empty": "Cette Collection est vide",
"new_collection": "Nouvelle Collection",
"my_new_collection": "Ma Nouvelle Collection",
"edit_collection": "Éditer la Collection",
"edit_request": "Éditer ma requête",
"save_request_as": "Sauvegarder ma requête sous",
"export": "Exporter",
"connecting_to": "Connexion à {name}...",
"connected": "Connecté",
"connected_to": "Connecté à {name}",
"disconnected": "Déconnecté",
"disconnected_from": "Déconnecté sur {name}",
"something_went_wrong": "Quelque chose n'a pas marché!",
"error_occurred": "Une erreur s'est produite.",
"browser_support_sse": "Ce navigateur ne semble pas prendre en charge les événements envoyés par le serveur.",
"log": "Log",
"no_url": "Aucune URL",
"run_query": "Lancer une recherche",
"copy_query": "Copier la recherche",
"kinda_dark": "Plutôt Sombre",
"clearly_white": "Clairement Blanc",
"just_black": "Seulement Noir",
"auto_system": "Auth (système)",
"green": "Vert",
"yellow": "Jaune",
"pink": "Rose",
"red": "Rouge",
"purple": "Violet",
"orange": "Orange",
"cyan": "Cyan",
"blue": "Bleue",
"loading": "Chargement...",
"fetching": "Récupération...",
"waiting_send_req": "(en attente de l'envoi de la demande)",
"cancel": "Annuler",
"save": "Sauvarder",
"dismiss": "Dismiss",
"are_you_sure": "Êtes-vous sûr?",
"yes": "Oui",
"no": "Non",
"restore": "Restaurer",
"add_star": "Ajouter une étoile",
"remove_star": "Supprimer une étoile",
"nothing_found": "Rien n'a été trouvé",
"replace_current": "Remplacer l'actuel",
"replace_json": "Replacer avec du JSON",
"preserve_current": "Conserver l'actuel",
"import_json": "Importer depuis un JSON",
"download_file": "Télécharger un fichier",
"upload_file": "Charger un fichier",
"copy_response": "Copier la réponse",
"copy_code": "Copier le code",
"copy_schema": "Copier le Schéma",
"use_request": "Utiliser cette requête",
"documentation": "Documentation",
"docs": "Docs",
"reset_default": "Rétablir la valeur par défaut",
"fields": "CHAMPS",
"deprecated": "DÉPRÉCIÉ",
"add_one_header": "(ajouter au moins un en-tête)",
"add_one_parameter": "(ajouter au moins un paramètre)",
"header_count": "{count} en-tête",
"parameter_count": "{count} paramètre",
"variable_count": "{count} variable",
"value_count": "{count} valeur",
"send_request_first": "Envoyez d'abord une requête",
"generate_docs": "Genérer une Documentation",
"generate_docs_message": "Importer n'importe quelle collection de Postwoman pour générer de la documentation en déplacement.",
"generate_docs_first": "Générer la documentation d'abord",
"docs_generated": "Documentation générée",
"import_collections": "Importer les collections",
"optional": "(optionnel)",
"json": "JSON",
"none": "Aucun",
"username": "Username",
"password": "Password",
"token": "Token",
"payload": "Payload",
"choose_file": "Choisir un fichier",
"file_imported": "Fichier importé",
"f12_details": "(F12 pour voir les détails)",
"we_use_cookies": "Nous utilisons des cookies",
"copied_to_clipboard": "Copié dans le presse-papier",
"finished_in": "Fini en {duration}ms",
"check_console_details": "Consultez la console pour plus de détails.",
"download_started": "Téléchargement démarré",
"url_invalid_format": "L'URL n'est pas formatée correctement",
"curl_invalid_format": "cURL n'est pas formaté correctement",
"enable_proxy": "Essayez en activant le Proxy",
"complete_config_urls": "Veuillez compléter les urls de configuration.",
"token_request_saved": "Requête de Token sauvegardé",
"donate_info1": "Si vous avez apprécié la productivité de l'utilisation de Postwoman, considérez le don comme un signe d'appréciation.",
"donate_info2": "Vous pouvez soutenir le développement de Postwoman par les méthodes suivantes :",
"one_time_recurring": "Ponctuel ou récurrent",
"one_time": "Une fois",
"recurring": "Récurrent",
"wiki": "Wiki",
"error": "Erreur",
"go_home": "Aller à l'accueil",
"reload": "Recharger",
"enter_curl": "Entrer cURL",
"empty": "Vide",
"extensions": "Extensions",
"extensions_info1": "Extension pour navigateur qui simplifie l'accès à Postwoman",
"extensions_info2": "Obtenez l'extension Postwoman pour navigateur !",
"installed": "Installé",
"login_with": "Se connecter avec",
"logged_out": "Se déconnecter",
"logout": "Déconnexion",
"account": "Compte",
"sync": "Synchroniser",
"syncHistory": "Historique",
"syncCollections": "Collections",
"syncEnvironments": "Environments",
"turn_on": "Activer",
"login_first": "Se connecter d'abord",
"paste_a_collection": "Coller une collection",
"import_from_sync": "Importer depuis la synchronisation"
}

View File

@@ -1,90 +0,0 @@
export default {
home: "Beranda",
realtime: "Waktu Nyata",
graphql: "GraphQL",
settings: "Pengaturan",
request: "Permintaan",
install_pwa: "Pasang PWA",
support_us: "Dukung kami",
tweet: "Cuitkan",
options: "Opsi",
communication: "Komunikasi",
endpoint: "Titik Akhir",
schema: "Skema",
theme: "Tema",
subscribe: "Berlangganan",
choose_language: "Pilih Bahasa",
shortcuts: "Pintasan",
send_request: "Kirim Permintaan",
save_to_collections: "Simpan ke Koleksi",
copy_request_link: "Salin Tautan Permintaan",
reset_request: "Atur Ulang Permintaan",
support_us_on: "Dukung kami di",
open_collective: "Open Collective",
paypal: "Paypal",
patreon: "Patreon",
javascript_code: "Kode Javascript",
method: "Metode",
path: "Lintasan",
label: "Label",
again: "Lagi",
content_type: "Jenis Konten",
raw_input: "Masukan mentah",
parameter_list: "Daftar parameter",
raw_request_body: "Badan Permintaan Mentah",
show_code: "Tampilkan Kode",
hide_code: "Sembunyikan Kode",
show_prerequest_script: "Tampilkan Skrip Pra-Permintaan",
hide_prerequest_script: "Sembunyikan Skrip Pra-Permintaan",
authentication: "Autentikasi",
authentication_type: "Jenis Autentikasi",
include_in_url: "Sertakan di URL",
parameters: "Parameter",
expand_response: "Bentangkan Balasan",
collapse_response: "Ciutkan Balasan",
hide_preview: "Sembunyikan Pratinjau",
preview_html: "Pratinjau HTML",
history: "Riwayat",
collections: "Koleksi",
import_curl: "Impor cURL",
import: "Impor",
generate_code: "Hasilkan kode",
request_type: "Jenis permintaan",
generated_code: "Kode yang dihasilkan",
status: "Status",
headers: "Header",
websocket: "WebSocket",
waiting_for_connection: "(Menunggu sambungan)",
message: "Pesan",
sse: "SSE",
server: "Peladen",
events: "Kejadian",
url: "URL",
get_schema: "Ambil skema",
header_list: "Daftar header",
add_new: "Tambah baru",
response: "Balasan",
query: "Kueri",
queries: "Kueri",
query_variables: "Variables",
mutations: "Mutasi",
subscriptions: "Langganan",
types: "Jenis",
send: "Kirim",
background: "Latar belakang",
color: "Warna",
labels: "Label",
multi_color: "Warna beragam",
enabled: "diaktifkan",
disabled: "dinonaktifkan",
proxy: "Proksi",
postwoman_official_proxy_hosting:
"Proksi Resmi Postwoman dalam penginangan ApolloTV.",
read_the: "Bacalah",
apollotv_privacy_policy: "kebijakan privasi ApolloTV",
contact_us: "Hubungi kami",
connect: "Menghubungkan",
disconnect: "Memutuskan",
start: "Mulai",
stop: "Berhenti"
};

92
lang/id-ID.json Normal file
View File

@@ -0,0 +1,92 @@
{
"home": "Beranda",
"realtime": "Waktu Nyata",
"graphql": "GraphQL",
"settings": "Pengaturan",
"request": "Permintaan",
"install_pwa": "Pasang PWA",
"support_us": "Dukung kami",
"tweet": "Cuitkan",
"options": "Opsi",
"communication": "Komunikasi",
"endpoint": "Titik Akhir",
"schema": "Skema",
"theme": "Tema",
"subscribe": "Berlangganan",
"choose_language": "Pilih Bahasa",
"shortcuts": "Pintasan",
"send_request": "Kirim Permintaan",
"save_to_collections": "Simpan ke Koleksi",
"copy_request_link": "Salin Tautan Permintaan",
"reset_request": "Atur Ulang Permintaan",
"support_us_on": "Dukung kami di",
"open_collective": "Open Collective",
"paypal": "Paypal",
"patreon": "Patreon",
"javascript_code": "Kode Javascript",
"method": "Metode",
"path": "Lintasan",
"label": "Label",
"again": "Lagi",
"content_type": "Jenis Konten",
"raw_input": "Masukan mentah",
"parameter_list": "Daftar parameter",
"raw_request_body": "Badan Permintaan Mentah",
"show_code": "Tampilkan Kode",
"hide_code": "Sembunyikan Kode",
"show_prerequest_script": "Tampilkan Skrip Pra-Permintaan",
"hide_prerequest_script": "Sembunyikan Skrip Pra-Permintaan",
"authentication": "Autentikasi",
"authentication_type": "Jenis Autentikasi",
"include_in_url": "Sertakan di URL",
"parameters": "Parameter",
"expand_response": "Bentangkan Balasan",
"collapse_response": "Ciutkan Balasan",
"hide_preview": "Sembunyikan Pratinjau",
"preview_html": "Pratinjau HTML",
"history": "Riwayat",
"collections": "Koleksi",
"import_curl": "Impor cURL",
"import": "Impor",
"generate_code": "Hasilkan kode",
"request_type": "Jenis permintaan",
"generated_code": "Kode yang dihasilkan",
"status": "Status",
"headers": "Header",
"websocket": "WebSocket",
"waiting_for_connection": "(Menunggu sambungan)",
"message": "Pesan",
"sse": "SSE",
"server": "Peladen",
"events": "Kejadian",
"url": "URL",
"get_schema": "Ambil skema",
"header_list": "Daftar header",
"add_new": "Tambah baru",
"response": "Balasan",
"query": "Kueri",
"queries": "Kueri",
"query_variables": "Variables",
"mutations": "Mutasi",
"subscriptions": "Langganan",
"types": "Jenis",
"send": "Kirim",
"background": "Latar belakang",
"color": "Warna",
"labels": "Label",
"multi_color": "Warna beragam",
"enabled": "diaktifkan",
"disabled": "dinonaktifkan",
"proxy": "Proksi",
"postwoman_official_proxy_hosting": "Proksi Resmi Postwoman dalam penginangan Apollo Software.",
"read_the": "Bacalah",
"apollosw_privacy_policy": "kebijakan privasi Apollo Software",
"contact_us": "Hubungi kami",
"connect": "Menghubungkan",
"disconnect": "Memutuskan",
"start": "Mulai",
"stop": "Berhenti",
"syncHistory": "History",
"syncCollections": "Collections",
"syncEnvironments": "Environments"
}

View File

@@ -1,245 +0,0 @@
export default {
home: "ホーム",
realtime: "リアルタイム",
graphql: "GraphQL",
settings: "設定",
request: "リクエスト",
install_pwa: "PWAをインストール",
support_us: "寄付",
tweet: "ツイート",
options: "オプション",
communication: "通信",
endpoint: "エンドポイント",
schema: "スキーマ",
theme: "テーマ",
subscribe: "登録",
choose_language: "言語の選択",
shortcuts: "ショートカット",
send_request: "リクエストを送信",
save_to_collections: "コレクションに保存",
copy_request_link: "リクエストURLをコピー",
reset_request: "リクエストをリセット",
support_us_on: "以下より寄付",
open_collective: "Open Collective",
paypal: "PayPal",
patreon: "Patreon",
javascript_code: "JavaScriptコード",
method: "メソッド",
path: "パス",
label: "ラベル",
again: "",
content_type: "Content Type",
raw_input: "Raw入力",
parameter_list: "パラメータリスト",
raw_request_body: "Rawリクエストボディー",
show_code: "コードを表示",
hide_code: "コードを非表示",
show_prerequest_script: "プレリクエストスクリプトを表示",
hide_prerequest_script: "プレリクエストスクリプトを非表示",
authentication: "認証",
authentication_type: "認証タイプ",
include_in_url: "URLに含む",
parameters: "パラメータ",
expand_response: "レスポンスを広げる",
collapse_response: "レスポンスを狭める",
hide_preview: "プレビューしない",
preview_html: "HTMLプレビュー表示",
history: "履歴",
collections: "コレクション",
import_curl: "cURLをインポート",
import: "インポート",
generate_code: "コード生成",
request_type: "リクエストタイプ",
generated_code: "生成されたコード",
status: "ステータス",
headers: "ヘッダー",
websocket: "ウェブソケット",
waiting_for_connection: "(接続待ち)",
message: "メッセージ",
sse: "SSE",
server: "サーバ",
events: "イベント",
url: "URL",
get_schema: "スキーマを取得",
header_list: "ヘッダーリスト",
add_new: "追加",
response: "レスポンス",
query: "クエリ",
queries: "クエリ",
query_variables: "変数",
mutations: "ミューテーション",
subscriptions: "サブスクリプション",
types: "タイプ",
send: "送信",
background: "背景",
color: "色",
labels: "ラベル",
multi_color: "マルチカラー",
enabled: "有効",
disabled: "無効",
proxy: "プロキシ",
postwoman_official_proxy_hosting:
"Postwomanの公式プロキシは、Apollo TVがホストしています。",
read_the: "プライバシーポリシー",
apollotv_privacy_policy: "を読む",
contact_us: "お問い合わせ",
connect: "接続",
disconnect: "切断",
start: "開始",
stop: "停止",
access_token: "アクセストークン",
token_list: "トークンリスト",
get_token: "新しいトークンを取得",
manage_token: "アクセストークンを管理",
save_token: "アクセストークンを保存",
use_token: "アクセストークンを使用",
request_token: "トークンをリクエスト",
save_token_req: "トークンリクエストを保存",
manage_token_req: "トークンリクエストを管理",
use_token_req: "トークンリクエストを使用",
token_req_name: "リクエスト名",
token_req_details: "リクエスト詳細",
token_name: "トークン名",
oidc_discovery_url: "OIDC Discovery URL",
auth_url: "認証URL",
access_token_url: "アクセストークンURL",
client_id: "クライアントID",
scope: "スコープ",
state: "ステート",
token_req_list: "トークンリクエストリスト",
no_path: "パス無し",
no_label: "ラベル無し",
prerequest_script: "プレリクエストスクリプト",
no_prerequest_script: "プレリクエストスクリプト無し",
search_history: "検索履歴",
history_empty: "履歴が空です",
history_deleted: "履歴が削除された",
clear: "クリア",
clear_all: "全てクリア",
cleared: "クリアされた",
close: "閉じる",
sort: "ソート",
time: "時間",
duration: "期間",
no_duration: "期間なし",
show_more: "もっと表示する",
hide_more: "隠す",
collection: "コレクション",
current_collection: "現在のコレクション",
select_collection: "コレクションを選択",
create_collection: "コレクションを作成",
new: "新規",
import_export: "インポート・エクスポート",
more: "More",
folder: "フォルダ",
new_folder: "新しいフォルダー",
my_new_folder: "私の新しいフォルダー",
folder_empty: "フォルダーが空です",
edit_folder: "フォルダーを編集",
edit: "編集",
delete: "削除",
deleted: "削除された",
undo: "元に戻す",
collection_empty: "コレクションが空です",
new_collection: "新しいコレクション",
my_new_collection: "私の新しいコレクション",
edit_collection: "コレクションを編集",
edit_request: "リクエストを編集",
save_request_as: "名前を付けてリクエストを保存",
export: "エクスポート",
connecting_to: "{name}に接続中...",
connected: "接続した",
connected_to: "{name}に接続した",
disconnected: "切断された",
disconnected_from: "{name}から切断された",
something_went_wrong: "何かの問題が起きた",
error_occurred: "エラーが発生した",
browser_support_sse: "このブラウザはサーバー送信イベントのサポートがないようです。",
log: "ログ",
no_url: "URL無し",
run_query: "クエリを実行",
copy_query: "クエリをコピー",
kinda_dark: "ちょっと暗い",
clearly_white: "明らかに白",
just_black: "ただの黒",
auto_system: "オート(システム)",
green: "緑",
yellow: "黄",
pink: "ピンク",
red: "赤",
purple: "紫",
orange: "オレンジ",
cyan: "シヤン",
blue: "青",
loading: "ロード中...",
fetching: "フェッチ中...",
waiting_send_req: "(リクエスト送信待ち)",
cancel: "キャンセル",
save: "保存",
dismiss: "Dismiss",
are_you_sure: "よろしいですか?",
yes: "はい",
no: "いいえ",
restore: "リストア",
add_star: "星を付ける",
remove_star: "星を外す",
nothing_found: "何も見つからない",
replace_current: "置換",
replace_json: "JSONに置換",
preserve_current: "保持",
import_json: "JSONをインポート",
download_file: "ファイルをダウンロード",
upload_file: "ファイルをアップロード",
copy_response: "レスポンスをコピー",
copy_code: "コードをコピー",
copy_schema: "スキーマをコピー",
use_request: "リクエストを使用",
documentation: "ドキュメンテーション",
docs: "ドキュメント",
reset_default: "デフォルトにリセット",
fields: "FIELDS",
deprecated: "DEPRECATED",
add_one_header: "ヘッダーを少なくとも1つ追加してください",
add_one_parameter: "パラメータを少なくとも1つ追加してください",
header_count: "ヘッダー {count}",
parameter_count: "パラメータ {count}",
variable_count: "変数 {count}",
value_count: "値 {count}",
send_request_first: "リクエストを先に送信してください",
generate_docs: "ドキュメンテーションを生成",
generate_docs_message: "Postwomanのコレクションをインポートし、直ちにドキュメンテーションを生成",
generate_docs_first: "ドキュメントを先に生成してください",
docs_generated: "ドキュメンテーションを生成した",
import_collections: "コレクションをインポート",
optional: "(オプション)",
json: "JSON",
none: "なし",
username: "ユーザー名",
password: "パスワード",
token: "トークン",
payload: "ペイロード",
choose_file: "ファイルを選択",
file_imported: "ファイルをインポートした",
f12_details: "F12を押して詳細を確認してください",
we_use_cookies: "クッキーを使用します。",
copied_to_clipboard: "クリップボードにコピーした",
finished_in: "{duration}msで終了した",
check_console_details: "コンソールより詳細を確認してください",
download_started: "ダウンロードを開始した",
url_invalid_format: "URLが正しくフォーマットされていない",
curl_invalid_format: "cURLが正しくフォーマットされていない",
enable_proxy: "プロキシを有効にしてみてください",
complete_config_urls: "設定URLsを入力してください",
token_request_saved: "トークンリクエストを保存した",
donate_info1: "Postwomanを非常に役に立つと思われる場合、感謝の印として寄付のご検討をお願いします。",
donate_info2: "以下の方法でPostwomanの開発をサポートできます",
one_time_recurring: "一度又は定期的",
one_time: "一度",
recurring: "定期的",
wiki: "Wiki",
error: "エラー",
go_home: "ホームに戻る",
reload: "リロード",
enter_curl: "cURLを入力",
empty: "空"
};

247
lang/ja-JP.json Normal file
View File

@@ -0,0 +1,247 @@
{
"home": "ホーム",
"realtime": "リアルタイム",
"graphql": "GraphQL",
"settings": "設定",
"request": "リクエスト",
"install_pwa": "PWAをインストール",
"support_us": "寄付",
"tweet": "ツイート",
"options": "オプション",
"communication": "通信",
"endpoint": "エンドポイント",
"schema": "スキーマ",
"theme": "テーマ",
"subscribe": "登録",
"choose_language": "言語の選択",
"shortcuts": "ショートカット",
"send_request": "リクエストを送信",
"save_to_collections": "コレクションに保存",
"copy_request_link": "リクエストURLをコピー",
"reset_request": "リクエストをリセット",
"support_us_on": "以下より寄付",
"open_collective": "Open Collective",
"paypal": "PayPal",
"patreon": "Patreon",
"javascript_code": "JavaScriptコード",
"method": "メソッド",
"path": "パス",
"label": "ラベル",
"again": "",
"content_type": "Content Type",
"raw_input": "Raw入力",
"parameter_list": "パラメータリスト",
"raw_request_body": "Rawリクエストボディー",
"show_code": "コードを表示",
"hide_code": "コードを非表示",
"show_prerequest_script": "プレリクエストスクリプトを表示",
"hide_prerequest_script": "プレリクエストスクリプトを非表示",
"authentication": "認証",
"authentication_type": "認証タイプ",
"include_in_url": "URLに含む",
"parameters": "パラメータ",
"expand_response": "レスポンスを広げる",
"collapse_response": "レスポンスを狭める",
"hide_preview": "プレビューしない",
"preview_html": "HTMLプレビュー表示",
"history": "履歴",
"collections": "コレクション",
"import_curl": "cURLをインポート",
"import": "インポート",
"generate_code": "コード生成",
"request_type": "リクエストタイプ",
"generated_code": "生成されたコード",
"status": "ステータス",
"headers": "ヘッダー",
"websocket": "ウェブソケット",
"waiting_for_connection": "(接続待ち)",
"message": "メッセージ",
"sse": "SSE",
"server": "サーバ",
"events": "イベント",
"url": "URL",
"get_schema": "スキーマを取得",
"header_list": "ヘッダーリスト",
"add_new": "追加",
"response": "レスポンス",
"query": "クエリ",
"queries": "クエリ",
"query_variables": "変数",
"mutations": "ミューテーション",
"subscriptions": "サブスクリプション",
"types": "タイプ",
"send": "送信",
"background": "背景",
"color": "色",
"labels": "ラベル",
"multi_color": "マルチカラー",
"enabled": "有効",
"disabled": "無効",
"proxy": "プロキシ",
"postwoman_official_proxy_hosting": "Postwomanの公式プロキシは、Apollo Softwareがホストしています。",
"read_the": "プライバシーポリシー",
"apollosw_privacy_policy": "を読む",
"contact_us": "お問い合わせ",
"connect": "接続",
"disconnect": "切断",
"start": "開始",
"stop": "停止",
"access_token": "アクセストークン",
"token_list": "トークンリスト",
"get_token": "新しいトークンを取得",
"manage_token": "アクセストークンを管理",
"save_token": "アクセストークンを保存",
"use_token": "アクセストークンを使用",
"request_token": "トークンをリクエスト",
"save_token_req": "トークンリクエストを保存",
"manage_token_req": "トークンリクエストを管理",
"use_token_req": "トークンリクエストを使用",
"token_req_name": "リクエスト名",
"token_req_details": "リクエスト詳細",
"token_name": "トークン名",
"oidc_discovery_url": "OIDC Discovery URL",
"auth_url": "認証URL",
"access_token_url": "アクセストークンURL",
"client_id": "クライアントID",
"scope": "スコープ",
"state": "ステート",
"token_req_list": "トークンリクエストリスト",
"no_path": "パス無し",
"no_label": "ラベル無し",
"prerequest_script": "プレリクエストスクリプト",
"no_prerequest_script": "プレリクエストスクリプト無し",
"search": "検索履歴",
"history_empty": "履歴が空です",
"history_deleted": "履歴が削除された",
"clear": "クリア",
"clear_all": "全てクリア",
"cleared": "クリアされた",
"close": "閉じる",
"sort": "ソート",
"time": "時間",
"duration": "期間",
"no_duration": "期間なし",
"show_more": "もっと表示する",
"hide_more": "隠す",
"collection": "コレクション",
"current_collection": "現在のコレクション",
"select_collection": "コレクションを選択",
"create_collection": "コレクションを作成",
"new": "新規",
"import_export": "インポート・エクスポート",
"more": "More",
"folder": "フォルダ",
"new_folder": "新しいフォルダー",
"my_new_folder": "私の新しいフォルダー",
"folder_empty": "フォルダーが空です",
"edit_folder": "フォルダーを編集",
"edit": "編集",
"delete": "削除",
"deleted": "削除された",
"undo": "元に戻す",
"collection_empty": "コレクションが空です",
"new_collection": "新しいコレクション",
"my_new_collection": "私の新しいコレクション",
"edit_collection": "コレクションを編集",
"edit_request": "リクエストを編集",
"save_request_as": "名前を付けてリクエストを保存",
"export": "エクスポート",
"connecting_to": "{name}に接続中...",
"connected": "接続した",
"connected_to": "{name}に接続した",
"disconnected": "切断された",
"disconnected_from": "{name}から切断された",
"something_went_wrong": "何かの問題が起きた",
"error_occurred": "エラーが発生した",
"browser_support_sse": "このブラウザはサーバー送信イベントのサポートがないようです。",
"log": "ログ",
"no_url": "URL無し",
"run_query": "クエリを実行",
"copy_query": "クエリをコピー",
"kinda_dark": "ちょっと暗い",
"clearly_white": "明らかに白",
"just_black": "ただの黒",
"auto_system": "オート(システム)",
"green": "緑",
"yellow": "黄",
"pink": "ピンク",
"red": "赤",
"purple": "紫",
"orange": "オレンジ",
"cyan": "シヤン",
"blue": "青",
"loading": "ロード中...",
"fetching": "フェッチ中...",
"waiting_send_req": "(リクエスト送信待ち)",
"cancel": "キャンセル",
"save": "保存",
"dismiss": "Dismiss",
"are_you_sure": "よろしいですか?",
"yes": "はい",
"no": "いいえ",
"restore": "リストア",
"add_star": "星を付ける",
"remove_star": "星を外す",
"nothing_found": "何も見つからない",
"replace_current": "置換",
"replace_json": "JSONに置換",
"preserve_current": "保持",
"import_json": "JSONをインポート",
"download_file": "ファイルをダウンロード",
"upload_file": "ファイルをアップロード",
"copy_response": "レスポンスをコピー",
"copy_code": "コードをコピー",
"copy_schema": "スキーマをコピー",
"use_request": "リクエストを使用",
"documentation": "ドキュメンテーション",
"docs": "ドキュメント",
"reset_default": "デフォルトにリセット",
"fields": "FIELDS",
"deprecated": "DEPRECATED",
"add_one_header": "ヘッダーを少なくとも1つ追加してください",
"add_one_parameter": "パラメータを少なくとも1つ追加してください",
"header_count": "ヘッダー {count}",
"parameter_count": "パラメータ {count}",
"variable_count": "変数 {count}",
"value_count": "値 {count}",
"send_request_first": "リクエストを先に送信してください",
"generate_docs": "ドキュメンテーションを生成",
"generate_docs_message": "Postwomanのコレクションをインポートし、直ちにドキュメンテーションを生成",
"generate_docs_first": "ドキュメントを先に生成してください",
"docs_generated": "ドキュメンテーションを生成した",
"import_collections": "コレクションをインポート",
"optional": "(オプション)",
"json": "JSON",
"none": "なし",
"username": "ユーザー名",
"password": "パスワード",
"token": "トークン",
"payload": "ペイロード",
"choose_file": "ファイルを選択",
"file_imported": "ファイルをインポートした",
"f12_details": "F12を押して詳細を確認してください",
"we_use_cookies": "クッキーを使用します。",
"copied_to_clipboard": "クリップボードにコピーした",
"finished_in": "{duration}msで終了した",
"check_console_details": "コンソールより詳細を確認してください",
"download_started": "ダウンロードを開始した",
"url_invalid_format": "URLが正しくフォーマットされていない",
"curl_invalid_format": "cURLが正しくフォーマットされていない",
"enable_proxy": "プロキシを有効にしてみてください",
"complete_config_urls": "設定URLsを入力してください",
"token_request_saved": "トークンリクエストを保存した",
"donate_info1": "Postwomanを非常に役に立つと思われる場合、感謝の印として寄付のご検討をお願いします。",
"donate_info2": "以下の方法でPostwomanの開発をサポートできます",
"one_time_recurring": "一度又は定期的",
"one_time": "一度",
"recurring": "定期的",
"wiki": "Wiki",
"error": "エラー",
"go_home": "ホームに戻る",
"reload": "リロード",
"enter_curl": "cURLを入力",
"empty": "空",
"syncHistory": "History",
"syncCollections": "Collections",
"syncEnvironments": "Environments"
}

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