├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── bower.json ├── demo ├── actions.html ├── index.html ├── store.html └── view.html ├── funk.html ├── index.html ├── package.json ├── reflux-core.html ├── reflux-core.js └── test ├── funk.html ├── index.html ├── some-actions.html ├── some-store.html └── some-view.html /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "5" 4 | before_install: 5 | - "npm install -g bower" 6 | - "bower install" 7 | - "npm install -g web-component-tester" 8 | - "export DISPLAY=:99.0" 9 | - "sh -e /etc/init.d/xvfb start" 10 | script: "wct" 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 devin ivy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # funk 2 | 3 | Polymer high-fives Reflux 4 | 5 | [![Build Status](https://travis-ci.org/devinivy/funk.svg?branch=master)](https://travis-ci.org/devinivy/funk) 6 | 7 | ## Usage 8 | Funk marries Polymer and Reflux by allowing you to use standard Polymer v1 data-binding alongside Reflux's stores and actions. It leverages the [`yarn-state-behavior`](https://github.com/yarn-co/yarn-state-behavior) to share state throughout your app. 9 | - Your **view** layer is Polymer. 10 | - Your **actions** are Reflux actions. 11 | - Your **stores** are Polymerized Reflux stores. 12 | - Views subscribe to stores via **Polymer data-binding!** 13 | 14 | ### What You'll Find 15 | #### `Funk.Reflux` 16 | An alias for [reflux-core](https://github.com/reflux/reflux-core) (identical to [RefluxJS](https://github.com/reflux/refluxjs), but without the React helpers). You'll find all the standard goodies on here like `Funk.Reflux.createActions()`. 17 | 18 | #### `Funk.StoreBehavior` 19 | The Polymer behavior used to create a Polymerized Reflux store. Enables data-binding from the store to your views. 20 | 21 | #### `Funk.ViewBehavior` 22 | The Polymer behavior used to enable data-binding to a view from your stores. 23 | 24 | #### `Funk.CollectionBehavior` 25 | The Polymer behavior used by `Funk.StoreBehavior` to provide crucial helpers for working with lists and collections. 26 | 27 | ### Example 28 | Check out the full [polymer-funky-flux](https://github.com/devinivy/polymer-funky-flux) demo or learn to use Funk by walking through this commented code! If you're unfamiliar with Reflux or the flux pattern, start reading [here](https://github.com/reflux/refluxjs) to see how it will make your life better-er. 29 | 30 | #### `view.html` 31 | ```html 32 | 33 | 34 | 35 | 36 | 37 | 48 | 49 | 50 | 73 | ``` 74 | 75 | #### `actions.html` 76 | ```html 77 | 78 | 79 | 85 | ``` 86 | 87 | #### `store.html` 88 | ```html 89 | 90 | 91 | 92 | 93 | 131 | ``` 132 | 133 | ## Docs and Tests 134 | [API docs](http://devinivy.github.io/funk) | [View demo](http://devinivy.github.io/funk/components/funk/demo/) | [Run tests](http://devinivy.github.io/funk/components/funk/test/) 135 | 136 | ### Locally 137 | The relative paths used in this project assume that `funk` will be included alongside its dependencies using bower. So, to test this repo and view documentation, a small amount of massaging must be done. Also, HTML imports require CORS support, so we must use a simple web server to view the tests and API-level documentation. 138 | ```bash 139 | bower install 140 | ln -s .. bower_components/funk 141 | python -m SimpleHTTPServer 8000 142 | # Now navigate to, for example, 143 | # http://localhost:8000/bower_components/funk/ 144 | ``` 145 | 146 | #### Documentation 147 | To view the API-level documentation for the Polymer behaviors, follow the process above then navigate to **http://localhost:8000/bower_components/funk/**. 148 | 149 | #### Tests 150 | Tests are placed inside the `test` folder and can be accessed at **http://localhost:8000/bower_components/funk/test/**. 151 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "funk", 3 | "version": "1.1.0", 4 | "keywords": [ 5 | "web-components", 6 | "polymer", 7 | "flux", 8 | "reflux", 9 | "state" 10 | ], 11 | "license": "MIT", 12 | "description": "Polymer high-fives Reflux", 13 | "authors": [ 14 | "Devin Ivy " 15 | ], 16 | "repository": { 17 | "type": "git", 18 | "url": "git://github.com/devinivy/funk.git" 19 | }, 20 | "main": "funk.html", 21 | "dependencies": { 22 | "polymer": "Polymer/polymer#^1.2.0", 23 | "yarn-state-behavior": "yarn-co/yarn-state-behavior#~0.3.0" 24 | }, 25 | "devDependencies": { 26 | "iron-component-page": "polymerelements/iron-component-page#^1.0.0", 27 | "test-fixture": "polymerelements/test-fixture#^1.0.0", 28 | "web-component-tester": "*", 29 | "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /demo/actions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Smell My Finger 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /demo/store.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 43 | -------------------------------------------------------------------------------- /demo/view.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 42 | -------------------------------------------------------------------------------- /funk.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 314 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | funk documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "funk", 3 | "version": "1.0.0", 4 | "description": "Polymer high-fives Reflux", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/devinivy/funk.git" 8 | }, 9 | "author": "Devin Ivy ", 10 | "license": "MIT", 11 | "bugs": { 12 | "url": "https://github.com/devinivy/funk/issues" 13 | }, 14 | "homepage": "https://github.com/devinivy/funk#readme", 15 | "scripts": { 16 | "build": "browserify -d -r reflux-core -o reflux-core.js", 17 | "release": "browserify -r reflux-core -o reflux-core.js" 18 | }, 19 | "devDependencies": { 20 | "reflux-core": "0.3.0", 21 | "browserify": "13.x.x" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /reflux-core.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /reflux-core.js: -------------------------------------------------------------------------------- 1 | require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { 668 | updated.init = function () { 669 | var args = arguments; 670 | composed.init.forEach(function (init) { 671 | init.apply(this, args); 672 | }, this); 673 | }; 674 | } 675 | if (composed.preEmit.length > 1) { 676 | updated.preEmit = function () { 677 | return composed.preEmit.reduce((function (args, preEmit) { 678 | var newValue = preEmit.apply(this, args); 679 | return newValue === undefined ? args : [newValue]; 680 | }).bind(this), arguments); 681 | }; 682 | } 683 | if (composed.shouldEmit.length > 1) { 684 | updated.shouldEmit = function () { 685 | var args = arguments; 686 | return !composed.shouldEmit.some(function (shouldEmit) { 687 | return !shouldEmit.apply(this, args); 688 | }, this); 689 | }; 690 | } 691 | Object.keys(composed).forEach(function (composable) { 692 | if (composed[composable].length === 1) { 693 | updated[composable] = composed[composable][0]; 694 | } 695 | }); 696 | 697 | return updated; 698 | }; 699 | },{"./utils":11}],11:[function(require,module,exports){ 700 | "use strict"; 701 | 702 | Object.defineProperty(exports, "__esModule", { 703 | value: true 704 | }); 705 | exports.capitalize = capitalize; 706 | exports.callbackName = callbackName; 707 | exports.isObject = isObject; 708 | exports.extend = extend; 709 | exports.isFunction = isFunction; 710 | exports.object = object; 711 | exports.isArguments = isArguments; 712 | exports.throwIf = throwIf; 713 | 714 | function capitalize(string) { 715 | return string.charAt(0).toUpperCase() + string.slice(1); 716 | } 717 | 718 | function callbackName(string, prefix) { 719 | prefix = prefix || "on"; 720 | return prefix + exports.capitalize(string); 721 | } 722 | 723 | /* 724 | * isObject, extend, isFunction, isArguments are taken from undescore/lodash in 725 | * order to remove the dependency 726 | */ 727 | 728 | function isObject(obj) { 729 | var type = typeof obj; 730 | return type === "function" || type === "object" && !!obj; 731 | } 732 | 733 | function extend(obj) { 734 | if (!isObject(obj)) { 735 | return obj; 736 | } 737 | var source, prop; 738 | for (var i = 1, length = arguments.length; i < length; i++) { 739 | source = arguments[i]; 740 | for (prop in source) { 741 | if (Object.getOwnPropertyDescriptor && Object.defineProperty) { 742 | var propertyDescriptor = Object.getOwnPropertyDescriptor(source, prop); 743 | Object.defineProperty(obj, prop, propertyDescriptor); 744 | } else { 745 | obj[prop] = source[prop]; 746 | } 747 | } 748 | } 749 | return obj; 750 | } 751 | 752 | function isFunction(value) { 753 | return typeof value === "function"; 754 | } 755 | 756 | exports.EventEmitter = require("eventemitter3"); 757 | 758 | exports.nextTick = function (callback) { 759 | setTimeout(callback, 0); 760 | }; 761 | 762 | function object(keys, vals) { 763 | var o = {}, 764 | i = 0; 765 | for (; i < keys.length; i++) { 766 | o[keys[i]] = vals[i]; 767 | } 768 | return o; 769 | } 770 | 771 | function isArguments(value) { 772 | return typeof value === "object" && "callee" in value && typeof value.length === "number"; 773 | } 774 | 775 | function throwIf(val, msg) { 776 | if (val) { 777 | throw Error(msg || val); 778 | } 779 | } 780 | },{"eventemitter3":12}],12:[function(require,module,exports){ 781 | 'use strict'; 782 | 783 | // 784 | // We store our EE objects in a plain object whose properties are event names. 785 | // If `Object.create(null)` is not supported we prefix the event names with a 786 | // `~` to make sure that the built-in object properties are not overridden or 787 | // used as an attack vector. 788 | // We also assume that `Object.create(null)` is available when the event name 789 | // is an ES6 Symbol. 790 | // 791 | var prefix = typeof Object.create !== 'function' ? '~' : false; 792 | 793 | /** 794 | * Representation of a single EventEmitter function. 795 | * 796 | * @param {Function} fn Event handler to be called. 797 | * @param {Mixed} context Context for function execution. 798 | * @param {Boolean} once Only emit once 799 | * @api private 800 | */ 801 | function EE(fn, context, once) { 802 | this.fn = fn; 803 | this.context = context; 804 | this.once = once || false; 805 | } 806 | 807 | /** 808 | * Minimal EventEmitter interface that is molded against the Node.js 809 | * EventEmitter interface. 810 | * 811 | * @constructor 812 | * @api public 813 | */ 814 | function EventEmitter() { /* Nothing to set */ } 815 | 816 | /** 817 | * Holds the assigned EventEmitters by name. 818 | * 819 | * @type {Object} 820 | * @private 821 | */ 822 | EventEmitter.prototype._events = undefined; 823 | 824 | /** 825 | * Return a list of assigned event listeners. 826 | * 827 | * @param {String} event The events that should be listed. 828 | * @param {Boolean} exists We only need to know if there are listeners. 829 | * @returns {Array|Boolean} 830 | * @api public 831 | */ 832 | EventEmitter.prototype.listeners = function listeners(event, exists) { 833 | var evt = prefix ? prefix + event : event 834 | , available = this._events && this._events[evt]; 835 | 836 | if (exists) return !!available; 837 | if (!available) return []; 838 | if (available.fn) return [available.fn]; 839 | 840 | for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { 841 | ee[i] = available[i].fn; 842 | } 843 | 844 | return ee; 845 | }; 846 | 847 | /** 848 | * Emit an event to all registered event listeners. 849 | * 850 | * @param {String} event The name of the event. 851 | * @returns {Boolean} Indication if we've emitted an event. 852 | * @api public 853 | */ 854 | EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { 855 | var evt = prefix ? prefix + event : event; 856 | 857 | if (!this._events || !this._events[evt]) return false; 858 | 859 | var listeners = this._events[evt] 860 | , len = arguments.length 861 | , args 862 | , i; 863 | 864 | if ('function' === typeof listeners.fn) { 865 | if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); 866 | 867 | switch (len) { 868 | case 1: return listeners.fn.call(listeners.context), true; 869 | case 2: return listeners.fn.call(listeners.context, a1), true; 870 | case 3: return listeners.fn.call(listeners.context, a1, a2), true; 871 | case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; 872 | case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; 873 | case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; 874 | } 875 | 876 | for (i = 1, args = new Array(len -1); i < len; i++) { 877 | args[i - 1] = arguments[i]; 878 | } 879 | 880 | listeners.fn.apply(listeners.context, args); 881 | } else { 882 | var length = listeners.length 883 | , j; 884 | 885 | for (i = 0; i < length; i++) { 886 | if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); 887 | 888 | switch (len) { 889 | case 1: listeners[i].fn.call(listeners[i].context); break; 890 | case 2: listeners[i].fn.call(listeners[i].context, a1); break; 891 | case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; 892 | default: 893 | if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { 894 | args[j - 1] = arguments[j]; 895 | } 896 | 897 | listeners[i].fn.apply(listeners[i].context, args); 898 | } 899 | } 900 | } 901 | 902 | return true; 903 | }; 904 | 905 | /** 906 | * Register a new EventListener for the given event. 907 | * 908 | * @param {String} event Name of the event. 909 | * @param {Functon} fn Callback function. 910 | * @param {Mixed} context The context of the function. 911 | * @api public 912 | */ 913 | EventEmitter.prototype.on = function on(event, fn, context) { 914 | var listener = new EE(fn, context || this) 915 | , evt = prefix ? prefix + event : event; 916 | 917 | if (!this._events) this._events = prefix ? {} : Object.create(null); 918 | if (!this._events[evt]) this._events[evt] = listener; 919 | else { 920 | if (!this._events[evt].fn) this._events[evt].push(listener); 921 | else this._events[evt] = [ 922 | this._events[evt], listener 923 | ]; 924 | } 925 | 926 | return this; 927 | }; 928 | 929 | /** 930 | * Add an EventListener that's only called once. 931 | * 932 | * @param {String} event Name of the event. 933 | * @param {Function} fn Callback function. 934 | * @param {Mixed} context The context of the function. 935 | * @api public 936 | */ 937 | EventEmitter.prototype.once = function once(event, fn, context) { 938 | var listener = new EE(fn, context || this, true) 939 | , evt = prefix ? prefix + event : event; 940 | 941 | if (!this._events) this._events = prefix ? {} : Object.create(null); 942 | if (!this._events[evt]) this._events[evt] = listener; 943 | else { 944 | if (!this._events[evt].fn) this._events[evt].push(listener); 945 | else this._events[evt] = [ 946 | this._events[evt], listener 947 | ]; 948 | } 949 | 950 | return this; 951 | }; 952 | 953 | /** 954 | * Remove event listeners. 955 | * 956 | * @param {String} event The event we want to remove. 957 | * @param {Function} fn The listener that we need to find. 958 | * @param {Mixed} context Only remove listeners matching this context. 959 | * @param {Boolean} once Only remove once listeners. 960 | * @api public 961 | */ 962 | EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { 963 | var evt = prefix ? prefix + event : event; 964 | 965 | if (!this._events || !this._events[evt]) return this; 966 | 967 | var listeners = this._events[evt] 968 | , events = []; 969 | 970 | if (fn) { 971 | if (listeners.fn) { 972 | if ( 973 | listeners.fn !== fn 974 | || (once && !listeners.once) 975 | || (context && listeners.context !== context) 976 | ) { 977 | events.push(listeners); 978 | } 979 | } else { 980 | for (var i = 0, length = listeners.length; i < length; i++) { 981 | if ( 982 | listeners[i].fn !== fn 983 | || (once && !listeners[i].once) 984 | || (context && listeners[i].context !== context) 985 | ) { 986 | events.push(listeners[i]); 987 | } 988 | } 989 | } 990 | } 991 | 992 | // 993 | // Reset the array, or remove it completely if we have no more listeners. 994 | // 995 | if (events.length) { 996 | this._events[evt] = events.length === 1 ? events[0] : events; 997 | } else { 998 | delete this._events[evt]; 999 | } 1000 | 1001 | return this; 1002 | }; 1003 | 1004 | /** 1005 | * Remove all listeners or only the listeners for the specified event. 1006 | * 1007 | * @param {String} event The event want to remove all listeners for. 1008 | * @api public 1009 | */ 1010 | EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { 1011 | if (!this._events) return this; 1012 | 1013 | if (event) delete this._events[prefix ? prefix + event : event]; 1014 | else this._events = prefix ? {} : Object.create(null); 1015 | 1016 | return this; 1017 | }; 1018 | 1019 | // 1020 | // Alias methods names because people roll like that. 1021 | // 1022 | EventEmitter.prototype.off = EventEmitter.prototype.removeListener; 1023 | EventEmitter.prototype.addListener = EventEmitter.prototype.on; 1024 | 1025 | // 1026 | // This function doesn't apply anymore. 1027 | // 1028 | EventEmitter.prototype.setMaxListeners = function setMaxListeners() { 1029 | return this; 1030 | }; 1031 | 1032 | // 1033 | // Expose the prefix. 1034 | // 1035 | EventEmitter.prefixed = prefix; 1036 | 1037 | // 1038 | // Expose the module. 1039 | // 1040 | if ('undefined' !== typeof module) { 1041 | module.exports = EventEmitter; 1042 | } 1043 | 1044 | },{}],"reflux-core":[function(require,module,exports){ 1045 | "use strict"; 1046 | 1047 | Object.defineProperty(exports, "__esModule", { 1048 | value: true 1049 | }); 1050 | var Reflux = { 1051 | version: { 1052 | "reflux-core": "0.3.0" 1053 | } 1054 | }; 1055 | 1056 | Reflux.ActionMethods = require("./ActionMethods"); 1057 | 1058 | Reflux.ListenerMethods = require("./ListenerMethods"); 1059 | 1060 | Reflux.PublisherMethods = require("./PublisherMethods"); 1061 | 1062 | Reflux.StoreMethods = require("./StoreMethods"); 1063 | 1064 | Reflux.createAction = require("./createAction"); 1065 | 1066 | Reflux.createStore = require("./createStore"); 1067 | 1068 | var maker = require("./joins").staticJoinCreator; 1069 | 1070 | Reflux.joinTrailing = Reflux.all = maker("last"); // Reflux.all alias for backward compatibility 1071 | 1072 | Reflux.joinLeading = maker("first"); 1073 | 1074 | Reflux.joinStrict = maker("strict"); 1075 | 1076 | Reflux.joinConcat = maker("all"); 1077 | 1078 | var _ = Reflux.utils = require("./utils"); 1079 | 1080 | Reflux.EventEmitter = _.EventEmitter; 1081 | 1082 | Reflux.Promise = _.Promise; 1083 | 1084 | /** 1085 | * Convenience function for creating a set of actions 1086 | * 1087 | * @param definitions the definitions for the actions to be created 1088 | * @returns an object with actions of corresponding action names 1089 | */ 1090 | Reflux.createActions = (function () { 1091 | var reducer = function reducer(definitions, actions) { 1092 | Object.keys(definitions).forEach(function (actionName) { 1093 | var val = definitions[actionName]; 1094 | actions[actionName] = Reflux.createAction(val); 1095 | }); 1096 | }; 1097 | 1098 | return function (definitions) { 1099 | var actions = {}; 1100 | if (definitions instanceof Array) { 1101 | definitions.forEach(function (val) { 1102 | if (_.isObject(val)) { 1103 | reducer(val, actions); 1104 | } else { 1105 | actions[val] = Reflux.createAction(val); 1106 | } 1107 | }); 1108 | } else { 1109 | reducer(definitions, actions); 1110 | } 1111 | return actions; 1112 | }; 1113 | })(); 1114 | 1115 | /** 1116 | * Sets the eventmitter that Reflux uses 1117 | */ 1118 | Reflux.setEventEmitter = function (ctx) { 1119 | Reflux.EventEmitter = _.EventEmitter = ctx; 1120 | }; 1121 | 1122 | /** 1123 | * Sets the method used for deferring actions and stores 1124 | */ 1125 | Reflux.nextTick = function (nextTick) { 1126 | _.nextTick = nextTick; 1127 | }; 1128 | 1129 | Reflux.use = function (pluginCb) { 1130 | pluginCb(Reflux); 1131 | }; 1132 | 1133 | /** 1134 | * Provides the set of created actions and stores for introspection 1135 | */ 1136 | /*eslint-disable no-underscore-dangle*/ 1137 | Reflux.__keep = require("./Keep"); 1138 | /*eslint-enable no-underscore-dangle*/ 1139 | 1140 | /** 1141 | * Warn if Function.prototype.bind not available 1142 | */ 1143 | if (!Function.prototype.bind) { 1144 | console.error("Function.prototype.bind not available. " + "ES5 shim required. " + "https://github.com/spoike/refluxjs#es5"); 1145 | } 1146 | 1147 | exports["default"] = Reflux; 1148 | module.exports = exports["default"]; 1149 | },{"./ActionMethods":1,"./Keep":2,"./ListenerMethods":3,"./PublisherMethods":4,"./StoreMethods":5,"./createAction":7,"./createStore":8,"./joins":9,"./utils":11}]},{},[]); 1150 | -------------------------------------------------------------------------------- /test/funk.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | funk tests 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 31 | 32 | 33 | 352 | 353 | 354 | 355 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | funk tests 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /test/some-actions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /test/some-store.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 101 | -------------------------------------------------------------------------------- /test/some-view.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 65 | --------------------------------------------------------------------------------