diff --git a/packages/insomnia-app/app/common/analytics.js b/packages/insomnia-app/app/common/analytics.js index d39bb1aa7..aa22f5231 100644 --- a/packages/insomnia-app/app/common/analytics.js +++ b/packages/insomnia-app/app/common/analytics.js @@ -11,10 +11,13 @@ import { getAppVersion, getGoogleAnalyticsId, getGoogleAnalyticsLocation, + getSegmentWriteKey, isDevelopment, } from './constants'; import type { RequestParameter } from '../models/request'; import { getScreenResolution, getUserLanguage, getViewportSize } from './misc'; +import Analytics from 'analytics-node'; +import { getAccountId } from '../account/session'; const DIMENSION_PLATFORM = 1; const DIMENSION_VERSION = 2; @@ -105,10 +108,62 @@ export async function getDeviceId(): Promise { return deviceId; } +let segmentClient = null; + +export async function trackSegmentEvent(event: String, properties?: Object) { + try { + if (!segmentClient) { + segmentClient = new Analytics(getSegmentWriteKey(), { + axiosConfig: { + // This is needed to ensure that we use the NodeJS adapter in the render process + ...(global?.require && { adapter: global.require('axios/lib/adapters/http') }), + }, + }); + } + + const anonymousId = await getDeviceId(); + + // TODO: This currently always returns an empty string in the main process + // This is due to the session data being stored in localStorage + const userId = getAccountId(); + + segmentClient.track({ + anonymousId, + userId, + event, + properties, + context: { + app: { + name: getAppName(), + version: getAppVersion(), + }, + os: { + name: _getOsName(), + version: process.getSystemVersion(), + }, + }, + }); + } catch (err) { + console.warn('[analytics] Error sending segment event', err); + } +} + // ~~~~~~~~~~~~~~~~~ // // Private Functions // // ~~~~~~~~~~~~~~~~~ // +function _getOsName(): string { + const platform = getAppPlatform(); + switch (platform) { + case 'darwin': + return 'mac'; + case 'win32': + return 'windows'; + default: + return platform; + } +} + // Exported for testing export async function _trackEvent( interactive: boolean, diff --git a/packages/insomnia-app/app/common/constants.js b/packages/insomnia-app/app/common/constants.js index 7966322a5..03d673e49 100644 --- a/packages/insomnia-app/app/common/constants.js +++ b/packages/insomnia-app/app/common/constants.js @@ -39,6 +39,14 @@ export function getGoogleAnalyticsLocation() { return appConfig().gaLocation; } +export function getSegmentWriteKey() { + if (isDevelopment()) { + return appConfig().segmentWriteKeys.development; + } + + return appConfig().segmentWriteKeys.production; +} + export function getAppPlatform() { return process.platform; } diff --git a/packages/insomnia-app/app/network/grpc/index.js b/packages/insomnia-app/app/network/grpc/index.js index 07f2caa2b..d337da384 100644 --- a/packages/insomnia-app/app/network/grpc/index.js +++ b/packages/insomnia-app/app/network/grpc/index.js @@ -14,6 +14,7 @@ import { ResponseCallbacks } from './response-callbacks'; import { getMethodType, GrpcMethodTypeEnum } from './method'; import type { GrpcRequest } from '../../models/grpc-request'; import type { GrpcMethodDefinition } from './method'; +import { trackSegmentEvent } from '../../common/analytics'; const _createClient = (req: GrpcRequest, respond: ResponseCallbacks): Object | undefined => { const { url, enableTls } = parseGrpcUrl(req.url); @@ -170,6 +171,7 @@ export const start = async ( // Update request stats models.stats.incrementExecutedRequests(); + trackSegmentEvent('Request Executed'); _setupStatusListener(call, requestId, respond); respond.sendStart(requestId); diff --git a/packages/insomnia-app/app/ui/components/wrapper-home.js b/packages/insomnia-app/app/ui/components/wrapper-home.js index 9f08e152f..f8905f812 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-home.js +++ b/packages/insomnia-app/app/ui/components/wrapper-home.js @@ -30,7 +30,7 @@ import { executeHotKey } from '../../common/hotkeys-listener'; import { hotKeyRefs } from '../../common/hotkeys'; import { showAlert, showError, showModal, showPrompt } from './modals'; import * as models from '../../models'; -import { trackEvent } from '../../common/analytics'; +import { trackEvent, trackSegmentEvent } from '../../common/analytics'; import YAML from 'yaml'; import TimeFromNow from './time-from-now'; import Highlight from './base/highlight'; @@ -100,6 +100,7 @@ class WrapperHome extends React.PureComponent { name, scope: 'designer', }); + trackSegmentEvent('Document Created'); }, }); } @@ -114,6 +115,7 @@ class WrapperHome extends React.PureComponent { name, scope: 'collection', }); + trackSegmentEvent('Collection Created'); }, }); } diff --git a/packages/insomnia-app/app/ui/components/wrapper-unit-test.js b/packages/insomnia-app/app/ui/components/wrapper-unit-test.js index f21f5e7cd..f518da21e 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-unit-test.js +++ b/packages/insomnia-app/app/ui/components/wrapper-unit-test.js @@ -27,6 +27,7 @@ import type { UnitTestSuite } from '../../models/unit-test-suite'; import { getSendRequestCallback } from '../../common/send-request'; import type { GlobalActivity } from '../../common/constants'; import WorkspacePageHeader from './workspace-page-header'; +import { trackSegmentEvent } from '../../common/analytics'; type Props = {| children: SidebarChildObjects, @@ -130,6 +131,7 @@ class WrapperUnitTest extends React.PureComponent { name, }); await this._handleSetActiveUnitTestSuite(unitTestSuite); + trackSegmentEvent('Test Suite Created'); }, }); } @@ -148,6 +150,7 @@ class WrapperUnitTest extends React.PureComponent { code: this.generateSendReqSnippet('', ''), name, }); + trackSegmentEvent('Unit Test Created'); }, }); } @@ -167,10 +170,12 @@ class WrapperUnitTest extends React.PureComponent { async _handleRunTests(): Promise { const { activeUnitTests } = this.props.wrapperProps; await this._runTests(activeUnitTests); + trackSegmentEvent('Ran All Unit Tests'); } async _handleRunTest(unitTest: UnitTest): Promise { await this._runTests([unitTest]); + trackSegmentEvent('Ran Individual Unit Test'); } async _handleDeleteTest(unitTest: UnitTest): Promise { @@ -184,6 +189,7 @@ class WrapperUnitTest extends React.PureComponent { addCancel: true, onConfirm: async () => { await models.unitTest.remove(unitTest); + trackSegmentEvent('Unit Test Deleted'); }, }); } @@ -207,6 +213,7 @@ class WrapperUnitTest extends React.PureComponent { addCancel: true, onConfirm: async () => { await models.unitTestSuite.remove(unitTestSuite); + trackSegmentEvent('Test Suite Deleted'); }, }); } diff --git a/packages/insomnia-app/app/ui/containers/app.js b/packages/insomnia-app/app/ui/containers/app.js index 4d881907d..54348c163 100644 --- a/packages/insomnia-app/app/ui/containers/app.js +++ b/packages/insomnia-app/app/ui/containers/app.js @@ -100,6 +100,7 @@ import * as requestOperations from '../../models/helpers/request-operations'; import { GrpcProvider } from '../context/grpc'; import { sortMethodMap } from '../../common/sorting'; import withDragDropContext from '../context/app/drag-drop-context'; +import { trackSegmentEvent } from '../../common/analytics'; @autoBindMethodsForReact(AUTOBIND_CFG) class App extends PureComponent { @@ -211,6 +212,7 @@ class App extends PureComponent { const request = await models.request.create({ parentId, name: 'New Request' }); await this._handleSetActiveRequest(request._id); models.stats.incrementCreatedRequests(); + trackSegmentEvent('Request Created'); }, ], [ @@ -342,6 +344,7 @@ class App extends PureComponent { onComplete: requestId => { this._handleSetActiveRequest(requestId); models.stats.incrementCreatedRequests(); + trackSegmentEvent('Request Created'); }, }); } @@ -694,6 +697,7 @@ class App extends PureComponent { // Update request stats models.stats.incrementExecutedRequests(); + trackSegmentEvent('Request Executed'); // Start loading handleStartLoading(requestId); @@ -778,6 +782,7 @@ class App extends PureComponent { // Update request stats models.stats.incrementExecutedRequests(); + trackSegmentEvent('Request Executed'); handleStartLoading(requestId); diff --git a/packages/insomnia-app/config/config.json b/packages/insomnia-app/config/config.json index a31b82590..d58ef7393 100644 --- a/packages/insomnia-app/config/config.json +++ b/packages/insomnia-app/config/config.json @@ -16,6 +16,10 @@ "githubRepo": "insomnia", "gaId": "UA-8499472-34", "gaLocation": "https://core.lytics.insomnia.rest", + "segmentWriteKeys": { + "development": "rTOCSvGV23cHGJyb3HI9EUQDNA6ar7ay", + "production": "ChQgQr57USBL4VqO2x7flSFhU4gBuR9e" + }, "plugins": [ "insomnia-plugin-base64", "insomnia-plugin-hash", diff --git a/packages/insomnia-app/package-lock.json b/packages/insomnia-app/package-lock.json index 1a3a713f8..71eaeea06 100644 --- a/packages/insomnia-app/package-lock.json +++ b/packages/insomnia-app/package-lock.json @@ -1931,6 +1931,15 @@ "react-lifecycles-compat": "^3.0.4" } }, + "@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "requires": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -4021,6 +4030,21 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "analytics-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/analytics-node/-/analytics-node-4.0.1.tgz", + "integrity": "sha512-+zXOOTB+eTRW6R9+pfvPfk1dHraFJzhNnAyZiYJIDGOjHQgfk9qfqgoJX9MfR4qY0J/E1YJ3FBncrLGadTDW1A==", + "requires": { + "@segment/loosely-validate-event": "^2.0.0", + "axios": "^0.21.1", + "axios-retry": "^3.0.2", + "lodash.isstring": "^4.0.1", + "md5": "^2.2.1", + "ms": "^2.0.0", + "remove-trailing-slash": "^0.1.0", + "uuid": "^3.2.1" + } + }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", @@ -4595,6 +4619,14 @@ } } }, + "axios-retry": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", + "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", + "requires": { + "is-retry-allowed": "^1.1.0" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -6026,6 +6058,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, "chokidar": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", @@ -6494,6 +6531,11 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "component-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz", + "integrity": "sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=" + }, "compress-commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz", @@ -6993,6 +7035,11 @@ } } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, "cryptiles": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz", @@ -12366,8 +12413,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.2.0", @@ -12613,6 +12659,11 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", @@ -12931,6 +12982,11 @@ } } }, + "join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha1-uEF7dQZho5K+4sJTfGiyqdSXfNU=" + }, "js-file-download": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", @@ -13693,6 +13749,11 @@ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", @@ -13977,6 +14038,16 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -17801,6 +17872,11 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==" + }, "renderkid": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", diff --git a/packages/insomnia-app/package.json b/packages/insomnia-app/package.json index d5e8fd6bb..f4245b94f 100644 --- a/packages/insomnia-app/package.json +++ b/packages/insomnia-app/package.json @@ -99,6 +99,7 @@ "dependencies": { "@hot-loader/react-dom": "^16.8.6", "@stoplight/spectral": "^4.1.1", + "analytics-node": "^4.0.1", "aws4": "^1.9.0", "axios": "^0.21.1", "class-autobind-decorator": "^3.0.1", diff --git a/packages/insomnia-send-request/package-lock.json b/packages/insomnia-send-request/package-lock.json index e55792ffc..af5075c64 100644 --- a/packages/insomnia-send-request/package-lock.json +++ b/packages/insomnia-send-request/package-lock.json @@ -70,6 +70,15 @@ "fastq": "^1.6.0" } }, + "@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "requires": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, "@stoplight/json": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.6.0.tgz", @@ -240,6 +249,28 @@ "decimal.js": "^10.2.0" } }, + "analytics-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/analytics-node/-/analytics-node-4.0.1.tgz", + "integrity": "sha512-+zXOOTB+eTRW6R9+pfvPfk1dHraFJzhNnAyZiYJIDGOjHQgfk9qfqgoJX9MfR4qY0J/E1YJ3FBncrLGadTDW1A==", + "requires": { + "@segment/loosely-validate-event": "^2.0.0", + "axios": "^0.21.1", + "axios-retry": "^3.0.2", + "lodash.isstring": "^4.0.1", + "md5": "^2.2.1", + "ms": "^2.0.0", + "remove-trailing-slash": "^0.1.0", + "uuid": "^3.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -351,6 +382,14 @@ "follow-redirects": "^1.10.0" } }, + "axios-retry": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", + "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", + "requires": { + "is-retry-allowed": "^1.1.0" + } + }, "b64": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", @@ -519,6 +558,11 @@ } } }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, "chokidar": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", @@ -628,6 +672,11 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "component-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz", + "integrity": "sha1-ikeQFwAjjk/DIml3EjAibyS0Fak=" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -665,6 +714,11 @@ "printj": "~1.1.0" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, "cryptiles": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", @@ -1659,6 +1713,11 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==" }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "is-callable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", @@ -1720,6 +1779,11 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, "is-set": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", @@ -1822,6 +1886,11 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha1-uEF7dQZho5K+4sJTfGiyqdSXfNU=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -1980,6 +2049,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1998,6 +2072,16 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.1.tgz", "integrity": "sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==" }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2728,6 +2812,11 @@ "es-abstract": "^1.17.0-next.1" } }, + "remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==" + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", diff --git a/packages/insomnia-send-request/package.json b/packages/insomnia-send-request/package.json index 0f9c00817..7e2b6b3c7 100644 --- a/packages/insomnia-send-request/package.json +++ b/packages/insomnia-send-request/package.json @@ -4,6 +4,7 @@ "main": "dist/index.js", "dependencies": { "@stoplight/spectral": "^5.4.0", + "analytics-node": "^4.0.1", "aws4": "^1.10.0", "axios": "^0.21.1", "clone": "^2.1.2",