diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -836,1325 +836,1325 @@ ), 'requires' => array( '00861799' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-util', - 4 => 'javelin-vector', - 5 => 'differential-inline-comment-editor', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-util', + 'javelin-vector', + 'differential-inline-comment-editor', ), '029a133d' => array( - 0 => 'aphront-dialog-view-css', + 'aphront-dialog-view-css', ), '03d6ed07' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-install', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + 'javelin-install', ), '065227cc' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', ), '06e05112' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-vector', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', ), '0720f2cf' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-mask', - 4 => 'javelin-util', - 5 => 'phabricator-busy', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-mask', + 'javelin-util', + 'phabricator-busy', ), '09eee344' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', ), '0a3f3021' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'javelin-router', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'javelin-router', ), '0c33c1a0' => array( - 0 => 'javelin-view', - 1 => 'javelin-install', - 2 => 'javelin-dom', + 'javelin-view', + 'javelin-install', + 'javelin-dom', ), '0c6946e7' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', - 4 => 'phabricator-notification-css', + 'javelin-install', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + 'phabricator-notification-css', ), '0ec56e1d' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'phuix-dropdown-menu', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phuix-dropdown-menu', ), '0f764c35' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '0f81f8df' => array( - 0 => 'javelin-util', - 1 => 'javelin-uri', - 2 => 'javelin-install', + 'javelin-util', + 'javelin-uri', + 'javelin-install', ), '127f2018' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-request', - 4 => 'javelin-util', - 5 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-request', + 'javelin-util', + 'phabricator-shaped-request', ), '14a827de' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-json', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-json', + 'phabricator-draggable-list', ), '14d7a8b8' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-magical-init', - 5 => 'javelin-vector', - 6 => 'javelin-request', - 7 => 'javelin-util', + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-magical-init', + 'javelin-vector', + 'javelin-request', + 'javelin-util', ), '152178f0' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-vector', - 5 => 'javelin-magical-init', - 6 => 'javelin-request', - 7 => 'javelin-history', - 8 => 'javelin-workflow', - 9 => 'javelin-mask', - 10 => 'javelin-behavior-device', - 11 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-util', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + 'javelin-magical-init', + 'javelin-request', + 'javelin-history', + 'javelin-workflow', + 'javelin-mask', + 'javelin-behavior-device', + 'phabricator-keyboard-shortcut', ), '1693a296' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', + 'javelin-behavior', + 'javelin-dom', + 'phortune-credit-card-form', ), '1ae869f2' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'phabricator-keyboard-shortcut-manager', + 'javelin-install', + 'javelin-util', + 'phabricator-keyboard-shortcut-manager', ), '1d8ad5c3' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - 5 => 'phabricator-file-upload', + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-dom', + 'javelin-uri', + 'phabricator-file-upload', ), '1def2711' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), '1ffb3a9c' => array( - 0 => 'javelin-util', - 1 => 'javelin-magical-init', + 'javelin-util', + 'javelin-magical-init', ), '2290aeef' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-json', - 3 => 'javelin-workflow', - 4 => 'javelin-util', + 'javelin-install', + 'javelin-dom', + 'javelin-json', + 'javelin-workflow', + 'javelin-util', ), '22e16ae7' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-vector', + 'javelin-behavior', + 'javelin-dom', + 'javelin-vector', ), '23cbb8ac' => array( - 0 => 'javelin-install', - 1 => 'javelin-event', + 'javelin-install', + 'javelin-event', ), '2926fff2' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', + 'javelin-behavior', + 'javelin-dom', ), '29274e2b' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '2b228192' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-workflow', - 4 => 'javelin-json', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-json', ), '2cad29d1' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', - 4 => 'javelin-vector', - 5 => 'javelin-magical-init', + 'javelin-install', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + 'javelin-vector', + 'javelin-magical-init', ), '2fa810fc' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-view-renderer', - 3 => 'javelin-install', + 'javelin-behavior', + 'javelin-dom', + 'javelin-view-renderer', + 'javelin-install', ), '316b8fa1' => array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead-source', + 'javelin-install', + 'javelin-typeahead-source', ), '357b6e9b' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-util', - 3 => 'javelin-dom', - 4 => 'javelin-request', - 5 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-util', + 'javelin-dom', + 'javelin-request', + 'phabricator-keyboard-shortcut', ), '361e3ed3' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', + 'javelin-behavior', + 'javelin-dom', ), '3672899b' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-uri', - 3 => 'javelin-mask', - 4 => 'phabricator-drag-and-drop-file-upload', + 'javelin-behavior', + 'javelin-dom', + 'javelin-uri', + 'javelin-mask', + 'phabricator-drag-and-drop-file-upload', ), '3915d490' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-vector', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-vector', ), '39841ead' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-request', - 3 => 'javelin-util', + 'javelin-behavior', + 'javelin-dom', + 'javelin-request', + 'javelin-util', ), '3ab51e2c' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'javelin-dom', - 5 => 'javelin-magical-init', + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-magical-init', ), '3b1557b3' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), '3b3e1664' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', + 'javelin-behavior', + 'javelin-dom', + 'phortune-credit-card-form', ), '3d51a746' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - 5 => 'javelin-uri', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'javelin-uri', ), '3ee3408b' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'phabricator-tooltip', + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'phabricator-tooltip', ), '3fc2c8f2' => array( - 0 => 'multirow-row-manager', - 1 => 'javelin-install', - 2 => 'javelin-util', - 3 => 'javelin-dom', - 4 => 'javelin-stratcom', - 5 => 'javelin-json', - 6 => 'phabricator-prefab', + 'multirow-row-manager', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-json', + 'phabricator-prefab', ), '40a6a403' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), '40b1ff90' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - 5 => 'phabricator-notification', - 6 => 'javelin-behavior-device', - 7 => 'phuix-dropdown-menu', - 8 => 'phuix-action-list-view', - 9 => 'phuix-action-view', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'phabricator-notification', + 'javelin-behavior-device', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', ), '41e47dea' => array( - 0 => 'javelin-install', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-util', + 'javelin-install', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-util', ), '44168bad' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-prefab', + 'javelin-behavior', + 'javelin-dom', + 'phabricator-prefab', ), '453c5375' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', + 'javelin-behavior', + 'javelin-dom', ), '469c0d9e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', ), '47c794d8' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), '4a07e8e3' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '4d94d9c3' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'phuix-dropdown-menu', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phuix-dropdown-menu', ), '4e3e79a6' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), '4e9b766b' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-request', ), '4fdb476d' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), '503e17fd' => array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead-source', - 2 => 'javelin-util', + 'javelin-install', + 'javelin-typeahead-source', + 'javelin-util', ), '519705ea' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), '54b612ba' => array( - 0 => 'javelin-color', - 1 => 'javelin-install', - 2 => 'javelin-util', + 'javelin-color', + 'javelin-install', + 'javelin-util', ), '54f314a0' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-typeahead-source', + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-typeahead-source', ), '558829c2' => array( - 0 => 'javelin-stratcom', - 1 => 'javelin-behavior', - 2 => 'javelin-vector', - 3 => 'javelin-dom', + 'javelin-stratcom', + 'javelin-behavior', + 'javelin-vector', + 'javelin-dom', ), '58f7803f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-aphlict', - 2 => 'phabricator-phtize', - 3 => 'javelin-dom', + 'javelin-behavior', + 'javelin-aphlict', + 'phabricator-phtize', + 'javelin-dom', ), '59b251eb' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-vector', - 3 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', ), '5bc2cb21' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-stratcom', ), '5fefb143' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', - 3 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', + 'javelin-stratcom', ), '60821bc7' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), '6153c708' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-workflow', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-workflow', ), '61cbc29a' => array( - 0 => 'javelin-magical-init', - 1 => 'javelin-util', + 'javelin-magical-init', + 'javelin-util', ), '6453c869' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-fx', + 'javelin-install', + 'javelin-dom', + 'javelin-fx', ), '69adf288' => array( - 0 => 'javelin-install', + 'javelin-install', ), '6b3dcf44' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '6c2b09a2' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '6d3e1947' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-diffusion-locate-file-source', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead', - 4 => 'javelin-uri', + 'javelin-behavior', + 'javelin-diffusion-locate-file-source', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-uri', ), '6e8cefa4' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-util', + 'javelin-install', + 'javelin-dom', + 'javelin-util', ), '6eff08aa' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', + 'javelin-install', + 'javelin-util', + 'javelin-stratcom', ), '710f209e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'phuix-dropdown-menu', - 6 => 'phuix-action-list-view', - 7 => 'phuix-action-view', - 8 => 'phabricator-phtize', - 9 => 'changeset-view-manager', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'phabricator-phtize', + 'changeset-view-manager', ), '71f66c08' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - 5 => 'phabricator-textareautils', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'javelin-uri', + 'phabricator-textareautils', ), '7319e029' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', + 'javelin-behavior', + 'javelin-dom', ), '76b9fc3e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', ), '76f4ebed' => array( - 0 => 'javelin-install', - 1 => 'javelin-reactor', - 2 => 'javelin-util', + 'javelin-install', + 'javelin-reactor', + 'javelin-util', ), '77b1cf6f' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), '7814b593' => array( - 0 => 'javelin-request', - 1 => 'javelin-behavior', - 2 => 'javelin-dom', - 3 => 'javelin-router', - 4 => 'javelin-util', - 5 => 'phabricator-busy', + 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-router', + 'javelin-util', + 'phabricator-busy', ), '7a68dda3' => array( - 0 => 'owners-path-editor', - 1 => 'javelin-behavior', + 'owners-path-editor', + 'javelin-behavior', ), '7a9677fc' => array( - 0 => 'phabricator-notification', - 1 => 'javelin-stratcom', - 2 => 'javelin-behavior', + 'phabricator-notification', + 'javelin-stratcom', + 'javelin-behavior', ), '7b98d7c5' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', ), '7c273581' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), '7cbe244b' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-router', + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-router', ), '7e41274a' => array( - 0 => 'javelin-install', + 'javelin-install', ), '7e8468ae' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-request', - 4 => 'javelin-uri', + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + 'javelin-request', + 'javelin-uri', ), '7ebaeed3' => array( - 0 => 'herald-rule-editor', - 1 => 'javelin-behavior', + 'herald-rule-editor', + 'javelin-behavior', ), '7ee2b591' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-history', + 'javelin-behavior', + 'javelin-history', ), '82ce2142' => array( - 0 => 'aphront-typeahead-control-css', + 'aphront-typeahead-control-css', ), '84845b5b' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', ), '85ab3c8e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-workflow', - 4 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-stratcom', ), '85ea0626' => array( - 0 => 'javelin-install', + 'javelin-install', ), '88236f00' => array( - 0 => 'javelin-behavior', - 1 => 'phabricator-keyboard-shortcut', - 2 => 'javelin-stratcom', + 'javelin-behavior', + 'phabricator-keyboard-shortcut', + 'javelin-stratcom', ), '886fd850' => array( - 0 => 'javelin-install', - 1 => 'javelin-reactor-dom', - 2 => 'javelin-view-html', - 3 => 'javelin-view-interpreter', - 4 => 'javelin-view-renderer', + 'javelin-install', + 'javelin-reactor-dom', + 'javelin-view-html', + 'javelin-view-interpreter', + 'javelin-view-renderer', ), '8a41885b' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', + 'javelin-install', + 'javelin-dom', ), '8b0ad945' => array( - 0 => 'javelin-install', - 1 => 'javelin-event', - 2 => 'javelin-util', - 3 => 'javelin-magical-init', + 'javelin-install', + 'javelin-event', + 'javelin-util', + 'javelin-magical-init', ), '8b3fd187' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-typeahead-source', + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-typeahead-source', ), '8d199d97' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phabricator-keyboard-shortcut', ), '8ef9ab58' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', ), '8fc1c918' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-uri', - 2 => 'phabricator-notification', + 'javelin-behavior', + 'javelin-uri', + 'phabricator-notification', ), '92eb531d' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-drag-and-drop-file-upload', - 3 => 'phabricator-textareautils', + 'javelin-behavior', + 'javelin-dom', + 'phabricator-drag-and-drop-file-upload', + 'phabricator-textareautils', ), '9414ff18' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-resource', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', + 'javelin-behavior', + 'javelin-resource', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', ), '97258e55' => array( - 0 => 'javelin-install', - 1 => 'javelin-stratcom', - 2 => 'javelin-util', - 3 => 'javelin-behavior', - 4 => 'javelin-json', - 5 => 'javelin-dom', - 6 => 'javelin-resource', - 7 => 'javelin-routable', + 'javelin-install', + 'javelin-stratcom', + 'javelin-util', + 'javelin-behavior', + 'javelin-json', + 'javelin-dom', + 'javelin-resource', + 'javelin-routable', ), '988040b4' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), '9c2623f4' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-workflow', - 4 => 'phabricator-phtize', - 5 => 'phabricator-drag-and-drop-file-upload', - 6 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-workflow', + 'phabricator-phtize', + 'phabricator-drag-and-drop-file-upload', + 'phabricator-draggable-list', ), '9db3d160' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-vector', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-vector', + 'javelin-dom', ), '9f7309fb' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-request', - 4 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-request', + 'phabricator-shaped-request', ), 'a155550f' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), 'a3e2244e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), 'a4ae61bf' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'phabricator-notification', + 'javelin-install', + 'javelin-dom', + 'phabricator-notification', ), 'a5573bcd' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-stratcom', - 4 => 'javelin-vector', + 'javelin-behavior', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', ), 'a5b67173' => array( - 0 => 'javelin-dom', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', ), 'a5d7cf86' => array( - 0 => 'javelin-dom', + 'javelin-dom', ), 'a80d0378' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), 'a826c925' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-aphlict', - 2 => 'javelin-stratcom', - 3 => 'javelin-request', - 4 => 'javelin-uri', - 5 => 'javelin-dom', - 6 => 'javelin-json', - 7 => 'javelin-router', - 8 => 'javelin-util', - 9 => 'phabricator-notification', + 'javelin-behavior', + 'javelin-aphlict', + 'javelin-stratcom', + 'javelin-request', + 'javelin-uri', + 'javelin-dom', + 'javelin-json', + 'javelin-router', + 'javelin-util', + 'phabricator-notification', ), 'a8d8459d' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', ), 'a8da01f0' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-uri', - 2 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-uri', + 'phabricator-keyboard-shortcut', ), 'a9f88de2' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-fx', - 5 => 'javelin-util', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-fx', + 'javelin-util', ), 'aa1733d0' => array( - 0 => 'multirow-row-manager', - 1 => 'javelin-install', - 2 => 'path-typeahead', - 3 => 'javelin-dom', - 4 => 'javelin-util', - 5 => 'phabricator-prefab', + 'multirow-row-manager', + 'javelin-install', + 'path-typeahead', + 'javelin-dom', + 'javelin-util', + 'phabricator-prefab', ), 'aa93c7b0' => array( - 0 => 'javelin-install', + 'javelin-install', ), 'ab836011' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - 5 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'phabricator-keyboard-shortcut', ), 'ab8d2723' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', + 'javelin-behavior', + 'javelin-dom', + 'phortune-credit-card-form', ), 'ad7a69ca' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-vector', + 'javelin-install', + 'javelin-util', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', ), 'b1f0ccee' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-reactor-dom', ), 'b2b4fbaf' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-uri', - 3 => 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-uri', + 'javelin-request', ), 'b3a4b884' => array( - 0 => 'javelin-behavior', - 1 => 'phabricator-prefab', + 'javelin-behavior', + 'phabricator-prefab', ), 'b3e7d692' => array( - 0 => 'javelin-install', + 'javelin-install', ), 'b3ec3cfc' => array( - 0 => 'javelin-install', + 'javelin-install', ), 'b42eddc7' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-typeahead-preloaded-source', - 3 => 'javelin-util', + 'javelin-install', + 'javelin-dom', + 'javelin-typeahead-preloaded-source', + 'javelin-util', ), 'b4c30592' => array( - 0 => 'javelin-install', - 1 => 'javelin-reactor', - 2 => 'javelin-util', - 3 => 'javelin-reactor-node-calmer', + 'javelin-install', + 'javelin-reactor', + 'javelin-util', + 'javelin-reactor-node-calmer', ), 'b5c256b8' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', + 'javelin-install', + 'javelin-dom', ), 'b6d401d6' => array( - 0 => 'javelin-dom', - 1 => 'javelin-dynval', - 2 => 'javelin-reactor', - 3 => 'javelin-reactornode', - 4 => 'javelin-install', - 5 => 'javelin-util', + 'javelin-dom', + 'javelin-dynval', + 'javelin-reactor', + 'javelin-reactornode', + 'javelin-install', + 'javelin-util', ), 'b716477f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', ), 'bba9eedf' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), 'bbae734c' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead', - 4 => 'javelin-tokenizer', - 5 => 'javelin-typeahead-preloaded-source', - 6 => 'javelin-typeahead-ondemand-source', - 7 => 'javelin-dom', - 8 => 'javelin-stratcom', - 9 => 'javelin-util', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-tokenizer', + 'javelin-typeahead-preloaded-source', + 'javelin-typeahead-ondemand-source', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', ), 'bd4c8dca' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-vector', + 'javelin-stratcom', ), 'bdaf4d04' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-request', ), 'bdb3e4d0' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'phabricator-tooltip', - 4 => 'changeset-view-manager', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phabricator-tooltip', + 'changeset-view-manager', ), 'be807912' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-shaped-request', ), 'c4569c05' => array( - 0 => 'javelin-magical-init', - 1 => 'javelin-install', - 2 => 'javelin-util', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', + 'javelin-magical-init', + 'javelin-install', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', ), 'c60f4327' => array( - 0 => 'javelin-stratcom', - 1 => 'javelin-install', - 2 => 'javelin-uri', - 3 => 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-uri', + 'javelin-util', ), 'c6b95cbd' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', ), 'ca3f91eb' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'phabricator-phtize', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phabricator-phtize', ), 'd149e002' => array( - 0 => 'javelin-stratcom', - 1 => 'javelin-request', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-install', - 5 => 'javelin-util', - 6 => 'javelin-mask', - 7 => 'javelin-uri', - 8 => 'javelin-routable', + 'javelin-stratcom', + 'javelin-request', + 'javelin-dom', + 'javelin-vector', + 'javelin-install', + 'javelin-util', + 'javelin-mask', + 'javelin-uri', + 'javelin-routable', ), 'd19198c8' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-dynval', - 4 => 'javelin-reactor-dom', + 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-dynval', + 'javelin-reactor-dom', ), 'd254d646' => array( - 0 => 'javelin-util', + 'javelin-util', ), 'd2907473' => array( - 0 => 'javelin-dom', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-install', - 4 => 'javelin-workflow', - 5 => 'javelin-router', - 6 => 'javelin-behavior-device', - 7 => 'javelin-vector', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-workflow', + 'javelin-router', + 'javelin-behavior-device', + 'javelin-vector', ), 'd4a14807' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-view', + 'javelin-install', + 'javelin-dom', + 'javelin-view', ), 'd4eecc63' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', ), 'd6f54db0' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-request', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-dom', ), 'd712ac5f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-typeahead-ondemand-source', - 2 => 'javelin-typeahead', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - 5 => 'javelin-util', - 6 => 'javelin-stratcom', - 7 => 'phabricator-prefab', + 'javelin-behavior', + 'javelin-typeahead-ondemand-source', + 'javelin-typeahead', + 'javelin-dom', + 'javelin-uri', + 'javelin-util', + 'javelin-stratcom', + 'phabricator-prefab', ), 'd75709e6' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-workflow', - 2 => 'javelin-json', - 3 => 'javelin-dom', - 4 => 'phabricator-keyboard-shortcut', + 'javelin-behavior', + 'javelin-workflow', + 'javelin-json', + 'javelin-dom', + 'phabricator-keyboard-shortcut', ), 'd835b03a' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-shaped-request', ), 'dd7e8ef5' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', - 3 => 'javelin-util', - 4 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', + 'javelin-util', + 'javelin-stratcom', ), 'de2e896f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-typeahead', - 3 => 'javelin-typeahead-ondemand-source', - 4 => 'javelin-dom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-typeahead-ondemand-source', + 'javelin-dom', ), 'e10f8e18' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-prefab', + 'javelin-behavior', + 'javelin-dom', + 'phabricator-prefab', ), 'e1ff79b1' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), 'e32d14ab' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'phabricator-phtize', - 4 => 'phabricator-textareautils', - 5 => 'javelin-workflow', - 6 => 'javelin-vector', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phabricator-phtize', + 'phabricator-textareautils', + 'javelin-workflow', + 'javelin-vector', ), 'e379b58e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-vector', - 3 => 'javelin-dom', - 4 => 'javelin-uri', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', ), 'e566f52c' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', ), 'e5822781' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-json', - 3 => 'javelin-workflow', - 4 => 'javelin-magical-init', + 'javelin-behavior', + 'javelin-dom', + 'javelin-json', + 'javelin-workflow', + 'javelin-magical-init', ), 'e5b406f9' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-view-visitor', - 3 => 'javelin-util', + 'javelin-install', + 'javelin-dom', + 'javelin-view-visitor', + 'javelin-util', ), 'e614d22b' => array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-util', + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + 'javelin-util', ), 'e9581f08' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', ), 'efe49472' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', + 'javelin-install', + 'javelin-util', ), 'f0a41b9f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'javelin-behavior-device', - 6 => 'javelin-history', - 7 => 'javelin-vector', - 8 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-behavior-device', + 'javelin-history', + 'javelin-vector', + 'phabricator-shaped-request', ), 'f2441746' => array( - 0 => 'javelin-dom', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-install', - 4 => 'javelin-request', - 5 => 'javelin-workflow', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-request', + 'javelin-workflow', ), 'f36e01af' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'phabricator-hovercard', + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'javelin-vector', + 'phabricator-hovercard', ), 'f3fef818' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phuix-dropdown-menu', - 4 => 'phuix-action-list-view', - 5 => 'phuix-action-view', - 6 => 'javelin-workflow', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'javelin-workflow', ), 'f51afce0' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-request', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'javelin-dom', - 5 => 'javelin-uri', - 6 => 'javelin-behavior-device', + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', ), 'f588412e' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-prefab', - 4 => 'multirow-row-manager', - 5 => 'javelin-json', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-prefab', + 'multirow-row-manager', + 'javelin-json', ), 'f6555212' => array( - 0 => 'javelin-install', - 1 => 'javelin-reactornode', - 2 => 'javelin-util', - 3 => 'javelin-reactor', + 'javelin-install', + 'javelin-reactornode', + 'javelin-util', + 'javelin-reactor', ), 'f726d506' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-history', + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-history', ), 'f7379f45' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-shaped-request', ), 'f7f1289f' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', ), 'f7fc67ec' => array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead', - 2 => 'javelin-dom', - 3 => 'javelin-request', - 4 => 'javelin-typeahead-ondemand-source', - 5 => 'javelin-util', + 'javelin-install', + 'javelin-typeahead', + 'javelin-dom', + 'javelin-request', + 'javelin-typeahead-ondemand-source', + 'javelin-util', ), 'f8248bc5' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-json', - 4 => 'javelin-stratcom', - 5 => 'phabricator-shaped-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-json', + 'javelin-stratcom', + 'phabricator-shaped-request', ), 'f9539603' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-uri', + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-uri', ), 'fa0f4fc2' => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-magical-init', + 'javelin-behavior', + 'javelin-dom', + 'javelin-vector', + 'javelin-magical-init', ), 'fcba4ecc' => array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead-normalizer', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-typeahead-normalizer', ), 'fe9a552f' => array( - 0 => 'javelin-behavior', - 1 => 'multirow-row-manager', - 2 => 'javelin-dom', - 3 => 'javelin-util', - 4 => 'phabricator-prefab', - 5 => 'javelin-json', + 'javelin-behavior', + 'multirow-row-manager', + 'javelin-dom', + 'javelin-util', + 'phabricator-prefab', + 'javelin-json', ), 42126667 => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-request', ), 48086888 => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', ), 60479091 => array( - 0 => 'phabricator-busy', - 1 => 'javelin-behavior', + 'phabricator-busy', + 'javelin-behavior', ), 82439934 => array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'phabricator-draggable-list', + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', ), ), 'packages' => array( 'core.pkg.css' => array( - 0 => 'phabricator-core-css', - 1 => 'phabricator-zindex-css', - 2 => 'phui-button-css', - 3 => 'phabricator-standard-page-view', - 4 => 'aphront-dialog-view-css', - 5 => 'phui-form-view-css', - 6 => 'aphront-panel-view-css', - 7 => 'aphront-table-view-css', - 8 => 'aphront-tokenizer-control-css', - 9 => 'aphront-typeahead-control-css', - 10 => 'aphront-list-filter-view-css', - 11 => 'phabricator-remarkup-css', - 12 => 'syntax-highlighting-css', - 13 => 'aphront-pager-view-css', - 14 => 'phabricator-transaction-view-css', - 15 => 'aphront-tooltip-css', - 16 => 'phabricator-flag-css', - 17 => 'aphront-error-view-css', - 18 => 'sprite-gradient-css', - 19 => 'sprite-menu-css', - 20 => 'sprite-apps-css', - 21 => 'sprite-apps-large-css', - 22 => 'phabricator-main-menu-view', - 23 => 'phabricator-notification-css', - 24 => 'phabricator-notification-menu-css', - 25 => 'lightbox-attachment-css', - 26 => 'phui-header-view-css', - 27 => 'phabricator-filetree-view-css', - 28 => 'phabricator-nav-view-css', - 29 => 'phabricator-side-menu-view-css', - 30 => 'phabricator-crumbs-view-css', - 31 => 'phui-object-item-list-view-css', - 32 => 'global-drag-and-drop-css', - 33 => 'phui-spacing-css', - 34 => 'phui-form-css', - 35 => 'phui-icon-view-css', - 36 => 'phabricator-application-launch-view-css', - 37 => 'phabricator-action-list-view-css', - 38 => 'phui-property-list-view-css', - 39 => 'phui-tag-view-css', - 40 => 'phui-list-view-css', - 41 => 'font-fontawesome', - 42 => 'phui-font-icon-base-css', - 43 => 'sprite-main-header-css', - 44 => 'phui-box-css', - 45 => 'phui-object-box-css', - 46 => 'phui-timeline-view-css', - 47 => 'sprite-tokens-css', - 48 => 'tokens-css', - 49 => 'phui-status-list-view-css', + 'phabricator-core-css', + 'phabricator-zindex-css', + 'phui-button-css', + 'phabricator-standard-page-view', + 'aphront-dialog-view-css', + 'phui-form-view-css', + 'aphront-panel-view-css', + 'aphront-table-view-css', + 'aphront-tokenizer-control-css', + 'aphront-typeahead-control-css', + 'aphront-list-filter-view-css', + 'phabricator-remarkup-css', + 'syntax-highlighting-css', + 'aphront-pager-view-css', + 'phabricator-transaction-view-css', + 'aphront-tooltip-css', + 'phabricator-flag-css', + 'aphront-error-view-css', + 'sprite-gradient-css', + 'sprite-menu-css', + 'sprite-apps-css', + 'sprite-apps-large-css', + 'phabricator-main-menu-view', + 'phabricator-notification-css', + 'phabricator-notification-menu-css', + 'lightbox-attachment-css', + 'phui-header-view-css', + 'phabricator-filetree-view-css', + 'phabricator-nav-view-css', + 'phabricator-side-menu-view-css', + 'phabricator-crumbs-view-css', + 'phui-object-item-list-view-css', + 'global-drag-and-drop-css', + 'phui-spacing-css', + 'phui-form-css', + 'phui-icon-view-css', + 'phabricator-application-launch-view-css', + 'phabricator-action-list-view-css', + 'phui-property-list-view-css', + 'phui-tag-view-css', + 'phui-list-view-css', + 'font-fontawesome', + 'phui-font-icon-base-css', + 'sprite-main-header-css', + 'phui-box-css', + 'phui-object-box-css', + 'phui-timeline-view-css', + 'sprite-tokens-css', + 'tokens-css', + 'phui-status-list-view-css', ), 'core.pkg.js' => array( - 0 => 'javelin-util', - 1 => 'javelin-install', - 2 => 'javelin-event', - 3 => 'javelin-stratcom', - 4 => 'javelin-behavior', - 5 => 'javelin-resource', - 6 => 'javelin-request', - 7 => 'javelin-vector', - 8 => 'javelin-dom', - 9 => 'javelin-json', - 10 => 'javelin-uri', - 11 => 'javelin-workflow', - 12 => 'javelin-mask', - 13 => 'javelin-typeahead', - 14 => 'javelin-typeahead-normalizer', - 15 => 'javelin-typeahead-source', - 16 => 'javelin-typeahead-preloaded-source', - 17 => 'javelin-typeahead-ondemand-source', - 18 => 'javelin-tokenizer', - 19 => 'javelin-history', - 20 => 'javelin-router', - 21 => 'javelin-routable', - 22 => 'javelin-behavior-aphront-basic-tokenizer', - 23 => 'javelin-behavior-workflow', - 24 => 'javelin-behavior-aphront-form-disable-on-submit', - 25 => 'phabricator-keyboard-shortcut-manager', - 26 => 'phabricator-keyboard-shortcut', - 27 => 'javelin-behavior-phabricator-keyboard-shortcuts', - 28 => 'javelin-behavior-refresh-csrf', - 29 => 'javelin-behavior-phabricator-watch-anchor', - 30 => 'javelin-behavior-phabricator-autofocus', - 31 => 'phuix-dropdown-menu', - 32 => 'phuix-action-list-view', - 33 => 'phuix-action-view', - 34 => 'phabricator-phtize', - 35 => 'javelin-behavior-phabricator-oncopy', - 36 => 'phabricator-tooltip', - 37 => 'javelin-behavior-phabricator-tooltips', - 38 => 'phabricator-prefab', - 39 => 'javelin-behavior-device', - 40 => 'javelin-behavior-toggle-class', - 41 => 'javelin-behavior-lightbox-attachments', - 42 => 'phabricator-busy', - 43 => 'javelin-aphlict', - 44 => 'phabricator-notification', - 45 => 'javelin-behavior-aphlict-listen', - 46 => 'javelin-behavior-phabricator-search-typeahead', - 47 => 'javelin-behavior-konami', - 48 => 'javelin-behavior-aphlict-dropdown', - 49 => 'javelin-behavior-history-install', - 50 => 'javelin-behavior-phabricator-gesture', - 51 => 'javelin-behavior-phabricator-active-nav', - 52 => 'javelin-behavior-phabricator-nav', - 53 => 'javelin-behavior-phabricator-remarkup-assist', - 54 => 'phabricator-textareautils', - 55 => 'phabricator-file-upload', - 56 => 'javelin-behavior-global-drag-and-drop', - 57 => 'javelin-behavior-phabricator-reveal-content', - 58 => 'phabricator-hovercard', - 59 => 'javelin-behavior-phabricator-hovercards', - 60 => 'javelin-color', - 61 => 'javelin-fx', - 62 => 'phabricator-draggable-list', - 63 => 'javelin-behavior-phabricator-transaction-list', - 64 => 'javelin-behavior-phabricator-show-all-transactions', - 65 => 'javelin-behavior-phui-timeline-dropdown-menu', - 66 => 'javelin-behavior-doorkeeper-tag', + 'javelin-util', + 'javelin-install', + 'javelin-event', + 'javelin-stratcom', + 'javelin-behavior', + 'javelin-resource', + 'javelin-request', + 'javelin-vector', + 'javelin-dom', + 'javelin-json', + 'javelin-uri', + 'javelin-workflow', + 'javelin-mask', + 'javelin-typeahead', + 'javelin-typeahead-normalizer', + 'javelin-typeahead-source', + 'javelin-typeahead-preloaded-source', + 'javelin-typeahead-ondemand-source', + 'javelin-tokenizer', + 'javelin-history', + 'javelin-router', + 'javelin-routable', + 'javelin-behavior-aphront-basic-tokenizer', + 'javelin-behavior-workflow', + 'javelin-behavior-aphront-form-disable-on-submit', + 'phabricator-keyboard-shortcut-manager', + 'phabricator-keyboard-shortcut', + 'javelin-behavior-phabricator-keyboard-shortcuts', + 'javelin-behavior-refresh-csrf', + 'javelin-behavior-phabricator-watch-anchor', + 'javelin-behavior-phabricator-autofocus', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'phabricator-phtize', + 'javelin-behavior-phabricator-oncopy', + 'phabricator-tooltip', + 'javelin-behavior-phabricator-tooltips', + 'phabricator-prefab', + 'javelin-behavior-device', + 'javelin-behavior-toggle-class', + 'javelin-behavior-lightbox-attachments', + 'phabricator-busy', + 'javelin-aphlict', + 'phabricator-notification', + 'javelin-behavior-aphlict-listen', + 'javelin-behavior-phabricator-search-typeahead', + 'javelin-behavior-konami', + 'javelin-behavior-aphlict-dropdown', + 'javelin-behavior-history-install', + 'javelin-behavior-phabricator-gesture', + 'javelin-behavior-phabricator-active-nav', + 'javelin-behavior-phabricator-nav', + 'javelin-behavior-phabricator-remarkup-assist', + 'phabricator-textareautils', + 'phabricator-file-upload', + 'javelin-behavior-global-drag-and-drop', + 'javelin-behavior-phabricator-reveal-content', + 'phabricator-hovercard', + 'javelin-behavior-phabricator-hovercards', + 'javelin-color', + 'javelin-fx', + 'phabricator-draggable-list', + 'javelin-behavior-phabricator-transaction-list', + 'javelin-behavior-phabricator-show-all-transactions', + 'javelin-behavior-phui-timeline-dropdown-menu', + 'javelin-behavior-doorkeeper-tag', ), 'darkconsole.pkg.js' => array( - 0 => 'javelin-behavior-dark-console', - 1 => 'javelin-behavior-error-log', + 'javelin-behavior-dark-console', + 'javelin-behavior-error-log', ), 'differential.pkg.css' => array( - 0 => 'differential-core-view-css', - 1 => 'differential-changeset-view-css', - 2 => 'differential-results-table-css', - 3 => 'differential-revision-history-css', - 4 => 'differential-revision-list-css', - 5 => 'differential-table-of-contents-css', - 6 => 'differential-revision-comment-css', - 7 => 'differential-revision-add-comment-css', - 8 => 'phabricator-object-selector-css', - 9 => 'phabricator-content-source-view-css', - 10 => 'inline-comment-summary-css', + 'differential-core-view-css', + 'differential-changeset-view-css', + 'differential-results-table-css', + 'differential-revision-history-css', + 'differential-revision-list-css', + 'differential-table-of-contents-css', + 'differential-revision-comment-css', + 'differential-revision-add-comment-css', + 'phabricator-object-selector-css', + 'phabricator-content-source-view-css', + 'inline-comment-summary-css', ), 'differential.pkg.js' => array( - 0 => 'phabricator-drag-and-drop-file-upload', - 1 => 'phabricator-shaped-request', - 2 => 'javelin-behavior-differential-feedback-preview', - 3 => 'javelin-behavior-differential-edit-inline-comments', - 4 => 'javelin-behavior-differential-populate', - 5 => 'javelin-behavior-differential-show-more', - 6 => 'javelin-behavior-differential-diff-radios', - 7 => 'javelin-behavior-differential-comment-jump', - 8 => 'javelin-behavior-differential-add-reviewers-and-ccs', - 9 => 'javelin-behavior-differential-keyboard-navigation', - 10 => 'javelin-behavior-aphront-drag-and-drop-textarea', - 11 => 'javelin-behavior-phabricator-object-selector', - 12 => 'javelin-behavior-repository-crossreference', - 13 => 'javelin-behavior-load-blame', - 14 => 'differential-inline-comment-editor', - 15 => 'javelin-behavior-differential-dropdown-menus', - 16 => 'javelin-behavior-differential-toggle-files', - 17 => 'javelin-behavior-differential-user-select', - 18 => 'javelin-behavior-aphront-more', + 'phabricator-drag-and-drop-file-upload', + 'phabricator-shaped-request', + 'javelin-behavior-differential-feedback-preview', + 'javelin-behavior-differential-edit-inline-comments', + 'javelin-behavior-differential-populate', + 'javelin-behavior-differential-show-more', + 'javelin-behavior-differential-diff-radios', + 'javelin-behavior-differential-comment-jump', + 'javelin-behavior-differential-add-reviewers-and-ccs', + 'javelin-behavior-differential-keyboard-navigation', + 'javelin-behavior-aphront-drag-and-drop-textarea', + 'javelin-behavior-phabricator-object-selector', + 'javelin-behavior-repository-crossreference', + 'javelin-behavior-load-blame', + 'differential-inline-comment-editor', + 'javelin-behavior-differential-dropdown-menus', + 'javelin-behavior-differential-toggle-files', + 'javelin-behavior-differential-user-select', + 'javelin-behavior-aphront-more', ), 'diffusion.pkg.css' => array( - 0 => 'diffusion-commit-view-css', - 1 => 'diffusion-icons-css', + 'diffusion-commit-view-css', + 'diffusion-icons-css', ), 'diffusion.pkg.js' => array( - 0 => 'javelin-behavior-diffusion-pull-lastmodified', - 1 => 'javelin-behavior-diffusion-commit-graph', - 2 => 'javelin-behavior-audit-preview', + 'javelin-behavior-diffusion-pull-lastmodified', + 'javelin-behavior-diffusion-commit-graph', + 'javelin-behavior-audit-preview', ), 'maniphest.pkg.css' => array( - 0 => 'maniphest-task-summary-css', + 'maniphest-task-summary-css', ), 'maniphest.pkg.js' => array( - 0 => 'javelin-behavior-maniphest-batch-selector', - 1 => 'javelin-behavior-maniphest-transaction-controls', - 2 => 'javelin-behavior-maniphest-transaction-preview', - 3 => 'javelin-behavior-maniphest-transaction-expand', - 4 => 'javelin-behavior-maniphest-subpriority-editor', - 5 => 'javelin-behavior-maniphest-list-editor', + 'javelin-behavior-maniphest-batch-selector', + 'javelin-behavior-maniphest-transaction-controls', + 'javelin-behavior-maniphest-transaction-preview', + 'javelin-behavior-maniphest-transaction-expand', + 'javelin-behavior-maniphest-subpriority-editor', + 'javelin-behavior-maniphest-list-editor', ), ), ); diff --git a/resources/sql/autopatches/20140721.phortune.1.cart.sql b/resources/sql/autopatches/20140721.phortune.1.cart.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.1.cart.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_cart ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_account` (accountPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140721.phortune.2.purchase.sql b/resources/sql/autopatches/20140721.phortune.2.purchase.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.2.purchase.sql @@ -0,0 +1,17 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_purchase ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + productPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + cartPHID VARCHAR(64) COLLATE utf8_bin, + basePriceInCents INT NOT NULL, + quantity INT UNSIGNED NOT NULL, + totalPriceInCents INT NOT NULL, + status VARCHAR(32) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_cart` (cartPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2496,6 +2496,7 @@ 'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php', 'PhortuneBalancedPaymentProvider' => 'applications/phortune/provider/PhortuneBalancedPaymentProvider.php', 'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php', + 'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php', 'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php', 'PhortuneConstants' => 'applications/phortune/constants/PhortuneConstants.php', 'PhortuneController' => 'applications/phortune/controller/PhortuneController.php', @@ -2521,12 +2522,14 @@ 'PhortuneProductEditController' => 'applications/phortune/controller/PhortuneProductEditController.php', 'PhortuneProductEditor' => 'applications/phortune/editor/PhortuneProductEditor.php', 'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php', + 'PhortuneProductPurchaseController' => 'applications/phortune/controller/PhortuneProductPurchaseController.php', 'PhortuneProductQuery' => 'applications/phortune/query/PhortuneProductQuery.php', 'PhortuneProductTransaction' => 'applications/phortune/storage/PhortuneProductTransaction.php', 'PhortuneProductTransactionQuery' => 'applications/phortune/query/PhortuneProductTransactionQuery.php', 'PhortuneProductViewController' => 'applications/phortune/controller/PhortuneProductViewController.php', 'PhortuneProviderController' => 'applications/phortune/controller/PhortuneProviderController.php', 'PhortunePurchase' => 'applications/phortune/storage/PhortunePurchase.php', + 'PhortunePurchaseQuery' => 'applications/phortune/query/PhortunePurchaseQuery.php', 'PhortuneStripePaymentProvider' => 'applications/phortune/provider/PhortuneStripePaymentProvider.php', 'PhortuneTestExtraPaymentProvider' => 'applications/phortune/provider/__tests__/PhortuneTestExtraPaymentProvider.php', 'PhortuneTestPaymentProvider' => 'applications/phortune/provider/PhortuneTestPaymentProvider.php', @@ -5374,7 +5377,11 @@ 'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhortuneAccountViewController' => 'PhortuneController', 'PhortuneBalancedPaymentProvider' => 'PhortunePaymentProvider', - 'PhortuneCart' => 'PhortuneDAO', + 'PhortuneCart' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + ), + 'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhortuneCharge' => 'PhortuneDAO', 'PhortuneController' => 'PhabricatorController', 'PhortuneCurrencyTestCase' => 'PhabricatorTestCase', @@ -5402,12 +5409,17 @@ 'PhortuneProductEditController' => 'PhabricatorController', 'PhortuneProductEditor' => 'PhabricatorApplicationTransactionEditor', 'PhortuneProductListController' => 'PhabricatorController', + 'PhortuneProductPurchaseController' => 'PhortuneController', 'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhortuneProductTransaction' => 'PhabricatorApplicationTransaction', 'PhortuneProductTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhortuneProductViewController' => 'PhortuneController', 'PhortuneProviderController' => 'PhortuneController', - 'PhortunePurchase' => 'PhortuneDAO', + 'PhortunePurchase' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + ), + 'PhortunePurchaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhortuneStripePaymentProvider' => 'PhortunePaymentProvider', 'PhortuneTestExtraPaymentProvider' => 'PhortunePaymentProvider', 'PhortuneTestPaymentProvider' => 'PhortunePaymentProvider', diff --git a/src/applications/phortune/application/PhabricatorPhortuneApplication.php b/src/applications/phortune/application/PhabricatorPhortuneApplication.php --- a/src/applications/phortune/application/PhabricatorPhortuneApplication.php +++ b/src/applications/phortune/application/PhabricatorPhortuneApplication.php @@ -39,8 +39,9 @@ 'paymentmethod/' => array( 'edit/' => 'PhortunePaymentMethodEditController', ), - 'buy/(?P\d+)/' => 'PhortuneAccountBuyController', + 'buy/(?P\d+)/' => 'PhortuneProductPurchaseController', ), + 'cart/(?P\d+)/' => 'PhortuneAccountBuyController', 'account/' => array( '' => 'PhortuneAccountListController', 'edit/(?:(?P\d+)/)?' => 'PhortuneAccountEditController', diff --git a/src/applications/phortune/controller/PhortuneAccountBuyController.php b/src/applications/phortune/controller/PhortuneAccountBuyController.php --- a/src/applications/phortune/controller/PhortuneAccountBuyController.php +++ b/src/applications/phortune/controller/PhortuneAccountBuyController.php @@ -3,11 +3,9 @@ final class PhortuneAccountBuyController extends PhortuneController { - private $accountID; private $id; public function willProcessRequest(array $data) { - $this->accountID = $data['accountID']; $this->id = $data['id']; } @@ -15,47 +13,23 @@ $request = $this->getRequest(); $user = $request->getUser(); - $account = id(new PhortuneAccountQuery()) - ->setViewer($user) - ->withIDs(array($this->accountID)) - ->executeOne(); - if (!$account) { - return new Aphront404Response(); - } - - $account_uri = $this->getApplicationURI($account->getID().'/'); - - $product = id(new PhortuneProductQuery()) + $cart = id(new PhortuneCartQuery()) ->setViewer($user) ->withIDs(array($this->id)) + ->needPurchases(true) ->executeOne(); - if (!$product) { + if (!$cart) { return new Aphront404Response(); } - $purchase = new PhortunePurchase(); - $purchase->setProductPHID($product->getPHID()); - $purchase->setAccountPHID($account->getPHID()); - $purchase->setPurchaseName($product->getProductName()); - $purchase->setBasePriceInCents($product->getPriceInCents()); - $purchase->setQuantity(1); - $purchase->setTotalPriceInCents( - $purchase->getBasePriceInCents() * $purchase->getQuantity()); - $purchase->setStatus(PhortunePurchase::STATUS_PENDING); - - $cart = new PhortuneCart(); - $cart->setAccountPHID($account->getPHID()); - $cart->setOwnerPHID($user->getPHID()); - $cart->attachPurchases( - array( - $purchase, - )); + $account = $cart->getAccount(); + $account_uri = $this->getApplicationURI($account->getID().'/'); $rows = array(); $total = 0; foreach ($cart->getPurchases() as $purchase) { $rows[] = array( - $purchase->getPurchaseName(), + pht('A Purchase'), PhortuneCurrency::newFromUSDCents($purchase->getBasePriceInCents()) ->formatForDisplay(), $purchase->getQuantity(), diff --git a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php --- a/src/applications/phortune/controller/PhortunePaymentMethodEditController.php +++ b/src/applications/phortune/controller/PhortunePaymentMethodEditController.php @@ -211,7 +211,8 @@ 'as a payment method.'); break; default: - $message = $provider->getCreatePaymentErrorMessage($client_error); + $message = $provider->getCreatePaymentMethodErrorMessage( + $client_error); if (!$message) { $message = pht( "There was an unexpected error ('%s') processing payment ". diff --git a/src/applications/phortune/controller/PhortuneProductEditController.php b/src/applications/phortune/controller/PhortuneProductEditController.php --- a/src/applications/phortune/controller/PhortuneProductEditController.php +++ b/src/applications/phortune/controller/PhortuneProductEditController.php @@ -142,15 +142,14 @@ $is_create ? pht('Create') : pht('Edit'), $request->getRequestURI()); - $header = id(new PHUIHeaderView()) - ->setHeader(pht('Edit Product')); + $box = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Edit Product')) + ->appendChild($form); return $this->buildApplicationPage( array( $crumbs, - $header, - $errors, - $form, + $box, ), array( 'title' => $title, diff --git a/src/applications/phortune/controller/PhortuneProductPurchaseController.php b/src/applications/phortune/controller/PhortuneProductPurchaseController.php new file mode 100644 --- /dev/null +++ b/src/applications/phortune/controller/PhortuneProductPurchaseController.php @@ -0,0 +1,70 @@ +accountID = $data['accountID']; + $this->productID = $data['productID']; + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $account = id(new PhortuneAccountQuery()) + ->setViewer($user) + ->withIDs(array($this->accountID)) + ->executeOne(); + if (!$account) { + return new Aphront404Response(); + } + + $account_uri = $this->getApplicationURI($account->getID().'/'); + + $product = id(new PhortuneProductQuery()) + ->setViewer($user) + ->withIDs(array($this->productID)) + ->executeOne(); + if (!$product) { + return new Aphront404Response(); + } + + if ($request->isFormPost()) { + // TODO: Use ApplicationTransations. + + $cart = new PhortuneCart(); + $cart->openTransaction(); + + $cart->setAccountPHID($account->getPHID()); + $cart->setAuthorPHID($user->getPHID()); + $cart->save(); + + $purchase = new PhortunePurchase(); + $purchase->setProductPHID($product->getPHID()); + $purchase->setAccountPHID($account->getPHID()); + $purchase->setAuthorPHID($user->getPHID()); + $purchase->setCartPHID($cart->getPHID()); + $purchase->setBasePriceInCents($product->getPriceInCents()); + $purchase->setQuantity(1); + $purchase->setTotalPriceInCents( + $purchase->getBasePriceInCents() * $purchase->getQuantity()); + $purchase->setStatus(PhortunePurchase::STATUS_PENDING); + $purchase->save(); + + $cart->saveTransaction(); + + $cart_uri = $this->getApplicationURI('/cart/'.$cart->getID().'/'); + return id(new AphrontRedirectResponse())->setURI($cart_uri); + } + + return $this->newDialog() + ->setTitle(pht('Purchase Product')) + ->appendParagraph(pht('Really purchase this stuff?')) + ->addSubmitButton(pht('Checkout')) + ->addCancelButton($account_uri); + } +} diff --git a/src/applications/phortune/controller/PhortuneProductViewController.php b/src/applications/phortune/controller/PhortuneProductViewController.php --- a/src/applications/phortune/controller/PhortuneProductViewController.php +++ b/src/applications/phortune/controller/PhortuneProductViewController.php @@ -46,7 +46,7 @@ ->setName(pht('Purchase')) ->setHref($cart_uri) ->setIcon('fa-shopping-cart') - ->setRenderAsForm(true)); + ->setWorkflow(true)); $crumbs = $this->buildApplicationCrumbs(); $crumbs->setActionList($actions); diff --git a/src/applications/phortune/currency/PhortuneCurrency.php b/src/applications/phortune/currency/PhortuneCurrency.php --- a/src/applications/phortune/currency/PhortuneCurrency.php +++ b/src/applications/phortune/currency/PhortuneCurrency.php @@ -54,7 +54,8 @@ public static function newFromUSDCents($cents) { if (!is_int($cents)) { - throw new Exception('USDCents value is not an integer!'); + throw new Exception( + pht('USDCents value "%s" is not an integer!', $cents)); } $obj = new PhortuneCurrency(); diff --git a/src/applications/phortune/provider/PhortuneStripePaymentProvider.php b/src/applications/phortune/provider/PhortuneStripePaymentProvider.php --- a/src/applications/phortune/provider/PhortuneStripePaymentProvider.php +++ b/src/applications/phortune/provider/PhortuneStripePaymentProvider.php @@ -110,8 +110,9 @@ $customer = Stripe_Customer::create($params, $secret_key); $card = $info->card; + $method - ->setBrand($card->type) + ->setBrand($card->brand) ->setLastFourDigits($card->last4) ->setExpires($card->exp_year, $card->exp_month) ->setMetadata( diff --git a/src/applications/phortune/query/PhortuneCartQuery.php b/src/applications/phortune/query/PhortuneCartQuery.php new file mode 100644 --- /dev/null +++ b/src/applications/phortune/query/PhortuneCartQuery.php @@ -0,0 +1,102 @@ +ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function needPurchases($need_purchases) { + $this->needPurchases = $need_purchases; + return $this; + } + + protected function loadPage() { + $table = new PhortuneCart(); + $conn = $table->establishConnection('r'); + + $rows = queryfx_all( + $conn, + 'SELECT cart.* FROM %T cart %Q %Q %Q', + $table->getTableName(), + $this->buildWhereClause($conn), + $this->buildOrderClause($conn), + $this->buildLimitClause($conn)); + + return $table->loadAllFromArray($rows); + } + + protected function willFilterPage(array $carts) { + $accounts = id(new PhortuneAccountQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs(mpull($carts, 'getAccountPHID')) + ->execute(); + $accounts = mpull($accounts, null, 'getPHID'); + + foreach ($carts as $key => $cart) { + $account = idx($accounts, $cart->getAccountPHID()); + if (!$account) { + unset($carts[$key]); + } + $cart->attachAccount($account); + } + + return $carts; + } + + protected function didFilterPage(array $carts) { + if ($this->needPurchases) { + $purchases = id(new PhortunePurchaseQuery()) + ->setViewer($this->getViewer()) + ->setParentQuery($this) + ->withCartPHIDs(mpull($carts, 'getPHID')) + ->execute(); + + $purchases = mgroup($purchases, 'getCartPHID'); + foreach ($carts as $cart) { + $cart->attachPurchases(idx($purchases, $cart->getPHID(), array())); + } + } + + return $carts; + } + + private function buildWhereClause(AphrontDatabaseConnection $conn) { + $where = array(); + + $where[] = $this->buildPagingClause($conn); + + if ($this->ids !== null) { + $where[] = qsprintf( + $conn, + 'cart.id IN (%Ld)', + $this->ids); + } + + if ($this->phids !== null) { + $where[] = qsprintf( + $conn, + 'cart.phid IN (%Ls)', + $this->phids); + } + + return $this->formatWhereClause($where); + } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhortune'; + } + +} diff --git a/src/applications/phortune/query/PhortunePurchaseQuery.php b/src/applications/phortune/query/PhortunePurchaseQuery.php new file mode 100644 --- /dev/null +++ b/src/applications/phortune/query/PhortunePurchaseQuery.php @@ -0,0 +1,91 @@ +ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function withCartPHIDs(array $cart_phids) { + $this->cartPHIDs = $cart_phids; + return $this; + } + + protected function loadPage() { + $table = new PhortunePurchase(); + $conn = $table->establishConnection('r'); + + $rows = queryfx_all( + $conn, + 'SELECT purchase.* FROM %T purchase %Q %Q %Q', + $table->getTableName(), + $this->buildWhereClause($conn), + $this->buildOrderClause($conn), + $this->buildLimitClause($conn)); + + return $table->loadAllFromArray($rows); + } + + protected function willFilterPage(array $purchases) { + $carts = id(new PhabricatorObjectQuery()) + ->setViewer($this->getViewer()) + ->setParentQuery($this) + ->withPHIDs(mpull($purchases, 'getCartPHID')) + ->execute(); + + foreach ($purchases as $key => $purchase) { + $cart = idx($carts, $purchase->getCartPHID()); + if (!$cart) { + unset($purchases[$key]); + } + $purchase->attachCart($cart); + } + + return $purchases; + } + + private function buildWhereClause(AphrontDatabaseConnection $conn) { + $where = array(); + + $where[] = $this->buildPagingClause($conn); + + if ($this->ids !== null) { + $where[] = qsprintf( + $conn, + 'purchase.id IN (%Ld)', + $this->ids); + } + + if ($this->phids !== null) { + $where[] = qsprintf( + $conn, + 'purchase.phid IN (%Ls)', + $this->phids); + } + + if ($this->cartPHIDs !== null) { + $where[] = qsprintf( + $conn, + 'purchase.cartPHID IN (%Ls)', + $this->cartPHIDs); + } + + return $this->formatWhereClause($where); + } + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationPhortune'; + } + +} diff --git a/src/applications/phortune/storage/PhortuneCart.php b/src/applications/phortune/storage/PhortuneCart.php --- a/src/applications/phortune/storage/PhortuneCart.php +++ b/src/applications/phortune/storage/PhortuneCart.php @@ -1,11 +1,13 @@ purchases = $purchases; return $this; } - public function getTotalInCents() { - return 123; - } - public function getPurchases() { return $this->assertAttached($this->purchases); } + public function attachAccount(PhortuneAccount $account) { + $this->account = $account; + return $this; + } + + public function getAccount() { + return $this->assertAttached($this->account); + } + + +/* -( PhabricatorPolicyInterface )----------------------------------------- */ + + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + ); + } + + public function getPolicy($capability) { + return $this->getAccount()->getPolicy($capability); + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + return $this->getAccount()->hasAutomaticCapability($capability, $viewer); + } + + public function describeAutomaticCapability($capability) { + return pht('Carts inherit the policies of the associated account.'); + } + } diff --git a/src/applications/phortune/storage/PhortunePurchase.php b/src/applications/phortune/storage/PhortunePurchase.php --- a/src/applications/phortune/storage/PhortunePurchase.php +++ b/src/applications/phortune/storage/PhortunePurchase.php @@ -3,7 +3,8 @@ /** * A purchase represents a user buying something or a subscription to a plan. */ -final class PhortunePurchase extends PhortuneDAO { +final class PhortunePurchase extends PhortuneDAO + implements PhabricatorPolicyInterface { const STATUS_PENDING = 'purchase:pending'; const STATUS_PROCESSING = 'purchase:processing'; @@ -15,17 +16,15 @@ protected $productPHID; protected $accountPHID; protected $authorPHID; - protected $purchaseName; - protected $purchaseURI; - protected $paymentMethodPHID; + protected $cartPHID; protected $basePriceInCents; - protected $priceAdjustmentInCents; - protected $finalPriceInCents; protected $quantity; protected $totalPriceInCents; protected $status; protected $metadata; + private $cart = self::ATTACHABLE; + public function getConfiguration() { return array( self::CONFIG_AUX_PHID => true, @@ -40,4 +39,42 @@ PhabricatorPHIDConstants::PHID_TYPE_PRCH); } + public function attachCart(PhortuneCart $cart) { + $this->cart = $cart; + return $this; + } + + public function getCart() { + return $this->assertAttached($this->cart); + } + + protected function didReadData() { + // The payment processing code is strict about types. + $this->basePriceInCents = (int)$this->basePriceInCents; + $this->totalPriceInCents = (int)$this->totalPriceInCents; + } + + +/* -( PhabricatorPolicyInterface )----------------------------------------- */ + + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + ); + } + + public function getPolicy($capability) { + return $this->getCart()->getPolicy($capability); + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + return $this->getCart()->hasAutomaticCapability($capability, $viewer); + } + + public function describeAutomaticCapability($capability) { + return pht('Purchases have the policies of their cart.'); + } + }