diff --git a/.gitignore b/.gitignore index 1b3441e..003c14c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +browser/bundle.js node_modules/ *.swp *~ diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..7b801cb --- /dev/null +++ b/.jshintrc @@ -0,0 +1,39 @@ +{ + "node": true, // Enable globals available when code is running inside of the NodeJS runtime environment. + "browser": true, // Standard browser globals e.g. `window`, `document`. + "esnext": true, // Allow ES.next specific features such as `const` and `let`. + "bitwise": false, // Prohibit bitwise operators (&, |, ^, etc.). + "camelcase": false, // Permit only camelcase for `var` and `object indexes`. + "curly": false, // Require {} for every new block or scope. + "eqeqeq": true, // Require triple equals i.e. `===`. + "immed": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );` + "latedef": true, // Prohibit variable use before definition. + "newcap": true, // Require capitalization of all constructor functions e.g. `new F()`. + "noarg": true, // Prohibit use of `arguments.caller` and `arguments.callee`. + "quotmark": "single", // Define quotes to string values. + "regexp": true, // Prohibit `.` and `[^...]` in regular expressions. + "undef": true, // Require all non-global variables be declared before they are used. + "unused": true, // Warn unused variables. + "strict": true, // Require `use strict` pragma in every file. + "trailing": true, // Prohibit trailing whitespaces. + "smarttabs": false, // Suppresses warnings about mixed tabs and spaces + "globals": { // Globals variables. + "angular": true + }, + "predef": [ // Extra globals. + "define", + "require", + "exports", + "module", + "describe", + "before", + "beforeEach", + "after", + "afterEach", + "requirejs", + "it" + ], + "indent": false, // Specify indentation spacing + "devel": true, // Allow development statements e.g. `console.log();`. + "noempty": true // Prohibit use of empty blocks. +} diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..a26a2c6 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,40 @@ +'use strict'; + +module.exports = function(grunt) { + + //Load NPM tasks + grunt.loadNpmTasks('grunt-browserify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-mocha-test'); + + // Project Configuration + grunt.initConfig({ + browserify: { + client: { + src: ['bitcore.js'], + dest: 'browser/bundle.js', + options: { + alias: ['browserify-bignum/bignumber.js:bignum'], + standalone: 'bitcore' + } + } + }, + watch: { + scripts: { + files: ['**/*.js', '**/*.html', '!**/node_modules/**', '!**/bundle.js'], + tasks: ['browserify'/*, 'mochaTest'*/], + }, + }, + mochaTest: { + options: { + reporter: 'spec', + }, + src: ['test/*.js'], + }, + + }); + + grunt.registerTask('default', ['watch']); + +}; + diff --git a/README.md b/README.md index bdd3b9c..3afb4a4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,13 @@ Bitcore is still under heavy development and not quite ready for "drop-in" produ #Contributing Bitcore needs some developer love. Please send pull requests for bug fixes, code optimization, and ideas for improvement. +# install bitcore +cd bitcore/ +npm install + +# build browser version +npm install -g grunt-cli +grunt browserify [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/bitpay/bitcore/trend.png)](https://bitdeli.com/free "Bitdeli Badge") diff --git a/Transaction.js b/Transaction.js index 36bbbeb..6695c97 100644 --- a/Transaction.js +++ b/Transaction.js @@ -1,3 +1,4 @@ +'use strict'; require('classtool'); function spec(b) { diff --git a/bitcore.js b/bitcore.js new file mode 100644 index 0000000..3b01f7a --- /dev/null +++ b/bitcore.js @@ -0,0 +1,15 @@ +/* + * Bitcore bindings for the browser + */ + + +module.exports.bignum = require('bignum'); +module.exports.base58 = require('base58-native'); +//module.exports.Address = require('./Address'); + + + +if (typeof process.versions === 'undefined') { + module.exports.bignum.config({EXPONENTIAL_AT: 9999999, DECIMAL_PLACES: 0, ROUNDING_MODE: 1}); +} + diff --git a/browser/sample.html b/browser/sample.html new file mode 100644 index 0000000..b02b85d --- /dev/null +++ b/browser/sample.html @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/package.json b/package.json index 4a24d02..1d1dfe4 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,15 @@ "email": "stephen@bitpay.com" }, "contributors": [ - {"name": "Stefan Thomas", "email": "moon@justmoon.net"}, - {"name": "Jeff Garzik", "email": "jgarzik@bitpay.com"} - ], + { + "name": "Stefan Thomas", + "email": "moon@justmoon.net" + }, + { + "name": "Jeff Garzik", + "email": "jgarzik@bitpay.com" + } + ], "keywords": [ "bitcoin", "btc", @@ -25,16 +31,22 @@ "scripts": {}, "dependencies": { "classtool": "=1.0.0", - "base58-native": "=0.1.1", - "bindings": "=1.1.0", + "base58-native": "=0.1.3", + "bindings": "=1.1.1", "bufferput": "=0.1.1", "bignum": "=0.6.1", "binary": "=0.3.0", "step": "=0.0.4", "buffers": "=0.1.1", "buffertools": "=1.1.1", - "mocha": ">=1.15.1" + "mocha": ">=1.15.1", + "browserify-bignum": "git://github.com/maraoz/browserify-bignum.git" + }, + "devDependencies": { + "grunt-contrib-watch": "~0.5.3", + "grunt-mocha-test": "~0.8.2", + "grunt-browserify": "~1.3.0", + "chai": "~1.9.0" }, - "devDependencies": {}, "license": "MIT" } diff --git a/test/adapter.js b/test/adapter.js new file mode 100644 index 0000000..b3639da --- /dev/null +++ b/test/adapter.js @@ -0,0 +1,17 @@ +'use strict'; + +if (typeof require === 'undefined') { + var that = this; + that.require = function(name) { + var split = name.split('/'); + if (split.length > 0) { + name = split.pop(); + } + var module = that[name]; + if (!module) { + throw new Error('Cannot find module "'+name+'"'); + } + return module; + }; + +} diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..773d3ff --- /dev/null +++ b/test/index.html @@ -0,0 +1,23 @@ + + + + Mocha + + + + + +
+ + + + + + + + + + + diff --git a/test/test.base58.js b/test/test.base58.js new file mode 100644 index 0000000..54d57eb --- /dev/null +++ b/test/test.base58.js @@ -0,0 +1,45 @@ +'use strict'; + +var chai = require('chai'); +var bitcore = require('../bitcore'); + +var expect = chai.expect; +var should = chai.should(); + +var bignum = bitcore.bignum; +var base58 = bitcore.base58; +var base58Check = base58.base58Check; + +describe('bignum module basics', function() { + it('should initialze the main object', function() { + should.exist(bitcore.bignum); + }); + it('should create a bignum from string', function() { + var n = bignum('9832087987979879879879879879879879879879879879'); + should.exist(n); + }); + it('should perform basic math operations', function() { + var b = bignum('782910138827292261791972728324982') + .sub('182373273283402171237474774728373') + .div(13); + b.toNumber().should.equal(46195143503376160811884457968969); + }); +}); + + +describe('base58 module', function() { + it('should initialze the main object', function() { + should.exist(bitcore.base58); + }); + it('should obtain the same string in base58 roundtrip', function() { + var m = 'mqqa8xSMVDyf9QxihGnPtap6Mh6qemUkcu'; + base58.encode(base58.decode(m)).should.equal(m); + }); + it('should obtain the same string in base58Check roundtrip', function() { + var m = '1QCJj1gPZKx2EwzGo9Ri8mMBs39STvDYcv'; + base58Check.encode(base58Check.decode(m)).should.equal(m); + }); +}); + + + diff --git a/test/test.main.js b/test/test.main.js new file mode 100644 index 0000000..aa6e8a2 --- /dev/null +++ b/test/test.main.js @@ -0,0 +1,13 @@ +'use strict'; + +var chai = require('chai'); +var bitcore = require('../bitcore'); + +var expect = chai.expect; +var should = chai.should(); + +describe('Initialization of bitcore', function() { + it('should initialze the main object', function() { + should.exist(bitcore); + }); +});