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

243 lines
8.4 KiB
TypeScript
Raw Normal View History

import 'core-js/stable';
import 'regenerator-runtime/runtime';
import * as electron from 'electron';
2021-07-22 23:04:56 +00:00
import installExtension, { REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS } from 'electron-devtools-installer';
import path from 'path';
import appConfig from '../config/config.json';
import { trackNonInteractiveEventQueueable } from './common/analytics';
import { changelogUrl, getAppVersion, isDevelopment, isMac } from './common/constants';
import { database } from './common/database';
2021-10-24 03:05:03 +00:00
import { disableSpellcheckerDownload, exitAppFailure } from './common/electron-helpers';
2021-07-22 23:04:56 +00:00
import log, { initializeLogging } from './common/log';
import { validateInsomniaConfig } from './common/validate-insomnia-config';
import * as errorHandling from './main/error-handling';
2020-11-11 22:44:03 +00:00
import * as grpcIpcMain from './main/grpc-ipc-main';
2021-07-22 23:04:56 +00:00
import { checkIfRestartNeeded } from './main/squirrel-startup';
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';
2018-06-25 17:42:50 +00:00
import type { Stats } from './models/stats';
2021-07-22 23:04:56 +00:00
import type { ToastNotification } from './ui/components/toast';
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
2020-10-13 16:05:41 +00:00
initializeLogging();
2018-06-25 17:42:50 +00:00
const { app, ipcMain, session } = electron;
const commandLineArgs = process.argv.slice(1);
2020-10-13 16:05:41 +00:00
log.info(`Running version ${getAppVersion()}`);
// 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;
// When the app is first launched
app.on('ready', async () => {
const { error } = validateInsomniaConfig();
if (error) {
electron.dialog.showErrorBox(error.title, error.message);
console.log('[config] Insomnia config is invalid, preventing app initialization');
2021-10-24 03:05:03 +00:00
exitAppFailure();
return;
}
disableSpellcheckerDownload();
if (isDevelopment()) {
try {
const extensions = [REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS];
const extensionsPlural = extensions.length > 0 ? 's' : '';
const names = await Promise.all(extensions.map(extension => installExtension(extension)));
console.log(`[electron-extensions] Added DevTools Extension${extensionsPlural}: ${names.join(', ')}`);
} catch (err) {
console.log('[electron-extensions] An error occurred: ', err);
}
}
// Init some important things first
await database.init(models.types());
2021-02-25 20:13:37 +00:00
await _createModelInstances();
await errorHandling.init();
await windowUtils.init();
// Init the app
2021-02-25 20:13:37 +00:00
const updatedStats = await _trackStats();
await _updateFlags(updatedStats);
await _launchApp();
// Init the rest
await updates.init();
2020-11-11 22:44:03 +00:00
grpcIpcMain.init();
});
// Set as default protocol
const defaultProtocol = `insomnia${isDevelopment() ? 'dev' : ''}`;
const fullDefaultProtocol = `${defaultProtocol}://`;
const defaultProtocolSuccessful = app.setAsDefaultProtocolClient(defaultProtocol);
if (defaultProtocolSuccessful) {
console.log(`[electron client protocol] successfully set default protocol '${fullDefaultProtocol}'`);
} else {
console.error(`[electron client protocol] FAILED to set default protocol '${fullDefaultProtocol}'`);
const isDefaultAlready = app.isDefaultProtocolClient(defaultProtocol);
if (isDefaultAlready) {
console.log(`[electron client protocol] the current executable is the default protocol for '${fullDefaultProtocol}'`);
} else {
console.log(`[electron client protocol] the current executable is not the default protocol for '${fullDefaultProtocol}'`);
}
// Note: `getApplicationInfoForProtocol` is not available on Linux, so we use `getApplicationNameForProtocol` instead
const applicationName = app.getApplicationNameForProtocol(fullDefaultProtocol);
if (applicationName) {
console.log(`[electron client protocol] the default application set for '${fullDefaultProtocol}' is '${applicationName}'`);
} else {
console.error(`[electron client protocol] the default application set for '${fullDefaultProtocol}' was not found`);
}
}
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', (_error, hasVisibleWindows) => {
2016-12-01 18:48:49 +00:00
// 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();
// Handle URLs sent via command line args
ipcMain.once('window-ready', () => {
// @ts-expect-error -- TSCONVERSION
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', () => {
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
// 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
});
// Handle URLs when app already open
app.addListener('open-url', (_error, url) => {
// @ts-expect-error -- TSCONVERSION
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
});
}
2021-02-25 20:13:37 +00:00
/*
Only one instance should exist of these models
On rare occasions, race conditions during initialization result in multiple being created
To avoid that, create them explicitly prior to any initialization steps
*/
async function _createModelInstances() {
await models.stats.get();
await models.settings.getOrCreate();
}
async function _updateFlags({ launches }: Stats) {
const firstLaunch = launches === 1;
if (firstLaunch) {
await models.settings.patch({ hasPromptedAnalytics: false });
2021-02-25 20:13:37 +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",
message: `Updated to ${currentVersion}`,
};
// Wait a bit before showing the user because the app just launched.
setTimeout(() => {
for (const window of BrowserWindow.getAllWindows()) {
// @ts-expect-error -- TSCONVERSION likely needs to be window.webContents.send instead
window.send('show-notification', notification);
}
}, 5000);
});
2021-02-25 20:13:37 +00:00
return stats;
}