mirror of
https://github.com/Kong/insomnia.git
synced 2026-04-20 14:17:29 -04:00
Support postman env imports, and bug fixes
This commit is contained in:
@@ -137,7 +137,7 @@ export function getContentTypeName (contentType) {
|
||||
if (typeof contentType !== 'string') {
|
||||
return 'No Body';
|
||||
} else {
|
||||
return contentTypesMap[contentType] || '';
|
||||
return contentTypesMap[contentType] || 'Other';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -189,13 +189,13 @@ export async function upsert (doc, fromSync = false) {
|
||||
|
||||
export function insert (doc, fromSync = false) {
|
||||
return new Promise((resolve, reject) => {
|
||||
db[doc.type].insert(doc, (err, newDoc) => {
|
||||
const docWithDefaults = initModel(doc.type, doc);
|
||||
db[doc.type].insert(docWithDefaults, (err, newDoc) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
notifyOfChange(CHANGE_INSERT, doc, fromSync);
|
||||
|
||||
notifyOfChange(CHANGE_INSERT, newDoc, fromSync);
|
||||
resolve(newDoc);
|
||||
});
|
||||
});
|
||||
@@ -203,14 +203,15 @@ export function insert (doc, fromSync = false) {
|
||||
|
||||
export function update (doc, fromSync = false) {
|
||||
return new Promise((resolve, reject) => {
|
||||
db[doc.type].update({_id: doc._id}, doc, err => {
|
||||
const docWithDefaults = initModel(doc.type, doc);
|
||||
db[doc.type].update({_id: docWithDefaults._id}, docWithDefaults, err => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
notifyOfChange(CHANGE_UPDATE, doc, fromSync);
|
||||
notifyOfChange(CHANGE_UPDATE, docWithDefaults, fromSync);
|
||||
|
||||
resolve(doc);
|
||||
resolve(docWithDefaults);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -28,12 +28,19 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
|
||||
try {
|
||||
results = convert(rawContent);
|
||||
} catch (e) {
|
||||
console.error('Failed to import data', e);
|
||||
return;
|
||||
console.warn('Failed to import data', e);
|
||||
return {
|
||||
source: 'not found',
|
||||
error: 'No importers found for file',
|
||||
summary: {}
|
||||
};
|
||||
}
|
||||
|
||||
const {data} = results;
|
||||
|
||||
// Fetch the base environment in case we need it
|
||||
const baseEnvironment = await models.environment.getOrCreateForWorkspace(workspace);
|
||||
|
||||
// Generate all the ids we may need
|
||||
const generatedIds = {};
|
||||
for (const r of data.resources) {
|
||||
@@ -42,8 +49,9 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
|
||||
}
|
||||
}
|
||||
|
||||
// Also always replace __WORKSPACE_ID__ with the current workspace if we see it
|
||||
// Always replace these "constants"
|
||||
generatedIds['__WORKSPACE_ID__'] = workspace._id;
|
||||
generatedIds['__BASE_ENVIRONMENT_ID__'] = baseEnvironment._id;
|
||||
|
||||
// Import everything backwards so they get inserted in the correct order
|
||||
data.resources.reverse();
|
||||
@@ -90,7 +98,8 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
|
||||
|
||||
return {
|
||||
source: results.type.id,
|
||||
summary: importedDocs
|
||||
summary: importedDocs,
|
||||
error: null
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"hkdf": "0.0.2",
|
||||
"httpsnippet": "git@github.com:getinsomnia/httpsnippet.git#a3a2c0a0167fa844bf92df52a1442fa1d68a9053",
|
||||
"insomnia-importers": "^1.0.0",
|
||||
"insomnia-importers": "^1.1.2",
|
||||
"json-lint": "^0.1.0",
|
||||
"jsonpath-plus": "^0.15.0",
|
||||
"mime-types": "^2.1.12",
|
||||
|
||||
@@ -70,7 +70,6 @@ class RequestPane extends PureComponent {
|
||||
editorFontSize,
|
||||
editorLineWrapping,
|
||||
handleSend,
|
||||
workspace,
|
||||
forceRefreshCounter,
|
||||
useBulkHeaderEditor,
|
||||
handleGenerateCode,
|
||||
|
||||
@@ -51,7 +51,8 @@ class Wrapper extends Component {
|
||||
const {activeRequest} = this.props;
|
||||
|
||||
try {
|
||||
const {resources} = importers.import(url);
|
||||
const {data} = importers.convert(url);
|
||||
const {resources} = data;
|
||||
const r = resources[0];
|
||||
|
||||
if (r && r._type === 'request') {
|
||||
@@ -82,7 +83,10 @@ class Wrapper extends Component {
|
||||
_handleUpdateSettingsUseBulkHeaderEditor = useBulkHeaderEditor => sUpdate(this.props.settings, {useBulkHeaderEditor});
|
||||
|
||||
// Other Helpers
|
||||
_handleImportFile = () => this.props.handleImportFileToWorkspace(this.props.activeWorkspace._id);
|
||||
_handleImportFile = () => {
|
||||
console.log('IMPORT', this.props);
|
||||
this.props.handleImportFileToWorkspace(this.props.activeWorkspace._id);
|
||||
}
|
||||
_handleExportWorkspaceToFile = () => this.props.handleExportFile(this.props.activeWorkspace._id);
|
||||
_handleSetActiveResponse = responseId => this.props.handleSetActiveResponse(this.props.activeRequest._id, responseId);
|
||||
_handleShowEnvironmentsModal = () => showModal(WorkspaceEnvironmentsEditModal, this.props.activeWorkspace);
|
||||
|
||||
@@ -19,7 +19,7 @@ class LoginModal extends Component {
|
||||
message: '',
|
||||
};
|
||||
|
||||
async _handleLogin (e) {
|
||||
_handleLogin = async e => {
|
||||
e.preventDefault();
|
||||
this.setState({error: '', loading: true});
|
||||
|
||||
@@ -39,15 +39,15 @@ class LoginModal extends Component {
|
||||
} catch (e) {
|
||||
this.setState({error: e.message, loading: false});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_handleSignup (e) {
|
||||
_handleSignup = e => {
|
||||
e.preventDefault();
|
||||
|
||||
this.modal.hide();
|
||||
showModal(SignupModal);
|
||||
trackEvent('Login', 'Switch to Signup');
|
||||
}
|
||||
};
|
||||
|
||||
show (options = {}) {
|
||||
const {title, message} = options;
|
||||
@@ -66,7 +66,7 @@ class LoginModal extends Component {
|
||||
{message ? (
|
||||
<p className="notice info">{message}</p>
|
||||
) : null}
|
||||
<div className="form-control form-control--outlined">
|
||||
<div className="form-control form-control--outlined no-pad-top">
|
||||
<label>Email
|
||||
<input
|
||||
type="email"
|
||||
@@ -92,7 +92,7 @@ class LoginModal extends Component {
|
||||
<div className="margin-left">
|
||||
Don't have an account yet?
|
||||
{" "}
|
||||
<a href="#" onClick={this._handleSignup.bind(this)}>Signup</a>
|
||||
<a href="#" onClick={this._handleSignup}>Signup</a>
|
||||
</div>
|
||||
<button type="submit" className="btn">
|
||||
{this.state.loading ? (
|
||||
@@ -105,7 +105,7 @@ class LoginModal extends Component {
|
||||
} else {
|
||||
inner = [
|
||||
<ModalHeader key="header">Login Success</ModalHeader>,
|
||||
<ModalBody key="body" className="pad">
|
||||
<ModalBody key="body" className="pad no-pad-top">
|
||||
<h1>Enjoy your stay!</h1>
|
||||
<p>
|
||||
If you have any questions or concerns, send you email to
|
||||
@@ -126,7 +126,7 @@ class LoginModal extends Component {
|
||||
}
|
||||
|
||||
return (
|
||||
<form onSubmit={this._handleLogin.bind(this)}>
|
||||
<form onSubmit={this._handleLogin}>
|
||||
<Modal ref={m => this.modal = m} {...this.props}>
|
||||
{inner}
|
||||
</Modal>
|
||||
|
||||
@@ -5,7 +5,7 @@ import Modal from '../base/Modal';
|
||||
import ModalBody from '../base/ModalBody';
|
||||
import ModalHeader from '../base/ModalHeader';
|
||||
import ModalFooter from '../base/ModalFooter';
|
||||
import {getContentTypeName, METHOD_GET, METHOD_HEAD, METHOD_OPTIONS} from '../../../common/constants';
|
||||
import {getContentTypeName, METHOD_GET, METHOD_HEAD, METHOD_OPTIONS, METHOD_DELETE} from '../../../common/constants';
|
||||
import * as models from '../../../models/index';
|
||||
import {trackEvent} from '../../../analytics/index';
|
||||
|
||||
@@ -52,6 +52,7 @@ class RequestCreateModal extends Component {
|
||||
return (
|
||||
selectedMethod === METHOD_GET ||
|
||||
selectedMethod === METHOD_HEAD ||
|
||||
selectedMethod === METHOD_DELETE ||
|
||||
selectedMethod === METHOD_OPTIONS
|
||||
);
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class SignupModal extends Component {
|
||||
<ModalHeader key="header">Sign Up For a New Account</ModalHeader>,
|
||||
<ModalBody key="body" className="pad">
|
||||
<div className={classnames({hide: step !== STEP_BASIC_INFO})}>
|
||||
<div className="form-control form-control--outlined">
|
||||
<div className="form-control form-control--outlined no-pad-top">
|
||||
<label>First Name
|
||||
<input
|
||||
type="text"
|
||||
@@ -178,10 +178,11 @@ class SignupModal extends Component {
|
||||
} else {
|
||||
inner = [
|
||||
<ModalHeader key="header">Account Created</ModalHeader>,
|
||||
<ModalBody key="body" className="pad">
|
||||
<ModalBody key="body" className="pad no-pad-top">
|
||||
<h1>Thanks for signing up!</h1>
|
||||
<p>
|
||||
A verification email has been sent to your email address.
|
||||
A verification email has been sent to your email address. You may now
|
||||
log in.
|
||||
</p>
|
||||
</ModalBody>,
|
||||
<ModalFooter key="footer">
|
||||
|
||||
@@ -23,17 +23,17 @@ const SettingsImportExport = ({
|
||||
Export Data <i className="fa fa-caret-down"></i>
|
||||
</DropdownButton>
|
||||
<DropdownDivider name="Choose Export Type"/>
|
||||
<DropdownItem onClick={e => handleExportWorkspace()}>
|
||||
<DropdownItem onClick={handleExportWorkspace}>
|
||||
<i className="fa fa-home"></i>
|
||||
Current Workspace
|
||||
</DropdownItem>
|
||||
<DropdownItem onClick={e => handleExportAll()}>
|
||||
<DropdownItem onClick={handleExportAll}>
|
||||
<i className="fa fa-empty"></i>
|
||||
All Workspaces
|
||||
</DropdownItem>
|
||||
</Dropdown>
|
||||
|
||||
<button className="btn btn--clicky" onClick={e => handleImport()}>
|
||||
<button className="btn btn--clicky" onClick={handleImport}>
|
||||
Import Data
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -125,9 +125,7 @@ class App extends Component {
|
||||
|
||||
_requestCreate = async (parentId) => {
|
||||
const request = await showModal(RequestCreateModal, {parentId});
|
||||
const {activeWorkspace, handleSetActiveRequest} = this.props;
|
||||
|
||||
handleSetActiveRequest(activeWorkspace._id, request._id);
|
||||
this._handleSetActiveRequest(request._id)
|
||||
};
|
||||
|
||||
_requestGroupDuplicate = async requestGroup => {
|
||||
@@ -135,14 +133,12 @@ class App extends Component {
|
||||
};
|
||||
|
||||
_requestDuplicate = async request => {
|
||||
const {activeWorkspace, handleSetActiveRequest} = this.props;
|
||||
|
||||
if (!request) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newRequest = await models.request.duplicate(request);
|
||||
handleSetActiveRequest(activeWorkspace._id, newRequest._id);
|
||||
this._handleSetActiveRequest(newRequest._id)
|
||||
};
|
||||
|
||||
_handleGenerateCode = () => {
|
||||
@@ -154,7 +150,8 @@ class App extends Component {
|
||||
if (requestGroupMeta) {
|
||||
await models.requestGroupMeta.update(requestGroupMeta, patch);
|
||||
} else {
|
||||
await models.requestGroupMeta.create({parentId: requestGroupId}, patch);
|
||||
const newPatch = Object.assign({parentId: requestGroupId}, patch);
|
||||
await models.requestGroupMeta.create(newPatch);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -164,7 +161,8 @@ class App extends Component {
|
||||
if (requestMeta) {
|
||||
await models.workspaceMeta.update(requestMeta, patch);
|
||||
} else {
|
||||
await models.workspaceMeta.create({parentId: workspaceId}, patch);
|
||||
const newPatch = Object.assign({parentId: workspaceId}, patch);
|
||||
await models.workspaceMeta.create(newPatch);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -173,7 +171,8 @@ class App extends Component {
|
||||
if (requestMeta) {
|
||||
await models.requestMeta.update(requestMeta, patch);
|
||||
} else {
|
||||
await models.requestMeta.create({parentId: requestId}, patch);
|
||||
const newPatch = Object.assign({parentId: requestId}, patch);
|
||||
await models.requestMeta.create(newPatch);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -117,7 +117,6 @@ export function importFile (workspaceId) {
|
||||
dispatch(loadStart());
|
||||
|
||||
const workspace = await models.workspace.getById(workspaceId);
|
||||
|
||||
const options = {
|
||||
title: 'Import Insomnia Data',
|
||||
buttonLabel: 'Import',
|
||||
@@ -144,12 +143,18 @@ export function importFile (workspaceId) {
|
||||
const data = fs.readFileSync(path, 'utf8');
|
||||
dispatch(loadStop());
|
||||
|
||||
const {summary, source} = await importRaw(workspace, data);
|
||||
const result = await importRaw(workspace, data);
|
||||
const {summary, source, error} = result;
|
||||
|
||||
if (error) {
|
||||
showModal(AlertModal, {title: 'Import Failed', message: error});
|
||||
return;
|
||||
}
|
||||
|
||||
let statements = Object.keys(summary).map(type => {
|
||||
const count = summary[type].length;
|
||||
const name = models.getModelName(type, count);
|
||||
return count === 0 ? null :`${count} ${name}`;
|
||||
return count === 0 ? null : `${count} ${name}`;
|
||||
}).filter(s => s !== null);
|
||||
|
||||
let message;
|
||||
@@ -159,10 +164,10 @@ export function importFile (workspaceId) {
|
||||
message = `You imported ${statements.join(', ')}!`;
|
||||
}
|
||||
showModal(AlertModal, {title: 'Import Succeeded', message});
|
||||
trackEvent('Import', source, 'Success');
|
||||
trackEvent('Import', 'Success', source);
|
||||
} catch (e) {
|
||||
showModal(AlertModal, {title: 'Import Failed', message: e + ''});
|
||||
trackEvent('Import', source, 'Failure');
|
||||
trackEvent('Import', 'Failure');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"hkdf": "0.0.2",
|
||||
"httpsnippet": "git@github.com:getinsomnia/httpsnippet.git#a3a2c0a0167fa844bf92df52a1442fa1d68a9053",
|
||||
"insomnia-importers": "^1.0.0",
|
||||
"insomnia-importers": "^1.1.2",
|
||||
"json-lint": "^0.1.0",
|
||||
"jsonpath-plus": "^0.15.0",
|
||||
"mime-types": "^2.1.12",
|
||||
|
||||
Reference in New Issue
Block a user