diff options
Diffstat (limited to 'bench')
-rw-r--r-- | bench/cjs-sample/cjs.js | 949 | ||||
-rw-r--r-- | bench/config-example/config.js | 1474 | ||||
-rw-r--r-- | bench/config-example/normalize-data.js | 69 | ||||
-rw-r--r-- | bench/config-example/pkg-configs.js | 972 | ||||
-rw-r--r-- | bench/get-cjs-deps.js | 63 | ||||
-rw-r--r-- | bench/normalize-perf.js | 67 |
6 files changed, 3594 insertions, 0 deletions
diff --git a/bench/cjs-sample/cjs.js b/bench/cjs-sample/cjs.js new file mode 100644 index 000000000..376672579 --- /dev/null +++ b/bench/cjs-sample/cjs.js @@ -0,0 +1,949 @@ +/** + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMComponent + */ + +/* global hasOwnProperty:true */ + +'use strict'; + +var _assign = require('object-assign'); + +var AutoFocusUtils = require('./AutoFocusUtils'); +var CSSPropertyOperations = require('./CSSPropertyOperations'); +var DOMLazyTree = require('./DOMLazyTree'); +var DOMNamespaces = require('./DOMNamespaces'); +var DOMProperty = require('./DOMProperty'); +var DOMPropertyOperations = require('./DOMPropertyOperations'); +var EventConstants = require('./EventConstants'); +var EventPluginHub = require('./EventPluginHub'); +var EventPluginRegistry = require('./EventPluginRegistry'); +var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter'); +var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment'); +var ReactDOMButton = require('./ReactDOMButton'); +var ReactDOMComponentFlags = require('./ReactDOMComponentFlags'); +var ReactDOMComponentTree = require('./ReactDOMComponentTree'); +var ReactDOMInput = require('./ReactDOMInput'); +var ReactDOMOption = require('./ReactDOMOption'); +var ReactDOMSelect = require('./ReactDOMSelect'); +var ReactDOMTextarea = require('./ReactDOMTextarea'); +var ReactInstrumentation = require('./ReactInstrumentation'); +var ReactMultiChild = require('./ReactMultiChild'); +var ReactServerRenderingTransaction = require('./ReactServerRenderingTransaction'); + +var emptyFunction = require('fbjs/lib/emptyFunction'); +var escapeTextContentForBrowser = require('./escapeTextContentForBrowser'); +var invariant = require('fbjs/lib/invariant'); +var isEventSupported = require('./isEventSupported'); +var keyOf = require('fbjs/lib/keyOf'); +var shallowEqual = require('fbjs/lib/shallowEqual'); +var validateDOMNesting = require('./validateDOMNesting'); +var warning = require('fbjs/lib/warning'); + +var Flags = ReactDOMComponentFlags; +var deleteListener = EventPluginHub.deleteListener; +var getNode = ReactDOMComponentTree.getNodeFromInstance; +var listenTo = ReactBrowserEventEmitter.listenTo; +var registrationNameModules = EventPluginRegistry.registrationNameModules; + +// For quickly matching children type, to test if can be treated as content. +var CONTENT_TYPES = { 'string': true, 'number': true }; + +var STYLE = keyOf({ style: null }); +var HTML = keyOf({ __html: null }); +var RESERVED_PROPS = { + children: null, + dangerouslySetInnerHTML: null, + suppressContentEditableWarning: null +}; + +// Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE). +var DOC_FRAGMENT_TYPE = 11; + +function getDeclarationErrorAddendum(internalInstance) { + if (internalInstance) { + var owner = internalInstance._currentElement._owner || null; + if (owner) { + var name = owner.getName(); + if (name) { + return ' This DOM node was rendered by `' + name + '`.'; + } + } + } + return ''; +} + +function friendlyStringify(obj) { + if (typeof obj === 'object') { + if (Array.isArray(obj)) { + return '[' + obj.map(friendlyStringify).join(', ') + ']'; + } else { + var pairs = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key); + pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key])); + } + } + return '{' + pairs.join(', ') + '}'; + } + } else if (typeof obj === 'string') { + return JSON.stringify(obj); + } else if (typeof obj === 'function') { + return '[function object]'; + } + // Differs from JSON.stringify in that undefined because undefined and that + // inf and nan don't become null + return String(obj); +} + +var styleMutationWarning = {}; + +function checkAndWarnForMutatedStyle(style1, style2, component) { + if (style1 == null || style2 == null) { + return; + } + if (shallowEqual(style1, style2)) { + return; + } + + var componentName = component._tag; + var owner = component._currentElement._owner; + var ownerName; + if (owner) { + ownerName = owner.getName(); + } + + var hash = ownerName + '|' + componentName; + + if (styleMutationWarning.hasOwnProperty(hash)) { + return; + } + + styleMutationWarning[hash] = true; + + process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : void 0; +} + +/** + * @param {object} component + * @param {?object} props + */ +function assertValidProps(component, props) { + if (!props) { + return; + } + // Note the use of `==` which checks for null or undefined. + if (voidElementTags[component._tag]) { + !(props.children == null && props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : invariant(false) : void 0; + } + if (props.dangerouslySetInnerHTML != null) { + !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : void 0; + !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : void 0; + } + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : void 0; + process.env.NODE_ENV !== 'production' ? warning(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : void 0; + process.env.NODE_ENV !== 'production' ? warning(props.onFocusIn == null && props.onFocusOut == null, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.') : void 0; + } + !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : void 0; +} + +function enqueuePutListener(inst, registrationName, listener, transaction) { + if (transaction instanceof ReactServerRenderingTransaction) { + return; + } + if (process.env.NODE_ENV !== 'production') { + // IE8 has no API for event capturing and the `onScroll` event doesn't + // bubble. + process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\'t support the `onScroll` event') : void 0; + } + var containerInfo = inst._nativeContainerInfo; + var isDocumentFragment = containerInfo._node && containerInfo._node.nodeType === DOC_FRAGMENT_TYPE; + var doc = isDocumentFragment ? containerInfo._node : containerInfo._ownerDocument; + listenTo(registrationName, doc); + transaction.getReactMountReady().enqueue(putListener, { + inst: inst, + registrationName: registrationName, + listener: listener + }); +} + +function putListener() { + var listenerToPut = this; + EventPluginHub.putListener(listenerToPut.inst, listenerToPut.registrationName, listenerToPut.listener); +} + +function optionPostMount() { + var inst = this; + ReactDOMOption.postMountWrapper(inst); +} + +var setContentChildForInstrumentation = emptyFunction; +if (process.env.NODE_ENV !== 'production') { + setContentChildForInstrumentation = function (contentToUse) { + var debugID = this._debugID; + var contentDebugID = debugID + '#text'; + this._contentDebugID = contentDebugID; + ReactInstrumentation.debugTool.onSetDisplayName(contentDebugID, '#text'); + ReactInstrumentation.debugTool.onSetText(contentDebugID, '' + contentToUse); + ReactInstrumentation.debugTool.onMountComponent(contentDebugID); + ReactInstrumentation.debugTool.onSetChildren(debugID, [contentDebugID]); + }; +} + +// There are so many media events, it makes sense to just +// maintain a list rather than create a `trapBubbledEvent` for each +var mediaEvents = { + topAbort: 'abort', + topCanPlay: 'canplay', + topCanPlayThrough: 'canplaythrough', + topDurationChange: 'durationchange', + topEmptied: 'emptied', + topEncrypted: 'encrypted', + topEnded: 'ended', + topError: 'error', + topLoadedData: 'loadeddata', + topLoadedMetadata: 'loadedmetadata', + topLoadStart: 'loadstart', + topPause: 'pause', + topPlay: 'play', + topPlaying: 'playing', + topProgress: 'progress', + topRateChange: 'ratechange', + topSeeked: 'seeked', + topSeeking: 'seeking', + topStalled: 'stalled', + topSuspend: 'suspend', + topTimeUpdate: 'timeupdate', + topVolumeChange: 'volumechange', + topWaiting: 'waiting' +}; + +function trapBubbledEventsLocal() { + var inst = this; + // If a component renders to null or if another component fatals and causes + // the state of the tree to be corrupted, `node` here can be null. + !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : void 0; + var node = getNode(inst); + !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : void 0; + + switch (inst._tag) { + case 'iframe': + case 'object': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'video': + case 'audio': + + inst._wrapperState.listeners = []; + // Create listener for each media event + for (var event in mediaEvents) { + if (mediaEvents.hasOwnProperty(event)) { + inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node)); + } + } + + break; + case 'img': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'form': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)]; + break; + case 'input': + case 'select': + case 'textarea': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topInvalid, 'invalid', node)]; + break; + } +} + +function postUpdateSelectWrapper() { + ReactDOMSelect.postUpdateWrapper(this); +} + +// For HTML, certain tags should omit their close tag. We keep a whitelist for +// those special-case tags. + +var omittedCloseTags = { + 'area': true, + 'base': true, + 'br': true, + 'col': true, + 'embed': true, + 'hr': true, + 'img': true, + 'input': true, + 'keygen': true, + 'link': true, + 'meta': true, + 'param': true, + 'source': true, + 'track': true, + 'wbr': true +}; + +// NOTE: menuitem's close tag should be omitted, but that causes problems. +var newlineEatingTags = { + 'listing': true, + 'pre': true, + 'textarea': true +}; + +// For HTML, certain tags cannot have children. This has the same purpose as +// `omittedCloseTags` except that `menuitem` should still have its closing tag. + +var voidElementTags = _assign({ + 'menuitem': true +}, omittedCloseTags); + +// We accept any tag to be rendered but since this gets injected into arbitrary +// HTML, we want to make sure that it's a safe tag. +// http://www.w3.org/TR/REC-xml/#NT-Name + +var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset +var validatedTagCache = {}; +var hasOwnProperty = {}.hasOwnProperty; + +function validateDangerousTag(tag) { + if (!hasOwnProperty.call(validatedTagCache, tag)) { + !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : void 0; + validatedTagCache[tag] = true; + } +} + +function isCustomComponent(tagName, props) { + return tagName.indexOf('-') >= 0 || props.is != null; +} + +var globalIdCounter = 1; + +/** + * Creates a new React class that is idempotent and capable of containing other + * React components. It accepts event listeners and DOM properties that are + * valid according to `DOMProperty`. + * + * - Event listeners: `onClick`, `onMouseDown`, etc. + * - DOM properties: `className`, `name`, `title`, etc. + * + * The `style` property functions differently from the DOM API. It accepts an + * object mapping of style properties to values. + * + * @constructor ReactDOMComponent + * @extends ReactMultiChild + */ +function ReactDOMComponent(element) { + var tag = element.type; + validateDangerousTag(tag); + this._currentElement = element; + this._tag = tag.toLowerCase(); + this._namespaceURI = null; + this._renderedChildren = null; + this._previousStyle = null; + this._previousStyleCopy = null; + this._nativeNode = null; + this._nativeParent = null; + this._rootNodeID = null; + this._domID = null; + this._nativeContainerInfo = null; + this._wrapperState = null; + this._topLevelWrapper = null; + this._flags = 0; + if (process.env.NODE_ENV !== 'production') { + this._ancestorInfo = null; + this._contentDebugID = null; + } +} + +ReactDOMComponent.displayName = 'ReactDOMComponent'; + +ReactDOMComponent.Mixin = { + + /** + * Generates root tag markup then recurses. This method has side effects and + * is not idempotent. + * + * @internal + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {?ReactDOMComponent} the containing DOM component instance + * @param {?object} info about the native container + * @param {object} context + * @return {string} The computed markup. + */ + mountComponent: function (transaction, nativeParent, nativeContainerInfo, context) { + this._rootNodeID = globalIdCounter++; + this._domID = nativeContainerInfo._idCounter++; + this._nativeParent = nativeParent; + this._nativeContainerInfo = nativeContainerInfo; + + var props = this._currentElement.props; + + switch (this._tag) { + case 'iframe': + case 'object': + case 'img': + case 'form': + case 'video': + case 'audio': + this._wrapperState = { + listeners: null + }; + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + case 'button': + props = ReactDOMButton.getNativeProps(this, props, nativeParent); + break; + case 'input': + ReactDOMInput.mountWrapper(this, props, nativeParent); + props = ReactDOMInput.getNativeProps(this, props); + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + case 'option': + ReactDOMOption.mountWrapper(this, props, nativeParent); + props = ReactDOMOption.getNativeProps(this, props); + break; + case 'select': + ReactDOMSelect.mountWrapper(this, props, nativeParent); + props = ReactDOMSelect.getNativeProps(this, props); + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + case 'textarea': + ReactDOMTextarea.mountWrapper(this, props, nativeParent); + props = ReactDOMTextarea.getNativeProps(this, props); + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + } + + assertValidProps(this, props); + + // We create tags in the namespace of their parent container, except HTML + // tags get no namespace. + var namespaceURI; + var parentTag; + if (nativeParent != null) { + namespaceURI = nativeParent._namespaceURI; + parentTag = nativeParent._tag; + } else if (nativeContainerInfo._tag) { + namespaceURI = nativeContainerInfo._namespaceURI; + parentTag = nativeContainerInfo._tag; + } + if (namespaceURI == null || namespaceURI === DOMNamespaces.svg && parentTag === 'foreignobject') { + namespaceURI = DOMNamespaces.html; + } + if (namespaceURI === DOMNamespaces.html) { + if (this._tag === 'svg') { + namespaceURI = DOMNamespaces.svg; + } else if (this._tag === 'math') { + namespaceURI = DOMNamespaces.mathml; + } + } + this._namespaceURI = namespaceURI; + + if (process.env.NODE_ENV !== 'production') { + var parentInfo; + if (nativeParent != null) { + parentInfo = nativeParent._ancestorInfo; + } else if (nativeContainerInfo._tag) { + parentInfo = nativeContainerInfo._ancestorInfo; + } + if (parentInfo) { + // parentInfo should always be present except for the top-level + // component when server rendering + validateDOMNesting(this._tag, this, parentInfo); + } + this._ancestorInfo = validateDOMNesting.updatedAncestorInfo(parentInfo, this._tag, this); + } + + var mountImage; + if (transaction.useCreateElement) { + var ownerDocument = nativeContainerInfo._ownerDocument; + var el; + if (namespaceURI === DOMNamespaces.html) { + if (this._tag === 'script') { + // Create the script via .innerHTML so its "parser-inserted" flag is + // set to true and it does not execute + var div = ownerDocument.createElement('div'); + var type = this._currentElement.type; + div.innerHTML = '<' + type + '></' + type + '>'; + el = div.removeChild(div.firstChild); + } else { + el = ownerDocument.createElement(this._currentElement.type, props.is || null); + } + } else { + el = ownerDocument.createElementNS(namespaceURI, this._currentElement.type); + } + ReactDOMComponentTree.precacheNode(this, el); + this._flags |= Flags.hasCachedChildNodes; + if (!this._nativeParent) { + DOMPropertyOperations.setAttributeForRoot(el); + } + this._updateDOMProperties(null, props, transaction); + var lazyTree = DOMLazyTree(el); + this._createInitialChildren(transaction, props, context, lazyTree); + mountImage = lazyTree; + } else { + var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props); + var tagContent = this._createContentMarkup(transaction, props, context); + if (!tagContent && omittedCloseTags[this._tag]) { + mountImage = tagOpen + '/>'; + } else { + mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>'; + } + } + + switch (this._tag) { + case 'button': + case 'input': + case 'select': + case 'textarea': + if (props.autoFocus) { + transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); + } + break; + case 'option': + transaction.getReactMountReady().enqueue(optionPostMount, this); + } + + return mountImage; + }, + + /** + * Creates markup for the open tag and all attributes. + * + * This method has side effects because events get registered. + * + * Iterating over object properties is faster than iterating over arrays. + * @see http://jsperf.com/obj-vs-arr-iteration + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @return {string} Markup of opening tag. + */ + _createOpenTagMarkupAndPutListeners: function (transaction, props) { + var ret = '<' + this._currentElement.type; + + for (var propKey in props) { + if (!props.hasOwnProperty(propKey)) { + continue; + } + var propValue = props[propKey]; + if (propValue == null) { + continue; + } + if (registrationNameModules.hasOwnProperty(propKey)) { + if (propValue) { + enqueuePutListener(this, propKey, propValue, transaction); + } + } else { + if (propKey === STYLE) { + if (propValue) { + if (process.env.NODE_ENV !== 'production') { + // See `_updateDOMProperties`. style block + this._previousStyle = propValue; + } + propValue = this._previousStyleCopy = _assign({}, props.style); + } + propValue = CSSPropertyOperations.createMarkupForStyles(propValue, this); + } + var markup = null; + if (this._tag != null && isCustomComponent(this._tag, props)) { + if (!RESERVED_PROPS.hasOwnProperty(propKey)) { + markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue); + } + } else { + markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); + } + if (markup) { + ret += ' ' + markup; + } + } + } + + // For static pages, no need to put React ID and checksum. Saves lots of + // bytes. + if (transaction.renderToStaticMarkup) { + return ret; + } + + if (!this._nativeParent) { + ret += ' ' + DOMPropertyOperations.createMarkupForRoot(); + } + ret += ' ' + DOMPropertyOperations.createMarkupForID(this._domID); + return ret; + }, + + /** + * Creates markup for the content between the tags. + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @param {object} context + * @return {string} Content markup. + */ + _createContentMarkup: function (transaction, props, context) { + var ret = ''; + + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + ret = innerHTML.__html; + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + ret = escapeTextContentForBrowser(contentToUse); + if (process.env.NODE_ENV !== 'production') { + setContentChildForInstrumentation.call(this, contentToUse); + } + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + ret = mountImages.join(''); + } + } + if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') { + // text/html ignores the first character in these tags if it's a newline + // Prefer to break application/xml over text/html (for now) by adding + // a newline specifically to get eaten by the parser. (Alternately for + // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first + // \r is normalized out by HTMLTextAreaElement#value.) + // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre> + // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions> + // See: <http://www.w3.org/TR/html5/syntax.html#newlines> + // See: Parsing of "textarea" "listing" and "pre" elements + // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody> + return '\n' + ret; + } else { + return ret; + } + }, + + _createInitialChildren: function (transaction, props, context, lazyTree) { + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + DOMLazyTree.queueHTML(lazyTree, innerHTML.__html); + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + if (process.env.NODE_ENV !== 'production') { + setContentChildForInstrumentation.call(this, contentToUse); + } + DOMLazyTree.queueText(lazyTree, contentToUse); + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + for (var i = 0; i < mountImages.length; i++) { + DOMLazyTree.queueChild(lazyTree, mountImages[i]); + } + } + } + }, + + /** + * Receives a next element and updates the component. + * + * @internal + * @param {ReactElement} nextElement + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} context + */ + receiveComponent: function (nextElement, transaction, context) { + var prevElement = this._currentElement; + this._currentElement = nextElement; + this.updateComponent(transaction, prevElement, nextElement, context); + }, + + /** + * Updates a native DOM component after it has already been allocated and + * attached to the DOM. Reconciles the root DOM node, then recurses. + * + * @param {ReactReconcileTransaction} transaction + * @param {ReactElement} prevElement + * @param {ReactElement} nextElement + * @internal + * @overridable + */ + updateComponent: function (transaction, prevElement, nextElement, context) { + var lastProps = prevElement.props; + var nextProps = this._currentElement.props; + + switch (this._tag) { + case 'button': + lastProps = ReactDOMButton.getNativeProps(this, lastProps); + nextProps = ReactDOMButton.getNativeProps(this, nextProps); + break; + case 'input': + ReactDOMInput.updateWrapper(this); + lastProps = ReactDOMInput.getNativeProps(this, lastProps); + nextProps = ReactDOMInput.getNativeProps(this, nextProps); + break; + case 'option': + lastProps = ReactDOMOption.getNativeProps(this, lastProps); + nextProps = ReactDOMOption.getNativeProps(this, nextProps); + break; + case 'select': + lastProps = ReactDOMSelect.getNativeProps(this, lastProps); + nextProps = ReactDOMSelect.getNativeProps(this, nextProps); + break; + case 'textarea': + ReactDOMTextarea.updateWrapper(this); + lastProps = ReactDOMTextarea.getNativeProps(this, lastProps); + nextProps = ReactDOMTextarea.getNativeProps(this, nextProps); + break; + } + + assertValidProps(this, nextProps); + this._updateDOMProperties(lastProps, nextProps, transaction); + this._updateDOMChildren(lastProps, nextProps, transaction, context); + + if (this._tag === 'select') { + // <select> value update needs to occur after <option> children + // reconciliation + transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this); + } + }, + + /** + * Reconciles the properties by detecting differences in property values and + * updating the DOM as necessary. This function is probably the single most + * critical path for performance optimization. + * + * TODO: Benchmark whether checking for changed values in memory actually + * improves performance (especially statically positioned elements). + * TODO: Benchmark the effects of putting this at the top since 99% of props + * do not change for a given reconciliation. + * TODO: Benchmark areas that can be improved with caching. + * + * @private + * @param {object} lastProps + * @param {object} nextProps + * @param {?DOMElement} node + */ + _updateDOMProperties: function (lastProps, nextProps, transaction) { + var propKey; + var styleName; + var styleUpdates; + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { + continue; + } + if (propKey === STYLE) { + var lastStyle = this._previousStyleCopy; + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + this._previousStyleCopy = null; + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (lastProps[propKey]) { + // Only call deleteListener if there was a listener previously or + // else willDeleteListener gets called when there wasn't actually a + // listener (e.g., onClick={null}) + deleteListener(this, propKey); + } + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + DOMPropertyOperations.deleteValueForProperty(getNode(this), propKey); + } + } + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps != null ? lastProps[propKey] : undefined; + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { + continue; + } + if (propKey === STYLE) { + if (nextProp) { + if (process.env.NODE_ENV !== 'production') { + checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this); + this._previousStyle = nextProp; + } + nextProp = this._previousStyleCopy = _assign({}, nextProp); + } else { + this._previousStyleCopy = null; + } + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + // Update styles that changed since `lastProp`. + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + styleUpdates = nextProp; + } + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp) { + enqueuePutListener(this, propKey, nextProp, transaction); + } else if (lastProp) { + deleteListener(this, propKey); + } + } else if (isCustomComponent(this._tag, nextProps)) { + if (!RESERVED_PROPS.hasOwnProperty(propKey)) { + DOMPropertyOperations.setValueForAttribute(getNode(this), propKey, nextProp); + } + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + var node = getNode(this); + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertently setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (nextProp != null) { + DOMPropertyOperations.setValueForProperty(node, propKey, nextProp); + } else { + DOMPropertyOperations.deleteValueForProperty(node, propKey); + } + } + } + if (styleUpdates) { + CSSPropertyOperations.setValueForStyles(getNode(this), styleUpdates, this); + } + }, + + /** + * Reconciles the children with the various properties that affect the + * children content. + * + * @param {object} lastProps + * @param {object} nextProps + * @param {ReactReconcileTransaction} transaction + * @param {object} context + */ + _updateDOMChildren: function (lastProps, nextProps, transaction, context) { + var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; + var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; + + var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html; + var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html; + + // Note the use of `!=` which checks for null or undefined. + var lastChildren = lastContent != null ? null : lastProps.children; + var nextChildren = nextContent != null ? null : nextProps.children; + + // If we're switching from children to content/html or vice versa, remove + // the old content + var lastHasContentOrHtml = lastContent != null || lastHtml != null; + var nextHasContentOrHtml = nextContent != null || nextHtml != null; + if (lastChildren != null && nextChildren == null) { + this.updateChildren(null, transaction, context); + } else if (lastHasContentOrHtml && !nextHasContentOrHtml) { + this.updateTextContent(''); + if (process.env.NODE_ENV !== 'production') { + ReactInstrumentation.debugTool.onSetChildren(this._debugID, []); + } + } + + if (nextContent != null) { + if (lastContent !== nextContent) { + this.updateTextContent('' + nextContent); + if (process.env.NODE_ENV !== 'production') { + this._contentDebugID = this._debugID + '#text'; + setContentChildForInstrumentation.call(this, nextContent); + } + } + } else if (nextHtml != null) { + if (lastHtml !== nextHtml) { + this.updateMarkup('' + nextHtml); + } + if (process.env.NODE_ENV !== 'production') { + ReactInstrumentation.debugTool.onSetChildren(this._debugID, []); + } + } else if (nextChildren != null) { + if (process.env.NODE_ENV !== 'production') { + if (this._contentDebugID) { + ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID); + this._contentDebugID = null; + } + } + + this.updateChildren(nextChildren, transaction, context); + } + }, + + getNativeNode: function () { + return getNode(this); + }, + + /** + * Destroys all event registrations for this instance. Does not remove from + * the DOM. That must be done by the parent. + * + * @internal + */ + unmountComponent: function (safely) { + switch (this._tag) { + case 'iframe': + case 'object': + case 'img': + case 'form': + case 'video': + case 'audio': + var listeners = this._wrapperState.listeners; + if (listeners) { + for (var i = 0; i < listeners.length; i++) { + listeners[i].remove(); + } + } + break; + case 'html': + case 'head': + case 'body': + /** + * Components like <html> <head> and <body> can't be removed or added + * easily in a cross-browser way, however it's valuable to be able to + * take advantage of React's reconciliation for styling and <title> + * management. So we just document it and throw in dangerous cases. + */ + !false ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : void 0; + break; + } + + this.unmountChildren(safely); + ReactDOMComponentTree.uncacheNode(this); + EventPluginHub.deleteAllListeners(this); + ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); + this._rootNodeID = null; + this._domID = null; + this._wrapperState = null; + + if (process.env.NODE_ENV !== 'production') { + if (this._contentDebugID) { + ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID); + this._contentDebugID = null; + } + } + }, + + getPublicInstance: function () { + return getNode(this); + } + +}; + +_assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); + +module.exports = ReactDOMComponent;
\ No newline at end of file diff --git a/bench/config-example/config.js b/bench/config-example/config.js new file mode 100644 index 000000000..fc0dc184a --- /dev/null +++ b/bench/config-example/config.js @@ -0,0 +1,1474 @@ +SystemJS.config({ + paths: { + 'npm:': 'npm/', + 'github:': 'github/' + }, + packageConfigPaths: [ + "npm:@*/*.json", + "npm:*.json", + "github:*/*.json" + ], + devConfig: { + "map": { + "plugin-babel": "npm:systemjs-plugin-babel@0.0.10" + } + }, + transpiler: "plugin-babel" +}); + +SystemJS.config({ + map: { + "angular": "github:angular/bower-angular@1.4.8", + "assert": "github:jspm/nodelibs-assert@0.2.0-alpha", + "bootstrap": "github:twbs/bootstrap@3.3.6", + "buffer": "github:jspm/nodelibs-buffer@0.2.0-alpha", + "builder": "npm:systemjs-builder@0.15.18", + "child_process": "github:jspm/nodelibs-child_process@0.2.0-alpha", + "clean-css": "npm:clean-css@3.4.9", + "cluster": "github:jspm/nodelibs-cluster@0.2.0-alpha", + "console": "github:jspm/nodelibs-console@0.2.0-alpha", + "constants": "github:jspm/nodelibs-constants@0.2.0-alpha", + "core-js": "npm:core-js@1.2.6", + "crypto": "github:jspm/nodelibs-crypto@0.2.0-alpha", + "css": "github:systemjs/plugin-css@0.1.20", + "d3": "github:mbostock/d3@3.5.12", + "dgram": "github:jspm/nodelibs-dgram@0.2.0-alpha", + "dns": "github:jspm/nodelibs-dns@0.2.0-alpha", + "domain": "github:jspm/nodelibs-domain@0.2.0-alpha", + "ecc-jsbn": "npm:ecc-jsbn@0.1.1", + "ember": "github:components/ember@1.13.2", + "events": "github:jspm/nodelibs-events@0.2.0-alpha", + "fs": "github:jspm/nodelibs-fs@0.2.0-alpha", + "github": "npm:jspm-github@0.14.7", + "http": "github:jspm/nodelibs-http@0.2.0-alpha", + "https": "github:jspm/nodelibs-https@0.2.0-alpha", + "jodid25519": "npm:jodid25519@1.0.2", + "jquery": "github:components/jquery@2.1.4", + "jsbn": "npm:jsbn@0.1.0", + "jspm": "github:jspm/jspm-cli@0.17", + "jspm-registry": "npm:jspm-registry@0.4.0", + "mocha": "npm:mocha@1.21.5", + "module": "github:jspm/nodelibs-module@0.2.0-alpha", + "net": "github:jspm/nodelibs-net@0.2.0-alpha", + "npm": "npm:jspm-npm@0.28.12", + "os": "github:jspm/nodelibs-os@0.2.0-alpha", + "path": "github:jspm/nodelibs-path@0.2.0-alpha", + "process": "github:jspm/nodelibs-process@0.2.0-alpha", + "punycode": "github:jspm/nodelibs-punycode@0.2.0-alpha", + "querystring": "github:jspm/nodelibs-querystring@0.2.0-alpha", + "readline": "github:jspm/nodelibs-readline@0.2.0-alpha", + "repl": "github:jspm/nodelibs-repl@0.2.0-alpha", + "rsvp": "npm:rsvp@3.1.0", + "source-map": "npm:source-map@0.5.3", + "sshpk": "npm:sshpk@1.7.3", + "stream": "github:jspm/nodelibs-stream@0.2.0-alpha", + "string_decoder": "github:jspm/nodelibs-string_decoder@0.2.0-alpha", + "systemjs": "npm:systemjs@0.19.29", + "text": "github:systemjs/plugin-text@0.0.2", + "timers": "github:jspm/nodelibs-timers@0.2.0-alpha", + "tls": "github:jspm/nodelibs-tls@0.2.0-alpha", + "tty": "github:jspm/nodelibs-tty@0.2.0-alpha", + "tweetnacl": "npm:tweetnacl@0.14.1", + "url": "github:jspm/nodelibs-url@0.2.0-alpha", + "util": "github:jspm/nodelibs-util@0.2.0-alpha", + "vm": "github:jspm/nodelibs-vm@0.2.0-alpha", + "voxel-demo": "npm:voxel-demo@0.0.1", + "zlib": "github:jspm/nodelibs-zlib@0.2.0-alpha" + } +}); + +SystemJS.config({ + packages: { + "npm:asn1.js@4.5.1": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "inherits": "npm:inherits@2.0.1", + "minimalistic-assert": "npm:minimalistic-assert@1.0.0" + } + }, + "npm:babel-code-frame@6.7.7": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38", + "chalk": "npm:chalk@1.1.1", + "esutils": "npm:esutils@2.0.2", + "js-tokens": "npm:js-tokens@1.0.3" + } + }, + "npm:babel-helper-hoist-variables@6.6.5": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-types": "npm:babel-types@6.7.7" + } + }, + "npm:babel-messages@6.7.2": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38" + } + }, + "npm:babel-plugin-transform-es2015-modules-systemjs@6.6.5": { + "map": { + "babel-helper-hoist-variables": "npm:babel-helper-hoist-variables@6.6.5", + "babel-plugin-transform-strict-mode": "npm:babel-plugin-transform-strict-mode@6.6.5", + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-template": "npm:babel-template@6.7.0" + } + }, + "npm:babel-plugin-transform-strict-mode@6.6.5": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-types": "npm:babel-types@6.7.7" + } + }, + "npm:babel-template@6.7.0": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-traverse": "npm:babel-traverse@6.7.6", + "babel-types": "npm:babel-types@6.7.7", + "babylon": "npm:babylon@6.7.0", + "lodash": "npm:lodash@3.10.1" + } + }, + "npm:babel-traverse@6.7.6": { + "map": { + "babel-code-frame": "npm:babel-code-frame@6.7.7", + "babel-messages": "npm:babel-messages@6.7.2", + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-types": "npm:babel-types@6.7.7", + "babylon": "npm:babylon@6.7.0", + "debug": "npm:debug@2.2.0", + "globals": "npm:globals@8.18.0", + "invariant": "npm:invariant@2.2.1", + "lodash": "npm:lodash@3.10.1", + "repeating": "npm:repeating@1.1.3" + } + }, + "npm:babel-types@6.7.7": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38", + "babel-traverse": "npm:babel-traverse@6.7.6", + "esutils": "npm:esutils@2.0.2", + "lodash": "npm:lodash@3.10.1", + "to-fast-properties": "npm:to-fast-properties@1.0.2" + } + }, + "npm:babylon@6.7.0": { + "map": { + "babel-runtime": "npm:babel-runtime@5.8.38" + } + }, + "npm:browserify-aes@1.0.6": { + "map": { + "buffer-xor": "npm:buffer-xor@1.0.3", + "cipher-base": "npm:cipher-base@1.0.2", + "create-hash": "npm:create-hash@1.1.2", + "evp_bytestokey": "npm:evp_bytestokey@1.0.0", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:browserify-rsa@4.0.1": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "randombytes": "npm:randombytes@2.0.3" + } + }, + "npm:bser@1.0.2": { + "map": { + "node-int64": "npm:node-int64@0.4.0" + } + }, + "npm:buffer@4.5.0": { + "map": { + "base64-js": "npm:base64-js@1.1.1", + "ieee754": "npm:ieee754@1.1.6", + "isarray": "npm:isarray@1.0.0" + } + }, + "npm:dashdash@1.13.0": { + "map": { + "assert-plus": "npm:assert-plus@1.0.0" + } + }, + "npm:debug@2.2.0": { + "map": { + "ms": "npm:ms@0.7.1" + } + }, + "npm:detect-indent@3.0.1": { + "map": { + "get-stdin": "npm:get-stdin@4.0.1", + "minimist": "npm:minimist@1.2.0", + "repeating": "npm:repeating@1.1.3" + } + }, + "npm:diffie-hellman@5.0.2": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "miller-rabin": "npm:miller-rabin@4.0.0", + "randombytes": "npm:randombytes@2.0.3" + } + }, + "npm:elliptic@6.2.3": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "brorand": "npm:brorand@1.0.5", + "hash.js": "npm:hash.js@1.0.3", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:exec-sh@0.2.0": { + "map": { + "merge": "npm:merge@1.2.0" + } + }, + "npm:fb-watchman@1.9.0": { + "map": { + "bser": "npm:bser@1.0.2" + } + }, + "npm:glob@6.0.4": { + "map": { + "inflight": "npm:inflight@1.0.4", + "inherits": "npm:inherits@2.0.1", + "minimatch": "npm:minimatch@3.0.0", + "once": "npm:once@1.3.3", + "path-is-absolute": "npm:path-is-absolute@1.0.0" + } + }, + "npm:glob@7.0.3": { + "map": { + "inflight": "npm:inflight@1.0.4", + "inherits": "npm:inherits@2.0.1", + "minimatch": "npm:minimatch@3.0.0", + "once": "npm:once@1.3.3", + "path-is-absolute": "npm:path-is-absolute@1.0.0" + } + }, + "npm:graceful-readlink@1.0.1": { + "map": {} + }, + "npm:home-or-tmp@1.0.0": { + "map": { + "os-tmpdir": "npm:os-tmpdir@1.0.1", + "user-home": "npm:user-home@1.1.1" + } + }, + "npm:inherits@2.0.1": { + "map": {} + }, + "npm:invariant@2.2.1": { + "map": { + "loose-envify": "npm:loose-envify@1.1.0" + } + }, + "npm:is-finite@1.0.1": { + "map": { + "number-is-nan": "npm:number-is-nan@1.0.0" + } + }, + "github:jspm/jspm-cli@0.17": { + "map": { + "bluebird": "npm:bluebird@3.3.5", + "chalk": "npm:chalk@1.1.1", + "core-js": "npm:core-js@1.2.6", + "glob": "npm:glob@6.0.4", + "graceful-fs": "npm:graceful-fs@4.1.2", + "jspm-github": "npm:jspm-github@0.14.7", + "jspm-npm": "npm:jspm-npm@0.28.12", + "jspm-registry": "npm:jspm-registry@0.4.0", + "liftoff": "npm:liftoff@2.2.0", + "minimatch": "npm:minimatch@3.0.0", + "mkdirp": "npm:mkdirp@0.5.1", + "ncp": "npm:ncp@2.0.0", + "proper-lockfile": "npm:proper-lockfile@1.1.1", + "request": "npm:request@2.67.0", + "rimraf": "npm:rimraf@2.5.0", + "sane": "npm:sane@1.3.3", + "semver": "npm:semver@5.1.0", + "systemjs": "npm:systemjs@0.19.29", + "systemjs-builder": "npm:systemjs-builder@0.15.18", + "traceur": "npm:traceur@0.0.105", + "uglify-js": "npm:uglify-js@2.6.1", + "resolve": "npm:resolve@1.1.7" + } + }, + "github:jspm/nodelibs-buffer@0.2.0-alpha": { + "map": { + "buffer-browserify": "npm:buffer@4.5.0" + } + }, + "github:jspm/nodelibs-crypto@0.2.0-alpha": { + "map": { + "crypto-browserify": "npm:crypto-browserify@3.11.0" + } + }, + "github:jspm/nodelibs-http@0.2.0-alpha": { + "map": { + "http-browserify": "npm:stream-http@2.0.5" + } + }, + "github:jspm/nodelibs-os@0.2.0-alpha": { + "map": { + "os-browserify": "npm:os-browserify@0.2.0" + } + }, + "github:jspm/nodelibs-punycode@0.2.0-alpha": { + "map": { + "punycode-browserify": "npm:punycode@1.3.2" + } + }, + "github:jspm/nodelibs-stream@0.2.0-alpha": { + "map": { + "stream-browserify": "npm:stream-browserify@2.0.1" + } + }, + "github:jspm/nodelibs-string_decoder@0.2.0-alpha": { + "map": { + "string_decoder-browserify": "npm:string_decoder@0.10.31" + } + }, + "github:jspm/nodelibs-url@0.2.0-alpha": { + "map": { + "url-browserify": "npm:url@0.11.0" + } + }, + "github:jspm/nodelibs-zlib@0.2.0-alpha": { + "map": { + "zlib-browserify": "npm:browserify-zlib@0.1.4" + } + }, + "npm:loose-envify@1.1.0": { + "map": { + "js-tokens": "npm:js-tokens@1.0.3" + } + }, + "npm:makeerror@1.0.11": { + "map": { + "tmpl": "npm:tmpl@1.0.4" + } + }, + "npm:minimatch@0.2.14": { + "map": { + "lru-cache": "npm:lru-cache@2.7.3", + "sigmund": "npm:sigmund@1.0.1" + } + }, + "npm:mocha@1.21.5": { + "map": { + "css": "github:systemjs/plugin-css@0.1.20" + } + }, + "npm:repeating@1.1.3": { + "map": { + "is-finite": "npm:is-finite@1.0.1" + } + }, + "npm:rollup@0.25.8": { + "map": { + "chalk": "npm:chalk@1.1.1", + "minimist": "npm:minimist@1.2.0", + "source-map-support": "npm:source-map-support@0.3.3" + } + }, + "npm:sane@1.3.3": { + "map": { + "exec-sh": "npm:exec-sh@0.2.0", + "fb-watchman": "npm:fb-watchman@1.9.0", + "minimatch": "npm:minimatch@0.2.14", + "minimist": "npm:minimist@1.2.0", + "walker": "npm:walker@1.0.7", + "watch": "npm:watch@0.10.0" + } + }, + "npm:sha.js@2.4.5": { + "map": { + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:sshpk@1.7.3": { + "map": { + "asn1": "npm:asn1@0.2.3", + "assert-plus": "npm:assert-plus@0.2.0", + "dashdash": "npm:dashdash@1.13.0" + } + }, + "npm:stream-browserify@1.0.0": { + "map": { + "inherits": "npm:inherits@2.0.1", + "readable-stream": "npm:readable-stream@1.0.33" + } + }, + "npm:stream-http@2.0.5": { + "map": { + "builtin-status-codes": "npm:builtin-status-codes@1.0.0", + "inherits": "npm:inherits@2.0.1", + "xtend": "npm:xtend@4.0.1" + } + }, + "npm:string_decoder@0.10.31": { + "map": {} + }, + "github:twbs/bootstrap@3.3.6": { + "map": { + "jquery": "github:components/jquery@2.1.4" + } + }, + "npm:align-text@0.1.3": { + "map": { + "kind-of": "npm:kind-of@2.0.1", + "longest": "npm:longest@1.0.1", + "repeat-string": "npm:repeat-string@1.5.2" + } + }, + "npm:ao-mesher@0.2.10": { + "map": { + "cwise-compiler": "npm:cwise-compiler@0.1.0", + "greedy-mesher": "npm:greedy-mesher@1.0.2", + "ndarray": "npm:ndarray@1.0.18", + "typedarray-pool": "npm:typedarray-pool@0.1.2" + } + }, + "npm:ao-shader@0.2.3": { + "map": { + "brfs": "npm:brfs@0.0.9", + "gl-shader": "npm:gl-shader@0.0.6" + } + }, + "npm:bl@0.9.4": { + "map": { + "readable-stream": "npm:readable-stream@1.0.33" + } + }, + "npm:bl@1.0.0": { + "map": { + "readable-stream": "npm:readable-stream@2.0.5" + } + }, + "npm:block-stream@0.0.8": { + "map": { + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:boom@2.10.1": { + "map": { + "hoek": "npm:hoek@2.16.3" + } + }, + "npm:brace-expansion@1.1.2": { + "map": { + "balanced-match": "npm:balanced-match@0.3.0", + "concat-map": "npm:concat-map@0.0.1" + } + }, + "npm:brfs@0.0.9": { + "map": { + "escodegen": "npm:escodegen@0.0.17", + "falafel": "npm:falafel@0.1.6", + "through": "npm:through@2.2.7" + } + }, + "npm:browserify-cipher@1.0.0": { + "map": { + "browserify-aes": "npm:browserify-aes@1.0.6", + "browserify-des": "npm:browserify-des@1.0.0", + "evp_bytestokey": "npm:evp_bytestokey@1.0.0" + } + }, + "npm:browserify-des@1.0.0": { + "map": { + "cipher-base": "npm:cipher-base@1.0.2", + "des.js": "npm:des.js@1.0.0", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:browserify-sign@4.0.0": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "browserify-rsa": "npm:browserify-rsa@4.0.1", + "create-hash": "npm:create-hash@1.1.2", + "create-hmac": "npm:create-hmac@1.1.4", + "elliptic": "npm:elliptic@6.2.3", + "inherits": "npm:inherits@2.0.1", + "parse-asn1": "npm:parse-asn1@5.0.0" + } + }, + "npm:browserify-zlib@0.1.4": { + "map": { + "pako": "npm:pako@0.2.8", + "readable-stream": "npm:readable-stream@1.0.33" + } + }, + "npm:center-align@0.1.2": { + "map": { + "align-text": "npm:align-text@0.1.3", + "lazy-cache": "npm:lazy-cache@0.2.7" + } + }, + "npm:chalk@1.1.1": { + "map": { + "ansi-styles": "npm:ansi-styles@2.1.0", + "escape-string-regexp": "npm:escape-string-regexp@1.0.4", + "has-ansi": "npm:has-ansi@2.0.0", + "strip-ansi": "npm:strip-ansi@3.0.0", + "supports-color": "npm:supports-color@2.0.0" + } + }, + "npm:cipher-base@1.0.2": { + "map": { + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:clean-css@3.4.9": { + "map": { + "commander": "npm:commander@2.8.1", + "source-map": "npm:source-map@0.4.4" + } + }, + "npm:cliui@2.1.0": { + "map": { + "center-align": "npm:center-align@0.1.2", + "right-align": "npm:right-align@0.1.3", + "wordwrap": "npm:wordwrap@0.0.2" + } + }, + "npm:combined-stream@0.0.7": { + "map": { + "delayed-stream": "npm:delayed-stream@0.0.5" + } + }, + "npm:combined-stream@1.0.5": { + "map": { + "delayed-stream": "npm:delayed-stream@1.0.0" + } + }, + "npm:commander@2.8.1": { + "map": { + "graceful-readlink": "npm:graceful-readlink@1.0.1" + } + }, + "npm:commander@2.9.0": { + "map": { + "graceful-readlink": "npm:graceful-readlink@1.0.1" + } + }, + "npm:create-ecdh@4.0.0": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "elliptic": "npm:elliptic@6.2.3" + } + }, + "npm:create-hash@1.1.2": { + "map": { + "cipher-base": "npm:cipher-base@1.0.2", + "inherits": "npm:inherits@2.0.1", + "ripemd160": "npm:ripemd160@1.0.1", + "sha.js": "npm:sha.js@2.4.5" + } + }, + "npm:create-hmac@1.1.4": { + "map": { + "create-hash": "npm:create-hash@1.1.2", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:cryptiles@2.0.5": { + "map": { + "boom": "npm:boom@2.10.1" + } + }, + "npm:crypto-browserify@3.11.0": { + "map": { + "browserify-cipher": "npm:browserify-cipher@1.0.0", + "browserify-sign": "npm:browserify-sign@4.0.0", + "create-ecdh": "npm:create-ecdh@4.0.0", + "create-hash": "npm:create-hash@1.1.2", + "create-hmac": "npm:create-hmac@1.1.4", + "diffie-hellman": "npm:diffie-hellman@5.0.2", + "inherits": "npm:inherits@2.0.1", + "pbkdf2": "npm:pbkdf2@3.0.4", + "public-encrypt": "npm:public-encrypt@4.0.0", + "randombytes": "npm:randombytes@2.0.3" + } + }, + "npm:cwise-compiler@0.0.0": { + "map": { + "uniq": "npm:uniq@0.0.2" + } + }, + "npm:cwise-compiler@0.1.0": { + "map": { + "uniq": "npm:uniq@0.0.2" + } + }, + "npm:cwise-parser@0.0.1": { + "map": { + "esprima": "npm:esprima@1.0.4", + "uniq": "npm:uniq@0.0.2" + } + }, + "npm:cwise@0.3.4": { + "map": { + "cwise-compiler": "npm:cwise-compiler@0.0.0", + "cwise-parser": "npm:cwise-parser@0.0.1" + } + }, + "npm:d@0.1.1": { + "map": { + "es5-ext": "npm:es5-ext@0.10.11" + } + }, + "npm:decamelize@1.1.2": { + "map": { + "escape-string-regexp": "npm:escape-string-regexp@1.0.4" + } + }, + "npm:des.js@1.0.0": { + "map": { + "inherits": "npm:inherits@2.0.1", + "minimalistic-assert": "npm:minimalistic-assert@1.0.0" + } + }, + "npm:ecc-jsbn@0.1.1": { + "map": { + "jsbn": "npm:jsbn@0.1.0" + } + }, + "npm:es5-ext@0.10.11": { + "map": { + "es6-iterator": "npm:es6-iterator@2.0.0", + "es6-symbol": "npm:es6-symbol@3.0.2" + } + }, + "npm:es6-iterator@2.0.0": { + "map": { + "d": "npm:d@0.1.1", + "es5-ext": "npm:es5-ext@0.10.11", + "es6-symbol": "npm:es6-symbol@3.0.2" + } + }, + "npm:es6-symbol@3.0.2": { + "map": { + "d": "npm:d@0.1.1", + "es5-ext": "npm:es5-ext@0.10.11" + } + }, + "npm:es6-template-strings@2.0.0": { + "map": { + "es5-ext": "npm:es5-ext@0.10.11", + "esniff": "npm:esniff@1.0.0" + } + }, + "npm:escodegen@0.0.17": { + "map": { + "esprima": "npm:esprima@1.0.4", + "estraverse": "npm:estraverse@0.0.4" + } + }, + "npm:esniff@1.0.0": { + "map": { + "d": "npm:d@0.1.1", + "es5-ext": "npm:es5-ext@0.10.11" + } + }, + "npm:evp_bytestokey@1.0.0": { + "map": { + "create-hash": "npm:create-hash@1.1.2" + } + }, + "npm:expand-tilde@1.2.0": { + "map": { + "user-home": "npm:user-home@1.1.1" + } + }, + "npm:falafel@0.1.6": { + "map": { + "esprima": "npm:esprima@1.0.4" + } + }, + "npm:findup-sync@0.3.0": { + "map": { + "glob": "npm:glob@5.0.15" + } + }, + "npm:form-data@0.2.0": { + "map": { + "async": "npm:async@0.9.2", + "combined-stream": "npm:combined-stream@0.0.7", + "mime-types": "npm:mime-types@2.0.14" + } + }, + "npm:form-data@1.0.0-rc3": { + "map": { + "async": "npm:async@1.5.2", + "combined-stream": "npm:combined-stream@1.0.5", + "mime-types": "npm:mime-types@2.1.9" + } + }, + "npm:fstream@1.0.8": { + "map": { + "graceful-fs": "npm:graceful-fs@4.1.2", + "inherits": "npm:inherits@2.0.1", + "mkdirp": "npm:mkdirp@0.5.1", + "rimraf": "npm:rimraf@2.5.0" + } + }, + "npm:game-shell@0.1.4": { + "map": { + "domready": "npm:domready@0.2.13", + "invert-hash": "npm:invert-hash@0.0.0", + "iota-array": "npm:iota-array@0.0.1", + "lower-bound": "npm:lower-bound@0.0.3", + "uniq": "npm:uniq@0.0.2", + "vkey": "npm:vkey@0.0.3" + } + }, + "npm:generate-object-property@1.2.0": { + "map": { + "is-property": "npm:is-property@1.0.2" + } + }, + "npm:gl-buffer@0.1.2": { + "map": { + "ndarray": "npm:ndarray@1.0.18", + "ndarray-ops": "npm:ndarray-ops@1.1.1", + "typedarray-pool": "npm:typedarray-pool@0.1.2" + } + }, + "npm:gl-now@0.0.4": { + "map": { + "game-shell": "npm:game-shell@0.1.4", + "webglew": "npm:webglew@0.0.0" + } + }, + "npm:gl-shader@0.0.6": { + "map": { + "glsl-exports": "npm:glsl-exports@0.0.0", + "uniq": "npm:uniq@0.0.2" + } + }, + "npm:gl-texture2d@0.1.12": { + "map": { + "bit-twiddle": "npm:bit-twiddle@0.0.2", + "cwise-compiler": "npm:cwise-compiler@0.1.0", + "ndarray": "npm:ndarray@1.0.18", + "ndarray-ops": "npm:ndarray-ops@1.1.1", + "typedarray-pool": "npm:typedarray-pool@1.1.0", + "webglew": "npm:webglew@0.0.0" + } + }, + "npm:gl-tile-map@0.3.0": { + "map": { + "gl-texture2d": "npm:gl-texture2d@0.1.12", + "ndarray": "npm:ndarray@1.0.18", + "tile-mip-map": "npm:tile-mip-map@0.2.1", + "webglew": "npm:webglew@0.0.0" + } + }, + "npm:gl-vao@0.0.3": { + "map": { + "webglew": "npm:webglew@0.0.0" + } + }, + "npm:glob@4.5.3": { + "map": { + "inflight": "npm:inflight@1.0.4", + "inherits": "npm:inherits@2.0.1", + "minimatch": "npm:minimatch@2.0.10", + "once": "npm:once@1.3.3" + } + }, + "npm:glob@5.0.15": { + "map": { + "inflight": "npm:inflight@1.0.4", + "inherits": "npm:inherits@2.0.1", + "minimatch": "npm:minimatch@3.0.0", + "once": "npm:once@1.3.3", + "path-is-absolute": "npm:path-is-absolute@1.0.0" + } + }, + "npm:glsl-exports@0.0.0": { + "map": { + "glsl-parser": "npm:glsl-parser@0.0.9", + "glsl-tokenizer": "npm:glsl-tokenizer@0.0.9", + "through": "npm:through@2.3.8" + } + }, + "npm:glsl-parser@0.0.9": { + "map": { + "glsl-tokenizer": "npm:glsl-tokenizer@0.0.9", + "through": "npm:through@1.1.2" + } + }, + "npm:glsl-tokenizer@0.0.9": { + "map": { + "through": "npm:through@2.3.8" + } + }, + "npm:greedy-mesher@1.0.2": { + "map": { + "iota-array": "npm:iota-array@1.0.0", + "typedarray-pool": "npm:typedarray-pool@1.1.0", + "uniq": "npm:uniq@1.0.1" + } + }, + "npm:har-validator@1.8.0": { + "map": { + "bluebird": "npm:bluebird@2.10.2", + "chalk": "npm:chalk@1.1.1", + "commander": "npm:commander@2.9.0", + "is-my-json-valid": "npm:is-my-json-valid@2.12.3" + } + }, + "npm:har-validator@2.0.3": { + "map": { + "chalk": "npm:chalk@1.1.1", + "commander": "npm:commander@2.9.0", + "is-my-json-valid": "npm:is-my-json-valid@2.12.3", + "pinkie-promise": "npm:pinkie-promise@2.0.0" + } + }, + "npm:has-ansi@2.0.0": { + "map": { + "ansi-regex": "npm:ansi-regex@2.0.0" + } + }, + "npm:hash.js@1.0.3": { + "map": { + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:hawk@2.3.1": { + "map": { + "boom": "npm:boom@2.10.1", + "cryptiles": "npm:cryptiles@2.0.5", + "hoek": "npm:hoek@2.16.3", + "sntp": "npm:sntp@1.0.9" + } + }, + "npm:hawk@3.1.2": { + "map": { + "boom": "npm:boom@2.10.1", + "cryptiles": "npm:cryptiles@2.0.5", + "hoek": "npm:hoek@2.16.3", + "sntp": "npm:sntp@1.0.9" + } + }, + "npm:http-signature@0.10.1": { + "map": { + "asn1": "npm:asn1@0.1.11", + "assert-plus": "npm:assert-plus@0.1.5", + "ctype": "npm:ctype@0.5.3" + } + }, + "npm:http-signature@0.11.0": { + "map": { + "asn1": "npm:asn1@0.1.11", + "assert-plus": "npm:assert-plus@0.1.5", + "ctype": "npm:ctype@0.5.3" + } + }, + "npm:http-signature@1.1.0": { + "map": { + "assert-plus": "npm:assert-plus@0.1.5", + "jsprim": "npm:jsprim@1.2.2", + "sshpk": "npm:sshpk@1.7.3" + } + }, + "npm:inflight@1.0.4": { + "map": { + "once": "npm:once@1.3.3", + "wrappy": "npm:wrappy@1.0.1" + } + }, + "npm:is-absolute@0.1.7": { + "map": { + "is-relative": "npm:is-relative@0.1.3" + } + }, + "npm:is-my-json-valid@2.12.3": { + "map": { + "generate-function": "npm:generate-function@2.0.0", + "generate-object-property": "npm:generate-object-property@1.2.0", + "jsonpointer": "npm:jsonpointer@2.0.0", + "xtend": "npm:xtend@4.0.1" + } + }, + "npm:jodid25519@1.0.2": { + "map": { + "jsbn": "npm:jsbn@0.1.0" + } + }, + "npm:jspm-registry@0.4.0": { + "map": { + "graceful-fs": "npm:graceful-fs@3.0.8", + "rimraf": "npm:rimraf@2.5.0", + "rsvp": "npm:rsvp@3.1.0", + "semver": "npm:semver@4.3.6" + } + }, + "npm:jsprim@1.2.2": { + "map": { + "extsprintf": "npm:extsprintf@1.0.2", + "json-schema": "npm:json-schema@0.2.2", + "verror": "npm:verror@1.3.6" + } + }, + "npm:kind-of@2.0.1": { + "map": { + "is-buffer": "npm:is-buffer@1.1.1" + } + }, + "npm:liftoff@2.2.0": { + "map": { + "extend": "npm:extend@2.0.1", + "findup-sync": "npm:findup-sync@0.3.0", + "flagged-respawn": "npm:flagged-respawn@0.3.1", + "rechoir": "npm:rechoir@0.6.2", + "resolve": "npm:resolve@1.1.6" + } + }, + "npm:miller-rabin@4.0.0": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "brorand": "npm:brorand@1.0.5" + } + }, + "npm:mime-types@2.0.14": { + "map": { + "mime-db": "npm:mime-db@1.12.0" + } + }, + "npm:mime-types@2.1.9": { + "map": { + "mime-db": "npm:mime-db@1.21.0" + } + }, + "npm:minimatch@2.0.10": { + "map": { + "brace-expansion": "npm:brace-expansion@1.1.2" + } + }, + "npm:minimatch@3.0.0": { + "map": { + "brace-expansion": "npm:brace-expansion@1.1.2" + } + }, + "npm:mkdirp@0.5.1": { + "map": { + "minimist": "npm:minimist@0.0.8" + } + }, + "npm:ndarray-downsample2x@0.1.1": { + "map": { + "cwise": "npm:cwise@0.3.4", + "ndarray-fft": "npm:ndarray-fft@0.1.0", + "ndarray-ops": "npm:ndarray-ops@1.1.1", + "ndarray-scratch": "npm:ndarray-scratch@0.0.1" + } + }, + "npm:ndarray-fft@0.1.0": { + "map": { + "bit-twiddle": "npm:bit-twiddle@0.0.2", + "cwise": "npm:cwise@0.3.4", + "ndarray": "npm:ndarray@1.0.18", + "ndarray-ops": "npm:ndarray-ops@1.1.1", + "typedarray-pool": "npm:typedarray-pool@0.1.2" + } + }, + "npm:ndarray-fill@0.1.0": { + "map": { + "cwise": "npm:cwise@0.3.4" + } + }, + "npm:ndarray-ops@1.1.1": { + "map": { + "cwise-compiler": "npm:cwise-compiler@0.0.0" + } + }, + "npm:ndarray-scratch@0.0.1": { + "map": { + "ndarray": "npm:ndarray@1.0.18", + "typedarray-pool": "npm:typedarray-pool@0.1.2" + } + }, + "npm:ndarray@1.0.18": { + "map": { + "iota-array": "npm:iota-array@1.0.0", + "is-buffer": "npm:is-buffer@1.1.1" + } + }, + "npm:node.extend@1.0.8": { + "map": { + "is": "npm:is@0.2.7", + "object-keys": "npm:object-keys@0.4.0" + } + }, + "npm:node.flow@1.2.3": { + "map": { + "node.extend": "npm:node.extend@1.0.8" + } + }, + "npm:once@1.3.3": { + "map": { + "wrappy": "npm:wrappy@1.0.1" + } + }, + "npm:parse-asn1@5.0.0": { + "map": { + "asn1.js": "npm:asn1.js@4.5.1", + "browserify-aes": "npm:browserify-aes@1.0.6", + "create-hash": "npm:create-hash@1.1.2", + "evp_bytestokey": "npm:evp_bytestokey@1.0.0", + "pbkdf2": "npm:pbkdf2@3.0.4" + } + }, + "npm:pbkdf2@3.0.4": { + "map": { + "create-hmac": "npm:create-hmac@1.1.4" + } + }, + "npm:pinkie-promise@2.0.0": { + "map": { + "pinkie": "npm:pinkie@2.0.1" + } + }, + "npm:proper-lockfile@1.1.1": { + "map": { + "err-code": "npm:err-code@1.0.0", + "extend": "npm:extend@3.0.0", + "graceful-fs": "npm:graceful-fs@4.1.2", + "retry": "npm:retry@0.8.0" + } + }, + "npm:public-encrypt@4.0.0": { + "map": { + "bn.js": "npm:bn.js@4.11.0", + "browserify-rsa": "npm:browserify-rsa@4.0.1", + "create-hash": "npm:create-hash@1.1.2", + "parse-asn1": "npm:parse-asn1@5.0.0", + "randombytes": "npm:randombytes@2.0.3" + } + }, + "npm:readable-stream@1.0.33": { + "map": { + "core-util-is": "npm:core-util-is@1.0.2", + "inherits": "npm:inherits@2.0.1", + "isarray": "npm:isarray@0.0.1", + "stream-browserify": "npm:stream-browserify@1.0.0", + "string_decoder": "npm:string_decoder@0.10.31" + } + }, + "npm:readable-stream@2.0.5": { + "map": { + "core-util-is": "npm:core-util-is@1.0.2", + "inherits": "npm:inherits@2.0.1", + "isarray": "npm:isarray@0.0.1", + "process-nextick-args": "npm:process-nextick-args@1.0.6", + "string_decoder": "npm:string_decoder@0.10.31", + "util-deprecate": "npm:util-deprecate@1.0.2" + } + }, + "npm:readdirp@2.0.0": { + "map": { + "graceful-fs": "npm:graceful-fs@4.1.2", + "minimatch": "npm:minimatch@2.0.10", + "readable-stream": "npm:readable-stream@2.0.5" + } + }, + "npm:rechoir@0.6.2": { + "map": { + "resolve": "npm:resolve@1.1.6" + } + }, + "npm:request@2.53.0": { + "map": { + "aws-sign2": "npm:aws-sign2@0.5.0", + "bl": "npm:bl@0.9.4", + "caseless": "npm:caseless@0.9.0", + "combined-stream": "npm:combined-stream@0.0.7", + "forever-agent": "npm:forever-agent@0.5.2", + "form-data": "npm:form-data@0.2.0", + "hawk": "npm:hawk@2.3.1", + "http-signature": "npm:http-signature@0.10.1", + "isstream": "npm:isstream@0.1.2", + "json-stringify-safe": "npm:json-stringify-safe@5.0.1", + "mime-types": "npm:mime-types@2.0.14", + "node-uuid": "npm:node-uuid@1.4.7", + "oauth-sign": "npm:oauth-sign@0.6.0", + "qs": "npm:qs@2.3.3", + "stringstream": "npm:stringstream@0.0.5", + "tough-cookie": "npm:tough-cookie@2.2.1", + "tunnel-agent": "npm:tunnel-agent@0.4.2" + } + }, + "npm:request@2.58.0": { + "map": { + "aws-sign2": "npm:aws-sign2@0.5.0", + "bl": "npm:bl@0.9.4", + "caseless": "npm:caseless@0.10.0", + "combined-stream": "npm:combined-stream@1.0.5", + "extend": "npm:extend@2.0.1", + "forever-agent": "npm:forever-agent@0.6.1", + "form-data": "npm:form-data@1.0.0-rc3", + "har-validator": "npm:har-validator@1.8.0", + "hawk": "npm:hawk@2.3.1", + "http-signature": "npm:http-signature@0.11.0", + "isstream": "npm:isstream@0.1.2", + "json-stringify-safe": "npm:json-stringify-safe@5.0.1", + "mime-types": "npm:mime-types@2.0.14", + "node-uuid": "npm:node-uuid@1.4.7", + "oauth-sign": "npm:oauth-sign@0.8.0", + "qs": "npm:qs@3.1.0", + "stringstream": "npm:stringstream@0.0.5", + "tough-cookie": "npm:tough-cookie@2.2.1", + "tunnel-agent": "npm:tunnel-agent@0.4.2" + } + }, + "npm:request@2.67.0": { + "map": { + "aws-sign2": "npm:aws-sign2@0.6.0", + "bl": "npm:bl@1.0.0", + "caseless": "npm:caseless@0.11.0", + "combined-stream": "npm:combined-stream@1.0.5", + "extend": "npm:extend@3.0.0", + "forever-agent": "npm:forever-agent@0.6.1", + "form-data": "npm:form-data@1.0.0-rc3", + "har-validator": "npm:har-validator@2.0.3", + "hawk": "npm:hawk@3.1.2", + "http-signature": "npm:http-signature@1.1.0", + "is-typedarray": "npm:is-typedarray@1.0.0", + "isstream": "npm:isstream@0.1.2", + "json-stringify-safe": "npm:json-stringify-safe@5.0.1", + "mime-types": "npm:mime-types@2.1.9", + "node-uuid": "npm:node-uuid@1.4.7", + "oauth-sign": "npm:oauth-sign@0.8.0", + "qs": "npm:qs@5.2.0", + "stringstream": "npm:stringstream@0.0.5", + "tough-cookie": "npm:tough-cookie@2.2.1", + "tunnel-agent": "npm:tunnel-agent@0.4.2" + } + }, + "npm:right-align@0.1.3": { + "map": { + "align-text": "npm:align-text@0.1.3" + } + }, + "npm:rimraf@2.3.4": { + "map": { + "glob": "npm:glob@4.5.3" + } + }, + "npm:rimraf@2.5.0": { + "map": { + "glob": "npm:glob@6.0.4" + } + }, + "npm:rmdir@1.1.0": { + "map": { + "node.flow": "npm:node.flow@1.2.3" + } + }, + "npm:sntp@1.0.9": { + "map": { + "hoek": "npm:hoek@2.16.3" + } + }, + "npm:source-map-support@0.2.10": { + "map": { + "source-map": "npm:source-map@0.1.32" + } + }, + "npm:source-map-support@0.3.3": { + "map": { + "source-map": "npm:source-map@0.1.32" + } + }, + "npm:source-map@0.1.32": { + "map": { + "amdefine": "npm:amdefine@1.0.0" + } + }, + "npm:source-map@0.4.4": { + "map": { + "amdefine": "npm:amdefine@1.0.0" + } + }, + "npm:stream-browserify@2.0.1": { + "map": { + "inherits": "npm:inherits@2.0.1", + "readable-stream": "npm:readable-stream@2.0.5" + } + }, + "npm:strip-ansi@3.0.0": { + "map": { + "ansi-regex": "npm:ansi-regex@2.0.0" + } + }, + "npm:systemjs@0.19.29": { + "map": { + "when": "npm:when@3.7.7" + } + }, + "npm:tar@1.0.3": { + "map": { + "block-stream": "npm:block-stream@0.0.8", + "fstream": "npm:fstream@1.0.8", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:tar@2.2.1": { + "map": { + "block-stream": "npm:block-stream@0.0.8", + "fstream": "npm:fstream@1.0.8", + "inherits": "npm:inherits@2.0.1" + } + }, + "npm:through@1.1.2": { + "map": {} + }, + "npm:through@2.2.7": { + "map": {} + }, + "npm:tile-mip-map@0.2.1": { + "map": { + "ndarray": "npm:ndarray@1.0.18", + "ndarray-downsample2x": "npm:ndarray-downsample2x@0.1.1", + "ndarray-ops": "npm:ndarray-ops@1.1.1" + } + }, + "npm:traceur@0.0.105": { + "map": { + "commander": "npm:commander@2.9.0", + "glob": "npm:glob@5.0.15", + "rsvp": "npm:rsvp@3.1.0", + "semver": "npm:semver@4.3.6", + "source-map-support": "npm:source-map-support@0.2.10" + } + }, + "npm:typedarray-pool@0.1.2": { + "map": { + "bit-twiddle": "npm:bit-twiddle@0.0.2", + "dup": "npm:dup@0.0.0" + } + }, + "npm:typedarray-pool@1.1.0": { + "map": { + "bit-twiddle": "npm:bit-twiddle@1.0.2", + "dup": "npm:dup@1.0.0" + } + }, + "npm:uglify-js@2.6.1": { + "map": { + "async": "npm:async@0.2.10", + "source-map": "npm:source-map@0.5.3", + "uglify-to-browserify": "npm:uglify-to-browserify@1.0.2", + "yargs": "npm:yargs@3.10.0" + } + }, + "npm:url@0.11.0": { + "map": { + "punycode": "npm:punycode@1.3.2", + "querystring": "npm:querystring@0.2.0" + } + }, + "npm:verror@1.3.6": { + "map": { + "extsprintf": "npm:extsprintf@1.0.2" + } + }, + "npm:voxel-demo@0.0.1": { + "map": { + "ao-mesher": "npm:ao-mesher@0.2.10", + "ao-shader": "npm:ao-shader@0.2.3", + "gl-buffer": "npm:gl-buffer@0.1.2", + "gl-matrix": "npm:gl-matrix@2.0.0", + "gl-now": "npm:gl-now@0.0.4", + "gl-shader": "npm:gl-shader@0.0.6", + "gl-tile-map": "npm:gl-tile-map@0.3.0", + "gl-vao": "npm:gl-vao@0.0.3", + "ndarray": "npm:ndarray@1.0.18", + "ndarray-fill": "npm:ndarray-fill@0.1.0", + "ndarray-ops": "npm:ndarray-ops@1.1.1" + } + }, + "npm:walker@1.0.7": { + "map": { + "makeerror": "npm:makeerror@1.0.11" + } + }, + "npm:which@1.2.1": { + "map": { + "is-absolute": "npm:is-absolute@0.1.7" + } + }, + "npm:yargs@3.10.0": { + "map": { + "camelcase": "npm:camelcase@1.2.1", + "cliui": "npm:cliui@2.1.0", + "decamelize": "npm:decamelize@1.1.2", + "window-size": "npm:window-size@0.1.0" + } + }, + "github:jspm/nodelibs-domain@0.2.0-alpha": { + "map": { + "domain-browserify": "npm:domain-browser@1.1.7" + } + }, + "github:jspm/nodelibs-timers@0.2.0-alpha": { + "map": { + "timers-browserify": "npm:timers-browserify@1.4.2" + } + }, + "npm:timers-browserify@1.4.2": { + "map": { + "process": "npm:process@0.11.3" + } + }, + "npm:systemjs-builder@0.15.18": { + "map": { + "babel-plugin-transform-es2015-modules-systemjs": "npm:babel-plugin-transform-es2015-modules-systemjs@6.6.5", + "bluebird": "npm:bluebird@3.3.5", + "es6-template-strings": "npm:es6-template-strings@2.0.0", + "glob": "npm:glob@7.0.3", + "mkdirp": "npm:mkdirp@0.5.1", + "rollup": "npm:rollup@0.25.8", + "source-map": "npm:source-map@0.5.3", + "systemjs": "npm:systemjs@0.19.29", + "traceur": "npm:traceur@0.0.105", + "uglify-js": "npm:uglify-js@2.6.1", + "data-uri-to-buffer": "npm:data-uri-to-buffer@0.0.4", + "babel-core": "npm:babel-core@6.9.0" + } + }, + "npm:babel-core@6.9.0": { + "map": { + "babylon": "npm:babylon@6.7.0", + "convert-source-map": "npm:convert-source-map@1.2.0", + "debug": "npm:debug@2.2.0", + "json5": "npm:json5@0.4.0", + "minimatch": "npm:minimatch@2.0.10", + "path-exists": "npm:path-exists@1.0.0", + "path-is-absolute": "npm:path-is-absolute@1.0.0", + "private": "npm:private@0.1.6", + "shebang-regex": "npm:shebang-regex@1.0.0", + "slash": "npm:slash@1.0.0", + "source-map": "npm:source-map@0.5.3", + "babel-code-frame": "npm:babel-code-frame@6.8.0", + "babel-messages": "npm:babel-messages@6.8.0", + "babel-generator": "npm:babel-generator@6.9.0", + "babel-runtime": "npm:babel-runtime@6.9.0", + "babel-traverse": "npm:babel-traverse@6.9.0", + "babel-types": "npm:babel-types@6.9.0", + "babel-register": "npm:babel-register@6.9.0", + "babel-template": "npm:babel-template@6.9.0", + "lodash": "npm:lodash@4.13.1", + "babel-helpers": "npm:babel-helpers@6.8.0" + } + }, + "npm:jspm-npm@0.28.12": { + "map": { + "bluebird": "npm:bluebird@3.3.5", + "mkdirp": "npm:mkdirp@0.5.1", + "readdirp": "npm:readdirp@2.0.0", + "request": "npm:request@2.58.0", + "rmdir": "npm:rmdir@1.1.0", + "semver": "npm:semver@5.1.0", + "systemjs-builder": "npm:systemjs-builder@0.15.18", + "tar": "npm:tar@1.0.3", + "traceur": "npm:traceur@0.0.105", + "which": "npm:which@1.2.1", + "graceful-fs": "npm:graceful-fs@4.1.4" + } + }, + "npm:babel-runtime@6.9.0": { + "map": { + "core-js": "npm:core-js@2.4.0" + } + }, + "npm:babel-register@6.9.0": { + "map": { + "core-js": "npm:core-js@2.4.0", + "babel-core": "npm:babel-core@6.9.0", + "babel-runtime": "npm:babel-runtime@6.9.0", + "home-or-tmp": "npm:home-or-tmp@1.0.0", + "lodash": "npm:lodash@4.13.1", + "mkdirp": "npm:mkdirp@0.5.1", + "path-exists": "npm:path-exists@1.0.0", + "source-map-support": "npm:source-map-support@0.2.10" + } + }, + "npm:babel-code-frame@6.8.0": { + "map": { + "babel-runtime": "npm:babel-runtime@6.9.0", + "chalk": "npm:chalk@1.1.1", + "esutils": "npm:esutils@2.0.2", + "js-tokens": "npm:js-tokens@1.0.3" + } + }, + "npm:babel-generator@6.9.0": { + "map": { + "babel-messages": "npm:babel-messages@6.8.0", + "babel-runtime": "npm:babel-runtime@6.9.0", + "babel-types": "npm:babel-types@6.9.0", + "detect-indent": "npm:detect-indent@3.0.1", + "lodash": "npm:lodash@4.13.1", + "source-map": "npm:source-map@0.5.3" + } + }, + "npm:babel-traverse@6.9.0": { + "map": { + "babel-code-frame": "npm:babel-code-frame@6.8.0", + "babel-messages": "npm:babel-messages@6.8.0", + "babel-runtime": "npm:babel-runtime@6.9.0", + "babel-types": "npm:babel-types@6.9.0", + "babylon": "npm:babylon@6.7.0", + "debug": "npm:debug@2.2.0", + "globals": "npm:globals@8.18.0", + "invariant": "npm:invariant@2.2.1", + "lodash": "npm:lodash@4.13.1" + } + }, + "npm:babel-messages@6.8.0": { + "map": { + "babel-runtime": "npm:babel-runtime@6.9.0" + } + }, + "npm:babel-template@6.9.0": { + "map": { + "babylon": "npm:babylon@6.7.0", + "babel-traverse": "npm:babel-traverse@6.9.0", + "babel-types": "npm:babel-types@6.9.0", + "babel-runtime": "npm:babel-runtime@6.9.0", + "lodash": "npm:lodash@4.13.1" + } + }, + "npm:babel-types@6.9.0": { + "map": { + "babel-runtime": "npm:babel-runtime@6.9.0", + "babel-traverse": "npm:babel-traverse@6.9.0", + "esutils": "npm:esutils@2.0.2", + "lodash": "npm:lodash@4.13.1", + "to-fast-properties": "npm:to-fast-properties@1.0.2" + } + }, + "npm:jspm-github@0.14.7": { + "map": { + "expand-tilde": "npm:expand-tilde@1.2.0", + "bluebird": "npm:bluebird@3.3.5", + "mkdirp": "npm:mkdirp@0.5.1", + "netrc": "npm:netrc@0.1.4", + "request": "npm:request@2.53.0", + "rimraf": "npm:rimraf@2.3.4", + "semver": "npm:semver@5.1.0", + "tar": "npm:tar@2.2.1", + "which": "npm:which@1.2.1", + "graceful-fs": "npm:graceful-fs@4.1.4" + } + }, + "npm:babel-helpers@6.8.0": { + "map": { + "babel-runtime": "npm:babel-runtime@6.9.0", + "babel-template": "npm:babel-template@6.9.0" + } + } + } +});
\ No newline at end of file diff --git a/bench/config-example/normalize-data.js b/bench/config-example/normalize-data.js new file mode 100644 index 000000000..eef3db3e7 --- /dev/null +++ b/bench/config-example/normalize-data.js @@ -0,0 +1,69 @@ +module.exports = [ +["npm:mocha@1.21.5/mocha.js", ["./mocha.css!"]], +['tests/angular.js', ['angular']], +['tests/jquery.js', ["jquery"]], +['tests/bootstrap.js', ['bootstrap', 'bootstrap/dist/css/bootstrap.css!', './bootstrap.html!text']], +['tests/jquery.js', ['jquery']], +['tests/d3.js', ['d3']], +['tests/tests.js', ['./angular.js', './bootstrap.js', './jquery.js', './d3.js', './voxel-demo.js']], +['tests/main.js', ['mocha', './tests/tests.js']], +['github:jspm/nodelibs-util@0.2.0-alpha/util.js', ["process", "./isBuffer.js"]], +['npm:game-shell@0.1.4/shell.js', ["events", "util", "domready", "vkey", "invert-hash", "uniq", "lower-bound", "iota-array", "./lib/raf-polyfill.js", "./lib/mousewheel-polyfill.js", "./lib/hrtime-polyfill.js"]], +['npm:gl-now@0.0.4/index.js', ["game-shell", "webglew"]], +["npm:ndarray-fft@0.1.0/lib/fft-matrix.js", ["bit-twiddle"]], +['npm:ndarray-fft@0.1.0/fft.js', ["ndarray-ops", "cwise", "ndarray", "./lib/fft-matrix.js", "typedarray-pool"]], +['npm:ndarray-scratch@0.0.1/scratch.js', ["ndarray", "typedarray-pool"]], +['npm:ndarray-downsample2x@0.1.1/downsample.js', ["ndarray-fft", "ndarray-scratch", "ndarray-ops", "cwise", "process"]], +['npm:tile-mip-map@0.2.1/mipmap.js', ["ndarray", "ndarray-ops", "ndarray-downsample2x"]], +['npm:gl-texture2d@0.1.12/texture.js', ["ndarray", "ndarray-ops", "typedarray-pool", "webglew"]], +['npm:gl-tile-map@0.3.0/tilemap.js', ["ndarray", "tile-mip-map", "gl-texture2d"]], +['npm:gl-buffer@0.1.2/buffer.js', ["typedarray-pool", "ndarray-ops", "ndarray"]], +['npm:gl-vao@0.0.3/lib/vao-native.js', ["./do-bind.js"]], +['npm:gl-vao@0.0.3/lib/vao-emulated.js', ["./do-bind.js"]], +['npm:gl-vao@0.0.3/vao.js', ["webglew", "./lib/vao-native.js", "./lib/vao-emulated.js"]], +['npm:esprima@1.0.4/esprima.js', ["process"]], +['npm:cwise-parser@0.0.1/index.js', ["esprima", "uniq"]], +["npm:cwise@0.3.4/cwise.js", ["cwise-parser", "cwise-compiler"]], +['npm:ndarray-fill@0.1.0/index.js', ["cwise"]], +["npm:cwise-compiler@0.0.0/lib/compile.js", ["uniq"]], +["npm:cwise-compiler@0.0.0/lib/thunk.js", ["./compile.js"]], +['npm:cwise-compiler@0.0.0/compiler.js', ["./lib/thunk.js"]], +["npm:ndarray-ops@1.1.1/ndarray-ops.js", ["cwise-compiler"]], +["npm:ndarray@1.0.18/ndarray.js", ["iota-array", "is-buffer"]], +["npm:cwise-compiler@0.1.0/lib/compile.js", ["uniq"]], +["npm:cwise-compiler@0.1.0/lib/thunk.js", ["./compile.js"]], +["npm:cwise-compiler@0.1.0/compiler.js", ["./lib/thunk.js"]], +["npm:typedarray-pool@1.1.0/pool.js", ["bit-twiddle", "dup", "buffer/global"]], +["npm:greedy-mesher@1.0.2/greedy.js", ["typedarray-pool", "uniq", "iota-array"]], +["npm:typedarray-pool@0.1.2/pool.js", ["bit-twiddle", "dup"]], +["npm:ao-mesher@0.2.10/mesh.js", ["ndarray", "cwise-compiler", "greedy-mesher", "typedarray-pool"]], +["npm:glsl-tokenizer@0.0.9/lib/literals.js", ["process"]], +["npm:glsl-tokenizer@0.0.9/lib/operators.js", ["process"]], +["npm:glsl-tokenizer@0.0.9/lib/builtins.js", ["process"]], +["npm:glsl-tokenizer@0.0.9/index.js", ["through", "./lib/literals", "./lib/operators", "./lib/builtins", "process"]], +["npm:through@1.1.2/index.js", ["stream", "process"]], +["npm:glsl-parser@0.0.9/lib/index.js", ["through", "./expr", "./scope"]], +["npm:glsl-parser@0.0.9/index.js", ["./lib/index"]], +["npm:readable-stream@2.0.5/readable.js", ["./lib/_stream_readable.js", "./lib/_stream_writable.js", "./lib/_stream_duplex.js", "./lib/_stream_transform.js", "./lib/_stream_passthrough.js", "process"]], +["npm:readable-stream@2.0.5/writable.js", ["./lib/_stream_writable.js", "process"]], +["npm:readable-stream@2.0.5/duplex.js", ["./lib/_stream_duplex.js", "process"]], +["npm:readable-stream@2.0.5/transform.js", ["./lib/_stream_transform.js", "process"]], +["npm:string_decoder@0.10.31/index.js", ["buffer", "buffer/global"]], +["npm:readable-stream@2.0.5/lib/_stream_readable.js", ["process-nextick-args", "isarray", "buffer", "events", "core-util-is", "inherits", "util", "./_stream_duplex", "string_decoder", "process", "buffer/global"]], +["npm:process-nextick-args@1.0.6/index.js", ["process"]], +["npm:readable-stream@2.0.5/lib/_stream_writable.js", ["process-nextick-args", "buffer", "core-util-is", "inherits", "util-deprecate", "events", "./_stream_duplex", "process", "buffer/global"]], +["npm:readable-stream@2.0.5/lib/_stream_duplex.js", ["process-nextick-args", "core-util-is", "inherits", "./_stream_readable", "./_stream_writable", "process"]], +["npm:readable-stream@2.0.5/lib/_stream_transform.js", ["./_stream_duplex", "core-util-is", "inherits", "process"]], +["npm:buffer@4.5.0/index.js", ["base64-js", "ieee754", "isarray", "process"]], +["github:jspm/nodelibs-buffer@0.2.0-alpha/global.js", ["./buffer.js"]], +["npm:core-util-is@1.0.2/lib/util.js", ["buffer/global"]], +["npm:readable-stream@2.0.5/lib/_stream_passthrough.js", ["./_stream_transform", "core-util-is", "inherits", "process"]], +["npm:readable-stream@2.0.5/passthrough.js", ["./lib/_stream_passthrough.js", "process"]], +["npm:stream-browserify@2.0.1/index.js", ["events", "inherits", "readable-stream/readable.js", "readable-stream/writable.js", "readable-stream/duplex.js", "readable-stream/transform.js", "readable-stream/passthrough.js"]], +["github:jspm/nodelibs-process@0.2.0-alpha/process.js", ["@system-env"]], +["npm:through@2.3.8/index.js", ["stream", "process"]], +["npm:glsl-exports@0.0.0/index.js", ["glsl-tokenizer", "glsl-parser", "through"]], +["npm:gl-shader@0.0.6/index.js", ["glsl-exports", "uniq"]], +["npm:ao-shader@0.2.3/aoshader.js", ["fs", "gl-shader"]], +["npm:voxel-demo@0.0.1/shader.js", ["gl-now", "gl-tile-map", "gl-buffer", "gl-vao", "gl-matrix", "ndarray", "ndarray-fill", "ndarray-ops", "ao-mesher", "ao-shader"]] +];
\ No newline at end of file diff --git a/bench/config-example/pkg-configs.js b/bench/config-example/pkg-configs.js new file mode 100644 index 000000000..7bbe38627 --- /dev/null +++ b/bench/config-example/pkg-configs.js @@ -0,0 +1,972 @@ +System.registerDynamic("npm:mocha@1.21.5.json", [], false, function() { + return { + "main": "mocha", + "meta": { + "mocha.js": { + "deps": [ + "./mocha.css!" + ], + "exports": "mocha" + } + } + }; +}); + +System.registerDynamic("github:angular/bower-angular@1.4.8.json", [], false, function() { + return { + "main": "angular", + "meta": { + "angular.js": { + "exports": "angular" + } + } + }; +}); + +System.registerDynamic("github:systemjs/plugin-css@0.1.20.json", [], false, function() { + return { + "main": "css" + }; +}); + +System.registerDynamic("github:twbs/bootstrap@3.3.6.json", [], false, function() { + return { + "main": "dist/js/bootstrap.js", + "meta": { + "dist/js/bootstrap.js": { + "deps": [ + "jquery" + ], + "exports": "$" + } + } + }; +}); + +System.registerDynamic("github:systemjs/plugin-text@0.0.2.json", [], false, function() { + return { + "main": "text" + }; +}); + +System.registerDynamic("github:components/jquery@2.1.4.json", [], false, function() { + return { + "main": "jquery" + }; +}); + +System.registerDynamic("github:mbostock/d3@3.5.12.json", [], false, function() { + return { + "main": "d3", + "meta": { + "d3.js": { + "exports": "d3", + "format": "global" + } + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-util@0.2.0-alpha.json", [], false, function() { + return { + "main": "./util.js", + "map": { + "./isBuffer.js": { + "~node": "./isBufferBrowser.js" + } + } + }; +}); + +System.registerDynamic("npm:domready@0.2.13.json", [], false, function() { + return { + "main": "ready.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + }, + "map": { + "domready": "." + } + }; +}); + +System.registerDynamic("npm:vkey@0.0.3.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:invert-hash@0.0.0.json", [], false, function() { + return { + "main": "invert.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:lower-bound@0.0.3.json", [], false, function() { + return { + "main": "lb.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:iota-array@0.0.1.json", [], false, function() { + return { + "main": "iota.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:game-shell@0.1.4.json", [], false, function() { + return { + "main": "shell.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-now@0.0.4.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ndarray-fft@0.1.0.json", [], false, function() { + return { + "main": "fft.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ndarray-scratch@0.0.1.json", [], false, function() { + return { + "main": "scratch.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ndarray-downsample2x@0.1.1.json", [], false, function() { + return { + "main": "downsample.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:tile-mip-map@0.2.1.json", [], false, function() { + return { + "main": "mipmap.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-texture2d@0.1.12.json", [], false, function() { + return { + "main": "texture.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-tile-map@0.3.0.json", [], false, function() { + return { + "main": "tilemap.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-buffer@0.1.2.json", [], false, function() { + return { + "main": "buffer.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:webglew@0.0.0.json", [], false, function() { + return { + "main": "webglew.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-vao@0.0.3.json", [], false, function() { + return { + "main": "vao.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-matrix@2.0.0.json", [], false, function() { + return { + "main": "dist/gl-matrix.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "dist/gl-matrix-min.js": { + "format": "amd" + }, + "src/gl-matrix.js.erb": { + "format": "amd" + } + } + }; +}); + +System.registerDynamic("npm:esprima@1.0.4.json", [], false, function() { + return { + "main": "esprima.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:cwise-parser@0.0.1.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:cwise@0.3.4.json", [], false, function() { + return { + "main": "cwise.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ndarray-fill@0.1.0.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:cwise-compiler@0.0.0.json", [], false, function() { + return { + "main": "compiler.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ndarray-ops@1.1.1.json", [], false, function() { + return { + "main": "ndarray-ops.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:is-buffer@1.1.1.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "test/*": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("npm:ndarray@1.0.18.json", [], false, function() { + return { + "main": "ndarray.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:cwise-compiler@0.1.0.json", [], false, function() { + return { + "main": "compiler.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:bit-twiddle@1.0.2.json", [], false, function() { + return { + "main": "twiddle.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:dup@1.0.0.json", [], false, function() { + return { + "main": "dup.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:typedarray-pool@1.1.0.json", [], false, function() { + return { + "main": "pool.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "pool.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/*": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("npm:uniq@1.0.1.json", [], false, function() { + return { + "main": "uniq.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:iota-array@1.0.0.json", [], false, function() { + return { + "main": "iota.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:greedy-mesher@1.0.2.json", [], false, function() { + return { + "main": "greedy.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:bit-twiddle@0.0.2.json", [], false, function() { + return { + "main": "twiddle.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:dup@0.0.0.json", [], false, function() { + return { + "main": "dup.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:typedarray-pool@0.1.2.json", [], false, function() { + return { + "main": "pool.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ao-mesher@0.2.10.json", [], false, function() { + return { + "main": "mesh.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-fs@0.2.0-alpha.json", [], false, function() { + return { + "main": "./fs.js" + }; +}); + +System.registerDynamic("npm:glsl-tokenizer@0.0.9.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:through@1.1.2.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + }, + "map": { + "./test.js": "./test/index.js" + } + }; +}); + +System.registerDynamic("npm:glsl-parser@0.0.9.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + }, + "map": { + "./lib.js": "./lib/index.js", + "./test.js": "./test/index.js" + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-stream@0.2.0-alpha.json", [], false, function() { + return { + "main": "./stream.js", + "map": { + "./stream.js": { + "browser": "stream-browserify" + } + } + }; +}); + +System.registerDynamic("npm:isarray@0.0.1.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:string_decoder@0.10.31.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "index.js": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("npm:process-nextick-args@1.0.6.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:util-deprecate@1.0.2.json", [], false, function() { + return { + "main": "node.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + }, + "map": { + "./node.js": { + "browser": "./browser.js" + } + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-events@0.2.0-alpha.json", [], false, function() { + return { + "main": "./events.js" + }; +}); + +System.registerDynamic("npm:base64-js@1.1.1.json", [], false, function() { + return { + "main": "lib/b64.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ieee754@1.1.6.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "test/*": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("npm:isarray@1.0.0.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:buffer@4.5.0.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + }, + "test/constructor.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node-es6/test-buffer-arraybuffer.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node-es6/test-buffer-iterator.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer-ascii.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer-bytelength.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer-concat.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer-indexof.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer-inspect.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test/node/test-buffer.js": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-buffer@0.2.0-alpha.json", [], false, function() { + return { + "main": "buffer.js", + "map": { + "./buffer.js": { + "browser": "buffer-browserify" + } + } + }; +}); + +System.registerDynamic("npm:core-util-is@1.0.2.json", [], false, function() { + return { + "main": "lib/util.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "lib/*": { + "globals": { + "Buffer": "buffer/global" + } + }, + "test.js": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("npm:inherits@2.0.1.json", [], false, function() { + return { + "main": "inherits.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + }, + "map": { + "./inherits.js": { + "browser": "./inherits_browser.js" + } + } + }; +}); + +System.registerDynamic("npm:readable-stream@2.0.5.json", [], false, function() { + return { + "main": "readable.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + }, + "lib/_stream_readable.js": { + "globals": { + "Buffer": "buffer/global" + } + }, + "lib/_stream_writable.js": { + "globals": { + "Buffer": "buffer/global" + } + } + }, + "map": { + "util": { + "browser": "@empty" + } + } + }; +}); + +System.registerDynamic("npm:stream-browserify@2.0.1.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + }, + "test/*": { + "globals": { + "Buffer": "buffer/global" + } + } + } + }; +}); + +System.registerDynamic("github:jspm/nodelibs-process@0.2.0-alpha.json", [], false, function() { + return { + "main": "./process.js" + }; +}); + +System.registerDynamic("npm:through@2.3.8.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*": { + "globals": { + "process": "process" + } + }, + "*.json": { + "format": "json" + } + }, + "map": { + "./test.js": "./test/index.js" + } + }; +}); + +System.registerDynamic("npm:glsl-exports@0.0.0.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:uniq@0.0.2.json", [], false, function() { + return { + "main": "uniq.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:gl-shader@0.0.6.json", [], false, function() { + return { + "main": "index.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:ao-shader@0.2.3.json", [], false, function() { + return { + "main": "aoshader.js", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +}); + +System.registerDynamic("npm:voxel-demo@0.0.1.json", [], false, function() { + return { + "main": "shader", + "format": "cjs", + "meta": { + "*.json": { + "format": "json" + } + } + }; +});
\ No newline at end of file diff --git a/bench/get-cjs-deps.js b/bench/get-cjs-deps.js new file mode 100644 index 000000000..b999a1c16 --- /dev/null +++ b/bench/get-cjs-deps.js @@ -0,0 +1,63 @@ +var fs = require('fs'); + +// require('...') || exports[''] = ... || exports.asd = ... || module.exports = ... +var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])(exports\s*(\[['"]|\.)|module(\.exports|\['exports'\]|\["exports"\])\s*(\[['"]|[=,\.]))/; +// RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339 +var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g; +var commentRegEx = /(^|[^\\])(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg; + +var stringRegEx = /("[^"\\\n\r]*(\\.[^"\\\n\r]*)*"|'[^'\\\n\r]*(\\.[^'\\\n\r]*)*')/g; +function getCJSDeps(source) { + cjsRequireRegEx.lastIndex = commentRegEx.lastIndex = stringRegEx.lastIndex = 0; + + var deps = []; + + var match; + + // track string and comment locations for unminified source + var stringLocations = [], commentLocations = []; + + function inLocation(locations, match) { + for (var i = 0; i < locations.length; i++) + if (locations[i][0] < match.index && locations[i][1] > match.index) + return true; + return false; + } + + if (source.length / source.split('\n').length < 200) { + while (match = stringRegEx.exec(source)) + stringLocations.push([match.index, match.index + match[0].length]); + + // TODO: track template literals here before comments + + while (match = commentRegEx.exec(source)) { + // only track comments not starting in strings + if (!inLocation(stringLocations, match)) + commentLocations.push([match.index + match[1].length, match.index + match[0].length - 1]); + } + } + + while (match = cjsRequireRegEx.exec(source)) { + // ensure we're not within a string or comment location + if (!inLocation(stringLocations, match) && !inLocation(commentLocations, match)) { + var dep = match[1].substr(1, match[1].length - 2); + // skip cases like require('" + file + "') + if (dep.match(/"|'/)) + continue; + // trailing slash requires are removed as they don't map mains in SystemJS + if (dep[dep.length - 1] == '/') + dep = dep.substr(0, dep.length - 1); + deps.push(dep); + } + } + + return deps; +} + +var cjs = fs.readFileSync('./cjs-sample/cjs.js').toString(); + +var startTime = Date.now(); +for (var i = 0; i < 1000; i++) + getCJSDeps(cjs); +console.log(Date.now() - startTime); + diff --git a/bench/normalize-perf.js b/bench/normalize-perf.js new file mode 100644 index 000000000..6749382a2 --- /dev/null +++ b/bench/normalize-perf.js @@ -0,0 +1,67 @@ +var systemjs = require('../index.js'); + +var num = 5; + +var startTime, endTime; + +startTime = Date.now(); +require('./config-example/config.js'); +endTime = Date.now(); +console.log('Configured in ' + (endTime - startTime) + 'ms'); + +require('./config-example/pkg-configs.js'); + +var normalizeData = require('./config-example/normalize-data.js'); + +// decanonicalize the parentNames (we're not measuring decanonicalize) +var normalizationCnt = 0; +normalizeData.forEach(function(item) { + normalizationCnt += item[1].length; + item[0] = System.decanonicalize(item[0]); +}); + +// simulated System.register normalization test +// timed normalize of 'x', ['./dep'] cases +function test() { + return Promise.all(normalizeData.map(function(item) { + var parentName = item[0]; + var deps = item[1]; + return Promise.all(deps.map(function(dep) { + return System.normalize(dep, parentName); + })); + })); +} + +return Promise.resolve() +.then(function() { + starTime = Date.now(); + return test() + .then(function() { + endTime = Date.now(); + console.log(normalizationCnt + ' first run normalizations in ' + (endTime - startTime) + 'ms'); + console.log((endTime - startTime) / normalizationCnt + 'ms per normalization'); + }); +}) +.then(function() { + startTime = Date.now(); + var testPromise = Promise.resolve(); + for (var i = 0; i < num; i++) + testPromise = testPromise.then(test); + return testPromise + .then(function() { + endTime = Date.now(); + + var time = (endTime - startTime) / num; + + console.log(normalizationCnt + ' subsequent normalizations in ' + time + 'ms'); + console.log(time / normalizationCnt + 'ms per normalization'); + + /* System.perfSummary(function(evt) { + return evt.name.match(/^normalize\:/); + }); */ + }) + .catch(function(e) { + console.error(e.stack || e); + }); + +});
\ No newline at end of file |