From a289e4981f0bcb2619548d3252ca09c73858d567 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Thu, 31 Dec 2015 14:06:51 -0800 Subject: [PATCH 01/15] Added browserify and babel Simple browserify and babel set up. Also browserifies tests. --- dist/enum.js | 148 +++++++++++++++++++++++++++++++++++ index.js | 3 + package.json | 21 +++-- src/define.js | 16 ++++ src/enum.bak.js | 150 +++++++++++++++++++++++++++++++++++ src/enum.js | 202 +++++++++++++++++++++--------------------------- tests/create.js | 5 +- 7 files changed, 421 insertions(+), 124 deletions(-) create mode 100644 dist/enum.js create mode 100644 index.js create mode 100644 src/define.js create mode 100644 src/enum.bak.js diff --git a/dist/enum.js b/dist/enum.js new file mode 100644 index 0000000..c4debcc --- /dev/null +++ b/dist/enum.js @@ -0,0 +1,148 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.enumFactory = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o", "homepage": "https://github.com/Ashwell/EnumJS", @@ -18,13 +19,23 @@ "test": "tests" }, "scripts": { - "test": "tape 'tests/**/*.js' | tap-spec", - "posttest": "eslint ." + "clean:dist": "trash 'dist/*'", + "prebuild": "npm run clean:dist", + "build": "browserify src/enum.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone enumFactory", + "lint": "eslint .", + "test": "browserify tests/create.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", + "posttest": "", + "prepublish": "npm run build && npm test" }, "devDependencies": { + "babel-cli": "^6.3.17", "babel-eslint": "^5.0.0-beta6", + "babel-preset-es2015": "^6.3.13", + "babelify": "^7.2.0", + "browserify": "^12.0.1", "eslint": "^1.10.3", "tap-spec": "^4.1.1", - "tape": "^4.4.0" + "tape": "^4.4.0", + "trash-cli": "^1.2.0" } } diff --git a/src/define.js b/src/define.js new file mode 100644 index 0000000..00443b6 --- /dev/null +++ b/src/define.js @@ -0,0 +1,16 @@ + +var + define, + defaults = { + configurable: false, + enumerable: true, + writeable: false + }; + +define = function( instance, name, value, traits={}) { + traits = Object.assign({}, defaults, traits, { value }); + console.log( traits ); + return Object.defineProperty( instance, name, traits ); +}; + +export default define; diff --git a/src/enum.bak.js b/src/enum.bak.js new file mode 100644 index 0000000..060cd7d --- /dev/null +++ b/src/enum.bak.js @@ -0,0 +1,150 @@ +/*globals module */ +!(function(){ + 'use strict'; + + var exports; + + if( typeof window !== 'undefined'){ + exports = window; + } else if( typeof module !== 'undefined' ){ + exports = module.exports; + } else { + console.warn('I don\'t know where to export to....Enums.js'); + exports = {}; + } + +exports.Enum = (function () { + var Enum = function ( enums ) { + var i, + keys = [], + values = [], + length = 0; + +// if(!(enums instanceof Array)){ +// throw new SyntaxError('Enum input must be an Array'); +// } + + if ( enums instanceof Array ) { + for ( i = 0 ; i < enums.length ; i++ ) { + try { + Object.defineProperty( + this, + enums[i], + { + configurable: false, + enumerable: true, + value: i, + writable: false + } + ); + ++length; + values.push(i); + keys.push(enums[i]); + } catch (e) { + throw new TypeError('Enum Constructor Failure, you must pass a set of unique keys.'); + } + } + } else if ( enums instanceof Object ) { + for ( i in enums ) { + if ( enums.hasOwnProperty(i) ) { + if ( values.lastIndexOf(enums[i]) !== -1 ) { + throw new TypeError('Enum Constructor Failure, you must pass a unique value for each key'); + } + try { + Object.defineProperty( + this, + i, + { + configurable: false, + enumerable: true, + value: enums[i], + writable: false + } + ); + ++length; + values.push(enums[i]); + keys.push(i); + } catch (e) { + throw new TypeError('Enum Constructor Failure.'); + } + } + } + } + + Object.defineProperty(this, 'length', { + configurable: false, + enumerable: false, + value: length, + writable: false + }); + +// Object.defineProperty(this, 'keys', { +// configurable: false, +// enumerable: false, +// value: keys, +// writable: false +// }); +// Object.defineProperty(this, 'values', { +// configurable: false, +// enumerable: false, +// value: values, +// writable: false +// }); + + return Object.freeze(this); + }; + + // Prototype Functions + Object.defineProperties(Enum.prototype, { + /*'length':{ + configurable: false, + enumerable: false, + get: function () { + var count = 0; + for ( var prop in this ){ + ++count; + } + return count; + //return this.keys.length; + } + },*/ + 'keys':{ + configurable: false, + enumerable: false, + get: function () { + var keys = []; + for ( var prop in this ){ + if ( this.hasOwnProperty(prop) ){ + keys.push(prop); + } + } + return keys; + } + }, + 'values':{ + configurable: false, + enumerable: false, + get: function () { + var values = []; + for ( var prop in this ){ + if ( this.hasOwnProperty(prop) ){ + values.push(this[prop]); + } + } + return values; + } + }, + 'toString':{ + configurable: false, + enumerable: false, + writable: false, + value: function(){return '[object Enum]';} + } + }); + + // Export + return Enum; + +})(); + +})(); diff --git a/src/enum.js b/src/enum.js index 060cd7d..80066cf 100644 --- a/src/enum.js +++ b/src/enum.js @@ -1,82 +1,57 @@ -/*globals module */ -!(function(){ - 'use strict'; - var exports; +import define from './define'; - if( typeof window !== 'undefined'){ - exports = window; - } else if( typeof module !== 'undefined' ){ - exports = module.exports; - } else { - console.warn('I don\'t know where to export to....Enums.js'); - exports = {}; - } +var Enum; + +Enum = function( enums ) { + var + i, + keys = [], + values = [], + length = 0; -exports.Enum = (function () { - var Enum = function ( enums ) { - var i, - keys = [], - values = [], - length = 0; + if ( enums instanceof Array ) { + for ( i = 0 ; i < enums.length ; i++ ) { + try { -// if(!(enums instanceof Array)){ -// throw new SyntaxError('Enum input must be an Array'); -// } + define( this, enums[ i ], i); + ++length; + values.push( i ); + keys.push( enums[ i ]); - if ( enums instanceof Array ) { - for ( i = 0 ; i < enums.length ; i++ ) { + } catch ( e ) { + throw new TypeError('Enum Constructor Failure, you must pass a set of unique keys.'); + } + } + } else if ( enums instanceof Object ) { + for ( i in enums ) { + if ( enums.hasOwnProperty(i) ) { + if ( values.lastIndexOf(enums[i]) !== -1 ) { + throw new TypeError('Enum Constructor Failure, you must pass a unique value for each key'); + } try { - Object.defineProperty( - this, - enums[i], - { - configurable: false, - enumerable: true, - value: i, - writable: false - } - ); + + define( this, i, enums[ i ]); ++length; - values.push(i); - keys.push(enums[i]); + values.push( enums[ i ]); + keys.push( i ); + } catch (e) { - throw new TypeError('Enum Constructor Failure, you must pass a set of unique keys.'); - } - } - } else if ( enums instanceof Object ) { - for ( i in enums ) { - if ( enums.hasOwnProperty(i) ) { - if ( values.lastIndexOf(enums[i]) !== -1 ) { - throw new TypeError('Enum Constructor Failure, you must pass a unique value for each key'); - } - try { - Object.defineProperty( - this, - i, - { - configurable: false, - enumerable: true, - value: enums[i], - writable: false - } - ); - ++length; - values.push(enums[i]); - keys.push(i); - } catch (e) { - throw new TypeError('Enum Constructor Failure.'); - } + throw new TypeError('Enum Constructor Failure.'); } } } + } - Object.defineProperty(this, 'length', { - configurable: false, - enumerable: false, - value: length, - writable: false - }); + define( this, 'length', length, { enumerable: false }); + /* + Object.defineProperty(this, 'length', { + configurable: false, + enumerable: false, + value: length, + writable: false + }); + */ // Object.defineProperty(this, 'keys', { // configurable: false, @@ -91,60 +66,55 @@ exports.Enum = (function () { // writable: false // }); - return Object.freeze(this); - }; + return Object.freeze( this ); +}; - // Prototype Functions - Object.defineProperties(Enum.prototype, { - /*'length':{ - configurable: false, - enumerable: false, - get: function () { - var count = 0; - for ( var prop in this ){ - ++count; - } - return count; - //return this.keys.length; +// Prototype Functions +Object.defineProperties( Enum.prototype, { + /*length: { + configurable: false, + enumerable: false, + get: function() { + var count = 0; + for ( var prop in this ){ + ++count; } - },*/ - 'keys':{ - configurable: false, - enumerable: false, - get: function () { - var keys = []; - for ( var prop in this ){ - if ( this.hasOwnProperty(prop) ){ - keys.push(prop); - } + return count; + //return this.keys.length; + } + },*/ + keys: { + configurable: false, + enumerable: false, + get: function() { + var keys = []; + for ( let prop in this ){ + if ( this.hasOwnProperty(prop) ){ + keys.push(prop); } - return keys; } - }, - 'values':{ - configurable: false, - enumerable: false, - get: function () { - var values = []; - for ( var prop in this ){ - if ( this.hasOwnProperty(prop) ){ - values.push(this[prop]); - } + return keys; + } + }, + values: { + configurable: false, + enumerable: false, + get: function() { + var values = []; + for ( let prop in this ){ + if ( this.hasOwnProperty(prop) ){ + values.push(this[prop]); } - return values; } - }, - 'toString':{ - configurable: false, - enumerable: false, - writable: false, - value: function(){return '[object Enum]';} + return values; } - }); - - // Export - return Enum; - -})(); + }, + toString: { + configurable: false, + enumerable: false, + writable: false, + value: function() { return '[object Enum]'; } + } +}); -})(); +export default Enum; diff --git a/tests/create.js b/tests/create.js index b59661e..ad71fa1 100644 --- a/tests/create.js +++ b/tests/create.js @@ -1,8 +1,7 @@ 'use strict'; -var - test = require( 'tape' ), - Enum = require( '../src/enum' ).Enum; +import test from 'tape'; +import Enum from '../src/enum'; test( 'enums can be created from a list of strings', function( assert ) { var From 3ded5ac4d61029180f2dda5d1b7c19948a807154 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Sat, 2 Jan 2016 15:55:19 -0800 Subject: [PATCH 02/15] Started creating "assign" functionality + API file. The public API is now in 'src/api.js' and the 'enum.js' file will be refactored to be just the constructing logic. The assign functionality has been created, and should be fine for version 1.0, will write more tests later. --- package.json | 8 ++++++-- src/api.js | 16 ++++++++++++++++ src/assign.js | 13 +++++++++++++ src/define.js | 1 - tests/create.js | 17 ++++++++--------- 5 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 src/api.js create mode 100644 src/assign.js diff --git a/package.json b/package.json index 956340b..0328b76 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.1", "description": "A class for making ENUMs in JavaScript ES5", "main": "index.js", - "jsnext:main": "src/enum.js", + "jsnext:main": "src/api.js", "license": "MIT", "author": "Ryan Bogle ", "homepage": "https://github.com/Ashwell/EnumJS", @@ -18,10 +18,14 @@ "directories": { "test": "tests" }, + "config": { + "srcEntry": "src/api.js", + "dist": "dist/enum.js" + }, "scripts": { "clean:dist": "trash 'dist/*'", "prebuild": "npm run clean:dist", - "build": "browserify src/enum.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone enumFactory", + "build": "browserify src/api.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone enumFactory", "lint": "eslint .", "test": "browserify tests/create.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", "posttest": "", diff --git a/src/api.js b/src/api.js new file mode 100644 index 0000000..e68c81b --- /dev/null +++ b/src/api.js @@ -0,0 +1,16 @@ + +import enumFactory from './enum'; +import assign from './assign'; + +var assignTo; + +assignTo = function ( assignee, ...args ) { + assign( enumFactory( ...args ), assignee ); +}; + +enumFactory.assignTo = assignTo; +enumFactory.assign = assign; + +export default enumFactory; +export { assignTo as assignTo }; +export { default as assign } from './assign'; diff --git a/src/assign.js b/src/assign.js new file mode 100644 index 0000000..39905ad --- /dev/null +++ b/src/assign.js @@ -0,0 +1,13 @@ + +import define from './define'; +import enumFactory from './enum'; + +var assign; + +assign = function ( enumInstance, assignTo ) { + for ( let { key, value } of enumInstance ) { + define( assignTo, key, value ); + } +}; + +export default assign; diff --git a/src/define.js b/src/define.js index 00443b6..202278c 100644 --- a/src/define.js +++ b/src/define.js @@ -9,7 +9,6 @@ var define = function( instance, name, value, traits={}) { traits = Object.assign({}, defaults, traits, { value }); - console.log( traits ); return Object.defineProperty( instance, name, traits ); }; diff --git a/tests/create.js b/tests/create.js index ad71fa1..0deb5bc 100644 --- a/tests/create.js +++ b/tests/create.js @@ -1,14 +1,14 @@ 'use strict'; import test from 'tape'; -import Enum from '../src/enum'; +import Enum from '../src/api'; test( 'enums can be created from a list of strings', function( assert ) { var args = [ 'one', 'two', 'three', 'four', 'five' ], myEnum = new Enum( args ); - args.forEach(function( propName ) { + args.forEach( propName => { assert.true( propName in myEnum, propName + ' is in enum' ); }); @@ -18,15 +18,15 @@ test( 'enums can be created from a list of strings', function( assert ) { test( 'enums can be created from an object of name:value pairs', function( assert ) { var args = { - 1: 'one', - 2: 'two', - 3: 'three', - 4: 'four', - 5: 'five' + 1: 'a', + 2: 'b', + 3: 'c', + 4: 'd', + 5: 'e' }, myEnum = new Enum( args ); - Object.keys( args ).forEach(function( propName ) { + Object.keys( args ).forEach( propName => { var value = args[ propName ]; assert.true( propName in myEnum, propName + ' is in enum' ); @@ -35,4 +35,3 @@ test( 'enums can be created from an object of name:value pairs', function( asser assert.end(); }); - From 8f3cc9c7bb9310babfc77316d724f5dd1864e94e Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Mon, 4 Jan 2016 03:10:33 -0800 Subject: [PATCH 03/15] Created some test stubs for assign functions --- package.json | 2 +- tests/api.js | 16 ++++++++++++++++ tests/assign.js | 8 ++++++++ tests/assignTo.js | 10 ++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/api.js create mode 100644 tests/assign.js create mode 100644 tests/assignTo.js diff --git a/package.json b/package.json index 0328b76..7dea53a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "prebuild": "npm run clean:dist", "build": "browserify src/api.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone enumFactory", "lint": "eslint .", - "test": "browserify tests/create.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", + "test": "browserify tests/*.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", "posttest": "", "prepublish": "npm run build && npm test" }, diff --git a/tests/api.js b/tests/api.js new file mode 100644 index 0000000..ec548d1 --- /dev/null +++ b/tests/api.js @@ -0,0 +1,16 @@ + +import test from 'tape'; + +import enumFactory, { assign, assignTo } from '../src/api'; + +test( 'proper default and named exports', function( assert ) { + + assert.equal( typeof enumFactory, 'function', 'enumFactory is a function' ); + assert.equal( typeof assign, 'function', 'assign is a function and named export' ); + assert.equal( typeof assignTo, 'function', 'assignTo is a function and a named export' ); + + assert.equal( enumFactory.assign, assign, 'assign exists on enumFactory' ); + assert.equal( enumFactory.assignTo, assignTo, 'assignTo exists on enumFactory' ); + + assert.end(); +}); diff --git a/tests/assign.js b/tests/assign.js new file mode 100644 index 0000000..d42e282 --- /dev/null +++ b/tests/assign.js @@ -0,0 +1,8 @@ + +import test from 'tape'; + +import enumFactory, { assign } from '../src/api'; + +test( 'assign takes enum instance', function( assert ) { + assert.end(); +}); diff --git a/tests/assignTo.js b/tests/assignTo.js new file mode 100644 index 0000000..729cc77 --- /dev/null +++ b/tests/assignTo.js @@ -0,0 +1,10 @@ + +import test from 'tape'; + +import { assignTo } from '../src/api'; + +test( 'assignTo takes enum arguments', function( assign ) { + + assign.end(); +}); + From e945822c1961721044a8934f2dfc09e0d7bcf073 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Mon, 4 Jan 2016 22:28:08 -0800 Subject: [PATCH 04/15] WIP: Created some more tests and various helper modules --- src/api.js | 2 +- src/arg-parse.js | 59 +++++++++++++++++++++ src/create-proto.js | 13 +++++ src/define.js | 2 +- src/enum.js | 23 +++++++- tests/api.js | 126 ++++++++++++++++++++++++++++++++++++++++++-- tests/assign.js | 2 +- tests/assignTo.js | 3 +- tests/create.js | 5 +- 9 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 src/arg-parse.js create mode 100644 src/create-proto.js diff --git a/src/api.js b/src/api.js index e68c81b..02e8957 100644 --- a/src/api.js +++ b/src/api.js @@ -4,7 +4,7 @@ import assign from './assign'; var assignTo; -assignTo = function ( assignee, ...args ) { +assignTo = function( assignee, ...args ) { assign( enumFactory( ...args ), assignee ); }; diff --git a/src/arg-parse.js b/src/arg-parse.js new file mode 100644 index 0000000..7731fef --- /dev/null +++ b/src/arg-parse.js @@ -0,0 +1,59 @@ + +/** + * possible argument signatures + * $enum( ...names ) + * $enum({ name: value }) + * $enum([ names ]) + * $enum( startIndex, [ names ]) + * + * transformed to [ keys, [values] ] +**/ +var + intRange, + getKeyValueFromObject, + +intRange = function( first, last ) { + var + curr = typeof first === 'number' ? first : 0, + arr = [ curr ]; + + while ( last > ++curr ) { + arr.push( curr ); + } + + return arr; +}; + +getKeyValueFromObject = function( object ) { + var + keys = [], + values = []; + + Object.keys( object ).forEach( key => { + keys.push( key ); + values.push( object[ key ]); + }); + + return [ keys, values ]; +}; + +export default function argParse( ...args ) { + // single argument, ( object | array | string ) + if ( args.length === 1 ) { + // arg is a single object of key value pairs + if ( Object.isObject( args[ 0 ])) { + return getKeyValueFromObject( args[ 0 ]); + } + + // either [ names ] or 'single string' or just wrong + return [ args ]; + } + + // two arguments, ( startIndex, [ names ]) + if ( args.length === 2 ) { + return [ args[ 1 ], intRange( args[ 0 ], args[ 1 ].length )]; + } + + // "unlimited" args, ( ...names ); + return [ args, intRange( 0, args.length )]; +} diff --git a/src/create-proto.js b/src/create-proto.js new file mode 100644 index 0000000..26294a3 --- /dev/null +++ b/src/create-proto.js @@ -0,0 +1,13 @@ + +import define from './define'; + +export default function createProto( keys, values, constructor ) { + var proto = {}; + + define( proto, 'length', keys.length ); + define( proto, 'keys', keys, { enumerable: false }); + define( proto, 'values', values, { enumerable: false }); + proto.constructor = constructor; + + return Object.freeze( proto ); +} diff --git a/src/define.js b/src/define.js index 202278c..31610d0 100644 --- a/src/define.js +++ b/src/define.js @@ -4,7 +4,7 @@ var defaults = { configurable: false, enumerable: true, - writeable: false + writable: false }; define = function( instance, name, value, traits={}) { diff --git a/src/enum.js b/src/enum.js index 80066cf..19afa74 100644 --- a/src/enum.js +++ b/src/enum.js @@ -1,5 +1,24 @@ +// todo: constructor: ([ keys ], [ values ]=[ 0..keys.length ]) + import define from './define'; +import argParse from './arg-parse'; +import createProto from './create-proto'; + +var factory; + +factory = function( keys, values ) { + var Enum = function() { + keys.forEach(( key, index ) => define( this, key, values[ index ])); + }; + + Enum.prototype = createProto( keys, values, Enum ); + return Object.freeze( new Enum()); +}; + +export default function $enum( ...args ) { + return factory( argParse( ...args )); +} var Enum; @@ -117,4 +136,6 @@ Object.defineProperties( Enum.prototype, { } }); -export default Enum; +export default function $enum( enums ) { + return new Enum( enums ); +} diff --git a/tests/api.js b/tests/api.js index ec548d1..b189bea 100644 --- a/tests/api.js +++ b/tests/api.js @@ -1,16 +1,134 @@ import test from 'tape'; +import $enum, { assign, assignTo } from '../src/api'; -import enumFactory, { assign, assignTo } from '../src/api'; +var + descriptor, + addValue; test( 'proper default and named exports', function( assert ) { - assert.equal( typeof enumFactory, 'function', 'enumFactory is a function' ); + assert.equal( typeof $enum, 'function', '$enum is a function' ); assert.equal( typeof assign, 'function', 'assign is a function and named export' ); assert.equal( typeof assignTo, 'function', 'assignTo is a function and a named export' ); - assert.equal( enumFactory.assign, assign, 'assign exists on enumFactory' ); - assert.equal( enumFactory.assignTo, assignTo, 'assignTo exists on enumFactory' ); + assert.equal( $enum.assign, assign, 'assign exists on $enum' ); + assert.equal( $enum.assignTo, assignTo, 'assignTo exists on $enum' ); assert.end(); }); + +descriptor = { + configurable: false, + enumerable: true, + writable: false +}; + +addValue = function( value ) { + return Object.assign( descriptor, { value }); +}; + +/* constructor tests */ +test( '$enum( ...names )', function( assert ) { + var + i = 0, + args = [ 'zero', 'one', 'two', 'three' ], + myEnum = $enum( ...args ); + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.equals( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( i ), + `property ${ prop } has enum descriptor with value ${ i }` + ); + i++; + } + } + + assert.equal( i, args.length, 'iterated properties count matches argument list length' ); + assert.end(); +}); + +test( '$enum( { name: value })', function( assert ) { + var + length = 0, + argument = { + 1: 'a', + 2: 'b', + 3: 'c', + 4: 'd', + 5: 'e' + }, + myEnum = $enum( argument ); + + for ( let prop in argument ) { + if ( argument.hasOwnProperty( prop )) { + let value; + assert.equals( + value = argument[ prop ], + myEnum[ prop ], + `enum value mirrors object based argument, ${ prop }:${ value }` + ); + length++; + } + } + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( argument[ prop ]), + `property ${ prop } has enum descriptor with value ${ myEnum[ prop ]}` + ); + length--; + } + } + + assert.equal( length, 0, 'iterated properties count matches for both argument and enum' ); + assert.end(); +}); + +test( '$enum([ names ])', function( assert ) { + var + i = 0, + args = [ 'zero', 'one', 'two' ], + myEnum = $enum( args ); + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( i ), + `property ${ prop } has enum descriptor with value ${ i }` + ); + i++; + } + } + + assert.equals( i, args.length, 'iterated properties count matches argument length' ); + assert.end(); +}); + +test( '$enum( startIndex, [ names ])', function( assert ) { + var + i = 0, + startIndex = 2, + enumList = [ 'two', 'three', 'four', 'five', '6' ], + myEnum = $enum( startIndex, enumList ); + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + let value = i + startIndex; + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( value ), + `property ${ prop } has enum descriptor with value ${ value }` + ); + i++; + } + } + + assert.equals( i, enumList.length, 'iterated properties count matches enum argument list' ); + assert.end(); +}); diff --git a/tests/assign.js b/tests/assign.js index d42e282..c95e989 100644 --- a/tests/assign.js +++ b/tests/assign.js @@ -4,5 +4,5 @@ import test from 'tape'; import enumFactory, { assign } from '../src/api'; test( 'assign takes enum instance', function( assert ) { - assert.end(); + assert.fail( 'todo' ); }); diff --git a/tests/assignTo.js b/tests/assignTo.js index 729cc77..1bc7e90 100644 --- a/tests/assignTo.js +++ b/tests/assignTo.js @@ -4,7 +4,6 @@ import test from 'tape'; import { assignTo } from '../src/api'; test( 'assignTo takes enum arguments', function( assign ) { - - assign.end(); + assign.fail( 'todo' ); }); diff --git a/tests/create.js b/tests/create.js index 0deb5bc..676adb4 100644 --- a/tests/create.js +++ b/tests/create.js @@ -1,9 +1,8 @@ -'use strict'; import test from 'tape'; import Enum from '../src/api'; -test( 'enums can be created from a list of strings', function( assert ) { +test.skip( 'enums can be created from a list of strings', function( assert ) { var args = [ 'one', 'two', 'three', 'four', 'five' ], myEnum = new Enum( args ); @@ -15,7 +14,7 @@ test( 'enums can be created from a list of strings', function( assert ) { assert.end(); }); -test( 'enums can be created from an object of name:value pairs', function( assert ) { +test.skip( 'enums can be created from an object of name:value pairs', function( assert ) { var args = { 1: 'a', From 587106e40ca103241544775ee7b2cdca070a904d Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Wed, 6 Jan 2016 02:45:06 -0800 Subject: [PATCH 05/15] WIP from today, looking at moving to rollup tomorrow --- dist/enum.js | 421 ++++++++++++++++++++++++++++++-------------- index.js | 10 +- package.json | 4 +- src/api.es5.js | 10 ++ src/api.js | 16 +- src/arg-parse.js | 23 ++- src/assign-to.js | 11 ++ src/assign.js | 2 +- src/create-proto.js | 5 +- src/enum.js | 127 +------------ tests/api.js | 125 +------------ tests/assign.js | 4 +- tests/assignTo.js | 2 +- tests/browser.html | 3 + tests/create.js | 126 +++++++++++-- 15 files changed, 463 insertions(+), 426 deletions(-) create mode 100644 src/api.es5.js create mode 100644 src/assign-to.js create mode 100644 tests/browser.html diff --git a/dist/enum.js b/dist/enum.js index c4debcc..ce99e0c 100644 --- a/dist/enum.js +++ b/dist/enum.js @@ -1,148 +1,295 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.enumFactory = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o, [values] ] +**/ +var intRange, + getKeyValueFromObject, + intRange = function intRange(first, last) { + var curr = typeof first === 'number' ? first : 0, + arr = [curr]; + + while (last > ++curr) { + arr.push(curr); + } + + return arr; +}; + +getKeyValueFromObject = function (object) { + var keys = [], + values = []; + + Object.keys(object).forEach(function (key) { + keys.push(key); + values.push(object[key]); + }); + + return [keys, values]; +}; + +function argParse() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var first = args[0]; + var second = args[1]; + + // single argument, ( object | array | string ) + + if (args.length === 1) { + var firstType = typeof first === 'undefined' ? 'undefined' : _typeof(first), + firstIsArray = Array.isArray(first); + + // arg is a single object of key value pairs + if (firstType !== 'string' && !firstIsArray) { + return getKeyValueFromObject(first); + } + + // argument is a single array + if (firstIsArray) { + return [first, intRange(0, first.length)]; + } + + // argument is a 'single string' + return [args, [0]]; + } + + // two arguments, ( startIndex, [ names ]) + if (args.length === 2 && Array.isArray(second)) { + return [second, intRange(first, second.length + first)]; + } + + // "unlimited" args, ( ...names ); + return [args, intRange(0, args.length)]; +} + +},{}],3:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _argParse = require('./arg-parse'); + +var _argParse2 = _interopRequireDefault(_argParse); + +var _enum = require('./enum'); + +var _enum2 = _interopRequireDefault(_enum); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var assignTo; + +assignTo = function assignTo(assignee) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + assign(_enum2.default.apply(undefined, _toConsumableArray(_argParse2.default.apply(undefined, args))), assignee); +}; - Object.defineProperty(this, 'length', { - configurable: false, - enumerable: false, - value: length, - writable: false - }); - - // Object.defineProperty(this, 'keys', { - // configurable: false, - // enumerable: false, - // value: keys, - // writable: false - // }); - // Object.defineProperty(this, 'values', { - // configurable: false, - // enumerable: false, - // value: values, - // writable: false - // }); - - return Object.freeze(this); - }; - - // Prototype Functions - Object.defineProperties(Enum.prototype, { - /*'length':{ - configurable: false, - enumerable: false, - get: function () { - var count = 0; - for ( var prop in this ){ - ++count; - } - return count; - //return this.keys.length; - } - },*/ - 'keys': { - configurable: false, - enumerable: false, - get: function get() { - var keys = []; - for (var prop in this) { - if (this.hasOwnProperty(prop)) { - keys.push(prop); - } - } - return keys; - } - }, - 'values': { - configurable: false, - enumerable: false, - get: function get() { - var values = []; - for (var prop in this) { - if (this.hasOwnProperty(prop)) { - values.push(this[prop]); - } - } - return values; - } - }, - 'toString': { - configurable: false, - enumerable: false, - writable: false, - value: function value() { - return '[object Enum]'; - } +exports.default = assignTo; + +},{"./arg-parse":2,"./enum":7}],4:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _define = require('./define'); + +var _define2 = _interopRequireDefault(_define); + +var _enum = require('./enum'); + +var _enum2 = _interopRequireDefault(_enum); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var assign; + +assign = function (enumInstance, assignTo) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _step.value; + var key = _step$value.key; + var value = _step$value.value; + + (0, _define2.default)(assignTo, key, value); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +}; + +exports.default = assign; + +},{"./define":6,"./enum":7}],5:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = createProto; + +var _define = require('./define'); + +var _define2 = _interopRequireDefault(_define); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function createProto(keys, values, constructor) { + var proto = {}; + + (0, _define2.default)(proto, 'length', keys.length); + (0, _define2.default)(proto, 'keys', keys, { enumerable: false }); + (0, _define2.default)(proto, 'values', values, { enumerable: false }); + (0, _define2.default)(proto, 'toString'); + (0, _define2.default)(proto, Symbol.toStringTag, function () {}, { enumerable: false }); + (0, _define2.default)(proto, Symbol.iterator); + + proto.constructor = constructor; + return Object.freeze(proto); +} + +},{"./define":6}],6:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var define, + defaults = { + configurable: false, + enumerable: true, + writable: false +}; + +define = function (instance, name, value) { + var traits = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + traits = Object.assign({}, defaults, traits, { value: value }); + return Object.defineProperty(instance, name, traits); +}; + +exports.default = define; + +},{}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = $enum; + +var _define = require('./define'); + +var _define2 = _interopRequireDefault(_define); + +var _argParse = require('./arg-parse'); + +var _argParse2 = _interopRequireDefault(_argParse); + +var _createProto = require('./create-proto'); + +var _createProto2 = _interopRequireDefault(_createProto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var factory; + +factory = function (keys, values) { + // console.log( 'factory arguments: keys, values' ); + // console.log( keys ); + // console.log( values ); + var Enum = function Enum() { + var _this = this; + + keys.forEach(function (key, index) { + return (0, _define2.default)(_this, key, values[index]); }); + }; + + Enum.prototype = (0, _createProto2.default)(keys, values, Enum); + return Object.freeze(new Enum()); +}; - // Export - return Enum; - })(); -})(); +function $enum() { + return factory.apply(undefined, _toConsumableArray(_argParse2.default.apply(undefined, arguments))); +} -},{}]},{},[1])(1) +},{"./arg-parse":2,"./create-proto":5,"./define":6}]},{},[1])(1) }); \ No newline at end of file diff --git a/index.js b/index.js index e6d3109..148dd30 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,11 @@ 'use strict'; -module.exports = require( 'dist/enum.js' ); +var + $enum, + es6Module = require( './dist/enum.js' ); + +$enum = es6Module.default; +$enum.assign = es6Module.assign; +$enum.assignTo = es6Module.assignTo; + +module.exports = $enum; diff --git a/package.json b/package.json index 7dea53a..a1f444c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "enumJS", + "name": "enumjs", "private": true, "version": "0.0.1", "description": "A class for making ENUMs in JavaScript ES5", @@ -25,7 +25,7 @@ "scripts": { "clean:dist": "trash 'dist/*'", "prebuild": "npm run clean:dist", - "build": "browserify src/api.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone enumFactory", + "build": "browserify src/api.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone 'enumFactory'", "lint": "eslint .", "test": "browserify tests/*.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", "posttest": "", diff --git a/src/api.es5.js b/src/api.es5.js new file mode 100644 index 0000000..aaca108 --- /dev/null +++ b/src/api.es5.js @@ -0,0 +1,10 @@ + +import $enum from './enum'; +import assign from './assign'; +import assignTo from './assign-to'; + +$enum.assign = assign; +$enum.assignTo = assignTo; + +export default $enum; + diff --git a/src/api.js b/src/api.js index 02e8957..6460fa1 100644 --- a/src/api.js +++ b/src/api.js @@ -1,16 +1,6 @@ -import enumFactory from './enum'; -import assign from './assign'; +import $enum from './enum'; +export default $enum; -var assignTo; - -assignTo = function( assignee, ...args ) { - assign( enumFactory( ...args ), assignee ); -}; - -enumFactory.assignTo = assignTo; -enumFactory.assign = assign; - -export default enumFactory; -export { assignTo as assignTo }; export { default as assign } from './assign'; +export { default as assignTo } from './assign-to'; diff --git a/src/arg-parse.js b/src/arg-parse.js index 7731fef..2200e21 100644 --- a/src/arg-parse.js +++ b/src/arg-parse.js @@ -38,20 +38,31 @@ getKeyValueFromObject = function( object ) { }; export default function argParse( ...args ) { + var [ first, second ] = args; + // single argument, ( object | array | string ) if ( args.length === 1 ) { + let + firstType = typeof first, + firstIsArray = Array.isArray( first ); + // arg is a single object of key value pairs - if ( Object.isObject( args[ 0 ])) { - return getKeyValueFromObject( args[ 0 ]); + if ( firstType !== 'string' && !firstIsArray ) { + return getKeyValueFromObject( first ); + } + + // argument is a single array + if ( firstIsArray ) { + return [ first, intRange( 0, first.length )]; } - // either [ names ] or 'single string' or just wrong - return [ args ]; + // argument is a 'single string' + return [ args, [ 0 ]]; } // two arguments, ( startIndex, [ names ]) - if ( args.length === 2 ) { - return [ args[ 1 ], intRange( args[ 0 ], args[ 1 ].length )]; + if ( args.length === 2 && Array.isArray( second )) { + return [ second, intRange( first, second.length + first )]; } // "unlimited" args, ( ...names ); diff --git a/src/assign-to.js b/src/assign-to.js new file mode 100644 index 0000000..2181e87 --- /dev/null +++ b/src/assign-to.js @@ -0,0 +1,11 @@ + +import argParse from './arg-parse'; +import $enum from './enum'; + +var assignTo; + +assignTo = function assignTo( assignee, ...args ) { + assign( $enum( ...argParse( ...args )), assignee ); +}; + +export default assignTo; diff --git a/src/assign.js b/src/assign.js index 39905ad..79bb486 100644 --- a/src/assign.js +++ b/src/assign.js @@ -1,6 +1,6 @@ import define from './define'; -import enumFactory from './enum'; +import $enum from './enum'; var assign; diff --git a/src/create-proto.js b/src/create-proto.js index 26294a3..c4c5803 100644 --- a/src/create-proto.js +++ b/src/create-proto.js @@ -7,7 +7,10 @@ export default function createProto( keys, values, constructor ) { define( proto, 'length', keys.length ); define( proto, 'keys', keys, { enumerable: false }); define( proto, 'values', values, { enumerable: false }); - proto.constructor = constructor; + define( proto, 'toString' ); + define( proto, Symbol.toStringTag, function(){}, { enumerable: false }); + define( proto, Symbol.iterator ); + proto.constructor = constructor; return Object.freeze( proto ); } diff --git a/src/enum.js b/src/enum.js index 19afa74..a6bd3b1 100644 --- a/src/enum.js +++ b/src/enum.js @@ -1,6 +1,4 @@ -// todo: constructor: ([ keys ], [ values ]=[ 0..keys.length ]) - import define from './define'; import argParse from './arg-parse'; import createProto from './create-proto'; @@ -8,6 +6,9 @@ import createProto from './create-proto'; var factory; factory = function( keys, values ) { +// console.log( 'factory arguments: keys, values' ); +// console.log( keys ); +// console.log( values ); var Enum = function() { keys.forEach(( key, index ) => define( this, key, values[ index ])); }; @@ -17,125 +18,5 @@ factory = function( keys, values ) { }; export default function $enum( ...args ) { - return factory( argParse( ...args )); -} - -var Enum; - -Enum = function( enums ) { - var - i, - keys = [], - values = [], - length = 0; - - if ( enums instanceof Array ) { - for ( i = 0 ; i < enums.length ; i++ ) { - try { - - define( this, enums[ i ], i); - ++length; - values.push( i ); - keys.push( enums[ i ]); - - } catch ( e ) { - throw new TypeError('Enum Constructor Failure, you must pass a set of unique keys.'); - } - } - } else if ( enums instanceof Object ) { - for ( i in enums ) { - if ( enums.hasOwnProperty(i) ) { - if ( values.lastIndexOf(enums[i]) !== -1 ) { - throw new TypeError('Enum Constructor Failure, you must pass a unique value for each key'); - } - try { - - define( this, i, enums[ i ]); - ++length; - values.push( enums[ i ]); - keys.push( i ); - - } catch (e) { - throw new TypeError('Enum Constructor Failure.'); - } - } - } - } - - define( this, 'length', length, { enumerable: false }); - /* - Object.defineProperty(this, 'length', { - configurable: false, - enumerable: false, - value: length, - writable: false - }); - */ - -// Object.defineProperty(this, 'keys', { -// configurable: false, -// enumerable: false, -// value: keys, -// writable: false -// }); -// Object.defineProperty(this, 'values', { -// configurable: false, -// enumerable: false, -// value: values, -// writable: false -// }); - - return Object.freeze( this ); -}; - -// Prototype Functions -Object.defineProperties( Enum.prototype, { - /*length: { - configurable: false, - enumerable: false, - get: function() { - var count = 0; - for ( var prop in this ){ - ++count; - } - return count; - //return this.keys.length; - } - },*/ - keys: { - configurable: false, - enumerable: false, - get: function() { - var keys = []; - for ( let prop in this ){ - if ( this.hasOwnProperty(prop) ){ - keys.push(prop); - } - } - return keys; - } - }, - values: { - configurable: false, - enumerable: false, - get: function() { - var values = []; - for ( let prop in this ){ - if ( this.hasOwnProperty(prop) ){ - values.push(this[prop]); - } - } - return values; - } - }, - toString: { - configurable: false, - enumerable: false, - writable: false, - value: function() { return '[object Enum]'; } - } -}); - -export default function $enum( enums ) { - return new Enum( enums ); + return factory( ...argParse( ...args )); } diff --git a/tests/api.js b/tests/api.js index b189bea..5d0520f 100644 --- a/tests/api.js +++ b/tests/api.js @@ -2,133 +2,10 @@ import test from 'tape'; import $enum, { assign, assignTo } from '../src/api'; -var - descriptor, - addValue; - test( 'proper default and named exports', function( assert ) { - assert.equal( typeof $enum, 'function', '$enum is a function' ); assert.equal( typeof assign, 'function', 'assign is a function and named export' ); - assert.equal( typeof assignTo, 'function', 'assignTo is a function and a named export' ); - - assert.equal( $enum.assign, assign, 'assign exists on $enum' ); - assert.equal( $enum.assignTo, assignTo, 'assignTo exists on $enum' ); - - assert.end(); -}); - -descriptor = { - configurable: false, - enumerable: true, - writable: false -}; - -addValue = function( value ) { - return Object.assign( descriptor, { value }); -}; - -/* constructor tests */ -test( '$enum( ...names )', function( assert ) { - var - i = 0, - args = [ 'zero', 'one', 'two', 'three' ], - myEnum = $enum( ...args ); - - for ( let prop in myEnum ) { - if ( myEnum.hasOwnProperty( prop )) { - assert.equals( - Object.getOwnPropertyDescriptor( myEnum, prop ), - addValue( i ), - `property ${ prop } has enum descriptor with value ${ i }` - ); - i++; - } - } - - assert.equal( i, args.length, 'iterated properties count matches argument list length' ); - assert.end(); -}); - -test( '$enum( { name: value })', function( assert ) { - var - length = 0, - argument = { - 1: 'a', - 2: 'b', - 3: 'c', - 4: 'd', - 5: 'e' - }, - myEnum = $enum( argument ); - - for ( let prop in argument ) { - if ( argument.hasOwnProperty( prop )) { - let value; - assert.equals( - value = argument[ prop ], - myEnum[ prop ], - `enum value mirrors object based argument, ${ prop }:${ value }` - ); - length++; - } - } - - for ( let prop in myEnum ) { - if ( myEnum.hasOwnProperty( prop )) { - assert.deepEqual( - Object.getOwnPropertyDescriptor( myEnum, prop ), - addValue( argument[ prop ]), - `property ${ prop } has enum descriptor with value ${ myEnum[ prop ]}` - ); - length--; - } - } - - assert.equal( length, 0, 'iterated properties count matches for both argument and enum' ); + assert.equal( typeof assignTo, 'function', 'assignTo is a function and named export' ); assert.end(); }); -test( '$enum([ names ])', function( assert ) { - var - i = 0, - args = [ 'zero', 'one', 'two' ], - myEnum = $enum( args ); - - for ( let prop in myEnum ) { - if ( myEnum.hasOwnProperty( prop )) { - assert.deepEqual( - Object.getOwnPropertyDescriptor( myEnum, prop ), - addValue( i ), - `property ${ prop } has enum descriptor with value ${ i }` - ); - i++; - } - } - - assert.equals( i, args.length, 'iterated properties count matches argument length' ); - assert.end(); -}); - -test( '$enum( startIndex, [ names ])', function( assert ) { - var - i = 0, - startIndex = 2, - enumList = [ 'two', 'three', 'four', 'five', '6' ], - myEnum = $enum( startIndex, enumList ); - - for ( let prop in myEnum ) { - if ( myEnum.hasOwnProperty( prop )) { - let value = i + startIndex; - assert.deepEqual( - Object.getOwnPropertyDescriptor( myEnum, prop ), - addValue( value ), - `property ${ prop } has enum descriptor with value ${ value }` - ); - i++; - } - } - - assert.equals( i, enumList.length, 'iterated properties count matches enum argument list' ); - assert.end(); -}); diff --git a/tests/assign.js b/tests/assign.js index c95e989..1366ed6 100644 --- a/tests/assign.js +++ b/tests/assign.js @@ -1,8 +1,8 @@ import test from 'tape'; -import enumFactory, { assign } from '../src/api'; +import $enum, { assign } from '../src/api'; -test( 'assign takes enum instance', function( assert ) { +test.skip( 'assign takes enum instance', function( assert ) { assert.fail( 'todo' ); }); diff --git a/tests/assignTo.js b/tests/assignTo.js index 1bc7e90..de6ed11 100644 --- a/tests/assignTo.js +++ b/tests/assignTo.js @@ -3,7 +3,7 @@ import test from 'tape'; import { assignTo } from '../src/api'; -test( 'assignTo takes enum arguments', function( assign ) { +test.skip( 'assignTo takes enum arguments', function( assign ) { assign.fail( 'todo' ); }); diff --git a/tests/browser.html b/tests/browser.html new file mode 100644 index 0000000..a275977 --- /dev/null +++ b/tests/browser.html @@ -0,0 +1,3 @@ + + + diff --git a/tests/create.js b/tests/create.js index 676adb4..4190433 100644 --- a/tests/create.js +++ b/tests/create.js @@ -1,36 +1,132 @@ import test from 'tape'; -import Enum from '../src/api'; +import $enum from '../src/api'; -test.skip( 'enums can be created from a list of strings', function( assert ) { +var + descriptor, + addValue; + +descriptor = { + configurable: false, + enumerable: true, + writable: false +}; + +addValue = function( value ) { + return Object.assign( descriptor, { value }); +}; + +/* constructor tests */ +test( '$enum( ...names )', function( assert ) { var - args = [ 'one', 'two', 'three', 'four', 'five' ], - myEnum = new Enum( args ); + i = 0, + args = [ 'zero', 'one', 'two', 'three' ], + myEnum = $enum( ...args ); - args.forEach( propName => { - assert.true( propName in myEnum, propName + ' is in enum' ); - }); + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( i ), + `property ${ prop } has enum descriptor with value ${ i }` + ); + i++; + } + } + assert.equal( i, args.length, 'iterated properties count matches argument list length' ); assert.end(); }); -test.skip( 'enums can be created from an object of name:value pairs', function( assert ) { +test( '$enum( { name: value })', function( assert ) { var - args = { + length = 0, + argument = { 1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e' }, - myEnum = new Enum( args ); + myEnum = $enum( argument ); + + for ( let prop in argument ) { + if ( argument.hasOwnProperty( prop )) { + let value = argument[ prop ]; + assert.equals( + value, + myEnum[ prop ], + `enum value mirrors object based argument, ${ prop }:${ value }` + ); + length++; + } + } + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( argument[ prop ]), + `property ${ prop } has enum descriptor with value ${ myEnum[ prop ]}` + ); + length--; + } + } - Object.keys( args ).forEach( propName => { - var value = args[ propName ]; + assert.equal( length, 0, 'iterated properties count matches for both argument and enum' ); + assert.end(); +}); + +test( '$enum([ names ])', function( assert ) { + var + i = 0, + args = [ 'zero', 'one', 'two' ], + myEnum = $enum( args ); - assert.true( propName in myEnum, propName + ' is in enum' ); - assert.true( value === myEnum[ propName ], propName + ' maps to ' + value + ' in enum' ); - }); + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( i ), + `property ${ prop } has enum descriptor with value ${ i }` + ); + i++; + } + } + assert.equals( i, args.length, 'iterated properties count matches argument length' ); assert.end(); }); + +test( '$enum( startIndex, [ names ])', function( assert ) { + var + i = 0, + startIndex = 2, + enumValues, + enumList = [ 'two', 'three', 'four', 'five', '6' ], + myEnum = $enum( startIndex, enumList ); + + enumValues = { + two: 2, + three: 3, + four: 4, + five: 5, + 6: 6 + }; + + for ( let prop in myEnum ) { + if ( myEnum.hasOwnProperty( prop )) { + let value = enumValues[ prop ]; + assert.deepEqual( + Object.getOwnPropertyDescriptor( myEnum, prop ), + addValue( value ), + `property ${ prop } has enum descriptor with value ${ value }` + ); + i++; + } + } + + assert.equals( i, enumList.length, 'iterated properties count matches enum argument list' ); + assert.end(); +}); + From 8d0021b58885e15b7e427010e9b8307088b37fe3 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 20:41:15 -0800 Subject: [PATCH 06/15] Two types of rollup config, api and cli Playing with rollup configurations... I don't like having a bunch of config files but the separation is nicer. Will probably try to combine the best of both styles. --- .nvmrc | 1 + build.js | 53 +++++++ build/enum.tests.js | 303 +++++++++++++++++++++++++++++++++++++++ build/enum.tests.js.map | 1 + configs/rollup.config.js | 12 ++ configs/rollup.es6.js | 8 ++ configs/rollup.tests.js | 11 ++ configs/rollup.umd.js | 8 ++ dist/enum.js | 246 +++++++++---------------------- dist/enum.js.map | 1 + dist/enum.umd.js | 194 +++++++++++++++++++++++++ dist/enum.umd.js.map | 1 + index.js | 10 +- package.json | 85 ++++++++--- 14 files changed, 724 insertions(+), 210 deletions(-) create mode 100644 .nvmrc create mode 100644 build.js create mode 100644 build/enum.tests.js create mode 100644 build/enum.tests.js.map create mode 100644 configs/rollup.config.js create mode 100644 configs/rollup.es6.js create mode 100644 configs/rollup.tests.js create mode 100644 configs/rollup.umd.js create mode 100644 dist/enum.js.map create mode 100644 dist/enum.umd.js create mode 100644 dist/enum.umd.js.map diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..d3845ad --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v5.0.0 diff --git a/build.js b/build.js new file mode 100644 index 0000000..07b65ba --- /dev/null +++ b/build.js @@ -0,0 +1,53 @@ +'use strict'; + +var + configs, + _package = require( './package.json' ), + chalk = require( 'chalk' ), + util = require( 'util' ), + rollup = require( 'rollup' ), + babel = require( 'rollup-plugin-babel' ); + +// combine "config.common" with each config of config.builds +configs = _package.config.builds.map( build => Object.assign({}, _package.config.common, build )); + +util.log( chalk.cyan( 'Starting up rollup builds' )); +Promise.all( + configs.map(function( config ) { + util.log( chalk.yellow( `starting ${config.format} bundle` )); + return rollup.rollup({ + entry: config.entry, + plugins: [ + babel() + ] +// external: [ '' ], +// onwarn: () => {}, + }) + .then(function( bundle ) { + util.log( chalk.blue( `writing ${config.format} bundle`)); + return bundle.write({ + dest: config.dest, + format: config.format, + exports: config.exports, + moduleId: _package.name, + moduleName: config.moduleName, + sourceMap: config.sourceMap +// sourceMap: 'inline' || true +// globals: { +// id: 'name on global' +// }, +// indent: false || true, +// banner: '/* hello world */', +// footer: '/* goodbye world */', +// intro: '', +// outro: '', +// useStrict: true || false, + }); + }) + .then(function() { util.log( chalk.green( `${config.format} done` )); }); + })) + .then(function() { util.log( chalk.cyan( 'rollup builds done' )); }) + .catch(function( error ) { + util.log( chalk.red( 'error with rollup build' )); + console.error( error.stack ); + }); diff --git a/build/enum.tests.js b/build/enum.tests.js new file mode 100644 index 0000000..e15da70 --- /dev/null +++ b/build/enum.tests.js @@ -0,0 +1,303 @@ +'use strict'; + +var test = require('tape'); +test = 'default' in test ? test['default'] : test; + +var babelHelpers_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; +}; + +var babelHelpers_toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +var define; +var defaults = { + configurable: false, + enumerable: true, + writable: false +}; +define = function define(instance, name, value) { + var traits = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + traits = Object.assign({}, defaults, traits, { value: value }); + return Object.defineProperty(instance, name, traits); +}; + +var define$1 = define; + +/** + * possible argument signatures + * $enum( ...names ) + * $enum({ name: value }) + * $enum([ names ]) + * $enum( startIndex, [ names ]) + * + * transformed to [ keys, [values] ] +**/ +var getKeyValueFromObject; +var intRange = function intRange(first, last) { + var curr = typeof first === 'number' ? first : 0, + arr = [curr]; + + while (last > ++curr) { + arr.push(curr); + } + + return arr; +}; +getKeyValueFromObject = function getKeyValueFromObject(object) { + var keys = [], + values = []; + + Object.keys(object).forEach(function (key) { + keys.push(key); + values.push(object[key]); + }); + + return [keys, values]; +}; + +function argParse() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var first = args[0]; + var second = args[1]; + + // single argument, ( object | array | string ) + + if (args.length === 1) { + var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), + firstIsArray = Array.isArray(first); + + // arg is a single object of key value pairs + if (firstType !== 'string' && !firstIsArray) { + return getKeyValueFromObject(first); + } + + // argument is a single array + if (firstIsArray) { + return [first, intRange(0, first.length)]; + } + + // argument is a 'single string' + return [args, [0]]; + } + + // two arguments, ( startIndex, [ names ]) + if (args.length === 2 && Array.isArray(second)) { + return [second, intRange(first, second.length + first)]; + } + + // "unlimited" args, ( ...names ); + return [args, intRange(0, args.length)]; +} + +function createProto(keys, values, constructor) { + var proto = {}; + + define$1(proto, 'length', keys.length); + define$1(proto, 'keys', keys, { enumerable: false }); + define$1(proto, 'values', values, { enumerable: false }); + define$1(proto, 'toString'); + define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); + define$1(proto, Symbol.iterator); + + proto.constructor = constructor; + return Object.freeze(proto); +} + +var factory; + +factory = function factory(keys, values) { + // console.log( 'factory arguments: keys, values' ); + // console.log( keys ); + // console.log( values ); + var Enum = function Enum() { + var _this = this; + + keys.forEach(function (key, index) { + return define$1(_this, key, values[index]); + }); + }; + + Enum.prototype = createProto(keys, values, Enum); + return Object.freeze(new Enum()); +}; + +function $enum() { + return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); +} + +var assign$1; + +assign$1 = function assign(enumInstance, assignTo) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _step.value; + var key = _step$value.key; + var value = _step$value.value; + + define$1(assignTo, key, value); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } +}; + +var assign$2 = assign$1; + +var assignTo; + +assignTo = function assignTo(assignee) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); +}; + +var assignTo$1 = assignTo; + +test('proper default and named exports', function (assert) { + assert.equal(typeof $enum === 'undefined' ? 'undefined' : babelHelpers_typeof($enum), 'function', '$enum is a function'); + assert.equal(typeof assign$2 === 'undefined' ? 'undefined' : babelHelpers_typeof(assign$2), 'function', 'assign is a function and named export'); + assert.equal(typeof assignTo$1 === 'undefined' ? 'undefined' : babelHelpers_typeof(assignTo$1), 'function', 'assignTo is a function and named export'); + assert.end(); +}); + +test.skip('assign takes enum instance', function (assert) { + assert.fail('todo'); +}); + +test.skip('assignTo takes enum arguments', function (assign) { + assign.fail('todo'); +}); + +var descriptor; +var addValue; +descriptor = { + configurable: false, + enumerable: true, + writable: false +}; + +addValue = function addValue(value) { + return Object.assign(descriptor, { value: value }); +}; + +/* constructor tests */ +test('$enum( ...names )', function (assert) { + var i = 0, + args = ['zero', 'one', 'two', 'three'], + myEnum = $enum.apply(undefined, args); + + for (var prop in myEnum) { + if (myEnum.hasOwnProperty(prop)) { + assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(i), 'property ' + prop + ' has enum descriptor with value ' + i); + i++; + } + } + + assert.equal(i, args.length, 'iterated properties count matches argument list length'); + assert.end(); +}); + +test('$enum( { name: value })', function (assert) { + var length = 0, + argument = { + 1: 'a', + 2: 'b', + 3: 'c', + 4: 'd', + 5: 'e' + }, + myEnum = $enum(argument); + + for (var prop in argument) { + if (argument.hasOwnProperty(prop)) { + var value = argument[prop]; + assert.equals(value, myEnum[prop], 'enum value mirrors object based argument, ' + prop + ':' + value); + length++; + } + } + + for (var prop in myEnum) { + if (myEnum.hasOwnProperty(prop)) { + assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(argument[prop]), 'property ' + prop + ' has enum descriptor with value ' + myEnum[prop]); + length--; + } + } + + assert.equal(length, 0, 'iterated properties count matches for both argument and enum'); + assert.end(); +}); + +test('$enum([ names ])', function (assert) { + var i = 0, + args = ['zero', 'one', 'two'], + myEnum = $enum(args); + + for (var prop in myEnum) { + if (myEnum.hasOwnProperty(prop)) { + assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(i), 'property ' + prop + ' has enum descriptor with value ' + i); + i++; + } + } + + assert.equals(i, args.length, 'iterated properties count matches argument length'); + assert.end(); +}); + +test('$enum( startIndex, [ names ])', function (assert) { + var i = 0, + startIndex = 2, + enumValues, + enumList = ['two', 'three', 'four', 'five', '6'], + myEnum = $enum(startIndex, enumList); + + enumValues = { + two: 2, + three: 3, + four: 4, + five: 5, + 6: 6 + }; + + for (var prop in myEnum) { + if (myEnum.hasOwnProperty(prop)) { + var value = enumValues[prop]; + assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(value), 'property ' + prop + ' has enum descriptor with value ' + value); + i++; + } + } + + assert.equals(i, enumList.length, 'iterated properties count matches enum argument list'); + assert.end(); +}); +//# sourceMappingURL=enum.tests.js.map \ No newline at end of file diff --git a/build/enum.tests.js.map b/build/enum.tests.js.map new file mode 100644 index 0000000..37d9468 --- /dev/null +++ b/build/enum.tests.js.map @@ -0,0 +1 @@ +{"version":3,"file":"enum.tests.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js","../tests/api.js","../tests/assign.js","../tests/assignTo.js","../tests/create.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n","\nimport test from 'tape';\nimport $enum, { assign, assignTo } from '../src/api';\n\ntest( 'proper default and named exports', function( assert ) {\n assert.equal( typeof $enum, 'function', '$enum is a function' );\n assert.equal( typeof assign, 'function', 'assign is a function and named export' );\n assert.equal( typeof assignTo, 'function', 'assignTo is a function and named export' );\n assert.end();\n});\n\n","\nimport test from 'tape';\n\nimport $enum, { assign } from '../src/api';\n\ntest.skip( 'assign takes enum instance', function( assert ) {\n assert.fail( 'todo' );\n});\n","\nimport test from 'tape';\n\nimport { assignTo } from '../src/api';\n\ntest.skip( 'assignTo takes enum arguments', function( assign ) {\n assign.fail( 'todo' );\n});\n\n","\nimport test from 'tape';\nimport $enum from '../src/api';\n\nvar\n descriptor,\n addValue;\n\ndescriptor = {\n configurable: false,\n enumerable: true,\n writable: false\n};\n\naddValue = function( value ) {\n return Object.assign( descriptor, { value });\n};\n\n/* constructor tests */\ntest( '$enum( ...names )', function( assert ) {\n var\n i = 0,\n args = [ 'zero', 'one', 'two', 'three' ],\n myEnum = $enum( ...args );\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( i ),\n `property ${ prop } has enum descriptor with value ${ i }`\n );\n i++;\n }\n }\n\n assert.equal( i, args.length, 'iterated properties count matches argument list length' );\n assert.end();\n});\n\ntest( '$enum( { name: value })', function( assert ) {\n var\n length = 0,\n argument = {\n 1: 'a',\n 2: 'b',\n 3: 'c',\n 4: 'd',\n 5: 'e'\n },\n myEnum = $enum( argument );\n\n for ( let prop in argument ) {\n if ( argument.hasOwnProperty( prop )) {\n let value = argument[ prop ];\n assert.equals(\n value,\n myEnum[ prop ],\n `enum value mirrors object based argument, ${ prop }:${ value }`\n );\n length++;\n }\n }\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( argument[ prop ]),\n `property ${ prop } has enum descriptor with value ${ myEnum[ prop ]}`\n );\n length--;\n }\n }\n\n assert.equal( length, 0, 'iterated properties count matches for both argument and enum' );\n assert.end();\n});\n\ntest( '$enum([ names ])', function( assert ) {\n var\n i = 0,\n args = [ 'zero', 'one', 'two' ],\n myEnum = $enum( args );\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( i ),\n `property ${ prop } has enum descriptor with value ${ i }`\n );\n i++;\n }\n }\n\n assert.equals( i, args.length, 'iterated properties count matches argument length' );\n assert.end();\n});\n\ntest( '$enum( startIndex, [ names ])', function( assert ) {\n var\n i = 0,\n startIndex = 2,\n enumValues,\n enumList = [ 'two', 'three', 'four', 'five', '6' ],\n myEnum = $enum( startIndex, enumList );\n\n enumValues = {\n two: 2,\n three: 3,\n four: 4,\n five: 5,\n 6: 6\n };\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n let value = enumValues[ prop ];\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( value ),\n `property ${ prop } has enum descriptor with value ${ value }`\n );\n i++;\n }\n }\n\n assert.equals( i, enumList.length, 'iterated properties count matches enum argument list' );\n assert.end();\n});\n\n"],"names":["define","assign","assignTo"],"mappings":"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"} \ No newline at end of file diff --git a/configs/rollup.config.js b/configs/rollup.config.js new file mode 100644 index 0000000..6cb62fe --- /dev/null +++ b/configs/rollup.config.js @@ -0,0 +1,12 @@ + +import babel from 'rollup-plugin-babel'; + +export default { +// exports: 'auto', + moduleName: '$enum', + sourceMap: true, + plugins: [ + babel() + ] +}; + diff --git a/configs/rollup.es6.js b/configs/rollup.es6.js new file mode 100644 index 0000000..c40a4a6 --- /dev/null +++ b/configs/rollup.es6.js @@ -0,0 +1,8 @@ + +import config from './rollup.config'; + +config.entry = 'src/api.js'; +config.format = 'es6'; +config.dest = 'dist/enum.js'; + +export default config; diff --git a/configs/rollup.tests.js b/configs/rollup.tests.js new file mode 100644 index 0000000..18d8369 --- /dev/null +++ b/configs/rollup.tests.js @@ -0,0 +1,11 @@ + +import multiEntry, { entry } from 'rollup-plugin-multi-entry'; +import config from './rollup.config'; + +config.entry = entry; +config.format = 'cjs'; +config.dest = 'build/enum.tests.js'; +config.external = [ 'tape' ]; +config.plugins.push( multiEntry( 'tests/**/*.js' )); + +export default config; diff --git a/configs/rollup.umd.js b/configs/rollup.umd.js new file mode 100644 index 0000000..23f1ef8 --- /dev/null +++ b/configs/rollup.umd.js @@ -0,0 +1,8 @@ + +import config from './rollup.config'; + +config.entry = 'src/api.es5.js'; +config.format = 'umd'; +config.dest = 'dist/enum.umd.js'; + +export default config; diff --git a/dist/enum.js b/dist/enum.js index ce99e0c..e9d4b73 100644 --- a/dist/enum.js +++ b/dist/enum.js @@ -1,46 +1,33 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.enumFactory = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o, [values] ] **/ -var intRange, - getKeyValueFromObject, - intRange = function intRange(first, last) { +var getKeyValueFromObject; +var intRange = function intRange(first, last) { var curr = typeof first === 'number' ? first : 0, arr = [curr]; @@ -63,8 +49,7 @@ var intRange, return arr; }; - -getKeyValueFromObject = function (object) { +getKeyValueFromObject = function getKeyValueFromObject(object) { var keys = [], values = []; @@ -87,7 +72,7 @@ function argParse() { // single argument, ( object | array | string ) if (args.length === 1) { - var firstType = typeof first === 'undefined' ? 'undefined' : _typeof(first), + var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), firstIsArray = Array.isArray(first); // arg is a single object of key value pairs @@ -113,57 +98,45 @@ function argParse() { return [args, intRange(0, args.length)]; } -},{}],3:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _argParse = require('./arg-parse'); - -var _argParse2 = _interopRequireDefault(_argParse); - -var _enum = require('./enum'); +function createProto(keys, values, constructor) { + var proto = {}; -var _enum2 = _interopRequireDefault(_enum); + define$1(proto, 'length', keys.length); + define$1(proto, 'keys', keys, { enumerable: false }); + define$1(proto, 'values', values, { enumerable: false }); + define$1(proto, 'toString'); + define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); + define$1(proto, Symbol.iterator); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + proto.constructor = constructor; + return Object.freeze(proto); +} -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } +var factory; -var assignTo; +factory = function factory(keys, values) { + // console.log( 'factory arguments: keys, values' ); + // console.log( keys ); + // console.log( values ); + var Enum = function Enum() { + var _this = this; -assignTo = function assignTo(assignee) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } + keys.forEach(function (key, index) { + return define$1(_this, key, values[index]); + }); + }; - assign(_enum2.default.apply(undefined, _toConsumableArray(_argParse2.default.apply(undefined, args))), assignee); + Enum.prototype = createProto(keys, values, Enum); + return Object.freeze(new Enum()); }; -exports.default = assignTo; - -},{"./arg-parse":2,"./enum":7}],4:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _define = require('./define'); - -var _define2 = _interopRequireDefault(_define); - -var _enum = require('./enum'); - -var _enum2 = _interopRequireDefault(_enum); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function $enum() { + return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); +} -var assign; +var assign$1; -assign = function (enumInstance, assignTo) { +assign$1 = function assign(enumInstance, assignTo) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; @@ -174,7 +147,7 @@ assign = function (enumInstance, assignTo) { var key = _step$value.key; var value = _step$value.value; - (0, _define2.default)(assignTo, key, value); + define$1(assignTo, key, value); } } catch (err) { _didIteratorError = true; @@ -192,104 +165,19 @@ assign = function (enumInstance, assignTo) { } }; -exports.default = assign; - -},{"./define":6,"./enum":7}],5:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = createProto; +var assign$2 = assign$1; -var _define = require('./define'); - -var _define2 = _interopRequireDefault(_define); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function createProto(keys, values, constructor) { - var proto = {}; - - (0, _define2.default)(proto, 'length', keys.length); - (0, _define2.default)(proto, 'keys', keys, { enumerable: false }); - (0, _define2.default)(proto, 'values', values, { enumerable: false }); - (0, _define2.default)(proto, 'toString'); - (0, _define2.default)(proto, Symbol.toStringTag, function () {}, { enumerable: false }); - (0, _define2.default)(proto, Symbol.iterator); - - proto.constructor = constructor; - return Object.freeze(proto); -} - -},{"./define":6}],6:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var define, - defaults = { - configurable: false, - enumerable: true, - writable: false -}; - -define = function (instance, name, value) { - var traits = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; - - traits = Object.assign({}, defaults, traits, { value: value }); - return Object.defineProperty(instance, name, traits); -}; - -exports.default = define; - -},{}],7:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = $enum; - -var _define = require('./define'); - -var _define2 = _interopRequireDefault(_define); - -var _argParse = require('./arg-parse'); - -var _argParse2 = _interopRequireDefault(_argParse); - -var _createProto = require('./create-proto'); - -var _createProto2 = _interopRequireDefault(_createProto); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -var factory; - -factory = function (keys, values) { - // console.log( 'factory arguments: keys, values' ); - // console.log( keys ); - // console.log( values ); - var Enum = function Enum() { - var _this = this; +var assignTo; - keys.forEach(function (key, index) { - return (0, _define2.default)(_this, key, values[index]); - }); - }; +assignTo = function assignTo(assignee) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } - Enum.prototype = (0, _createProto2.default)(keys, values, Enum); - return Object.freeze(new Enum()); + assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); }; -function $enum() { - return factory.apply(undefined, _toConsumableArray(_argParse2.default.apply(undefined, arguments))); -} +var assignTo$1 = assignTo; -},{"./arg-parse":2,"./create-proto":5,"./define":6}]},{},[1])(1) -}); \ No newline at end of file +export { assign$2 as assign, assignTo$1 as assignTo };export default $enum; +//# sourceMappingURL=enum.js.map \ No newline at end of file diff --git a/dist/enum.js.map b/dist/enum.js.map new file mode 100644 index 0000000..722981e --- /dev/null +++ b/dist/enum.js.map @@ -0,0 +1 @@ +{"version":3,"file":"enum.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n"],"names":["define","assign"],"mappings":"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"} \ No newline at end of file diff --git a/dist/enum.umd.js b/dist/enum.umd.js new file mode 100644 index 0000000..e048d9b --- /dev/null +++ b/dist/enum.umd.js @@ -0,0 +1,194 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.$enum = factory()); +}(this, function () { 'use strict'; + + var babelHelpers_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; + }; + + var babelHelpers_toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + var define; + var defaults = { + configurable: false, + enumerable: true, + writable: false + }; + define = function define(instance, name, value) { + var traits = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + traits = Object.assign({}, defaults, traits, { value: value }); + return Object.defineProperty(instance, name, traits); + }; + + var define$1 = define; + + /** + * possible argument signatures + * $enum( ...names ) + * $enum({ name: value }) + * $enum([ names ]) + * $enum( startIndex, [ names ]) + * + * transformed to [ keys, [values] ] + **/ + var getKeyValueFromObject; + var intRange = function intRange(first, last) { + var curr = typeof first === 'number' ? first : 0, + arr = [curr]; + + while (last > ++curr) { + arr.push(curr); + } + + return arr; + }; + getKeyValueFromObject = function getKeyValueFromObject(object) { + var keys = [], + values = []; + + Object.keys(object).forEach(function (key) { + keys.push(key); + values.push(object[key]); + }); + + return [keys, values]; + }; + + function argParse() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var first = args[0]; + var second = args[1]; + + // single argument, ( object | array | string ) + + if (args.length === 1) { + var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), + firstIsArray = Array.isArray(first); + + // arg is a single object of key value pairs + if (firstType !== 'string' && !firstIsArray) { + return getKeyValueFromObject(first); + } + + // argument is a single array + if (firstIsArray) { + return [first, intRange(0, first.length)]; + } + + // argument is a 'single string' + return [args, [0]]; + } + + // two arguments, ( startIndex, [ names ]) + if (args.length === 2 && Array.isArray(second)) { + return [second, intRange(first, second.length + first)]; + } + + // "unlimited" args, ( ...names ); + return [args, intRange(0, args.length)]; + } + + function createProto(keys, values, constructor) { + var proto = {}; + + define$1(proto, 'length', keys.length); + define$1(proto, 'keys', keys, { enumerable: false }); + define$1(proto, 'values', values, { enumerable: false }); + define$1(proto, 'toString'); + define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); + define$1(proto, Symbol.iterator); + + proto.constructor = constructor; + return Object.freeze(proto); + } + + var factory; + + factory = function factory(keys, values) { + // console.log( 'factory arguments: keys, values' ); + // console.log( keys ); + // console.log( values ); + var Enum = function Enum() { + var _this = this; + + keys.forEach(function (key, index) { + return define$1(_this, key, values[index]); + }); + }; + + Enum.prototype = createProto(keys, values, Enum); + return Object.freeze(new Enum()); + }; + + function $enum() { + return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); + } + + var assign$1; + + assign$1 = function assign(enumInstance, assignTo) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _step.value; + var key = _step$value.key; + var value = _step$value.value; + + define$1(assignTo, key, value); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + }; + + var assign$2 = assign$1; + + var assignTo; + + assignTo = function assignTo(assignee) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); + }; + + var assignTo$1 = assignTo; + + $enum.assign = assign$2; + $enum.assignTo = assignTo$1; + + return $enum; + +})); +//# sourceMappingURL=enum.umd.js.map \ No newline at end of file diff --git a/dist/enum.umd.js.map b/dist/enum.umd.js.map new file mode 100644 index 0000000..fd6d0ba --- /dev/null +++ b/dist/enum.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"enum.umd.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js","../src/api.es5.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n","\nimport $enum from './enum';\nimport assign from './assign';\nimport assignTo from './assign-to';\n\n$enum.assign = assign;\n$enum.assignTo = assignTo;\n\nexport default $enum;\n\n"],"names":["define","assign","assignTo"],"mappings":"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"} \ No newline at end of file diff --git a/index.js b/index.js index 148dd30..60d992b 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,3 @@ 'use strict'; -var - $enum, - es6Module = require( './dist/enum.js' ); - -$enum = es6Module.default; -$enum.assign = es6Module.assign; -$enum.assignTo = es6Module.assignTo; - -module.exports = $enum; +module.exports = require( './dist/enum.umd.js' ); diff --git a/package.json b/package.json index a1f444c..f901a69 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,64 @@ "version": "0.0.1", "description": "A class for making ENUMs in JavaScript ES5", "main": "index.js", - "jsnext:main": "src/api.js", + "jsnext:main": "dest/enum.js", + "config": { + "builds": [ + { + "format": "umd", + "entry": "src/api.es5.js", + "dest": "dist/enum.umd.js" + }, + { + "format": "es6", + "entry": "src/api.js", + "dest": "dist/enum.js" + }, + { + "format": "cjs", + "entry": "test", + "dest": "build/tests.js" + } + ], + "common": { + "exports": "auto", + "moduleName": "$enum", + "sourceMap": true + } + }, + "babel": { + "presets": [ + "es2015-rollup" + ] + }, + "scripts": { + "clean:dist": "trash 'dist/*'", + "prebuild": "npm run clean:dist", + "build:es6": "rollup -c configs/rollup.es6.js", + "build:umd": "rollup -c configs/rollup.umd.js", + "build:tests": "rollup -c configs/rollup.tests.js", + "build": "npm-run-all -p build:es6 build:umd", + "lint": "eslint .", + "pretest": "npm run build:tests", + "test": "node ./build/enum.tests.js | tap-spec", + "posttest": "echo 'todo'", + "prepublish": "npm run build && npm test", + "rollup": "rollup", + "trash": "trash" + }, + "files": [ + "dist", + "README.md" + ], + "directories": { + "doc": "docs", + "example": "example", + "lib": "dist", + "test": "tests" + }, + "keywords": [], "license": "MIT", - "author": "Ryan Bogle ", + "author": "Ryan Bogle", "homepage": "https://github.com/Ashwell/EnumJS", "repository": { "type": "git", @@ -15,29 +70,15 @@ "bugs": { "url": "https://github.com/Ashwell/EnumJS/issues" }, - "directories": { - "test": "tests" - }, - "config": { - "srcEntry": "src/api.js", - "dist": "dist/enum.js" - }, - "scripts": { - "clean:dist": "trash 'dist/*'", - "prebuild": "npm run clean:dist", - "build": "browserify src/api.js -o dist/enum.js -t [ babelify --presets [ es2015 ] ] --standalone 'enumFactory'", - "lint": "eslint .", - "test": "browserify tests/*.js -t [ babelify --presets [ es2015 ] ] | node | tap-spec", - "posttest": "", - "prepublish": "npm run build && npm test" - }, "devDependencies": { - "babel-cli": "^6.3.17", "babel-eslint": "^5.0.0-beta6", - "babel-preset-es2015": "^6.3.13", - "babelify": "^7.2.0", - "browserify": "^12.0.1", + "babel-preset-es2015-rollup": "^1.0.0", + "chalk": "^1.1.1", "eslint": "^1.10.3", + "npm-run-all": "^1.4.0", + "rollup": "^0.24.0", + "rollup-plugin-babel": "^2.3.8", + "rollup-plugin-multi-entry": "^1.0.1", "tap-spec": "^4.1.1", "tape": "^4.4.0", "trash-cli": "^1.2.0" From 4a229f257a1209c1d921fd839c91265913de2723 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 21:07:16 -0800 Subject: [PATCH 07/15] First draft updates to README --- README.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b3f1369..e198263 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ EnumJS ====== -A simple way to create an immutable list of enums in ES5. +A simple way to create an immutable enumerable list aka enum. Still a WIP use at your own risk [![Codacy Badge](https://www.codacy.com/project/badge/392d48a4b14f43f3853d534e34bbdd87)](https://www.codacy.com/public/RyanBogle/EnumJS) @@ -9,22 +9,92 @@ Still a WIP use at your own risk Usage ====== +ES6 +```javascript +import $enum { assign, assignTo } from 'enumjs'; + +var myEnum = $enum( 'a', 'b', 'c' ); +``` + NodeJS ```javascript -var Enum = require('Enum').Enum; +var + assign, assignTo + $enum = require( 'enumjs' ); + +assign = $enum.assign; +assignTo = $enum.assignTo; + +var myEnum = $enum( 'one', 'two', 'three' ); +``` + +As a browser script +```javascript +// $enum will exist on the window object after the script is loaded +var myEnum = $enum(['one', 'two', 'three']); +``` -var myEnumFromAry = new Enum(['one', 'two', 'three']); -OR -var myEnumFromObj = new Enum({one:1, two:2, three:3}); +Constructor Patterns +====== +There are several ways to create an enum, as described below +```javascript +/** + * possible argument signatures + * $enum( ...names ) + * $enum([ names ]) + * $enum({ name:value }) + * $enum( startIndex, [ names ]) +**/ ``` -ES5 Compatible Browsers + +### As an argument list ### +#### `$enum( ...names );` #### + ```javascript -// Enum will exist on the window object after the script is loaded -var myEnumFromAry = new Enum(['one', 'two', 'three']); -OR -var myEnumFromObj = new Enum({one:1, two:2, three:3}); +var myEnum = $enum( 'zero', 'one', 'two' ); + +console.log( myEnum ); +// -> Enum { zero: 0, one: 1, two: 2 } ``` +### As an array ### +#### `$enum([ names ]);` #### + +```javascript +var myEnum = $enum([ 'zero', 'one', 'two' ]); + +console.log( myEnum ); +// -> Enum { zero: 0, one: 1, two: 2 } +``` + +### As an object of own keys ### +#### `$enum({ key:value });` #### + +```javascript +var myEnum = $enum({ + PLAY: 'play', + STOP: 'stop', + SKIP: 'next' +}); + +console.log( myEnum ); +// -> Enum { PLAY: 'play', STOP: 'stop', SKIP: 'next' } +``` + +### As a starting index and array of names ### +#### `$enum( startIndex, [ names ]);` #### + +```javascript +var myEnum = $enum( 1, [ 'one', 'two', 'three' ]); + +console.log( myEnum ); +// -> Enum Enum { one: 1, two: 2, three: 3 } +``` + +Assign Functions +====== +TODO + Come back for more updates! From 46a808a8342da2bd45829a2bfa05abfc6220fffc Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 21:21:10 -0800 Subject: [PATCH 08/15] Updated to new codeclimate platform, added yml config --- .codeclimate.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..da4ebed --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,14 @@ +engines: + eslint: + enabled: true + nodesecurity: + enabled: true +ratings: + paths: + - src/** + - configs/** + - *.js +exclude_paths: +- dist/**/* +- build/**/* +- tests/**/* From 75022dec56a5ec58047438970c74f7550326733a Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 21:54:48 -0800 Subject: [PATCH 09/15] Fixed .codeclimate.yml --- .codeclimate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index da4ebed..c7c168f 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -7,7 +7,7 @@ ratings: paths: - src/** - configs/** - - *.js + - ./*.js exclude_paths: - dist/**/* - build/**/* From ceb81fb629bacc5a7644fafb8398c95fce74059a Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 21:56:13 -0800 Subject: [PATCH 10/15] Removed nodescurity engine for now --- .codeclimate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index c7c168f..c1f6a8f 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -2,7 +2,7 @@ engines: eslint: enabled: true nodesecurity: - enabled: true + enabled: false ratings: paths: - src/** From 2d4d5d2e990689d5daddfb3150f6346664840bb8 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Fri, 8 Jan 2016 22:02:24 -0800 Subject: [PATCH 11/15] More codeclimate tweaks --- .codeclimate.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index c1f6a8f..6fc8b18 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,14 +1,21 @@ engines: + duplication: + enabled: true + config: + languages: + - javascript eslint: enabled: true + fixme: + enabled: true nodesecurity: enabled: false ratings: paths: - - src/** - - configs/** - - ./*.js + - "src/**" + - "configs/**" + - "./*.js" exclude_paths: -- dist/**/* -- build/**/* -- tests/**/* +- "dist/**/*" +- "build/**/*" +- "tests/**/*" From def38cfe24cfc28dc3f060bf5c40cefcd10a286e Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Sat, 9 Jan 2016 05:08:45 -0800 Subject: [PATCH 12/15] Browser test bundle with browserify seems crazy to use rollup into browserify but I want them shims. ...might need to make rollup-plugin-browserify magic --- .gitignore | 1 + build/enum.tests.js | 303 ---------------------------------------- build/enum.tests.js.map | 1 - configs/rollup.tests.js | 1 + package.json | 8 +- tests/browser.html | 2 +- 6 files changed, 9 insertions(+), 307 deletions(-) delete mode 100644 build/enum.tests.js delete mode 100644 build/enum.tests.js.map diff --git a/.gitignore b/.gitignore index e96610e..266c816 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ logs *.log node_modules bower_components +build diff --git a/build/enum.tests.js b/build/enum.tests.js deleted file mode 100644 index e15da70..0000000 --- a/build/enum.tests.js +++ /dev/null @@ -1,303 +0,0 @@ -'use strict'; - -var test = require('tape'); -test = 'default' in test ? test['default'] : test; - -var babelHelpers_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; -}; - -var babelHelpers_toConsumableArray = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } else { - return Array.from(arr); - } -}; - -var define; -var defaults = { - configurable: false, - enumerable: true, - writable: false -}; -define = function define(instance, name, value) { - var traits = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; - - traits = Object.assign({}, defaults, traits, { value: value }); - return Object.defineProperty(instance, name, traits); -}; - -var define$1 = define; - -/** - * possible argument signatures - * $enum( ...names ) - * $enum({ name: value }) - * $enum([ names ]) - * $enum( startIndex, [ names ]) - * - * transformed to [ keys, [values] ] -**/ -var getKeyValueFromObject; -var intRange = function intRange(first, last) { - var curr = typeof first === 'number' ? first : 0, - arr = [curr]; - - while (last > ++curr) { - arr.push(curr); - } - - return arr; -}; -getKeyValueFromObject = function getKeyValueFromObject(object) { - var keys = [], - values = []; - - Object.keys(object).forEach(function (key) { - keys.push(key); - values.push(object[key]); - }); - - return [keys, values]; -}; - -function argParse() { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var first = args[0]; - var second = args[1]; - - // single argument, ( object | array | string ) - - if (args.length === 1) { - var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), - firstIsArray = Array.isArray(first); - - // arg is a single object of key value pairs - if (firstType !== 'string' && !firstIsArray) { - return getKeyValueFromObject(first); - } - - // argument is a single array - if (firstIsArray) { - return [first, intRange(0, first.length)]; - } - - // argument is a 'single string' - return [args, [0]]; - } - - // two arguments, ( startIndex, [ names ]) - if (args.length === 2 && Array.isArray(second)) { - return [second, intRange(first, second.length + first)]; - } - - // "unlimited" args, ( ...names ); - return [args, intRange(0, args.length)]; -} - -function createProto(keys, values, constructor) { - var proto = {}; - - define$1(proto, 'length', keys.length); - define$1(proto, 'keys', keys, { enumerable: false }); - define$1(proto, 'values', values, { enumerable: false }); - define$1(proto, 'toString'); - define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); - define$1(proto, Symbol.iterator); - - proto.constructor = constructor; - return Object.freeze(proto); -} - -var factory; - -factory = function factory(keys, values) { - // console.log( 'factory arguments: keys, values' ); - // console.log( keys ); - // console.log( values ); - var Enum = function Enum() { - var _this = this; - - keys.forEach(function (key, index) { - return define$1(_this, key, values[index]); - }); - }; - - Enum.prototype = createProto(keys, values, Enum); - return Object.freeze(new Enum()); -}; - -function $enum() { - return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); -} - -var assign$1; - -assign$1 = function assign(enumInstance, assignTo) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var _step$value = _step.value; - var key = _step$value.key; - var value = _step$value.value; - - define$1(assignTo, key, value); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } -}; - -var assign$2 = assign$1; - -var assignTo; - -assignTo = function assignTo(assignee) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); -}; - -var assignTo$1 = assignTo; - -test('proper default and named exports', function (assert) { - assert.equal(typeof $enum === 'undefined' ? 'undefined' : babelHelpers_typeof($enum), 'function', '$enum is a function'); - assert.equal(typeof assign$2 === 'undefined' ? 'undefined' : babelHelpers_typeof(assign$2), 'function', 'assign is a function and named export'); - assert.equal(typeof assignTo$1 === 'undefined' ? 'undefined' : babelHelpers_typeof(assignTo$1), 'function', 'assignTo is a function and named export'); - assert.end(); -}); - -test.skip('assign takes enum instance', function (assert) { - assert.fail('todo'); -}); - -test.skip('assignTo takes enum arguments', function (assign) { - assign.fail('todo'); -}); - -var descriptor; -var addValue; -descriptor = { - configurable: false, - enumerable: true, - writable: false -}; - -addValue = function addValue(value) { - return Object.assign(descriptor, { value: value }); -}; - -/* constructor tests */ -test('$enum( ...names )', function (assert) { - var i = 0, - args = ['zero', 'one', 'two', 'three'], - myEnum = $enum.apply(undefined, args); - - for (var prop in myEnum) { - if (myEnum.hasOwnProperty(prop)) { - assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(i), 'property ' + prop + ' has enum descriptor with value ' + i); - i++; - } - } - - assert.equal(i, args.length, 'iterated properties count matches argument list length'); - assert.end(); -}); - -test('$enum( { name: value })', function (assert) { - var length = 0, - argument = { - 1: 'a', - 2: 'b', - 3: 'c', - 4: 'd', - 5: 'e' - }, - myEnum = $enum(argument); - - for (var prop in argument) { - if (argument.hasOwnProperty(prop)) { - var value = argument[prop]; - assert.equals(value, myEnum[prop], 'enum value mirrors object based argument, ' + prop + ':' + value); - length++; - } - } - - for (var prop in myEnum) { - if (myEnum.hasOwnProperty(prop)) { - assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(argument[prop]), 'property ' + prop + ' has enum descriptor with value ' + myEnum[prop]); - length--; - } - } - - assert.equal(length, 0, 'iterated properties count matches for both argument and enum'); - assert.end(); -}); - -test('$enum([ names ])', function (assert) { - var i = 0, - args = ['zero', 'one', 'two'], - myEnum = $enum(args); - - for (var prop in myEnum) { - if (myEnum.hasOwnProperty(prop)) { - assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(i), 'property ' + prop + ' has enum descriptor with value ' + i); - i++; - } - } - - assert.equals(i, args.length, 'iterated properties count matches argument length'); - assert.end(); -}); - -test('$enum( startIndex, [ names ])', function (assert) { - var i = 0, - startIndex = 2, - enumValues, - enumList = ['two', 'three', 'four', 'five', '6'], - myEnum = $enum(startIndex, enumList); - - enumValues = { - two: 2, - three: 3, - four: 4, - five: 5, - 6: 6 - }; - - for (var prop in myEnum) { - if (myEnum.hasOwnProperty(prop)) { - var value = enumValues[prop]; - assert.deepEqual(Object.getOwnPropertyDescriptor(myEnum, prop), addValue(value), 'property ' + prop + ' has enum descriptor with value ' + value); - i++; - } - } - - assert.equals(i, enumList.length, 'iterated properties count matches enum argument list'); - assert.end(); -}); -//# sourceMappingURL=enum.tests.js.map \ No newline at end of file diff --git a/build/enum.tests.js.map b/build/enum.tests.js.map deleted file mode 100644 index 37d9468..0000000 --- a/build/enum.tests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"enum.tests.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js","../tests/api.js","../tests/assign.js","../tests/assignTo.js","../tests/create.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n","\nimport test from 'tape';\nimport $enum, { assign, assignTo } from '../src/api';\n\ntest( 'proper default and named exports', function( assert ) {\n assert.equal( typeof $enum, 'function', '$enum is a function' );\n assert.equal( typeof assign, 'function', 'assign is a function and named export' );\n assert.equal( typeof assignTo, 'function', 'assignTo is a function and named export' );\n assert.end();\n});\n\n","\nimport test from 'tape';\n\nimport $enum, { assign } from '../src/api';\n\ntest.skip( 'assign takes enum instance', function( assert ) {\n assert.fail( 'todo' );\n});\n","\nimport test from 'tape';\n\nimport { assignTo } from '../src/api';\n\ntest.skip( 'assignTo takes enum arguments', function( assign ) {\n assign.fail( 'todo' );\n});\n\n","\nimport test from 'tape';\nimport $enum from '../src/api';\n\nvar\n descriptor,\n addValue;\n\ndescriptor = {\n configurable: false,\n enumerable: true,\n writable: false\n};\n\naddValue = function( value ) {\n return Object.assign( descriptor, { value });\n};\n\n/* constructor tests */\ntest( '$enum( ...names )', function( assert ) {\n var\n i = 0,\n args = [ 'zero', 'one', 'two', 'three' ],\n myEnum = $enum( ...args );\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( i ),\n `property ${ prop } has enum descriptor with value ${ i }`\n );\n i++;\n }\n }\n\n assert.equal( i, args.length, 'iterated properties count matches argument list length' );\n assert.end();\n});\n\ntest( '$enum( { name: value })', function( assert ) {\n var\n length = 0,\n argument = {\n 1: 'a',\n 2: 'b',\n 3: 'c',\n 4: 'd',\n 5: 'e'\n },\n myEnum = $enum( argument );\n\n for ( let prop in argument ) {\n if ( argument.hasOwnProperty( prop )) {\n let value = argument[ prop ];\n assert.equals(\n value,\n myEnum[ prop ],\n `enum value mirrors object based argument, ${ prop }:${ value }`\n );\n length++;\n }\n }\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( argument[ prop ]),\n `property ${ prop } has enum descriptor with value ${ myEnum[ prop ]}`\n );\n length--;\n }\n }\n\n assert.equal( length, 0, 'iterated properties count matches for both argument and enum' );\n assert.end();\n});\n\ntest( '$enum([ names ])', function( assert ) {\n var\n i = 0,\n args = [ 'zero', 'one', 'two' ],\n myEnum = $enum( args );\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( i ),\n `property ${ prop } has enum descriptor with value ${ i }`\n );\n i++;\n }\n }\n\n assert.equals( i, args.length, 'iterated properties count matches argument length' );\n assert.end();\n});\n\ntest( '$enum( startIndex, [ names ])', function( assert ) {\n var\n i = 0,\n startIndex = 2,\n enumValues,\n enumList = [ 'two', 'three', 'four', 'five', '6' ],\n myEnum = $enum( startIndex, enumList );\n\n enumValues = {\n two: 2,\n three: 3,\n four: 4,\n five: 5,\n 6: 6\n };\n\n for ( let prop in myEnum ) {\n if ( myEnum.hasOwnProperty( prop )) {\n let value = enumValues[ prop ];\n assert.deepEqual(\n Object.getOwnPropertyDescriptor( myEnum, prop ),\n addValue( value ),\n `property ${ prop } has enum descriptor with value ${ value }`\n );\n i++;\n }\n }\n\n assert.equals( i, enumList.length, 'iterated properties count matches enum argument list' );\n assert.end();\n});\n\n"],"names":["define","assign","assignTo"],"mappings":"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"} \ No newline at end of file diff --git a/configs/rollup.tests.js b/configs/rollup.tests.js index 18d8369..160230f 100644 --- a/configs/rollup.tests.js +++ b/configs/rollup.tests.js @@ -6,6 +6,7 @@ config.entry = entry; config.format = 'cjs'; config.dest = 'build/enum.tests.js'; config.external = [ 'tape' ]; + config.plugins.push( multiEntry( 'tests/**/*.js' )); export default config; diff --git a/package.json b/package.json index f901a69..4f4bf23 100644 --- a/package.json +++ b/package.json @@ -36,11 +36,14 @@ }, "scripts": { "clean:dist": "trash 'dist/*'", - "prebuild": "npm run clean:dist", + "clean:build": "trash 'build/*'", + "prebuild": "npm-run-all -s 'clean:*'", "build:es6": "rollup -c configs/rollup.es6.js", "build:umd": "rollup -c configs/rollup.umd.js", "build:tests": "rollup -c configs/rollup.tests.js", - "build": "npm-run-all -p build:es6 build:umd", + "build:tests:browser": "browserify -e build/enum.tests.js -o build/enum.browser.tests.js", + "build": "npm-run-all -s build:es6 build:umd", + "build:all": "npm-run-all -s build:es6 build:umd build:tests build:tests:browser", "lint": "eslint .", "pretest": "npm run build:tests", "test": "node ./build/enum.tests.js | tap-spec", @@ -73,6 +76,7 @@ "devDependencies": { "babel-eslint": "^5.0.0-beta6", "babel-preset-es2015-rollup": "^1.0.0", + "browserify": "^12.0.2", "chalk": "^1.1.1", "eslint": "^1.10.3", "npm-run-all": "^1.4.0", diff --git a/tests/browser.html b/tests/browser.html index a275977..c83e089 100644 --- a/tests/browser.html +++ b/tests/browser.html @@ -1,3 +1,3 @@ - + From 98a4dab68d817051d2effae5ea54263ca8664191 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Tue, 12 Jan 2016 20:11:32 -0800 Subject: [PATCH 13/15] Added some browser testing tools. Also removed old build script file, moved back to simple npm scripts build setup. Also brought in ShellJS to keep things cross platform and not have to double down on specific build processes. Also un-did the "dependency injection" style test files. --- build.js | 53 ------------------------------ package.json | 82 +++++++++++++++++++--------------------------- tests/assign-to.js | 8 +++++ tests/assign.js | 3 +- tests/assignTo.js | 9 ----- tests/browser.html | 3 +- 6 files changed, 45 insertions(+), 113 deletions(-) delete mode 100644 build.js create mode 100644 tests/assign-to.js delete mode 100644 tests/assignTo.js diff --git a/build.js b/build.js deleted file mode 100644 index 07b65ba..0000000 --- a/build.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -var - configs, - _package = require( './package.json' ), - chalk = require( 'chalk' ), - util = require( 'util' ), - rollup = require( 'rollup' ), - babel = require( 'rollup-plugin-babel' ); - -// combine "config.common" with each config of config.builds -configs = _package.config.builds.map( build => Object.assign({}, _package.config.common, build )); - -util.log( chalk.cyan( 'Starting up rollup builds' )); -Promise.all( - configs.map(function( config ) { - util.log( chalk.yellow( `starting ${config.format} bundle` )); - return rollup.rollup({ - entry: config.entry, - plugins: [ - babel() - ] -// external: [ '' ], -// onwarn: () => {}, - }) - .then(function( bundle ) { - util.log( chalk.blue( `writing ${config.format} bundle`)); - return bundle.write({ - dest: config.dest, - format: config.format, - exports: config.exports, - moduleId: _package.name, - moduleName: config.moduleName, - sourceMap: config.sourceMap -// sourceMap: 'inline' || true -// globals: { -// id: 'name on global' -// }, -// indent: false || true, -// banner: '/* hello world */', -// footer: '/* goodbye world */', -// intro: '', -// outro: '', -// useStrict: true || false, - }); - }) - .then(function() { util.log( chalk.green( `${config.format} done` )); }); - })) - .then(function() { util.log( chalk.cyan( 'rollup builds done' )); }) - .catch(function( error ) { - util.log( chalk.red( 'error with rollup build' )); - console.error( error.stack ); - }); diff --git a/package.json b/package.json index 4f4bf23..855026b 100644 --- a/package.json +++ b/package.json @@ -5,53 +5,6 @@ "description": "A class for making ENUMs in JavaScript ES5", "main": "index.js", "jsnext:main": "dest/enum.js", - "config": { - "builds": [ - { - "format": "umd", - "entry": "src/api.es5.js", - "dest": "dist/enum.umd.js" - }, - { - "format": "es6", - "entry": "src/api.js", - "dest": "dist/enum.js" - }, - { - "format": "cjs", - "entry": "test", - "dest": "build/tests.js" - } - ], - "common": { - "exports": "auto", - "moduleName": "$enum", - "sourceMap": true - } - }, - "babel": { - "presets": [ - "es2015-rollup" - ] - }, - "scripts": { - "clean:dist": "trash 'dist/*'", - "clean:build": "trash 'build/*'", - "prebuild": "npm-run-all -s 'clean:*'", - "build:es6": "rollup -c configs/rollup.es6.js", - "build:umd": "rollup -c configs/rollup.umd.js", - "build:tests": "rollup -c configs/rollup.tests.js", - "build:tests:browser": "browserify -e build/enum.tests.js -o build/enum.browser.tests.js", - "build": "npm-run-all -s build:es6 build:umd", - "build:all": "npm-run-all -s build:es6 build:umd build:tests build:tests:browser", - "lint": "eslint .", - "pretest": "npm run build:tests", - "test": "node ./build/enum.tests.js | tap-spec", - "posttest": "echo 'todo'", - "prepublish": "npm run build && npm test", - "rollup": "rollup", - "trash": "trash" - }, "files": [ "dist", "README.md" @@ -73,16 +26,49 @@ "bugs": { "url": "https://github.com/Ashwell/EnumJS/issues" }, + "babel": { + "presets": [ + "es2015-rollup" + ] + }, + "pre-commit": { + "run": [ + "lint", + "test" + ] + }, + "scripts": { + "clean:dist": "trash 'dist/*'", + "clean:build": "trash 'build/*'", + "lint": "eslint .", + "rollup:es6": "rollup -c configs/rollup.es6.js", + "rollup:umd": "rollup -c configs/rollup.umd.js", + "rollup:tests": "rollup -c configs/rollup.tests.js", + "rollup": "npm-run-all -s 'rollup:*'", + "browserify:tests": "browserify -e build/enum.tests.js -o build/enum.browser.tests.js", + "prebuild": "npm-run-all -s 'clean:*'", + "build": "npm-run-all -s rollup:es6 rollup:umd", + "build:tests": "npm-run-all -s rollup:tests browserify:tests", + "pretest": "npm-run-all -s build build:tests", + "test:node": "node ./build/enum.tests.js | tap-spec", + "test:browser": "node -r shelljs/global -p \"cat('build/enum.browser.tests.js')\" | tap-closer | smokestack | tap-spec", + "test": "npm-run-all -s test:node test:browser", + "posttest": "echo 'todo, maybe lint?'", + "prepublish": "npm run build && npm test" + }, "devDependencies": { "babel-eslint": "^5.0.0-beta6", "babel-preset-es2015-rollup": "^1.0.0", "browserify": "^12.0.2", - "chalk": "^1.1.1", "eslint": "^1.10.3", "npm-run-all": "^1.4.0", + "pre-commit": "^1.1.2", "rollup": "^0.24.0", "rollup-plugin-babel": "^2.3.8", "rollup-plugin-multi-entry": "^1.0.1", + "shelljs": "^0.5.3", + "smokestack": "^3.4.1", + "tap-closer": "^1.0.0", "tap-spec": "^4.1.1", "tape": "^4.4.0", "trash-cli": "^1.2.0" diff --git a/tests/assign-to.js b/tests/assign-to.js new file mode 100644 index 0000000..502c89a --- /dev/null +++ b/tests/assign-to.js @@ -0,0 +1,8 @@ + +import test from 'tape'; +import { assignTo } from '../src/api'; + +test.skip( 'assignTo takes enum arguments', function( assert ) { + assert.fail( 'todo' ); +}); + diff --git a/tests/assign.js b/tests/assign.js index 1366ed6..9e8ab96 100644 --- a/tests/assign.js +++ b/tests/assign.js @@ -1,7 +1,6 @@ import test from 'tape'; - -import $enum, { assign } from '../src/api'; +import { assign } from '../src/api'; test.skip( 'assign takes enum instance', function( assert ) { assert.fail( 'todo' ); diff --git a/tests/assignTo.js b/tests/assignTo.js deleted file mode 100644 index de6ed11..0000000 --- a/tests/assignTo.js +++ /dev/null @@ -1,9 +0,0 @@ - -import test from 'tape'; - -import { assignTo } from '../src/api'; - -test.skip( 'assignTo takes enum arguments', function( assign ) { - assign.fail( 'todo' ); -}); - diff --git a/tests/browser.html b/tests/browser.html index c83e089..396d1ee 100644 --- a/tests/browser.html +++ b/tests/browser.html @@ -1,3 +1,4 @@ + + - From ad3be38e60267f9592d71fb1ee03c8042885d727 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Sat, 16 Jan 2016 20:17:48 -0800 Subject: [PATCH 14/15] All kinds of prototype work Made some updates to the prototype, toString, toJSON, and others Added support for Symbols as keys and values --- .eslintignore | 2 + README.md | 8 +- bower.json | 22 ----- dist/enum.js | 144 ++++++++++++++++++++++------ dist/enum.js.map | 2 +- dist/enum.umd.js | 202 ++++++++++++++++++++++++++++------------ dist/enum.umd.js.map | 2 +- index.js | 1 - package.json | 4 +- src/arg-parse.js | 47 ++++++---- src/assign-to.js | 8 +- src/assign.js | 7 +- src/create-proto.js | 81 +++++++++++++++- src/define.js | 2 +- src/enum.bak.js | 150 ----------------------------- src/enum.js | 16 +++- src/stringify-symbol.js | 5 + tests/assign-to.js | 15 ++- tests/assign.js | 18 +++- tests/proto.js | 54 +++++++++++ 20 files changed, 485 insertions(+), 305 deletions(-) create mode 100644 .eslintignore delete mode 100644 bower.json delete mode 100644 src/enum.bak.js create mode 100644 src/stringify-symbol.js create mode 100644 tests/proto.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e8cc886 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +dist/** +build/** diff --git a/README.md b/README.md index e198263..3288ebf 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,10 @@ var myEnum = $enum( 'a', 'b', 'c' ); NodeJS ```javascript -var - assign, assignTo - $enum = require( 'enumjs' ); +var $enum = require( 'enumjs' ); -assign = $enum.assign; -assignTo = $enum.assignTo; +$enum +// { [Function: $enum] assign: [Function: assign], assignTo: [Function: assignTo] } var myEnum = $enum( 'one', 'two', 'three' ); ``` diff --git a/bower.json b/bower.json deleted file mode 100644 index c3f6e45..0000000 --- a/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "enumJS", - "version": "0.0.0", - "homepage": "https://github.com/Ashwell/EnumJS", - "authors": [ - "Ryan Bogle " - ], - "moduleType": [ - "amd", - "globals", - "node" - ], - "license": "MIT", - "private": true, - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/dist/enum.js b/dist/enum.js index e9d4b73..952e647 100644 --- a/dist/enum.js +++ b/dist/enum.js @@ -36,10 +36,14 @@ var define$1 = define; * $enum([ names ]) * $enum( startIndex, [ names ]) * + * names can be strings or Symbols, except for when single object of own keys + * * transformed to [ keys, [values] ] **/ +var intRange; +var symbolsOrRange; var getKeyValueFromObject; -var intRange = function intRange(first, last) { +intRange = function intRange(first, last) { var curr = typeof first === 'number' ? first : 0, arr = [curr]; @@ -49,6 +53,11 @@ var intRange = function intRange(first, last) { return arr; }; + +symbolsOrRange = function symbolsOrRange(list, first, last) { + return babelHelpers_typeof(list[0]) === 'symbol' ? list : intRange(first, last); +}; + getKeyValueFromObject = function getKeyValueFromObject(object) { var keys = [], values = []; @@ -61,64 +70,145 @@ getKeyValueFromObject = function getKeyValueFromObject(object) { return [keys, values]; }; +/*eslint func-style:0*/ function argParse() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var first = args[0]; - var second = args[1]; - // single argument, ( object | array | string ) + var second = args[1]; + var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first); + // single argument, ( object | array | string | Symbol ) if (args.length === 1) { - var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), - firstIsArray = Array.isArray(first); + var isArray = Array.isArray(first); + + // single symbol + if (firstType === 'symbol') { + return [args, args]; + } - // arg is a single object of key value pairs - if (firstType !== 'string' && !firstIsArray) { - return getKeyValueFromObject(first); + // single string + if (firstType === 'string') { + return [args, [0]]; } - // argument is a single array - if (firstIsArray) { - return [first, intRange(0, first.length)]; + // single array + if (isArray) { + return [first, symbolsOrRange(first, 0, first.length)]; } - // argument is a 'single string' - return [args, [0]]; + // I guess it's an object + return getKeyValueFromObject(first); } // two arguments, ( startIndex, [ names ]) - if (args.length === 2 && Array.isArray(second)) { + if (args.length === 2 && firstType === 'number' && Array.isArray(second)) { return [second, intRange(first, second.length + first)]; } // "unlimited" args, ( ...names ); - return [args, intRange(0, args.length)]; + return [args, symbolsOrRange(args, 0, args.length)]; } +var stringReduce; +var jsonReduce; +stringReduce = function stringReduce(str, key, index) { + return '' + (index === 0 ? str : str + ', ') + key + ':' + this.values[index]; +}; + +jsonReduce = function jsonReduce(obj, key, index) { + obj[key] = this.values[index]; + return obj; +}; + +/*eslint-disable func-style*/ function createProto(keys, values, constructor) { + /*eslint-enable func-style*/ var proto = {}; define$1(proto, 'length', keys.length); define$1(proto, 'keys', keys, { enumerable: false }); define$1(proto, 'values', values, { enumerable: false }); - define$1(proto, 'toString'); - define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); - define$1(proto, Symbol.iterator); + + // toString + (function () { + var stringCache = null; + + define$1(proto, 'toString', function () { + if (stringCache == null) { + stringCache = this.keys.reduce(stringReduce.bind(this), '[ ') + ' ]'; + } + + return stringCache; + }); + })(); + + //toJSON + (function () { + var jsonCache = null; + + define$1(proto, 'toJSON', function () { + if (jsonCache == null) { + jsonCache = this.keys.reduce(jsonReduce.bind(this), {}); + } + + return jsonCache; + }); + })(); + + // Well known Symbols + if (Symbol.toStringTag) { + define$1(proto, Symbol.toStringTag, 'Enum'); + } + + if (Symbol.toPrimitive) { + define$1(proto, Symbol.toPrimitive, function (hint) { + switch (hint) { + case 'number': + return this.length; + case 'string': + return '[ ' + this.keys.join(', ') + ' ]'; + default: + return true; + } + }, { enumerable: false }); + } + + /* + TODO fix missing regeneratorRuntime + define( proto, Symbol.iterator, function*() { + for ( let i = 0 ; i < this.length ; i++ ) { + let + key = this.keys[ i ], + value = this.values[ i ]; + yield { key, value }; + } + }); + */ proto.constructor = constructor; return Object.freeze(proto); } -var factory; +/*eslint-disable func-style*/ +function stringifySymbol(symbol) { + var symStr = symbol.toString(); + return symStr.slice(7, symStr.length - 1); +} +var factory; +var $enum; factory = function factory(keys, values) { + var Enum; // console.log( 'factory arguments: keys, values' ); // console.log( keys ); // console.log( values ); - var Enum = function Enum() { + keys = babelHelpers_typeof(keys[0]) === 'symbol' ? keys.map(stringifySymbol) : keys; + + Enum = function Enum() { var _this = this; keys.forEach(function (key, index) { @@ -130,13 +220,13 @@ factory = function factory(keys, values) { return Object.freeze(new Enum()); }; -function $enum() { +$enum = function $enum() { return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); -} +}; -var assign$1; +var $enum$1 = $enum; -assign$1 = function assign(enumInstance, assignTo) { +var assign = function assign(enumInstance, assignTo) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; @@ -165,8 +255,6 @@ assign$1 = function assign(enumInstance, assignTo) { } }; -var assign$2 = assign$1; - var assignTo; assignTo = function assignTo(assignee) { @@ -174,10 +262,10 @@ assignTo = function assignTo(assignee) { args[_key - 1] = arguments[_key]; } - assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); + assign($enum$1.apply(undefined, args), assignee); }; var assignTo$1 = assignTo; -export { assign$2 as assign, assignTo$1 as assignTo };export default $enum; +export { assign, assignTo$1 as assignTo };export default $enum$1; //# sourceMappingURL=enum.js.map \ No newline at end of file diff --git a/dist/enum.js.map b/dist/enum.js.map index 722981e..432fb12 100644 --- a/dist/enum.js.map +++ b/dist/enum.js.map @@ -1 +1 @@ -{"version":3,"file":"enum.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n"],"names":["define","assign"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"enum.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign.js","../src/assign-to.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n (function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n (function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n"],"names":["define","$enum"],"mappings":"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"} \ No newline at end of file diff --git a/dist/enum.umd.js b/dist/enum.umd.js index e048d9b..db02f08 100644 --- a/dist/enum.umd.js +++ b/dist/enum.umd.js @@ -35,6 +35,35 @@ var define$1 = define; + var assign = function assign(enumInstance, assignTo) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _step$value = _step.value; + var key = _step$value.key; + var value = _step$value.value; + + define$1(assignTo, key, value); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + }; + /** * possible argument signatures * $enum( ...names ) @@ -42,10 +71,14 @@ * $enum([ names ]) * $enum( startIndex, [ names ]) * + * names can be strings or Symbols, except for when single object of own keys + * * transformed to [ keys, [values] ] **/ + var intRange; + var symbolsOrRange; var getKeyValueFromObject; - var intRange = function intRange(first, last) { + intRange = function intRange(first, last) { var curr = typeof first === 'number' ? first : 0, arr = [curr]; @@ -55,6 +88,11 @@ return arr; }; + + symbolsOrRange = function symbolsOrRange(list, first, last) { + return babelHelpers_typeof(list[0]) === 'symbol' ? list : intRange(first, last); + }; + getKeyValueFromObject = function getKeyValueFromObject(object) { var keys = [], values = []; @@ -67,64 +105,145 @@ return [keys, values]; }; + /*eslint func-style:0*/ function argParse() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var first = args[0]; - var second = args[1]; - // single argument, ( object | array | string ) + var second = args[1]; + var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first); + // single argument, ( object | array | string | Symbol ) if (args.length === 1) { - var firstType = typeof first === 'undefined' ? 'undefined' : babelHelpers_typeof(first), - firstIsArray = Array.isArray(first); + var isArray = Array.isArray(first); - // arg is a single object of key value pairs - if (firstType !== 'string' && !firstIsArray) { - return getKeyValueFromObject(first); + // single symbol + if (firstType === 'symbol') { + return [args, args]; } - // argument is a single array - if (firstIsArray) { - return [first, intRange(0, first.length)]; + // single string + if (firstType === 'string') { + return [args, [0]]; } - // argument is a 'single string' - return [args, [0]]; + // single array + if (isArray) { + return [first, symbolsOrRange(first, 0, first.length)]; + } + + // I guess it's an object + return getKeyValueFromObject(first); } // two arguments, ( startIndex, [ names ]) - if (args.length === 2 && Array.isArray(second)) { + if (args.length === 2 && firstType === 'number' && Array.isArray(second)) { return [second, intRange(first, second.length + first)]; } // "unlimited" args, ( ...names ); - return [args, intRange(0, args.length)]; + return [args, symbolsOrRange(args, 0, args.length)]; } + var stringReduce; + var jsonReduce; + stringReduce = function stringReduce(str, key, index) { + return '' + (index === 0 ? str : str + ', ') + key + ':' + this.values[index]; + }; + + jsonReduce = function jsonReduce(obj, key, index) { + obj[key] = this.values[index]; + return obj; + }; + + /*eslint-disable func-style*/ function createProto(keys, values, constructor) { + /*eslint-enable func-style*/ var proto = {}; define$1(proto, 'length', keys.length); define$1(proto, 'keys', keys, { enumerable: false }); define$1(proto, 'values', values, { enumerable: false }); - define$1(proto, 'toString'); - define$1(proto, Symbol.toStringTag, function () {}, { enumerable: false }); - define$1(proto, Symbol.iterator); + + // toString + (function () { + var stringCache = null; + + define$1(proto, 'toString', function () { + if (stringCache == null) { + stringCache = this.keys.reduce(stringReduce.bind(this), '[ ') + ' ]'; + } + + return stringCache; + }); + })(); + + //toJSON + (function () { + var jsonCache = null; + + define$1(proto, 'toJSON', function () { + if (jsonCache == null) { + jsonCache = this.keys.reduce(jsonReduce.bind(this), {}); + } + + return jsonCache; + }); + })(); + + // Well known Symbols + if (Symbol.toStringTag) { + define$1(proto, Symbol.toStringTag, 'Enum'); + } + + if (Symbol.toPrimitive) { + define$1(proto, Symbol.toPrimitive, function (hint) { + switch (hint) { + case 'number': + return this.length; + case 'string': + return '[ ' + this.keys.join(', ') + ' ]'; + default: + return true; + } + }, { enumerable: false }); + } + + /* + TODO fix missing regeneratorRuntime + define( proto, Symbol.iterator, function*() { + for ( let i = 0 ; i < this.length ; i++ ) { + let + key = this.keys[ i ], + value = this.values[ i ]; + yield { key, value }; + } + }); + */ proto.constructor = constructor; return Object.freeze(proto); } - var factory; + /*eslint-disable func-style*/ + function stringifySymbol(symbol) { + var symStr = symbol.toString(); + return symStr.slice(7, symStr.length - 1); + } + var factory; + var $enum; factory = function factory(keys, values) { + var Enum; // console.log( 'factory arguments: keys, values' ); // console.log( keys ); // console.log( values ); - var Enum = function Enum() { + keys = babelHelpers_typeof(keys[0]) === 'symbol' ? keys.map(stringifySymbol) : keys; + + Enum = function Enum() { var _this = this; keys.forEach(function (key, index) { @@ -136,42 +255,11 @@ return Object.freeze(new Enum()); }; - function $enum() { + $enum = function $enum() { return factory.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, arguments))); - } - - var assign$1; - - assign$1 = function assign(enumInstance, assignTo) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = enumInstance[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var _step$value = _step.value; - var key = _step$value.key; - var value = _step$value.value; - - define$1(assignTo, key, value); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } }; - var assign$2 = assign$1; + var $enum$1 = $enum; var assignTo; @@ -180,15 +268,15 @@ args[_key - 1] = arguments[_key]; } - assign($enum.apply(undefined, babelHelpers_toConsumableArray(argParse.apply(undefined, args))), assignee); + assign($enum$1.apply(undefined, args), assignee); }; var assignTo$1 = assignTo; - $enum.assign = assign$2; - $enum.assignTo = assignTo$1; + $enum$1.assign = assign; + $enum$1.assignTo = assignTo$1; - return $enum; + return $enum$1; })); //# sourceMappingURL=enum.umd.js.map \ No newline at end of file diff --git a/dist/enum.umd.js.map b/dist/enum.umd.js.map index fd6d0ba..651c685 100644 --- a/dist/enum.umd.js.map +++ b/dist/enum.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"enum.umd.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/enum.js","../src/assign.js","../src/assign-to.js","../src/api.es5.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits={}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n getKeyValueFromObject,\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\nexport default function argParse( ...args ) {\n var [ first, second ] = args;\n\n // single argument, ( object | array | string )\n if ( args.length === 1 ) {\n let\n firstType = typeof first,\n firstIsArray = Array.isArray( first );\n\n // arg is a single object of key value pairs\n if ( firstType !== 'string' && !firstIsArray ) {\n return getKeyValueFromObject( first );\n }\n\n // argument is a single array\n if ( firstIsArray ) {\n return [ first, intRange( 0, first.length )];\n }\n\n // argument is a 'single string'\n return [ args, [ 0 ]];\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first )];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, intRange( 0, args.length )];\n}\n","\nimport define from './define';\n\nexport default function createProto( keys, values, constructor ) {\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n define( proto, 'toString' );\n define( proto, Symbol.toStringTag, function(){}, { enumerable: false });\n define( proto, Symbol.iterator );\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\n\nvar factory;\n\nfactory = function( keys, values ) {\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n var Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\nexport default function $enum( ...args ) {\n return factory( ...argParse( ...args ));\n}\n","\nimport define from './define';\nimport $enum from './enum';\n\nvar assign;\n\nassign = function ( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\nimport argParse from './arg-parse';\nimport $enum from './enum';\n\nvar assignTo;\n\nassignTo = function assignTo( assignee, ...args ) {\n assign( $enum( ...argParse( ...args )), assignee );\n};\n\nexport default assignTo;\n","\nimport $enum from './enum';\nimport assign from './assign';\nimport assignTo from './assign-to';\n\n$enum.assign = assign;\n$enum.assignTo = assignTo;\n\nexport default $enum;\n\n"],"names":["define","assign","assignTo"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"enum.umd.js","sources":["../src/define.js","../src/assign.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign-to.js","../src/api.es5.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n (function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n (function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n","\nimport $enum from './enum';\nimport assign from './assign';\nimport assignTo from './assign-to';\n\n$enum.assign = assign;\n$enum.assignTo = assignTo;\n\nexport default $enum;\n\n"],"names":["define","$enum","assignTo"],"mappings":"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"} \ No newline at end of file diff --git a/index.js b/index.js index 60d992b..52704ac 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,2 @@ 'use strict'; - module.exports = require( './dist/enum.umd.js' ); diff --git a/package.json b/package.json index 855026b..c9e9ef9 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "private": true, "version": "0.0.1", "description": "A class for making ENUMs in JavaScript ES5", - "main": "index.js", + "main": "dist/enum.umd.js", "jsnext:main": "dest/enum.js", "files": [ "dist", @@ -11,7 +11,6 @@ ], "directories": { "doc": "docs", - "example": "example", "lib": "dist", "test": "tests" }, @@ -53,7 +52,6 @@ "test:node": "node ./build/enum.tests.js | tap-spec", "test:browser": "node -r shelljs/global -p \"cat('build/enum.browser.tests.js')\" | tap-closer | smokestack | tap-spec", "test": "npm-run-all -s test:node test:browser", - "posttest": "echo 'todo, maybe lint?'", "prepublish": "npm run build && npm test" }, "devDependencies": { diff --git a/src/arg-parse.js b/src/arg-parse.js index 2200e21..b8c332f 100644 --- a/src/arg-parse.js +++ b/src/arg-parse.js @@ -6,11 +6,14 @@ * $enum([ names ]) * $enum( startIndex, [ names ]) * + * names can be strings or Symbols, except for when single object of own keys + * * transformed to [ keys, [values] ] **/ var intRange, - getKeyValueFromObject, + symbolsOrRange, + getKeyValueFromObject; intRange = function( first, last ) { var @@ -24,6 +27,10 @@ intRange = function( first, last ) { return arr; }; +symbolsOrRange = function( list, first, last ) { + return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last ); +}; + getKeyValueFromObject = function( object ) { var keys = [], @@ -37,34 +44,40 @@ getKeyValueFromObject = function( object ) { return [ keys, values ]; }; +/*eslint func-style:0*/ export default function argParse( ...args ) { - var [ first, second ] = args; + var + [ first, second ] = args, + firstType = typeof first; - // single argument, ( object | array | string ) + // single argument, ( object | array | string | Symbol ) if ( args.length === 1 ) { - let - firstType = typeof first, - firstIsArray = Array.isArray( first ); + let isArray = Array.isArray( first ); + + // single symbol + if ( firstType === 'symbol' ) { + return [ args, args ]; + } - // arg is a single object of key value pairs - if ( firstType !== 'string' && !firstIsArray ) { - return getKeyValueFromObject( first ); + // single string + if ( firstType === 'string' ) { + return [ args, [ 0 ]]; } - // argument is a single array - if ( firstIsArray ) { - return [ first, intRange( 0, first.length )]; + // single array + if ( isArray ) { + return [ first, symbolsOrRange( first, 0, first.length ) ]; } - // argument is a 'single string' - return [ args, [ 0 ]]; + // I guess it's an object + return getKeyValueFromObject( first ); } // two arguments, ( startIndex, [ names ]) - if ( args.length === 2 && Array.isArray( second )) { - return [ second, intRange( first, second.length + first )]; + if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) { + return [ second, intRange( first, second.length + first ) ]; } // "unlimited" args, ( ...names ); - return [ args, intRange( 0, args.length )]; + return [ args, symbolsOrRange( args, 0, args.length ) ]; } diff --git a/src/assign-to.js b/src/assign-to.js index 2181e87..be73e29 100644 --- a/src/assign-to.js +++ b/src/assign-to.js @@ -1,11 +1,11 @@ - -import argParse from './arg-parse'; +/*eslint-disable no-unused-vars*/ import $enum from './enum'; +import assign from './assign'; var assignTo; -assignTo = function assignTo( assignee, ...args ) { - assign( $enum( ...argParse( ...args )), assignee ); +assignTo = function( assignee, ...args ) { + assign( $enum( ...args ), assignee ); }; export default assignTo; diff --git a/src/assign.js b/src/assign.js index 79bb486..530e5f4 100644 --- a/src/assign.js +++ b/src/assign.js @@ -1,10 +1,7 @@ - +/*eslint-disable no-unused-vars*/ import define from './define'; -import $enum from './enum'; - -var assign; -assign = function ( enumInstance, assignTo ) { +var assign = function( enumInstance, assignTo ) { for ( let { key, value } of enumInstance ) { define( assignTo, key, value ); } diff --git a/src/create-proto.js b/src/create-proto.js index c4c5803..e017e96 100644 --- a/src/create-proto.js +++ b/src/create-proto.js @@ -1,15 +1,90 @@ import define from './define'; +var + stringReduce, + jsonReduce; + +stringReduce = function( str, key, index ) { + return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`; +}; + +jsonReduce = function( obj, key, index ) { + obj[ key ] = this.values[ index ]; + return obj; +}; + +/*eslint-disable func-style*/ export default function createProto( keys, values, constructor ) { + /*eslint-enable func-style*/ var proto = {}; define( proto, 'length', keys.length ); define( proto, 'keys', keys, { enumerable: false }); define( proto, 'values', values, { enumerable: false }); - define( proto, 'toString' ); - define( proto, Symbol.toStringTag, function(){}, { enumerable: false }); - define( proto, Symbol.iterator ); + + // toString + ( function() { + var stringCache = null; + + define( proto, 'toString', function() { + if ( stringCache == null ) { + stringCache = this.keys.reduce( + stringReduce.bind( this ), + '[ ' + ) + ' ]'; + } + + return stringCache; + }); + })(); + + //toJSON + ( function() { + var jsonCache = null; + + define( proto, 'toJSON', function() { + if ( jsonCache == null ) { + jsonCache = this.keys.reduce( + jsonReduce.bind( this ), + {} + ); + } + + return jsonCache; + }); + })(); + + // Well known Symbols + if ( Symbol.toStringTag ) { + define( proto, Symbol.toStringTag, 'Enum' ); + } + + if ( Symbol.toPrimitive ) { + define( proto, Symbol.toPrimitive, function( hint ) { + switch ( hint ) { + case 'number': + return this.length; + case 'string': + return `[ ${this.keys.join( ', ' )} ]`; + default: + return true; + } + }, { enumerable: false }); + } + + /* + TODO fix missing regeneratorRuntime + define( proto, Symbol.iterator, function*() { + for ( let i = 0 ; i < this.length ; i++ ) { + let + key = this.keys[ i ], + value = this.values[ i ]; + + yield { key, value }; + } + }); + */ proto.constructor = constructor; return Object.freeze( proto ); diff --git a/src/define.js b/src/define.js index 31610d0..c2a1da2 100644 --- a/src/define.js +++ b/src/define.js @@ -7,7 +7,7 @@ var writable: false }; -define = function( instance, name, value, traits={}) { +define = function( instance, name, value, traits = {}) { traits = Object.assign({}, defaults, traits, { value }); return Object.defineProperty( instance, name, traits ); }; diff --git a/src/enum.bak.js b/src/enum.bak.js deleted file mode 100644 index 060cd7d..0000000 --- a/src/enum.bak.js +++ /dev/null @@ -1,150 +0,0 @@ -/*globals module */ -!(function(){ - 'use strict'; - - var exports; - - if( typeof window !== 'undefined'){ - exports = window; - } else if( typeof module !== 'undefined' ){ - exports = module.exports; - } else { - console.warn('I don\'t know where to export to....Enums.js'); - exports = {}; - } - -exports.Enum = (function () { - var Enum = function ( enums ) { - var i, - keys = [], - values = [], - length = 0; - -// if(!(enums instanceof Array)){ -// throw new SyntaxError('Enum input must be an Array'); -// } - - if ( enums instanceof Array ) { - for ( i = 0 ; i < enums.length ; i++ ) { - try { - Object.defineProperty( - this, - enums[i], - { - configurable: false, - enumerable: true, - value: i, - writable: false - } - ); - ++length; - values.push(i); - keys.push(enums[i]); - } catch (e) { - throw new TypeError('Enum Constructor Failure, you must pass a set of unique keys.'); - } - } - } else if ( enums instanceof Object ) { - for ( i in enums ) { - if ( enums.hasOwnProperty(i) ) { - if ( values.lastIndexOf(enums[i]) !== -1 ) { - throw new TypeError('Enum Constructor Failure, you must pass a unique value for each key'); - } - try { - Object.defineProperty( - this, - i, - { - configurable: false, - enumerable: true, - value: enums[i], - writable: false - } - ); - ++length; - values.push(enums[i]); - keys.push(i); - } catch (e) { - throw new TypeError('Enum Constructor Failure.'); - } - } - } - } - - Object.defineProperty(this, 'length', { - configurable: false, - enumerable: false, - value: length, - writable: false - }); - -// Object.defineProperty(this, 'keys', { -// configurable: false, -// enumerable: false, -// value: keys, -// writable: false -// }); -// Object.defineProperty(this, 'values', { -// configurable: false, -// enumerable: false, -// value: values, -// writable: false -// }); - - return Object.freeze(this); - }; - - // Prototype Functions - Object.defineProperties(Enum.prototype, { - /*'length':{ - configurable: false, - enumerable: false, - get: function () { - var count = 0; - for ( var prop in this ){ - ++count; - } - return count; - //return this.keys.length; - } - },*/ - 'keys':{ - configurable: false, - enumerable: false, - get: function () { - var keys = []; - for ( var prop in this ){ - if ( this.hasOwnProperty(prop) ){ - keys.push(prop); - } - } - return keys; - } - }, - 'values':{ - configurable: false, - enumerable: false, - get: function () { - var values = []; - for ( var prop in this ){ - if ( this.hasOwnProperty(prop) ){ - values.push(this[prop]); - } - } - return values; - } - }, - 'toString':{ - configurable: false, - enumerable: false, - writable: false, - value: function(){return '[object Enum]';} - } - }); - - // Export - return Enum; - -})(); - -})(); diff --git a/src/enum.js b/src/enum.js index a6bd3b1..d9fdb45 100644 --- a/src/enum.js +++ b/src/enum.js @@ -2,14 +2,20 @@ import define from './define'; import argParse from './arg-parse'; import createProto from './create-proto'; +import stringifySymbol from './stringify-symbol'; -var factory; +var + factory, + $enum; factory = function( keys, values ) { + var Enum; // console.log( 'factory arguments: keys, values' ); // console.log( keys ); // console.log( values ); - var Enum = function() { + keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys; + + Enum = function() { keys.forEach(( key, index ) => define( this, key, values[ index ])); }; @@ -17,6 +23,8 @@ factory = function( keys, values ) { return Object.freeze( new Enum()); }; -export default function $enum( ...args ) { +$enum = function( ...args ) { return factory( ...argParse( ...args )); -} +}; + +export default $enum; diff --git a/src/stringify-symbol.js b/src/stringify-symbol.js new file mode 100644 index 0000000..5a63406 --- /dev/null +++ b/src/stringify-symbol.js @@ -0,0 +1,5 @@ +/*eslint-disable func-style*/ +export default function stringifySymbol( symbol ) { + var symStr = symbol.toString(); + return symStr.slice( 7, symStr.length - 1 ); +} diff --git a/tests/assign-to.js b/tests/assign-to.js index 502c89a..9fc270c 100644 --- a/tests/assign-to.js +++ b/tests/assign-to.js @@ -2,7 +2,20 @@ import test from 'tape'; import { assignTo } from '../src/api'; +var args = [ 'one', 'two', 'three' ]; + test.skip( 'assignTo takes enum arguments', function( assert ) { - assert.fail( 'todo' ); + var assignee = {}; + + assignTo( assignee, args ); + + assert.deepEqual( + Object.keys( assignee ), + args, + 'own keys match arguments array' + ); + + + assert.end(); }); diff --git a/tests/assign.js b/tests/assign.js index 9e8ab96..eaee969 100644 --- a/tests/assign.js +++ b/tests/assign.js @@ -1,7 +1,21 @@ import test from 'tape'; -import { assign } from '../src/api'; +import $enum, { assign } from '../src/api'; + +var args = [ Symbol( 'one' ), Symbol( '2' ), Symbol( 'three' ) ]; test.skip( 'assign takes enum instance', function( assert ) { - assert.fail( 'todo' ); + var + assignee = {}, + myEnum = $enum( args ); + + assign( myEnum, assignee ); + + assert.deepEqual( + Reflect.ownKeys( assignee ), + args, + 'own keys of assignee match enum' + ); + + assert.end(); }); diff --git a/tests/proto.js b/tests/proto.js new file mode 100644 index 0000000..b395088 --- /dev/null +++ b/tests/proto.js @@ -0,0 +1,54 @@ + +import test from 'tape'; +import $enum from '../src/api'; + +// Properties +// length +test( 'has prototype property, length', function( assert ) { + // todo + assert.end(); +}); +// keys +test( 'has prototype property, keys', function( assert ) { + // todo + assert.end(); +}); +// values +test( 'has prototype property, values', function( assert ) { + // todo + assert.end(); +}); + +// Methods +// toString +test( 'has prototype function, toString', function( assert ) { + // todo + assert.end(); +}); +// toJSON +test( 'has prototype function, toJSON', function( assert ) { + // todo + assert.end(); +}); +test( 'toJSON is reflexive with object style constructor', function( assert ) { + var + myEnum = $enum( 1, [ 'one', 'two', 'three' ]), + fromJSON = $enum( JSON.parse( JSON.stringify( myEnum ))); + + assert.deepEqual( myEnum, fromJSON, 'created enum deeply equals original' ); + assert.end(); +}); + +// Symbols +// .toStringTag +test.skip( 'has prototype symbol, toStringTag', function( assert ) { + // todo +}); +// .toPrimitive +test.skip( 'has prototype symbol, toPrimitive', function( assert ) { + // todo +}); +// .iterator +test.skip( 'has prototype symbol, iterator', function( assert ) { + // todo +}); From d92a8bdd1eed80f7e32a11e4942198ea2047b5d7 Mon Sep 17 00:00:00 2001 From: Ryan Bogle Date: Sat, 16 Jan 2016 20:20:05 -0800 Subject: [PATCH 15/15] forgot src maps for last commit --- dist/enum.js.map | 2 +- dist/enum.umd.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/enum.js.map b/dist/enum.js.map index 432fb12..adcda45 100644 --- a/dist/enum.js.map +++ b/dist/enum.js.map @@ -1 +1 @@ -{"version":3,"file":"enum.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign.js","../src/assign-to.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n (function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n (function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n"],"names":["define","$enum"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"enum.js","sources":["../src/define.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign.js","../src/assign-to.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n ( function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n ( function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n"],"names":["define","$enum"],"mappings":"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"} \ No newline at end of file diff --git a/dist/enum.umd.js.map b/dist/enum.umd.js.map index 651c685..214ffd4 100644 --- a/dist/enum.umd.js.map +++ b/dist/enum.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"enum.umd.js","sources":["../src/define.js","../src/assign.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign-to.js","../src/api.es5.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n (function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n (function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n","\nimport $enum from './enum';\nimport assign from './assign';\nimport assignTo from './assign-to';\n\n$enum.assign = assign;\n$enum.assignTo = assignTo;\n\nexport default $enum;\n\n"],"names":["define","$enum","assignTo"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"enum.umd.js","sources":["../src/define.js","../src/assign.js","../src/arg-parse.js","../src/create-proto.js","../src/stringify-symbol.js","../src/enum.js","../src/assign-to.js","../src/api.es5.js"],"sourcesContent":["\nvar\n define,\n defaults = {\n configurable: false,\n enumerable: true,\n writable: false\n };\n\ndefine = function( instance, name, value, traits = {}) {\n traits = Object.assign({}, defaults, traits, { value });\n return Object.defineProperty( instance, name, traits );\n};\n\nexport default define;\n","/*eslint-disable no-unused-vars*/\nimport define from './define';\n\nvar assign = function( enumInstance, assignTo ) {\n for ( let { key, value } of enumInstance ) {\n define( assignTo, key, value );\n }\n};\n\nexport default assign;\n","\n/**\n * possible argument signatures\n * $enum( ...names )\n * $enum({ name: value })\n * $enum([ names ])\n * $enum( startIndex, [ names ])\n *\n * names can be strings or Symbols, except for when single object of own keys\n *\n * transformed to [ keys, [values] ]\n**/\nvar\n intRange,\n symbolsOrRange,\n getKeyValueFromObject;\n\nintRange = function( first, last ) {\n var\n curr = typeof first === 'number' ? first : 0,\n arr = [ curr ];\n\n while ( last > ++curr ) {\n arr.push( curr );\n }\n\n return arr;\n};\n\nsymbolsOrRange = function( list, first, last ) {\n return typeof list[ 0 ] === 'symbol' ? list : intRange( first, last );\n};\n\ngetKeyValueFromObject = function( object ) {\n var\n keys = [],\n values = [];\n\n Object.keys( object ).forEach( key => {\n keys.push( key );\n values.push( object[ key ]);\n });\n\n return [ keys, values ];\n};\n\n/*eslint func-style:0*/\nexport default function argParse( ...args ) {\n var\n [ first, second ] = args,\n firstType = typeof first;\n\n // single argument, ( object | array | string | Symbol )\n if ( args.length === 1 ) {\n let isArray = Array.isArray( first );\n\n // single symbol\n if ( firstType === 'symbol' ) {\n return [ args, args ];\n }\n\n // single string\n if ( firstType === 'string' ) {\n return [ args, [ 0 ]];\n }\n\n // single array\n if ( isArray ) {\n return [ first, symbolsOrRange( first, 0, first.length ) ];\n }\n\n // I guess it's an object\n return getKeyValueFromObject( first );\n }\n\n // two arguments, ( startIndex, [ names ])\n if ( args.length === 2 && firstType === 'number' && Array.isArray( second )) {\n return [ second, intRange( first, second.length + first ) ];\n }\n\n // \"unlimited\" args, ( ...names );\n return [ args, symbolsOrRange( args, 0, args.length ) ];\n}\n","\nimport define from './define';\n\nvar\n stringReduce,\n jsonReduce;\n\nstringReduce = function( str, key, index ) {\n return `${index === 0 ? str : str + ', '}${key}:${this.values[ index ]}`;\n};\n\njsonReduce = function( obj, key, index ) {\n obj[ key ] = this.values[ index ];\n return obj;\n};\n\n/*eslint-disable func-style*/\nexport default function createProto( keys, values, constructor ) {\n /*eslint-enable func-style*/\n var proto = {};\n\n define( proto, 'length', keys.length );\n define( proto, 'keys', keys, { enumerable: false });\n define( proto, 'values', values, { enumerable: false });\n\n // toString\n ( function() {\n var stringCache = null;\n\n define( proto, 'toString', function() {\n if ( stringCache == null ) {\n stringCache = this.keys.reduce(\n stringReduce.bind( this ),\n '[ '\n ) + ' ]';\n }\n\n return stringCache;\n });\n })();\n\n //toJSON\n ( function() {\n var jsonCache = null;\n\n define( proto, 'toJSON', function() {\n if ( jsonCache == null ) {\n jsonCache = this.keys.reduce(\n jsonReduce.bind( this ),\n {}\n );\n }\n\n return jsonCache;\n });\n })();\n\n // Well known Symbols\n if ( Symbol.toStringTag ) {\n define( proto, Symbol.toStringTag, 'Enum' );\n }\n\n if ( Symbol.toPrimitive ) {\n define( proto, Symbol.toPrimitive, function( hint ) {\n switch ( hint ) {\n case 'number':\n return this.length;\n case 'string':\n return `[ ${this.keys.join( ', ' )} ]`;\n default:\n return true;\n }\n }, { enumerable: false });\n }\n\n /*\n TODO fix missing regeneratorRuntime\n define( proto, Symbol.iterator, function*() {\n for ( let i = 0 ; i < this.length ; i++ ) {\n let\n key = this.keys[ i ],\n value = this.values[ i ];\n\n yield { key, value };\n }\n });\n */\n\n proto.constructor = constructor;\n return Object.freeze( proto );\n}\n","/*eslint-disable func-style*/\nexport default function stringifySymbol( symbol ) {\n var symStr = symbol.toString();\n return symStr.slice( 7, symStr.length - 1 );\n}\n","\nimport define from './define';\nimport argParse from './arg-parse';\nimport createProto from './create-proto';\nimport stringifySymbol from './stringify-symbol';\n\nvar\n factory,\n $enum;\n\nfactory = function( keys, values ) {\n var Enum;\n// console.log( 'factory arguments: keys, values' );\n// console.log( keys );\n// console.log( values );\n keys = typeof keys[0] === 'symbol' ? keys.map( stringifySymbol ) : keys;\n\n Enum = function() {\n keys.forEach(( key, index ) => define( this, key, values[ index ]));\n };\n\n Enum.prototype = createProto( keys, values, Enum );\n return Object.freeze( new Enum());\n};\n\n$enum = function( ...args ) {\n return factory( ...argParse( ...args ));\n};\n\nexport default $enum;\n","/*eslint-disable no-unused-vars*/\nimport $enum from './enum';\nimport assign from './assign';\n\nvar assignTo;\n\nassignTo = function( assignee, ...args ) {\n assign( $enum( ...args ), assignee );\n};\n\nexport default assignTo;\n","\nimport $enum from './enum';\nimport assign from './assign';\nimport assignTo from './assign-to';\n\n$enum.assign = assign;\n$enum.assignTo = assignTo;\n\nexport default $enum;\n\n"],"names":["define","$enum","assignTo"],"mappings":"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"} \ No newline at end of file