Merge branch 'master' into feature/generate-wall-socket

This commit is contained in:
hatim boufnichel 2020-08-28 22:27:00 +02:00
commit 8589cad6cb
16 changed files with 249 additions and 72 deletions

63
guntest.html Normal file
View file

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script src="node_modules/gun/gun.js"></script>
<script src="node_modules/gun/sea.js"></script>
<script src="node_modules/gun/lib/open.js"></script>
<script src="node_modules/gun/lib/open.js"></script>
<script src="node_modules/gun/lib/load.js"></script>
<script src="node_modules/gun/lib/unset.js"></script>
<script src="node_modules/gun/lib/promise.js"></script>
<script src="node_modules/gun/lib/then.js"></script>
<script src="node_modules/gun/nts.js"></script>
<script>
gun = Gun({
peers: [
`http://guntest.shock.network:8765/gun`
],
axe: false
})
node = gun.get('foo').get('bar')
const UPPER = 100
put = async () => {
const res = await fetch(`https://jsonplaceholder.typicode.com/posts`)
/** @type {Array<any>} */
const data = await res.json()
const obj = {}
data.slice(0, UPPER).forEach((v, i) => obj[i] = v)
node.put(obj, ack => {
console.log(ack.err ? `err: ${ack.err}` : 'ok')
})
}
erase = () => {
(new Array(UPPER)).fill(null).map((_, i) => i).forEach(n => {
node.get(n).put(null, ack => {
console.log(ack.err ? `err: ${ack.err}` : 'ok')
})
})
}
</script>
<style>
body {
background-color: black;
}
</style>
</html>

View file

@ -48,7 +48,7 @@
"request-promise": "^4.2.2",
"response-time": "^2.3.2",
"shelljs": "^0.8.2",
"shock-common": "4.0.1",
"shock-common": "6.0.0",
"socket.io": "2.1.1",
"text-encoding": "^0.7.0",
"tingodb": "^0.6.1",
@ -79,7 +79,7 @@
"nodemon": "^1.19.3",
"prettier": "^1.18.2",
"ts-type": "^1.2.16",
"typescript": "^3.9.6"
"typescript": "^4.0.2"
},
"lint-staged": {
"*.js": [

View file

@ -65,7 +65,7 @@ class Auth {
logger.info('validateToken err', err)
reject(err)
} else {
logger.info('decoded', decoded)
// logger.info('decoded', decoded)
resolve({ valid: true })
}
})

View file

