insomnia/packages/insomnia-app/app/main.development.js

177 lines
5.2 KiB
JavaScript
Raw Normal View History

// @flow
2019-05-10 16:30:20 +00:00
import { checkIfRestartNeeded } from './main/squirrel-startup';
import { appConfig } from '../config';
import path from 'path';
import * as electron from 'electron';
import * as errorHandling from './main/error-handling';
import * as updates from './main/updates';
Merge develop for 5.1.0 (#246) * Add Slack badge to README * Add Twitter badge * Appveyor badge * Fix badges again on README * Fix Twitter badge link * Simplify README.md * Migrate Travis secure items to Travis project settings (#198) * Remove docker linux build (using Travis now) (#199) * Fix travis build * Update Issue and PR templates (#200) * Add template for future pull requests * Format issue template like pull request template * Will not clear selected file if dialog is dismissed (#202) * #183, Body type "Text -> Other" reverts to previous body type (#193) * ISSUE#183 * Adding condition to check mime-type to other * Removing older changes for fixing issue. * Save full response to a file (#207) * Save full response to a file * Add a new button on the response preview pane * Save full response to file when button clicked * Update after PR comments * It's a Response, not a Request * Remove file extension requirement * Implement lazy tag rendering and some fixes (#211) * expanding to 3 decimals (#213) * Update PULL_REQUEST_TEMPLATE.md (#214) * Show build info in console (#216) * Add waiting message in dev mode while webpack compile happens * Switch license from GPL to AGPL (#221) * Default remote URLs to production * Don't use Curl's cookie handling (#220) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Add option to toggle Menu Bar showing for Windows/Linux (#225) * Add option to toggle MenuBar showing on Windows/Linux * Extract Toggling Menu Bar functionality to App Container. Default show Menu Bar. Remove tip from Response Pane. * Finalize {% response ... %} Tag (#224) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Update nunjucks-tags.js * Better Nunjucks Tag Editor (#234) * Helper to tokenize Nunjucks tag * More granular types * Add tag definitions * Improve editor to be more WYSIWYG * Fixed tests * Added raw response tag * A few improvements to tag editor enum * fix NTLM typo (#244) * Tweaks and fixes for next release (#245)
2017-05-24 16:25:22 +00:00
import * as windowUtils from './main/window-utils';
import * as models from './models/index';
import * as database from './common/database';
2020-04-26 20:33:39 +00:00
import { changelogUrl, getAppVersion, isDevelopment, isMac } from './common/constants';
2018-06-25 17:42:50 +00:00
import type { ToastNotification } from './ui/components/toast';
import type { Stats } from './models/stats';
2020-04-26 20:33:39 +00:00
import { trackNonInteractiveEventQueueable } from './common/analytics';
2016-12-01 18:48:49 +00:00
// Handle potential auto-update
2019-05-10 16:30:20 +00:00
if (checkIfRestartNeeded()) {
process.exit(0);
}
2016-12-01 18:48:49 +00:00
2018-06-25 17:42:50 +00:00
const { app, ipcMain, session } = electron;
const commandLineArgs = process.argv.slice(1);
2016-12-01 18:48:49 +00:00
// Explicitly set userData folder from config because it's sketchy to
// rely on electron-builder to use productName, which could be changed
// by accident.
if (!isDevelopment()) {
const defaultPath = app.getPath('userData');
const newPath = path.join(defaultPath, '../', appConfig().userDataFolder);
app.setPath('userData', newPath);
}
// So if (window) checks don't throw
global.window = global.window || undefined;
2016-12-01 18:48:49 +00:00
// When the app is first launched
app.on('ready', async () => {
// Init some important things first
await database.init(models.types());
await errorHandling.init();
await windowUtils.init();
// Init the app
await _trackStats();
await _launchApp();
2016-12-01 18:48:49 +00:00
// Init the rest
await updates.init();
});
2016-12-01 18:48:49 +00:00
// Set as default protocol
app.setAsDefaultProtocolClient(`insomnia${isDevelopment() ? 'dev' : ''}`);
2016-12-01 18:48:49 +00:00
2018-06-25 17:42:50 +00:00
function _addUrlToOpen(e, url) {
e.preventDefault();
commandLineArgs.push(url);
}
app.on('open-url', _addUrlToOpen);
2016-12-01 18:48:49 +00:00
// Enable this for CSS grid layout :)
app.commandLine.appendSwitch('enable-experimental-web-platform-features');
// Quit when all windows are closed (except on Mac).
app.on('window-all-closed', () => {
if (!isMac()) {
2016-12-01 18:48:49 +00:00
app.quit();
}
});
// Mac-only, when the user clicks the doc icon
app.on('activate', (e, hasVisibleWindows) => {
// Create a new window when clicking the doc icon if there isn't one open
if (!hasVisibleWindows) {
try {
Merge develop for 5.1.0 (#246) * Add Slack badge to README * Add Twitter badge * Appveyor badge * Fix badges again on README * Fix Twitter badge link * Simplify README.md * Migrate Travis secure items to Travis project settings (#198) * Remove docker linux build (using Travis now) (#199) * Fix travis build * Update Issue and PR templates (#200) * Add template for future pull requests * Format issue template like pull request template * Will not clear selected file if dialog is dismissed (#202) * #183, Body type "Text -> Other" reverts to previous body type (#193) * ISSUE#183 * Adding condition to check mime-type to other * Removing older changes for fixing issue. * Save full response to a file (#207) * Save full response to a file * Add a new button on the response preview pane * Save full response to file when button clicked * Update after PR comments * It's a Response, not a Request * Remove file extension requirement * Implement lazy tag rendering and some fixes (#211) * expanding to 3 decimals (#213) * Update PULL_REQUEST_TEMPLATE.md (#214) * Show build info in console (#216) * Add waiting message in dev mode while webpack compile happens * Switch license from GPL to AGPL (#221) * Default remote URLs to production * Don't use Curl's cookie handling (#220) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Add option to toggle Menu Bar showing for Windows/Linux (#225) * Add option to toggle MenuBar showing on Windows/Linux * Extract Toggling Menu Bar functionality to App Container. Default show Menu Bar. Remove tip from Response Pane. * Finalize {% response ... %} Tag (#224) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Update nunjucks-tags.js * Better Nunjucks Tag Editor (#234) * Helper to tokenize Nunjucks tag * More granular types * Add tag definitions * Improve editor to be more WYSIWYG * Fixed tests * Added raw response tag * A few improvements to tag editor enum * fix NTLM typo (#244) * Tweaks and fixes for next release (#245)
2017-05-24 16:25:22 +00:00
windowUtils.createWindow();
2016-12-01 18:48:49 +00:00
} catch (e) {
// This might happen if 'ready' hasn't fired yet. So we're just going
// to silence these errors.
console.log('[main] App not ready to "activate" yet');
2016-12-01 18:48:49 +00:00
}
}
});
2018-06-25 17:42:50 +00:00
function _launchApp() {
app.removeListener('open-url', _addUrlToOpen);
Merge develop for 5.1.0 (#246) * Add Slack badge to README * Add Twitter badge * Appveyor badge * Fix badges again on README * Fix Twitter badge link * Simplify README.md * Migrate Travis secure items to Travis project settings (#198) * Remove docker linux build (using Travis now) (#199) * Fix travis build * Update Issue and PR templates (#200) * Add template for future pull requests * Format issue template like pull request template * Will not clear selected file if dialog is dismissed (#202) * #183, Body type "Text -> Other" reverts to previous body type (#193) * ISSUE#183 * Adding condition to check mime-type to other * Removing older changes for fixing issue. * Save full response to a file (#207) * Save full response to a file * Add a new button on the response preview pane * Save full response to file when button clicked * Update after PR comments * It's a Response, not a Request * Remove file extension requirement * Implement lazy tag rendering and some fixes (#211) * expanding to 3 decimals (#213) * Update PULL_REQUEST_TEMPLATE.md (#214) * Show build info in console (#216) * Add waiting message in dev mode while webpack compile happens * Switch license from GPL to AGPL (#221) * Default remote URLs to production * Don't use Curl's cookie handling (#220) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Add option to toggle Menu Bar showing for Windows/Linux (#225) * Add option to toggle MenuBar showing on Windows/Linux * Extract Toggling Menu Bar functionality to App Container. Default show Menu Bar. Remove tip from Response Pane. * Finalize {% response ... %} Tag (#224) * Some improvements to the response tag * Add tests for XPath response queries * Refactor conditional element syntax * Update nunjucks-tags.js * Better Nunjucks Tag Editor (#234) * Helper to tokenize Nunjucks tag * More granular types * Add tag definitions * Improve editor to be more WYSIWYG * Fixed tests * Added raw response tag * A few improvements to tag editor enum * fix NTLM typo (#244) * Tweaks and fixes for next release (#245)
2017-05-24 16:25:22 +00:00
const window = windowUtils.createWindow();
2016-12-01 18:48:49 +00:00
// Handle URLs sent via command line args
ipcMain.once('window-ready', () => {
commandLineArgs.length && window.send('run-command', commandLineArgs[0]);
2016-12-01 18:48:49 +00:00
});
// Called when second instance launched with args (Windows)
Version Control (beta) (#1439) * VCS proof of concept underway! * Stuff * Some things * Replace deprecated Electron makeSingleInstance * Rename `window` variables so not to be confused with window object * Don't unnecessarily update request when URL does not change * Regenerate package-lock * Fix tests + ESLint * Publish - insomnia-app@1.0.49 - insomnia-cookies@0.0.12 - insomnia-httpsnippet@1.16.18 - insomnia-importers@2.0.13 - insomnia-libcurl@0.0.23 - insomnia-prettify@0.1.7 - insomnia-url@0.1.6 - insomnia-xpath@1.0.9 - insomnia-plugin-base64@1.0.6 - insomnia-plugin-cookie-jar@1.0.8 - insomnia-plugin-core-themes@1.0.5 - insomnia-plugin-default-headers@1.1.9 - insomnia-plugin-file@1.0.7 - insomnia-plugin-hash@1.0.7 - insomnia-plugin-jsonpath@1.0.12 - insomnia-plugin-now@1.0.11 - insomnia-plugin-os@1.0.13 - insomnia-plugin-prompt@1.1.9 - insomnia-plugin-request@1.0.18 - insomnia-plugin-response@1.0.16 - insomnia-plugin-uuid@1.0.10 * Broken but w/e * Some tweaks * Big refactor. Create local snapshots and push done * POC merging and a lot of improvements * Lots of work done on initial UI/UX * Fix old tests * Atomic writes and size-based batches * Update StageEntry definition once again to be better * Factor out GraphQL query logic * Merge algorithm, history modal, other minor things * Fix test * Merge, checkout, revert w/ user changes now work * Force UI to refresh when switching branches changes active request * Rough draft pull() and some cleanup * E2EE stuff and some refactoring * Add ability to share project with team and fixed tests * VCS now created in root component and better remote project handling * Remove unused definition * Publish - insomnia-account@0.0.2 - insomnia-app@1.1.1 - insomnia-cookies@0.0.14 - insomnia-httpsnippet@1.16.20 - insomnia-importers@2.0.15 - insomnia-libcurl@0.0.25 - insomnia-prettify@0.1.9 - insomnia-sync@0.0.2 - insomnia-url@0.1.8 - insomnia-xpath@1.0.11 - insomnia-plugin-base64@1.0.8 - insomnia-plugin-cookie-jar@1.0.10 - insomnia-plugin-core-themes@1.0.7 - insomnia-plugin-file@1.0.9 - insomnia-plugin-hash@1.0.9 - insomnia-plugin-jsonpath@1.0.14 - insomnia-plugin-now@1.0.13 - insomnia-plugin-os@1.0.15 - insomnia-plugin-prompt@1.1.11 - insomnia-plugin-request@1.0.20 - insomnia-plugin-response@1.0.18 - insomnia-plugin-uuid@1.0.12 * Move some deps around * Fix Flow errors * Update package.json * Fix eslint errors * Fix tests * Update deps * bootstrap insomnia-sync * TRy fixing appveyor * Try something else * Bump lerna * try powershell * Try again * Fix imports * Fixed errors * sync types refactor * Show remote projects in workspace dropdown * Improved pulling of non-local workspaces * Loading indicators and some tweaks * Clean up sync staging modal * Some sync improvements: - No longer store stage - Upgrade Electron - Sync UI/UX improvements * Fix snyc tests * Upgraded deps and hot loader tweaks (it's broken for some reason) * Fix tests * Branches dialog, network refactoring, some tweaks * Fixed merging when other branch is empty * A bunch of small fixes from real testing * Fixed pull merge logic * Fix tests * Some bug fixes * A few small tweaks * Conflict resolution and other improvements * Fix tests * Add revert changes * Deal with duplicate projects per workspace * Some tweaks and accessibility improvements * Tooltip accessibility * Fix API endpoint * Fix tests * Remove jest dep from insomnia-importers
2019-04-18 00:50:03 +00:00
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
console.error('[app] Failed to get instance lock');
return;
}
app.on('second-instance', (event, commandLine, workingDirectory) => {
// Someone tried to run a second instance, we should focus our window.
if (window) {
if (window.isMinimized()) window.restore();
window.focus();
}
2016-12-01 18:48:49 +00:00
});
2016-12-01 20:22:43 +00:00
// Handle URLs when app already open
app.addListener('open-url', (e, url) => {
window.send('run-command', url);
// Apparently a timeout is needed because Chrome steals back focus immediately
// after opening the URL.
setTimeout(() => {
window.focus();
}, 100);
2016-12-01 18:48:49 +00:00
});
2017-08-01 22:03:12 +00:00
// Don't send origin header from Insomnia app because we're not technically using CORS
session.defaultSession.webRequest.onBeforeSendHeaders((details, fn) => {
delete details.requestHeaders.Origin;
fn({
cancel: false,
requestHeaders: details.requestHeaders,
});
2017-08-01 22:03:12 +00:00
});
}
2018-06-25 17:42:50 +00:00
async function _trackStats() {
// Handle the stats
const oldStats = await models.stats.get();
const stats: Stats = await models.stats.update({
currentLaunch: Date.now(),
lastLaunch: oldStats.currentLaunch,
currentVersion: getAppVersion(),
lastVersion: oldStats.currentVersion,
launches: oldStats.launches + 1,
});
// Update Stats Object
const firstLaunch = stats.launches === 1;
2018-10-17 16:42:33 +00:00
const justUpdated = !firstLaunch && stats.currentVersion !== stats.lastVersion;
2020-04-26 20:33:39 +00:00
if (firstLaunch) {
trackNonInteractiveEventQueueable('General', 'First Launch', stats.currentVersion);
} else if (justUpdated) {
trackNonInteractiveEventQueueable('General', 'Updated', stats.currentVersion);
} else {
trackNonInteractiveEventQueueable('General', 'Launched', stats.currentVersion);
}
ipcMain.once('window-ready', () => {
2018-06-25 17:42:50 +00:00
const { currentVersion } = stats;
if (!justUpdated || !currentVersion) {
return;
}
2018-06-25 17:42:50 +00:00
const { BrowserWindow } = electron;
const notification: ToastNotification = {
key: `updated-${currentVersion}`,
2020-04-26 20:33:39 +00:00
url: changelogUrl(),
cta: "See What's New",
email: appConfig().gravatarEmail,
message: `Updated to ${currentVersion}`,
};
// Wait a bit before showing the user because the app just launched.
setTimeout(() => {
for (const window of BrowserWindow.getAllWindows()) {
window.send('show-notification', notification);
}
}, 5000);
});
}