Last active
November 25, 2018 15:43
-
-
Save ianchanning/d6791c8181fbee2bb4a83c442219f77a to your computer and use it in GitHub Desktop.
A Neural Network in JavaScript. This now has it's own Github repo: https://github.com/ianchanning/neural-network-js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Show hidden characters
{ | |
"env": { | |
"browser": true, | |
"es6": true | |
}, | |
"extends": "eslint:recommended", | |
"parserOptions": { | |
"ecmaFeatures": { | |
"jsx": true | |
}, | |
"ecmaVersion": 2018, | |
"sourceType": "module" | |
}, | |
"plugins": [ | |
"react" | |
], | |
"rules": { | |
"indent": [ | |
"error", | |
2 | |
], | |
"linebreak-style": [ | |
"error", | |
"unix" | |
], | |
"quotes": [ | |
"error", | |
"double" | |
], | |
"semi": [ | |
"error", | |
"never" | |
] | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
node_modules |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8"> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
<title>Neural Networks 101</title> | |
<style> | |
h1 {font: normal 2em Georgia;} | |
</style> | |
</head> | |
<body> | |
<h1>Bring on the machines</h1> | |
<div id="root"></div> | |
<script src="neural-network.js"></script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint no-unused-vars: "off" */ | |
/** | |
* This is an experiment to see if I can recreate funfunfunctions machine-learning / back-propagation code | |
* @link https://www.youtube.com/watch?v=anN2Ey37s-o | |
* | |
* Step 1 is to recreate the JS code | |
* Step 2 is to port to ReasonML | |
* @return object | |
*/ | |
const fff = (() => { | |
"use strict" | |
const X_MAX = 400 | |
const Y_MAX = 400 | |
const EXAMPLE_COUNT = 100000 | |
/** | |
* Generate the required data specific for this network | |
* | |
* @returns {object} {weights,points} the initial weights and training/test data | |
*/ | |
const generator = () => { | |
/** | |
* Generate random number between min and max | |
* | |
* @param {float} min | |
* @param {float} max | |
* @returns {float} Random number | |
*/ | |
const rand = (min, max) => Math.random() * (max - min) + min | |
// random set of data points | |
const points = length => Array(length).fill().map(() => ({ | |
x: rand(0, X_MAX), | |
y: rand(0, Y_MAX) | |
})) | |
// initial random weights | |
const weights = { | |
x: rand(-1, 1), | |
y: rand(-1, 1) | |
} | |
// we happen to know that this will classify out points correctly | |
// so we can use it to generate actual values for training examples | |
const team = point => point.x > point.y ? 1 : 0 | |
const labeller = examples => examples.map( | |
point => ({point, actual: team(point)}) | |
) | |
// generate labelled training data | |
const examples = length => labeller(points(length)) | |
return { | |
weights, | |
points, | |
examples | |
} | |
} | |
/** | |
* Neural Network | |
* | |
* @param {object} | |
* @param {object} weights {x,y} Initial weights | |
* @param {array} examples [{x,y}] Training set examples | |
* @returns {object} {trainedWeights,prediction} Required data to classify the chart points | |
*/ | |
const gym = (weights, examples) => { | |
/** | |
* Binary classifier | |
* | |
* TODO: Is this our activation function too? | |
* I think so - effectively for a ReLU we want to return output not one | |
* But we want a binary classifier | |
* Ah perhaps this is not the activation function | |
* It just happens that we're assuming that the dot product will never be less zero? | |
* Or maybe this is a combination of the activation function and the classifier | |
* For a binary classifier we should be using a sigmoid I think | |
* But this appears to be using a ReLU and classifying as true if > 0 | |
* | |
* @param {integer} output Neuron value before activation function | |
* @returns {integer} Class of the example 0|1 | |
*/ | |
const classifier = output => output > 0 ? 1 : 0 | |
/** | |
* Matrix dot product | |
* | |
* @param {object} a {x,y} | |
* @param {object} b {x,y} | |
* @returns {float} Dot product value | |
*/ | |
const dot = (a, b) => a.x * b.x + a.y * b.y | |
// make a prediction given the weigts and a point | |
const prediction = (weights, point) => classifier(dot(weights, point)) | |
/** | |
* Single training step | |
* | |
* @param {object} weights {x,y} I think this is typically {w1, w2} | |
* @param {object} point {x,y} Training example typically x1, x2 | |
* @param {integer} actual 0|1 Correct label for the example | |
* @returns {object} {x,y} updated weights | |
*/ | |
const train = (weights, point, actual) => { | |
// also know as... y_hat | |
const predict = prediction(weights, point) | |
// TODO: I'm not convinced this is correct | |
// Or at least I don't know why it's correct | |
// It could be by accident because of the line we've chosen | |
// possibilities are | |
// actual: 0|1 | |
// predict: 0|1 | |
// error: 0|-1|1|0 | |
// Andrew Ng Deep Learning wk 2: | |
// This does appear that we're using Logistic Regression | |
// dZ = A - Y (N.B. matrices, A = activation/predict, Y = actual) | |
// dw = 1/m X . dZ_T (_T = matrix transpose) | |
// In individual loop steps (m examples): | |
// dw = x_1 * dz_1 + x_2 * dx_2 + ... x_m * dx_m (equivalent of {point.x, point.y} * error for all examples) | |
// dw /= m (it seems we miss the division here) | |
// w -= alpha * dw | |
// | |
// Comparing to my notes it seems like we calculate -error (or -dZ) | |
// As A - Y is reversed | |
// Then it makes sense to have a '+' when updating the weights | |
const error = actual - predict | |
// TODO: I think this is effectively the back propagation step | |
// w := w - alpha * dw (as per Andrew Ng python deep learning code) | |
// N.B. We're currently *not* using the learning rate (alpha) | |
return { | |
x: weights.x + (point.x * error), | |
y: weights.y + (point.y * error) | |
} | |
} | |
const trainer = (acc, example) => train(acc, example.point, example.actual) | |
// TODO: I think just just does one iteration of gradient descent | |
const trainedWeights = examples.reduce(trainer, weights) | |
// console.log(trainedWeights) | |
return { | |
train, | |
prediction, | |
trainedWeights | |
} | |
} | |
const chart = () => { | |
const el = name => document.createElementNS( | |
"http://www.w3.org/2000/svg", | |
name | |
) | |
const circle = (centre, radius, colour) => { | |
let c = el("circle") | |
c.setAttribute("cx", centre.x) | |
c.setAttribute("cy", centre.y) | |
c.setAttribute("r", radius) | |
c.style.fill = colour | |
return c | |
} | |
const clickelem = el => { | |
/* eslint no-console: "off" */ | |
el.onclick = e => console.log(e.target.attributes) | |
return el | |
} | |
const line = (start, end, colour) => { | |
let l = el("line") | |
l.setAttribute("x1", start.x) | |
l.setAttribute("y1", start.y) | |
l.setAttribute("x2", end.x) | |
l.setAttribute("y2", end.y) | |
l.setAttribute("stroke", colour) | |
return l | |
} | |
const svg = () => { | |
let svg = el("svg") | |
svg.setAttribute("height", Y_MAX) | |
svg.setAttribute("width", X_MAX) | |
return svg | |
} | |
return { | |
clickelem, | |
circle, | |
line, | |
svg | |
} | |
} | |
const fill = (generator, gym, chart) => { | |
const colours = ["red", "blue"] | |
const graphPoints = generator.points(200) | |
const svg = chart.svg() | |
graphPoints.map(point => svg.appendChild( | |
chart.clickelem(chart.circle( | |
point, | |
5, | |
colours[gym.prediction(gym.trainedWeights, point)] | |
)) | |
)) | |
graphPoints.map(point => svg.appendChild( | |
chart.circle(point, 1, "white") | |
)) | |
// want the line to appear above the dots | |
svg.appendChild(chart.line({x: 0, y: 0}, {x: X_MAX, y: Y_MAX}, "gray")) | |
return svg | |
} | |
const chartGen = generator() | |
const chartGym = gym(chartGen.weights, chartGen.examples(EXAMPLE_COUNT)) | |
document.getElementById("root").appendChild(fill(chartGen, chartGym, chart())) | |
return { | |
chartGym | |
} | |
})() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "fff-machine-learning", | |
"version": "1.0.0", | |
"lockfileVersion": 1, | |
"requires": true, | |
"dependencies": { | |
"@babel/code-frame": { | |
"version": "7.0.0", | |
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", | |
"integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", | |
"dev": true, | |
"requires": { | |
"@babel/highlight": "7.0.0" | |
} | |
}, | |
"@babel/highlight": { | |
"version": "7.0.0", | |
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", | |
"integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", | |
"dev": true, | |
"requires": { | |
"chalk": "2.4.1", | |
"esutils": "2.0.2", | |
"js-tokens": "4.0.0" | |
} | |
}, | |
"acorn": { | |
"version": "6.0.4", | |
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", | |
"integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", | |
"dev": true | |
}, | |
"acorn-jsx": { | |
"version": "5.0.0", | |
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", | |
"integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", | |
"dev": true | |
}, | |
"ajv": { | |
"version": "6.5.5", | |
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", | |
"integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", | |
"dev": true, | |
"requires": { | |
"fast-deep-equal": "2.0.1", | |
"fast-json-stable-stringify": "2.0.0", | |
"json-schema-traverse": "0.4.1", | |
"uri-js": "4.2.2" | |
} | |
}, | |
"ansi-escapes": { | |
"version": "3.1.0", | |
"resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", | |
"integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", | |
"dev": true | |
}, | |
"ansi-regex": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", | |
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", | |
"dev": true | |
}, | |
"ansi-styles": { | |
"version": "3.2.1", | |
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", | |
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", | |
"dev": true, | |
"requires": { | |
"color-convert": "1.9.3" | |
} | |
}, | |
"argparse": { | |
"version": "1.0.10", | |
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", | |
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", | |
"dev": true, | |
"requires": { | |
"sprintf-js": "1.0.3" | |
} | |
}, | |
"array-includes": { | |
"version": "3.0.3", | |
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", | |
"integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", | |
"dev": true, | |
"requires": { | |
"define-properties": "1.1.3", | |
"es-abstract": "1.12.0" | |
} | |
}, | |
"balanced-match": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", | |
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", | |
"dev": true | |
}, | |
"brace-expansion": { | |
"version": "1.1.11", | |
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | |
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", | |
"dev": true, | |
"requires": { | |
"balanced-match": "1.0.0", | |
"concat-map": "0.0.1" | |
} | |
}, | |
"caller-path": { | |
"version": "0.1.0", | |
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", | |
"integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", | |
"dev": true, | |
"requires": { | |
"callsites": "0.2.0" | |
} | |
}, | |
"callsites": { | |
"version": "0.2.0", | |
"resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", | |
"integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", | |
"dev": true | |
}, | |
"chalk": { | |
"version": "2.4.1", | |
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", | |
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", | |
"dev": true, | |
"requires": { | |
"ansi-styles": "3.2.1", | |
"escape-string-regexp": "1.0.5", | |
"supports-color": "5.5.0" | |
} | |
}, | |
"chardet": { | |
"version": "0.7.0", | |
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", | |
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", | |
"dev": true | |
}, | |
"circular-json": { | |
"version": "0.3.3", | |
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", | |
"integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", | |
"dev": true | |
}, | |
"cli-cursor": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", | |
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", | |
"dev": true, | |
"requires": { | |
"restore-cursor": "2.0.0" | |
} | |
}, | |
"cli-width": { | |
"version": "2.2.0", | |
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", | |
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", | |
"dev": true | |
}, | |
"color-convert": { | |
"version": "1.9.3", | |
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", | |
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", | |
"dev": true, | |
"requires": { | |
"color-name": "1.1.3" | |
} | |
}, | |
"color-name": { | |
"version": "1.1.3", | |
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", | |
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", | |
"dev": true | |
}, | |
"concat-map": { | |
"version": "0.0.1", | |
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | |
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", | |
"dev": true | |
}, | |
"cross-spawn": { | |
"version": "6.0.5", | |
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", | |
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", | |
"dev": true, | |
"requires": { | |
"nice-try": "1.0.5", | |
"path-key": "2.0.1", | |
"semver": "5.6.0", | |
"shebang-command": "1.2.0", | |
"which": "1.3.1" | |
} | |
}, | |
"debug": { | |
"version": "4.1.0", | |
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", | |
"integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", | |
"dev": true, | |
"requires": { | |
"ms": "2.1.1" | |
} | |
}, | |
"deep-is": { | |
"version": "0.1.3", | |
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", | |
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", | |
"dev": true | |
}, | |
"define-properties": { | |
"version": "1.1.3", | |
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", | |
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", | |
"dev": true, | |
"requires": { | |
"object-keys": "1.0.12" | |
} | |
}, | |
"doctrine": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", | |
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", | |
"dev": true, | |
"requires": { | |
"esutils": "2.0.2" | |
} | |
}, | |
"es-abstract": { | |
"version": "1.12.0", | |
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", | |
"integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", | |
"dev": true, | |
"requires": { | |
"es-to-primitive": "1.2.0", | |
"function-bind": "1.1.1", | |
"has": "1.0.3", | |
"is-callable": "1.1.4", | |
"is-regex": "1.0.4" | |
} | |
}, | |
"es-to-primitive": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", | |
"integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", | |
"dev": true, | |
"requires": { | |
"is-callable": "1.1.4", | |
"is-date-object": "1.0.1", | |
"is-symbol": "1.0.2" | |
} | |
}, | |
"escape-string-regexp": { | |
"version": "1.0.5", | |
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", | |
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", | |
"dev": true | |
}, | |
"eslint": { | |
"version": "5.9.0", | |
"resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", | |
"integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", | |
"dev": true, | |
"requires": { | |
"@babel/code-frame": "7.0.0", | |
"ajv": "6.5.5", | |
"chalk": "2.4.1", | |
"cross-spawn": "6.0.5", | |
"debug": "4.1.0", | |
"doctrine": "2.1.0", | |
"eslint-scope": "4.0.0", | |
"eslint-utils": "1.3.1", | |
"eslint-visitor-keys": "1.0.0", | |
"espree": "4.1.0", | |
"esquery": "1.0.1", | |
"esutils": "2.0.2", | |
"file-entry-cache": "2.0.0", | |
"functional-red-black-tree": "1.0.1", | |
"glob": "7.1.3", | |
"globals": "11.9.0", | |
"ignore": "4.0.6", | |
"imurmurhash": "0.1.4", | |
"inquirer": "6.2.0", | |
"is-resolvable": "1.1.0", | |
"js-yaml": "3.12.0", | |
"json-stable-stringify-without-jsonify": "1.0.1", | |
"levn": "0.3.0", | |
"lodash": "4.17.11", | |
"minimatch": "3.0.4", | |
"mkdirp": "0.5.1", | |
"natural-compare": "1.4.0", | |
"optionator": "0.8.2", | |
"path-is-inside": "1.0.2", | |
"pluralize": "7.0.0", | |
"progress": "2.0.1", | |
"regexpp": "2.0.1", | |
"require-uncached": "1.0.3", | |
"semver": "5.6.0", | |
"strip-ansi": "4.0.0", | |
"strip-json-comments": "2.0.1", | |
"table": "5.1.0", | |
"text-table": "0.2.0" | |
} | |
}, | |
"eslint-plugin-react": { | |
"version": "7.11.1", | |
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", | |
"integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", | |
"dev": true, | |
"requires": { | |
"array-includes": "3.0.3", | |
"doctrine": "2.1.0", | |
"has": "1.0.3", | |
"jsx-ast-utils": "2.0.1", | |
"prop-types": "15.6.2" | |
} | |
}, | |
"eslint-scope": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", | |
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", | |
"dev": true, | |
"requires": { | |
"esrecurse": "4.2.1", | |
"estraverse": "4.2.0" | |
} | |
}, | |
"eslint-utils": { | |
"version": "1.3.1", | |
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", | |
"integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", | |
"dev": true | |
}, | |
"eslint-visitor-keys": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", | |
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", | |
"dev": true | |
}, | |
"espree": { | |
"version": "4.1.0", | |
"resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", | |
"integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", | |
"dev": true, | |
"requires": { | |
"acorn": "6.0.4", | |
"acorn-jsx": "5.0.0", | |
"eslint-visitor-keys": "1.0.0" | |
} | |
}, | |
"esprima": { | |
"version": "4.0.1", | |
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", | |
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", | |
"dev": true | |
}, | |
"esquery": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", | |
"integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", | |
"dev": true, | |
"requires": { | |
"estraverse": "4.2.0" | |
} | |
}, | |
"esrecurse": { | |
"version": "4.2.1", | |
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", | |
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", | |
"dev": true, | |
"requires": { | |
"estraverse": "4.2.0" | |
} | |
}, | |
"estraverse": { | |
"version": "4.2.0", | |
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", | |
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", | |
"dev": true | |
}, | |
"esutils": { | |
"version": "2.0.2", | |
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", | |
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", | |
"dev": true | |
}, | |
"external-editor": { | |
"version": "3.0.3", | |
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", | |
"integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", | |
"dev": true, | |
"requires": { | |
"chardet": "0.7.0", | |
"iconv-lite": "0.4.24", | |
"tmp": "0.0.33" | |
} | |
}, | |
"fast-deep-equal": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", | |
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", | |
"dev": true | |
}, | |
"fast-json-stable-stringify": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", | |
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", | |
"dev": true | |
}, | |
"fast-levenshtein": { | |
"version": "2.0.6", | |
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", | |
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", | |
"dev": true | |
}, | |
"figures": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", | |
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", | |
"dev": true, | |
"requires": { | |
"escape-string-regexp": "1.0.5" | |
} | |
}, | |
"file-entry-cache": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", | |
"integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", | |
"dev": true, | |
"requires": { | |
"flat-cache": "1.3.4", | |
"object-assign": "4.1.1" | |
} | |
}, | |
"flat-cache": { | |
"version": "1.3.4", | |
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", | |
"integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", | |
"dev": true, | |
"requires": { | |
"circular-json": "0.3.3", | |
"graceful-fs": "4.1.15", | |
"rimraf": "2.6.2", | |
"write": "0.2.1" | |
} | |
}, | |
"fs.realpath": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", | |
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", | |
"dev": true | |
}, | |
"function-bind": { | |
"version": "1.1.1", | |
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", | |
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", | |
"dev": true | |
}, | |
"functional-red-black-tree": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", | |
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", | |
"dev": true | |
}, | |
"glob": { | |
"version": "7.1.3", | |
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", | |
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", | |
"dev": true, | |
"requires": { | |
"fs.realpath": "1.0.0", | |
"inflight": "1.0.6", | |
"inherits": "2.0.3", | |
"minimatch": "3.0.4", | |
"once": "1.4.0", | |
"path-is-absolute": "1.0.1" | |
} | |
}, | |
"globals": { | |
"version": "11.9.0", | |
"resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", | |
"integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", | |
"dev": true | |
}, | |
"graceful-fs": { | |
"version": "4.1.15", | |
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", | |
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", | |
"dev": true | |
}, | |
"has": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", | |
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", | |
"dev": true, | |
"requires": { | |
"function-bind": "1.1.1" | |
} | |
}, | |
"has-flag": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", | |
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", | |
"dev": true | |
}, | |
"has-symbols": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", | |
"integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", | |
"dev": true | |
}, | |
"iconv-lite": { | |
"version": "0.4.24", | |
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", | |
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", | |
"dev": true, | |
"requires": { | |
"safer-buffer": "2.1.2" | |
} | |
}, | |
"ignore": { | |
"version": "4.0.6", | |
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", | |
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", | |
"dev": true | |
}, | |
"imurmurhash": { | |
"version": "0.1.4", | |
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", | |
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", | |
"dev": true | |
}, | |
"inflight": { | |
"version": "1.0.6", | |
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | |
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", | |
"dev": true, | |
"requires": { | |
"once": "1.4.0", | |
"wrappy": "1.0.2" | |
} | |
}, | |
"inherits": { | |
"version": "2.0.3", | |
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", | |
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", | |
"dev": true | |
}, | |
"inquirer": { | |
"version": "6.2.0", | |
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", | |
"integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", | |
"dev": true, | |
"requires": { | |
"ansi-escapes": "3.1.0", | |
"chalk": "2.4.1", | |
"cli-cursor": "2.1.0", | |
"cli-width": "2.2.0", | |
"external-editor": "3.0.3", | |
"figures": "2.0.0", | |
"lodash": "4.17.11", | |
"mute-stream": "0.0.7", | |
"run-async": "2.3.0", | |
"rxjs": "6.3.3", | |
"string-width": "2.1.1", | |
"strip-ansi": "4.0.0", | |
"through": "2.3.8" | |
} | |
}, | |
"is-callable": { | |
"version": "1.1.4", | |
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", | |
"integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", | |
"dev": true | |
}, | |
"is-date-object": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", | |
"integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", | |
"dev": true | |
}, | |
"is-fullwidth-code-point": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", | |
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", | |
"dev": true | |
}, | |
"is-promise": { | |
"version": "2.1.0", | |
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", | |
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", | |
"dev": true | |
}, | |
"is-regex": { | |
"version": "1.0.4", | |
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", | |
"integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", | |
"dev": true, | |
"requires": { | |
"has": "1.0.3" | |
} | |
}, | |
"is-resolvable": { | |
"version": "1.1.0", | |
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", | |
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", | |
"dev": true | |
}, | |
"is-symbol": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", | |
"integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", | |
"dev": true, | |
"requires": { | |
"has-symbols": "1.0.0" | |
} | |
}, | |
"isexe": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | |
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", | |
"dev": true | |
}, | |
"js-tokens": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", | |
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", | |
"dev": true | |
}, | |
"js-yaml": { | |
"version": "3.12.0", | |
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", | |
"integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", | |
"dev": true, | |
"requires": { | |
"argparse": "1.0.10", | |
"esprima": "4.0.1" | |
} | |
}, | |
"json-schema-traverse": { | |
"version": "0.4.1", | |
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", | |
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", | |
"dev": true | |
}, | |
"json-stable-stringify-without-jsonify": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", | |
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", | |
"dev": true | |
}, | |
"jsx-ast-utils": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", | |
"integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", | |
"dev": true, | |
"requires": { | |
"array-includes": "3.0.3" | |
} | |
}, | |
"levn": { | |
"version": "0.3.0", | |
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", | |
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", | |
"dev": true, | |
"requires": { | |
"prelude-ls": "1.1.2", | |
"type-check": "0.3.2" | |
} | |
}, | |
"lodash": { | |
"version": "4.17.11", | |
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", | |
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", | |
"dev": true | |
}, | |
"loose-envify": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", | |
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", | |
"dev": true, | |
"requires": { | |
"js-tokens": "4.0.0" | |
} | |
}, | |
"mimic-fn": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", | |
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", | |
"dev": true | |
}, | |
"minimatch": { | |
"version": "3.0.4", | |
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", | |
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", | |
"dev": true, | |
"requires": { | |
"brace-expansion": "1.1.11" | |
} | |
}, | |
"minimist": { | |
"version": "0.0.8", | |
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", | |
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", | |
"dev": true | |
}, | |
"mkdirp": { | |
"version": "0.5.1", | |
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", | |
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", | |
"dev": true, | |
"requires": { | |
"minimist": "0.0.8" | |
} | |
}, | |
"ms": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", | |
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", | |
"dev": true | |
}, | |
"mute-stream": { | |
"version": "0.0.7", | |
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", | |
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", | |
"dev": true | |
}, | |
"natural-compare": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", | |
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", | |
"dev": true | |
}, | |
"nice-try": { | |
"version": "1.0.5", | |
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", | |
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", | |
"dev": true | |
}, | |
"object-assign": { | |
"version": "4.1.1", | |
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | |
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", | |
"dev": true | |
}, | |
"object-keys": { | |
"version": "1.0.12", | |
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", | |
"integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", | |
"dev": true | |
}, | |
"once": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |
"dev": true, | |
"requires": { | |
"wrappy": "1.0.2" | |
} | |
}, | |
"onetime": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", | |
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", | |
"dev": true, | |
"requires": { | |
"mimic-fn": "1.2.0" | |
} | |
}, | |
"optionator": { | |
"version": "0.8.2", | |
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", | |
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", | |
"dev": true, | |
"requires": { | |
"deep-is": "0.1.3", | |
"fast-levenshtein": "2.0.6", | |
"levn": "0.3.0", | |
"prelude-ls": "1.1.2", | |
"type-check": "0.3.2", | |
"wordwrap": "1.0.0" | |
} | |
}, | |
"os-tmpdir": { | |
"version": "1.0.2", | |
"resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", | |
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", | |
"dev": true | |
}, | |
"path-is-absolute": { | |
"version": "1.0.1", | |
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", | |
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", | |
"dev": true | |
}, | |
"path-is-inside": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", | |
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", | |
"dev": true | |
}, | |
"path-key": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", | |
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", | |
"dev": true | |
}, | |
"pluralize": { | |
"version": "7.0.0", | |
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", | |
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", | |
"dev": true | |
}, | |
"prelude-ls": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", | |
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", | |
"dev": true | |
}, | |
"progress": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", | |
"integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", | |
"dev": true | |
}, | |
"prop-types": { | |
"version": "15.6.2", | |
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", | |
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", | |
"dev": true, | |
"requires": { | |
"loose-envify": "1.4.0", | |
"object-assign": "4.1.1" | |
} | |
}, | |
"punycode": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", | |
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", | |
"dev": true | |
}, | |
"regexpp": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", | |
"integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", | |
"dev": true | |
}, | |
"require-uncached": { | |
"version": "1.0.3", | |
"resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", | |
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", | |
"dev": true, | |
"requires": { | |
"caller-path": "0.1.0", | |
"resolve-from": "1.0.1" | |
} | |
}, | |
"resolve-from": { | |
"version": "1.0.1", | |
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", | |
"integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", | |
"dev": true | |
}, | |
"restore-cursor": { | |
"version": "2.0.0", | |
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", | |
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", | |
"dev": true, | |
"requires": { | |
"onetime": "2.0.1", | |
"signal-exit": "3.0.2" | |
} | |
}, | |
"rimraf": { | |
"version": "2.6.2", | |
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", | |
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", | |
"dev": true, | |
"requires": { | |
"glob": "7.1.3" | |
} | |
}, | |
"run-async": { | |
"version": "2.3.0", | |
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", | |
"integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", | |
"dev": true, | |
"requires": { | |
"is-promise": "2.1.0" | |
} | |
}, | |
"rxjs": { | |
"version": "6.3.3", | |
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", | |
"integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", | |
"dev": true, | |
"requires": { | |
"tslib": "1.9.3" | |
} | |
}, | |
"safer-buffer": { | |
"version": "2.1.2", | |
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", | |
"dev": true | |
}, | |
"semver": { | |
"version": "5.6.0", | |
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", | |
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", | |
"dev": true | |
}, | |
"shebang-command": { | |
"version": "1.2.0", | |
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", | |
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", | |
"dev": true, | |
"requires": { | |
"shebang-regex": "1.0.0" | |
} | |
}, | |
"shebang-regex": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", | |
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", | |
"dev": true | |
}, | |
"signal-exit": { | |
"version": "3.0.2", | |
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", | |
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", | |
"dev": true | |
}, | |
"slice-ansi": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", | |
"integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", | |
"dev": true, | |
"requires": { | |
"is-fullwidth-code-point": "2.0.0" | |
} | |
}, | |
"sprintf-js": { | |
"version": "1.0.3", | |
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", | |
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", | |
"dev": true | |
}, | |
"string-width": { | |
"version": "2.1.1", | |
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", | |
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", | |
"dev": true, | |
"requires": { | |
"is-fullwidth-code-point": "2.0.0", | |
"strip-ansi": "4.0.0" | |
} | |
}, | |
"strip-ansi": { | |
"version": "4.0.0", | |
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", | |
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", | |
"dev": true, | |
"requires": { | |
"ansi-regex": "3.0.0" | |
} | |
}, | |
"strip-json-comments": { | |
"version": "2.0.1", | |
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | |
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", | |
"dev": true | |
}, | |
"supports-color": { | |
"version": "5.5.0", | |
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", | |
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", | |
"dev": true, | |
"requires": { | |
"has-flag": "3.0.0" | |
} | |
}, | |
"table": { | |
"version": "5.1.0", | |
"resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", | |
"integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", | |
"dev": true, | |
"requires": { | |
"ajv": "6.5.5", | |
"lodash": "4.17.11", | |
"slice-ansi": "1.0.0", | |
"string-width": "2.1.1" | |
} | |
}, | |
"text-table": { | |
"version": "0.2.0", | |
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", | |
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", | |
"dev": true | |
}, | |
"through": { | |
"version": "2.3.8", | |
"resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", | |
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", | |
"dev": true | |
}, | |
"tmp": { | |
"version": "0.0.33", | |
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", | |
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", | |
"dev": true, | |
"requires": { | |
"os-tmpdir": "1.0.2" | |
} | |
}, | |
"tslib": { | |
"version": "1.9.3", | |
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", | |
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", | |
"dev": true | |
}, | |
"type-check": { | |
"version": "0.3.2", | |
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", | |
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", | |
"dev": true, | |
"requires": { | |
"prelude-ls": "1.1.2" | |
} | |
}, | |
"uri-js": { | |
"version": "4.2.2", | |
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", | |
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", | |
"dev": true, | |
"requires": { | |
"punycode": "2.1.1" | |
} | |
}, | |
"which": { | |
"version": "1.3.1", | |
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", | |
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", | |
"dev": true, | |
"requires": { | |
"isexe": "2.0.0" | |
} | |
}, | |
"wordwrap": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", | |
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", | |
"dev": true | |
}, | |
"wrappy": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | |
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", | |
"dev": true | |
}, | |
"write": { | |
"version": "0.2.1", | |
"resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", | |
"integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", | |
"dev": true, | |
"requires": { | |
"mkdirp": "0.5.1" | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "fff-machine-learning", | |
"version": "1.0.0", | |
"description": "Recreation of funfunfunction machine learning video", | |
"main": "machine-learning.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"repository": { | |
"type": "git", | |
"url": "git+ssh://[email protected]/d6791c8181fbee2bb4a83c442219f77a.git" | |
}, | |
"keywords": [ | |
"machine-learning", | |
"javascript" | |
], | |
"author": "Ian Channing", | |
"license": "MIT", | |
"bugs": { | |
"url": "https://gist.github.com/d6791c8181fbee2bb4a83c442219f77a" | |
}, | |
"homepage": "https://gist.github.com/d6791c8181fbee2bb4a83c442219f77a", | |
"devDependencies": { | |
"eslint": "^5.9.0", | |
"eslint-plugin-react": "^7.11.1" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment