aboutsummaryrefslogtreecommitdiff
path: root/bench
diff options
context:
space:
mode:
Diffstat (limited to 'bench')
-rw-r--r--bench/cjs-sample/cjs.js949
-rw-r--r--bench/config-example/config.js1474
-rw-r--r--bench/config-example/normalize-data.js69
-rw-r--r--bench/config-example/pkg-configs.js972
-rw-r--r--bench/get-cjs-deps.js63
-rw-r--r--bench/normalize-perf.js67
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