init commit
This commit is contained in:
		
						commit
						8975cbd0bd
					
				|  | @ -0,0 +1,28 @@ | ||||||
|  | { | ||||||
|  |     "env": { | ||||||
|  |         "es6": true, | ||||||
|  |         "node": true | ||||||
|  |     }, | ||||||
|  |     "parserOptions": { | ||||||
|  |         "ecmaVersion": 2015 | ||||||
|  |     }, | ||||||
|  |     "extends": "eslint:recommended", | ||||||
|  |     "rules": { | ||||||
|  |         "indent": [ | ||||||
|  |             "error", | ||||||
|  |             4 | ||||||
|  |         ], | ||||||
|  |         "linebreak-style": [ | ||||||
|  |             "error", | ||||||
|  |             "unix" | ||||||
|  |         ], | ||||||
|  |         "quotes": [ | ||||||
|  |             "error", | ||||||
|  |             "single" | ||||||
|  |         ], | ||||||
|  |         "semi": [ | ||||||
|  |             "error", | ||||||
|  |             "always" | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | node_modules/ | ||||||
|  | @ -0,0 +1,72 @@ | ||||||
|  | # Contributing | ||||||
|  | 
 | ||||||
|  | So you want to contribute, nice.  **Thank you**. | ||||||
|  | 
 | ||||||
|  | Bug reports and code and documentation patches are all welcome. You can help this project also by using the development version and by reporting any bugs you might encounter. | ||||||
|  | 
 | ||||||
|  | You may contribute in several ways like: | ||||||
|  | 
 | ||||||
|  | * Creating new features | ||||||
|  | * Fixing bugs | ||||||
|  | * Improving documentation and examples | ||||||
|  | * Translating any document here to your language | ||||||
|  | 
 | ||||||
|  | ## Table of contents | ||||||
|  | 
 | ||||||
|  | * [Contributing](#contributing) | ||||||
|  |   * [Developing](#developing) | ||||||
|  |   * [Running tests](#running-tests) | ||||||
|  |   * [Reporting a bug](#reporting-a-bug) | ||||||
|  |   * [Request a feature](#request-a-feature) | ||||||
|  |   * [Commit message](#commit-message) | ||||||
|  |   * [Code style](#code-style) | ||||||
|  | 
 | ||||||
|  | ## Developing | ||||||
|  | 
 | ||||||
|  | There is only one main source file in the project. It is the [/src/index.js](/src/index.js). | ||||||
|  | The [test/index.spec.js](test/index.spec.js) is for now the only unit test file in the project. | ||||||
|  | 
 | ||||||
|  | The `dist` includes the minified version of the source code. | ||||||
|  | 
 | ||||||
|  | ## Running tests | ||||||
|  | 
 | ||||||
|  | Run unit tests using this command: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | npm run test | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Reporting a bug | ||||||
|  | 
 | ||||||
|  | Use the [GitHub issue tracker](https://github.com/n2geoff/js-lib/issues) to report any bug you find. | ||||||
|  | Bugs description should include: | ||||||
|  | 
 | ||||||
|  | * How to reproduce the bug; | ||||||
|  | * Easy to understand title; | ||||||
|  | 
 | ||||||
|  | Would be nice to have some code showing how to reproduce the code, you may use [gist](https://gist.github.com) or [Codepen](https://codepen.io) for uploading your example code. | ||||||
|  | 
 | ||||||
|  | ## Request a feature | ||||||
|  | 
 | ||||||
|  | Use the [GitHub issue tracker](https://github.com/n2geoff/js-lib/issues) to request a new feature. | ||||||
|  | 
 | ||||||
|  | Keep in mind, this is a pure javascript library | ||||||
|  | 
 | ||||||
|  | Feel free to port it to your favorite framework, such as [RiotJS](http://riotjs.com), Angular or VueJs in a new repository. | ||||||
|  | 
 | ||||||
|  | ## Commit message | ||||||
|  | 
 | ||||||
|  | Commit messages should includes GitHub number reference and a imperative easy to understand sentence. | ||||||
|  | 
 | ||||||
|  | ## Coding style | ||||||
|  | 
 | ||||||
|  | If it is supported in all major browers without transpiling, then please use those JavaScript language features in your code, with one caveat -- readablity is king.  | ||||||
|  | 
 | ||||||
|  | Currently all ES5 and ES6/ES2015 are available. | ||||||
|  | 
 | ||||||
|  | This project is linted agaist [ESLint](https://eslint.org/) and the [`.eslintrc.json`](.eslintrc.json) is dead-simple, and all you need to followed.  | ||||||
|  | 
 | ||||||
|  | Thank you for reading this. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Hey, **star** this *repo* and/or share it with your friends. | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | Copyright (c) 2018  | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||||
|  | this software and associated documentation files (the "Software"), to deal in | ||||||
|  | the Software without restriction, including without limitation the rights to | ||||||
|  | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | ||||||
|  | of the Software, and to permit persons to whom the Software is furnished to do | ||||||
|  | so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
|  | @ -0,0 +1,54 @@ | ||||||
|  | # State JS | ||||||
|  | 
 | ||||||
|  | > simple spa state managment utility | ||||||
|  | 
 | ||||||
|  | **WIP** | ||||||
|  | 
 | ||||||
|  | Simple state managment utility for single-page-applications w/ optional localStorage caching with a tiny footprint | ||||||
|  | 
 | ||||||
|  | > ALL values are JSONified | ||||||
|  | 
 | ||||||
|  | **Features** | ||||||
|  | - Tiny ~100 lines of JS | ||||||
|  | - Support both browser and NodeJS environments | ||||||
|  | - `.get` can be used as expression, `false` returned for all empty datatypes -- yes even `{}` & `[]` | ||||||
|  | 
 | ||||||
|  | ## Quick Start | ||||||
|  | 
 | ||||||
|  | include the library *ONLY ONCE* | ||||||
|  | 
 | ||||||
|  |     const state = require('state.js'); | ||||||
|  | 
 | ||||||
|  | or in browser | ||||||
|  | 
 | ||||||
|  |     <script src="state.js"></script> | ||||||
|  | 
 | ||||||
|  | ### Options | ||||||
|  | 
 | ||||||
|  | `state` is a funciton that you can optionally pass in an `options` object | ||||||
|  | 
 | ||||||
|  | | Option | Descption | | ||||||
|  | | cache | enable localStorage | | ||||||
|  | | debug | display various console messages | | ||||||
|  | 
 | ||||||
|  | ### API | ||||||
|  | 
 | ||||||
|  | from there you have access to a simple api, `get`, `set`, `remove`, and `clear` | ||||||
|  | 
 | ||||||
|  | | Method | Description | | ||||||
|  | | get(key) | get value by key | | ||||||
|  | | set(key, val) | set value by key | | ||||||
|  | | remove(key) | remove key | | ||||||
|  | | clear() | destories all state data | | ||||||
|  | 
 | ||||||
|  | ## Support | ||||||
|  | 
 | ||||||
|  | Please open [an issue](http://code.negative9.net/geoff/state.js/issues/new) for support. | ||||||
|  | 
 | ||||||
|  | ## Contributing | ||||||
|  | 
 | ||||||
|  | Anyone is welcome to contribute, however, if you decide to get involved, please take a moment to review the [guidelines](CONTRIBUTING.md), there minimalistic;) | ||||||
|  | 
 | ||||||
|  | ## License | ||||||
|  | 
 | ||||||
|  | [MIT](LICENSE) | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | {"version":3,"sources":["state.js"],"names":["root","factory","define","amd","module","exports","state","this","opts","Object","assign","cache","debug","_state","_log","msg","console","log","get","key","val","length","getOwnPropertyNames","_has","JSON","parse","global","localStorage","getItem","set","value","setItem","stringify","remove","removeItem","clear"],"mappings":"CACC,SAASA,EAAMC,GAEU,mBAAXC,QAAyBA,OAAOC,IAEvCD,OAAO,CAAC,SAAUD,GACM,iBAAXG,QAAuBA,OAAOC,QAE3CD,OAAOC,QAAUJ,EAAQD,EAAKM,OAG9BN,EAAKM,MAAQL,EAAQD,EAAKM,OAVlC,CAaEC,KAAM,WACJ,aAiEA,OA/DA,SAAeC,GACXA,EAAOC,OAAOC,OAAO,CAACC,OAAO,EAAOC,OAAO,GAAQJ,GAAQ,IAE3D,IAAIK,EAAS,GAMb,SAASC,KAAQC,GACVP,EAAKI,OAEJI,QAAQC,IAAIF,GAqBpB,OA5BAD,EAAK,QAASD,GACdC,EAAK,SAAUN,EAAKI,OACpBE,EAAK,SAAUN,EAAKG,OA0Bb,CACHO,IAAMC,GACCX,EAAKG,MAnBhB,SAAcS,GACV,MAAkB,iBAARA,GAA4B,OAARA,EACjBA,IAAY,EAGH,iBAARA,EAEY,cAAfA,EAAIC,SACMD,EAAIC,QAASD,EAGdX,OAAOa,oBAAoBF,GAAKC,OAAS,GAAKD,OAN9D,EAeWG,CAAKC,KAAKC,MAAMC,OAAOC,aAAaC,QAAQT,KAE5CN,EAAOM,GAGtBU,IAAK,CAACV,EAAKW,KACJtB,EAAKG,MACJe,OAAOC,aAAaI,QAAQZ,EAAKK,KAAKQ,UAAUF,IAEhDjB,EAAOM,GAAOW,EAGXA,GAEXG,OAASd,GACFX,EAAKG,MACGe,OAAOC,aAAaO,WAAWf,GAE/BN,EAAOM,GAAO,KAG7BgB,MAAO","file":"state.js","sourcesContent":["/* state.js v{version} | MIT | https://github.com/n2geoff/state.js */\n(function(root, factory) {\n    /* eslint-disable */\n    if (typeof define === 'function' && define.amd) {\n        // AMD\n        define(['state'], factory);\n    } else if(typeof module === 'object' && module.exports) {\n        // CommonJS / NodeJS\n        module.exports = factory(root.state);\n    } else {\n        // Global\n        root.state = factory(root.state);\n    }\n\n}(this, function() {\n    'use strict';\n\n    function state(opts) {\n        opts = Object.assign({cache: false, debug: false}, opts || {});\n\n        let _state = {};\n\n        _log('INIT:', _state);\n        _log('DEBUG:', opts.debug);\n        _log('CACHE:', opts.cache);\n\n        function _log(...msg) {\n            if(opts.debug) {\n                /* eslint-disable */\n                console.log(msg);\n            }\n        }\n\n        function _has(val) {\n            if(typeof val !== 'object' || val === null) {\n                return !!val ? val : false;\n            } else {\n\n                if(typeof val === \"object\") {\n\n                    if(val.length !== 'undefined') {\n                        return !!val.length ? val : false;\n                    } else {\n\n                        return (Object.getOwnPropertyNames(val).length > 0) ? val : false;\n                    }\n                }\n            }\n        }\n\n        return {\n            get: (key) => {\n                if(opts.cache) {\n                    return _has(JSON.parse(global.localStorage.getItem(key)));\n                } else {\n                    return _state[key];\n                }\n            },\n            set: (key, value) => {\n                if(opts.cache) {\n                    global.localStorage.setItem(key, JSON.stringify(value));\n                } else {\n                    _state[key] = value;\n                }\n\n                return value;\n            },\n            remove: (key) => {\n                if(opts.cache) {\n                    return global.localStorage.removeItem(key);\n                } else {\n                    return _state[key] = null;\n                }\n            },\n            clear: () => {}\n        }\n\n    };\n\n    // Return it\n    return state;\n}));\n"]} | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | /* state.js v0.5.0 | MIT | /http://code.negative9.net/geoff/state.js */ | ||||||
|  | !function(e,t){"function"==typeof define&&define.amd?define(["state"],t):"object"==typeof module&&module.exports?module.exports=t(e.state):e.state=t(e.state)}(this,function(){"use strict";return function(e){e=Object.assign({cache:!1,debug:!1},e||{});let t={};function o(...t){e.debug&&console.log(t)}return o("INIT:",t),o("DEBUG:",e.debug),o("CACHE:",e.cache),{get:o=>e.cache?function(e){return"object"!=typeof e||null===e?e||!1:"object"==typeof e?"undefined"!==e.length?!!e.length&&e:Object.getOwnPropertyNames(e).length>0&&e:void 0}(JSON.parse(global.localStorage.getItem(o))):t[o],set:(o,n)=>(e.cache?global.localStorage.setItem(o,JSON.stringify(n)):t[o]=n,n),remove:o=>e.cache?global.localStorage.removeItem(o):t[o]=null,clear:()=>{}}}}); | ||||||
|  | //# sourceMappingURL=state.js.map
 | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | 'use strict'; | ||||||
|  | 
 | ||||||
|  | const gulp = require('gulp'), | ||||||
|  |     sourcemaps = require('gulp-sourcemaps'), | ||||||
|  |     terser = require('gulp-terser'); | ||||||
|  | 
 | ||||||
|  | // build riotjs tags (components)
 | ||||||
|  | gulp.task('default', () => { | ||||||
|  | 
 | ||||||
|  |     return gulp.src('./src/state.js') | ||||||
|  |         .pipe(sourcemaps.init()) | ||||||
|  |         .pipe(terser({keep_fnames: false})) | ||||||
|  |         .pipe(sourcemaps.write('./')) | ||||||
|  |         .pipe(gulp.dest('./dist')); | ||||||
|  | }); | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | { | ||||||
|  |   "name": "statejs", | ||||||
|  |   "version": "0.7.0", | ||||||
|  |   "description": "simple spa state managment utility", | ||||||
|  |   "main": "src/index.js", | ||||||
|  |   "directories": { | ||||||
|  |     "doc": "docs", | ||||||
|  |     "lib": "lib", | ||||||
|  |     "test": "test" | ||||||
|  |   }, | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "node_modules/.bin/tape test/*.spec.js", | ||||||
|  |     "lint": "npx eslint src/*.js", | ||||||
|  |     "build": "npx gulp" | ||||||
|  |   }, | ||||||
|  |   "keywords": [ | ||||||
|  |     "library" | ||||||
|  |   ], | ||||||
|  |   "author": "Geoff Doty", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "devDependencies": { | ||||||
|  |     "eslint": "^5.16.0", | ||||||
|  |     "gulp": "^4.0.2", | ||||||
|  |     "gulp-sourcemaps": "^2.6.5", | ||||||
|  |     "gulp-terser": "^1.2.0", | ||||||
|  |     "tape": "^4.10.2" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,82 @@ | ||||||
|  | /* state.js v0.5.0 | MIT | /http://code.negative9.net/geoff/state.js */ | ||||||
|  | (function(root, factory) { | ||||||
|  |     /* eslint-disable */ | ||||||
|  |     if (typeof define === 'function' && define.amd) { | ||||||
|  |         // AMD
 | ||||||
|  |         define(['state'], factory); | ||||||
|  |     } else if(typeof module === 'object' && module.exports) { | ||||||
|  |         // CommonJS / NodeJS
 | ||||||
|  |         module.exports = factory(root.state); | ||||||
|  |     } else { | ||||||
|  |         // Global
 | ||||||
|  |         root.state = factory(root.state); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | }(this, function() { | ||||||
|  |     'use strict'; | ||||||
|  | 
 | ||||||
|  |     function state(opts) { | ||||||
|  |         opts = Object.assign({cache: false, debug: false}, opts || {}); | ||||||
|  | 
 | ||||||
|  |         let _state = {}; | ||||||
|  | 
 | ||||||
|  |         _log('INIT:', _state); | ||||||
|  |         _log('DEBUG:', opts.debug); | ||||||
|  |         _log('CACHE:', opts.cache); | ||||||
|  | 
 | ||||||
|  |         function _log(...msg) { | ||||||
|  |             if(opts.debug) { | ||||||
|  |                 /* eslint-disable */ | ||||||
|  |                 console.log(msg); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         function _has(val) { | ||||||
|  |             if(typeof val !== 'object' || val === null) { | ||||||
|  |                 return !!val ? val : false; | ||||||
|  |             } else { | ||||||
|  | 
 | ||||||
|  |                 if(typeof val === "object") { | ||||||
|  | 
 | ||||||
|  |                     if(val.length !== 'undefined') { | ||||||
|  |                         return !!val.length ? val : false; | ||||||
|  |                     } else { | ||||||
|  | 
 | ||||||
|  |                         return (Object.getOwnPropertyNames(val).length > 0) ? val : false; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return { | ||||||
|  |             get: (key) => { | ||||||
|  |                 if(opts.cache) { | ||||||
|  |                     return _has(JSON.parse(global.localStorage.getItem(key))); | ||||||
|  |                 } else { | ||||||
|  |                     return _state[key]; | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             set: (key, value) => { | ||||||
|  |                 if(opts.cache) { | ||||||
|  |                     global.localStorage.setItem(key, JSON.stringify(value)); | ||||||
|  |                 } else { | ||||||
|  |                     _state[key] = value; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 return value; | ||||||
|  |             }, | ||||||
|  |             remove: (key) => { | ||||||
|  |                 if(opts.cache) { | ||||||
|  |                     return global.localStorage.removeItem(key); | ||||||
|  |                 } else { | ||||||
|  |                     return _state[key] = null; | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             clear: () => {} | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     // Return it
 | ||||||
|  |     return state; | ||||||
|  | })); | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | const test = require('tape'); | ||||||
|  | const statejs = require('../src/state.js')({debug: true}); | ||||||
|  | 
 | ||||||
|  | test('Index', function(t) { | ||||||
|  |     var state = statejs; | ||||||
|  | 
 | ||||||
|  |     t.test('setup', function(t) { | ||||||
|  | 
 | ||||||
|  |         t.ok(state, 'state should be defined'); | ||||||
|  | 
 | ||||||
|  |         state.set('name', 'Geoff'); | ||||||
|  | 
 | ||||||
|  |         t.end(); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     t.test('state should have name', function(t) { | ||||||
|  |         t.equal(state.get('name'), 'Geoff'); | ||||||
|  | 
 | ||||||
|  |         t.end(); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  | }); | ||||||
		Loading…
	
		Reference in New Issue