Huge refactor and more css fixes

This commit is contained in:
Gregory Schier
2016-09-20 17:03:26 -07:00
parent 8efe5135b9
commit 35a6a431a8
64 changed files with 608 additions and 540 deletions

View File

@@ -1,4 +1,6 @@
import {TYPE_REQUEST_GROUP, TYPE_REQUEST, TYPE_WORKSPACE} from '../database';
'use strict';
const {TYPE_REQUEST_GROUP, TYPE_REQUEST, TYPE_WORKSPACE} = require('../database');
module.exports[TYPE_WORKSPACE] = [{
_id: 'wrk_1',

View File

@@ -1,6 +1,8 @@
import {CookieJar} from 'tough-cookie';
import request from 'request';
import * as cookieUtils from '../cookies';
'use strict';
const {CookieJar} = require('tough-cookie');
const request = require('request');
const cookieUtils = require('../cookies');
describe('jarFromCookies()', () => {
it('returns valid cookies', done => {

View File

@@ -1,5 +1,7 @@
import * as db from '../database';
import {PREVIEW_MODE_SOURCE} from '../../lib/previewModes';
'use strict';
const db = require('../database');
const {PREVIEW_MODE_SOURCE} = require('backend/previewModes');
function loadFixture (name) {
const fixtures = require(`../__fixtures__/${name}`);

View File

@@ -1,7 +1,9 @@
import * as networkUtils from '../network';
import * as db from '../database';
import nock from 'nock';
import {getRenderedRequest} from '../render';
'use strict';
const networkUtils = require('../network');
const db = require('../database');
const nock = require('nock');
const {getRenderedRequest} = require('../render');
describe('buildRequestConfig()', () => {
beforeEach(() => db.initDB({inMemoryOnly: true}, true));

View File

@@ -1,4 +1,6 @@
import * as querystringUtils from '../querystring';
'use strict';
const querystringUtils = require('../querystring');
describe('getBasicAuthHeader()', () => {
it('gets joiner for bare URL', () => {

View File

@@ -1,5 +1,7 @@
import * as render from '../render';
import {TYPE_ENVIRONMENT, TYPE_REQUEST_GROUP} from '../database/index';
'use strict';
const render = require('../render');
const {TYPE_ENVIRONMENT, TYPE_REQUEST_GROUP} = require('../database/index');
jest.mock('electron');

View File

@@ -1,4 +1,6 @@
import * as util from '../util';
'use strict';
const util = require('../util');
describe('getBasicAuthHeader()', () => {
it('succeed with username and password', () => {

View File

@@ -1,12 +1,14 @@
import Analytics from 'analytics-node';
import {getAppVersion} from './appInfo';
import * as db from './database';
import {SEGMENT_WRITE_KEY} from './constants';
'use strict';
const Analytics = require('analytics-node');
const {getAppVersion} = require('./appInfo');
const db = require('./database');
const {SEGMENT_WRITE_KEY} = require('./constants');
let analytics = null;
let userId = null;
export function initAnalytics () {
module.exports.initAnalytics = () => {
return new Promise((resolve, reject) => {
analytics = new Analytics(SEGMENT_WRITE_KEY);
@@ -15,7 +17,7 @@ export function initAnalytics () {
userId = stats._id;
// Recurse now that we have a userId
return initAnalytics();
return module.exports.initAnalytics();
}).then(resolve, reject);
}
@@ -33,9 +35,9 @@ export function initAnalytics () {
console.log(`-- Analytics Initialized for ${userId} --`);
resolve();
});
}
};
export function trackEvent (event, properties = {}) {
module.exports.trackEvent = (event, properties = {}) => {
// Don't track events if we haven't set them up yet
if (analytics) {
// Add base properties
@@ -46,4 +48,4 @@ export function trackEvent (event, properties = {}) {
analytics.track({userId, event, properties});
}
}
};

23
app/backend/appInfo.js Normal file
View File

@@ -0,0 +1,23 @@
'use strict';
const appJson = require('../package.json');
module.exports.getAppVersion = () => {
return appJson.version;
};
module.exports.getAppLongName = () => {
return appJson.longName;
};
module.exports.getAppName = () => {
return appJson.productName;
};
module.exports.isMac = () => {
return process.platform === 'darwin';
};
module.exports.isDevelopment = () => {
return process.env.INSOMNIA_ENV === 'development';
};

View File

@@ -1,58 +1,52 @@
import {isDevelopment} from './appInfo';
import {isMac} from './appInfo';
'use strict';
const {isDevelopment} = require('./appInfo');
const {isMac} = require('./appInfo');
// Global Stuff
export const LOCALSTORAGE_KEY = 'insomnia.state';
export const DB_PERSIST_INTERVAL = 1000 * 60 * 10;
export const DEBOUNCE_MILLIS = 100;
export const REQUEST_TIME_TO_SHOW_COUNTER = 1; // Seconds
export const CHECK_FOR_UPDATES_INTERVAL = 1000 * 60 * 60 * 3; // 3 hours
export const CHANGELOG_URL = 'https://changelog.insomnia.rest/changelog.json';
export const STATUS_CODE_PEBKAC = -333;
export const MOD_SYM = isMac() ? '⌘' : 'ctrl+';
export const SEGMENT_WRITE_KEY = isDevelopment() ?
module.exports.LOCALSTORAGE_KEY = 'insomnia.state';
module.exports.DB_PERSIST_INTERVAL = 1000 * 60 * 10;
module.exports.DEBOUNCE_MILLIS = 100;
module.exports.REQUEST_TIME_TO_SHOW_COUNTER = 1; // Seconds
module.exports.CHECK_FOR_UPDATES_INTERVAL = 1000 * 60 * 60 * 3; // 3 hours
module.exports.CHANGELOG_URL = 'https://changelog.insomnia.rest/changelog.json';
module.exports.STATUS_CODE_PEBKAC = -333;
module.exports.MOD_SYM = isMac() ? '⌘' : 'ctrl+';
module.exports.SEGMENT_WRITE_KEY = isDevelopment() ?
'z7fwuyxxTragtISwExCNnoqUlWZbr4Sy' :
'DlRubvWRIqAyzhLAQ5Lea1nXdIAsEoD2';
// UI Stuff
export const MAX_SIDEBAR_REMS = 35;
export const MIN_SIDEBAR_REMS = 0.75;
export const COLLAPSE_SIDEBAR_REMS = 4;
export const SIDEBAR_SKINNY_REMS = 10;
export const MAX_PANE_WIDTH = 0.99;
export const MIN_PANE_WIDTH = 0.01;
export const DEFAULT_PANE_WIDTH = 0.5;
export const DEFAULT_SIDEBAR_WIDTH = 19;
module.exports.MAX_SIDEBAR_REMS = 35;
module.exports.MIN_SIDEBAR_REMS = 0.75;
module.exports.COLLAPSE_SIDEBAR_REMS = 4;
module.exports.SIDEBAR_SKINNY_REMS = 10;
module.exports.MAX_PANE_WIDTH = 0.99;
module.exports.MIN_PANE_WIDTH = 0.01;
module.exports.DEFAULT_PANE_WIDTH = 0.5;
module.exports.DEFAULT_SIDEBAR_WIDTH = 19;
// HTTP Methods
export const METHOD_GET = 'GET';
export const METHOD_POST = 'POST';
export const METHOD_PUT = 'PUT';
export const METHOD_PATCH = 'PATCH';
export const METHOD_DELETE = 'DELETE';
export const METHOD_OPTIONS = 'OPTIONS';
export const METHOD_HEAD = 'HEAD';
module.exports.METHOD_GET = 'GET';
module.exports.METHOD_POST = 'POST';
module.exports.METHOD_PUT = 'PUT';
module.exports.METHOD_PATCH = 'PATCH';
module.exports.METHOD_DELETE = 'DELETE';
module.exports.METHOD_OPTIONS = 'OPTIONS';
module.exports.METHOD_HEAD = 'HEAD';
export const METHODS = [
METHOD_GET,
METHOD_POST,
METHOD_PUT,
METHOD_DELETE,
METHOD_PATCH,
METHOD_OPTIONS,
METHOD_HEAD
module.exports.METHODS = [
module.exports.METHOD_GET,
module.exports.METHOD_POST,
module.exports.METHOD_PUT,
module.exports.METHOD_DELETE,
module.exports.METHOD_PATCH,
module.exports.METHOD_OPTIONS,
module.exports.METHOD_HEAD
];
// export const MODAL_WORKSPACE_RENAME = 'workspace.update.name';
// export const MODAL_REQUEST_GROUP_RENAME = 'requestGroup.update.name';
// export const MODAL_REQUEST_RENAME = 'request.update.name';
// export const MODAL_REQUEST_SWITCHER = 'request.action.switch';
// export const MODAL_CURL_EXPORT = 'request.curlExport';
// export const MODAL_ENVIRONMENT_EDITOR = 'environment.edit';
// export const MODAL_SETTINGS = 'settings';
// Sourced from https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
export const RESPONSE_CODE_DESCRIPTIONS = {
module.exports.RESPONSE_CODE_DESCRIPTIONS = {
// 100s

View File

@@ -0,0 +1,32 @@
'use strict';
module.exports.CONTENT_TYPE_JSON = 'application/json';
module.exports.CONTENT_TYPE_XML = 'application/xml';
module.exports.CONTENT_TYPE_TEXT = 'text/plain';
module.exports.CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded';
module.exports.CONTENT_TYPE_OTHER = '';
const contentTypeMap = {
[module.exports.CONTENT_TYPE_JSON]: 'JSON',
[module.exports.CONTENT_TYPE_XML]: 'XML',
[module.exports.CONTENT_TYPE_FORM_URLENCODED]: 'Form Encoded',
[module.exports.CONTENT_TYPE_TEXT]: 'Plain Text',
[module.exports.CONTENT_TYPE_OTHER]: 'Other'
};
module.exports.CONTENT_TYPES = Object.keys(contentTypeMap);
/**
* Get the friendly name for a given content type
*
* @param contentType
* @returns {*|string}
*/
module.exports.getContentTypeName = contentType => {
return contentTypeMap[contentType] || contentTypeMap[module.exports.CONTENT_TYPE_OTHER];
};
module.exports.getContentTypeFromHeaders = headers => {
const header = headers.find(({name}) => name.toLowerCase() === 'content-type');
return header ? header.value : null;
};

View File

@@ -1,12 +1,14 @@
import {CookieJar} from 'tough-cookie';
import request from 'request';
'use strict';
const {CookieJar} = require('tough-cookie');
const request = require('request');
/**
* Get a list of cookie objects from a request.jar()
*
* @param jar
*/
export function cookiesFromJar (jar) {
module.exports.cookiesFromJar = jar => {
return new Promise(resolve => {
jar._jar.store.getAllCookies((err, cookies) => {
if (err) {
@@ -17,14 +19,14 @@ export function cookiesFromJar (jar) {
}
});
});
}
};
/**
* Get a request.jar() from a list of cookie objects
*
* @param cookies
*/
export function jarFromCookies (cookies) {
module.exports.jarFromCookies = cookies => {
const jar = request.jar();
try {
@@ -34,9 +36,9 @@ export function jarFromCookies (cookies) {
}
return jar;
}
};
export function cookieToString (cookie) {
module.exports.cookieToString = cookie => {
var str = cookie.toString();
// tough-cookie toString() doesn't put domain on all the time.
@@ -46,4 +48,4 @@ export function cookieToString (cookie) {
}
return str;
}
};

View File

@@ -1,27 +1,29 @@
import electron from 'electron';
import NeDB from 'nedb';
import * as fsPath from 'path';
import {
'use strict';
const electron = require('electron');
const NeDB = require('nedb');
const fsPath = require('path');
const {
METHOD_GET,
DB_PERSIST_INTERVAL,
DEFAULT_SIDEBAR_WIDTH
} from '../constants';
import {generateId} from '../util';
import {PREVIEW_MODE_SOURCE} from '../previewModes';
import {isDevelopment} from '../appInfo';
} = require('../constants');
const {generateId} = require('../util');
const {PREVIEW_MODE_SOURCE} = require('../previewModes');
const {isDevelopment} = require('../appInfo');
export const TYPE_STATS = 'Stats';
export const TYPE_SETTINGS = 'Settings';
export const TYPE_WORKSPACE = 'Workspace';
export const TYPE_ENVIRONMENT = 'Environment';
export const TYPE_COOKIE_JAR = 'CookieJar';
export const TYPE_REQUEST_GROUP = 'RequestGroup';
export const TYPE_REQUEST = 'Request';
export const TYPE_RESPONSE = 'Response';
module.exports.TYPE_STATS = 'Stats';
module.exports.TYPE_SETTINGS = 'Settings';
module.exports.TYPE_WORKSPACE = 'Workspace';
module.exports.TYPE_ENVIRONMENT = 'Environment';
module.exports.TYPE_COOKIE_JAR = 'CookieJar';
module.exports.TYPE_REQUEST_GROUP = 'RequestGroup';
module.exports.TYPE_REQUEST = 'Request';
module.exports.TYPE_RESPONSE = 'Response';
export const CHANGE_INSERT = 'insert';
export const CHANGE_UPDATE = 'update';
export const CHANGE_REMOVE = 'remove';
module.exports.CHANGE_INSERT = 'insert';
module.exports.CHANGE_UPDATE = 'update';
module.exports.CHANGE_REMOVE = 'remove';
const BASE_MODEL_DEFAULTS = () => ({
@@ -31,23 +33,23 @@ const BASE_MODEL_DEFAULTS = () => ({
});
const MODEL_ID_PREFIXES = {
[TYPE_STATS]: 'sta',
[TYPE_SETTINGS]: 'set',
[TYPE_WORKSPACE]: 'wrk',
[TYPE_ENVIRONMENT]: 'env',
[TYPE_COOKIE_JAR]: 'jar',
[TYPE_REQUEST_GROUP]: 'fld',
[TYPE_REQUEST]: 'req',
[TYPE_RESPONSE]: 'res'
[module.exports.TYPE_STATS]: 'sta',
[module.exports.TYPE_SETTINGS]: 'set',
[module.exports.TYPE_WORKSPACE]: 'wrk',
[module.exports.TYPE_ENVIRONMENT]: 'env',
[module.exports.TYPE_COOKIE_JAR]: 'jar',
[module.exports.TYPE_REQUEST_GROUP]: 'fld',
[module.exports.TYPE_REQUEST]: 'req',
[module.exports.TYPE_RESPONSE]: 'res'
};
export const MODEL_DEFAULTS = {
[TYPE_STATS]: () => ({
module.exports.MODEL_DEFAULTS = {
[module.exports.TYPE_STATS]: () => ({
lastLaunch: Date.now(),
lastVersion: null,
launches: 0
}),
[TYPE_SETTINGS]: () => ({
[module.exports.TYPE_SETTINGS]: () => ({
showPasswords: true,
useBulkHeaderEditor: false,
followRedirects: false,
@@ -58,7 +60,7 @@ export const MODEL_DEFAULTS = {
timeout: 0,
validateSSL: true
}),
[TYPE_WORKSPACE]: () => ({
[module.exports.TYPE_WORKSPACE]: () => ({
name: 'New Workspace',
metaSidebarWidth: DEFAULT_SIDEBAR_WIDTH,
metaActiveEnvironmentId: null,
@@ -66,21 +68,21 @@ export const MODEL_DEFAULTS = {
metaFilter: '',
metaSidebarHidden: false
}),
[TYPE_ENVIRONMENT]: () => ({
[module.exports.TYPE_ENVIRONMENT]: () => ({
name: 'New Environment',
data: {},
}),
[TYPE_COOKIE_JAR]: () => ({
[module.exports.TYPE_COOKIE_JAR]: () => ({
name: 'Default Jar',
cookies: []
}),
[TYPE_REQUEST_GROUP]: () => ({
[module.exports.TYPE_REQUEST_GROUP]: () => ({
name: 'New Folder',
environment: {},
metaCollapsed: false,
metaSortKey: -1 * Date.now()
}),
[TYPE_REQUEST]: () => ({
[module.exports.TYPE_REQUEST]: () => ({
url: '',
name: 'New Request',
method: METHOD_GET,
@@ -92,7 +94,7 @@ export const MODEL_DEFAULTS = {
metaResponseFilter: '',
metaSortKey: -1 * Date.now()
}),
[TYPE_RESPONSE]: () => ({
[module.exports.TYPE_RESPONSE]: () => ({
statusCode: 0,
statusMessage: '',
contentType: 'text/plain',
@@ -106,7 +108,7 @@ export const MODEL_DEFAULTS = {
}),
};
export const ALL_TYPES = Object.keys(MODEL_DEFAULTS);
module.exports.ALL_TYPES = Object.keys(module.exports.MODEL_DEFAULTS);
let db = null;
@@ -121,12 +123,14 @@ function getDBFilePath (modelType) {
* @returns {Promise}
*/
let initialized = false;
export function initDB (config = {}, force = false) {
module.exports.initDB = (config = {}, force = false) => {
// Only init once
if (initialized && !force) {
return Promise.resolve();
}
console.log('CONFIG', config);
return new Promise(resolve => {
db = {};
@@ -136,7 +140,7 @@ export function initDB (config = {}, force = false) {
// Fill in the defaults
const modelTypes = Object.keys(MODEL_DEFAULTS);
const modelTypes = Object.keys(module.exports.MODEL_DEFAULTS);
modelTypes.map(t => {
const filename = getDBFilePath(t);
const autoload = true;
@@ -152,19 +156,19 @@ export function initDB (config = {}, force = false) {
console.log(`-- Initialize DB at ${getDBFilePath('t')} --`);
resolve();
});
}
};
let changeListeners = {};
export function onChange (id, callback) {
module.exports.onChange = (id, callback) => {
console.log(`-- Added DB Listener ${id} -- `);
changeListeners[id] = callback;
}
};
export function offChange (id) {
module.exports.offChange = (id) => {
console.log(`-- Removed DB Listener ${id} -- `);
delete changeListeners[id];
}
};
function notifyOfChange (event, doc) {
Object.keys(changeListeners).map(k => changeListeners[k](event, doc));
@@ -185,7 +189,7 @@ function find (type, query = {}) {
return reject(err);
}
const modelDefaults = MODEL_DEFAULTS[type]();
const modelDefaults = module.exports.MODEL_DEFAULTS[type]();
const docs = rawDocs.map(rawDoc => {
return Object.assign({}, modelDefaults, rawDoc);
});
@@ -211,7 +215,7 @@ function getWhere (type, query) {
return resolve(null);
}
const modelDefaults = MODEL_DEFAULTS[type]();
const modelDefaults = module.exports.MODEL_DEFAULTS[type]();
resolve(Object.assign({}, modelDefaults, rawDocs[0]));
});
});
@@ -233,7 +237,7 @@ function count (type, query = {}) {
});
}
export function insert (doc) {
module.exports.insert = doc => {
return new Promise((resolve, reject) => {
db[doc.type].insert(doc, (err, newDoc) => {
if (err) {
@@ -241,10 +245,10 @@ export function insert (doc) {
}
resolve(newDoc);
notifyOfChange(CHANGE_INSERT, doc);
notifyOfChange(module.exports.CHANGE_INSERT, doc);
});
});
}
};
function update (doc) {
return new Promise((resolve, reject) => {
@@ -254,20 +258,20 @@ function update (doc) {
}
resolve(doc);
notifyOfChange(CHANGE_UPDATE, doc);
notifyOfChange(module.exports.CHANGE_UPDATE, doc);
});
});
}
function remove (doc) {
return new Promise(resolve => {
withDescendants(doc).then(docs => {
module.exports.withDescendants(doc).then(docs => {
const promises = docs.map(d => (
db[d.type].remove({_id: d._id}, {multi: true})
));
Promise.all(promises).then(() => {
docs.map(d => notifyOfChange(CHANGE_REMOVE, d));
docs.map(d => notifyOfChange(module.exports.CHANGE_REMOVE, d));
resolve()
});
});
@@ -313,7 +317,7 @@ function docCreate (type, patch = {}) {
const doc = Object.assign(
BASE_MODEL_DEFAULTS(),
{_id: generateId(idPrefix)},
MODEL_DEFAULTS[type](),
module.exports.MODEL_DEFAULTS[type](),
patch,
// Fields that the user can't touch
@@ -323,20 +327,20 @@ function docCreate (type, patch = {}) {
}
);
return insert(doc);
return module.exports.insert(doc);
}
// ~~~~~~~ //
// GENERAL //
// ~~~~~~~ //
export function withDescendants (doc = null) {
module.exports.withDescendants = (doc = null) => {
let docsToReturn = doc ? [doc] : [];
const next = (docs) => {
const promises = [];
for (const doc of docs) {
for (const type of ALL_TYPES) {
for (const type of module.exports.ALL_TYPES) {
// If the doc is null, we want to search for parentId === null
const parentId = doc ? doc._id : null;
promises.push(find(type, {parentId}));
@@ -346,7 +350,7 @@ export function withDescendants (doc = null) {
return Promise.all(promises).then(results => {
let newDocs = [];
// Gather up the docs from each type
// Gather up the docs = require(each type
for (const docs of results) {
for (const doc of docs) {
newDocs.push(doc);
@@ -365,9 +369,9 @@ export function withDescendants (doc = null) {
};
return next([doc]);
}
};
export function duplicate (originalDoc, patch = {}) {
module.exports.duplicate = (originalDoc, patch = {}) => {
return new Promise((resolve, reject) => {
// 1. Copy the doc
@@ -380,7 +384,7 @@ export function duplicate (originalDoc, patch = {}) {
// 2. Get all the children
const promises = [];
for (const type of ALL_TYPES) {
for (const type of module.exports.ALL_TYPES) {
const parentId = originalDoc._id;
const promise = find(type, {parentId});
promises.push(promise);
@@ -389,10 +393,15 @@ export function duplicate (originalDoc, patch = {}) {
Promise.all(promises).then(results => {
let duplicatePromises = [];
// Gather up the docs from each type
// Gather up the docs = require(each type
for (const docs of results) {
for (const doc of docs) {
duplicatePromises.push(duplicate(doc, {parentId: createdDoc._id}));
const promise = module.exports.duplicate(
doc,
{parentId: createdDoc._id}
);
duplicatePromises.push(promise);
}
}
@@ -401,46 +410,46 @@ export function duplicate (originalDoc, patch = {}) {
})
})
})
}
};
// ~~~~~~~ //
// REQUEST //
// ~~~~~~~ //
export function requestCreateAndActivate (workspace, patch = {}) {
return requestCreate(patch).then(r => {
workspaceUpdate(workspace, {metaActiveRequestId: r._id});
module.exports.requestCreateAndActivate = (workspace, patch = {}) => {
return module.exports.requestCreate(patch).then(r => {
module.exports.workspaceUpdate(workspace, {metaActiveRequestId: r._id});
})
}
};
export function requestDuplicateAndActivate (workspace, request) {
return requestDuplicate(request).then(r => {
workspaceUpdate(workspace, {metaActiveRequestId: r._id});
module.exports.requestDuplicateAndActivate = (workspace, request) => {
return module.exports.requestDuplicate(request).then(r => {
module.exports.workspaceUpdate(workspace, {metaActiveRequestId: r._id});
})
}
};
export function requestCreate (patch = {}) {
module.exports.requestCreate = (patch = {}) => {
if (!patch.parentId) {
throw new Error('New Requests missing `parentId`', patch);
}
return docCreate(TYPE_REQUEST, patch);
}
return docCreate(module.exports.TYPE_REQUEST, patch);
};
export function requestGetById (id) {
return get(TYPE_REQUEST, id);
}
module.exports.requestGetById = id => {
return get(module.exports.TYPE_REQUEST, id);
};
export function requestFindByParentId (parentId) {
return find(TYPE_REQUEST, {parentId: parentId});
}
module.exports.requestFindByParentId = parentId => {
return find(module.exports.TYPE_REQUEST, {parentId: parentId});
};
export function requestUpdate (request, patch) {
module.exports.requestUpdate = (request, patch) => {
return docUpdate(request, patch);
}
};
export function requestUpdateContentType (request, contentType) {
module.exports.requestUpdateContentType = (request, contentType) => {
let headers = [...request.headers];
const contentTypeHeader = headers.find(
h => h.name.toLowerCase() === 'content-type'
@@ -456,29 +465,29 @@ export function requestUpdateContentType (request, contentType) {
}
return docUpdate(request, {headers});
}
};
export function requestDuplicate (request) {
module.exports.requestDuplicate = request => {
const name = `${request.name} (Copy)`;
return duplicate(request, {name});
}
return module.exports.duplicate(request, {name});
};
export function requestRemove (request) {
module.exports.requestRemove = request => {
return remove(request);
}
};
export function requestAll () {
return all(TYPE_REQUEST);
}
module.exports.requestAll = () => {
return all(module.exports.TYPE_REQUEST);
};
export function requestGetAncestors (request) {
module.exports.requestGetAncestors = request => {
return new Promise(resolve => {
let ancestors = [];
const next = (doc) => {
Promise.all([
requestGroupGetById(doc.parentId),
workspaceGetById(doc.parentId)
module.exports.requestGroupGetById(doc.parentId),
module.exports.workspaceGetById(doc.parentId)
]).then(([requestGroup, workspace]) => {
if (requestGroup) {
ancestors = [requestGroup, ...ancestors];
@@ -496,218 +505,221 @@ export function requestGetAncestors (request) {
next(request);
});
}
};
// ~~~~~~~~~~~~~ //
// REQUEST GROUP //
// ~~~~~~~~~~~~~ //
export function requestGroupCreate (patch = {}) {
module.exports.requestGroupCreate = (patch = {}) => {
if (!patch.parentId) {
throw new Error('New Requests missing `parentId`', patch);
}
return docCreate(TYPE_REQUEST_GROUP, patch);
}
return docCreate(module.exports.TYPE_REQUEST_GROUP, patch);
};
export function requestGroupUpdate (requestGroup, patch) {
module.exports.requestGroupUpdate = (requestGroup, patch) => {
return docUpdate(requestGroup, patch);
}
};
export function requestGroupGetById (id) {
return get(TYPE_REQUEST_GROUP, id);
}
module.exports.requestGroupGetById = id => {
return get(module.exports.TYPE_REQUEST_GROUP, id);
};
export function requestGroupFindByParentId (parentId) {
return find(TYPE_REQUEST_GROUP, {parentId});
}
module.exports.requestGroupFindByParentId = parentId => {
return find(module.exports.TYPE_REQUEST_GROUP, {parentId});
};
export function requestGroupRemove (requestGroup) {
module.exports.requestGroupRemove = requestGroup => {
return remove(requestGroup);
}
};
export function requestGroupAll () {
return all(TYPE_REQUEST_GROUP);
}
module.exports.requestGroupAll = () => {
return all(module.exports.TYPE_REQUEST_GROUP);
};
export function requestGroupDuplicate (requestGroup) {
module.exports.requestGroupDuplicate = requestGroup => {
const name = `${requestGroup.name} (Copy)`;
return duplicate(requestGroup, {name});
}
return module.exports.duplicate(requestGroup, {name});
};
// ~~~~~~~~ //
// RESPONSE //
// ~~~~~~~~ //
export function responseCreate (patch = {}) {
module.exports.responseCreate = (patch = {}) => {
if (!patch.parentId) {
throw new Error('New Response missing `parentId`');
}
removeBulkSilently(TYPE_RESPONSE, {parentId: patch.parentId});
return docCreate(TYPE_RESPONSE, patch);
}
removeBulkSilently(module.exports.TYPE_RESPONSE, {parentId: patch.parentId});
return docCreate(module.exports.TYPE_RESPONSE, patch);
};
export function responseGetLatestByParentId (parentId) {
return getMostRecentlyModified(TYPE_RESPONSE, {parentId});
}
module.exports.responseGetLatestByParentId = parentId => {
return getMostRecentlyModified(module.exports.TYPE_RESPONSE, {parentId});
};
// ~~~~~~~ //
// COOKIES //
// ~~~~~~~ //
export function cookieJarCreate (patch = {}) {
return docCreate(TYPE_COOKIE_JAR, patch);
}
module.exports.cookieJarCreate = (patch = {}) => {
return docCreate(module.exports.TYPE_COOKIE_JAR, patch);
};
export function cookieJarGetOrCreateForWorkspace (workspace) {
module.exports.cookieJarGetOrCreateForWorkspace = workspace => {
const parentId = workspace._id;
return find(TYPE_COOKIE_JAR, {parentId}).then(cookieJars => {
return find(module.exports.TYPE_COOKIE_JAR, {parentId}).then(cookieJars => {
if (cookieJars.length === 0) {
return cookieJarCreate({parentId})
return module.exports.cookieJarCreate({parentId})
} else {
return new Promise(resolve => resolve(cookieJars[0]));
}
});
}
};
export function cookieJarAll () {
return all(TYPE_COOKIE_JAR);
}
module.exports.cookieJarAll = () => {
return all(module.exports.TYPE_COOKIE_JAR);
};
export function cookieJarGetById (id) {
return get(TYPE_COOKIE_JAR, id);
}
module.exports.cookieJarGetById = id => {
return get(module.exports.TYPE_COOKIE_JAR, id);
};
export function cookieJarUpdate (cookieJar, patch) {
module.exports.cookieJarUpdate = (cookieJar, patch) => {
return docUpdate(cookieJar, patch);
}
};
// ~~~~~~~~~ //
// WORKSPACE //
// ~~~~~~~~~ //
export function workspaceGetById (id) {
return get(TYPE_WORKSPACE, id);
}
module.exports.workspaceGetById = id => {
return get(module.exports.TYPE_WORKSPACE, id);
};
export function workspaceCreate (patch = {}) {
return docCreate(TYPE_WORKSPACE, patch);
}
module.exports.workspaceCreate = (patch = {}) => {
return docCreate(module.exports.TYPE_WORKSPACE, patch);
};
export function workspaceAll () {
return all(TYPE_WORKSPACE).then(workspaces => {
module.exports.workspaceAll = () => {
return all(module.exports.TYPE_WORKSPACE).then(workspaces => {
if (workspaces.length === 0) {
return workspaceCreate({name: 'Insomnia'}).then(workspaceAll);
return module.exports.workspaceCreate({name: 'Insomnia'})
.then(module.exports.workspaceAll);
} else {
return new Promise(resolve => resolve(workspaces))
}
});
}
};
export function workspaceCount () {
return count(TYPE_WORKSPACE)
}
module.exports.workspaceCount = () => {
return count(module.exports.TYPE_WORKSPACE)
};
export function workspaceUpdate (workspace, patch) {
module.exports.workspaceUpdate = (workspace, patch) => {
return docUpdate(workspace, patch);
}
};
export function workspaceRemove (workspace) {
module.exports.workspaceRemove = workspace => {
return remove(workspace);
}
};
// ~~~~~~~~~~~ //
// ENVIRONMENT //
// ~~~~~~~~~~~ //
export function environmentCreate (patch = {}) {
module.exports.environmentCreate = (patch = {}) => {
if (!patch.parentId) {
throw new Error('New Environment missing `parentId`', patch);
}
return docCreate(TYPE_ENVIRONMENT, patch);
}
return docCreate(module.exports.TYPE_ENVIRONMENT, patch);
};
export function environmentUpdate (environment, patch) {
module.exports.environmentUpdate = (environment, patch) => {
return docUpdate(environment, patch);
}
};
export function environmentFindByParentId (parentId) {
return find(TYPE_ENVIRONMENT, {parentId});
}
module.exports.environmentFindByParentId = parentId => {
return find(module.exports.TYPE_ENVIRONMENT, {parentId});
};
export function environmentGetOrCreateForWorkspace (workspace) {
module.exports.environmentGetOrCreateForWorkspace = workspace => {
const parentId = workspace._id;
return find(TYPE_ENVIRONMENT, {parentId}).then(environments => {
return find(module.exports.TYPE_ENVIRONMENT, {parentId}).then(environments => {
if (environments.length === 0) {
return environmentCreate({parentId, name: 'Base Environment'})
return module.exports.environmentCreate({parentId, name: 'Base Environment'})
} else {
return new Promise(resolve => resolve(environments[0]));
}
});
}
};
export function environmentGetById (id) {
return get(TYPE_ENVIRONMENT, id);
}
module.exports.environmentGetById = id => {
return get(module.exports.TYPE_ENVIRONMENT, id);
};
export function environmentRemove (environment) {
module.exports.environmentRemove = environment => {
return remove(environment);
}
};
export function environmentAll () {
return all(TYPE_ENVIRONMENT);
}
module.exports.environmentAll = () => {
return all(module.exports.TYPE_ENVIRONMENT);
};
// ~~~~~~~~ //
// SETTINGS //
// ~~~~~~~~ //
export function settingsCreate (patch = {}) {
return docCreate(TYPE_SETTINGS, patch);
}
module.exports.settingsCreate = (patch = {}) => {
return docCreate(module.exports.TYPE_SETTINGS, patch);
};
export function settingsUpdate (settings, patch) {
module.exports.settingsUpdate = (settings, patch) => {
return docUpdate(settings, patch);
}
};
export function settingsGetOrCreate () {
return all(TYPE_SETTINGS).then(results => {
module.exports.settingsGetOrCreate = () => {
return all(module.exports.TYPE_SETTINGS).then(results => {
if (results.length === 0) {
return settingsCreate().then(settingsGetOrCreate);
return module.exports.settingsCreate()
.then(module.exports.settingsGetOrCreate);
} else {
return new Promise(resolve => resolve(results[0]));
}
});
}
};
// ~~~~~ //
// STATS //
// ~~~~~ //
export function statsCreate (patch = {}) {
return docCreate(TYPE_STATS, patch);
}
module.exports.statsCreate = (patch = {}) => {
return docCreate(module.exports.TYPE_STATS, patch);
};
export function statsUpdate (patch) {
return statsGet().then(stats => {
module.exports.statsUpdate = patch => {
return module.exports.statsGet().then(stats => {
return docUpdate(stats, patch);
});
}
};
export function statsGet () {
return all(TYPE_STATS).then(results => {
module.exports.statsGet = () => {
return all(module.exports.TYPE_STATS).then(results => {
if (results.length === 0) {
return statsCreate().then(statsGet);
return module.exports.statsCreate()
.then(module.exports.statsGet);
} else {
return new Promise(resolve => resolve(results[0]));
}
});
}
};

View File

@@ -141,7 +141,7 @@ function getBasicAuth (flags) {
}
export function importCurl (blob) {
module.exports.importCurl = blob => {
if (!blob || blob.toLowerCase().indexOf('curl ') !== 0) {
return false;
}
@@ -189,4 +189,4 @@ export function importCurl (blob) {
method: httpMethod,
authentication: authentication
};
}
};

View File

@@ -1,7 +1,9 @@
import * as db from '../database';
import {getAppVersion} from '../appInfo';
import {importRequestGroupLegacy} from './legacy';
import {importRequestLegacy} from './legacy';
'use strict';
const db = require('../database');
const {getAppVersion} = require('../appInfo');
const {importRequestGroupLegacy} = require('./legacy');
const {importRequestLegacy} = require('./legacy');
const VERSION_LEGACY = 1;
const VERSION_DESKTOP_APP = 2;
@@ -11,7 +13,7 @@ const TYPE_WORKSPACE = 'workspace';
const TYPE_COOKIE_JAR = 'cookie_jar';
const TYPE_ENVIRONMENT = 'environment';
export function importJSON (workspace, json) {
module.exports.importJSON = (workspace, json) => {
let data;
try {
@@ -61,9 +63,9 @@ export function importJSON (workspace, json) {
console.error('Export format not recognized', exportFormat);
break;
}
}
};
export function exportJSON (parentDoc = null) {
module.exports.exportJSON = (parentDoc = null) => {
const data = {
_type: 'export',
__export_format: 2,
@@ -101,7 +103,7 @@ export function exportJSON (parentDoc = null) {
resolve(JSON.stringify(data, null, 2));
});
});
}
};
function removeMetaKeys (obj) {

View File

@@ -1,8 +1,10 @@
import * as db from '../database';
import {getRenderedRequest} from '../render';
import {jarFromCookies} from '../cookies';
'use strict';
export function exportHar (requestId, addContentLength = false) {
const db = require('../database');
const {getRenderedRequest} = require('../render');
const {jarFromCookies} = require('../cookies');
module.exports.exportHar = (requestId, addContentLength = false) => {
return new Promise((resolve, reject) => {
db.requestGetById(requestId).then(request => {
return getRenderedRequest(request);
@@ -35,7 +37,7 @@ export function exportHar (requestId, addContentLength = false) {
});
})
});
}
};
function getCookies (renderedRequest) {
const jar = jarFromCookies(renderedRequest.cookieJar.cookies);

View File

@@ -1,5 +1,7 @@
import * as db from '../database/index';
import {getContentTypeFromHeaders} from '../contentTypes';
'use strict';
const db = require('../database/index');
const {getContentTypeFromHeaders} = require('../contentTypes');
const FORMAT_MAP = {
json: 'application/json',
@@ -8,7 +10,7 @@ const FORMAT_MAP = {
text: 'text/plain'
};
export function importRequestGroupLegacy (importedRequestGroup, parentId, index = 1) {
module.exports.importRequestGroupLegacy = (importedRequestGroup, parentId, index = 1) => {
return db.requestGroupCreate({
parentId,
name: importedRequestGroup.name,
@@ -20,13 +22,13 @@ export function importRequestGroupLegacy (importedRequestGroup, parentId, index
if (importedRequestGroup.hasOwnProperty('requests')) {
// Let's process them oldest to newest
importedRequestGroup.requests.map(
(r, i) => importRequestLegacy(r, requestGroup._id, index * 1000 + i)
(r, i) => module.exports.importRequestLegacy(r, requestGroup._id, index * 1000 + i)
);
}
});
}
};
export function importRequestLegacy (importedRequest, parentId, index = 1) {
module.exports.importRequestLegacy = (importedRequest, parentId, index = 1) => {
let auth = {};
if (importedRequest.authentication.username) {
auth = {
@@ -62,5 +64,5 @@ export function importRequestLegacy (importedRequest, parentId, index = 1) {
contentType: FORMAT_MAP[importedRequest.__insomnia.format] || 'text/plain',
authentication: auth
});
}
};

View File

@@ -1,22 +1,23 @@
import networkRequest from 'request';
import {parse as urlParse, format as urlFormat} from 'url';
import * as db from './database';
import * as querystring from './querystring';
import {DEBOUNCE_MILLIS, STATUS_CODE_PEBKAC} from './constants';
import {jarFromCookies, cookiesFromJar} from './cookies';
import {setDefaultProtocol} from './util';
import {getRenderedRequest} from './render';
'use strict';
const networkRequest = require('request');
const {parse: urlParse, format: urlFormat} = require('url');
const db = require('./database');
const querystring = require('./querystring');
const {DEBOUNCE_MILLIS, STATUS_CODE_PEBKAC} = require('./constants');
const {jarFromCookies, cookiesFromJar} = require('./cookies');
const {setDefaultProtocol} = require('./util');
const {getRenderedRequest} = require('./render');
let cancelRequestFunction = null;
export function cancelCurrentRequest () {
module.exports.cancelCurrentRequest = () => {
if (typeof cancelRequestFunction === 'function') {
cancelRequestFunction();
}
}
};
export function _buildRequestConfig (renderedRequest, patch = {}) {
module.exports._buildRequestConfig = (renderedRequest, patch = {}) => {
const config = {
method: renderedRequest.method,
body: renderedRequest.body,
@@ -48,6 +49,7 @@ export function _buildRequestConfig (renderedRequest, patch = {}) {
const parsedUrl = urlParse(url);
parsedUrl.pathname = encodeURI(parsedUrl.pathname || '');
config.url = urlFormat(parsedUrl);
config.headers.host = parsedUrl.host;
for (let i = 0; i < renderedRequest.headers.length; i++) {
let header = renderedRequest.headers[i];
@@ -57,9 +59,9 @@ export function _buildRequestConfig (renderedRequest, patch = {}) {
}
return Object.assign(config, patch);
}
};
export function _actuallySend (renderedRequest, settings) {
module.exports._actuallySend = (renderedRequest, settings) => {
return new Promise((resolve, reject) => {
const cookieJar = renderedRequest.cookieJar;
const jar = jarFromCookies(cookieJar.cookies);
@@ -70,7 +72,7 @@ export function _actuallySend (renderedRequest, settings) {
const proxyHost = protocol === 'https:' ? settings.httpsProxy : settings.httpProxy;
const proxy = proxyHost ? setDefaultProtocol(proxyHost) : null;
let config = _buildRequestConfig(renderedRequest, {
let config = module.exports._buildRequestConfig(renderedRequest, {
jar: jar,
proxy: proxy,
followAllRedirects: settings.followRedirects,
@@ -150,9 +152,9 @@ export function _actuallySend (renderedRequest, settings) {
return reject('Cancelled');
}
})
}
};
export function send (requestId) {
module.exports.send = requestId => {
return new Promise((resolve, reject) => {
// First, lets wait for all debounces to finish
@@ -162,7 +164,7 @@ export function send (requestId) {
db.settingsGetOrCreate()
]).then(([request, settings]) => {
getRenderedRequest(request).then(renderedRequest => {
_actuallySend(renderedRequest, settings).then(resolve, reject);
module.exports._actuallySend(renderedRequest, settings).then(resolve, reject);
}, err => {
db.responseCreate({
parentId: request._id,
@@ -173,4 +175,4 @@ export function send (requestId) {
})
}, DEBOUNCE_MILLIS);
})
}
};

View File

@@ -0,0 +1,24 @@
'use strict';
module.exports.PREVIEW_MODE_FRIENDLY = 'friendly';
module.exports.PREVIEW_MODE_SOURCE = 'source';
module.exports.PREVIEW_MODE_RAW = 'raw';
const previewModeMap = {
[module.exports.PREVIEW_MODE_FRIENDLY]: 'Visual',
[module.exports.PREVIEW_MODE_SOURCE]: 'Source',
[module.exports.PREVIEW_MODE_RAW]: 'Raw'
};
module.exports.PREVIEW_MODES = Object.keys(previewModeMap);
/**
* Get the friendly name for a given preview mode
*
* @param previewMode
* @returns {*|string}
*/
module.exports.getPreviewModeName = previewMode => {
// TODO: Make this more robust maybe...
return previewModeMap[previewMode] || 'Unknown';
};

View File

@@ -1,18 +1,19 @@
'use strict';
export function getJoiner (url) {
module.exports.getJoiner = url => {
url = url || '';
return url.indexOf('?') === -1 ? '?' : '&';
}
};
export function joinURL (url, qs) {
module.exports.joinURL = (url, qs) => {
if (!qs) {
return url;
}
url = url || '';
return url + getJoiner(url) + qs;
}
return url + module.exports.getJoiner(url) + qs;
};
export function build (param, strict = true) {
module.exports.build = (param, strict = true) => {
// Skip non-name ones in strict mode
if (strict && !param.name) {
return '';
@@ -23,7 +24,7 @@ export function build (param, strict = true) {
} else {
return encodeURIComponent(param.name);
}
}
};
/**
*
@@ -31,10 +32,10 @@ export function build (param, strict = true) {
* @param strict allow empty names and values
* @returns {string}
*/
export function buildFromParams (parameters, strict = true) {
module.exports.buildFromParams = (parameters, strict = true) => {
let items = [];
for (var i = 0; i < parameters.length; i++) {
let built = build(parameters[i], strict);
let built = module.exports.build(parameters[i], strict);
if (!built) {
continue;
@@ -44,7 +45,7 @@ export function buildFromParams (parameters, strict = true) {
}
return items.join('&');
}
};
/**
*
@@ -52,7 +53,7 @@ export function buildFromParams (parameters, strict = true) {
* @param strict allow empty names and values
* @returns {Array}
*/
export function deconstructToParams (qs, strict = true) {
module.exports.deconstructToParams = (qs, strict = true) => {
const stringPairs = qs.split('&');
const pairs = [];
@@ -70,4 +71,4 @@ export function deconstructToParams (qs, strict = true) {
}
return pairs;
}
};

View File

@@ -1,9 +1,11 @@
import nunjucks from 'nunjucks';
import traverse from 'traverse';
import uuid from 'node-uuid';
import * as db from './database';
import {TYPE_WORKSPACE} from './database/index';
import {getBasicAuthHeader, hasAuthHeader, setDefaultProtocol} from './util';
'use strict';
const nunjucks = require('nunjucks');
const traverse = require('traverse');
const uuid = require('node-uuid');
const db = require('./database');
const {TYPE_WORKSPACE} = require('./database/index');
const {getBasicAuthHeader, hasAuthHeader, setDefaultProtocol} = require('./util');
const nunjucksEnvironment = nunjucks.configure({
autoescape: false
@@ -51,15 +53,15 @@ class UuidExtension extends NoArgsExtension {
nunjucksEnvironment.addExtension('uuid', new UuidExtension());
nunjucksEnvironment.addExtension('timestamp', new TimestampExtension());
export function render (template, context = {}) {
module.exports.render = (template, context = {}) => {
try {
return nunjucksEnvironment.renderString(template, context);
} catch (e) {
throw new Error(e.message.replace(/\(unknown path\)\s*/, ''));
}
}
};
export function buildRenderContext (ancestors, rootEnvironment, subEnvironment) {
module.exports.buildRenderContext = (ancestors, rootEnvironment, subEnvironment) => {
const renderContext = {};
if (rootEnvironment) {
@@ -86,18 +88,18 @@ export function buildRenderContext (ancestors, rootEnvironment, subEnvironment)
// This is to support templating inside environments
const stringifiedEnvironment = JSON.stringify(renderContext);
return JSON.parse(
render(stringifiedEnvironment, renderContext)
module.exports.render(stringifiedEnvironment, renderContext)
);
}
};
export function recursiveRender (obj, context) {
module.exports.recursiveRender = (obj, context) => {
// Make a copy so no one gets mad :)
const newObj = traverse.clone(obj);
try {
traverse(newObj).forEach(function (x) {
if (typeof x === 'string') {
const str = render(x, context);
const str = module.exports.render(x, context);
this.update(str);
}
});
@@ -107,9 +109,9 @@ export function recursiveRender (obj, context) {
}
return newObj;
}
};
export function getRenderedRequest (request) {
module.exports.getRenderedRequest = request => {
return db.requestGetAncestors(request).then(ancestors => {
const workspace = ancestors.find(doc => doc.type === TYPE_WORKSPACE);
@@ -120,14 +122,14 @@ export function getRenderedRequest (request) {
]).then(([rootEnvironment, subEnvironment, cookieJar]) => {
// Generate the context we need to render
const renderContext = buildRenderContext(
const renderContext = module.exports.buildRenderContext(
ancestors,
rootEnvironment,
subEnvironment
);
// Render all request properties
const renderedRequest = recursiveRender(
const renderedRequest = module.exports.recursiveRender(
request,
renderContext
);
@@ -150,4 +152,4 @@ export function getRenderedRequest (request) {
return new Promise(resolve => resolve(renderedRequest));
});
});
}
};

View File

@@ -1,12 +1,14 @@
export function getBasicAuthHeader (username, password) {
'use strict';
module.exports.getBasicAuthHeader = (username, password) => {
const name = 'Authorization';
const header = `${username || ''}:${password || ''}`;
const authString = new Buffer(header, 'utf8').toString('base64');
const value = `Basic ${authString}`;
return {name, value};
}
};
export function filterHeaders (headers, name) {
module.exports.filterHeaders = (headers, name) => {
if (!Array.isArray(headers) || !name) {
return [];
}
@@ -14,31 +16,31 @@ export function filterHeaders (headers, name) {
return headers.filter(
h => h.name.toLowerCase() === name.toLowerCase()
);
}
};
export function hasAuthHeader (headers) {
return filterHeaders(headers, 'authorization').length > 0;
}
module.exports.hasAuthHeader = headers => {
return module.exports.filterHeaders(headers, 'authorization').length > 0;
};
export function getSetCookieHeaders (headers) {
return filterHeaders(headers, 'set-cookie');
}
module.exports.getSetCookieHeaders = headers => {
return module.exports.filterHeaders(headers, 'set-cookie');
};
export function setDefaultProtocol (url, defaultProto = 'http:') {
module.exports.setDefaultProtocol = (url, defaultProto = 'http:') => {
// Default the proto if it doesn't exist
if (url.indexOf('://') === -1) {
url = `${defaultProto}//${url}`;
}
return url;
}
};
/**
* Generate an ID of the format "<MODEL_NAME>_<TIMESTAMP><RANDOM>"
* @param prefix
* @returns {string}
*/
export function generateId (prefix) {
module.exports.generateId = prefix => {
const CHARS = '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ'.split('');
const dateString = Date.now().toString(36);
let randString = '';
@@ -52,4 +54,4 @@ export function generateId (prefix) {
} else {
return `${dateString}${randString}`;
}
}
};

View File

@@ -1,21 +0,0 @@
import * as appJson from '../package.json';
export function getAppVersion () {
return appJson.version;
}
export function getAppLongName () {
return appJson.longName;
}
export function getAppName () {
return appJson.productName;
}
export function isMac () {
return process.platform === 'darwin';
}
export function isDevelopment () {
return process.env.INSOMNIA_ENV === 'development';
}

View File

@@ -1,30 +0,0 @@
export const CONTENT_TYPE_JSON = 'application/json';
export const CONTENT_TYPE_XML = 'application/xml';
export const CONTENT_TYPE_TEXT = 'text/plain';
export const CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded';
export const CONTENT_TYPE_OTHER = '';
const contentTypeMap = {
[CONTENT_TYPE_JSON]: 'JSON',
[CONTENT_TYPE_XML]: 'XML',
[CONTENT_TYPE_FORM_URLENCODED]: 'Form Encoded',
[CONTENT_TYPE_TEXT]: 'Plain Text',
[CONTENT_TYPE_OTHER]: 'Other'
};
export const CONTENT_TYPES = Object.keys(contentTypeMap);
/**
* Get the friendly name for a given content type
*
* @param contentType
* @returns {*|string}
*/
export function getContentTypeName (contentType) {
return contentTypeMap[contentType] || contentTypeMap[CONTENT_TYPE_OTHER];
}
export function getContentTypeFromHeaders (headers) {
const header = headers.find(({name}) => name.toLowerCase() === 'content-type');
return header ? header.value : null;
}

View File

@@ -1,23 +0,0 @@
export const PREVIEW_MODE_FRIENDLY = 'friendly';
export const PREVIEW_MODE_SOURCE = 'source';
export const PREVIEW_MODE_RAW = 'raw';
const previewModeMap = {
[PREVIEW_MODE_FRIENDLY]: 'Visual',
[PREVIEW_MODE_SOURCE]: 'Source',
[PREVIEW_MODE_RAW]: 'Raw'
};
export const PREVIEW_MODES = Object.keys(previewModeMap);
/**
* Get the friendly name for a given preview mode
*
* @param previewMode
* @returns {*|string}
*/
export function getPreviewModeName (previewMode) {
// TODO: Make this more robust maybe...
return previewModeMap[previewMode] || 'Unknown';
}

View File

@@ -1,5 +1,5 @@
import React, {Component} from 'react';
import {MOD_SYM} from '../../lib/constants';
import {MOD_SYM} from 'backend/constants';
const KeyboardShortcutsTable = () => (
<table className="wide">

View File

@@ -1,6 +1,6 @@
import React, {PropTypes, Component} from 'react';
import {getRenderedRequest} from '../../lib/render';
import * as querystring from '../../lib/querystring';
import {getRenderedRequest} from 'backend/render';
import * as querystring from 'backend/querystring';
class RenderedQueryString extends Component {

View File

@@ -10,10 +10,10 @@ import AuthEditor from './editors/AuthEditor';
import {UrlBar} from './UrlBar.elm';
import ElmComponent from './ElmComponent';
import {getContentTypeName} from '../../lib/contentTypes';
import {getContentTypeFromHeaders} from '../../lib/contentTypes';
import {MOD_SYM} from '../../lib/constants';
import {trackEvent} from '../../lib/analytics';
import {getContentTypeName} from 'backend/contentTypes';
import {getContentTypeFromHeaders} from 'backend/contentTypes';
import {MOD_SYM} from 'backend/constants';
import {trackEvent} from 'backend/analytics';
import {debounce} from '../lib/debounce';
class RequestPane extends Component {
@@ -143,41 +143,47 @@ class RequestPane extends Component {
lineWrapping={editorLineWrapping}
/>
</TabPanel>
<TabPanel>
<AuthEditor
showPasswords={showPasswords}
request={request}
onChange={updateRequestAuthentication}
/>
</TabPanel>
<TabPanel className="scrollable">
<div className="pad no-pad-bottom">
<label className="label--small">Url Preview</label>
<code className="txt-sm block">
<RenderedQueryString
request={request}
placeholder="http://myproduct.com?name=Gregory"
/>
</code>
<TabPanel className="scrollable-container">
<div className="scrollable">
<AuthEditor
showPasswords={showPasswords}
request={request}
onChange={updateRequestAuthentication}
/>
</div>
<KeyValueEditor
namePlaceholder="name"
valuePlaceholder="value"
pairs={request.parameters}
onChange={updateRequestParameters}
/>
</TabPanel>
<TabPanel className="scrollable">
<RequestHeadersEditor
headers={request.headers}
onChange={updateRequestHeaders}
bulk={useBulkHeaderEditor}
/>
<div className="pad no-pad-top text-right">
<button className="btn btn--outlined btn--super-compact"
onClick={() => updateSettingsUseBulkHeaderEditor(!useBulkHeaderEditor)}>
{useBulkHeaderEditor ? 'Regular Edit' : 'Bulk Edit'}
</button>
<TabPanel className="scrollable-container">
<div className="scrollable">
<div className="pad no-pad-bottom">
<label className="label--small">Url Preview</label>
<code className="txt-sm block">
<RenderedQueryString
request={request}
placeholder="http://myproduct.com?name=Gregory"
/>
</code>
</div>
<KeyValueEditor
namePlaceholder="name"
valuePlaceholder="value"
pairs={request.parameters}
onChange={updateRequestParameters}
/>
</div>
</TabPanel>
<TabPanel className="scrollable-container">
<div className="scrollable">
<RequestHeadersEditor
headers={request.headers}
onChange={updateRequestHeaders}
bulk={useBulkHeaderEditor}
/>
<div className="pad no-pad-top text-right">
<button className="btn btn--outlined btn--super-compact"
onClick={() => updateSettingsUseBulkHeaderEditor(!useBulkHeaderEditor)}>
{useBulkHeaderEditor ? 'Regular Edit' : 'Bulk Edit'}
</button>
</div>
</div>
</TabPanel>
</Tabs>

View File

@@ -1,4 +1,4 @@
import * as db from '../../lib/database';
import * as db from 'backend/database';
import React, {PropTypes, Component} from 'react';
import {Tab, Tabs, TabList, TabPanel} from 'react-tabs';
import ElmComponent from './ElmComponent';
@@ -7,12 +7,12 @@ import PreviewModeDropdown from './dropdowns/PreviewModeDropdown';
import ResponseViewer from './viewers/ResponseViewer';
import ResponseHeadersViewer from './viewers/ResponseHeadersViewer';
import ResponseCookiesViewer from './viewers/ResponseCookiesViewer';
import {getPreviewModeName, PREVIEW_MODE_SOURCE} from '../../lib/previewModes';
import {REQUEST_TIME_TO_SHOW_COUNTER, MOD_SYM} from '../../lib/constants';
import {trackEvent} from '../../lib/analytics';
import {getSetCookieHeaders} from '../../lib/util';
import {cancelCurrentRequest} from '../../lib/network';
import {RESPONSE_CODE_DESCRIPTIONS} from '../../lib/constants';
import {getPreviewModeName, PREVIEW_MODE_SOURCE} from 'backend/previewModes';
import {REQUEST_TIME_TO_SHOW_COUNTER, MOD_SYM} from 'backend/constants';
import {trackEvent} from 'backend/analytics';
import {getSetCookieHeaders} from 'backend/util';
import {cancelCurrentRequest} from 'backend/network';
import {RESPONSE_CODE_DESCRIPTIONS} from 'backend/constants';
class ResponsePane extends Component {
constructor (props) {
@@ -208,18 +208,22 @@ class ResponsePane extends Component {
url={response.url}
/>
</TabPanel>
<TabPanel className="scrollable pad">
<ResponseCookiesViewer
showCookiesModal={showCookiesModal}
key={response._id}
headers={cookieHeaders}
/>
<TabPanel className="scrollable-container">
<div className="scrollable pad">
<ResponseCookiesViewer
showCookiesModal={showCookiesModal}
key={response._id}
headers={cookieHeaders}
/>
</div>
</TabPanel>
<TabPanel className="scrollable pad">
<ResponseHeadersViewer
key={response._id}
headers={response.headers}
/>
<TabPanel className="scrollable-container">
<div className="scrollable pad">
<ResponseHeadersViewer
key={response._id}
headers={response.headers}
/>
</div>
</TabPanel>
</Tabs>
</section>

View File

@@ -1,5 +1,5 @@
import React, {PropTypes} from 'react';
import {MOD_SYM} from '../../../lib/constants';
import {MOD_SYM} from 'backend/constants';
const DropdownHint = ({char}) => (
<div className="dropdown__hint">

View File

@@ -1,5 +1,5 @@
import React, {Component, PropTypes} from 'react';
import {DEBOUNCE_MILLIS} from '../../../lib/constants';
import {DEBOUNCE_MILLIS} from 'backend/constants';
class Editable extends Component {
constructor (props) {

View File

@@ -6,7 +6,7 @@ import JSONPath from 'jsonpath-plus';
import vkBeautify from 'vkbeautify';
import {DOMParser} from 'xmldom';
import xpath from 'xpath';
import {DEBOUNCE_MILLIS} from '../../../lib/constants';
import {DEBOUNCE_MILLIS} from 'backend/constants';
import 'codemirror/mode/css/css';
import 'codemirror/mode/htmlmixed/htmlmixed';
import 'codemirror/mode/javascript/javascript';
@@ -42,7 +42,7 @@ import '../../css/components/editor.less';
import {getModal} from '../modals/index';
import AlertModal from '../modals/AlertModal';
import Link from '../base/Link';
import {trackEvent} from '../../../lib/analytics';
import {trackEvent} from 'backend/analytics';
const BASE_CODEMIRROR_OPTIONS = {

View File

@@ -1,6 +1,6 @@
import React, {Component, PropTypes} from 'react';
import classnames from 'classnames';
import {DEBOUNCE_MILLIS} from '../../../lib/constants';
import {DEBOUNCE_MILLIS} from 'backend/constants';
const NAME = 'name';
const VALUE = 'value';

View File

@@ -1,8 +1,8 @@
import React, {PropTypes} from 'react';
import Dropdown from '../base/Dropdown';
import {CONTENT_TYPES, getContentTypeName} from '../../../lib/contentTypes';
import {trackEvent} from '../../../lib/analytics';
import {CONTENT_TYPES, getContentTypeName} from 'backend/contentTypes';
import {trackEvent} from 'backend/analytics';
const ContentTypeDropdown = ({updateRequestContentType}) => {
return (

View File

@@ -1,8 +1,8 @@
import React, {PropTypes} from 'react';
import Dropdown from '../base/Dropdown';
import {PREVIEW_MODES, getPreviewModeName} from '../../../lib/previewModes';
import {trackEvent} from '../../../lib/analytics';
import {PREVIEW_MODES, getPreviewModeName} from 'backend/previewModes';
import {trackEvent} from 'backend/analytics';
const PreviewModeDropdown = ({updatePreviewMode}) => {
return (

View File

@@ -1,9 +1,9 @@
import React, {PropTypes, Component} from 'react';
import Editor from '../base/Editor';
import KeyValueEditor from '../base/KeyValueEditor';
import {CONTENT_TYPE_FORM_URLENCODED} from '../../../lib/contentTypes';
import {getContentTypeFromHeaders} from '../../../lib/contentTypes';
import * as querystring from '../../../lib/querystring';
import {CONTENT_TYPE_FORM_URLENCODED} from 'backend/contentTypes';
import {getContentTypeFromHeaders} from 'backend/contentTypes';
import * as querystring from 'backend/querystring';
class BodyEditor extends Component {
static _getBodyFromPairs (pairs) {

View File

@@ -2,7 +2,7 @@ import React, {PropTypes, Component} from 'react';
import {Cookie} from 'tough-cookie';
import CookieInput from '../CookieInput';
import {cookieToString} from '../../../lib/cookies';
import {cookieToString} from 'backend/cookies';
class CookiesEditor extends Component {

View File

@@ -5,8 +5,8 @@ import Modal from '../base/Modal';
import ModalBody from '../base/ModalBody';
import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import {CHANGELOG_URL} from '../../../lib/constants';
import {getAppVersion} from '../../../lib/appInfo';
import {CHANGELOG_URL} from 'backend/constants';
import {getAppVersion} from 'backend/appInfo';
class ChangelogModal extends Component {
constructor (props) {

View File

@@ -5,8 +5,8 @@ import ModalBody from '../base/ModalBody';
import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import CookiesEditor from '../editors/CookiesEditor';
import * as db from '../../../lib/database';
import {DEBOUNCE_MILLIS} from '../../../lib/constants';
import * as db from 'backend/database';
import {DEBOUNCE_MILLIS} from 'backend/constants';
class CookiesModal extends Component {
constructor (props) {

View File

@@ -8,7 +8,7 @@ import Modal from '../base/Modal';
import ModalBody from '../base/ModalBody';
import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import {exportHar} from '../../../lib/export/har';
import {exportHar} from 'backend/export/har';
const DEFAULT_TARGET = availableTargets().find(t => t.key === 'shell');
const DEFAULT_CLIENT = DEFAULT_TARGET.clients.find(t => t.key === 'curl');

View File

@@ -5,8 +5,8 @@ import Modal from '../base/Modal';
import ModalHeader from '../base/ModalHeader';
import ModalBody from '../base/ModalBody';
import MethodTag from '../tags/MethodTag';
import * as db from '../../../lib/database';
import {trackEvent} from '../../../lib/analytics';
import * as db from 'backend/database';
import {trackEvent} from 'backend/analytics';
class RequestSwitcherModal extends Component {

View File

@@ -10,8 +10,8 @@ import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import KeyboardShortcutsTable from '../KeyboardShortcutsTable';
import * as GlobalActions from '../../redux/modules/global';
import * as db from '../../../lib/database';
import {getAppVersion, getAppName, getAppLongName} from '../../../lib/appInfo';
import * as db from 'backend/database';
import {getAppVersion, getAppName, getAppLongName} from 'backend/appInfo';
class SettingsTabs extends Component {

View File

@@ -8,7 +8,7 @@ import Modal from '../base/Modal';
import ModalBody from '../base/ModalBody';
import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import * as db from '../../../lib/database'
import * as db from 'backend/database'
class WorkspaceEnvironmentsEditModal extends Component {

View File

@@ -6,8 +6,8 @@ import SidebarRequestRow from './SidebarRequestRow';
import SidebarRequestGroupRow from './SidebarRequestGroupRow';
import SidebarFilter from './SidebarFilter';
import WorkspaceDropdown from '../../containers/WorkspaceDropdown';
import {SIDEBAR_SKINNY_REMS} from '../../../lib/constants';
import {COLLAPSE_SIDEBAR_REMS} from '../../../lib/constants';
import {SIDEBAR_SKINNY_REMS} from 'backend/constants';
import {COLLAPSE_SIDEBAR_REMS} from 'backend/constants';
class Sidebar extends Component {

View File

@@ -1,7 +1,7 @@
import React, {Component, PropTypes} from 'react';
import Dropdown from '../base/Dropdown';
import DropdownHint from '../base/DropdownHint';
import {DEBOUNCE_MILLIS} from '../../../lib/constants';
import {DEBOUNCE_MILLIS} from 'backend/constants';
class SidebarFilter extends Component {

View File

@@ -5,7 +5,7 @@ import classnames from 'classnames';
import RequestActionsDropdown from '../../containers/RequestActionsDropdown';
import Editable from '../base/Editable';
import MethodTag from '../tags/MethodTag';
import * as db from '../../../lib/database';
import * as db from 'backend/database';
import * as ReactDOM from 'react/lib/ReactDOM';

View File

@@ -1,5 +1,5 @@
import React, {PropTypes} from 'react';
import * as constants from '../../../lib/constants';
import * as constants from 'backend/constants';
const MethodTag = ({method, fullNames}) => {
let methodName = method;

View File

@@ -6,7 +6,7 @@ import ResponseError from './ResponseError';
import {
PREVIEW_MODE_FRIENDLY,
PREVIEW_MODE_SOURCE
} from '../../../lib/previewModes';
} from 'backend/previewModes';
class ResponseViewer extends Component {
shouldComponentUpdate (nextProps) {

View File

@@ -19,7 +19,7 @@ import SettingsModal from '../components/modals/SettingsModal';
import RequestPane from '../components/RequestPane';
import ResponsePane from '../components/ResponsePane';
import Sidebar from '../components/sidebar/Sidebar';
import {PREVIEW_MODE_FRIENDLY} from '../../lib/previewModes';
import {PREVIEW_MODE_FRIENDLY} from 'backend/previewModes';
import {
MAX_PANE_WIDTH,
MIN_PANE_WIDTH,
@@ -28,14 +28,14 @@ import {
MIN_SIDEBAR_REMS,
DEFAULT_SIDEBAR_WIDTH,
CHECK_FOR_UPDATES_INTERVAL
} from '../../lib/constants';
} from 'backend/constants';
import * as GlobalActions from '../redux/modules/global';
import * as RequestActions from '../redux/modules/requests';
import * as WorkspaceActions from '../redux/modules/workspaces';
import * as db from '../../lib/database';
import {importCurl} from '../../lib/export/curl';
import {trackEvent} from '../../lib/analytics';
import {getAppVersion} from '../../lib/appInfo';
import * as db from 'backend/database';
import {importCurl} from 'backend/export/curl';
import {trackEvent} from 'backend/analytics';
import {getAppVersion} from 'backend/appInfo';
import {getModal} from '../components/modals/index';

View File

@@ -7,7 +7,7 @@ import EnvironmentsModal from '../components/modals/WorkspaceEnvironmentsEditMod
import Dropdown from '../components/base/Dropdown';
import DropdownDivider from '../components/base/DropdownDivider';
import {getModal} from '../components/modals/index';
import * as db from '../../lib/database';
import * as db from 'backend/database';
class EnvironmentsDropdown extends Component {

View File

@@ -5,7 +5,7 @@ import Dropdown from '../components/base/Dropdown';
import DropdownHint from '../components/base/DropdownHint';
import GenerateCodeModal from '../components/modals/GenerateCodeModal';
import PromptModal from '../components/modals/PromptModal';
import * as db from '../../lib/database';
import * as db from 'backend/database';
import {getModal} from '../components/modals/index';

View File

@@ -6,7 +6,7 @@ import DropdownHint from '../components/base/DropdownHint';
import DropdownDivider from '../components/base/DropdownDivider';
import EnvironmentEditModal from '../components/modals/EnvironmentEditModal';
import PromptModal from '../components/modals/PromptModal';
import * as db from '../../lib/database';
import * as db from 'backend/database';
import {getModal} from '../components/modals/index';
class RequestGroupActionsDropdown extends Component {

View File

@@ -14,8 +14,8 @@ import SettingsModal from '../components/modals/SettingsModal';
import ChangelogModal from '../components/modals/ChangelogModal';
import * as WorkspaceActions from '../redux/modules/workspaces';
import * as GlobalActions from '../redux/modules/global';
import * as db from '../../lib/database';
import {getAppVersion} from '../../lib/appInfo';
import * as db from 'backend/database';
import {getAppVersion} from 'backend/appInfo';
import {getModal} from '../components/modals/index';
class WorkspaceDropdown extends Component {

View File

@@ -76,6 +76,7 @@
.ReactTabs__TabPanel {
width: 100%;
height: 100%;
position: relative;
box-sizing: border-box;
}
}

View File

@@ -250,6 +250,19 @@ i.fa {
.scrollable {
overflow: auto;
position: relative;
}
.scrollable-container {
position: relative;
& > .scrollable {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
}
.hover-scrollbars {

View File

@@ -24,9 +24,9 @@ import './css/lib/fonts/open-sans.css'
import './css/index.less'
import './css/lib/chrome/platform_app.css'
import {initStore} from './redux/initstore';
import {initDB} from './../lib/database';
import {getAppVersion} from './../lib/appInfo';
import {initAnalytics} from './../lib/analytics';
import {initDB} from 'backend/database';
import {getAppVersion} from 'backend/appInfo';
import {initAnalytics} from 'backend/analytics';
// Don't inject component styles (use our own)
Tabs.setUseDefaultStyles(false);

View File

@@ -1,4 +1,4 @@
import {DEBOUNCE_MILLIS} from '../../lib/constants';
import {DEBOUNCE_MILLIS} from 'backend/constants';
export function debounce (callback) {
let timeout = null;

View File

@@ -2,7 +2,7 @@ import {createStore, applyMiddleware} from 'redux';
import thunkMiddleware from 'redux-thunk'
import localStorageMiddleware, {getState} from './middleware/localstorage';
import rootReducer from './reducer';
import {LOCALSTORAGE_KEY} from '../../lib/constants';
import {LOCALSTORAGE_KEY} from 'backend/constants';
export default function configureStore () {

View File

@@ -1,7 +1,7 @@
import {bindActionCreators} from 'redux';
import * as entitiesActions from './modules/entities';
import * as db from '../../lib/database';
import {CHANGE_INSERT, CHANGE_UPDATE, CHANGE_REMOVE} from '../../lib/database';
import * as db from 'backend/database';
import {CHANGE_INSERT, CHANGE_UPDATE, CHANGE_REMOVE} from 'backend/database';
const CHANGE_ID = 'store.listener';

View File

@@ -4,7 +4,7 @@ import {
ALL_TYPES,
TYPE_RESPONSE,
TYPE_STATS
} from '../../../lib/database/index';
} from 'backend/database/index';
const ENTITY_BLACKLIST = {
[TYPE_RESPONSE]: 1,

View File

@@ -1,9 +1,9 @@
import electron from 'electron';
import fs from 'fs';
import {importJSON, exportJSON} from '../../../lib/export/database';
import * as db from '../../../lib/database/index';
import {trackEvent} from '../../../lib/analytics';
import {importJSON, exportJSON} from 'backend/export/database';
import * as db from 'backend/database/index';
import {trackEvent} from 'backend/analytics';
const LOAD_START = 'global/load-start';
const LOAD_STOP = 'global/load-stop';

View File

@@ -1,7 +1,7 @@
import {combineReducers} from 'redux';
import {trackEvent} from '../../../lib/analytics';
import * as network from '../../../lib/network';
import {trackEvent} from 'backend/analytics';
import * as network from 'backend/network';
export const REQUEST_CHANGE_FILTER = 'requests/filter';
export const REQUEST_SEND_START = 'requests/start';

View File

@@ -1,5 +1,5 @@
import {combineReducers} from 'redux';
import {MODAL_WORKSPACE_RENAME} from '../../../lib/constants';
import {MODAL_WORKSPACE_RENAME} from 'backend/constants';
export const WORKSPACE_ACTIVATE = 'workspaces/activate';

View File

@@ -19,7 +19,7 @@ export default {
id: 'babel',
test: /\.(js|jsx)$/,
loaders: ['babel'],
exclude: /node_modules/
exclude: [/node_modules/, /backend/, /__fixtures__/, /__tests__/]
},
{
test: /\.elm$/,
@@ -61,6 +61,9 @@ export default {
]
},
resolve: {
alias: {
'backend': path.resolve(__dirname, '../app/backend')
},
extensions: ['', '.js', '.json', '.jsx'],
packageMains: ['webpack', 'browser', 'web', 'browserify', ['jam', 'main'], 'main']
},
@@ -71,4 +74,3 @@ export default {
plugins: [],
target: 'electron-renderer'
};