diff --git a/src/react-components/2d-hud.css b/src/assets/stylesheets/2d-hud.css similarity index 79% rename from src/react-components/2d-hud.css rename to src/assets/stylesheets/2d-hud.css index 556431ac6ca824e0bbcf4cf4d5644e05be4dc309..a8324a5bb8b054c4da44f82aadfe96647c5cb45b 100644 --- a/src/react-components/2d-hud.css +++ b/src/assets/stylesheets/2d-hud.css @@ -30,14 +30,16 @@ width: 48px; height: 48px; background-size: 100%; - background-image: url(../assets/hud/avatar.jpg); + background-image: url(../hud/avatar.jpg); } :local(.mic) { display: flex; width: 48px; height: 48px; - mask: url(../assets/hud/unmuted.png); + -webkit-mask: url(../hud/unmuted.png); + -webkit-mask-size: 48px; + mask: url(../hud/unmuted.png); mask-size: 48px; background-color: white; cursor: pointer; @@ -56,7 +58,9 @@ } :local(.mic.muted) { - mask: url(../assets/hud/muted.png); + -webkit-mask: url(../hud/muted.png); + -webkit-mask-size: 48px; + mask: url(../hud/muted.png); mask-size: 48px; } diff --git a/src/components/debug.js b/src/components/debug.js index 77202f03295be677b9156e1ff16f11100ab19351..6448bf236966876e05069f96192153cf0f8400b6 100644 --- a/src/components/debug.js +++ b/src/components/debug.js @@ -1,25 +1,30 @@ AFRAME.registerComponent("lifecycle-checker", { schema: { + name: { type: "string" }, tick: { default: false } }, init: function() { - console.log("init", this.el); + this.log("init"); }, update: function() { - console.log("update", this.el); + this.log("update"); }, tick: function() { if (this.data.tick) { - console.log("tick", this.el); + this.log("tick"); } }, remove: function() { - console.log("remove", this.el); + this.log("remove"); }, pause: function() { - console.log("pause", this.el); + this.log("pause"); }, play: function() { - console.log("play", this.el); + this.log("play"); + }, + + log: function(method) { + console.info(`lifecycle-checker:${this.data.name} ${method}`); } }); diff --git a/src/components/gltf-bundle.js b/src/components/gltf-bundle.js index 791fa7eef9076b44eda996192181dc488e755846..85238043fb2319dd1a6e55bc953186890fd2e721 100644 --- a/src/components/gltf-bundle.js +++ b/src/components/gltf-bundle.js @@ -17,8 +17,8 @@ AFRAME.registerComponent("gltf-bundle", { for (let i = 0; i < bundleJson.assets.length; i++) { const asset = bundleJson.assets[i]; const src = asset.src; - const gltfEl = document.createElement("a-gltf-entity"); - gltfEl.setAttribute("src", src); + const gltfEl = document.createElement("a-entity"); + gltfEl.setAttribute("gltf-model-plus", { src }); gltfEl.setAttribute("position", "0 0 0"); loaded.push(new Promise(resolve => gltfEl.addEventListener("model-loaded", resolve))); this.el.appendChild(gltfEl); diff --git a/src/elements/a-gltf-entity.js b/src/components/gltf-model-plus.js similarity index 56% rename from src/elements/a-gltf-entity.js rename to src/components/gltf-model-plus.js index 33489e2bc1792aa2b9dd4bddca360caaa39c509b..f1993414fc6ec0029e5b918d452c7a009ab6c3fd 100644 --- a/src/elements/a-gltf-entity.js +++ b/src/components/gltf-model-plus.js @@ -1,6 +1,6 @@ const GLTFCache = {}; -AFRAME.AGLTFEntity = { +AFRAME.GLTFModelPlus = { defaultInflator(el, componentName, componentData) { if (!AFRAME.components[componentName]) { throw new Error(`Inflator failed. "${componentName}" component does not exist.`); @@ -14,8 +14,8 @@ AFRAME.AGLTFEntity = { } }, registerComponent(componentKey, componentName, inflator) { - AFRAME.AGLTFEntity.components[componentKey] = { - inflator: inflator || AFRAME.AGLTFEntity.defaultInflator, + AFRAME.GLTFModelPlus.components[componentKey] = { + inflator: inflator || AFRAME.GLTFModelPlus.defaultInflator, componentName }; }, @@ -128,7 +128,7 @@ const inflateEntities = function(parentEl, node) { if (entityComponents) { for (const prop in entityComponents) { if (entityComponents.hasOwnProperty(prop)) { - const { inflator, componentName } = AFRAME.AGLTFEntity.components[prop]; + const { inflator, componentName } = AFRAME.GLTFModelPlus.components[prop]; if (inflator) { inflator(el, componentName, entityComponents[prop]); @@ -190,138 +190,94 @@ function cachedLoadGLTF(src, onProgress) { }); } -AFRAME.registerElement("a-gltf-entity", { - prototype: Object.create(AFRAME.AEntity.prototype, { - load: { - async value() { - if (this.hasLoaded || !this.parentEl) { - return; - } - - // The code above and below this are from AEntity.prototype.load, we need to monkeypatch in gltf loading mid function - this.loadTemplates(); - await this.applySrc(this.getAttribute("src")); - // - - AFRAME.ANode.prototype.load.call(this, () => { - // Check if entity was detached while it was waiting to load. - if (!this.parentEl) { - return; - } +AFRAME.registerComponent("gltf-model-plus", { + schema: { + src: { type: "string" }, + inflate: { default: false } + }, - this.updateComponents(); - if (this.isScene || this.parentEl.isPlaying) { - this.play(); - } - }); - } - }, - - loadTemplates: { - value() { - this.templates = []; - this.querySelectorAll(":scope > template").forEach(templateEl => - this.templates.push({ - selector: templateEl.getAttribute("data-selector"), - templateRoot: document.importNode( - templateEl.firstElementChild || templateEl.content.firstElementChild, - true - ) - }) - ); - } - }, - - applySrc: { - async value(src) { - try { - // If the src attribute is a selector, get the url from the asset item. - if (src && src.charAt(0) === "#") { - const assetEl = document.getElementById(src.substring(1)); - if (!assetEl) { - console.warn(`Attempted to use non-existent asset ${src} as src for`, this); - return; - } - - const fallbackSrc = assetEl.getAttribute("src"); - const highSrc = assetEl.getAttribute("high-src"); - const lowSrc = assetEl.getAttribute("low-src"); - - if (highSrc && window.APP.quality === "high") { - src = highSrc; - } else if (lowSrc && window.APP.quality === "low") { - src = lowSrc; - } else { - src = fallbackSrc; - } - } + init() { + this.loadTemplates(); + }, - if (src === this.lastSrc) return; - this.lastSrc = src; + update() { + this.applySrc(this.data.src); + }, - if (!src) { - if (this.inflatedEl) { - console.warn("gltf-entity set to an empty source, unloading inflated model."); - this.removeInflatedEl(); - } - return; - } + loadTemplates() { + this.templates = []; + this.el.querySelectorAll(":scope > template").forEach(templateEl => + this.templates.push({ + selector: templateEl.getAttribute("data-selector"), + templateRoot: document.importNode(templateEl.firstElementChild || templateEl.content.firstElementChild, true) + }) + ); + }, - const model = await cachedLoadGLTF(src); + async applySrc(src) { + try { + // If the src attribute is a selector, get the url from the asset item. + if (src && src.charAt(0) === "#") { + const assetEl = document.getElementById(src.substring(1)); + + const fallbackSrc = assetEl.getAttribute("src"); + const highSrc = assetEl.getAttribute("high-src"); + const lowSrc = assetEl.getAttribute("low-src"); + + if (highSrc && window.APP.quality === "high") { + src = highSrc; + } else if (lowSrc && window.APP.quality === "low") { + src = lowSrc; + } else { + src = fallbackSrc; + } + } - // If we started loading something else already - // TODO: there should be a way to cancel loading instead - if (src != this.lastSrc) return; + if (src === this.lastSrc) return; + this.lastSrc = src; - // If we had inflated something already before, clean that up + if (!src) { + if (this.inflatedEl) { + console.warn("gltf-model-plus set to an empty source, unloading inflated model."); this.removeInflatedEl(); + } + return; + } - this.model = model.scene || model.scenes[0]; - this.model.animations = model.animations; + const model = await cachedLoadGLTF(src); - this.setObject3D("mesh", this.model); + // If we started loading something else already + // TODO: there should be a way to cancel loading instead + if (src != this.lastSrc) return; - if (this.getAttribute("inflate")) { - this.inflatedEl = inflateEntities(this, this.model); - // TODO: Still don't fully understand the lifecycle here and how it differs between browsers, we should dig in more - // Wait one tick for the appended custom elements to be connected before attaching templates - await nextTick(); - if (src != this.lastSrc) return; // TODO: there must be a nicer pattern for this - this.templates.forEach(attachTemplate.bind(null, this)); - } + // If we had inflated something already before, clean that up + this.removeInflatedEl(); - this.emit("model-loaded", { format: "gltf", model: this.model }); - } catch (e) { - console.error("Failed to load glTF model", e.message, this); - this.emit("model-error", { format: "gltf", src }); - } - } - }, + this.model = model.scene || model.scenes[0]; + this.model.animations = model.animations; - removeInflatedEl: { - value() { - if (this.inflatedEl) { - this.inflatedEl.parentNode.removeChild(this.inflatedEl); - delete this.inflatedEl; - } - } - }, + this.el.setObject3D("mesh", this.model); - attributeChangedCallback: { - value(attr, oldVal, newVal) { - if (attr === "src") { - this.applySrc(newVal); - } + if (this.data.inflate) { + this.inflatedEl = inflateEntities(this.el, this.model); + // TODO: Still don't fully understand the lifecycle here and how it differs between browsers, we should dig in more + // Wait one tick for the appended custom elements to be connected before attaching templates + await nextTick(); + if (src != this.lastSrc) return; // TODO: there must be a nicer pattern for this + this.templates.forEach(attachTemplate.bind(null, this.el)); } - }, - setAttribute: { - value(attr, arg1, arg2) { - if (attr === "src") { - this.applySrc(arg1); - } - AFRAME.AEntity.prototype.setAttribute.call(this, attr, arg1, arg2); - } + this.el.emit("model-loaded", { format: "gltf", model: this.model }); + } catch (e) { + console.error("Failed to load glTF model", e.message, this); + this.emit("model-error", { format: "gltf", src }); } - }) + }, + + removeInflatedEl() { + if (this.inflatedEl) { + this.inflatedEl.parentNode.removeChild(this.inflatedEl); + delete this.inflatedEl; + } + } }); diff --git a/src/components/player-info.js b/src/components/player-info.js index ac2fc6b55fcdaf0215e26327368c07dd67e88fcc..fc94e6092ae18bb654a5e344a37649ab41be9d11 100644 --- a/src/components/player-info.js +++ b/src/components/player-info.js @@ -25,7 +25,7 @@ AFRAME.registerComponent("player-info", { const modelEl = this.el.querySelector(".model"); if (this.data.avatarSrc && modelEl) { - modelEl.setAttribute("src", this.data.avatarSrc); + modelEl.setAttribute("gltf-model-plus", "src", this.data.avatarSrc); } } }); diff --git a/src/gltf-component-mappings.js b/src/gltf-component-mappings.js index e4cf086733ad1e0dc547abafe3fb37ed025a5608..7c6b6a8d8774eeeda0de6f0fb074848a5e78be51 100644 --- a/src/gltf-component-mappings.js +++ b/src/gltf-component-mappings.js @@ -1,4 +1,4 @@ -import "./elements/a-gltf-entity"; +import "./components/gltf-model-plus"; -AFRAME.AGLTFEntity.registerComponent("scale-audio-feedback", "scale-audio-feedback"); -AFRAME.AGLTFEntity.registerComponent("loop-animation", "loop-animation"); +AFRAME.GLTFModelPlus.registerComponent("scale-audio-feedback", "scale-audio-feedback"); +AFRAME.GLTFModelPlus.registerComponent("loop-animation", "loop-animation"); diff --git a/src/hub.html b/src/hub.html index fd276abaec43666e9f57842b8e96a0da8c6b1ead..ad2b769bb4d1c53146cddc7dcc1ce747e4cf3f4a 100644 --- a/src/hub.html +++ b/src/hub.html @@ -112,7 +112,7 @@ <a-entity class="right-controller"></a-entity> - <a-gltf-entity class="model" inflate="true"> + <a-entity class="model" gltf-model-plus="inflate: true"> <template data-selector=".RootScene"> <a-entity ik-controller animation-mixer></a-entity> </template> @@ -145,13 +145,13 @@ <template data-selector=".RightHand"> <a-entity personal-space-invader ></a-entity> </template> - </a-gltf-entity> + </a-entity> </a-entity> </template> <template id="interactable-template"> <a-entity - gltf-model="#interactable-duck" + gltf-model-plus="src: #interactable-duck" scale="2 2 2" class="interactable" super-networked-interactable="counter: #counter; mass: 5;" @@ -176,8 +176,8 @@ <!-- Interactables --> <a-entity id="counter" networked-counter="max: 3; ttl: 120"></a-entity> - <a-entity - gltf-model="#interactable-duck" + <a-entity + gltf-model-plus="src: #interactable-duck" scale="2 2 2" class="interactable" super-spawner="template: #interactable-template;" @@ -264,7 +264,7 @@ app-mode-toggle-attribute__line="mode: hud; property: visible;" ></a-entity> - <a-gltf-entity class="model" inflate="true"> + <a-entity gltf-model-plus="inflate: true;" class="model"> <template data-selector=".RootScene"> <a-entity ik-controller @@ -285,14 +285,14 @@ <template data-selector=".LeftHand"> <a-entity> - <a-gltf-entity + <a-entity id="watch" - src="#watch-model" + gltf-model-plus="src: #watch-model" bone-mute-state-indicator scale="1.5 1.5 1.5" rotation="0 -90 90" position="0 -0.04 0" - ></a-gltf-entity> + ></a--entity> <a-entity event-repeater="events: action_grab, action_release; eventSource: #player-left-controller" static-body="shape: sphere; sphereRadius: 0.02" @@ -313,7 +313,7 @@ </a-entity> </template> - </a-gltf-entity> + </a-entity> </a-entity> <!-- Lights --> diff --git a/src/hub.js b/src/hub.js index 887e470250fd224c616ec66e8f53e2ceaea703fe..5ed6373c2f08fa2316f3e18a2d08c23e5874828e 100644 --- a/src/hub.js +++ b/src/hub.js @@ -41,6 +41,7 @@ import "./components/player-info"; import "./components/debug"; import "./components/animation-mixer"; import "./components/loop-animation"; +import "./components/gltf-model-plus"; import "./components/gltf-bundle"; import ReactDOM from "react-dom"; @@ -50,8 +51,6 @@ import UIRoot from "./react-components/ui-root"; import "./systems/personal-space-bubble"; import "./systems/app-mode"; -import "./elements/a-gltf-entity"; - import "./gltf-component-mappings"; import { App } from "./App"; diff --git a/src/react-components/2d-hud.js b/src/react-components/2d-hud.js index fda3ae06ad0ce63b7b773d5a69f4141b52389c9f..73c23c82f39548e1770e8ba1ab8e9b44ab0affae 100644 --- a/src/react-components/2d-hud.js +++ b/src/react-components/2d-hud.js @@ -2,7 +2,7 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; import cx from "classnames"; -import styles from "./2d-hud.css"; +import styles from "../assets/stylesheets/2d-hud.css"; const TwoDHUD = ({ name, muted, onToggleMute }) => ( <div className={styles.container}> diff --git a/src/react-components/avatar-selector.js b/src/react-components/avatar-selector.js index 6ce9a8a172726bb1b6d6194e13d5f88aa29185b5..5cb456ee578bd0c966c02653296457d425c31326 100644 --- a/src/react-components/avatar-selector.js +++ b/src/react-components/avatar-selector.js @@ -56,7 +56,7 @@ class AvatarSelector extends Component { const avatarEntities = this.props.avatars.map((avatar, i) => ( <a-entity key={avatar.id} position="0 0 0" rotation={`0 ${360 * -i / this.props.avatars.length} 0`}> - <a-gltf-entity position="0 0 5" rotation="0 0 0" src={"#" + avatar.id} inflate="true"> + <a-entity position="0 0 5" rotation="0 0 0" gltf-model-plus={`src: #${avatar.id}`} inflate="true"> <template data-selector=".RootScene"> <a-entity animation-mixer /> </template> @@ -66,7 +66,7 @@ class AvatarSelector extends Component { to={`0 ${this.getAvatarIndex() === i ? 360 : 0} 0`} repeat="indefinite" /> - </a-gltf-entity> + </a-entity> </a-entity> )); @@ -100,7 +100,7 @@ class AvatarSelector extends Component { position="0 5 -15" /> <a-entity hide-when-quality="low" light="type: ambient; color: #FFF" /> - <a-gltf-entity id="meeting-space" src="#meeting-space1-mesh" position="0 0 0" /> + <a-entity id="meeting-space" gltf-model-plus="src: #meeting-space1-mesh" position="0 0 0" /> </a-scene> <button className="avatar-selector__previous-button" onClick={this.emitChangeToPrevious}> <FontAwesomeIcon icon={faAngleLeft} /> diff --git a/webpack.config.js b/webpack.config.js index 1fdc22406d4a3ab182b072c6aca32e96cb4d6b23..4cf14964c2deca54e3f83e4380d16e6facd36532 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -213,7 +213,8 @@ const config = { inject: "head" }), // Extract required css and add a content hash. - new ExtractTextPlugin("assets/stylesheets/[name]-[contenthash].css", { + new ExtractTextPlugin({ + filename: "assets/stylesheets/[name]-[contenthash].css", disable: process.env.NODE_ENV !== "production" }), // Transform the output of the html-loader using _.template diff --git a/yarn.lock b/yarn.lock index 18f7727e7dd7217a0e581df22c2ddfc12a8ff16a..6d7eff66533271ad414691dff10bb0394993a7e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -440,16 +440,6 @@ assert@^1.1.1, assert@^1.4.0: dependencies: util "0.10.3" -assets-webpack-plugin@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-3.5.1.tgz#931ce0d66d42e88ed5e7f18d65522943c57a387d" - dependencies: - camelcase "^1.2.1" - escape-string-regexp "^1.0.3" - lodash.assign "^3.2.0" - lodash.merge "^3.3.2" - mkdirp "^0.5.1" - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1719,10 +1709,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -2858,7 +2844,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -4745,57 +4731,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash._arraycopy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" - -lodash._arrayeach@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basefor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash.assign@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -4812,49 +4747,14 @@ lodash.endswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" -lodash.isplainobject@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5" - dependencies: - lodash._basefor "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.keysin "^3.0.0" - lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" -lodash.istypedarray@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keysin@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f" - dependencies: - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4863,30 +4763,10 @@ lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" -lodash.merge@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-3.3.2.tgz#0d90d93ed637b1878437bb3e21601260d7afe994" - dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._createassigner "^3.0.0" - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - lodash.isplainobject "^3.0.0" - lodash.istypedarray "^3.0.0" - lodash.keys "^3.0.0" - lodash.keysin "^3.0.0" - lodash.toplainobject "^3.0.0" - lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - lodash.startswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" @@ -4895,13 +4775,6 @@ lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" -lodash.toplainobject@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz#28790ad942d293d78aa663a07ecf7f52ca04198d" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keysin "^3.0.0" - lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4995,10 +4868,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -material-design-lite@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/material-design-lite/-/material-design-lite-1.3.0.tgz#d004ce3fee99a1eeb74a78b8a325134a5f1171d3" - math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"