diff --git a/assets/js/curlparser.js b/assets/js/curlparser.js index 2bd7ab41b..fb0a2fc39 100644 --- a/assets/js/curlparser.js +++ b/assets/js/curlparser.js @@ -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,7 +8,7 @@ import * as querystring from 'querystring' * @param dataArguments */ const joinDataArguments = dataArguments => { - let data = '' + let data = "" dataArguments.forEach((argument, i) => { if (i === 0) { data += argument @@ -23,23 +23,23 @@ const parseCurlCommand = 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.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 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])) { + if (typeof parsedArguments[argName] === "string") { + if (["http", "www."].includes(parsedArguments[argName])) { url = parsedArguments[argName] } } @@ -56,11 +56,11 @@ const parseCurlCommand = curlCommand => { parsedArguments[headerFieldName] = [parsedArguments[headerFieldName]] } parsedArguments[headerFieldName].forEach(header => { - if (header.includes('Cookie')) { + if (header.includes("Cookie")) { // stupid javascript tricks: closure cookieString = header } else { - let colonIndex = header.indexOf(':') + let colonIndex = header.indexOf(":") let headerName = header.substring(0, colonIndex) let headerValue = header.substring(colonIndex + 1).trim() headers[headerName] = headerValue @@ -69,18 +69,18 @@ const parseCurlCommand = curlCommand => { } } - parseHeaders('H') - parseHeaders('header') + parseHeaders("H") + parseHeaders("header") if (parsedArguments.A) { if (!headers) { headers = [] } - headers['User-Agent'] = parsedArguments.A - } else if (parsedArguments['user-agent']) { + headers["User-Agent"] = parsedArguments.A + } else if (parsedArguments["user-agent"]) { if (!headers) { headers = [] } - headers['User-Agent'] = parsedArguments['user-agent'] + headers["User-Agent"] = parsedArguments["user-agent"] } if (parsedArguments.b) { @@ -97,7 +97,7 @@ const parseCurlCommand = curlCommand => { } 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) + const [key, value] = multipartArgument.split("=", 2) multipartUploads[key] = value }) } @@ -107,33 +107,33 @@ const parseCurlCommand = curlCommand => { } // 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 - if (parsedArguments.X === 'POST') { - method = 'post' - } else if (parsedArguments.X === 'PUT' || parsedArguments['T']) { - method = 'put' - } else if (parsedArguments.X === 'PATCH') { - method = 'patch' - } else if (parsedArguments.X === 'DELETE') { - method = 'delete' - } else if (parsedArguments.X === 'OPTIONS') { - method = 'options' + if (parsedArguments.X === "POST") { + method = "post" + } else if (parsedArguments.X === "PUT" || parsedArguments["T"]) { + method = "put" + } else if (parsedArguments.X === "PATCH") { + method = "patch" + } else if (parsedArguments.X === "DELETE") { + method = "delete" + } else if (parsedArguments.X === "OPTIONS") { + method = "options" } else if ( - (parsedArguments['d'] || - parsedArguments['data'] || - parsedArguments['data-ascii'] || - parsedArguments['data-binary'] || - parsedArguments['F'] || - parsedArguments['form']) && - !(parsedArguments['G'] || parsedArguments['get']) + (parsedArguments["d"] || + parsedArguments["data"] || + parsedArguments["data-ascii"] || + parsedArguments["data-binary"] || + parsedArguments["F"] || + parsedArguments["form"]) && + !(parsedArguments["G"] || parsedArguments["get"]) ) { - method = 'post' - } else if (parsedArguments['I'] || parsedArguments['head']) { - method = 'head' + method = "post" + } else if (parsedArguments["I"] || parsedArguments["head"]) { + method = "head" } else { - method = 'get' + method = "get" } let compressed = !!parsedArguments.compressed @@ -141,20 +141,20 @@ const parseCurlCommand = curlCommand => { // if GET request with data, convert data to query string // NB: the -G flag does not change the http verb. It just moves the data into the url. - if (parsedArguments['G'] || parsedArguments['get']) { - urlObject.query = urlObject.query ? urlObject.query : '' - let option = 'd' in parsedArguments ? 'd' : 'data' in parsedArguments ? 'data' : null + if (parsedArguments["G"] || parsedArguments["get"]) { + urlObject.query = urlObject.query ? urlObject.query : "" + let option = "d" in parsedArguments ? "d" : "data" in parsedArguments ? "data" : null if (option) { - let urlQueryString = '' + let urlQueryString = "" - if (!url.includes('?')) { - url += '?' + if (!url.includes("?")) { + url += "?" } else { - urlQueryString += '&' + urlQueryString += "&" } - if (typeof parsedArguments[option] === 'object') { - urlQueryString += parsedArguments[option].join('&') + if (typeof parsedArguments[option] === "object") { + urlQueryString += parsedArguments[option].join("&") } else { urlQueryString += parsedArguments[option] } @@ -173,7 +173,7 @@ const parseCurlCommand = curlCommand => { urlWithoutQuery: URL.format(urlObject), } if (compressed) { - request['compressed'] = true + request["compressed"] = true } if (Object.keys(query).length > 0) { @@ -182,38 +182,38 @@ const parseCurlCommand = curlCommand => { if (headers) { request.headers = headers } - request['method'] = method + request["method"] = method if (cookies) { request.cookies = cookies - request.cookieString = cookieString.replace('Cookie: ', '') + request.cookieString = cookieString.replace("Cookie: ", "") } if (multipartUploads) { request.multipartUploads = multipartUploads } if (parsedArguments.data) { request.data = parsedArguments.data - } else if (parsedArguments['data-binary']) { - request.data = parsedArguments['data-binary'] + } else if (parsedArguments["data-binary"]) { + request.data = parsedArguments["data-binary"] request.isDataBinary = true - } else if (parsedArguments['d']) { - request.data = parsedArguments['d'] - } else if (parsedArguments['data-ascii']) { - request.data = parsedArguments['data-ascii'] + } else if (parsedArguments["d"]) { + request.data = parsedArguments["d"] + } else if (parsedArguments["data-ascii"]) { + request.data = parsedArguments["data-ascii"] } - if (parsedArguments['u']) { - request.auth = parsedArguments['u'] + if (parsedArguments["u"]) { + request.auth = parsedArguments["u"] } - if (parsedArguments['user']) { - request.auth = parsedArguments['user'] + if (parsedArguments["user"]) { + request.auth = parsedArguments["user"] } if (Array.isArray(request.data)) { request.dataArray = request.data request.data = joinDataArguments(request.data) } - if (parsedArguments['k'] || parsedArguments['insecure']) { + if (parsedArguments["k"] || parsedArguments["insecure"]) { request.insecure = true } return request diff --git a/assets/js/oauth.js b/assets/js/oauth.js index 539f54124..a37ddeb40 100644 --- a/assets/js/oauth.js +++ b/assets/js/oauth.js @@ -13,11 +13,11 @@ 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', + method: "post", headers: { - 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + "Content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, body, } @@ -26,7 +26,7 @@ const sendPostRequest = async (url, params) => { const data = await response.json() return data } catch (err) { - console.error('Request failed', err) + console.error("Request failed", err) throw err } } @@ -39,10 +39,10 @@ const sendPostRequest = async (url, params) => { */ const parseQueryString = searchQuery => { - if (searchQuery === '') { + if (searchQuery === "") { return {} } - const segments = searchQuery.split('&').map(s => s.split('=')) + const segments = searchQuery.split("&").map(s => s.split("=")) const queryString = segments.reduce((obj, el) => ({ ...obj, [el[0]]: el[1] }), {}) return queryString } @@ -55,9 +55,9 @@ const parseQueryString = searchQuery => { const getTokenConfiguration = async endpoint => { const options = { - method: 'GET', + method: "GET", headers: { - 'Content-type': 'application/json', + "Content-type": "application/json", }, } try { @@ -65,7 +65,7 @@ const getTokenConfiguration = async endpoint => { const config = await response.json() return config } catch (err) { - console.error('Request failed', err) + console.error("Request failed", err) throw err } } @@ -81,7 +81,7 @@ 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('') + return Array.from(array, dec => `0${dec.toString(16)}`.substr(-2)).join("") } /** @@ -93,7 +93,7 @@ const generateRandomString = () => { const sha256 = plain => { const encoder = new TextEncoder() const data = encoder.encode(plain) - return window.crypto.subtle.digest('SHA-256', data) + return window.crypto.subtle.digest("SHA-256", data) } /** @@ -110,9 +110,9 @@ const base64urlencode = ( // Then convert the base64 encoded to base64url encoded // (replace + with -, replace / with _, trim trailing =) btoa(String.fromCharCode.apply(null, new Uint8Array(str))) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/, '') + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, "") /** * Return the base64-urlencoded sha256 hash for the PKCE challenge @@ -144,23 +144,23 @@ const tokenRequest = async ({ scope, }) => { // Check oauth configuration - if (oidcDiscoveryUrl !== '') { + if (oidcDiscoveryUrl !== "") { 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) + 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) + 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) @@ -189,7 +189,7 @@ const tokenRequest = async ({ */ const oauthRedirect = async () => { - let tokenResponse = '' + let tokenResponse = "" let q = parseQueryString(window.location.search.substring(1)) // Check if the server returned an error string if (q.error) { @@ -198,27 +198,27 @@ const oauthRedirect = async () => { // 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') + if (localStorage.getItem("pkce_state") != q.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', + tokenResponse = await sendPostRequest(localStorage.getItem("token_endpoint"), { + grant_type: "authorization_code", code: q.code, - client_id: localStorage.getItem('client_id'), + client_id: localStorage.getItem("client_id"), redirect_uri: redirectUri, - code_verifier: localStorage.getItem('pkce_code_verifier'), + code_verifier: localStorage.getItem("pkce_code_verifier"), }) } catch (err) { 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') + localStorage.removeItem("pkce_state") + localStorage.removeItem("pkce_code_verifier") + localStorage.removeItem("token_endpoint") + localStorage.removeItem("client_id") return tokenResponse } return tokenResponse diff --git a/assets/js/pwa.js b/assets/js/pwa.js index b2f037047..cdecc3854 100644 --- a/assets/js/pwa.js +++ b/assets/js/pwa.js @@ -2,36 +2,36 @@ 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') + 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') + localStorage.setItem("pwaInstalled", "yes") pwaInstalled = true } //*** If the PWA has not been installed, show the install PWA prompt.. ***// let deferredPrompt = null - window.addEventListener('beforeinstallprompt', event => { + window.addEventListener("beforeinstallprompt", 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') + window.addEventListener("appinstalled", event => { + localStorage.setItem("pwaInstalled", "yes") pwaInstalled = true - document.getElementById('installPWA').style.display = 'none' + document.getElementById("installPWA").style.display = "none" }) // When the app is uninstalled, add the prompts back @@ -40,10 +40,10 @@ export default () => { deferredPrompt.prompt() let outcome = await deferredPrompt.userChoice - if (outcome === 'accepted') { - console.log('Postwoman was installed successfully.') + if (outcome === "accepted") { + 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 } diff --git a/build.js b/build.js index c5da9f3ae..293817879 100644 --- a/build.js +++ b/build.js @@ -1,14 +1,14 @@ -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 PW_BUILD_DATA_DIR = "./.postwoman" +const IS_DEV_MODE = process.argv.includes("--dev") try { ;(async () => { @@ -20,33 +20,33 @@ try { 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) { version.name = ( await axios - .get('https://api.github.com/repos/liyasthomas/postwoman/releases') + .get("https://api.github.com/repos/liyasthomas/postwoman/releases") // If we can't get it from GitHub, we'll resort to getting it from package.json .catch(ex => ({ data: [ { - tag_name: require('./package.json').version, + 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' : '') - if (['', 'master'].includes(version.variant)) { + runCommand("git", ["branch"]) + .split("* ")[1] + .split(" ")[0] + (IS_DEV_MODE ? " - DEV MODE" : "") + if (["", "master"].includes(version.variant)) { delete version.variant } diff --git a/components/ace-editor.vue b/components/ace-editor.vue index 2e87a2664..61684887c 100644 --- a/components/ace-editor.vue +++ b/components/ace-editor.vue @@ -3,16 +3,16 @@ diff --git a/components/collections/request.vue b/components/collections/request.vue index d2332e475..b2f2072e6 100644 --- a/components/collections/request.vue +++ b/components/collections/request.vue @@ -14,13 +14,13 @@