Add initial segment events (#3121)

This commit is contained in:
David Marby 2021-02-26 20:57:19 +01:00 committed by GitHub
parent 3ea65b4240
commit e1812efdb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 253 additions and 3 deletions

View File

@ -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<string> {
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,

View File

@ -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;
}

View File

@ -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);

View File

@ -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<Props, State> {
name,
scope: 'designer',
});
trackSegmentEvent('Document Created');
},
});
}
@ -114,6 +115,7 @@ class WrapperHome extends React.PureComponent<Props, State> {
name,
scope: 'collection',
});
trackSegmentEvent('Collection Created');
},
});
}

View File

@ -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<Props, State> {
name,
});
await this._handleSetActiveUnitTestSuite(unitTestSuite);
trackSegmentEvent('Test Suite Created');
},
});
}
@ -148,6 +150,7 @@ class WrapperUnitTest extends React.PureComponent<Props, State> {
code: this.generateSendReqSnippet('', ''),
name,
});
trackSegmentEvent('Unit Test Created');
},
});
}
@ -167,10 +170,12 @@ class WrapperUnitTest extends React.PureComponent<Props, State> {
async _handleRunTests(): Promise<void> {
const { activeUnitTests } = this.props.wrapperProps;
await this._runTests(activeUnitTests);
trackSegmentEvent('Ran All Unit Tests');
}
async _handleRunTest(unitTest: UnitTest): Promise<void> {
await this._runTests([unitTest]);
trackSegmentEvent('Ran Individual Unit Test');
}
async _handleDeleteTest(unitTest: UnitTest): Promise<void> {
@ -184,6 +189,7 @@ class WrapperUnitTest extends React.PureComponent<Props, State> {
addCancel: true,
onConfirm: async () => {
await models.unitTest.remove(unitTest);
trackSegmentEvent('Unit Test Deleted');
},
});
}
@ -207,6 +213,7 @@ class WrapperUnitTest extends React.PureComponent<Props, State> {
addCancel: true,
onConfirm: async () => {
await models.unitTestSuite.remove(unitTestSuite);
trackSegmentEvent('Test Suite Deleted');
},
});
}

View File

@ -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);

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",