@ -246,7 +246,7 @@ const getGun = () => {
const getUser = () => {
if (!user.is) {
logger.warn('called getUser() without being authed')
throw new Error('NOT_AUTH')
throw new Error(Constants.ErrorCode.NOT_AUTH)
}
return user
}

View file

@ -74,6 +74,7 @@ const __createOutgoingFeed = async (withPublicKey, user, SEA) => {
const newOutgoingFeedID = await new Promise((res, rej) => {
const _outFeedNode = user
.get(Key.OUTGOINGS)
//@ts-ignore
.set(newPartialOutgoingFeed, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(new Error(ack.err))
@ -98,6 +99,7 @@ const __createOutgoingFeed = async (withPublicKey, user, SEA) => {
.get(Key.OUTGOINGS)
.get(newOutgoingFeedID)
.get(Key.MESSAGES)
//@ts-ignore
.set(initialMsg, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(new Error(ack.err))
@ -591,6 +593,7 @@ const sendHandshakeRequest = async (recipientPublicKey, gun, user, SEA) => {
const hr = gun
.get(Key.HANDSHAKE_NODES)
.get(currentHandshakeAddress)
//@ts-ignore
.set(handshakeRequestData, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(new Error(`Error trying to create request: ${ack.err}`))
@ -627,6 +630,7 @@ const sendHandshakeRequest = async (recipientPublicKey, gun, user, SEA) => {
}
await new Promise((res, rej) => {
//@ts-ignore
user.get(Key.STORED_REQS).set(storedReq, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(
@ -959,6 +963,7 @@ const sendSpontaneousPayment = async (to, amount, memo, feeLimit) => {
.getGun()
.get(Key.ORDER_NODES)
.get(currOrderAddress)
//@ts-ignore
.set(order, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(

View file

@ -1,6 +1,7 @@
/**
* @format
*/
//@ts-ignore
const Common = require('shock-common')
const isFinite = require('lodash/isFinite')
const shuffle = require('lodash/shuffle')
@ -29,8 +30,9 @@ const calculateWallRequest = (numberOfPublicKeyGroups, pageRequested) => {
* @param {number} page
* @throws {TypeError}
* @throws {RangeError}
* @returns {Promise<Common.SchemaTypes.Post[]>}
* @returns {Promise<any>}
*/
//@returns {Promise<Common.SchemaTypes.Post[]>}
const getFeedPage = async page => {
if (!isFinite(page)) {
throw new TypeError(`Please provide an actual number for [page]`)

View file

@ -47,8 +47,9 @@ exports.userToIncomingID = async pub => {
}
/**
* @returns {Promise<Common.SchemaTypes.User>}
* @returns {Promise<any>}
*/
//@returns {Promise<Common.SchemaTypes.User>}
const getMyUser = async () => {
const oldProfile = await Utils.tryAndWait(
(_, user) => new Promise(res => user.get(Key.PROFILE).load(res)),
@ -85,7 +86,7 @@ const getMyUser = async () => {
(_, user) => Promise.resolve(user.is && user.is.pub),
v => typeof v !== 'string'
)
//@ts-ignore
/** @type {Common.SchemaTypes.User} */
const u = {
avatar: oldProfile.avatar,

View file

@ -9,8 +9,9 @@ const Utils = require('../utils')
/**
* @param {string} publicKey
* @returns {Promise<Common.SchemaTypes.User>}
* @returns {Promise<any>}
*/
//@returns {Promise<Common.SchemaTypes.User>}
const getAnUser = async publicKey => {
const oldProfile = await Utils.tryAndWait(
(g, u) => {
@ -47,7 +48,7 @@ const getAnUser = async publicKey => {
},
v => typeof v !== 'number'
)
//@ts-ignore
/** @type {Common.SchemaTypes.User} */
const u = {
avatar: oldProfile.avatar || null,
@ -68,8 +69,9 @@ const getAnUser = async publicKey => {
module.exports.getAnUser = getAnUser
/**
* @returns {Promise<Common.SchemaTypes.User>}
* @returns {Promise<any>}
*/
//@returns {Promise<Common.SchemaTypes.User>}
const getMyUser = async () => {
const oldProfile = await Utils.tryAndWait(
(_, user) => new Promise(res => user.get(Key.PROFILE).load(res)),
@ -106,7 +108,7 @@ const getMyUser = async () => {
(_, user) => Promise.resolve(user.is && user.is.pub),
v => typeof v !== 'string'
)
//@ts-ignore
/** @type {Common.SchemaTypes.User} */
const u = {
avatar: oldProfile.avatar,

View file

@ -43,8 +43,9 @@ const getWallTotalPages = async publicKey => {
* @param {string=} publicKey
* @throws {TypeError}
* @throws {RangeError}
* @returns {Promise<Common.SchemaTypes.WallPage>}
* @returns {Promise<any>}
*/
////@returns {Promise<Common.SchemaTypes.WallPage>}
const getWallPage = async (page, publicKey) => {
const totalPages = await getWallTotalPages(publicKey)
@ -103,9 +104,10 @@ const getWallPage = async (page, publicKey) => {
*/
const mockUser = await User.getMyUser()
/**
/*
* @type {Common.SchemaTypes.WallPage}
*/
//@ts-ignore
const thePage = await Utils.tryAndWait(
(g, u) => {
/**

View file

@ -154,6 +154,7 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
getUser()
.get(Key.ORDER_TO_RESPONSE)
.get(orderID)
//@ts-ignore
.put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') {
rej(
@ -183,6 +184,7 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
getUser()
.get(Key.ORDER_TO_RESPONSE)
.get(orderID)
//@ts-ignore
.put(orderResponse, ack => {
if (ack.err && typeof ack.err !== 'number') {
logger.error(

View file

@ -151,6 +151,7 @@ const onStoredReqs = cb => {
.get(Key.STORED_REQS)
.open(d => {
if (typeof d === 'object' && d !== null) {
//@ts-ignore
encryptedStoredReqs = /** @type {StoredRequest[]} */ (Object.values(
d
).filter(i => Schema.isStoredRequest(i)))

View file

@ -1,5 +1,6 @@
/** @format */
const logger = require('winston')
const { Constants } = require('shock-common')
const Key = require('../key')
@ -23,7 +24,7 @@ const onLastSentReqIDs = cb => {
const user = require('../../Mediator').getUser()
if (!user.is) {
logger.warn('lastSentReqID() -> tried to sub without authing')
throw new Error('NOT_AUTH')
throw new Error(Constants.ErrorCode.NOT_AUTH)
}
user.get(Key.USER_TO_LAST_REQUEST_SENT).open(data => {

View file

@ -98,7 +98,7 @@ const onOpenForPubFeedPair = ([pub, feed]) =>
})
return
}
//@ts-ignore
const incoming = /** @type {import('shock-common').Schema.Outgoing} */ (data)
// incomplete data, let's not assume anything

View file

@ -129,7 +129,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
} catch (e) {
logger.error(e)
logger.info(JSON.stringify(e))
if (e.message === 'NOT_AUTH') {
if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e
}
}
@ -159,7 +159,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
}
} catch (e) {
logger.error(e)
if (e.message === 'NOT_AUTH') {
if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e
}
}
@ -189,7 +189,7 @@ const tryAndWait = async (promGen, shouldRetry = () => false) => {
}
} catch (e) {
logger.error(e)
if (e.message === 'NOT_AUTH') {
if (e.message === Constants.ErrorCode.NOT_AUTH) {
throw e
}
}

View file

@ -327,7 +327,7 @@ module.exports = async (
})
app.use(async (req, res, next) => {
logger.info('Route:', req.path)
logger.info(`Route: ${req.path}`)
if (unprotectedRoutes[req.method][req.path]) {
next()
} else {
@ -1507,36 +1507,45 @@ module.exports = async (
})
}
if (keysend) {
const { dest, amt, finalCltvDelta = 40 } = req.body
if (!dest || !amt) {
return res.status(400).json({
errorMessage: 'please provide "dest" and "amt" for keysend payments'
})
}
try {
if (keysend) {
const { dest, amt, finalCltvDelta = 40 } = req.body
if (!dest || !amt) {
return res.status(400).json({
errorMessage: 'please provide "dest" and "amt" for keysend payments'
})
}
const payment = await sendPaymentV2Keysend({
amt,
dest,
const payment = await sendPaymentV2Keysend({
amt,
dest,
feeLimit,
finalCltvDelta,
maxParts,
timeoutSeconds
})
return res.status(200).json(payment)
}
const { payreq } = req.body
const payment = await sendPaymentV2Invoice({
feeLimit,
finalCltvDelta,
maxParts,
payment_request: payreq,
amt: req.body.amt,
max_parts: maxParts,
timeoutSeconds
})
return res.status(200).json(payment)
} catch (e) {
let msg = 'Unknown Error'
if (e.message) msg = e.message
logger.error(e)
return res.status(500).json({ errorMessage: msg })
}
const { payreq } = req.body
const payment = await sendPaymentV2Invoice({
feeLimit,
payment_request: payreq,
amt: req.body.amt,
max_parts: maxParts,
timeoutSeconds
})
return res.status(200).json(payment)
})
app.post('/api/lnd/trackpayment', (req, res) => {
@ -1928,16 +1937,17 @@ module.exports = async (
app.get(`/api/gun/${GunEvent.ON_CHATS}`, (_, res) => {
try {
const data = Events.getChats()
logger.info(`Chats polled: ${data.length}`)
res.json({
data
})
} catch (err) {
logger.info('Error in Chats poll:')
logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({
errorMessage: typeof err === 'string' ? err : err.message
})
res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message
})
}
})
@ -1950,16 +1960,17 @@ module.exports = async (
.get(Key.AVATAR)
.then()
)
logger.info(`avatar poll:${(data || '').length} chars`)
res.json({
data
})
} catch (err) {
logger.info('Error in Avatar poll:')
logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({
errorMessage: typeof err === 'string' ? err : err.message
})
res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message
})
}
})
@ -1972,16 +1983,17 @@ module.exports = async (
.get(Key.DISPLAY_NAME)
.then()
)
logger.info(`display name poll:${data}`)
res.json({
data
})
} catch (err) {
logger.info('Error in Display Name poll:')
logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({
errorMessage: typeof err === 'string' ? err : err.message
})
res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message
})
}
})
@ -1991,16 +2003,17 @@ module.exports = async (
const data = await timeout5(
user.get(Key.CURRENT_HANDSHAKE_ADDRESS).then()
)
logger.info(`handshake address poll:${data}`)
res.json({
data
})
} catch (err) {
logger.info('Error in Handshake Address poll:')
logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({
errorMessage: typeof err === 'string' ? err : err.message
})
res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message
})
}
})
@ -2015,9 +2028,11 @@ module.exports = async (
} catch (err) {
logger.info('Error in BIO poll:')
logger.error(err)
res.status(err.message === 'NON_AUTH' ? 401 : 500).json({
errorMessage: typeof err === 'string' ? err : err.message
})
res
.status(err.message === Common.Constants.ErrorCode.NOT_AUTH ? 401 : 500)
.json({
errorMessage: typeof err === 'string' ? err : err.message
})
}
})
////////////////////////////////////////////////////////////////////////////////

105
yarn.lock
View file

@ -156,6 +156,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/runtime@^7.6.3":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.6.0":
version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
@ -467,6 +474,50 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
"@redux-saga/core@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4"
integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg==
dependencies:
"@babel/runtime" "^7.6.3"
"@redux-saga/deferred" "^1.1.2"
"@redux-saga/delay-p" "^1.1.2"
"@redux-saga/is" "^1.1.2"
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/types" "^1.1.0"
redux "^4.0.4"
typescript-tuple "^2.2.1"
"@redux-saga/deferred@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888"
integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ==
"@redux-saga/delay-p@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355"
integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g==
dependencies:
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/is@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e"
integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w==
dependencies:
"@redux-saga/symbols" "^1.1.2"
"@redux-saga/types" "^1.1.0"
"@redux-saga/symbols@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d"
integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ==
"@redux-saga/types@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204"
integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==
"@samverschueren/stream-to-observable@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@ -4358,7 +4409,7 @@ lodash@=4.17.4:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5:
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
@ -5556,12 +5607,19 @@ rechoir@^0.6.2:
dependencies:
resolve "^1.1.6"
redux-saga@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112"
integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw==
dependencies:
"@redux-saga/core" "^1.1.3"
redux-thunk@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
redux@^4.0.5:
redux@^4.0.4, redux@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
@ -5574,6 +5632,11 @@ regenerator-runtime@^0.11.0:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.13.4:
version "0.13.7"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@ -5950,15 +6013,16 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
shock-common@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-4.0.1.tgz#035e7081b6e67f6721e68dcc6b4d1e4c8f2cd96d"
integrity sha512-3xAkG8lyfyZHK8trgOy2aN75uG1ZBm0MPoIEzP4hgXhyT/b80WmQzX3DqVSSmjfhq1Di0sjmNCY7O5Nf6cEmFg==
shock-common@6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/shock-common/-/shock-common-6.0.0.tgz#77701dabb344830046b85ece0103de21775197b9"
integrity sha512-kbSkLTtWTK8qVcbW6uViWtar3otW2S5oJIMO/1twPs6Iuv9ATF0QviDtUiU1YN/Y4bX/SXAMm/jRZ3OJ3PLyUA==
dependencies:
immer "^6.0.6"
lodash "^4.17.15"
lodash "^4.17.19"
normalizr "^3.6.0"
redux "^4.0.5"
redux-saga "^1.1.3"
redux-thunk "^2.3.0"
uuid "3.x.x"
@ -6654,10 +6718,29 @@ typedarray-dts@^1.0.0:
resolved "https://registry.yarnpkg.com/typedarray-dts/-/typedarray-dts-1.0.0.tgz#9dec9811386dbfba964c295c2606cf9a6b982d06"
integrity sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==
typescript@^3.9.6:
version "3.9.6"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==
typescript-compare@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425"
integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==
dependencies:
typescript-logic "^0.0.0"
typescript-logic@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196"
integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==
typescript-tuple@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2"
integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==
dependencies:
typescript-compare "^0.0.2"
typescript@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2"
integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==
uglify-js@^3.1.4:
version "3.6.0"