diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6d8fbb9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+/lib
+/public/vendor/node_modules
+/credger
+/public/js
+/.shards
diff --git a/credger.cr b/credger.cr
new file mode 100644
index 0000000..2895731
--- /dev/null
+++ b/credger.cr
@@ -0,0 +1,73 @@
+require "kemal"
+
+require "./ledger"
+
+CURRENCY = "€"
+SEPARATOR = ","
+
+ledger = Ledger.new
+
+# Matches GET "http://host:port/"
+get "/" do |env|
+ env.response.content_type = "text/html"
+ send_file env, "./public/index.html"
+end
+
+get "/api/ledger/accounts" do |env|
+ env.response.content_type = "application/json"
+ ledger.accounts.to_json
+end
+
+# get "/api/ledger/accounts/depth/:depth/?" do |env|
+# env.response.content_type = "application/json"
+# ledger.accounts( ).to_json
+# end
+
+# get "/api/ledger/dates_salaries/?" do |env|
+# env.response.content_type = "application/json"
+# ledger.dates_salaries( "salaire" ).to_json
+# end
+
+# get "/api/ledger/register/?" do |env|
+# env.response.content_type = "application/json"
+# { key: params[ :categories ],
+# values: ledger.register( params[ :period ], params[ :categories ] ) }
+# .to_json
+# end
+
+get "/api/ledger/balance" do |env|
+ env.response.content_type = "application/json"
+
+ cleared = env.params.query.has_key?( "cleared" ) ? env.params.query[ "cleared" ] == "true" : false
+
+ ledger.balance( cleared,
+ env.params.query[ "depth" ].to_i,
+ env.params.query[ "period" ],
+ env.params.query[ "categories" ] )
+ .to_json
+end
+
+# get "/api/ledger/cleared/?" do |env|
+# env.response.content_type = "application/json"
+# ledger.cleared().to_json
+# end
+
+# get "/api/ledger/budget/?" do |env|
+# env.response.content_type = "application/json"
+# ledger.budget( params[ :period ],
+# params[ :categories ] ).to_json
+# end
+
+get "/api/ledger/graph_values" do |env|
+ env.response.content_type = "application/json"
+
+ ledger.graph_values( env.params.query["period"], env.params.query["categories"].split(" ") ).to_json
+ #ledger.graph_values.to_json
+end
+
+get "/api/ledger/version" do |env|
+ env.response.content_type = "text"
+ ledger.version
+end
+
+Kemal.run 9292
diff --git a/ledger.cr b/ledger.cr
new file mode 100644
index 0000000..81f930f
--- /dev/null
+++ b/ledger.cr
@@ -0,0 +1,73 @@
+# encoding: utf-8
+
+require "csv"
+
+# Crystal wrapper module for calling ledger
+class Ledger
+ def initialize( binary : String = "ledger", ledger_file : String = ENV[ "LEDGER_FILE" ] )
+ @binary = binary
+ @file = ledger_file
+ end
+
+ def run( options : String, command : String = "", command_parameters : String = "" ) : String
+ STDERR.puts "#{@binary} -f #{@file} #{options} #{command} #{command_parameters}"
+ `#{@binary} -f #{@file} #{options} #{command} #{command_parameters}`
+ end
+
+ def version : String
+ run "--version"
+ end
+
+ def accounts( depth : Number = 9999 ) : Array( Array( String ) )
+ accounts = run( "", "accounts" )
+ .split( "\n" )
+ .map do |a|
+ a.split( ":" )
+ .each_slice( depth )
+ .to_a.first
+ end.uniq
+
+ accounts.map{|a| a.size}.max.times do |i|
+ accounts += accounts.map { |acc| acc.first( i ) }
+ end
+
+ accounts
+ .uniq
+ .sort
+ .reject { |a| a.empty? || a.first.empty? }
+ .sort_by { |a| a.size }
+ end
+
+ def balance( cleared : Bool = false, depth : Int32 = 9999, period : String = nil, categories : String = "" ) : Array( NamedTuple( account: String, amount: Float64 ) )
+ period = period.nil? ? "" : "-p '#{period}'"
+ depth = depth.nil? ? "" : "--depth #{depth}"
+ operation = cleared ? "cleared" : "balance"
+
+ run( "--flat --no-total --exchange '#{CURRENCY}' #{period} #{depth}", operation, categories )
+ .split( "\n" )
+ .reject {|line| line.empty?}
+ .map do |line|
+ line_array = line.split( "#{CURRENCY}" )
+
+ { account: line_array[ 1 ].strip,
+ amount: line_array[ 0 ].tr( SEPARATOR, "." ).to_f }
+ end
+ end
+
+ def graph_values( period : String = "", categories : Array(String) = ["Expenses"] ) : Hash( String, Array( NamedTuple( date: String, amount: String, currency: String ) ) )
+ period = period == "" ? "" : "-p '#{period}'"
+
+ result = {} of String => Array(NamedTuple(date: String, amount: String, currency: String))
+ categories.map do |category|
+ result[category] = CSV
+ .parse( run( "-MAn --exchange '#{CURRENCY}' #{period}", "csv --no-revalued", category ) )
+ .map do |row|
+ { date: row[ 0 ],
+ amount: row[ 5 ],
+ currency: row[ 4 ] }
+ end
+ end
+
+ result
+ end
+end
diff --git a/public/css/app.css b/public/css/app.css
new file mode 100644
index 0000000..b62ee5b
--- /dev/null
+++ b/public/css/app.css
@@ -0,0 +1 @@
+/* credger css stylesheet */
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..057e2bc
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..46e84d0
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+ ledger le-moine.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/ts/app.ts b/public/ts/app.ts
new file mode 100644
index 0000000..5e3867c
--- /dev/null
+++ b/public/ts/app.ts
@@ -0,0 +1,15 @@
+var app = angular.module('app',
+ ['ui.router',
+ 'nvd3',
+ 'angularMoment',
+ 'chieffancypants.loadingBar',
+ ])
+ .config(['$stateProvider', '$urlRouterProvider',
+ function($stateProvider, $urlRouterProvider) {
+ $stateProvider
+ .state('app', {
+ url: '',
+ component: 'dashboard'
+ });
+ }
+ ]);
diff --git a/public/ts/components/bucket.ts b/public/ts/components/bucket.ts
new file mode 100644
index 0000000..d6a3962
--- /dev/null
+++ b/public/ts/components/bucket.ts
@@ -0,0 +1,98 @@
+app.component('bucket',
+ {
+ bindings: {
+ categories: '<',
+ period: '<'
+ },
+ controller: ['$filter', 'API',
+ function($filter, API) {
+ let ctrl = this;
+ ctrl.depth = 99;
+
+ ctrl.graph_options = {
+ chart: {
+ type: 'multiBarHorizontalChart',
+ height: 600,
+ margin: {
+ top: 20,
+ right: 20,
+ bottom: 20,
+ left: 200
+ },
+ x: (d) => { return d.account; },
+ y: (d) => { return d.amount; },
+ valueFormat: (d) => { return `${d} €`; },
+ showYAxis: false,
+ showValues: true,
+ showLegend: true,
+ showControls: false,
+ showTooltipPercent: true,
+ duration: 500,
+ labelThreshold: 0.01,
+ labelSunbeamLayout: true,
+ labelsOutside: true
+ }
+ };
+
+ ctrl.$onChanges = (changes) => {
+ if (changes.period && changes.period.currentValue != undefined) {
+ API.balance({
+ period: ctrl.period,
+ categories: ctrl.categories,
+ depth: ctrl.depth
+ })
+ .then((response) => {
+ ctrl.raw_data = _(response.data)
+ .sortBy((account) => { return account.amount; })
+ .reverse();
+ ctrl.raw_total = _(response.data).reduce((memo, account) => { return memo + account.amount; }, 0);
+
+ ctrl.total_detailed = _.chain(ctrl.raw_data)
+ .groupBy((account) => {
+ return account.account.split(':')[0];
+ })
+ .each((category) => {
+ category.total = _(category).reduce((memo, account) => {
+ return memo + account.amount;
+ }, 0);
+ })
+ .value();
+ ctrl.total_detailed = _.chain(ctrl.total_detailed)
+ .keys()
+ .map((key) => {
+ return {
+ account: key,
+ amount: ctrl.total_detailed[key].total
+ };
+ })
+ .value();
+
+ ctrl.graph_options.chart.height = 60 + (25 * ctrl.raw_data.length);
+
+ ctrl.data = ctrl.categories.split(' ').map((category) => {
+ return {
+ key: category,
+ values: _(ctrl.raw_data).select((line) => { return line.account.match(`^${category}:.*`); })
+ }
+ })
+ });
+ }
+ };
+ }
+ ],
+
+ template: `
+
+
+ {{account.account}} = {{account.amount | number:2}} €
+
+
+
+`
+ });
diff --git a/public/ts/components/dashboard.ts b/public/ts/components/dashboard.ts
new file mode 100644
index 0000000..18fb75e
--- /dev/null
+++ b/public/ts/components/dashboard.ts
@@ -0,0 +1,143 @@
+app.component('dashboard',
+ {
+ controller: ['$filter', 'API',
+ function($filter, API) {
+ let ctrl = this;
+ ctrl.graphed_accounts = ['Expenses', 'Income'];
+
+ let retrieve_graph_values = (params) => {
+ API.graph_values(params)
+ .then((response) => {
+ ctrl.periods = [];
+
+ let largest_cat = _(response.data).reduce((memo, cat) => { return cat.length > memo.length ? cat : memo; }, []);
+
+ _.chain(largest_cat)
+ .pluck('date')
+ .each((date) => {
+ _(response.data).each((cat) => {
+ let value = _(cat).find({ date: date });
+ if (_(value).isUndefined()) {
+ cat.push({
+ date: date,
+ amount: 0,
+ currency: _(cat).first().currency
+ });
+ }
+ });
+ });
+
+ _(response.data).each((cat) => {
+ cat = _(cat).sortBy((month) => {
+ return month.date;
+ });
+ });
+
+ ctrl.graphiques = {
+ monthly_values: {
+ options: {
+ chart: {
+ type: 'multiBarChart',
+ height: 300,
+ showControls: false,
+ showLegend: true,
+ showLabels: true,
+ showValues: true,
+ showYAxis: false,
+
+ x: (d) => { return d.x; },
+ y: (d) => { return d.y; },
+ valueFormat: (d) => { return `${d} €`; },
+
+ xAxis: {
+ tickFormat: (d) => {
+ return `${d}${d == ctrl.period ? '*' : ''}`;
+ }
+ },
+ stacked: false,
+ duration: 500,
+ reduceXTicks: false,
+ rotateLabels: -67,
+ labelSunbeamLayout: true,
+ useInteractiveGuideline: true,
+ multibar: {
+ dispatch: {
+ elementClick: (event) => {
+ console.log('change period')
+ console.log(ctrl.period)
+
+ ctrl.period = event.data.x;
+
+ console.log(ctrl.period)
+ }
+ }
+ }
+ }
+ },
+ data: _.chain(response.data)
+ .keys()
+ .reverse()
+ .map((key) => {
+ let multiplicator = (key == "Income") ? -1 : 1;
+ return {
+ key: key,
+ values: _.chain(response.data[key]).map((value) => {
+ let date = new Date(value.date);
+ let period = date.getFullYear() + '-' + (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1);
+ ctrl.periods.push(period);
+
+ return {
+ key: key,
+ x: period,
+ y: parseInt(value.amount) * multiplicator
+ };
+ })
+ .sortBy((item) => { return item.x; })
+ .value()
+ };
+ })
+ .value()
+ }
+ };
+
+ ctrl.periods = _.chain(ctrl.periods).uniq().sort().reverse().value();
+ ctrl.period = _(ctrl.periods).first();
+ });
+ };
+
+ API.accounts()
+ .then((response) => {
+ ctrl.raw_accounts = response.data;
+ ctrl.accounts = ctrl.raw_accounts.map((account_ary) => { return account_ary.join(':'); });
+ });
+
+ retrieve_graph_values({
+ period: '',
+ categories: ctrl.graphed_accounts.join(' ')
+ });
+ }
+ ],
+
+ template: `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`
+ });
diff --git a/public/ts/services/API.ts b/public/ts/services/API.ts
new file mode 100644
index 0000000..b20bc2b
--- /dev/null
+++ b/public/ts/services/API.ts
@@ -0,0 +1,54 @@
+app.service('API',
+ ['$http',
+ function($http) {
+ let API = this;
+
+ API.balance = function(params) {
+ return $http.get('/api/ledger/balance', {
+ params: {
+ period: params.period,
+ categories: params.categories,
+ depth: params.depth
+ }
+ });
+ };
+
+ API.register = function(params) {
+ return $http.get('/api/ledger/register', {
+ params: {
+ period: params.period,
+ categories: params.categories
+ }
+ });
+ };
+
+ API.graph_values = function(params) {
+ return $http.get('/api/ledger/graph_values', {
+ params: {
+ period: params.period,
+ categories: params.categories
+ }
+ });
+ };
+
+ API.budget = function(params) {
+ return $http.get('/api/ledger/budget', {
+ params: {
+ period: params.period,
+ categories: params.categories
+ }
+ });
+ };
+
+ API.dates_salaries = function() {
+ return $http.get('/ai/ledger/dates_salaries');
+ };
+
+ API.accounts = function() {
+ return $http.get('/api/ledger/accounts');
+ };
+
+ API.cleared = function() {
+ return $http.get('/api/ledger/cleared');
+ };
+ }]);
diff --git a/public/tsconfig.json b/public/tsconfig.json
new file mode 100644
index 0000000..02ebdd5
--- /dev/null
+++ b/public/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "module": "none",
+ "declaration": false,
+ "removeComments": true,
+ "sourceMap": false,
+ "outFile": "js/app.js",
+ "lib": [
+ "dom","es2015"
+ ],
+ },
+ "include": [
+ "ts/app.ts",
+ "ts/services/*.ts",
+ "ts/components/*.ts",
+ ],
+}
diff --git a/public/tsfmt.json b/public/tsfmt.json
new file mode 100644
index 0000000..bf8847c
--- /dev/null
+++ b/public/tsfmt.json
@@ -0,0 +1,23 @@
+{
+ "baseIndentSize": 0,
+ "indentSize": 2,
+ "tabSize": 2,
+ "indentStyle": 2,
+ "newLineCharacter": "\n",
+ "convertTabsToSpaces": true,
+ "insertSpaceAfterCommaDelimiter": true,
+ "insertSpaceAfterSemicolonInForStatements": true,
+ "insertSpaceBeforeAndAfterBinaryOperators": true,
+ "insertSpaceAfterConstructor": false,
+ "insertSpaceAfterKeywordsInControlFlowStatements": true,
+ "insertSpaceAfterFunctionKeywordForAnonymousFunctions": false,
+ "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": true,
+ "insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": true,
+ "insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": true,
+ "insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true,
+ "insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": true,
+ "insertSpaceAfterTypeAssertion": true,
+ "insertSpaceBeforeFunctionParenthesis": false,
+ "placeOpenBraceOnNewLineForFunctions": false,
+ "placeOpenBraceOnNewLineForControlBlocks": false,
+}
diff --git a/public/vendor/package-lock.json b/public/vendor/package-lock.json
new file mode 100644
index 0000000..c4510ec
--- /dev/null
+++ b/public/vendor/package-lock.json
@@ -0,0 +1,1165 @@
+{
+ "name": "ledgerrb",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@uirouter/angularjs": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.11.tgz",
+ "integrity": "sha512-AG6DT1mYEGLyRt8/Ggf/1teh4pp0yB99GTufC/pY6FfxmkrVE44dv9bGTOrcEETiPgu1SezsqTMjbXEv55JxCw==",
+ "requires": {
+ "@uirouter/core": "5.0.11"
+ }
+ },
+ "@uirouter/core": {
+ "version": "5.0.11",
+ "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.11.tgz",
+ "integrity": "sha512-x8js8f0nJivRMlxVyFcP5VmHyI091qUYCSEP69+m3uTCsIlCvLWmQiT4/FY7YBe9go6tYBBzPV+dWseg5XMD8Q=="
+ },
+ "amdefine": {
+ "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "angular": {
+ "version": "https://registry.npmjs.org/angular/-/angular-1.6.6.tgz",
+ "integrity": "sha1-/Vo8+0N844LYVO4BEgeXl4Uny2Q="
+ },
+ "angular-animate": {
+ "version": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.6.6.tgz",
+ "integrity": "sha1-aSVkexQaBA0kG/ElBA8aFQ/NinA="
+ },
+ "angular-aria": {
+ "version": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.6.6.tgz",
+ "integrity": "sha1-WN10jglWS8hAn3Ob3lezX77ltqU="
+ },
+ "angular-i18n": {
+ "version": "https://registry.npmjs.org/angular-i18n/-/angular-i18n-1.6.6.tgz",
+ "integrity": "sha1-8hy/kWGkSb5LcUDYsVP2ypsIfSQ="
+ },
+ "angular-loader": {
+ "version": "https://registry.npmjs.org/angular-loader/-/angular-loader-1.6.6.tgz",
+ "integrity": "sha1-7gtpoEB8y4vNBUbDPom6y8tdDZ8="
+ },
+ "angular-loading-bar": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/angular-loading-bar/-/angular-loading-bar-0.9.0.tgz",
+ "integrity": "sha1-N+9Swl8QLCFuezzf0vxaXflijkU="
+ },
+ "angular-material": {
+ "version": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.5.tgz",
+ "integrity": "sha1-pUUM2CBeFadpHtw4lHYJTPhtWSs="
+ },
+ "angular-messages": {
+ "version": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.6.6.tgz",
+ "integrity": "sha1-qbs/xflx10XNOjvbqrxvH03rE/M="
+ },
+ "angular-mocks": {
+ "version": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.6.6.tgz",
+ "integrity": "sha1-yTAY54OMbcXOrxprz5vhPIMOpRU="
+ },
+ "angular-moment": {
+ "version": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.1.0.tgz",
+ "integrity": "sha1-mnxGiBUbCO4whiPZWNmLCk9Pths=",
+ "requires": {
+ "moment": "2.19.2"
+ }
+ },
+ "angular-nvd3": {
+ "version": "https://registry.npmjs.org/angular-nvd3/-/angular-nvd3-1.0.9.tgz",
+ "integrity": "sha1-jYpxSH2eWhIuil0PXNJqsOSRpvU=",
+ "requires": {
+ "angular": "https://registry.npmjs.org/angular/-/angular-1.6.6.tgz",
+ "d3": "3.5.17",
+ "nvd3": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz"
+ }
+ },
+ "angularjs-nvd3-directives": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/angularjs-nvd3-directives/-/angularjs-nvd3-directives-0.0.8.tgz",
+ "integrity": "sha1-6fOraHjoGNAC+3nRDKkv+hreA7k="
+ },
+ "boilerplate": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/boilerplate/-/boilerplate-0.6.1.tgz",
+ "integrity": "sha1-nUiQP0tUhEZhUQSOTCFuiuP0tVg=",
+ "requires": {
+ "base": "0.11.1",
+ "base-plugins": "0.4.13",
+ "define-property": "0.2.5",
+ "expand-target": "0.6.5",
+ "expand-utils": "0.2.2",
+ "is-scaffold": "0.1.1",
+ "isobject": "2.1.0",
+ "lazy-cache": "2.0.1",
+ "mixin-deep": "1.1.3",
+ "scaffold": "0.2.13"
+ },
+ "dependencies": {
+ "base": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.1.tgz",
+ "integrity": "sha1-s2p/ERE4U6NCoVaR2Y4tzIpswnA=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "cache-base": "0.8.4",
+ "class-utils": "0.3.4",
+ "component-emitter": "1.2.1",
+ "define-property": "0.2.5",
+ "isobject": "2.1.0",
+ "lazy-cache": "2.0.1",
+ "mixin-deep": "1.1.3",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "cache-base": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.4.tgz",
+ "integrity": "sha1-qUPq6ipdkAVHWoqmt3o5r/1WZYY=",
+ "requires": {
+ "collection-visit": "0.2.3",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "0.3.1",
+ "isobject": "2.1.0",
+ "lazy-cache": "2.0.1",
+ "set-value": "0.3.3",
+ "to-object-path": "0.3.0",
+ "union-value": "0.2.3",
+ "unset-value": "0.1.1"
+ },
+ "dependencies": {
+ "collection-visit": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz",
+ "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=",
+ "requires": {
+ "lazy-cache": "2.0.1",
+ "map-visit": "0.1.5",
+ "object-visit": "0.3.4"
+ },
+ "dependencies": {
+ "map-visit": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz",
+ "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=",
+ "requires": {
+ "lazy-cache": "2.0.1",
+ "object-visit": "0.3.4"
+ }
+ },
+ "object-visit": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz",
+ "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=",
+ "requires": {
+ "isobject": "2.1.0"
+ }
+ }
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "set-value": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz",
+ "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "isobject": "2.1.0",
+ "to-object-path": "0.2.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "to-object-path": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz",
+ "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=",
+ "requires": {
+ "arr-flatten": "1.0.1",
+ "is-arguments": "1.0.2"
+ },
+ "dependencies": {
+ "arr-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz",
+ "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs="
+ },
+ "is-arguments": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.2.tgz",
+ "integrity": "sha1-B+MK15UxhEF5tkLS2DmUNRgshyc="
+ }
+ }
+ }
+ }
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.0.4"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz",
+ "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=",
+ "requires": {
+ "is-buffer": "1.1.4"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
+ "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys="
+ }
+ }
+ }
+ }
+ },
+ "union-value": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.3.tgz",
+ "integrity": "sha1-7JHXWoPzEsKSUVwzuVSGWx3zICY=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.3.3"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "unset-value": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.1.tgz",
+ "integrity": "sha1-YL/crqoWpNuIyV5uecGN0e75eSI=",
+ "requires": {
+ "has-value": "0.2.1",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.2.1.tgz",
+ "integrity": "sha1-27FNoUDUKai81PCJvBkPfbML73A=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4"
+ },
+ "dependencies": {
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.4.tgz",
+ "integrity": "sha1-n2waVy6+YmcMWELLEr49lxZYHxw=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "2.1.0",
+ "lazy-cache": "1.0.4",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.0.4"
+ },
+ "dependencies": {
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "kind-of": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz",
+ "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=",
+ "requires": {
+ "is-buffer": "1.1.4"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
+ "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys="
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ }
+ }
+ },
+ "base-plugins": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/base-plugins/-/base-plugins-0.4.13.tgz",
+ "integrity": "sha1-kd8XjcN/hoQt6ihteeSPuGtarD0=",
+ "requires": {
+ "define-property": "0.2.5",
+ "is-registered": "0.1.5",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "is-registered": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/is-registered/-/is-registered-0.1.5.tgz",
+ "integrity": "sha1-HTRpd0GdZl4qxshAE1NWheb3b38=",
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "2.1.0"
+ }
+ }
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.4"
+ },
+ "dependencies": {
+ "is-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.4.tgz",
+ "integrity": "sha1-ws+g2FCZqQ35SvW3637hx+FBMYY=",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "3.0.4",
+ "lazy-cache": "1.0.4"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.0.4"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.0.4"
+ }
+ },
+ "kind-of": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz",
+ "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=",
+ "requires": {
+ "is-buffer": "1.1.4"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
+ "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys="
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ }
+ }
+ }
+ }
+ },
+ "expand-target": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/expand-target/-/expand-target-0.6.5.tgz",
+ "integrity": "sha1-YmyjjDb9n3vMkdwdbqmJ20/EVTA=",
+ "requires": {
+ "base": "0.11.1",
+ "base-plugins": "0.4.13",
+ "define-property": "0.2.5",
+ "expand-files": "0.8.4",
+ "expand-utils": "0.2.2",
+ "lazy-cache": "2.0.1"
+ },
+ "dependencies": {
+ "expand-files": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/expand-files/-/expand-files-0.8.4.tgz",
+ "integrity": "sha1-dXNcTTwA8oBbxqU2eBjTp7RLZno=",
+ "requires": {
+ "base": "0.11.1",
+ "base-plugins": "0.4.13",
+ "define-property": "0.2.5",
+ "expand-utils": "0.2.2",
+ "extend-shallow": "2.0.1",
+ "glob-parent": "2.0.0",
+ "has-glob": "0.1.1",
+ "lazy-cache": "2.0.1",
+ "matched": "0.4.3",
+ "normalize-config": "0.4.8",
+ "object.omit": "2.0.0",
+ "relative": "3.0.2",
+ "resolve-dir": "0.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "requires": {
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ }
+ }
+ }
+ }
+ },
+ "has-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz",
+ "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=",
+ "requires": {
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ }
+ }
+ }
+ }
+ },
+ "matched": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.3.tgz",
+ "integrity": "sha1-GNxgdM3aQCQAeLDKSCVXZsHyO/Q=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "async-array-reduce": "0.1.0",
+ "bluebird": "3.4.1",
+ "extend-shallow": "2.0.1",
+ "fs-exists-sync": "0.1.0",
+ "glob": "7.0.5",
+ "has-glob": "0.1.1",
+ "is-valid-glob": "0.3.0",
+ "lazy-cache": "2.0.1",
+ "resolve-dir": "0.1.1"
+ },
+ "dependencies": {
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "async-array-reduce": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.1.0.tgz",
+ "integrity": "sha1-x0uIZR1cf0bOUgPRUMPMfu3KV/I="
+ },
+ "bluebird": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz",
+ "integrity": "sha1-tzHd9I4t077awudeEhWhG8uR+gc="
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0="
+ },
+ "glob": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
+ "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.5",
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "minimatch": "3.0.3",
+ "once": "1.3.3",
+ "path-is-absolute": "1.0.0"
+ },
+ "dependencies": {
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "inflight": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz",
+ "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=",
+ "requires": {
+ "once": "1.3.3",
+ "wrappy": "1.0.2"
+ },
+ "dependencies": {
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ }
+ }
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+ "requires": {
+ "brace-expansion": "1.1.6"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=",
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ }
+ }
+ }
+ }
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "requires": {
+ "wrappy": "1.0.2"
+ },
+ "dependencies": {
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz",
+ "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI="
+ }
+ }
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4="
+ }
+ }
+ },
+ "normalize-config": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/normalize-config/-/normalize-config-0.4.8.tgz",
+ "integrity": "sha1-DzzJjBCRoHmtHjZC2bCp/gKVquA=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "kind-of": "3.0.4"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz",
+ "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=",
+ "requires": {
+ "is-buffer": "1.1.4"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
+ "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys="
+ }
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz",
+ "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=",
+ "requires": {
+ "for-own": "0.1.4",
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz",
+ "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=",
+ "requires": {
+ "for-in": "0.1.5"
+ },
+ "dependencies": {
+ "for-in": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz",
+ "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ="
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "relative": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz",
+ "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=",
+ "requires": {
+ "isobject": "2.1.0"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "requires": {
+ "os-homedir": "1.0.1"
+ },
+ "dependencies": {
+ "os-homedir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz",
+ "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac="
+ }
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "requires": {
+ "global-prefix": "0.1.4",
+ "is-windows": "0.2.0"
+ },
+ "dependencies": {
+ "global-prefix": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.4.tgz",
+ "integrity": "sha1-BRWNsc3i3UkbRV4pDrOri/xFxuE=",
+ "requires": {
+ "ini": "1.3.4",
+ "is-windows": "0.2.0",
+ "osenv": "0.1.3",
+ "which": "1.2.10"
+ },
+ "dependencies": {
+ "ini": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
+ },
+ "osenv": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz",
+ "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=",
+ "requires": {
+ "os-homedir": "1.0.1",
+ "os-tmpdir": "1.0.1"
+ },
+ "dependencies": {
+ "os-homedir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz",
+ "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac="
+ },
+ "os-tmpdir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz",
+ "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24="
+ }
+ }
+ },
+ "which": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz",
+ "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=",
+ "requires": {
+ "isexe": "1.1.2"
+ },
+ "dependencies": {
+ "isexe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz",
+ "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA="
+ }
+ }
+ }
+ }
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw="
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "expand-utils": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/expand-utils/-/expand-utils-0.2.2.tgz",
+ "integrity": "sha1-ioZJzGAwLp4Xm9H9/UFNhJGvCCk=",
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "2.1.0",
+ "lazy-cache": "2.0.1"
+ }
+ },
+ "is-scaffold": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-scaffold/-/is-scaffold-0.1.1.tgz",
+ "integrity": "sha1-bRFvNVy0YL5nBOYasOZoxZbpcEQ=",
+ "requires": {
+ "is-plain-object": "2.0.1"
+ },
+ "dependencies": {
+ "is-plain-object": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.1.tgz",
+ "integrity": "sha1-TXylObydubc3uKy2EvIxjvkvKU8=",
+ "requires": {
+ "isobject": "1.0.2"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz",
+ "integrity": "sha1-8Pm4zpLdVA+gdAiC44NaLgIux4o="
+ }
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.1.tgz",
+ "integrity": "sha1-j+mY3ZvFhxNgBdXlMiXE4DBskh0=",
+ "requires": {
+ "set-getter": "0.1.0"
+ },
+ "dependencies": {
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "requires": {
+ "to-object-path": "0.3.0"
+ },
+ "dependencies": {
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.0.4"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz",
+ "integrity": "sha1-e47PGKThf4Jp1ztQHJ8jLJaIenQ=",
+ "requires": {
+ "is-buffer": "1.1.4"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
+ "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys="
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "mixin-deep": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.1.3.tgz",
+ "integrity": "sha1-uUyjdty4hJtKIKCts6S3y9hd27U=",
+ "requires": {
+ "for-in": "0.1.5",
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "for-in": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz",
+ "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ="
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ },
+ "scaffold": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/scaffold/-/scaffold-0.2.13.tgz",
+ "integrity": "sha1-Pjhd69zYuoOT7WdTSgO3vB/0hA8=",
+ "requires": {
+ "base": "0.11.1",
+ "base-plugins": "0.4.13",
+ "define-property": "0.2.5",
+ "expand-target": "0.6.5",
+ "expand-utils": "0.2.2",
+ "extend-shallow": "2.0.1",
+ "is-scaffold": "0.1.1",
+ "isobject": "2.1.0",
+ "lazy-cache": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs="
+ },
+ "clone-buffer": {
+ "version": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
+ },
+ "clone-stats": {
+ "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
+ },
+ "cloneable-readable": {
+ "version": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "requires": {
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz"
+ }
+ },
+ "core-util-is": {
+ "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "d3": {
+ "version": "3.5.17",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
+ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
+ },
+ "google-closure-compiler-js": {
+ "version": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20170910.0.1.tgz",
+ "integrity": "sha1-Bsk7IVCS9K1XkoqKGw8SlWbSr3g=",
+ "requires": {
+ "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "webpack-core": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz"
+ }
+ },
+ "hammerjs": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
+ "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE="
+ },
+ "inherits": {
+ "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "isarray": {
+ "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "minimist": {
+ "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "moment": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.2.tgz",
+ "integrity": "sha512-Rf6jiHPEfxp9+dlzxPTmRHbvoFXsh2L/U8hOupUMpnuecHQmI6cF6lUbJl3QqKPko1u6ujO+FxtcajLVfLpAtA=="
+ },
+ "nvd3": {
+ "version": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz",
+ "integrity": "sha1-LT66dL8zNjtRAevx0JPFmlOuc8Q="
+ },
+ "process-nextick-args": {
+ "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
+ },
+ "readable-stream": {
+ "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
+ "requires": {
+ "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ },
+ "replace-ext": {
+ "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
+ },
+ "safe-buffer": {
+ "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM="
+ },
+ "source-list-map": {
+ "version": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
+ "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY="
+ },
+ "source-map": {
+ "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz"
+ }
+ },
+ "string_decoder": {
+ "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+ "requires": {
+ "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz"
+ }
+ },
+ "through2": {
+ "version": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
+ }
+ },
+ "typescript": {
+ "version": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz",
+ "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE="
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
+ },
+ "util-deprecate": {
+ "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "vinyl": {
+ "version": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "requires": {
+ "clone": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "clone-buffer": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "cloneable-readable": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz"
+ }
+ },
+ "webpack-core": {
+ "version": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
+ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
+ "requires": {
+ "source-list-map": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
+ "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz"
+ }
+ },
+ "xtend": {
+ "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ }
+ }
+}
diff --git a/public/vendor/package.json b/public/vendor/package.json
new file mode 100644
index 0000000..4a6644a
--- /dev/null
+++ b/public/vendor/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "ledgerrb",
+ "version": "1.0.0",
+ "description": "Ledger reporting for the Web",
+ "main": "./app/index.html",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/cycojesus/ledgerrb.git"
+ },
+ "author": "Gwenhael Le Moine",
+ "license": "GPL-3.0",
+ "bugs": {
+ "url": "https://github.com/cycojesus/ledgerrb/issues"
+ },
+ "homepage": "https://github.com/cycojesus/ledgerrb#readme",
+ "dependencies": {
+ "@uirouter/angularjs": "^1.0.11",
+ "angular": "^1.5.8",
+ "angular-animate": "^1.5.8",
+ "angular-aria": "^1.5.8",
+ "angular-i18n": "^1.5.8",
+ "angular-loader": "^1.5.8",
+ "angular-loading-bar": "^0.9.0",
+ "angular-messages": "^1.5.8",
+ "angular-mocks": "^1.5.8",
+ "angular-moment": "^1.0.0-beta.6",
+ "angular-nvd3": "^1.0.8",
+ "angularjs-nvd3-directives": "0.0.8",
+ "boilerplate": "^0.6.1",
+ "d3": "^3.5.17",
+ "google-closure-compiler-js": "^20170910.0.1",
+ "hammerjs": "^2.0.8",
+ "moment": "^2.19.2",
+ "nvd3": "^1.8.4",
+ "typescript": "^2.6.1",
+ "underscore": "^1.8.3"
+ }
+}
diff --git a/shard.lock b/shard.lock
new file mode 100644
index 0000000..aed954b
--- /dev/null
+++ b/shard.lock
@@ -0,0 +1,14 @@
+version: 1.0
+shards:
+ kemal:
+ github: kemalcr/kemal
+ commit: 8cb9770ec3c6cf5897e644229dad8d0b5c360941
+
+ kilt:
+ github: jeromegn/kilt
+ version: 0.4.0
+
+ radix:
+ github: luislavena/radix
+ version: 0.3.8
+
diff --git a/shard.yml b/shard.yml
new file mode 100644
index 0000000..34d92b4
--- /dev/null
+++ b/shard.yml
@@ -0,0 +1,7 @@
+name: credger
+version: 1.99
+
+dependencies:
+ kemal:
+ github: kemalcr/kemal
+ branch: master