Update TypeScript, Prettier and typescript-eslint for new TypeScript 3.8 syntax

This commit is contained in:
Scott Nonnenberg 2020-11-18 07:15:42 -08:00 committed by Josh Perez
parent 5758ed44ac
commit 26884432a2
65 changed files with 286 additions and 185 deletions

View file

@ -15,6 +15,12 @@ const rules = {
},
],
// Overrides recommended by typescript-eslint
// https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0
'@typescript-eslint/no-redeclare': 'error',
'@typescript-eslint/no-shadow': 'error',
'no-shadow': 'off',
// prevents us from accidentally checking in exclusive tests (`.only`):
'mocha/no-exclusive-tests': 'error',

View file

@ -13,11 +13,11 @@ Lastly, be sure to preview your issue before saving. Thanks!
-->
- [ ] I have searched open and closed issues for duplicates
<!--
You can search all issues here:
https://github.com/signalapp/Signal-Desktop/issues?utf8=%E2%9C%93&q=is%3Aissue
Replace [ ] with [X] once you've searched
-->
<!--
You can search all issues here:
https://github.com/signalapp/Signal-Desktop/issues?utf8=%E2%9C%93&q=is%3Aissue
Replace [ ] with [X] once you've searched
-->
---

View file

@ -3,5 +3,6 @@
module.exports = {
singleQuote: true,
arrowParens: 'avoid',
trailingComma: 'es5',
};

View file

@ -4,7 +4,7 @@
/* global Whisper: false */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
window.Whisper.Database = window.Whisper.Database || {};
window.Whisper.Database.id = window.Whisper.Database.id || 'signal';

View file

