πŸŒ™ The minimal & fast library for functional user interfaces

Overview

Moon

The minimal & fast library for functional user interfaces

Build Status Code Coverage Slack License

Summary

  • πŸŽ‰ Small file size (2kb minified + gzip)
  • ⚑ Blazing fast view rendering
  • πŸ”¨ Purely functional driver-based design
  • πŸš€ Intuitive & consistent API

About

See the about page for more information on why Moon was created.

Usage

See the documentation.

Contributing

Check the CONTRIBUTING file for more information about this project and how to help.

Support

Support Moon on Patreon to help sustain the development of the project. The maker of the project works on open source for free. If you or your company depend on this project, then it makes sense to donate to ensure that the project is maintained.

License

Licensed under the MIT License by Kabir Shah

Comments
  • Rename Moon

    Rename Moon

    I've been thinking about doing this for quite a while now, but kept on pushing it farther and farther away. As much as I'd like to avoid it, Moon might have to be renamed. It'll give me more freedom to expand the community. Renaming Moon also has a number of advantages:

    • Smaller domain
    • Better SEO and visibility
    • Shorter NPM package name
    • Unique file extension (.moon is used by MoonScript)
    • Official Twitter account

    Upgrading should be fairly simple.

    • All development will continue on a renamed version
    • moonjs will be kept on NPM for all versions up to v0.11.0
    • All new versions (including alphas, betas, and RC's) will be put on the renamed version
    • The current documentation will redirect to the new one
    • This repo will redirect to the new project, which will have a note about this rename
    • All existing projects using Moon do not need to take action, but it is recommended

    I haven't decided on the name yet, but it should preferably have something to do with a UI library, be about four letters. I'm also open to any suggestions and will not rename it if someone can convince me not to.

    discussion 
    opened by kbrsh 54
  • Feature suggestions and a question

    Feature suggestions and a question

    Features:

    1. Make Moon#set chainable
    2. When data has member field1, make moonInstance.field1 a property, triggering Moon#set on assignment. This need not apply to arbitrarily complex data names. (I'm going to experiment with this a bit; I've already done a POC regarding the addition of arbitrary properties to a page framework.)

    Item 2 brings me to a question: if my application has (for example) flight segments to be rendered

    const trip = {
        segments : [
           { origin:"MIA",dest:"MCO",date:"09SEP17",departs:"0800",arrives:"0852"},
           { origin:"MCO",dest:"ATL",date:"09SEP17",departs:"1020",arrives:"1115"},
           // etc.
        ]
    };
    
    

    then what does the HTML look like to render that in Moon? (I couldn't make it work the way I wanted to in Vue, and mustaches don't seem to lend themselves to it.) Overall these frameworks seem oriented toward single-field renders or (at best) single-column data amenable to UL rendering. Can't quite get my head around complex data rendering for these things.

    feature 
    opened by jbmonroe 28
  • (Monx?) Within m-props that use the store, children don't get updated independently

    (Monx?) Within m-props that use the store, children don't get updated independently

    I encountered a weird case. It seems that with some element nesting and conditions, re render calls are not being made.

    In particular, when store.state.choice and store.state.prompts changes after store.state.accepted has changed once, re render does not occur:

          <c-button m-if="store.state.pendingAgree" m-on:click="agree" content="Agree"></c-button>
          <div m-if="store.state.accepted">
            <div class="normal-scene">
              <prompt m-literal:options="store.state.prompts" m-literal:choice="store.state.choice" m-on:choose="choose"></prompt>
            </div>
          </div>
    

    But, if I add an extra prompt at the end like so, both of them re-render when appropriate.

          <c-button m-if="store.state.pendingAgree" m-on:click="agree" content="Agree"></c-button>
          <div m-if="store.state.accepted">
            <div class="normal-scene">
              <prompt m-literal:options="store.state.prompts" m-literal:choice="store.state.choice" m-on:choose="choose"></prompt>
            </div>
          </div>
          <prompt m-literal:options="store.state.prompts" m-literal:choice="store.state.choice" m-on:choose="choose"></prompt>
    

    This can be seen in my reduced example repo: https://github.com/LeviSchuck/moon-rerender (for historic purposes https://github.com/LeviSchuck/moon-rerender/tree/2a2504e58bad9c192256bd2abd941456870d2304/ )

    Same code, just different index.html and index-works.html

    I think this is happening because it is only checking for changes on <div m-if="store.state.accepted"> and not its children.

    opened by LeviSchuck 18
  • How to use m-for in component template using Webpack

    How to use m-for in component template using Webpack

    All details are given in jsfiddle pls take a look

    JsFiddle Here

    my problem is similar issue #205 but with a little bit of difference. i dont get logic of m-for and item or every name we want and not item or item in items ??? list in lists or item in lists

    like moon exampls record in commits

    pls explain m-literal:list="list" too

    thanks pls help 😒

    opened by sadeghbarati 16
  • <m-insert> inside m-for

    inside m-for

    I just tried this:

     Moon.extend("ui:layout.row", {
                data: function() {
                    return {
                        d: [1,2,3,4]
                    };
                },
                template: '<div><span m-for="a in d"><m-insert /></span></div>',
            })
    

    and then:

    capture

    opened by rizrmd 13
  • Another

    Another "Uncaught TypeError: Cannot set property 'textContent' of null"

    This appears to be the same as #177

    I can't give a JSFiddle as this is tied to a back end framework.

    In any case, surely we should get something that indicates where the problem originates.

    moon.js:865 Uncaught TypeError: Cannot set property 'textContent' of null
        at diff (moon.js:865)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at diff (moon.js:926)
        at Moon.patch (moon.js:1942)
    diff @ moon.js:865
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    diff @ moon.js:926
    Moon.patch @ moon.js:1942
    Moon.build @ moon.js:1977
    (anonymous) @ moon.js:191
    setTimeout (async)
    queueBuild @ moon.js:190
    Moon.set @ moon.js:1770
    (anonymous) @ index.js:162
    self.emit @ uibuilderfe.js:434
    self.set @ uibuilderfe.js:219
    (anonymous) @ uibuilderfe.js:282
    r.emit @ index.js:133
    r.onevent @ socket.js:270
    r.onpacket @ socket.js:228
    (anonymous) @ index.js:21
    r.emit @ index.js:133
    r.ondecoded @ manager.js:345
    (anonymous) @ index.js:21
    r.emit @ index.js:133
    s.add @ index.js:241
    r.ondata @ manager.js:335
    (anonymous) @ index.js:21
    r.emit @ index.js:133
    r.onPacket @ socket.js:456
    (anonymous) @ socket.js:273
    r.emit @ index.js:133
    r.onPacket @ transport.js:145
    r.onData @ transport.js:137
    ws.onmessage @ websocket.js:147
    

    For what it may be worth, the index.js is:

    /*global document,window,Moon,uibuilder */
    // @ts-ignore
    /*
      Copyright (c) 2017 Julian Knight (Totally Information)
    
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
      http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    */
    /**
     * This is based on the default, template Front-End JavaScript for uibuilder
     * It has been changed to remove JQuery and use MoonJS instead.
     * 
     * uibuilderfe.js (or uibuilderfe.min.js) exposes the following global object.
     * Note that you can use webpack or similar to bundle uibuilder with your own code.
     * 
       * uibuilder: The main global object containing the following...
       *   External Methods:
         *   .onChange(property, callbackFn) - listen for changes to property and execute callback when it changes
         *   .get(property)        - Get any available property
         *   .set(property, value) - Set any available property (can't overwrite internal properties)
         *   .msg                  - Shortcut to get the latest value of msg. Equivalent to uibuilder.get('msg')
         *   .send(msg)            - Shortcut to send a msg back to Node-RED manually
         *   .sendCtrl(msg)        - Shortcut to send a control msg back to Node-RED manually (@since v0.4.8)
         *   .debug(true/false)    - Turn on/off debugging
         *   .uiDebug(type,msg)    - Utility function: Send debug msg to console (type=[log,info,warn,error,dir])
         *   .me()                 - Returns the self object if debugging otherwise just the current version string
         *   .autoSendReady(true/false) - If true, sends "ready for content" ctrl msg on window.load
         *                   If false, you will need to do uibuilder.sendCtrl({'type':'ready for content'}) manually
         *                   (e.g. in an app.mounted event)  @since v0.4.8a
       *
       *   All properties can be read using the .get method
       *   New properties can be added via .set method as long as the property name does not clash with anything internal.
       *   All properties (including custom) can have change events associated with them by using the .onChange method
       *
       *   Externally settable properties using special methods only
         *   .autoSendReady - see .autoSendReady method
         *   .debug         - see .debug method, also see 'server connected' control msg from server
       *
       *   Externally settable properties via the .set method
         *   .allowScript   - Allow incoming msg to contain msg.script with JavaScript that will be automatically executed
         *   .allowStyle    - Allow incoming msg to contain msg.style with CSS that will be automatically executed
         *   .removeScript  - Delete msg.code after inserting to DOM if it exists on incoming msg
         *   .removeStyle   - Delete msg.style after inserting to DOM if it exists on incoming msg
       *
       *   Externally read only properties (may be changed internally)
         *   .msg           - Copy of the last msg sent from Node-RED over Socket.IO
         *   .sentMsg       - Copy of the last msg sent by us to Node-RED (both data and control)
         *   .ctrlMsg       - Copy of the last control msg received by us from Node-RED (Types: ['shutdown','server connected'])
         *   .msgsReceived  - How many standard messages have we received
         *   .msgsSent      - How many messages have we sent
         *   .msgsSentCtrl  - How many control messages have we sent
         *   .msgsCtrl      - How many control messages have we received
         *   .ioConnected   - Is Socket.IO connected right now? (true/false)
         *   ---- You are not likely to need any of these, they are for internal use ----
         *   .version       - check the current version of the uibuilder code
         *   .ioChannels    - List of the channel names in use [uiBuilderControl, uiBuilderClient, uiBuilder]
         *   .retryMs       - starting retry ms period for manual socket reconnections workaround
         *   .retryFactor   - starting delay factor for subsequent reconnect attempts
         *   .ioNamespace   - Get the namespace from the current URL
         *   .ioPath        - make sure client uses Socket.IO version from the uibuilder module (using path)
         *   .ioTransport   - ['polling', 'websocket']
         *   .timerid       - internal use only
         *   .events        - list of registered events
     */
    "use strict";
    
    // Attach a Moon instance to html element with id "app"
    const app1 = new Moon({
        el: "#app",
        data: {
            startMsg    : "Moon has started, waiting for messages",
            feVersion   : '',
            counterBtn  : 0,
            socketConnectedState: false,
            msgsReceived: 0,
            msgsControl : 0,
            msgsSent    : 0,
            msgRecvd    : '[Nothing]',
            msgSent     : '[Nothing]',
            msgCtrl     : '[Nothing]',
            inputText   : '',
            updates     : {}, // devId: {updated,}
            homie       : {} // devId: {updated,}
        }, // --- End of data --- //
        computed: {
            hLastRcvd: {
                get: function() {
                    const msgRecvd = this.get('msgRecvd')
                    if (typeof msgRecvd === 'string') return 'Last Message Received = ' + msgRecvd
                    else return 'Last Message Received = ' + this.callMethod('syntaxHighlight', [msgRecvd])
                }
            },
            hLastSent: {
                get: function() {
                    const msgSent = this.get('msgSent')
                    if (typeof msgSent === 'string') return 'Last Message Sent = ' + msgSent
                    else return 'Last Message Sent = ' + this.callMethod('syntaxHighlight', [msgSent])
                }
            },
            hMsgCtrl: {
                get: function() {
                    const msgCtrl = this.get('msgCtrl')
                    if (typeof msgCtrl === 'string') return 'Last Message Sent = ' + msgCtrl
                    //else return 'Last Message Sent = ' + this.callMethod('syntaxHighlight', [msgCtrl])
                    else return 'Last Message Sent = ' + JSON.stringify(msgCtrl)
                }
            },
        }, // --- End of computed --- //
        methods: {
            // Increment the button counter
            increment: function() {
                // Increment the count by one
                this.set('counterBtn', this.get('counterBtn') + 1)
                let topic = (this.get('msgRecvd')).topic || 'uibuilder/moon'
                uibuilder.send( { 'topic': topic, 'payload': { 'type': 'counterBtn', 'btnCount': this.get('counterBtn'), 'message': this.get('inputText') } } )
            },
            // return formatted HTML version of JSON object
            syntaxHighlight: function(json) {
                json = JSON.stringify(json, undefined, 4)
                json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                    var cls = 'number'
                    if (/^"/.test(match)) {
                        if (/:$/.test(match)) {
                            cls = 'key'
                        } else {
                            cls = 'string'
                        }
                    } else if (/true|false/.test(match)) {
                        cls = 'boolean'
                    } else if (/null/.test(match)) {
                        cls = 'null'
                    }
                    return '<span class="' + cls + '">' + match + '</span>'
                })
            } // --- End of syntaxHighlight --- //
        }, // --- End of methods --- //
        hooks: { // Available hooks: init,mounted,updated,destroyed
            
            mounted: function(){
                //console.debug('app mounted - setting up uibuilder watchers')
    
                var that = this
    
                that.set( 'feVersion', uibuilder.get('version'))
    
                // If msg changes - msg is updated when a standard msg is received from Node-RED over Socket.IO
                // Note that you can also listen for 'msgsReceived' as they are updated at the same time
                // but newVal relates to the attribute being listened to.
                uibuilder.onChange('msg', function(newVal){
                    that.set( 'msgRecvd', newVal)
    
                    /** If we receive an MQTT type msg with topic 'homie/<deviceId>/...
                     * NB: MoonJS <v1 if needing to set whole topic, use the form:
                     *     instance.set("updates[homie/devId]", val)
                     *     e.g. no inner quotes
                     */
                    if ( newVal.hasOwnProperty('topic') ) {
                        let splitTopic = newVal.topic.split('/')
                        let devId = splitTopic[1]
                        if ( splitTopic[0] === 'homie' ) {
                            let homie = that.get('homie')
                            if ( !homie.hasOwnProperty(devId) ) {
                                homie[devId] = {'updated':null,'battery':null,'signal':null,'temperature':null,'humidity':null,'pressure':null,'light':null,'location':null,'online':'','count':0,'command':'','cmdUnit':''}
                                //homie[devId] = {'battery':null}
                            }
                            if ( splitTopic[3] === '$updated' ) {
                                homie[devId].updated = newVal.payload.replace('"','').replace('Z"','')
                            }
                            if ( splitTopic[3] === 'battery' ) {
                                homie[devId].battery = newVal.payload
                            }
                            if ( splitTopic[3] === 'signal' ) {
                                homie[devId].signal = newVal.payload
                            }
                            if ( splitTopic[3] === 'temperature' ) {
                                homie[devId].temperature = newVal.payload
                            }
                            if ( splitTopic[3] === 'humidity' ) {
                                homie[devId].humidity = newVal.payload
                            }
                            if ( splitTopic[3] === 'pressure' ) {
                                homie[devId].pressure = newVal.payload
                            }
                            if ( splitTopic[3] === 'light' ) {
                                homie[devId].light = newVal.payload
                            }
                            if ( splitTopic[3] === 'cmd' ) {
                                homie[devId].command = newVal.payload
                            }
                            if ( splitTopic[3] === 'unit' ) {
                                homie[devId].cmdUnit = ' (' + newVal.payload + ')'
                            }
    
                            if ( splitTopic[2] === '$location' ) {
                                homie[devId].location = newVal.payload
                            }
                            if ( splitTopic[2] === '$online' ) {
                                homie[devId].online = newVal.payload ? ' (Online)' : ' (Online)'
                            }
                            if ( splitTopic[2] === '$count' ) {
                                homie[devId].count = newVal.payload
                            }
                            //uibuilder.set('homie',homie)
                            that.set('homie', homie)
                        }
                    }
                })
                // As noted, we could get the msg here too
                uibuilder.onChange('msgsReceived', function(newVal){
                    //console.info('New msg sent FROM Node-RED over Socket.IO. Total Count: ', newVal)
                    app1.set( 'msgsReceived', newVal)
                })
    
    
                // If a message is sent back to Node-RED
                uibuilder.onChange('sentMsg', function(newVal){
                    //console.info('property sentMsg changed!', newVal)
                    app1.set( 'msgSent', newVal)
                })
                uibuilder.onChange('msgsSent', function(newVal){
                    //console.info('New msg sent TO Node-RED over Socket.IO. Total Count: ', newVal)
                    app1.set('msgsSent', newVal )
                })
    
    
                // If we receive a control message from Node-RED
                uibuilder.onChange('ctrlMsg', function(newVal){
                    console.info('msgCtrl received %o', newVal)
                    app1.set( 'msgCtrl', newVal)
                })
                uibuilder.onChange('msgsCtrl', function(newVal){
                    //console.info('New CONTROL msg sent FROM Node-RED over Socket.IO. Total Count: ', newVal)
                    app1.set('msgsControl', newVal )
                })
    
                // If Socket.IO connects/disconnects
                uibuilder.onChange('ioConnected', function(newVal){
                    //console.info('Socket.IO Connection Status Changed: ', newVal)
                    app1.set('socketConnectedState', newVal )
                })
    
            } // --- End of mounted hook --- //
        } // --- End of hooks --- //
    }) // --- End of app1 --- //
    
    // EOF
    
    opened by TotallyInformation 12
  • I love it

    I love it

    My only pain point is having to use foo.set() and foo.callMethod() to set properties or call methods.

    Can .set() be replaced with accessors, and callMethod() with actual method calls? That's pretty much the major difference on the API side compared to Vue.

    This is a bunch of extra verbosity that I'd like to avoid.

    The speed compared to Vue is really nice. What is fundamentally different about it compared to Vue on the internals that makes Moon faster?

    opened by trusktr 12
  • v1 documentation

    v1 documentation

    Until all the beautiful docs are updated, I figure it would be nice to have a place where the core breaking changes are documented.

    So far from looking at commits since mid August, I've observed the following:

    1. Moon.component is now Moon.extend
    2. instead of el, it is root when creating a moon app
    3. instead of the m-model attribute, it is now named m-bind
    4. Any plugins or other things that access the internal attributes like $children now use a version without $
    5. SVG stuff now just is called SVG instead of isSVG
    6. To say that an element is text type, it was TEXT_TYPE, but now the shorter literal "#text" is used

    There's a couple things that I don't quite know about, like dynamic and functional when it comes to component things.

    What other bumps are there in transitioning?

    docs discussion 
    opened by LeviSchuck 11
  • Problem using a Monx store with HyperMoon created component

    Problem using a Monx store with HyperMoon created component

    var testComp = m('h1', { attrs: {} }, { shouldRender: false }, [m("#text", { shouldRender: true }, store.state.selectedTool)]); // <--- Does not get updated
    
    Moon.component("foo-component", {
            render: function(m) {
                return testComp;
            }
        });
    

    Other components work well with the store. I have tried setting both "shouldRender" values to true, that did not work either. Any idea what I am doing wrong?

    bug 
    opened by kokujin 11
  • Import libraries to use in components

    Import libraries to use in components

    How should I be importing libraries for use in components?

    I am using the default template provided by Moon-CLI, but I have no idea how to import and use axios.

    Sidenote: it's hard to find answers to questions on the issues page because a lot of the syntax has changed since the question was asked. Is there an api doc somewhere that I don't know about with information on every available function that Moon provides?

    opened by MelonFunction 10
  • moon-cli qustion

    moon-cli qustion

    A few days ago I saw a video about vue-cli

    here the codes in video:

    Message.vue

    <template>
      <div>
        <h1>This is Great Message</h1>
        <app-input></app-input>
      </div>
    </template>
    
    <script>
      import Input from './component/Input.vue'
      export default {
        components: {
          'app-input': Input
        }
      }
    </script>
    

    can we use components: { } for naming the components in moon templates ??

    and something i see in video he wrapp all the thing to App.vue insead of index.html

    App.vue

    <template>
      <div id="app">
        <h1>{{ message }}</h1>
        <app-message></app-message>
      </div>
    </template>
    
    <script>
    
    export default {
      name: 'app',
      data: function() {
        return {
            message: "this is message"
        }
      }
    }
    </script>
    

    how can we use App.moon insead of rendering them in HTML file

    Main.js

    import Vue from 'vue';
    import App from './App.vue';
    import Message from './Message';
    
    Vue.component('app-message', Message);
    
    new Vue({
      el: '#app',
      render: h => h(App)
    })
    
    opened by sadeghbarati 9
  • How to reset recursive time driver

    How to reset recursive time driver

    I need to increase counter by timer, then go to another view goSeeingCounted to see result for further processing. Seems recursed timer is unstoppable. Any help?

    Example of code to be fixed (playground):

    const { div, p, button } = Moon.view.m;
    
    const goSeeingCounted = ({ data }) => {
      return {
    	  data,
    	  time: undefined,
    	  view: <viewSeeCounted counter=data.counter/>
    	};
    };
    
    const viewCounter = ({ counter }) => (
    	<div>
    		<p>{counter}</p>
    		<button @click=goSeeingCounted>Create</button>
    	</div>
    );
    
    const viewSeeCounted = ({ counter }) => (
    	<div>
    		<p>Result: {counter}</p>
    	</div>
    );
    
    const tick = ({data}) => {
      let newData = {
    	counter: 0
      }
      if (data !== undefined) {
    	newData.counter = data.counter + 1;
      }  
      return {
    	data: newData,
    	time: { 1000: tick },
        view: <viewCounter counter=newData.counter/>
      };
    }
    
    Moon.use({
    	data: Moon.data.driver,
      	time: Moon.time.driver,
    	view: Moon.view.driver("#root")
    });
    
    Moon.run(tick);
    
    opened by mrEvgenX 3
  • Fix environment variables on Windows

    Fix environment variables on Windows

    Summary: when you have installed and run the dev script in a Windows environment, you get an error message. This is because Windows terminals does not accept NODE_ENV="development". The package cross-env can be used to solve this.

    Suggested fix: Add cross-env to the generated package.json file and modify the scripts. "scripts": { "dev": "cross-env NODE_ENV=\"development\" webpack-dev-server --config webpack.config.js", "build": "cross-env NODE_ENV=\"production\" webpack --config webpack.config.js" }, "devDependencies": { "cross-env": "latest", ... }

    opened by lejonmanen 1
  • Any thoughts on hydrating data with SSR?

    Any thoughts on hydrating data with SSR?

    Hi:

    Any thoughts on hydrating data when creating an SSR rendering. I'll love to have an express server generating on server side the complete view (Maybe i'll use puppeteer - https://github.com/puppeteer/puppeteer). Where should i hydrate the data? from my simple understading i believe something like this could work:

    Moon.use({
        data: Moon.data.driver(window.ssr.moon.data || 1)
    });
    
    Moon.run(({ data }) => {
        console.log(data); // => 1
        return {};
    });
    
    
    opened by ray-delossantos 3
  • Common Editor Support for Syntax

    Common Editor Support for Syntax

    So I went through the tutorial and while a lot of Moon is very JSX / React-like, there are certain things (like the <for> in Moon, which are very different. This can cause some strange issues in code editors that are unaware of the element.

    If Moon is a serious development (which it appears to be) then creating some add-ons for syntax support for common editors (Sublime, VSCode, etc.) is likely a good idea. I did a search on the VSCode marketplace and didn't find anything. I've never personally build a syntax highlighter for VSCode yet, but I would be willing to look into how and perhaps start the project off.

    opened by jhechtf 5
  • Moon v1 Roadmap

    Moon v1 Roadmap

    After a few betas, I think it's time to lay out the final list of features or changes that still need to be implemented for the next release.

    • [x] Moon Executor

      • [x] Perform view and diff phases over multiple frames.
      • [x] Perform patch phase in one synchronous batch.
    • [x] Allow custom children to be set on data.
      Example:

      <div children={ children }/>
      
    • [x] <if>, <else-if>, and <else> components.

    • [x] <for> component.

      Example:

      <for={ $item in items }>
        <p>{ $item }</p>
      </for>
      
    • [x] Hoist static data, events, and children.

    EDIT: This roadmap is outdated. The API referenced in this issue description has had a significant overhaul and is being iterated on! The current beta documentation is at moonjs.org.

    discussion 
    opened by kbrsh 33
Releases(v1.0.0-beta.7)
  • v1.0.0-beta.7(Feb 8, 2020)

    • d372611f73ad9ae1af53d51c23b34a117e8bedcf: v1.0.0-beta.7
    • 48a8018fb24a0919d66a754fd0f137935a1c3779: update run error messages
    • de121d8f212ee3543aca4547e1b7d6127275c95f: update test for new error message in node
    • 2056f4a5ae9d73d00ec44efb69a098ca88ba2dc8: inline whitespace grammar
    • c4a2493541bdf200e0100bf5165d307c8961e135: 2020 headers
    Source code(tar.gz)
    Source code(zip)
    moon-browser.js(16.76 KB)
    moon-browser.min.js(6.04 KB)
    moon-cli.js(8.40 KB)
    moon-cli.min.js(4.81 KB)
    moon-compiler.js(15.33 KB)
    moon-compiler.min.js(5.17 KB)
    moon.js(27.04 KB)
    moon.min.js(6.00 KB)
  • v1.0.0-beta.5(Jan 7, 2020)

    • 5ccfee4b109265577fe66a497183b2235bf021ae: v1.0.0-beta.5

    • e44f47512ed63663247c9807189214c248aa4f82: update links

    • 377ae058e179b45f1111cfebab66608aa1c5b7d1: use cached storage

    • 2ee7ae954b0c7d2d70e6a7723965b4b05627a11b: add storage driver

    • 4bdd7b1ce06d9eea2f7f861c3512ae9df9f0d9d3: no comma dangle

    • e8d6cb75088bc6ae11ffd5a665613b1cae52fad5: explain parser and add test case for escaped comment delimiter

    • dd8fa7fc27e34c943335e6259b848a4b7b7f7a95: new syntax for nodes and comments

    • 1713d3a15ee6d730f1b802be855b41d03319bfe8: new license link

    • 49d38ac77164792cae6ee1faf4f14cdb0452fff2: add route tests

      100% coverage!

    • a9d5cce70d0f6639aee7056737a374543609f637: refactor browser

    • 5c8189fbf62f497469d8e730f678109ab227c431: revamp parser & generator

    • a32f80f395ea53bc4a3d608b7158605c084e115c: add test for failed cleanup

    • b94ea11501a9e4ce8dfda6613f6b15bfc37278b4: add test for failed child process execution

    • e01b9a6b7a4753cd317b2de62d86f808628fa3b5: add test for failed download in cli

    • cf8488b1417db6a3fba9d57f3dc677e63ad6e6a8: add tests for failed http request in cli

    • 9be5cc445dba78096366a0804e4f2fc2e09d6402: add tests for invalid http status codes and fix error messages

    • 8ca450588f3b5319ccff498db66204981798058e: add cli tests for basic errors

    • 50dcfc90cb640a36e8c2a1164c5f304d69596b47: update comment on how view driver works

    • 67a08cf27a60dc15d5686bbf122545cf1b6336e8: replace ariaset & dataset with attributes

    • 1eace0892cfc14b0850e4712d58fdc3f0c55d6fa: use pad instead of repeat in cli help table

    • 06521d673241d8664dff76224ae22b329c010f7a: refactor main build script

    • 4af1e8cb27254e0b5c98533b1288e08b368a11f7: refactor release scripts

    • 834d64b26ceec9fc6699c44c0a315da98e176dcd: use stat over lstat

    • 0bb77dd5a51aa4dabd1a63997e4618d431d8bac8: add cli tests for create command

    • b04209566ae0560f501a22069d869c03355d5dc9: update file size

    • 2c97a773fb53a92e4f53a897aaaf915f4ae2a11b: add basic cli tests and remove perf tests

    • 7f44befa982362935135df79ff91915ab8c9e8f0: match package readme to descriptions

    • a04365c03283ba2718c19311fb2b65c02a622329: remove mvl

    • b030ccbf71ee142416fd52ef555b7cdebeb43f09: add version property to all modules

    • a8b1c9672740b38759b593abdbd73301fbb26cc0: change order of gitignore

    • 018cd3e96409dd5faa428f4957a16ac52a869449: update descriptions and keywords

    • 0851dd3935664a2184b811ae920f16eb3c256512: consistent spacing in switch statements

    • 6cc066bc251fbc3ff26929156cf34d678f07f598: consistent error messages: failure of -> failed

    • 253e22d389eda91a1bdfcde720d1a3c405eed523: handle filesystem errors in cli

    • 6170ffcb8c82918d3024c5b0f3802e8fbccc0735: handle all http errors in cli

    • c43353b4e3679e558b2f96b71e99eaa53f809e83: refactor router

    • 989e74957cc93565a49bdb0701956fda89df4d7c: route driver

    • b842b292e1f8a0894b9bb9864d6d34564dd3f1e1: refactor moon cli

    • 7b391f8e8cb50fb4240daa3f4346637446e5987a: style attributes -> style properties

    • 8f528afc9d77df7977d3e4f3b1a4204912886416: hoist value when creating nodes and blur without check when removing focus

    • e7a7cd9ab427be89cb7efee70df86dfe0401d770: new view patch children storage

      Children are stored in Node.MoonChildren in order to optimize access of the DOM (such as childNodes or firstChild/nextSibling).

    • a2ffd83075ee21b3574fdeb52ff6747b11ba149c: move diff equality checks to children

    • 8a63274d05af0f23b62551029702de241ad98f9e: remove extra check from view driver and use terser

    • 1e65d811b8d3685aa935a44771966701db1383e7: escape unescaped string characters in text correctly

    • af10f7d57b4cfd27809c10ec7ee51df0c7e59410: remove special diff case for text

    • 06b5d0f2fdd733b4bd3ed00567584972e9f90b7c: generate node creation functions in a loop

    • 8bb1eb2d55ca760ce25accf0a14121ed2abf2299: update perf test

    • 1d453bbedf47bc2d82bcef18cbeea7735d448df2: declare all view functions manually

    • 3cddda08709bda8f090ffa8b02ae1ebcd1ef093e: allow escapes in text and optimize whitespace

    • a112d53ae9261feb91499b5253a104513fc5e7ad: refactor generator

      Some things can be assumed by looking at the grammar. Blocks can be expected in node children and node data as an expression. In these cases, it is now assumed that they are blocks, and they are generated without surrounding parentheses.

    • 981c575d68c03b21f6128e9c085573436b9bdc4c: new MVL, compiler, and router

      First, this change involves a refactor of some of the module structure of the code to be consistent.

      Next, there is a new Moon View Language (MVL). It has three types of nodes:

      • Node: A node that is equivalent to the contents of the expression within it, analogous to a variable reference.
        • <{node}#>
      • Data Node: A node that is equivalent to a function call that can call a function with an expression directly or attributes to represent an object.
        • <{node} {data}/>
        • <{node} foo="bar" bar="baz"/>
      • Data & Children Node: A node that is equivalent to a function call with attributes representing an object along with support for children, which can include text, dynamic text blocks, and other nodes.
        • <{node} foo="bar" bar="baz">Text {dynamic} <node#></>
        • <p>Hello Moon!</p>

      This means that all nodes must now be functions, so Moon.view.m is now an object with keys being HTML elements and a special text element which takes a value data property. All elements must then usually be imported or declared at the top of files.

      The new parser uses parser combinators and comes with better error reporting that displays the line of the error, the surrounding lines, and the exact position where something was expected. It also supports full JavaScript syntax along with MVL, without needing parentheses around nodes.

      The new generator is much simpler and only generates function calls or variable references as appropriate for the node type in question. It doesn't do any static function call optimization as the nodes can be dynamic at any time. This can easily be done by the developer and included with a reference using a normal variable reference node.

      Lastly, work on the router has started. There is a simple file structure set up, a basic driver that changes the route using the history API, and a basic Link component that creates a elements with the data provided. Nothing fancy for now.

    • b56a09ef7523122aa5638dfa025f6b7a687e9dcc: fix options terminal highlighting in CLI

      The options regular expression matched anything starting with a dash. This makes it so that a word must start with one or two dashes and a word must start with an opening bracket. There must be whitespace separating them.

    • b055b9af0d7f177522c4261e89279e3605b16cdf: remove extra break

    • 71c13a67f63379d17b5077a9d7400eb168eda43b: improve CLI UX

      Adds CLI commands, including a help command capable of displaying help messages for individual commands. This will make it easier for people to directly install moon-cli and work with it without having to reference the documentation for the previous simple but obscure behavior. There are now three commands, moon version, moon help, and moon create. They all have error messages and help messages to guide users through the process of using them. moon create now accepts the template as an option rather than a positional argument, using the -t or --template option instead.

    • d9cb7a7b699ffbcf417fe23d31c050b88faafbd9: add tests for multiple HTTP requests

      The HTTP driver can send multiple concurrent requests, but can only receive one at a time. If JavaScript were ever to get true parallelism, one could use multiple HTTP drivers to account for multiple physical network ports that could receive complete HTTP requests at the same time. This adds tests for sending multiple requests and receiving them individually.

    • 6eb90108a1a7315af38e3b5da21da386b39a9ace: make HTTP request headers optional (#260)

      Extra HTTP request headers are usually not required. This change makes them optional and makes it so that the HTTP driver only requires the url field to perform a request. This also adds tests for using default HTTP requests that are both successful and result in an error.

    • 98389563bac4ed2902adca3ccceff4166eb5faf6: make HTTP request headers optional

      Extra HTTP request headers are usually not required. This change makes them optional and makes it so that the HTTP driver only requires the url field to perform a request. This also adds tests for using default HTTP requests that are both successful and result in an error.

    • 3d7174ef65a7904f3b50cc5de6a6353cfa391547: use consistent event for moon browser XHR (#259)

      In the HTTP driver, the onload event is used rather than addEventListener. This PR refactors Moon Browser to use the same method by using onload along with an arrow function to clean up the event handling code that adds the listener.

    • aab846f61f39f11553acab1954c57ae9ef505898: use consistent event for moon browser XHR

      In the HTTP driver, the onload event is used rather than addEventListener. This PR refactors Moon Browser to use the same method by using onload along with an arrow function to clean up the event handling code that adds the listener.

    • 855db29282ead7b0376c82e0abd056bc1729a73e: add basic http tests

      This includes tests for a successful load event and an error event. It currently provides every single parameter, including optional ones. However, it does test that the request/response headers and body are sent properly using a mock XHR implementation.

    • b13176af6d9acd20bb5ea73bbdbbfdf9720f143b: add basic http tests

      This includes tests for a successful load event and an error event. It currently provides every single parameter, including optional ones. However, it does test that the request/response headers and body are sent properly using a mock XHR implementation.

    • 1797a44ac8d538a66bd5d3e50ae60112df33261e: http driver

    • 3bdb6cfafb181cb8669731a1919e373654f46ff8: add tests for browser

    • 36108566b3fa4a0d7ae6b3830dd525bbb3cc045b: remove initial data option from data driver

      This is a change to make drivers consistent. They should only be an interface between an application and the browser. In this case, the browser would have a way of storing things in memory (a variable), and the data driver provides an interface to changing it. This means there should not be an initial data option.

    • 8cd670ecb04e51225345ad9a8083d85ce2ebdeb8: add tests for focus

    • 3a71f9f239ab199bbb12b8b18683fad790169745: add focus attribute

    • 6597ae0823fffab999737d832c8449f7ee3269d7: use switch statement for setting properties

    • 192e96da91050930c677c1dae775867ff735748f: allow components to have uppercase letter anywhere

    • 9eb9e171d2f0ba7a94f6022b64785bd9a212bcf2: add time driver

    Source code(tar.gz)
    Source code(zip)
    moon-browser.js(16.80 KB)
    moon-browser.min.js(6.08 KB)
    moon-cli.js(8.41 KB)
    moon-cli.min.js(4.82 KB)
    moon-compiler.js(15.37 KB)
    moon-compiler.min.js(5.20 KB)
    moon.js(27.12 KB)
    moon.min.js(6.01 KB)
  • v1.0.0-beta.4(Aug 9, 2019)

  • v1.0.0-beta.3(Aug 9, 2019)

    • d2d94fba067ddd4f42f0c18c39f722602618e0fc: v1.0.0-beta.3

    • 623adb62fe4c2cd6046c449654738f70ab6e9658: print test results prior to release

    • 5fabdcb093482bd0bf6b1d548e00a718c10d2ff1: update cli logs

    • a42150c98c1538f7022246bb57e4c7d78422df58: preserve lines

    • 068479a3d27fa45dcb5233e572b3d47dea2af840: end sourcemap

    • 69dca4684c49046ff0f96706967e1b09b2a6b9d5: begin sourcemap

    • ad18b76dd526128cb5ce1319013f542ac01feeb6: remove type field from view nodes

      This removes the type field from view nodes and removes normalization from nodes during compilation. It prevents inconsistencies when using data fields in default components because they won't support the "class" -> "className" or "for" -> "htmlFor" transformation. Instead of that, the whole concept of types was removed because it was mainly to distinguish between components and nodes, but now it isn't needed. Instead, the type field is gone and the patch checks for name === "text" instead. Also, there are individual checks for "class" and "for" that set, update, or remove their corresponding properties.

    • 8165998c187b88f554de82772a47afdb7885db11: consistent modules

    • c7f2afc344dfc1f3127fcf2f0f304e3d9d670b94: simplify API and file structure

    • 3417a73fa679b98ee81f33e6d3bcf016110ff03b: update comment wording

    • b9ac3efb23402212c27eceb1395166c8405ef4f3: optimize static expressions

    • 20a507667fb11cac54762f0989083e6c58a9e3a7: allow whitespace in parens for views

    • 4dc96309856baba41b33cfba9aa41219eb2a1fb8: allow views in nested parens

    • 392dc0df15571f81408c8159cbb502ee6bf832d1: add quote type

    • 21120f6c5b80c4125bf7f262fa21cc73f1151339: load all scripts in order

    • fcee45fdaadf3b03e9846874cb0358b05554619c: update package READMEs

    • 16a7af7e672718fa377c6d2eb8803671fb290161: fix version in builds

    • 265252ed8145ffc75c227ca3232ce1b0074fcfbc: functional driver-based design

    • 88a997e119ae1faadffa3d7db810959700bf25a8: add node constructor in perf test

    • b1dc9c81da08cc396b73b8176da2fd33f1e183de: update comment

    • f9137b1419d048526e13f093b49c90ddf8091e6c: one-phase executor w/ event batching

    • fe4bc0ae7860deed60a6c128365fe643a06127c3: make component execution preserve immutability

    • a5bcd3b0f23970db752c91f99e5a940c254befcf: test locals against globals and existing locals

    • b9a219d02b0723fa3dfebcbe63b61e5a0234b46c: use child function for loops

    • 6c7dd9a45208dcd8f8bee3e0fdbd919418c0399b: keep track of locals and remove need for $ sigil

    • ea86567aa7cfadf7c3037892b4239ece32d09b62: make function global

    • e5583f09b3ba8180bb070775b78a5577ed078647: lex names manually and fix extra increment

    • 87e22227e2b318b15c8ad3954754d3d9d6f5364c: store DOM node in remove property cache

    • 2dabfc1515cc9f6d30cf52d766130befbd5a5377: exclude wrapper from coverage

    • ddc200767815a4b7efe2b624468b45221c260cdc: fix static children skip & add time slicing tests

    • 0ab04ab9f274b7daf33b3be726cf4e101e997610: remove unneeded id

    • 6d63f65bbb0e882751cec8174bd1885d3b6336e8: add index tests

    • 8fbc9f78e2fd758eed410ebe6539f66ff0cf89ea: clean up for element generator

    • 47a9c7d8575686ec970bb9e4810b659e66b76a90: executor fuzz tests

    • 124671c20244ebd1621848196426ae86704d5d91: prefer 'in' check vs undefined

    • a76be1e07e1575a4f04a9ff8d0547dff1634acf9: build

    • c299d0310a5abfe016f40552c39843bcdeb01290: remove data property by setting to default value

    • 4945a16dcdad9b2fdb91f819f8dd513e95de637d: fix replaceChild & removeDataSet

    • c6b5e19e3de7d2ec87d94fe7b9f5045ffcca6eda: finish assertions for executor tests

    • a5fc4cfc1c9acac20f4950bdf66d2e3c35683574: executor test suite

    • 1354e5e46a2448bc8405c0813657722695e34e29: allow using children data and attribute

    • 99b1e6f2a6db620b77cbb5118257310087270dac: execute created components, format with tabs, and use const

    • 5cc1f99c8935e8ff5cbaff05178a024a939b8422: reuse static nodes

    • df0df7a745ac32041732e0bed73279fc2b65a668: static element nodes + generator tests

    • 3ed1572f13a19eda669e66e9376c1d14b104fee1: update contributing guide

    • 6b49118fc2f39061dd78eea967396fd965b7b519: don't merge default data on root components

    • 889a778014200be0e4860536a76036bf31265b8e: update summary

    • 00a2e6e654a3243e873b6ad3f2f8e01aaef69b62: diff-patch executor

    • ee07a2129fbc2599f46135d675d46ae834721f73: fix executor queue

    • 9e3d9c8ec41dbf61e1b239ed2e100836cd8dcc98: larger logo

    • b29c2b2c464be43d919c2fcc8d48f9981cfcbfba: clean up readme

    • e009757bf1d92ad5eca9c69aaeb461331b8c7a9e: only require static children to prevent double optimization

    • 87fa3a31c6d55474a76649c16533f582fdb2c337: consistent ordering

    • c260207545d32ad609aeebedb68384ac5630b8ab: add moon DOM properties to node prototype

    • b746b3a7bcfa8de78d1753e23d6b18b09875a84c: eager remove data from queue

    • 6069201ab0daabb7957e04b5e96dd922185aefb2: remove source from perf

    • d600a18bc85ad611254e0a2ef775f41f43dd2660: remove view current

    • b3af5f2769a56f62cb9fda9131f186c2bff6555d: update jsdoc comment

    • e9a7ec46d06d667aa8de84d1013d955ea15bfb65: append performance

    • 749adf329b928e7ec414ad19702de0e224ede97b: remove wrong map in empty loop

    • dd31f99cbae6b264c416536e1e37632400d43f6e: use generator variable for loop iterator

    • 24c2e812cd080de3b6c8cc7db4d18d2c93ec970a: optimize object lookup

    • 8608982070db336c78541be74ab5b9e7dbfc69e5: consistent comments

    • 0819ef26f2a710c16033e60288ce6278282925c7: view = component(data, children)

    • 816f1bf5d64e8486a7032440169f9cf1b86f5a4f: use constructors for nodes

    • 808ff5067dd5bb8b59860b1a4e49ec8cf9564ea1: view-patch executor

    • 0c3a1a893ad3e16740a70ef4f1fc2e4cc3962fd5: update with default data

    • 16cbc7c9aee83690c595168bab4839b8bfe97dbe: cleaner API

    • 7c1ae49f77a65c25c419cf9d20b8550c93d0ee1a: inline defaultObject

    • a6689e82be52c65216242ee4b54c1a15d616713e: add event listeners when needed

    • 8dca414c93b2e0c7f5a8b80096be095eea830081: compare type and name for replace node

    • 03ced07231899f06945b5f5ca48dc82356070ec8: two phase executor

    • c61e423649b631c826c4afbc8b2beda607da14bc: optimize default object

    • 1a75f8aa4fe04ac87df47eec987e1e24829d2ad9: customize wrapper in & refactor lexer

    • 26ce80d98004ca7632eae1c80c8eecceba8893e0: refactor set attribute updates

    • a8ff72514ede8318c5881e73388afa8633aeb6e7: state based attribute lexer

    • af0a86e50be45d0862e7851c598afc61376a3b81: allow nested text expressions

    • 45ad76fef9b8567a31b05b01308d8c57dddd9530: allow nested objects in attributes

    • 9ab1f3c4ff487c95cbce77a2c49e75701193898d: support ariaset, dataset, and style attributes

    • c27bac38987c656582ab2193ab4b04f1deedb356: remove *bind

    • a4a21b4dda34f46fdcddda31cb76494ef38823b3: refactor lexer attribute conditions

    • 39af32c60bd870e4bbe36c465f256bbbdd244ebb: add *bind syntax

    • 1bf16e8105336e29a90dd79ea5f4cafc2bb46dca: consistent check for events

    • 96280adc512a71016c6d334e7b21e46e0963759e: use className in MVL

    • c206837d6b3b1bf620b801e0c025e1171e5aafc1: prefer to use DOM properties

    • 7e4ea03ebb4a9bc49b4a40c27cede1b146e6a013: optimize event attribute check

    • 9d40f81cb472ea3ed2b2d81f60e5733252b166a2: require event handler name and call with (event, data)

    • 5d5b8893d130fe6634258a2ae5b4ece30d93787d: use an object instead of an array for static nodes

    • 06cc9e38c90ec0fa628d09bd0f69f28df812970e: use data instead of textContent

    • 3bacbfd9d5931cbc98e72a9c9b35ff9eccf56545: start renderer with old attributes

    • 4d0e4b318e23692576c799170ede26f955740673: allow for more flexible mvl with space attributes

    • 38ea007e8c112fc38bbbcbc2820d064aac9fcbb2: refactor variable

    • f17f8c8a64f444a8d71238a12f12d1bde34d0a6a: use new attribute shape in mvl

    • af9c57d713fbd8a73db4e5b5752d37627bd97bb4: fix if clause condition duplicate bug

    • 9b4d6083463ac0f048e9d12af2588b7b77ad3b08: identify static attributes correctly

    • 1b21a0fc26394a3496c451bb19b8294c94108e55: add Moon.get

    • 7f9e660d120ccff511970ec6f7cb60310a8493e7: remove old attributes

    • 65eaffec4d6178bf6b6fc85c4d31e2f3cfe443a1: only update text if changed

    • 7b0542dbc546edb40e70513e79e6eb6a2c8a597d: escape text in lexer

    • 68925af984c109b779723aed4f8936d897c3464d: refactor error

    • f21f30f3401f67be3046cf05cf32aa2335852a75: require the root option if the component is "Root"

    • 099e60f25f8a43eae2e6dabe16f7b2037781eb89: use development Moon for MVL compiler

    • 69e6eec2eb19ce2702dfc458503a6bb0363d015f: don't add classes to components

    • 6c320cdb76f3dc76b7ccaddf02c358be32517e1e: enforce dot notation

    • ae20fdb4d94d01e9d91278aa60150fd1f302c453: use dot notation

    • 421a473b522237e3da703fdb243ffa4504fc3a8f: consistent naming from type -> name

    • 6b46e79de53ce219593f4686d40476213dced463: update events

    • 5c90cc536d1c5efde9a1318a68bd5a47c1643372: local static nodes for each component

    • 426714c73c3576542b2c0281c2cdbb0d30842806: custom hot reloading no longer required

    • fb3098df13f7c4ce578d39921d70bc5d6c641ae0: correct hot module reloading code

    • 4f643dcae22ee41bcaa5fb7870f4c1b72ead7bb2: lex before parse and use correct addClass reference

    • d09376d7ef7fcbe72387af410011638b0647189d: executable comment build

    • 9ccab573edf625b0656d1f5b30297070270c3cd4: allow executable packages

    • 7cdab52265e882301011199ae546860420edcd22: use cjs for mvl

    • ed927216d6674982e1ebb83f8baae4aa26268f04: build transforms

    • 66dadb6c9d491b6822e4a9fb335f82a7454a551c: use modules for moon MVL

    • 72c9bdcb21b3bd572ef0ffe8f0982a758b2a8423: update MVL compiler for new Moon

    • 2dac09053345c1e53095dd23f10c494db1e6425e: use convention for moon cli

    • ae0fdb077fb259a46ae15dcebcd6e00f37e71a66: add object shorthand eslint option

    • 0cd9a4a82f026ab276360068134ab40de04b28d0: use hoist optimization in diff phase

    • cd5eb0db7070d3f3863288f5148d7053b3fba7e5: add parser test for invalid children

    • dd0ced2383206f41ce1fb8d90a53137561345fbb: add lexer event tests

    • 1fff58789e26b6990ea4a3881272286281ea9291: fix tests

    • 27f93c858cb13393a1badfcbf8ce41b8a9f0d589: prefix default array loop iterator

    • 287aa85b33059ea539cf2712c667d6d8fc41a51f: hoist static nodes

    • acd98dc9e7a5224f72185f03d3a5c0d1611c39f6: add support for boolean attributes (fixes #238)

    • a51aced39c80f98284d4de1daa5b591734cf8692: allow key/value options in for element

    • dc07891c9bd2dbab2bfd7da0b7664d70132a29fb: add support for empty attribute values

    • 66a82f4a6e177abb3be24a448c932fb9cc8cebbe: use $event local

    • b823ad53690b3f55b0ada54245b66d7720c98f4e: iterate through if siblings correctly and fix empty else clause text content

    • e74b36d79bb0ea1f7efdc1b66020e59a2a740eb9: add for element

    • f071af6bf6a5fb73934fa1c12a553db75f0de981: remove fragments because they have no parent node

    • 61da3cfc63f1ff133f84dc35e5b36d5744100fbe: add if/else-if/else elements

    • 4c289003f99c8487ec15f8f1e09e87ba040da39f: new convention for loops and string concat

    • e2c1ebecc8912e5a2edf96f02d56b3df1950ea57: add fragments and children property

    • 844ff1a6f21c3e0d00cf880ef160738990077ac4: add events

    • 4008d25fc99107cffbeaae9db3ba2d936fc0bba8: scope attribute and text expressions

    • 9e5f907fcf3aee97f9af678a63e853b4f0294191: keep relative start time when executing and async execute on first render

    • fcebc0979459f8bcaec68e411349ac01b625f229: async execution of next set of phases

    • 0af617500ab9595909bddddc993657a6452e4eae: add expression scoping to data

    • ef8ecc960e95d22bb44bb3143eccdedaae9fee42: 16ms frame duration

    • 1a5ccc7c780053fe5a216f7f216d3d5c2248d502: 12ms frames

    • e980c3a2bb6cc36d17e191254de90865cf09362d: add global execution queue

    • b3caaf6f1d9fc49ab1ca5e47689fa07637554834: simplify component view executor

    • 78c0a58f722478f516e1c87652a1067c0e59859e: correctly cancel animation frame

    • b0fa4a54691681057bd9c1baee0bcce78516bad0: allow interruptible updates, and use shallow data merge

    • 7e6c93803b39885ceb8dbc6ad5f7341545f5da7e: complete async executor implementation

    • d9789ade110650c9e5f2a17d6bf2a41ce7832121: dont set children attribute

    • e1a0c21cdee631f1e45355a8dacae4f92504c99a: diff & patch phases

    • 51af06d5a630a89993b7eb5243a90316db4a9202: basic generator

    • 50d16b21286cf1c56149ca35b0c1b26ed579dd24: don't check loops for constant conditions

    • 0f8880203a3330da2a41c92b3a4979f3670fc527: begin first phase of three phase executor

    • f438d36193a8eb1c3cebe89e3734ce0e139f3abb: introduce a functional API

    • b61a20291634e124f55ea444728c515b863c71d0: async executor

    • eb32ee6a6e80c99aeb013602c8b7c78527ea4e19: basic working executor

    • cde0298e88a5b174df955e7b2995d3846f4ce48f: begin bytecode generator

    • 254411badfefc8436073605afa68e94df5c758a9: fix comment

    • dfe48dc2b3ebeedb9b7de5836f70b3101a1ad9cc: remove transform system

    • 9b50397b6692a5b6a0ca2dca796d1807883c22d4: add basic transform with time slicing

    • e0aa8ea8f87a3ce3f84553d884e89f7400a49586: correct type for view

    • bacde1e38b68d1704fe5496a15a878a078753fb5: document onTransform

    • 8bee151d734924956cea6611aaacccc87075e94d: begin work on instance methods

    • c4827e765e15ff6a497f2a276327a814edeab2ef: accurate error messages and tests

    • e3b9b042d739ce37c5435ceb6a02a336a5e61bac: add lexer error for invalid tags

    • f29859fac4f9c301365b60eabf295be011123ef7: cleaner tests for errors

    • aa6c5a79e188284ba02ee533b382c08e421f33b4: cleanup env checks

    • 64a02fe334d120c93cd9b75d83971971c6a95282: remove development checks in production

    • d73333fc7b89b99333b162d7a1bbb8744167d98d: add lexer errors and remove extra babel configuration

    • 154e80491b4dfdf943e30ac2d31adcbf8ed36177: revert changes

    • dd9d521f6b1a6182186d42cfeb87f10be81560d9: tokenString -> stringToken

    • b15297b1de587233a9dd4d724c016ff4db82e94d: more consistent variable names

    • 6bddb8eff75b3da3f2589fcb38204c26c3a627b9: consistent variable names

    • 1900dfad5ad5d5bead613313c90b64edb72fd3c2: add basic Moon instance tests

    • dc94f82b2cf2b03129d0bdd3a40193f73926bd9c: remove testing race condition

    • 4a3ac07c4c7d4d8196345f2f1080e2da3c3bd118: test in development and production

    • 3de8dafe793b1d0c835b4c579a45ef49a33c6aa7: remove errors from production build

    • fe8149ec93a18b59df89d234a60532aee5948a15: add lexer tests

    • 7d93cef43d768d2a68614b943dca70681b4ad211: update tests for parse errors

    • adf54c69aaae9f1855c7e3bac61da9aca035b8e0: remove marks due to complexity of newlines

    • 459389aa02ddcdccb06ace67a67ccfc2b70b47c6: correctly format text and attribute tokens

    • 3f5e63aee2aad8ef3c1e5b8a10398bee3a3e34df: add note about parse errors

    • 4446e0d6f86eb19c28253d885ba0e4f5b139d506: add parse errors

    • a24b21b57493a12756062c158b137ff85a640377: setup parser structure for errors

    • 6511d42403d6ce288025225a85223ec06a050030: remove useless header comment

    • 3257d9201ad68f3755c6954f1244d9dbad9dd0a6: clarify return logic

    • a477ef312c2eac30a48ac219c07b04a28a1c7b8c: update information on Moon

    • 464223507010a7bf1c98f55fd105c60772e0747d: rewrite Moon instance logic

    • 9d5a3f3eacece00ef913d836768961426854af5f: use correct comment formatting

    • 68dbca3c7111fc8a849a999729d7365a778f6e89: explain the parser

    • f3cbbe59529d2975b14617b8efb3ee6516c3e0a6: build with new lexer

    • 39d423abb939b908dc47cd13a764a9157b5508de: comment the lexer

    • dbd5e0065bf373641aa5d6935af6d5cfe4bdf8cc: remove uglify unicode output

    • 80480ece312cca2f69da205151b6d97f4ade0d79: fix release paths

    • 1d04a8f8699506df671401da499272dfb0208e2c: update release paths

    • f59e6509aaa192db85f127c9767157b0c81d8958: use latest node version for travis

    • 81dff6652fd046469ed61c70cc4ee6cc8d474b7e: code coverage

    • db03f20be1095abc627ae01531813a2edf2da630: correct minified versions

    • 1ebd492b6b2a6981fdd5cff4bdd44c441f9e6f41: 2019

    • 5e22c8016d2dc91126d1d15f1c0b5457989596ec: modular build and test

    • ef3d5042aabb5364e484ec71104f977ab5594e92: fix travis with valid YAML

    • b64619926418a8e69895e1a821485df2b4bf7059: hopefully fix travis config

    • e699901b8828189e30b97429d83209fcc6233acc: fix indentation

    • b50df57eee6e8a8d33125b50f28b06f9689c783a: fix travis config

    • 73faaf73e717295097b6e84d82a01de54e45d012: new infrastructure, rewrite lexer and parser

    • 322d1bdb375ecf2651d1bd2b31434c5e01dfd805: remove data function from mvl

    • 93426026625058a47421abdc3fe66a62b6c07366: require data

    • 67b32ae39283d7ba6f1b897e8ea9d6c846f52f5f: component init

    • 901f872260e83705a6dac122ed7339e347341c22: split up download instructions

    • eae52cfb51b0ede258d857cf0728b8ff42230089: update npm build

    Source code(tar.gz)
    Source code(zip)
    moon-browser.js(38.14 KB)
    moon-browser.min.js(8.12 KB)
    moon-cli.js(2.38 KB)
    moon-cli.min.js(1.39 KB)
    moon-compiler.js(36.89 KB)
    moon-compiler.min.js(7.41 KB)
    moon.js(17.41 KB)
    moon.min.js(2.97 KB)
  • v1.0.0-beta.2(Aug 13, 2018)

    • acda7ba5850841eff1802e1b945442751e934c95: v1.0.0-beta.2
    • 7f713909658598520cb96913f0c72c43c1f6cb68: update release process
    • 81ca958cec29c483ca1146fdb76eedb18367f6e9: single-file component support
    • 558c471faec75cdea1e34eb099d12f4d8ae7a84a: update slash
    • dfc81f5e8d5ffadef1a1e59733951984df500672: use filename correctly
    • 5ffdd64f2cb7de3d73aa27c1e8185cf082797556: remove filesystem dependencies
    Source code(tar.gz)
    Source code(zip)
    moon.js(21.37 KB)
    moon.min.js(8.21 KB)
  • v1.0.0-beta.1(Jul 19, 2018)

    • fe7cfac3a315d0c397cc0c5410e5864bfc4b6f72: v1.0.0-beta.1

    • 300d9bbdd842809ed42f742aa93413b1b99f1eba: prerelease

    • 3601e1818e53fe180f44067ad4e2082ccd156185: correct commit release

    • c79591803010c69ca95a034d360f9c75cff4fab9: 1.0.0-beta.1

    • 12b4140cbb936a2e62082cd74a264a3e710b2f53: 1.0.0-alpha

    • 760d774cb0c3f3870a6e08b49c61c4e6646a4426: remove tag

    • 7cca02bd59053610450013ce5c6f91544fb2daf5: push tags

    • 630df3c6eb4212cabe54557180e278b9d7b4bc45: 1.0.0-beta.1

    • ef0807c3cbdda6c344a01c1d3fd5d059d2b6a9fe: 1.0.0-alpha

    • 1207ad84597848fdfa8212fd398d840ca068b583: stringify log

    • 83eac6fb2916ebc26d12e532f594f17a5870c33e: remove web from master

    • 45130c40d11de19d77d7a75e97bc5bbb0f552935: push after build

    • 2b1b1e57f70a65403c4a9a8e1c501c52a9bbd89f: Moon v1

    • 806aef1999d6202282c407e7a1a918340f34a5e5: tab

    • 7587745802f403c0d32cccc7a4f7ec1c60b173b0: Merge branch 'master' into rewrite

    • 3d3bbe6886022d255cb53b3a9ee7ebd51c56c427: add build scripts

    • a1cd9c54d07bb0252b08f10d679e8ab12b2e89db: release script

    • 8db839f11bbcaa7e68586926c9cf7d4abf8789de: update css re

    • aea1806be7a3a6a878291d5947c679c74c54d96d: remove unused file

    • 4c48829386d43c7b74141948a1521541e7e1a791: new hot API

    • 1de8c9b327cdf3d5c65e2d4bd0b5018e70c2b224: add hot utilities

    • f61723da6b42243593503ff721edc9656991386f: use scope css

    • b98736086e5e202ebcd4ded692db511435cabbf9: export css scoper

    • bca589226eda7f30c7543db32f14f3e649fa7e9d: export css

    • e293cf1f609f807276871efc3db1d7a37182c3c5: export file info

    • 6e73fbb269d2803d878400d4e320e3d3a6d68e02: export libraries

    • 5491005af8c0f8a95a0246188ed7897a533f5a1e: remove deps

    • 06d37ade486bb1cdbd182cb8349ebf111b692e01: add css rule when scoping

    • 21683b380c49c118f9b9be8ef0dd28c3b3013420: require correctly, compile correctly

    • e6fccfbe5a73ae429cf18fe3dc85a77716d8e0b8: fix syntax

    • 2a75c5d05908fa3780eeb932f8e79101652b53b1: require correctly

    • eaeb87365074dd194a36ed5db4bb9bc03716b9e0: add css scoper

    • d6201efa7cc26f1e44f9c14fd77845218be18c35: work on css mvl

    • 4960970b1f9d434740316b46c2379ec9a2044e9e: export parser and generator

    • 7c7bef3b0559817438f03e850dacc108f5413ac5: use contents

    • 4b871c97fa9afca5d428e4a1a3a1ffc4d30405f1: add start instruction

    • 2868428165d0dda2963caf133c5f972b407a4183: compile created files

    • a206f796c69a2a0e81eb2f8b37092e9624ce5eda: consistent descriptions

    • c6afd1063e0074e3e532acff2e0f5bd86af669bb: moon-cli

    • 792803678333861d830d1f4ab7b582daf705eaf7: deps

    • a9122a3bc6fdb572e376b8191e5209d53a451d4a: add readme for moon-mvl

    • f1630ece082817a3a95d8fd4cc1232ba3e92e03d: add mvl

    • 01063d90ce7b4e5e886e512921678196b87ed13b: move release script

    • 60ef57abd860cd7a3e83c406b26bddf58183208a: scripts

    • 25da18214982b9c6a09edebe67f55b6345556690: infrastructure

    • 9c99ab180f9cf05e378b783f9e9e99c58a4ab69d: finish up guide

    • d393cfe3cc2ee8cd4c6e9f5ac6f91cc573cce67a: begin guide

    • ec62a881cc20356fb0e31958215b04387ef4d8dc: add coming soon

    • 9661801931beb825be1d9aaf55e68d7584e4d1c4: add examples section

    • fa17f7e55bd41148ed3133a5b29ba510ddd9c2c5: finish up component docs for now

    • c79eb0a93134d6f16ee0170a6c7a8d90afe5f358: add component arguments section

    • cbdcaebe30db3d6b83a5d59a82b94b1f4741817f: update button styles

    • 0f2059c17e773547aaf9b43167bf3d9dfd762810: add component definition doc

    • c4fe44de3efe796dce9b59ba5e7e04abbf246c07: write about alternate syntax

    • 8380f6c3eea82bcdd0fd0d9d3064e5951b7c73b1: add runnable examples and loops

    • fd983fd3874344344125c0eda292920395a0f542: finish up view events

    • dedc90a7c70489cecb2ef9d95dda35702172c52b: add more data docs

    • bbffecbab71a5c325a8613eac81c81a752f8875c: add data

    • f0c96cb5324dc4438a6e328c2787e3b853c9989d: add events

    • 69cdf35b345ca362f99f72ab4b0e8c508df31c9d: organize

    • 941dc5ce56c84c4c49c21dc790fe1ff3e35d6abc: remove local

    • 7d009a74388c48d6fed3345eb8324b89cdc03fa4: fix syntax highlighting and begin view section

    • 83783055e1e6200b3091dfce490bca4198e575ca: add about

    • 661631e161cca3b2e4881fcd9acd24799d033d58: basic structure

    • 40fbdb4ce685ccf5a80cef6afc025ef9fc21c85a: start guide

    • 61d0eed716517ff13e93aaeea7c8745d1544c513: slight redesign

    • 378cfe07f7f828b0496370a070a97c8843b135c4: spacing in fast example

    • 132019085b3c1a3828658bf44e0e9e6912c916a3: update fast compiled result

    • 37f305105045e4393b3410fca2be81ee62ae94cd: update cta links

    • c0af2f6a9e5e8401d4c02bcaeb08f59b8cb3595e: update fast example

    • 4a76c41cb497e4e67c3b5ea090fda4b0ae28f71e: add nav

    • 67de7da665c41d1f52d391f7495f3a2fa74b7293: update header styles

    • 93a3bfdcb5f55ba60bb4d41e286cd7f9e152c129: update example style

    • 878d64cd1bdf6e1b0915a2923510748d6c34305b: update website

    • e4b97d73ecc108e80f9fbd5f61ab943ea7679bff: update code colors

    • b5c71406a270899e1d12a9a27cfd691f6e2803fe: update logo & colors

    • 3151bab94632bca8766a26bf162536b5e0cb0d21: update todo

    • b8b70d7567535a442c715b32ea3e7e08fd4e67bb: fix component initial update

    • d6200cc9c8ce5e25a60fe0a39e793c58cba64671: add basic components

    • 1305a50b87ae73a82d288c37a27d3b39d6573fdd: reorganize directive runtimes

    • 3562b2c1c29aa0b03b4dab7e53bc01a44e5e9cc2: use correct view create API

    • 3cc843c805d4e8f307eb8bdb3b7bdd6bb80b9193: remove reference from API

    • d7749e22f48dc1f4987b8a242f63231ac015f6cd: create using root and reference

    • 446d549a6cc95b1eedd1d2f1073c0bb872312b41: allow precompiled views

    • a7d6267b322339ee37cd5149481ebbbbf5d4fe71: update todo example

    • 871e5984e668d05a03b1ae5a208f091511e739cc: optimize events and create bind event

    • b7fc498c01cfa2964fcb35a378a1c6f88b45e40b: update example

    • ac2cc373ae11793fe3a3885132b0393a45e412e7: fix #for/@event locals

    • f0614751295ea1d2906e4b49c6c78d1d123a1d46: add variable support to #for

    • aebb99ed61a151a7f63880d2bcef176bf1f57085: add basic #for

    • ad94c7aa7037021cc18479ed6ae686280d3d764e: spacing

    • 0b19e6c18dea481ad3d840d364892f45a91a1eae: build

    • 24053df9c175caf10e6b2977565b4d1b7e33706c: update option shape and correctly implement directives

    • 42b41573f8ae676e0089cbb8b43bd3672d410c2a: use variable based compiler

    • bb448e86ffb94e03743d6de5c8ffdd9283860f01: consistent colors

    • fdfc6cc7d604bd57804b79546f701b4a076b313f: make button brighter

    • 506cd379efcf06a2007423f762f770572afad767: add #elseif, make attribute values selfish, and fix attribute with value bug

    • bb2265c694c89f38083b18b92e1a3fc69000dec2: update spacing

    • 127ef76615bdd12aeebacc6b3a2eceacae327278: update landing

    • 6d4ea3e2e507ceff207ff1e65ba5bae6154c5151: add web section

    • c8b174bb206a5d04f5b12c19972d70a3a878c469: add basic landing page

    • 83b18232876ee59aa8b62b2c0ca4450d45e3c345: add events system + #if/#else

    • e171bf501187d4724097588fa5b9b3422436feda: update website

    • 5b08686eb3b429500b2616442f97d1c73b5eec59: add #if

    • b55f09fcf9f1af090896e5011b997543379cccdf: clean up conditional implementation

    • f2e8484125ef6f867edf66f2aa34ab4d2966a7f4: set -> update

    • 047ac2e2c7e00a57f95f5a53f1ae0857705f89d8: add #if, #elseif, and #else create

    • 17c25441749de0e61c439f7ed09fc2edd3eeba53: add #if #else

    • de6c133c3d851151950d080e1fe3f8418ff7d15d: new syntax: events -> attributes & directive -> elements/attributes

    • 24c9e4e8a729bf0f6922f8bcdc48691e9a68caa1: add destroy directives and user-defined m-text & m-comment

    • 878ec4f31d37aff3a50e2a725a01fef0551a353f: new directive system and create/update/destroy

    • afaecd9411bb2bb0f35f178ab33f39e0904f9dcb: new directive system + destroy

    • 16271e867262d4f84c48710715bf39fb10b1387b: add m-root, locals with $, and change directive system

    • ca1b73f520823f8ebc4be7539a3cd1118e0d7bba: ignore whitespace-only nodes

    • cc3070fe9df92d11ddcb76c2fa01185a984df3a2: update component API and add mount in create

    • 9762139f072706b52b976219b84ad1c1fe4ffd1d: use m.cae

    • 7c6ae4863017b84762e01ed8bc8cb25516988642: don't update directive in create

    • bca8d2030135a4f13b75fb726b90e5283944e0ad: update directive system and change locals & structure

    • c099ac3634092d760722c4fc6a09e7a5dd5188b3: cleaner implementation of directives

    • 1755adbabc0019cbfb28301e1b4e42ceb3dd1e0e: add updated hook

    • 544ce31b0c19c8b5a5049ac3c29daec13327bb5f: remove mount and add created hook

    • 7b3fa8ee2db25bf0f5d32557c6f22c9d2c51e661: add events

    • ef28850466b432d38abf3fde86906a6c7d048a2e: change API for options object, view array, and actions

    • d2a92b7342d6933323b473d467b73e7615138553: update attributes, add m-on attribute

    • c1235821fc22aa7b9ec5b1ccebdba08f4b52cd64: compile arguments & events, consistent formatting

    • 8118cad352238516fbf06e6e6a7e7c3bc5705b87: update dynamic expressions and attribute expressions

    • 4b41d731fad61d772df9ab9ce241c50246d8e172: concise code for creating attributes

    • 2ee4e9edb9879c1dacfffe4fc6927a1b22722ffe: correctly mark attribute as dynamic

    • 72aca99405d5da5adb36a99a60fe649415ee39cb: correctly mark attributes as expressions and dynamic

    • 347af976fb01938a0a52f1755627fca9e5fb5fac: create attributes, fix generated code formatting, and create case for no attributes

    • f2ee4dd7f586323b30db0a4a3781cda07bc0e618: parse attributes

    • f3692d5eedea58f10c3bbcaab69056215731a712: add global components

    • a260014c3ba4ba27582227544d7a6ba3a0a85cb0: remove m from locals

    • b859484384c3cc46adc804d084d5a06be6675ba2: create component constructor

    • 60c2c603900e80a0ecfa06c26ea3249e3ddf93d3: remove unnecessary exports

    • a446ca4484849aa682c425ad093929af2fc98251: create with dynamic content

    • 1369fd243d27f53faf269c25b05f787e3110f263: split up generator

    • 03a05909c00bb2b1842e18d6a0a051ce6a63563b: split up parser

    • 612b95a8eacbe4dbd4fc874cb0109a39fe141e2a: add eslint

    • 455d5705d9138ec325086f7792a7b35c1f1f7b43: remove gulp

    • b35fe7e70d35ba2eeeeebd811ae91d4fe5d809cf: add default data and data in root

    • 588d008ec7673112dabaeeaaa6cde365edd276e9: correct dependency path

    • 3ed828bded01067d499e6343085b4c9b8c1aebcd: build

    • 4fd3e6bb72435c9c860888517c871bcb14a3925a: use mapReduce & DOM utilities, correctly mount fragment

    • 4d53a3c61e41029307def97f73bc289df8d2d083: add DOM utilities and initial update

    • f05b0281ff41e470097452644abf6cb0110796b2: add mapReduce to utilities

    • 463b553dfd3565df386b3d0974280ae2ac21d00b: add update

    • 6def4af80c2e8ab222c26027e3d4942264d7e9d5: generate create + mount for expressions and generate dependencies

    • 9ab89e5c5d30f8bf2695305c6af43a3b142f395a: remove instance from locals

    • 91238d885e5bceb53206da7c0553f958e3b7d731: generate fragments

    • c1e5a81b34af15e8c5cc8b52e39cc500054a8156: add fragments in parser

    • c438218c55c4b36a1acc7eceab57c81c3cd4c922: parse expressions

    • 1da4378a753d9e8c06907a5d8fe1b8ce959fa70d: remove unused regex

    • 01367160a1326485b219a1da6b47b1fc5e6f5225: parse comments

    • 6eb47d2c9948b7e56e3f0632239eb2c92dbf6bc6: add escapes

    • 71f14723bbee06ddcb560f67a4fabf521cd2f5c0: build

    • ebe2a2f7e07095236cf10906a6d730296d96b708: better error message

    • a00d869a23d6bfe0b31019610511831effaa69eb: add text content

    • 1f0857df3f43a00c79b58fb6908fe44694c3591b: correctly mount to root

    • 1e4114a50df00041fa6e7b6ab1b4a1909bba9e0b: add mount

    • 4807076a2561b6dd5122d8df6db370ea9c903d57: generator for creation

    • e20a58b565f367ba7b34fa0b8f03951ba0329761: add root instance

    • 74bf27ddba04d7a59374efd07c4000968e0d905d: add create, mount, and update

    • 9392d5f483b02341ad1c6972faaa8b7a1148709c: m-fragment -> array

    • 462b86e1ad71eb49a8d74e6a284a73bdbce3c3de: build

    • 69fdd4266d5ccc591ed1bc04516431a638c4454e: add basic incomplete generator

    • 5c069211a31434fe52a72d2f5776fe87994ec250: add parse index to parse elements

    • a8a52fcceaf2d0c7045efca5aebb782591441318: add component and root instance constructor

    • 7189dca04d4532bae9db634dcde3820b1b8b77bf: add sizes to build

    • 107c1e54ec43d18398cb287faa4203acaff7ae73: remove global

    • f86bc7aa479fc97674bbd7ae5789a29139e14856: update structure

    • ca49d0f4d699555069652885f4372735aa664904: remove file names from imports

    • 1470b533387a680f6ff7151b05831ad1031e63c4: add compiler shell

    • 0e080bc8993880ebdaec0909b0450a3e03365927: export parser

    • adde9e421ea838a59d79607e082f6225e2b77ffd: correct error message for unclosed tag

    • c621cce98c4803cbce9f73ce0196b963baf28180: use config in util

    • 946b5a51ad0f7e2bbf19868d29afbc2250a2745d: install global API

    • c13ac49fe6d28b9a2d039cc128b80ed596fdcf47: basic Moon template parser

    • 57f89a4bad6e72bb5311b8facad9ff461718cc5b: add error utility

    • 50d19e10ad3f16ef0d23dfc4c3515d52e3b9de59: add Moon configuration

    • 5285c631717ba99e52f454fb3a820ff15c84558f: use env variable MOON_ENV

    • e3b28565f470b8239730b2fccc7ffca098c39f8c: add plugins and env

    • a95445827ac429389dfb2fb023d4c5db80da691a: improve style

    • 166dc848ad9f50b91ef2bf712c2dcf0e6897531c: remove current Moon API from tests

    • 2ec94b4b21efa2c4bf087254f2b7f27bff331262: stop saucelabs for rewrite

    • a0f4eedd9e83332da2ba9c6799a116f9b82b34ad: update browser support table

    • 1299977884459933cb4a0bf50d8e5a9f1db61399: refactor index code

    • bfb231e3b86def95d7a702f9b609949b51c4c3ef: development + production build system

    • 8a43b17913f5f34583055f4a2647c7228a0aeb85: update build system

    • a81a4561ae2a6dc68e53ec6a0677941ff9d143b9: remove old build scripts

    • 02ff14fa82cfb8279240d2f59f4bfd2bfde8801c: update karma configs

    • c501192536e6f58817565a85a5a34f406c7439f7: update travis scripts

    • 413bedc4f47e9915b469f6e83496761a169289d5: rewrite build scripts

    • 8f0ec5ea46fbc5546977e5a67f34c0cad35378b1: remove benchmarks

    • 2a493ce349e0c67c4bdbd7985ab276d59621386a: rewrite source

    • 10d3791a469a8c388e22c6a92f0cbcb90036e600: rewrite test structure

    • f3b700d3ceffff21501a5c9a79df2819d9810c34: rewrite package details

    • 029aae61924935a3b82e163d204ed512d9aebc1a: remove file structure for now

    • e7776767f494a76ae8d72e49d4048f2eb56c7b36: wording in description

    • babbf8b1c02342af944ea547c8d9cf5a2867fd6f: see documentation

    • 16abac3c5aaae8301381185faeefdad3e24a4bbf: update website (fixes #219)

    • c910a5aa8fce730727fd0a9a4ed093d6cdcf638b: update website URL (#218)

    • 3365188de2791a3373e9d0ab03ee5ef12c67778a: 2018 in license

    • 7a1eafaef80e5c46288410f2f0df7a9fd86d4977: 2018

    • 76651e4abaa775c60a08469fff243783699b79d6: consistent spacing

    • 02e22ad554fb1f59a5e854288180376093c4b113: simpler subheading

    • aac29ee5e03ed3c7e305e02b9320ae6b2951337a: refactor: use convention for chars

    • e6208979ff29f45584c92238871b8123c1bf26f8: feat: static flags & m-dom directive

      • Compiler
        • m is now a global variable
        • Lexer
          • attributes is an array
        • Parser
          • Every node has data with no flags
        • Generator
          • generateNodeState
            • Compiles text values
            • Compiles inserts
            • Compiles attributes
            • Compiles directives
            • Compiles before + during special directives
            • Creates a list of after special directives
            • Compiles child states and adds static flags
          • generateNode
            • Converts compiled nodes into function calls
            • Calls special directives after
            • Returns static node if static flag is present
          • generate
            • Marks tree as static if state is static
            • Uses generateNodeState and generateNode
      • Directives
        • m-if/m-else
          • Only generates output for m-else
          • Outer if/else nodes are always dynamic
        • m-for
          • Always dynamic
          • Allows generateNodeState to restore locals
        • m-on + m-bind
          • Uses new naming conventions
        • m-dom
          • Adds dom property
          • Replacement for m-literal:prop.dom="value"
        • m-literal
          • Only for literal attributes
      • Virtual DOM
        • HyperMoon for text nodes requires
          • type -> type of node ("#text")
          • data -> data of node (only flags)
          • value -> value of node (text content)
    • f6adec5bd5170860fd7446f75c0c366226a1a0ec: fix: change flag values

    • a5192d8164097ee1ddc16154bf84ed759afcb25c: refactor: order constants

    • 64fb32d08539cdc08faa661854fd2c1202dfdc1d: fix markup

    • 51b3ae4617aab2f37e35ae78a96909bec7446e19: comparison to other libraries

    • b50906d0fd287b5ac6ba587fe4ed7dcbade065af: change description for CLI

    • 597756c967fdb2dc99941dcf4b752f6c7953834f: refactor: add flags correctly

    • 5dccf1d764e9b5fed60a33da24c4833b0150c6d8: refactor: vnode data flags

    • d459e2dc234ee546b2f1d338cc7123ed875646d7: perf: remove replace for static nodes

    • 33555213a687b211c7cb6999f69aef9979c25337: add virtual DOM hoisting tests

    • fe3f4eeb43638d02b80445ccfe9512fad6351ea5: wording for virtual dom trees

    • 37b0513cbae00cda15e05842931a9566def77041: explain uses

    • 17b3b442567d73217450e09c10b1ada2c359d848: update explanation

    • 1ddb983e8a0b83b607475f3fda8ce5e56115fa32: change explanation for another library

    • d63c607e63b1da3d60bdf70f241c006dd1737cea: correct comment

    • 18514af87879b471b73c9b8f7294f5473a009902: change description for router

    • c135b3fad1e16572a41b3ad3d76e5ac924c977fe: fix test quotes

    • 9ae71c40a8d63a3b670bd6508f77000e6723f803: fix: allow whitespace between aliases in for

    • b5664511157b09887a0b40392fb9097021ae27f3: refactor: Consistent Naming for hydrate & patch

    • 451aad12f77fe810825e79eec9930ef7dbb542d3: refactor: Functions & Consistent Naming

      • patchChildren -> patches children
      • operationNode & operationVNode
        • operationNode -> handles low-level DOM operation
        • operationVNode -> handles mounting/destroying components along with DOM
      • consistent naming -> root path + properties in camel case
    • 74ed50ce8c3846c4083d38043d69ddfb13b9bce4: fix: escape non-breaking spaces (fixes #190)

    • 7cefee2b604bd351fd51646119d47a48eaf17bc9: Add Support Section

    • ac315d3ed14eddfa045a2658ab2e05a250f10e66: Revert "add patreon link"

      This reverts commit bd6dc53b784035dfd956ca287837c883bee3636c.

    • bd6dc53b784035dfd956ca287837c883bee3636c: add patreon link

    • 48e450edc1cc9a8cb78c62ebc26ba0792c49886e: fix: create static empty node for (fixes #179)

    • 5b305a6b6e426692c6ca2c639f2b3ed768974b09: Optimize loop benchmark

    • dc360377a5a4081bf38e2409c161b81ef5c89470: breaking: Template Compilation

      • generator state
        • staticNodes -> static node code
        • dependencies -> method and prop dependencies
        • exclude -> global variables and keywords
        • locals -> local variables
      • on directive
        • event variable is available, but not by default
    • 99d361bcdbcd76b0ac9aedd02f2192747356441e: fix: compile DOM props once

    • 40d27744823164555d6163854924eea4482623e8: fix: deoptimize dynamic DOM props

    • f2b68c7e917c843533c84fd57b8b7954a6fcc6c5: improve dbMon implementation

    • 04482efe65018d645458a983bf917191f3e082d4: breaking: Rewrite Generator and Optimizer (fixes #146)

      • Compiler
        • template
          • fix bug and mark as dynamic even if referring to a prop that has been referenced before
        • lexer
          • store argument in arg
        • parser
          • parse text nodes with a type of #text
          • store index in node
        • generator
          • rewritten
          • attrs can be undefined
          • hoist static nodes (#146)
            • generates all children and becomes dynamic if a child is dynamic
            • if dynamic then hoist static children
            • if static then return as usual to let caller handle it
            • stores static nodes in instance.compiledRender.staticNodes and initializes them at runtime
          • optimize by joining with a separator instead of substrings
          • returns output and boolean representing if the node is dynamic
        • directives
          • before special directives are expected to return a boolean representing if the element is dynamic or not
          • during special directives are expected to return an object containing the output and a boolean representing if the element is dynamic or not
          • if/else
            • if the condition is static
              • it will be evaluated once
              • no optimization will be done directly to the nodes so that the parent can handle it
            • if the condition is dynamic
              • if either the if or else node is static, then it will be optimized and hoisted
          • for, on, bind, literal
            • use new API
          • remove m-show
      • Virtual DOM
        • patch props
          • if vnode attributes are undefined
            • if node attributes aren't undefined, remove all of them
          • if vnode attributes are defined
            • if node attributes are undefined
              • add all attributes
            • if node attributes are defined
              • add non false vnode attributes that have changed or need to be added
              • remove false vnode attributes along with vnode attributes that no longer exist
          • execute directives
          • add/update DOM props
      • Tests
        • update all tests for new API
    • 373c098754c8732ffe4466a8467698cf7d00b305: add tests for having multiple dependencies

    • ef7fae8fddd6fe845eed343e2be1625123930bb5: add tests for static directive

    • 3ab98797c30e50746bec44bab6ee54026f634739: add tests for computed property cache

    • c3c45070de96a7b2bddebd1b8383172fcfeded46: fix: warn when root element is text

    • 517f30d655ed20d5357fc9463ac1c247a7ede8d4: add tests for updating the default insertion

    • cb518d13c933c00bb66426514fdaa6411f85fbf8: add utility to capture errors when testing, and add tests for unknown directives

    • 031cfc00c3396de7695b176583a8960d67b3ab4e: simplify intuitive API feature

    • af0ce48c674e2b7a14b05625bbbcb890a3ec8b35: add Slack badge to README

    • f8887635cb8aa67843477dd6ae5a70d7fda4d2f5: add tests for errors when data isn't a function in components

    • 85d155e25bf05c1ae18fdf6df858c9105a981ebf: add tests for removing events for a type, and referencing undefined values

    • 591149457e57c1f1daebc0fb53dcf850bdcc5301: add tests for invalid expressions

    • 64438cdcd05cb552935f160fb4789ea6f0f6ff1e: add tests for empty attributes

    • 554f003721f260719209ebd0564b96944164d3a9: test unclosed mustaches

    • a05cc3bf77d50d3674d5f6937ad69c2e6f4c836d: mute logs in tests

    • 250a30b40453ac781dcac5a3229ae139ec3ed0ad: refactor: tests for self closing elements

    • 3e931b515c5bcb278d499babacb7fb4f6c3a56c2: fix: remove "m-else" from directives list when compiling

      • "m-if" already handles "m-else"
    • 74fbbea12a6bd96fe7e69f4ad9603700549b9a0f: add tests for destroying components by replacing and removing

    • 68bcfad6779e261cfd5f8ee67f25eedde1c3f72a: add tests for xlink:href

    • f7a9ee44f2b8b34d48c9a5d620f2fd589216e97b: add tests for removing items from a list

    • 3305b1d24b2b7bbeaeebabd5e294c61912f8dc68: refactor: rename delimiter to separator

    • 2ac841d84fdbaaa2c0d2c204020d3e4182761664: improve test suite output

    • a5d2b8905a98f0a3c93006a6d608719bdd1a6500: fix: don't check for different root when building (root element can only change during hydration due to component mounting)

    • 18ffb75ed7286409f8d730785be8550d191a3da6: breaking: simplify event emitter payload system (fixes #153)

      • payload does not need to be an object
      • normal event handlers are passed with the payload as the only parameter
      • global event handlers are passed with the type of event and the payload
    • 9136b0b60e92d364c965d00418a160ba02157996: refactor: remove jsdoc comments from global API

    • 50c91f55bb218adb872dc9b936cfe1d1f6d9a67a: breaking: Rewrite Virtual DOM Engine (fixes #158)

      • Root
        • any root element doesn't have "moon" with a reference to the instance anymore
      • VNode:
        • "meta" has been renamed to "data"
        • "eventListeners" has been renamed to "events"
      • Hydrate:
        • hydrates children, and does work in loop
        • uses inline DOM utilities
      • Patch:
        • rewritten
        • uses inline DOM utilities
        • doesn't use "dynamic" in favor of VNode reference check (#146)
        • components
          • if the component has props, it is a deoptimization and the component will be updated (#158)
          • patches events (in case they changed)
      • Components:
        • if creating a component using the constructor, the following options are available
          • required options
            • "props" - values of props to merge with data
            • "events" - default events
            • "insert" - the default insert
          • optional options
            • "root" - root element to mount component to
        • all components are expected to be pure, meaning that the output depends on the props and state only. the component won't be updated if none of these aspects are dynamic
        • functional components are removed
      • Compiler:
        • Parser:
          • will no longer deoptimize if an HTML element is custom (components are expected to be pure, so they are optimized depending on if the props and inserts are dynamic)
    • d50505e83619a25e85550731c203230de62bc99d: refactor: add note about parser stack for non void elements

    • 8aa0f8fc9024cdcfb356dd3924bdc09abad778fd: fix: allow empty attributes (closes #157)

    • 6f5acef24bfb5877bf7d22a98daa71f6bdd12fe7: add more details about the 'util' folder

    • 8d1a65e9955c8f318c1d0b90add718799b43b7a2: fix: don't run browser support tests on PR's (fixes #156)

    • a19acffb50ceb96f47a0ea93e9debb5cd9bd24da: refactor: move hydration to mount

    • 959830911b9b431cba797cc75ea7f279a89f5981: refactor: consistent naming when diffing props

    • bff7b0985fa883801250e6d2862390eb710ea694: fix: edge cases for diffing engine

      • update DOM props and directives
      • always diff children, even if innerHTML or textContent DOM property was set
    • 342f08093be445def80882efd125fb75b9c570c4: feat: efficient component mounting (fixes #150)

      • component constructor can take "events" to add before "init"
      • "init" is called before "mounted"
      • props, events, and inserts are available in "init"
    • 7022c3effae25f7b5d01da4652cb9230c8913d57: update variable order in release script

    • 37e696c4d773f9cdf01c6697a444816ba29a6085: refactor: beautiful changelog generator

    • 71ee4fbc9ac261dedeff64a251491c4b331da3f0: refactor: add implementation details about parser

    • a902ea23b11e487e42220d6fdc088c197700eacf: refactor: compiler and generator

    • dba4241eacca54d66ac8cdb6005b13eaa42430e8: fix: make compiler output cleaner (#144)

      • only concat when needed
      • no inefficient checks for dynamic nodes, template compiler returns dynamic state
    • 663709095bc4f315097cc5926b3b666f42807885: breaking: remove event modifiers

      • simplifies "m-on"
      • can easily be added in event listener code
      • keeps core minimal
    • a83fd4e129bb7c51ca2e5ea646a59e6f07ad1e13: breaking: New Method API (fixes #141)

      • methods are stored in "instance.methods" and are callable (the context is changed)
      • methods are constants and cannot change
        • "m-on" will optimize all method calls unless they pass a dynamic property as a parameter
      • methods and data can have the same name, but it is considered a bad practice
    • cf276f7c0da2044cba5b63058914a9401183dc76: use es5 tests

    • 4d10341cabe2c9a1d14c961da3a8bf3e63d78fae: make tests IE compatible

    • 66f9d09f9b68b5023ad4ce077d7e762782088fcb: fix: correctly parse multiple void elements

      • tags are now case-sensitive
    • a1a8994e5ada32451e014a54a9bd336e2c15c4bf: breaking: Rewrite Moon (fixes #127, fixes #132)

      • compiler
        • lexer
          • rewritten
          • ignores whitespace-only text nodes
          • can handle any whitespace (#127)
        • parser
          • rewritten
          • uses a stack to keep track of nodes
          • doesn't warn about extra closing tags
        • generator
          • cleaner implementation
          • cleaner specification for state and special directives
        • template compiler
          • rewritten
          • uses a single pass and eats leading/trailing whitespace
      • directives
        • fix edge cases
        • beautify code more
      • global API
        • remove "Moon.util.extend" (not used in core)
        • make component creation faster
      • instance methods
        • event system
          • refactor ".on"
          • refactor ".emit"
        • mount
          • refactor
          • increase performance by caching
        • build
          • removed "patch" in favor of "build"
          • handles hydration, diffing, and replacing the root element
      • observer
        • refactor
          • remove unused code
          • remove unused methods
        • computed properties
          • simpler caching system
            • when requested:
              • if cache is cleared:
                • captures dependencies for property
                • any ".get" will add the property as a dependency of the key
              • if not, use cached value
            • any ".set" notification will clear the cache for a key if it is not already cleared
        • methods
          • refactor loop
      • DOM utilities
        • "appendChild" and "replaceChild" accept a vnode instead of a node to check for components in an efficient way (#132, #120)
          • "appendChild"
            • if component is found, create a dummy node and mount it
          • "replaceChild"
            • if component is found, mount it on the replacing node (will diff itself)
      • utilities
        • remove "extend"
      • virtual DOM
        • refactor
          • remove unused runtime utility
          • change code style
          • warn on missing directive
          • remove TEXT_TYPE constant
        • hydrate
          • efficiently hydrate children
        • diff
          • fix optimization case
        • use "dynamic" property to indicate deoptimization
        • replace "isSVG" with "SVG" meta property
    • 010a11b9372e7365e8d42cc78387a930ac6b5d16: fix: use 'meta.node' when removing an extra child when diffing (fixes #126)

    • 39b654a50e9e9fd9128a1446a508f191ff383de4: breaking: remove 'instance.callMethod' in favor of 'instance.get(method)()'

      • cleaner m-on code
      • warnings when method is undefined in templates
    • f89d24e0701347e1b00ee14771b20296a981f711: fix: edge cases for mounting components (fixes #122, closes #120)

      • appendChild
        • if a component is present, it mounts the component onto a created DOM node with no event listeners or props (no call to 'createNode')
        • if a component is not present, it will append a created node as usual
      • replaceChild
        • if a component is present, it will mount the component onto the node to be replaced, and the component's diff will take care of the rest
        • if a component is not present, it will replace a child with a created node as usual
      • tests
        • add tests for append/replace component mounts
    • 56d0bb4dbe23b29defaf13340317f56dd688b0c2: update tests to use m-bind

    • 289a5321a6a72991db414245124469b60e0eea08: breaking: use 'bind' instead of 'model'

    • a67e761729db3900099ee57009b047d74aeaeb1b: breaking: use 'Moon.extend' for creating components

    • 3fc782ce16f060c00b1fd048d2df0cad421fdbdd: perf: advanced compiler optimizations for special directives

      • special directives do not deoptimize by default
        • it is up to the special directive to decide
        • this is made possible by the hydration engine, which handles the initial render regardless of optimization
        • compileTemplateExpression returns a boolean showing if the template was static or dynamic
        • deoptimization is only done if the element must be diffed every time (m-if, m-for, m-model)
      • m-if, m-for, and m-model deoptimize
      • m-on deoptimizes only if dynamic parameters are involved
      • m-literal only deoptimizes if a dynamic property is being set
      • add dbmon repaint rate
    • f3fa265b4a753abe6a95124408db173f280b2707: refactor: double quotes for strings, and single quotes for characters

    • d26dd245169511256c9992a71566ea723180ad12: fix: optimize on m-ifs next to each other

      • they will both be replaced by text, not each other (like m-else, which needs to be deoptimized)
    • c23e57790cfcc1ea03accb80693fc189ff3c5087: refactor: remove unnecessary code (#117)

    • 81fd585816ebe13a2499254e3bf3fac8438bbda8: refactor: remove unused variables and const for in

    • a28ac72dbf523383ec87b64dc8566e614c67124f: add tests for merging w/ existing events

    • 5b24e1e23c1a9781977af52a21215a5caeae2fd2: fix: merge events for parent-child components correctly (#120)

    • 5bc255b31fc2e4da7684020aa368730a87d22844: refactor: don't initialize counter

    • 4a42985da8ee9e108f65d1b666347f19cf7cdd2d: breaking: remove support for custom keycodes

    • de6471e919d08f9f24f8d0fa5eb3a06bcfef4955: fix: optimization for m-if/m-else, implementation of m-for, add m-static, and introduce data storage for special directives

      • m-if/m-else
        • doesn't use a stack
        • two m-ifs next to each other (seperated by text) are deoptimized, and so is any m-if/m-else pair
        • an m-ifs seperated by an element are optimized
        • works by setting a property in the data on the most outer deoptimized m-if/m-else, and re setting the 'dynamic' property when done processing
          • in case of two or more m-ifs, the last m-if will reset the 'dynamic' property, while all of them are deoptimized
      • m-for
        • doesn't use a static
        • stores data in 'prop.data.forInfo'
      • m-static
        • used to manually override all deoptimizations for an element
        • sets 'static' property of state
        • resets 'static' property of state when most outer m-static is done processing (done by storing 'prop.data.staticSet')
      • data storage for special directives
        • introduced above, special directives can have a shared state throughout each state (beforeGenerate, duringPropGenerate, afterGenerate)
    • 401fb4488eab9dc1856f165e4fba92f505741112: change wording

    • 53881ab2f70b424573899bee8e2bf889763f1768: refactor: make parser conditions more specific, remove dynamic input tests for m-model (for now)

    • 563313b441f1149726df8d3379343703f43946eb: refactor: rewrite m-model to work with new 'set' method

      • if key is dynamic
        • creates temporary 'modelValue' variable to hold value of base
        • sets keypath of 'modelValue'
        • calls 'set' on base and 'modelValue'
      • if key is static
        • calls 'set' on base and input value depending on input type
    • 455a945b30882e0bb16c42ae0d6f2e5f4f0f39fa: refactor: refer to generation nodes as 'node' instead of 'vnode'

    • df11ccc72e7049069f610986fd76326846e5ab62: refactor: remove string conversion

    • 9ae5922fa2e2a0aa4f47aeaf324bfe56aa3583b1: refactor: remove unused variable in 'm-if'

    • 878b4baef3a90e05e8e1500d296433012c27b61c: feat: allow 'root' to be specified when creating a component constructor

      • if specified, component will be mounted after init
      • add tests
    • 7966be9644855787fb50184bb3e36b8b652755ea: refactor: diff props

      • only remove/not set props if they are 'false'
    • 7364d5d4247e2aacac89001d127c806e0f9b58ed: refactor: remove shared state 'output' from template compiler

    • 19360fe69f7c2aa46fdbcfdbddc421f0f32d9a6f: refactor: inline extractAttrs

    • 4638a89c38c255d377e25287fb2a99e6a2df877a: fix: add tests for 'set' with object syntax

    • 191b81d69e4272c4186dbcc062308a65746fd1e5: fix: warn when method has same key as a data property (fixes #115)

    • 2a0f7cc96a66e987f832a0237efd143a02d31827: refactor: make error message for referencing undefined value more clear

    • 02c7d2a004bce4747148b6873de1db4ddb37abc8: breaking: remove m-html in favor of m-literal:innerHTML.dom

      • refactor setting DOM properties
    • 3d668324082c48e852c0201814713ddc3f7a159f: refactor: generator and formalize directive spec

      • state has structure of:

        {
          index: 0, // index of current node being processed
          dynamic: false, // value to override optimization
          exclude: [], // global variables to exclude from generator
          dependencies: [] // all state dependencies
        }
        
      • use stack for m-for to track iteratable, aliases, and exclude

      • make "event" a global exclude

      • remove escaped double quotes

    • fef152501c082829c927733e0b02b3e71d238c0a: add information about new categories in CONTRIBUTING guide

    • 6114798ea52eab816149bbda99d1925b348f9d18: update release script for docs and refactor categories

    • 84234ee197e5b9ee85f3ffa5b587ae7ee474638e: temporarily remove model dynamic tests

    • d81083c0f1e667f903f6ad23bc4b7827d6c7c967: feat: allow objects in 'set' instead of keypaths

      • shallow merge
      • works with observer
      • works with computed properties
    • dc2596f07ca07f65b4dad3ac722db0d1e90d9db9: fix: cache 'component'

    • a94c626958e660dc1efce6c7d3031493d01f8d88: fix: refactor virtual DOM engine and make creating components from instances simpler

      • virtual DOM 'patch'
        • replaces root element of when hydrating and diffing
      • virtual DOM 'hydrate'
        • no return value
        • assume component creation
        • doesn't handle 'null'
      • DOM utilities
        • 'replaceChild' and 'appendChild'
          • correctly check for components
      • instance 'destroy'
        • correctly removes 'moon' from bound DOM node
    • e2f51665f82fea0aebc57056b09cd206fe935610: compile m-model correctly

    • 15fccbec3c2399e6a896a9e7ea33e68038816bba: fix: refactor everything to declare variables in correct block scoping

    • aebc0e146068f491db958140268494b47208a91b: rename el to root for benchmarks (#109)

    • c9f837f644faed72177f50fd701168ee0559e3da: README: Fix capitalization for 'JavaScript' (#112)

    • 585dbfb4ae2bb72fc86a41d707f88ddefa113e78: breaking: replace slots with insertion system

      • component will render default insert
    • 444e0093292758129ca2f35d34b07eed95dcd1fe: fix: warn on unknown directive

    • 5639021ccb7107020a8a2722f3d48e58ae17edd6: fix: change shape of vnodes to be more memory efficient

      • text nodes only have meta and value
      • normal nodes don't have a value
      • isSVG is 'undefined' or 1
    • 86532b0108b41860d80729ae3464e221de45dbc4: breaking: rename 'el' to 'root' and remove 'props' in favor of 'options.props'

      • more descriptive name
      • no need for user to access props on instance
    • f62b63e676b68a159d25eb27cffc4456de6ac356: fix: remove double assignments

    • f6abebe687b09b5b4e4302e53d8a94491ca35c80: fix: optimization technique for m-if/m-else

      • any m-if's with the same parent seperated by text (or nothing) will be deoptimized
      • any m-else will be deoptimized
      • any m-if's with the same parent seperated by an element will be optimized
    • 500bfbe1e6ab337478d4833f2475e6f3cb3a1da4: fix: meta.shouldRender can be '1' or 'undefined'

      • makes render functions much smaller
    • b6155824d1f1179b2edaf78f0cbeff60d33a79b9: feat: add 'm-else', and fix optimizer edge case

      • two m-if's inside of the same element (next to each other or seperated by only text), or an m-else will be deoptimized as an element can replace another at anytime, and can sometimes be skipped
      • an m-if by itself, or an m-if seperated by an element (other than text) will be optimized
      • m-else will act as an 'else' statement for any previous 'm-if'. the only allowed seperator between any 'm-if' and 'm-else' is text (including whitespace and line breaks)
    • 85008bf4d43a1802c16eec0b7824e733a437cbc4: clean up wording in readme

    • d01cc664a5318c7dd5b971160274ef2b7f6ea6ba: feat: add .dom modifier for m-literal to set a property on a DOM element instead of an attribute

    • cd105b9d7c08e681ecc7fda404f8c33c77538f5e: fix: call computed setter in right context

    • f53cb7b4d381ac7d8a77dea2433e39645746a1b5: breaking: remove '$' prefix from all properties

    • 6cdbadf0888f21227284d08c588ed2c747d36c2c: fix: update username when referring to voke

    • 23d2b399a432e53051dd8b956dfae573a8235650: fix: use block scoping

    • 2ee78dc23c4dfbdc2f9b6cab7a2292ad971dfdd5: fix: cache options when rendering a functional component

    • c4aa2e838410f159d4f0dc1111de8400fb961e5d: fix: require data to be a function for functional components

    • eeb2d226a32ecfce2b4df16ba60ab9708da5ac2d: update browser support matrix

    • 136a1db042a4c87d45067d07a027075e11bb91a3: update username for npm

    • 856f90171bc76d5defc28bf08443085aa32b0eb5: update new username

    • 8409b5e592dee7f4609227b5551e833594e61bea: fix: replace lookup and copy for a single lookup

    • 1facdc16e4a5e5164021d53d47bdfb8893dce220: add svg compiler tests

    • 25f32f3f34a9df571652fe17b626d4e068245dc9: add tests for deoptimizing on unknown html

    • 651d29a393c7d2b77ba2d1d1338210f0db81dcb7: better minification

    • 850095a757a5c6bec2f72293752a74c56a2a95bd: fix: set svg elements correctly and deoptimize on components

    • ae84cfbbeae3e37feb40e87cd1cf0c8366a0c57b: fix: add a new event handler when a new one is present when diffing event listeners

    • d845a6321f9c7293af64b641578f1c63fceae108: fix: call updated hook when updated, not when mounted

    • 48c6b5b4312d8e911d6517302103e9e2c28ba1eb: fix: correctly exclude items from scope throughout compilation process

    • 8fc8c8613d382031af530c2ede81aa98297557c9: fix: spaces > tabs

    • 0afedf9f3493eab6195bb4b6142e75b781220006: fix: remove unused variables in lexer

    • a72ec6c1397bbdb71f90583065cc81b3b5d30c71: fix: remove unused variable when scanning template state until condition

    • 5b5411f901cd4e140d7b7e41a9c5c56487bee346: fix: remove unused regular expressions

    • 704f3850eebfa6d353683982ec7ad13b67052a90: fix: remove unused argument in notify

    • 8637d66603395769782c2f775e9127896a0723b4: fix: correctly exclude aliases from scope in m-for

    • ed26a5b1cf813220dfed65473595fa10e8642db7: fix: exclude special custom parameters from scope (fixes #92)

    • afacfbfb575bfa16eb918109bf323d4cf0e5d492: fix: call updated hook when built (including mount), and remove destroyed state and replace with queue

    • 404ea12e67aef08a5d7953659528c54908140973: fix formatting

    • 7981cc2f016c7c075677f728fef76661f1a7f4cd: fix: assume attrs if special directive generates during prop generation

    • f4ba9eefe0af8a33346acf392cc95827d7819fd9: fix: avoid string conversion in dom props when using html directive

    • 965c7e7767b3eb17af532c949e457a70011678bc: fix: remove isString param from template compiler

    • 498efdeb398aee2f821322d1f0e4fa1a8394500e: fix: remove unused regex

    • 290fc93f8f68a7df631e15cf65ad17178631557d: fix: add runtime helpers in HyperMoon (fixes #89)

    • 98637209b8ac12d6c9ea28799e2e8e239ba9f35d: fix: fix typo in diffing when appending children

    • 7f6168a08f44e1d07f6954e83a2f383a749c5f1a: perf: optimize adding children to the end of a list when diffing

    • 030d44e8dafe546152f2ca059ab6931c48e35a45: perf: improve performance of removing children at the end of a list when diffing

    • 5c66f8cc49cdbcd0d8871d9fe4cfa12b5eca7cf3: perf: optimize hydration to use less loops

    • e0690f4a85e29e296f5ec7c662482a2bd63e5490: perf: cache oldChildren when appending

    • 75d8370238b1feca243e36f0f3c7ce910b88324e: fix return types for diff

    • f00bca3075ec019bad0f984ddab171eeafd2dbb6: fix: correctly update reference to children when appending items to the end of a list

    • b99f926c8fa7fea3198e8cddb467b015fd7b91fa: build

    • 2597831a6de704bb322d8297893cdb29bcf2c067: fix: update children when adding items to end of a list when diffing

    • e94948f876d1abfbc69b36a055d83e0962ca619f: perf: improve hydration engine performance by adding fast cases

    • b9fc46b9f9a6179a0b37010359cc1b9a8ab8b254: perf: rewrite diffing engine improve performance by diffing children faster, and improve performance when creating children by caching common values

    Source code(tar.gz)
    Source code(zip)
    moon.js(21.37 KB)
    moon.min.js(8.21 KB)
  • v0.11.0(Jul 14, 2017)

    Minor Changes

    • Add support for different input types in 'm-model' (fixes #52): e66280c9c0bbd668710d041a644dbdf1dc9731d9
    • Allow and enforce data to be a function in components: 640b40740152d500c58042ebb7d26a9fb12ee153
    • Change naming of component cache: 63ec30e1a92e88dd0bf1b0b67e0465466e928119
    • Support dynamic values for m-model with radio buttons: e755dd4622382857b0c242b1def76b16acdc2166
    • Begin adding support for dynamic event listeners, add support for arrays, objects, and numbers for 'm-for' (fixes #62): 0093de7a35b5a1688b6fedd6ce1d9f2efe126987
    • Make eventListeners dynamic (added if needed), and add advanced optimizations :zap:: aee07e33e410ba370cf574fe20bd0f99b37eb219
    • Breaking: remove custom delimiters: b12b904cd2480053e31a6c3a020530bbcd87ff40
    • Use custom vdom 'm' instead of hyperscript: 8dec037c9bef5a17ecd4e8cc9eb2ca18eb52ab3e
    • Remove merge utility: fd8aae03de8cfbd8a76bf6b316cc2d600d266322
    • Add support for parent-child communication through custom events: 6f88c832191701d87ce3d46e4e6bc370d6be3c2b

    Patches

    • Avoid many lookups in lexer: c5805ba3de12f60235a28e4b2e6ffc434d653bee
    • Make lexer more flexible and allow '<' in html: fd7c4efe5e8a5692b84ee21e2c40f147d7999456
    • Add license (fixes #50): da9b6fa57a85df487cacb673af37bafd85db5b13
    • Fix emit: 3c870ee02cb4d268bf91b1d14ae68cb7ff0af465
    • Cache attributes in codegen for model: fa902106b7f2713e2c8865bfed88d1a82fb824fe
    • Faster way of computing dependencies for 'm-model': 1002f791a4a781c414ce5d0dbd4e14ce69dec0e3
    • Support dynamic paths in model much faster: 0f4a66940b0b504ad2fe82d829ec16edf10f9b5b
    • Correctly extract dynamic path: f05e97ff356bb47bc520511520a2722aa4545cbb
    • Optimize lookups when adding event listeners: 2509ffd74a719677f0ebd723dcecbf8642a41fe5
    • Add more reserved globals: 0299ec74e3dc5544cc7c2a32fe2c577a3757b3fc
    • Correctly have current position in state be tracked in lexer: ed10e158020a36c9e4129e65895c04565a88d25f
    • Lex attributes faster: 167c47879bf9ea340930c944592729a03c9cae99
    • Check if element has attributes correctly (fixes #59): 93d9f145baa883467c8739e0d4a00868d8378bb9
    • Fix spacing in generated dependency code: ebd43c24e99d37fe84cfc8b6abf3ead75fc7b713
    • Faster unmount component when replacing node: b133e86671aac577c7bc6e62d0f8e182d693db4f
    • Optimize prop merger for functional components, add all props by default: 2fae857440231bcb10b867c64593a716b7471966
    • Allow renderloop to have a number: c8bee28b3c3d8fb40c07a0988657e1fe8997392f
    • Allow custom keycodes to be evaluated at runtime (fixes #55): fd35e0d7f714d960f1575f4684f5c226b6d0d46d
    • Improve memory by defining runtime helpers once: 9fec38ea4bdde246af419d7cccbeeefc5c1cbc0d
    • Improve performance by reusing counter: 0c704063c18ccfa0445afc6dbbe3a5b4000a2940
    • Make some improvements to generator rewrite: 80db68357bc4d2100eac8be70a1a657adf2e64d4
    • Optimize optimizer, and deoptimize if there is a special directive present: b7d419e942035475de27e1da5dd22f194e7f4abe
    • Deoptimize on directives: 1710b850a13a66efb5d317540ab57d9842c2368c
    • Generate event listener code correctly: 4ca98f718146ec426660d93426bad56f935cb920
    • Add support for special directives that implement code generation for an individual property: c95d12db4bb1a08cd7583fdfa99a3b1bcc8ad736
    • Return output of method from callMethod, recommended by @shellvip (closes #69): ef901044b26aa7874dd3e076b6565423efdc6433
    • Remove unused function from generator: 30aa9c74614c37eee3e8c51d00a111a8335fff91
    • Ensure special directives that generate code after children don't invoke during the childrens' code generation time: d0eeaa929fb05b383024b9a479910ce15806a6e2
    • Fix mount: 39bc5391a20409496680a87e30a5900ce1f6b002
    • Optimize adding events when parent listens to child component events: e27c52070256df12a384b4eb31b86a25e2d0ac97
    • Update initMethods: 736bc17066e1cead7ecaa63aca58c8058d8ffbf2
    • Account for literal values as well as normal values when using 'm-model' with literal values (fixes #60): 11ff0de06898d4423446ecc0fcfeeba8a2c1f3ea
    • Allow attributes to be set conditionally (fixes #25): 5e1dc22f41a3207227a9cc789e3cf172589f9bae
    • Escape HTML correctly and efficiently (fixes #83): 63a54419f7e91aa4791d0596fec30a18f218cf45
    • Allow for backslashes in templates: 48791e0444b0ce9dd437a87f70b004410c57776a
    • Perf: don't use bind: 827118271edfadd55660e1fd3519b2ac5ac5925c
    Source code(tar.gz)
    Source code(zip)
    moon.js(66.72 KB)
    moon.min.js(18.32 KB)
  • v0.10.0(May 20, 2017)

    Minor Changes

    • Remove custom prefix configuration option + make directive generation faster: 1ba2ec59259c77e0179cf72141d5f96b8949deb9
    • Improve parser by allowing custom elements that self close, but throw if there is no slash to indicate it: a645d40bb068b84336e420d1533543cef758adfb
    • M-if now uses an empty text node: a8056b226d8b8fc8304801d28dc84bc2af8f8b63
    • Make mustache tags run first with precedence: d4906cc6b461ccfe487f2f4d10d4eb8c8802cc85
    • Allow scoping and javascript expressions within mustaches: b3966b02d3c0381cfe9c23b88b5820d3c8c81c2c
    • Add a dependency system for directives and special directives, to avoid calling a getter multiple times: 147ab02c272d2c9d4029735b7149ecee7bd20df3
    • Change all scoping inside of directives to be literal by default, without mustaches: 84c627ccf083898d3a8f9e433960a75a42abe84d

    Patches

    • Allow lexer to handle unclosed elements (fixes #35): 5c08af71bc1c5134b0f83da82dd828112b434ab6
    • Allow 'el' to be a DOM element (fixes #34): 2f70afc270f4c1a33938971e9d3e2cd2854542ba
    • Fix string escaper: ef5ffeae402df28ca9a38bbf0dc9974ab3e281ae
    • Add warning for undefined values in development mode: 93334168ee6456dea50533fc7e89799968a9d14d
    • Allow support for booleans and object properties in mustaches: 00f33de9d3bf38909ad6c543bd79ce347a9a23b5
    • Make mask a special directive: 0430b54e39aca5b4b11808fa3f04fd036256860a
    • Remove m-literal on directives (already literal by default): c40813244feac0cacced0d3faf4fb59d23710210
    • Diff event listeners (fixes #38)": 50b989f94ae1caa6b0b9a034a0acb788130f80ba
    • Allow text to contain comments: d888a48e1079259060ee84977ae393e54e6e7e4b
    • Global variables: b3bf117359b836fc086c180a771a18abef524e97
    • Faster way of checking for globals: 04b37daaa9d5b8881e539658c43259489c757a6d
    • Allow options in plugins: d2b118260348ebf407050bf56f25e79e29fe9152
    • Format browser support table: 35e2a2e9bfbb65bc8e5fc24371c8bd6200994f9e
    • Clean up code generator: 208808146dbbe4ef3c4e2ed8a86d4397a7605b99
    • Generate children faster: 98ac03734506e7d13a35f96a8a95d88e5ea69e70
    • Faster code generation for m-for: 353dc8c83a67a0678ffb91070fc70998b972a4cc
    • Faster code generation for m-on: d440470cab0bf5de07e84fccf88885710eaec15d
    • Faster code generation for m-on and m-model: ab73cabead7a524d3d31e2108c014d41c88e6b12
    • Faster code generation for directives: 2b6415ba96b911ce25f5908dbb7ed8b156c81241
    • Make dom props faster: e6dae963b57d9bd9e79a094d60ed7097e7f91895
    • Diff a component faster: e528aebce8a83f6151dae0cc3dc31c28d18ea65e
    • Correctly add variables to scope in m-for: 4c05b2f401860554ee28f834620790cea132760c
    • Scope dynamic keypaths in m-model correctly: f53c23635b8ee4cbba183da0e5ffb967dff8570f
    • Remove unused regex: ac8fa56aeda277226005f3996e3790b36c1246b6
    • Speed up child lookup: abd312d5af5686288e0d42c3f2a9726cf428d4c2
    • Correctly diff removing children by using a seperate counter for old children: 4b919af3694f530b8e6c1070aa9847d9588da118
    • Specific case for logging/error when silent: d533fc9ee2ed9f107fdd4e22764b0da6c7ac3930
    • Faster replace: 7d2f9ac27517b96c22583dfff532b0ef0238543a
    • Keep same regex for functions: 52dfa5c3b7da8d55ff6e2ab5c08d0506ddd03b71
    • Warn at closing element with no matching tag: c8224d85c1fdf1883edd20f368212d6472d344c0
    • Change name of parse tree walker: b692c13cdcff9d1ce1aea6e0cc02ef1261b50f80
    • Better message for ignored closing tag: 3def907ef4178e1b976d5296b6628edc71b48f62
    • Simplify createNodeFromVNode by using existing appendChild utility: f441791324268dcf4fd15022b7ca760d0abd5b49
    • Handle null children when creating nodes from vnodes: 4101a47cf0c73fabd8e12f52a8b6dc53ed7f4646
    • Avoid many lookups into objects (perf boost): 2f6145164228fbf4daaed2fb281bb309b827739a
    • Faster for loop when resolving keypath: 248781de82ad0d383f7d334f1ca56769bb8e80ee
    • Specific case for traversing children in hydration: d9d880df164e7c93f1a32a08fc940b1b6346e0d6
    • Set children when clearing in optimization by reference to retain for next diff: 858e8069ab8b7acb3609eba444d66b0652793d2c
    Source code(tar.gz)
    Source code(zip)
    moon.js(67.03 KB)
    moon.min.js(17.67 KB)
  • v0.9.0(Apr 15, 2017)

    Minor Changes

    • :zap: much better detection of static nodes: 6b1d0ef480b6032a0631d51fcf1d8347cc8afffd
    • Allow () in template modifiers: 612527a51a2f953048850920d9dab258920b5f6b
    • Throw error if no closing delimiter for template is given: 530e142be3480cbb492ee5b43e012f991c01e6d2
    • Remove the pre directive completely: af6a528dcdeb1dbc20fc1072b1e899568dda11ed
    • Don't rely on shouldRender to update text during hydration and diff: f1ccd8096978eced7071f5f07d1369b85c4948ac
    • Remove m-once: d503f6746e7547926fb00eebeb5d98c1706cbbb3
    • Simplify h function and do more work during codegen instead: fa179630c5ad0d583394e2a40f1da22400299868
    • Flatten children during render: f5483efb7e59182b086358b82363877b1c9905e1
    • Generate code that flattens shallow arrays instead of doing it during runtime: 7f19adec990bd4bf3e0687395ee10004493fa290
    • Treat vnode as source of truth for directives when diffing props: 45bcc7b442a4a8d821f5cca1140cd477e5c9158d
    • Remove text directive (pretty useless): b18b578de4b970ff931202831fccf8515bce7009
    • New header: c6b2ac05ab2b35b55667dd74b314261e189f8127
    • Make compiler independent (not needing instance): d93a353530dd5ce59de6647e11268d9e5574926d
    • Remove initialRender property (useless): 3457f0b317d3bcd45a6381a76bbc9236e41f4592
    • By default, instance is destroyed (until mount): 50c58f7136d6871371188a01650d8051ac317261
    • :zap: parser can now handle weird HTML: 4c07f7019d1c177097bb6e016dc5cb789b36116c
    • Make lexer flexible, allowing unescaped HTML: e72d67c9db64ca73b85d7be4dcdf5a10c4b4e067
    • Add support for custom delimiters (fixes #29): c82ac631ccca9a319bb9fd7f8829e7155dddfebe
    • Merge methods with data: 416c10a25c8b05bd50c7864cccddbdec9dd710d6
    • Bind all methods during initialization: fc89920ad3aed2d043c7f5e32bbe8055225881e0
    • Allow directive to be added by m-literal: 9eaf4bca3ef9f7e250a4db11ad93cb436f1093d0
    • M-if now generates an empty text node: 454e04f6404f6909b5c6691383c86b4fd8f5910b

    Patches

    • Patch old vnode tree to match new one instead of creating a new tree each update: 850ea1b4f75d2593017acbeba4649c1aaec5d085
    • Fix bugs when appending components: 2cdd5d9d248d2b5614bfb7e9e3d23c2bb265e832
    • Ensure no props are generated by the time beforeGenerate is called for special directives: eb9c8483124ce6427c700a266b2517bbf09748eb
    • Update reference correctly when diffing children: 5b562ed702b268e80196fbda6d52811ffc94b422
    • Ignore null children (conditional): 0b9b87011047b838b36f5f1da6f16ce5e42eddb1
    • Add dependencies if not already added: 5133bf21c64eccd4c49ca9b450f7ad558c30c64a
    • Ensure slots are treated as dynamic: 9d11f0add3f105246e7f4790f26e03f994382077
    • Faster way to check svg: 608a4b669d5e81e53e12f0a548714bc95e84dbb4
    • :zap: faster way to check for svg: 159eee8fc6a63a7d93a449a674d5e70dc74f4384
    • Efficient template compiler: 9d577b8b75ae1c1cc88a410f1639e185fde436ca
    • Memory efficient way of optimizing static nodes: e4f7c87aaf739a690404e5ad06ae42eaf31684e1
    • Generate regex for m-for: 721f3fee377706ddbb11e2eea28e6d33ff09ca55
    • Memory efficient lexer: ea9c861d53e6b40a42ae61b44a008728ea8a6740
    • Faster, memory efficient HTML parser: 1b9e107b6a61864c1430e086a4579c964404b5dd
    • Specific cases for slight perf boost in hydration: c05a0bc197460cde12a294eee0a3157ab1b18496
    • Specific cases with utility functions: d6e568d6db20e6ed4fd5ff63ea70bbed5b3c425e
    • Avoid creating new strings every diff: 0c3dbc92930bbc732430fe4ab90187671c4af120
    • Generate code for directives seperate from normal attributes: 3e2687d6d8aca21aa63198dfeb431976e5fd9d51
    • Execute directives later when diffing props: 7bd1bcf2b9b23f6340c132160f9395e96b716f33
    • More elegant solution to m-show and custom directives: 5380d318394c0835e793b6ab8218463b2e14e6f1
    • Optimize checks in h function: 33e21bbd92c2955b9f0b5740d16f768d8315a63d
    • Check for index out of bounds (perf boost): b7431bf38ecf6bf37e7ecaf9cfdfac714f715805
    • Refactor events .on: a1121a217fe28a40e266cccc7994268ba0b44bab
    • Let off be more flexible: 862d4afaa7bd2b971ef1441d62a6b60e2eb6636e
    • Refactor code generator: 83338539b3ca2755bd98c77adba6a64e187a4cea
    • Refactor before special directive generation: 6b1a2b050ecbd06b3e1143007f02ae337f51256f
    • Refactor special directive after generation: 5342b8a11dfdf71091a9d42aa402bf16293459f1
    • More specific check: 12fd76a6caaff8939dede93e16d75250541330c4
    • Empty oldChildren in dom when emptying element: e9f488fe1d44bda66372552c241fc9b08d37180c
    • Make parser even more flexible: dad261cb1a1b435e24ae9222657b8be114d531ab
    • Cache props when creating functional components: 34ed75e31c674f647224df2730e2716e9566ec0b
    • Make template compiler more flexible: 838e7a2ba5c94ed96a5ba4353ce535927a5c8d86
    • Allow parser to handle cases with nested elements of same type: a135ab24b82a8d0cad4642ccb87f172f1815f432
    • Allow conditionally set attributes (fixes #25): c92f5811d16d504faf1e49a4963330f78442199d
    • Add faster versions of directives: 3cf8f66a4060d165cf9fabfa19af221d6b2b91af
    • Use delimiters while compiling 'm-model': 7774cc634eb2280ef5bb154c79b970367d7b6a91
    • Keep reference to nextSibling during hydration: 99ac4c801b88c48143982cf715230f9b46a4d7f5
    • Add better falsy values, and fix setting attributes for xlink:href (fixes #31): 9b90318afadf72a9fd25da6ca2d7d093b6f4416b
    • Make notifying and observing faster: 8c3fe883a7ae585b4d40b3a87b9c2e800d5bf86b
    • Clean up observer code: 218903e31709ffa0e59e30a6ff7047e3358a81c1
    • Invoke setters in direct set, not by notification: 4343cf73c8eb23fcaec4840d9652baababfec769
    • Use base for custom setters and add default setter as noop in favor of custom one: 669a3bbd0e1fc6fbb3ae1880bcf909f63d1d24e4
    Source code(tar.gz)
    Source code(zip)
    moon.js(64.24 KB)
    moon.min.js(17.62 KB)
  • v0.8.0(Mar 31, 2017)

    Minor Changes

    • Add dependency tracking and caching for computed properties: 366905921a9c5bc871b7a2c71af6f94892339965
    • Make sure keeping track of changed computed properties (so they can depend on each other): 484f2624ab7207667fac7b884681460a4310de35
    • Errors are suppressed as well if silent: 4333592f54c7a4402ad35474b252eb79227480a5
    • Make moon silent in production: c227bf865469dd7f2ccec4a4b23d5a32d3033e8f
    • Remove checker for warnings in production version: 2983514d10a6e64584aabeb0d7a10b2d08874854
    • Make h function take array of children: a6bb0b46d48808317b83434669c5e80034cbc7f4
    • Add support for 'name' option in components: a53637aaf01fe2061045f8f81137619a2123db44

    Patches

    • Update cache/dependency systems: e63d63eac51127e1439a80f4d51f2bba623d4b1b
    • Better m-show implementation (perf boost): 718ff7baa02115d65807d9c8d15cc45831d8e011
    • Ensure empty attributes have meta/values: 96da99bebc4a3dd0a46a64e361562cf898f46dce
    • Ensure properties with args can have multiple instances of themselves: e21eba58ebc69204bdfa387c4dc8a0b8ac4d13e6
    • More efficient prop diff (perf boost) :fire:: b61d16da4f2d2ef0319c6a22f81cf2c97bd31a4d
    • Use a different diff with vnodes and dom: 3b240cf312cadb780023ca0d3df67af90bc7a2e2
    • Better way of iterating through children: 1619af86d7fb467ab60ab98d64af11ed2cd3b8b3
    • :fire: perf boost: use ternary expression over and condition (more declarative): 684d40db6465146f2d952f3429192964ffb6d973
    • :zap: rewrite diff completely to use hybrid of nodes+vnodes: f94aafc5704945a13a0fe475433fba10a7f9f76a
    • :zap: perf boost: faster prop check without hasOwnProperty check: 575aec77dcdbdf765b86c135c4767f530647ea5b
    • Expose 'h' and perform vnode equality check optimization: 339cabe61a14becff3be90990db572faa534a972
    • :zap: perf boost: handle case when there are no children and remove all of them: 577fe98e06b38a51b5e42240c6a6eea104cca090
    • :zap: perf boost: faster way to traverse children while avoiding calls to CompareICStub: 347d8b339814d3d5ec818951924e49ad8f143d2c
    • Ensure children are hydrated when creating a text node via optimization: b40a71f12f663989784b68bf4b4933196105b099
    Source code(tar.gz)
    Source code(zip)
    moon.js(52.89 KB)
    moon.min.js(16.07 KB)
  • v0.7.1(Mar 23, 2017)

  • v0.7.0(Mar 23, 2017)

    Minor Changes

    • New directive style for events, add option for argument: 331759b4d6f696d553ce0e7cb6c4d139d293af99
    • Add new syntax for m-literal with argument: 1c71b4ff6434fc90578f07b5d885287f4de83b04

    Patches

    • Check if property exists, (allow falsy values in prop): 4f18778a9ef7501b7eddb5e76dc456e158681cf4
    • Perf boost: skip if element has one text node and hasn't changed: 9ceca426d0fe75ad2573aa584f6d8326293ac7e2
    Source code(tar.gz)
    Source code(zip)
    moon.js(47.44 KB)
    moon.min.js(15.01 KB)
  • v0.6.3(Mar 18, 2017)

    Patches

    • Avoid overflow in unclosed tags: 11ac6a1c1f348da2030beab9985746dfeaea30f3
    • Allow 'this' to refer to instance in hooks: fe8e7e4040508e9090f8ecd44b6183be07f71ae1
    • Indicate if element is svg: 3a2c6a409f459546e850e76ee4860ca0c7989d07
    • Add svg support: 11636cc3d0083128d4bd5ef1b3bdc522bf25dcf6
    • Allow $ and @ signs in templates: 4f95e32d87638d890ac8e16a9746e6105af43ae0
    Source code(tar.gz)
    Source code(zip)
    moon.js(47.27 KB)
    moon.min.js(14.88 KB)
  • v0.6.2(Mar 4, 2017)

  • v0.6.1(Mar 2, 2017)

  • v0.6.0(Mar 2, 2017)

    Minor Changes

    • Better string escape (wip): 0e4585d57e7784f7ccec6e8c88a0c6942641f5a3
    • Add system for creating a difference between dom and regular attributes: 1acfc72639192b7ffce0406685748fb250772b7d
    • Generate dom props more efficiently, and set them during diffing props: ebddad1d0d039dee32719aff8c6a093a1b7cc31a
    • Set value of input (proper 2 way data binding), and treat all DOM properties as literal expressions: aa0b27bd05e57f31cc1fa48c5851cf3e1d185619
    • Allow dynamic values for m-model: 6a589771de1b345ab0d64a459e659f2fea51422e
    • Add ability to set by index in keypath: 443a13617b573863d54b09baae299ec2c72cbdb9
    • Add ability to have 2 way data binding on checkboxes: 1ef85d117fc361b8b697a722fd41f02620bf6f2f
    • Add basic initializer for computed properties: d9c1e4cff06c16c551ab8272ff26e870c856cf1b
    • Add support for computed properties (fixes #13): 92d5fb96db3549574e91b5388a35be85b7e31b45

    Patches

    • Make sure dom prop hasn't changed before setting: 4bf615804970ef2a2e8de49761d61e05227a8e0d
    • Use value prop for m-model event listener generated code: c403a5d532001795afb5bd6b3dc47ec181ddaceb
    • Fix comment for queueing build: 0b180517727af5b4262e7b206bd864cc9aa03135
    Source code(tar.gz)
    Source code(zip)
    moon.js(43.38 KB)
    moon.min.js(13.57 KB)
  • v0.5.1(Feb 27, 2017)

  • v0.5.0(Feb 26, 2017)

    Minor Changes

    • Implement basic component system: 2b3114f7e422ebb9e0f717841497d0ba071d7945
    • Add basic slots + named slots support for components: 52b0b7d459889c274786545273664472e0b54508
    • Support for binding 'this' to instance when calling methods: d5fc48a9ebe81cf78f330b32f853673f7c773f86

    Patches

    • Jump directly to creating a functional component: 81a5e1995c6dd87c6d620e3627b6aff07858cdcd
    • Add prop merger: aef26cf83f457c76d5c6eb469dff7868d7db57c8
    • Optimize prop builds by seeing if property changed: 056a4ba529f32a2612712f5c90d32650038c1189
    • Be able to create nodes that are components: 0d7928d65c14cce2e841f17088fd6fdf25b1fe25
    • Support creating components as a parent: 7e40f0fa661d0e01ff3f665db05172a0e985f298
    • Support creating components when replacing a child: 759ea23d15f68d202b4f4d936794fc06b0abcb85
    • Destroy components that are unmounted: 2d50b14439204b39ae335108fed38561b5606742
    • Make element null so there is no detached node tree when destroying instance: 225663e5fd4ca4a3dba36699c5401a5f5ac30f95
    • Fix edge case where node needs to be replaced and new node is a component: 866858fd4a87bc4b709403fdd69d606ef1cbf867
    Source code(tar.gz)
    Source code(zip)
    moon.js(42.29 KB)
    moon.min.js(13.60 KB)
  • v0.4.6(Feb 24, 2017)

    Patches

    • Only change textcontent if node with single textnode changed (perf boost): 9c990018c6f0884d033cd254613de870b16c1daf
    • Allow items to be marked for rendering (partial render): 0f4f076025f1e440278fd29b7694d1c8430610c2
    • Let moon be able to detect static nodes with one text node: 9d1c78af02851d4d1c8d87174076100fff2ca29a
    • Better detection of dynamic vnodes: c7f297e690dd5e2bee9b7ae0aaa39542d88c69c9
    • Use initial render (ie m-once) to optimize: 0bb74c5c5c01b4e14c3faf6eb7f84052613dc47b
    Source code(tar.gz)
    Source code(zip)
  • v0.4.5(Feb 22, 2017)

    Patches

    • Check for self closing tag or unclosed tag, fixes #8: 7b3681fe974807ee1ad323751fcfff237a9182b8
    • Better regex for template compiler: 8d525910478f3dbf4093417d8e71d055d2662bdc
    • Support for keypath in set: 29ca9e0a3402f0fb723f868a0ee4104931c82897
    • Improve perf by doing a better html check: 42ee6e0afb715a2c6cd8a153865ee2cad57fe7e9
    • Add watcher: cea6ebca4d8be4a555bb0af3d604d600820f4377
    • Use observer: e8d5a2c6460598ae21a36327f80b5532a58d238e
    • Don't queue build every set: 79a2b46fb70f5d49136a51c4965c385ea6ffb451
    • Compile text: d86b3d418b516e5c865e1d9ce1f7ee4110c391af
    • Fix parser to be able to handle a wide variety of closed/unclosed elements: 149f41c0bdcfcbf2acdd6cc3d56c40a5ad66d395
    • Cache special directives that generate after: ceba52f9a937505899672f873a69fe76b0aa93be
    • Push to after/before generated seperately when code generating props: 4a4e5847b76aab3bbe08d0adf782a4a2b42a01aa
    • Fix edge case for generator where a node only has beforeGenerated special directives while generating: 7ffcf7abc0d5cbb383e295de11585f0c79a7e2d1
    • Make m-for require array: fdafa439335de114a12c63b8de2d381dfecf658c
    • Optimize by adding a prop cache: dd258309a1f91ffd4b5a2271221da22dc826baa7
    • Improve code generator to remove special directives: d1cfdd7aba6d0dcd993e53bb5501af809c163ba1
    • Improve code gen performance by removing all special directives: c0fffebbac3d89117301e2af340fc387a00f257d
    • Add m-literal directive: 8c60e1d3ec931f2e85da905edf4e4b93e8237184
    • Allow m-literal to have colons: d143b9604d49d57210590033fa80ae8314473a67
    • Optimize generator for empty elements: 52e0d0acaf5f1cf2010b9500af819b902a48a95a
    • Optimize diff engine to cache nodenames when creating a new node + improve dbmon benchmark: 704a11c1580a911dbec513d3a04493e05c0cd943
    • Faster child normalizer: ecd16816e30f5ce14ca7f623e4253d7162e0ff10
    Source code(tar.gz)
    Source code(zip)
  • v0.4.4(Feb 18, 2017)

    Patches

    • Check for self closing tag or unclosed tag, fixes #8: 7b3681fe974807ee1ad323751fcfff237a9182b8
    • Better regex for template compiler: 8d525910478f3dbf4093417d8e71d055d2662bdc
    • Support for keypath in set: 29ca9e0a3402f0fb723f868a0ee4104931c82897
    • Improve perf by doing a better html check: 42ee6e0afb715a2c6cd8a153865ee2cad57fe7e9
    Source code(tar.gz)
    Source code(zip)
    moon.js(36.37 KB)
    moon.min.js(12.00 KB)
  • v0.4.3(Feb 17, 2017)

    Patches

    • access 'default' property safely: 3aa6595939b1ba95ef5a355ede39550e9335a4d4
    • check for console: ee55760b1d62df174e8a680f38a46849d550a0f9
    • use console if available: a849e13d0311a17e712664fda340858db20f9d34
    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Feb 16, 2017)

    Patches

    • Fix compiler to be able to handle self closing elements and unclosed elements: d1307ed732fe9b6a93cf46138815a1898c013374
    • Fix compiler to automatically handle unclosed elements: 57962f2cfeaf3a5e57451338295aced40c452c9d
    • Remove ability to add events via m-on (perf boost): e71622524d769ab21a359ec3259ff41fd4f331b6
    Source code(tar.gz)
    Source code(zip)
    moon.js(34.27 KB)
    moon.min.js(11.03 KB)
  • v0.4.1(Feb 15, 2017)

    Patches

    • Add support for named slots: ba652ced023e69ba6d5035684bc9650a6d3b0887
    • No options for lexer: 8e5b73d48b81a09b37734ad226b5bdd25230dc50
    • Remove some unused variables: 862a08ef2a86b13ebe070ee212ff6268c11e78dd
    • Fix up lexer: 01fe4a1c83b1c67f5417e56af82c824fa3e818b6
    • Optimize compiling templates by removing custom code gen: d35b17314eb483904f3e43c0b296276ac57f0808
    • Fix lexer to handle slashes in attributes: 443f0e622cf41f7c7af3c265de92a298a5423452
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Feb 14, 2017)

    Minor Changes

    • Rename created hook to init: f5de14f2a4d711524ce5297b585f96722033b660
    • Add functional component support w/ template/render function: e03045cd1203f6d77b7f8a6fda85b525bfa6511c
    • Add functional component prop support: 8b64bf3345037fb794fe2244af9492c628c1c55d
    • Add support for functional components, create a new instance still: 6e9a7d6674b8a1ce39615eea1aeebc7e4dd50ec0
    • Add proper functional component generator: 25bd3129841b08bf708be8cfdb76e71ed2fb124d
    • Slots support for functional components: 07f93177da594f078275a5918af529b53f8cc2d7

    Patches

    • Explanation of diffing engine: 69023fc5a1ca939e2c68f249ca2bb953e88a7c9b
    • Fix up diff engine to handle cases where there is a completely different node: 8f383e30fb3a7b3929dd3d9d8fd39b17c08fc9fe
    • Create a new instance for each functional component: 226904a7c33b2358ab80fd26962c50afa00a14de
    • Add better tests: e185b4c4843eb637228a6650c3eeeb3922d75f13
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Feb 13, 2017)

    Patches

    • Check for no vnode as well: baee064b433bd914fc05b4255d069271b114196b
    • Iterate through attributes more efficiently: 1deb8d3cd718e843d932423d60cc347741e16d8e
    • Cache props: 584757b357c7c37c1656a54aca8ee99e2c9c4e2f
    • Optimize diff: 6af77f452c5af9a3e68a3036ef547ae3b2c2469e
    • Optimize diffing engine: 8fc9ccbb565057e74d0eefb9a91ef9f2422b9fa6
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Feb 11, 2017)

    Minor Changes

    • directive for two way data binding: 97d6364163e322042a3c4a5a058a3e498d664e49
    • Add support for event modifiers: 3e7ad8d67d82b4bcdd0e7b7a1b17cd808989cdc3
    • Support for using alias in list rendering (): ed24266d0f36dc7e398b6bc8dab37d464e0f5db1
    • Add 'enter' keycode utility: c94c5ea9ef7b455175c73498c9e0480bb0f91916
    • Add the ability to create custom keycode aliases: 9622d0142ffa72a380cada03079ed99ebdbbcf94

    Patches

    • Add support for event listeners: 9c83d675e29be279198004e87343671f7d71e876
    • Add support for custom params in events: efdaf483351baa3a7c54f4c59f0a3c3404a852a5
    • M-once for rendering something once: 0e66353dca2f12af70fabbfa1e61bd7a8620be4c
    • Pre directive for not rendering: 3c8d46ce98f270225889571c6b7ffe9acd5636f8
    • Compile value to be able to use templates inside parameters in events: ba19c01e6f989f5428a7e0939bb1661f4b1e82c1
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Feb 8, 2017)

    Patches

    • Compile template of custom parameters to method call: ca3ef3400f998c4ac01eb93390aea70ed43c9409
    • Clean up code generator: 30d0d90262def4bbc1e8072b51be2605fea38421
    • Fix up h function: afa7494312ac3362fef70e3c4de22ca823c9285e
    • Fix compiler to be able to handle empty elements: b12b1dc975390a19f782367526bc9c0a79101233
    • Remove log of code: ca2916c3db6b154312a49a0c3d94de94674eacaf
    • Call created hook when initializing: aa7e07c6acb7444476567c5908eccd5582a543b7
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Feb 4, 2017)

    Minor Changes

    • Add support for custom parameters in m-on: 52169deb937e6353f6b11cbe40c13e33cdb35220
    • More efficient event listeners with m-on: cbdd4e523f3f8e060de7d3b1937d84dc88e51722
    • Add support for custom parameters: 6b20baefa5408e84f52f76540f7c5457e4f2dcd5
    • Add built-in key code modifier utilities for events: 6e1f19a41e643af70cd92866ad82f3284e9e00b4
    • Support for custom keycodes: 2299a39e7d78b224c5d159acabbc3868d36b96fc

    Patches

    • Fixup closing parenthesis issue when calling method: 429ee3e67996f4eb9213403912aee4c28f948d1a
    Source code(tar.gz)
    Source code(zip)
Owner
Kabir Shah
composer of human-centric experiences that empower creativity
Kabir Shah
A declarative, efficient, and flexible JavaScript library for building user interfaces.

React Β· React is a JavaScript library for building user interfaces. Declarative: React makes it painless to create interactive UIs. Design simple view

Facebook 200k Jan 4, 2023
Tiny (2 KB) turboboosted JavaScript library for creating user interfaces.

Develop web applications with 100% JavaScript and web standards. ?? RE:DOM is a tiny (2 KB) UI library by Juha Lindstedt and contributors, which adds

RE:DOM 3.2k Jan 3, 2023
A declarative, efficient, and flexible JavaScript library for building user interfaces.

Solid is a declarative JavaScript library for creating user interfaces. It does not use a Virtual DOM. Instead it opts to compile its templates down t

Ryan Carniato 24.5k Jan 4, 2023
A functional and reactive JavaScript framework for predictable code

Cycle.js A functional and reactive JavaScript framework for predictable code Website | Packages | Contribute | Chat | Support Welcome Question Answer

Cycle.js 10.2k Jan 4, 2023
A rugged, minimal framework for composing JavaScript behavior in your markup.

Alpine.js Alpine.js offers you the reactive and declarative nature of big frameworks like Vue or React at a much lower cost. You get to keep your DOM,

Alpine.js 22.5k Jan 2, 2023
🍼 650B Virtual DOM - Use reactive JSX with minimal overhead

?? little-vdom Forked from developit's little-vdom gist. npm: npm i @luwes/little-vdom cdn: unpkg.com/@luwes/little-vdom 650B Virtual DOM Components S

wesley luyten 87 Nov 12, 2022
βš›οΈ Fast 3kB React alternative with the same modern API. Components & Virtual DOM.

Fast 3kB alternative to React with the same modern API. All the power of Virtual DOM components, without the overhead: Familiar React API & patterns:

Preact 33.6k Jan 8, 2023
A blazing fast React alternative, compatible with IE8 and React 16.

Nerv is a virtual-dom based JavaScript (TypeScript) library with identical React 16 API, which offers much higher performance, tinier package size and

null 5.4k Jan 4, 2023
Create blazing fast multithreaded Web Apps

Welcome to neo.mjs! neo.mjs enables you to create scalable & high performant Apps using more than just one CPU, without the need to take care of a wor

neo.mjs 2.4k Dec 31, 2022
A Web Component compiler for building fast, reusable UI components and static site generated Progressive Web Apps

Stencil: A Compiler for Web Components and PWAs npm init stencil Stencil is a simple compiler for generating Web Components and static site generated

Ionic 11.3k Jan 4, 2023
πŸ™Œ Check if a Discord user is sponsoring you/someone on GitHub and give them roles!

Discord: Is User Sponsor? A bot that gives roles if a user is supporting you on GitHub! Uses Discord OAuth and Discord GitHub integration to get user'

EGGSY 18 Jun 27, 2022
Our original Web Component library.

Polymer ℹ️ Note: This is the current stable version of the Polymer library. At Google I/O 2018 we announced a new Web Component base class, LitElement

Polymer Project 21.9k Jan 3, 2023
πŸ™‹β€β™€οΈ 3kb library for tiny web apps

3kb library for tiny web apps. Sometimes, all you want to do is to try and do somethingβ€”No boilerplate, bundlers, or complex build processes. Lucia ai

Aiden Bai 699 Dec 27, 2022
Simple and elegant component-based UI library

Simple and elegant component-based UI library Custom components β€’ Concise syntax β€’ Simple API β€’ Tiny Size Riot brings custom components to all modern

Riot.js 14.7k Jan 4, 2023
jCore - JavaScript library for building UI components

JavaScript library for building UI components

iOnStage 11 Jan 21, 2022
KioskBoard - A pure JavaScript library for using virtual keyboards.

KioskBoard - Virtual Keyboard A pure JavaScript library for using virtual keyboards. Current Version 2.0.0 * Documentation and Demo https://furcan.git

Furkan MT 177 Dec 29, 2022
A JavaScript UI Library with JQuery like syntax

A JavaScript UI Library with JQuery like syntax. (Beta)

Sijey 5 Jan 16, 2022
ENS Avatar resolver library for both nodejs and browser.

ens-avatar Avatar resolver library for both nodejs and browser. Getting started Prerequisites Have your web3 provider ready (web3.js, ethers.js) [Only

Ethereum Name Service (ENS) 27 Dec 30, 2022
⚑️The Fullstack React Framework β€” built on Next.js

The Fullstack React Framework "Zero-API" Data Layer β€” Built on Next.js β€” Inspired by Ruby on Rails Read the Documentation β€œZero-API” data layer lets y

⚑️Blitz 12.5k Jan 4, 2023
:fire: An extremely fast, React-like JavaScript library for building modern user interfaces

Inferno is an insanely fast, React-like library for building high-performance user interfaces on both the client and server. Description The main obje

Inferno 15.6k Dec 31, 2022