@ -11,7 +11,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.Deletes = new (Backbone.Collection.extend({
forMessage(message) {

View file

@ -12,7 +12,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.DeliveryReceipts = new (Backbone.Collection.extend({

View file

@ -8,7 +8,7 @@
*/
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
async function destroyExpiredMessages() {

View file

@ -8,7 +8,7 @@
*/
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
async function eraseTapToViewMessages() {

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.KeyChangeListener = {

View file

@ -1,7 +1,7 @@
// Copyright 2014-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
(function() {
(function () {
'use strict';
/*
@ -12,7 +12,7 @@
window.libphonenumber = window.libphonenumber || {};
window.libphonenumber.util = {
getRegionCodeForNumber: function(number) {
getRegionCodeForNumber: function (number) {
try {
var parsedNumber = libphonenumber.parse(number);
return libphonenumber.getRegionCodeForNumber(parsedNumber);
@ -21,7 +21,7 @@
}
},
splitCountryCode: function(number) {
splitCountryCode: function (number) {
var parsedNumber = libphonenumber.parse(number);
return {
country_code: parsedNumber.values_[1],
@ -29,12 +29,12 @@
};
},
getCountryCode: function(regionCode) {
getCountryCode: function (regionCode) {
var cc = libphonenumber.getCountryCodeForRegion(regionCode);
return cc !== 0 ? cc : '';
},
parseNumber: function(number, defaultRegionCode) {
parseNumber: function (number, defaultRegionCode) {
try {
var parsedNumber = libphonenumber.parse(number, defaultRegionCode);
@ -53,7 +53,7 @@
}
},
getAllRegionCodes: function() {
getAllRegionCodes: function () {
return {
AD: 'Andorra',
AE: 'United Arab Emirates',

View file

@ -2,7 +2,7 @@
// SPDX-License-Identifier: AGPL-3.0-only
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
const messageLookup = Object.create(null);

View file

@ -10,7 +10,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.MessageRequests = new (Backbone.Collection.extend({
forConversation(conversation) {

View file

@ -4,7 +4,7 @@
/* global storage, _ */
// eslint-disable-next-line func-names
(function() {
(function () {
const BLOCKED_NUMBERS_ID = 'blocked';
const BLOCKED_UUIDS_ID = 'blocked-uuids';
const BLOCKED_GROUPS_ID = 'blocked-groups';

View file

@ -199,8 +199,9 @@ async function _runJob(job) {
logger.warn(
`_runJob: Got 404 from server for CDN ${
attachment.cdnNumber
}, marking attachment ${attachment.cdnId ||
attachment.cdnKey} from message ${message.idForLogging()} as permanent error`
}, marking attachment ${
attachment.cdnId || attachment.cdnKey
} from message ${message.idForLogging()} as permanent error`
);
await _finishJob(message, id);

View file

@ -11,7 +11,7 @@
/* global _: false */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
// The keys and values don't match here. This is because the values correspond to old

View file

@ -11,7 +11,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.Reactions = new (Backbone.Collection.extend({
forMessage(message) {

View file

@ -12,7 +12,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ReadReceipts = new (Backbone.Collection.extend({
forMessage(conversation, message) {

View file

@ -10,7 +10,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ReadSyncs = new (Backbone.Collection.extend({
forMessage(message) {

View file

@ -6,7 +6,7 @@
// This file was taken from Backbone and then modified. It does not conform to this
// project's standards.
(function() {
(function () {
'use strict';
// Note: this is all the code required to customize Backbone's trigger() method to make
@ -32,7 +32,7 @@
// Implement fancy features of the Events API such as multiple event
// names `"change blur"` and jQuery-style event maps `{change: action}`
// in terms of the existing API.
const eventsApi = function(obj, action, name, rest) {
const eventsApi = function (obj, action, name, rest) {
if (!name) return true;
// Handle event maps.
@ -58,14 +58,14 @@
// A difficult-to-believe, but optimized internal dispatch function for
// triggering events. Tries to keep the usual cases speedy (most internal
// Backbone events have 3 arguments).
const triggerEvents = function(events, name, args) {
const triggerEvents = function (events, name, args) {
let ev,
i = -1,
l = events.length,
a1 = args[0],
a2 = args[1],
a3 = args[2];
const logError = function(error) {
const logError = function (error) {
window.log.error(
'Model caught error triggering',
name,

View file

@ -4,7 +4,7 @@
/* global Whisper, storage, getAccountManager */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
const ROTATION_INTERVAL = 48 * 60 * 60 * 1000;
let timeout;

View file

@ -7,7 +7,7 @@
/* eslint-disable no-proto */
// eslint-disable-next-line func-names
(function() {
(function () {
const TIMESTAMP_THRESHOLD = 5 * 1000; // 5 seconds
const Direction = {
SENDING: 1,

View file

@ -5,7 +5,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
let ready = false;

View file

@ -10,7 +10,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ViewSyncs = new (Backbone.Collection.extend({
forMessage(message) {

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
function resolveTheme() {

View file

@ -4,7 +4,7 @@
/* global Whisper */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.BannerView = Whisper.View.extend({

View file

@ -7,7 +7,7 @@
/* eslint-disable no-new */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
const { Logs } = window.Signal;

View file

@ -4,7 +4,7 @@
/* global Backbone, Whisper, i18n */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ConfirmationDialogView = Whisper.View.extend({

View file

@ -5,7 +5,7 @@
/* global textsecure: false */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ContactListView = Whisper.ListView.extend({

View file

@ -5,7 +5,7 @@
/* global Whisper: false */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.LinkedCopiedToast = Whisper.ToastView.extend({
@ -80,9 +80,7 @@
});
this.$('.loading').removeClass('loading');
view.render();
this.$('.link')
.focus()
.select();
this.$('.link').focus().select();
} catch (error) {
window.log.error(
'DebugLogView error:',

View file

@ -4,7 +4,7 @@
/* global Whisper, i18n */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
// TODO: take a title string which could replace the 'members' header

View file

@ -4,7 +4,7 @@
/* global Whisper, loadImage */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
/*

View file

@ -9,7 +9,7 @@
*/
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.StickerPackInstallFailedToast = Whisper.ToastView.extend({

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
const Steps = {

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.KeyVerificationPanelView = Whisper.View.extend({

View file

@ -4,7 +4,7 @@
/* global Backbone, Whisper, _ */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
/*

View file

@ -4,7 +4,7 @@
/* global libphonenumber, Whisper */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.PhoneInputView = Whisper.View.extend({

View file

@ -7,7 +7,7 @@
/* global ReactDOM: false */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
window.Whisper.ReactWrapperView = Backbone.View.extend({

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.RecorderView = Whisper.View.extend({

View file

@ -4,7 +4,7 @@
/* global Whisper, Signal */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.SafetyNumberChangeDialogView = Whisper.View.extend({

View file

@ -8,7 +8,7 @@
/* eslint-disable no-new */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
const { Settings } = window.Signal.Types;

View file

@ -6,7 +6,7 @@
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.StandaloneRegistrationView = Whisper.View.extend({
@ -37,9 +37,7 @@
},
verifyCode() {
const number = this.phoneView.validateNumber();
const verificationCode = $('#code')
.val()
.replace(/\D+/g, '');
const verificationCode = $('#code').val().replace(/\D+/g, '');
this.accountManager
.registerSingleDevice(number, verificationCode)
@ -53,9 +51,7 @@
this.$('#status').text(s);
},
validateCode() {
const verificationCode = $('#code')
.val()
.replace(/\D/g, '');
const verificationCode = $('#code').val().replace(/\D/g, '');
if (verificationCode.length === 6) {
return verificationCode;
@ -64,11 +60,7 @@
return null;
},
displayError(error) {
this.$('#error')
.hide()
.text(error)
.addClass('in')
.fadeIn();
this.$('#error').hide().text(error).addClass('in').fadeIn();
},
onValidation() {
if (this.$('#number-container').hasClass('valid')) {
@ -92,9 +84,7 @@
this.accountManager
.requestVoiceVerification(number)
.catch(this.displayError.bind(this));
this.$('#step2')
.addClass('in')
.fadeIn();
this.$('#step2').addClass('in').fadeIn();
} else {
this.$('#number-container').addClass('invalid');
}
@ -107,9 +97,7 @@
this.accountManager
.requestSMSVerification(number)
.catch(this.displayError.bind(this));
this.$('#step2')
.addClass('in')
.fadeIn();
this.$('#step2').addClass('in').fadeIn();
} else {
this.$('#number-container').addClass('invalid');
}

View file

@ -4,7 +4,7 @@
/* global Whisper, Mustache, _ */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.ToastView = Whisper.View.extend({

View file

@ -24,7 +24,7 @@
*/
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
Whisper.View = Backbone.View.extend(

View file

@ -4,7 +4,7 @@
/* global Whisper */
// eslint-disable-next-line func-names
(function() {
(function () {
window.Whisper = window.Whisper || {};
let lastTime;

View file

@ -4,7 +4,7 @@
/* global window, dcodeIO, textsecure */
// eslint-disable-next-line func-names
(function() {
(function () {
const FILES_TO_LOAD = [
'SignalService.proto',
'SignalStorage.proto',

View file

@ -4,7 +4,7 @@
/* global window, textsecure, SignalProtocolStore, libsignal */
// eslint-disable-next-line func-names
(function() {
(function () {
window.textsecure = window.textsecure || {};
window.textsecure.storage = window.textsecure.storage || {};

View file

@ -4,7 +4,7 @@
/* global window, textsecure */
// eslint-disable-next-line func-names
(function() {
(function () {
/** ***************************************
*** Not-yet-processed message storage ***
**************************************** */

View file

@ -4,7 +4,7 @@
/* global textsecure, window */
// eslint-disable-next-line func-names
(function() {
(function () {
/** *******************************************
*** Utilities to store data about the user ***
********************************************* */

View file

@ -206,8 +206,8 @@
"@types/webpack": "4.39.0",
"@types/webpack-dev-server": "3.1.7",
"@types/websocket": "1.0.0",
"@typescript-eslint/eslint-plugin": "3.10.1",
"@typescript-eslint/parser": "3.10.1",
"@typescript-eslint/eslint-plugin": "4.8.1",
"@typescript-eslint/parser": "4.8.1",
"arraybuffer-loader": "1.0.3",
"asar": "0.14.0",
"babel-core": "7.0.0-bridge.0",
@ -246,7 +246,7 @@
"npm-run-all": "4.1.5",
"nyc": "11.4.1",
"patch-package": "6.1.2",
"prettier": "1.19.1",
"prettier": "2.1.2",
"react-docgen-typescript": "1.2.6",
"sass-loader": "7.2.0",
"sinon": "9.2.0",
@ -256,7 +256,7 @@
"ts-loader": "4.1.0",
"ts-node": "8.3.0",
"typed-scss-modules": "0.0.11",
"typescript": "3.7.4",
"typescript": "3.8.3",
"webpack": "4.39.2",
"webpack-cli": "3.3.7",
"webpack-dev-server": "3.8.0"

View file

@ -367,8 +367,8 @@ try {
directoryEnclaveId: config.directoryEnclaveId,
directoryTrustAnchor: config.directoryTrustAnchor,
cdnUrlObject: {
'0': config.cdnUrl0,
'2': config.cdnUrl2,
0: config.cdnUrl0,
2: config.cdnUrl2,
},
certificateAuthority: config.certificateAuthority,
contentProxyUrl: config.contentProxyUrl,

View file

@ -188,14 +188,16 @@ export const StickerFrame = React.memo(
onMouseLeave={handleMouseLeave}
ref={rootRef}
>
{// eslint-disable-next-line no-nested-ternary
mode !== 'add' ? (
image ? (
<ImageHandle src={image} />
) : (
<div className={styles.spinner}>{spinnerSvg}</div>
)
) : null}
{
// eslint-disable-next-line no-nested-ternary
mode !== 'add' ? (
image ? (
<ImageHandle src={image} />
) : (
<div className={styles.spinner}>{spinnerSvg}</div>
)
) : null
}
{showGuide && mode !== 'add' ? (
<div className={styles.guide} />
) : null}

View file

@ -52,8 +52,8 @@ const WebAPI = initializeWebAPI({
directoryEnclaveId: config.directoryEnclaveId,
directoryTrustAnchor: config.directoryTrustAnchor,
cdnUrlObject: {
'0': config.cdnUrl0,
'2': config.cdnUrl2,
0: config.cdnUrl0,
2: config.cdnUrl2,
},
certificateAuthority: config.certificateAuthority,
contentProxyUrl: config.contentProxyUrl,

View file

@ -4,7 +4,7 @@
type WhatIsThis = typeof window.WhatIsThis;
// eslint-disable-next-line func-names
(async function() {
(async function () {
const eventHandlerQueue = new window.PQueue({
concurrency: 1,
timeout: 1000 * 60 * 2,
@ -136,9 +136,7 @@ type WhatIsThis = typeof window.WhatIsThis;
}
interactionMode = 'keyboard';
$(document.body)
.addClass('keyboard-mode')
.removeClass('mouse-mode');
$(document.body).addClass('keyboard-mode').removeClass('mouse-mode');
const { userChanged } = window.reduxActions.user;
const { clearSelectedMessage } = window.reduxActions.conversations;
if (clearSelectedMessage) {
@ -156,9 +154,7 @@ type WhatIsThis = typeof window.WhatIsThis;
}
interactionMode = 'mouse';
$(document.body)
.addClass('mouse-mode')
.removeClass('keyboard-mode');
$(document.body).addClass('mouse-mode').removeClass('keyboard-mode');
const { userChanged } = window.reduxActions.user;
const { clearSelectedMessage } = window.reduxActions.conversations;
if (clearSelectedMessage) {

View file

@ -115,9 +115,7 @@ const withSection = (referenceDateTime: moment.Moment) => (
mediaItem: MediaItemType
): MediaItemWithSection => {
const today = moment(referenceDateTime).startOf('day');
const yesterday = moment(referenceDateTime)
.subtract(1, 'day')
.startOf('day');
const yesterday = moment(referenceDateTime).subtract(1, 'day').startOf('day');
const thisWeek = moment(referenceDateTime).startOf('isoWeek');
const thisMonth = moment(referenceDateTime).startOf('month');

View file

@ -2987,8 +2987,9 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
);
if (preview.length < incomingPreview.length) {
window.log.info(
`${message.idForLogging()}: Eliminated ${preview.length -
incomingPreview.length} previews with invalid urls'`
`${message.idForLogging()}: Eliminated ${
preview.length - incomingPreview.length
} previews with invalid urls'`
);
}

View file

@ -222,10 +222,7 @@ export class EmojiCompletion {
): void {
const emoji = convertShortName(emojiData.short_name, this.options.skinTone);
const delta = new Delta()
.retain(index)
.delete(range)
.insert({ emoji });
const delta = new Delta().retain(index).delete(range).insert({ emoji });
if (withTrailingSpace) {
this.quill.updateContents(delta.insert(' '), 'user');

View file

@ -183,10 +183,7 @@ export class MentionCompletion {
range: number,
withTrailingSpace = false
): void {
const delta = new Delta()
.retain(index)
.delete(range)
.insert({ mention });
const delta = new Delta().retain(index).delete(range).insert({ mention });
if (withTrailingSpace) {
this.quill.updateContents(delta.insert(' '), 'user');

View file

@ -17,6 +17,7 @@ import { createLogger } from 'redux-logger';
import { reducer, StateType } from './reducer';
declare global {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
interface Console {
_log: Console['log'];
}

View file

@ -15,8 +15,9 @@ export default function createTaskWithTimeout<T>(
let complete = false;
let timer: NodeJS.Timeout | null = setTimeout(() => {
if (!complete) {
const message = `${id ||
''} task did not complete in time. Calling stack: ${
const message = `${
id || ''
} task did not complete in time. Calling stack: ${
errorForStack.stack
}`;

View file

@ -5,7 +5,8 @@ import { w3cwebsocket } from 'websocket';
type ModifiedEventSource = Omit<EventSource, 'onerror'>;
declare class ModifiedWebSocket extends w3cwebsocket
declare class ModifiedWebSocket
extends w3cwebsocket
implements ModifiedEventSource {
withCredentials: boolean;
@ -17,4 +18,5 @@ declare class ModifiedWebSocket extends w3cwebsocket
}
export type WebSocket = ModifiedWebSocket;
// eslint-disable-next-line @typescript-eslint/no-redeclare
export const WebSocket = w3cwebsocket as typeof ModifiedWebSocket;

View file

@ -441,29 +441,29 @@
{
"rule": "jQuery-$(",
"path": "js/views/debug_log_view.js",
"line": " this.$('.link')",
"line": " this.$('.link').focus().select();",
"lineNumber": 83,
"reasonCategory": "usageTrusted",
"updated": "2020-05-01T17:11:39.527Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/debug_log_view.js",
"line": " this.$('.loading').removeClass('loading');",
"lineNumber": 91,
"lineNumber": 89,
"reasonCategory": "usageTrusted",
"updated": "2020-05-01T17:11:39.527Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/debug_log_view.js",
"line": " this.$('.result').text(i18n('debugLogError'));",
"lineNumber": 92,
"lineNumber": 90,
"reasonCategory": "usageTrusted",
"updated": "2020-09-11T17:24:56.124Z",
"reasonDetail": "Static selector argument"
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
@ -1201,136 +1201,136 @@
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " const verificationCode = $('#code')",
"line": " const verificationCode = $('#code').val().replace(/\\D+/g, '');",
"lineNumber": 40,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#status').text(s);",
"lineNumber": 53,
"lineNumber": 51,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " const verificationCode = $('#code')",
"lineNumber": 56,
"line": " const verificationCode = $('#code').val().replace(/\\D/g, '');",
"lineNumber": 54,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#error')",
"lineNumber": 67,
"line": " this.$('#error').hide().text(error).addClass('in').fadeIn();",
"lineNumber": 63,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " if (this.$('#number-container').hasClass('valid')) {",
"lineNumber": 74,
"lineNumber": 66,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#request-sms, #request-voice').removeAttr('disabled');",
"lineNumber": 75,
"lineNumber": 67,
"reasonCategory": "usageTrusted",
"updated": "2020-09-11T17:24:56.124Z",
"reasonDetail": "Static selector argument"
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#request-sms, #request-voice').prop('disabled', 'disabled');",
"lineNumber": 77,
"lineNumber": 69,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#code').addClass('invalid');",
"lineNumber": 82,
"lineNumber": 74,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#code').removeClass('invalid');",
"lineNumber": 84,
"lineNumber": 76,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#error').hide();",
"lineNumber": 89,
"lineNumber": 81,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#step2')",
"lineNumber": 95,
"line": " this.$('#step2').addClass('in').fadeIn();",
"lineNumber": 87,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#number-container').addClass('invalid');",
"lineNumber": 99,
"lineNumber": 89,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " $('#error').hide();",
"lineNumber": 104,
"lineNumber": 94,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#step2')",
"lineNumber": 110,
"line": " this.$('#step2').addClass('in').fadeIn();",
"lineNumber": 100,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
"rule": "jQuery-$(",
"path": "js/views/standalone_registration_view.js",
"line": " this.$('#number-container').addClass('invalid');",
"lineNumber": 114,
"lineNumber": 102,
"reasonCategory": "usageTrusted",
"updated": "2018-09-19T21:59:32.770Z",
"updated": "2020-11-18T03:39:29.033Z",
"reasonDetail": "Protected from arbitrary input"
},
{
@ -1667,15 +1667,6 @@
"updated": "2020-10-09T22:28:48.591Z",
"reasonDetail": "Test code. Also a false match."
},
{
"rule": "eval",
"path": "node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js",
"line": " description: 'Disallow the use of `eval()`-like methods',",
"lineNumber": 38,
"reasonCategory": "falseMatch",
"updated": "2020-08-26T00:10:28.628Z",
"reasonDetail": "just a doc"
},
{
"rule": "jQuery-$(",
"path": "node_modules/@yarnpkg/lockfile/index.js",

View file

@ -161,6 +161,7 @@ const excludedFilesRegexps = [
'^node_modules/es6-shim/.+', // Currently only used in storybook
'^node_modules/escodegen/.+',
'^node_modules/eslint.+',
'^node_modules/@typescript-eslint.+',
'^node_modules/esprima/.+',
'^node_modules/express/.+',
'^node_modules/file-loader/.+',

View file

@ -148,10 +148,7 @@ export function deriveGroupID(
);
return compatArrayToArrayBuffer(
groupSecretParams
.getPublicParams()
.getGroupIdentifier()
.serialize()
groupSecretParams.getPublicParams().getGroupIdentifier().serialize()
);
}

View file

@ -1838,10 +1838,7 @@ Whisper.ConversationView = Whisper.View.extend({
return fileName;
}
return fileName
.split('.')
.slice(0, -1)
.join('.');
return fileName.split('.').slice(0, -1).join('.');
},
getType(contentType: any) {

142
yarn.lock
View file

@ -2669,7 +2669,20 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@3.10.1", "@typescript-eslint/eslint-plugin@^3.3.0":
"@typescript-eslint/eslint-plugin@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz#b362abe0ee478a6c6d06c14552a6497f0b480769"
integrity sha512-d7LeQ7dbUrIv5YVFNzGgaW3IQKMmnmKFneRWagRlGYOSfLJVaRbj/FrBNOBC1a3tVO+TgNq1GbHvRtg1kwL0FQ==
dependencies:
"@typescript-eslint/experimental-utils" "4.8.1"
"@typescript-eslint/scope-manager" "4.8.1"
debug "^4.1.1"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/eslint-plugin@^3.3.0":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f"
integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==
@ -2692,7 +2705,29 @@
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@3.10.1", "@typescript-eslint/parser@^3.3.0":
"@typescript-eslint/experimental-utils@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz#27275c20fa4336df99ebcf6195f7d7aa7aa9f22d"
integrity sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/scope-manager" "4.8.1"
"@typescript-eslint/types" "4.8.1"
"@typescript-eslint/typescript-estree" "4.8.1"
eslint-scope "^5.0.0"
eslint-utils "^2.0.0"
"@typescript-eslint/parser@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.8.1.tgz#4fe2fbdbb67485bafc4320b3ae91e34efe1219d1"
integrity sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==
dependencies:
"@typescript-eslint/scope-manager" "4.8.1"
"@typescript-eslint/types" "4.8.1"
"@typescript-eslint/typescript-estree" "4.8.1"
debug "^4.1.1"
"@typescript-eslint/parser@^3.3.0":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467"
integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==
@ -2703,11 +2738,24 @@
"@typescript-eslint/typescript-estree" "3.10.1"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/scope-manager@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz#e343c475f8f1d15801b546cb17d7f309b768fdce"
integrity sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ==
dependencies:
"@typescript-eslint/types" "4.8.1"
"@typescript-eslint/visitor-keys" "4.8.1"
"@typescript-eslint/types@3.10.1":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727"
integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==
"@typescript-eslint/types@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.1.tgz#23829c73c5fc6f4fcd5346a7780b274f72fee222"
integrity sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA==
"@typescript-eslint/typescript-estree@3.10.1":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853"
@ -2722,6 +2770,20 @@
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/typescript-estree@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz#7307e3f2c9e95df7daa8dc0a34b8c43b7ec0dd32"
integrity sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ==
dependencies:
"@typescript-eslint/types" "4.8.1"
"@typescript-eslint/visitor-keys" "4.8.1"
debug "^4.1.1"
globby "^11.0.1"
is-glob "^4.0.1"
lodash "^4.17.15"
semver "^7.3.2"
tsutils "^3.17.1"
"@typescript-eslint/visitor-keys@3.10.1":
version "3.10.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931"
@ -2729,6 +2791,14 @@
dependencies:
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/visitor-keys@4.8.1":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz#794f68ee292d1b2e3aa9690ebedfcb3a8c90e3c3"
integrity sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ==
dependencies:
"@typescript-eslint/types" "4.8.1"
eslint-visitor-keys "^2.0.0"
"@webassemblyjs/ast@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
@ -3342,6 +3412,11 @@ array-union@^1.0.1:
dependencies:
array-uniq "^1.0.1"
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
array-uniq@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@ -6002,6 +6077,13 @@ dir-glob@2.0.0:
arrify "^1.0.1"
path-type "^3.0.0"
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
dependencies:
path-type "^4.0.0"
dmg-builder@22.3.6:
version "22.3.6"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.3.6.tgz#2affc0bfb29a49eb35c11d91e5bf7ba32c140fbc"
@ -6849,6 +6931,11 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
eslint-visitor-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
eslint@7.7.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073"
@ -7247,6 +7334,18 @@ fast-glob@^2.0.2:
merge2 "^1.2.3"
micromatch "^3.1.10"
fast-glob@^3.1.1:
version "3.2.4"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3"
integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.0"
merge2 "^1.3.0"
micromatch "^4.0.2"
picomatch "^2.2.1"
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
@ -8191,6 +8290,18 @@ globby@8.0.2:
pify "^3.0.0"
slash "^1.0.0"
globby@^11.0.1:
version "11.0.1"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
fast-glob "^3.1.1"
ignore "^5.1.4"
merge2 "^1.3.0"
slash "^3.0.0"
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@ -8943,6 +9054,11 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
ignore@^5.1.4:
version "5.1.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@ -12265,6 +12381,11 @@ path-type@^3.0.0:
dependencies:
pify "^3.0.0"
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
path@^0.12.7:
version "0.12.7"
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
@ -12604,7 +12725,12 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
prettier@1.19.1, prettier@^1.19.1:
prettier@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5"
integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==
prettier@^1.19.1:
version "1.19.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
@ -14720,6 +14846,11 @@ slash@^2.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slice-ansi@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
@ -16289,11 +16420,6 @@ typeface-inter@3.10.0:
resolved "https://registry.yarnpkg.com/typeface-inter/-/typeface-inter-3.10.0.tgz#04a55d62e2dc3f60db3afab5d8a547e067692bc6"
integrity sha512-WuXE+TaJLB8pdMuvIVY3LfT5UQqndR8+Js0xfhNpdXlsEx0Abwd1bzg4w4YWl2eoOmmLYrRpx6UJJ7a7/q6wZQ==
typescript@3.7.4:
version "3.7.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19"
integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==
typescript@3.8.3:
version "3.8.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"