You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2013/04/02 16:45:06 UTC

[1/4] git commit: updated refs/heads/1715-admin-auth to 628a1b5

Updated Branches:
  refs/heads/1715-admin-auth [created] 628a1b5cf


initial addon created


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/d85ac225
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/d85ac225
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/d85ac225

Branch: refs/heads/1715-admin-auth
Commit: d85ac2259c9be4f865b671f9b624f1a925de2d00
Parents: 4e3d674
Author: Garren Smith <ga...@gmail.com>
Authored: Sat Mar 9 10:08:54 2013 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Wed Mar 20 09:43:56 2013 +0200

----------------------------------------------------------------------
 src/fauxton/app/addons/user/base.js      |   26 +++++++++++++++++
 src/fauxton/app/addons/user/resources.js |   38 +++++++++++++++++++++++++
 src/fauxton/app/addons/user/routes.js    |    9 ++++++
 3 files changed, 73 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/d85ac225/src/fauxton/app/addons/user/base.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/base.js b/src/fauxton/app/addons/user/base.js
new file mode 100644
index 0000000..fd9d9c6
--- /dev/null
+++ b/src/fauxton/app/addons/user/base.js
@@ -0,0 +1,26 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+define([
+       "app",
+       "api",
+       "addons/user/resources"
+],
+
+function(app, FauxtonAPI, User) {
+
+  User.initialize = function() {
+    FauxtonAPI.addHeaderLink({title: "User", href: "#user"});
+  };
+
+  return User;
+});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/d85ac225/src/fauxton/app/addons/user/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/resources.js b/src/fauxton/app/addons/user/resources.js
new file mode 100644
index 0000000..1410164
--- /dev/null
+++ b/src/fauxton/app/addons/user/resources.js
@@ -0,0 +1,38 @@
+define([
+       "app",
+       "api"
+],
+
+function (app, FauxtonAPI) {
+  var User = new FauxtonAPI.addon();
+
+  User.Session = Backbone.Model.extend({
+    url: '/_session',
+  });
+  
+  User.Info = FauxtonAPI.View.extend({
+
+    initialize:function (options) {
+      this.model.on('change', this.update_session, this);
+    },
+
+    update_session: function () {
+      console.log('update session');
+      console.log(this.model);
+    }
+  });
+
+  var session = new User.Session();
+
+  User.Layout = Backbone.Layout.extend({
+    views: {
+      'a[href="#user"]': new User.Info({model: session})
+    }
+  });
+
+  var layout = new User.Layout();
+
+  layout.render();
+  session.fetch();
+  return User;
+});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/d85ac225/src/fauxton/app/addons/user/routes.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/routes.js b/src/fauxton/app/addons/user/routes.js
new file mode 100644
index 0000000..010ab24
--- /dev/null
+++ b/src/fauxton/app/addons/user/routes.js
@@ -0,0 +1,9 @@
+define([
+       "app",
+       "api",
+       "addons/user/resources"
+],
+
+function(app, FauxtonAPI, User) {
+  return User;
+});


[3/4] git commit: updated refs/heads/1715-admin-auth to 628a1b5

Posted by ga...@apache.org.
rename to auth module


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/ce2f879c
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/ce2f879c
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/ce2f879c

Branch: refs/heads/1715-admin-auth
Commit: ce2f879c99290ac6336447fa5b9881f1f137a64a
Parents: df184fc
Author: Garren Smith <ga...@gmail.com>
Authored: Tue Apr 2 10:27:07 2013 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Tue Apr 2 10:27:07 2013 +0200

----------------------------------------------------------------------
 src/fauxton/app/addons/user/base.js            |   26 -----
 src/fauxton/app/addons/user/resources.js       |  111 -------------------
 src/fauxton/app/addons/user/routes.js          |   30 -----
 src/fauxton/app/modules/fauxton/base.js        |   11 ++
 src/fauxton/app/templates/fauxton/nav_bar.html |    4 +-
 src/fauxton/settings.json.default              |    2 +-
 6 files changed, 15 insertions(+), 169 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/app/addons/user/base.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/base.js b/src/fauxton/app/addons/user/base.js
deleted file mode 100644
index d1c9334..0000000
--- a/src/fauxton/app/addons/user/base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-define([
-       "app",
-       "api",
-       "addons/user/routes"
-],
-
-function(app, FauxtonAPI, User) {
-
-  User.initialize = function() {
-    FauxtonAPI.addHeaderLink({title: "User", href: "#_user"});
-  };
-
-  return User;
-});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/app/addons/user/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/resources.js b/src/fauxton/app/addons/user/resources.js
deleted file mode 100644
index f6bd180..0000000
--- a/src/fauxton/app/addons/user/resources.js
+++ /dev/null
@@ -1,111 +0,0 @@
-define([
-       "app",
-       "api",
-       "addons/config/resources"
-],
-
-function (app, FauxtonAPI, Config) {
-  var User = new FauxtonAPI.addon();
-
-  User.Session = Backbone.Model.extend({
-    url: '/_session',
-
-    is_admin_party: function () {
-      var userCtx = this.get('userCtx');
-      if (!userCtx.name && userCtx.roles.indexOf("_admin") !== -1) {
-        return true;
-      }
-
-      return false;
-    },
-
-    create_admin: function (username, password) {
-      if (_.isEmpty(username) || _.isEmpty(password)) {
-        var deferred = $.Deferred();
-        
-        deferred.reject('Username or password cannot be blank.');
-        return deferred;
-      }
-
-      var admin = new Config.OptionModel({
-        section: "admins",
-        name: username,
-        value: password
-      });
-      return admin.save();
-    }
-  });
-
-  User.CreateAdminModal = FauxtonAPI.View.extend({
-    template: 'addons/user/templates/create_admin_modal',
-
-    events: {
-      "click #create-admin": "create_admin"
-    },
-
-    create_admin: function (event) {
-      event.preventDefault();
-      var self = this,
-          username = this.$('#username').val(),
-          password = this.$('#password').val();
-
-      var promise = this.model.create_admin(username, password);
-
-      promise.done(function () {
-        self.$('.modal').modal('hide');
-        self.trigger('admin_created');
-      });
-
-      promise.fail(function (msg) {
-        self.$('#modal-error').text(msg).removeClass('hide');
-      });
-    },
-
-    show_modal: function () {
-      this.$('.modal').modal();
-    }
-  });
-
-  User.Info = FauxtonAPI.View.extend({
-    template: 'addons/user/templates/info',
-
-    initialize:function (options) {
-      this.model.on('change', this.update_session, this);
-    },
-
-    serialize: function () {
-      return {
-        admin_party: this.model.is_admin_party()
-      };
-    },
-
-    events: {
-      "click #user-create-admin": 'show_admin_modal'
-    },
-
-    beforeRender: function () {
-      this.create_admin_modal = this.setView('#user-create-admin-modal', new  User.CreateAdminModal({model: this.model}));
-      this.create_admin_modal.on('admin_created', this.render);
-    },
-
-    afterRender: function () {
-      if (this.model.is_admin_party()) {
-        console.log('admin party');
-        return;
-      } else {
-        console.log('not admin');
-      }
-    },
-
-    show_admin_modal: function (event) {
-      event.preventDefault();
-      this.create_admin_modal.show_modal();
-    },
-
-    update_session: function () {
-      console.log(this.model);
-    }
-  });
-
-  return User;
-});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/app/addons/user/routes.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/routes.js b/src/fauxton/app/addons/user/routes.js
deleted file mode 100644
index 9108072..0000000
--- a/src/fauxton/app/addons/user/routes.js
+++ /dev/null
@@ -1,30 +0,0 @@
-define([
-       "app",
-       "api",
-       "addons/user/resources"
-],
-
-function(app, FauxtonAPI, User) {
-
-  var userRoutes = function () {
-
-    var session = new User.Session();
-    return {
-      layout: 'one_pane',
-      crumbs: [{"name": "User","link": "_user"}],
-      views: {
-        "#dashboard-content": new User.Info({model: session})
-      },
-      establish: function () {
-        return [session.fetch()];
-      },
-      apiUrl: 'boom'
-    };
-  };
-
-  User.Routes = {
-    "_user": userRoutes
-  };
-
-  return User;
-});

http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/app/modules/fauxton/base.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/fauxton/base.js b/src/fauxton/app/modules/fauxton/base.js
index a8bf430..e01c344 100644
--- a/src/fauxton/app/modules/fauxton/base.js
+++ b/src/fauxton/app/modules/fauxton/base.js
@@ -58,7 +58,18 @@ function(app, Backbone) {
         this.navLinks.push(link);
       }
       this.trigger("link:add");
+
       this.render();
+    },
+
+    afterRender: function () {
+      _.each(this.navLinks, function (link) {
+        if (link.view) {
+          this.insertView('#nav-links', link.view).render();
+        }
+
+      }, this);
+
     }
 
     // TODO: ADD ACTIVE CLASS

http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/app/templates/fauxton/nav_bar.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/fauxton/nav_bar.html b/src/fauxton/app/templates/fauxton/nav_bar.html
index c9800bf..5282e68 100644
--- a/src/fauxton/app/templates/fauxton/nav_bar.html
+++ b/src/fauxton/app/templates/fauxton/nav_bar.html
@@ -22,9 +22,11 @@ the License.
       </a>
       <a class="brand" href="#">Project Fauxton</a>
       <div class="nav-collapse">
-        <ul class="nav pull-right">
+        <ul id="nav-links" class="nav pull-right">
           <% _.each(navLinks, function(link) { %>
+          <% if (!link.view) { %>
             <li><a href="<%= link.href %>"><%= link.title %></a></li>
+            <% } %>
           <% }); %>
           <!-- TODO: pick this up from code - nested dicts in the above -->
 

http://git-wip-us.apache.org/repos/asf/couchdb/blob/ce2f879c/src/fauxton/settings.json.default
----------------------------------------------------------------------
diff --git a/src/fauxton/settings.json.default b/src/fauxton/settings.json.default
index ef986ba..9716ceb 100644
--- a/src/fauxton/settings.json.default
+++ b/src/fauxton/settings.json.default
@@ -4,7 +4,7 @@
   { "name": "logs" },
   { "name": "stats" },
   { "name": "contribute" },
-  { "name": "user" }
+  { "name": "auth" }
   ],
     "template": {
       "src": "assets/index.underscore",


[4/4] git commit: updated refs/heads/1715-admin-auth to 628a1b5

Posted by ga...@apache.org.
working changing password for admins


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/628a1b5c
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/628a1b5c
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/628a1b5c

Branch: refs/heads/1715-admin-auth
Commit: 628a1b5cf6df7cc6993de6dbdf2f081e75e1c352
Parents: ce2f879
Author: Garren Smith <ga...@gmail.com>
Authored: Tue Apr 2 16:43:41 2013 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Tue Apr 2 16:43:41 2013 +0200

----------------------------------------------------------------------
 src/fauxton/app/modules/fauxton/base.js        |   23 ++++++++++++------
 src/fauxton/app/templates/fauxton/nav_bar.html |   20 +--------------
 2 files changed, 17 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/628a1b5c/src/fauxton/app/modules/fauxton/base.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/fauxton/base.js b/src/fauxton/app/modules/fauxton/base.js
index e01c344..91ea581 100644
--- a/src/fauxton/app/modules/fauxton/base.js
+++ b/src/fauxton/app/modules/fauxton/base.js
@@ -11,10 +11,10 @@
 // the License.
 
 define([
-  "app",
+       "app",
 
-  // Libs
-  "backbone"
+       // Libs
+       "backbone"
 
 ],
 
@@ -62,14 +62,21 @@ function(app, Backbone) {
       this.render();
     },
 
-    afterRender: function () {
+    beforeRender: function () {
+      this.addLinkViews();
+    },
+
+    addLinkViews: function () {
+      var self = this;
+
       _.each(this.navLinks, function (link) {
-        if (link.view) {
-          this.insertView('#nav-links', link.view).render();
-        }
+        if (!link.view) { return; }
 
+        var establish = link.establish || [];
+        $.when.apply(null, establish).done( function () {
+          self.insertView('#nav-links', link.view).render();
+        });
       }, this);
-
     }
 
     // TODO: ADD ACTIVE CLASS

http://git-wip-us.apache.org/repos/asf/couchdb/blob/628a1b5c/src/fauxton/app/templates/fauxton/nav_bar.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/fauxton/nav_bar.html b/src/fauxton/app/templates/fauxton/nav_bar.html
index 5282e68..ebe57d0 100644
--- a/src/fauxton/app/templates/fauxton/nav_bar.html
+++ b/src/fauxton/app/templates/fauxton/nav_bar.html
@@ -24,26 +24,10 @@ the License.
       <div class="nav-collapse">
         <ul id="nav-links" class="nav pull-right">
           <% _.each(navLinks, function(link) { %>
-          <% if (!link.view) { %>
-            <li><a href="<%= link.href %>"><%= link.title %></a></li>
+            <% if (!link.view) { %>
+              <li><a href="<%= link.href %>"><%= link.title %></a></li>
             <% } %>
           <% }); %>
-          <!-- TODO: pick this up from code - nested dicts in the above -->
-
-          <!-- <li class="dropdown">
-            <a href="#" class="dropdown-toggle" data-toggle="dropdown">drsm79 <b class="caret"></b></a>
-            <ul class="dropdown-menu">
-              <li><a href="account.html#account">Account Info</a></li>
-              <li><a href="account.html#password">Password</a></li>
-              <li><a href="account.html#indexing-rate">Indexing rate</a></li>
-              <li><a href="account.html#support-level">Support level</a></li>
-              <li><a href="account.html#location">Location for your data</a></li>
-              <li><a href="account.html#email-notifications">Email notifications</a></li>
-              <li><a href="account.html#design">Design</a></li>
-              <li class="divider"></li>
-              <li><a href="/sign-out.html">Sign Out</a></li>
-            </ul>
-          </li> -->
         </ul>
       </div><!--/.nav-collapse -->
     </div>


[2/4] git commit: updated refs/heads/1715-admin-auth to 628a1b5

Posted by ga...@apache.org.
basic create admin role and admin party


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/df184fc1
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/df184fc1
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/df184fc1

Branch: refs/heads/1715-admin-auth
Commit: df184fc17508df13af7292f430a0f3d604550c3b
Parents: d85ac22
Author: Garren Smith <ga...@gmail.com>
Authored: Fri Mar 22 15:00:40 2013 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Fri Mar 22 15:00:40 2013 +0200

----------------------------------------------------------------------
 src/fauxton/app/addons/user/base.js      |    4 +-
 src/fauxton/app/addons/user/resources.js |  105 +++++++++++++++++++++----
 src/fauxton/app/addons/user/routes.js    |   21 +++++
 src/fauxton/settings.json.default        |    3 +-
 4 files changed, 114 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/df184fc1/src/fauxton/app/addons/user/base.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/base.js b/src/fauxton/app/addons/user/base.js
index fd9d9c6..d1c9334 100644
--- a/src/fauxton/app/addons/user/base.js
+++ b/src/fauxton/app/addons/user/base.js
@@ -13,13 +13,13 @@
 define([
        "app",
        "api",
-       "addons/user/resources"
+       "addons/user/routes"
 ],
 
 function(app, FauxtonAPI, User) {
 
   User.initialize = function() {
-    FauxtonAPI.addHeaderLink({title: "User", href: "#user"});
+    FauxtonAPI.addHeaderLink({title: "User", href: "#_user"});
   };
 
   return User;

http://git-wip-us.apache.org/repos/asf/couchdb/blob/df184fc1/src/fauxton/app/addons/user/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/resources.js b/src/fauxton/app/addons/user/resources.js
index 1410164..f6bd180 100644
--- a/src/fauxton/app/addons/user/resources.js
+++ b/src/fauxton/app/addons/user/resources.js
@@ -1,38 +1,111 @@
 define([
        "app",
-       "api"
+       "api",
+       "addons/config/resources"
 ],
 
-function (app, FauxtonAPI) {
+function (app, FauxtonAPI, Config) {
   var User = new FauxtonAPI.addon();
 
   User.Session = Backbone.Model.extend({
     url: '/_session',
+
+    is_admin_party: function () {
+      var userCtx = this.get('userCtx');
+      if (!userCtx.name && userCtx.roles.indexOf("_admin") !== -1) {
+        return true;
+      }
+
+      return false;
+    },
+
+    create_admin: function (username, password) {
+      if (_.isEmpty(username) || _.isEmpty(password)) {
+        var deferred = $.Deferred();
+        
+        deferred.reject('Username or password cannot be blank.');
+        return deferred;
+      }
+
+      var admin = new Config.OptionModel({
+        section: "admins",
+        name: username,
+        value: password
+      });
+      return admin.save();
+    }
+  });
+
+  User.CreateAdminModal = FauxtonAPI.View.extend({
+    template: 'addons/user/templates/create_admin_modal',
+
+    events: {
+      "click #create-admin": "create_admin"
+    },
+
+    create_admin: function (event) {
+      event.preventDefault();
+      var self = this,
+          username = this.$('#username').val(),
+          password = this.$('#password').val();
+
+      var promise = this.model.create_admin(username, password);
+
+      promise.done(function () {
+        self.$('.modal').modal('hide');
+        self.trigger('admin_created');
+      });
+
+      promise.fail(function (msg) {
+        self.$('#modal-error').text(msg).removeClass('hide');
+      });
+    },
+
+    show_modal: function () {
+      this.$('.modal').modal();
+    }
   });
-  
+
   User.Info = FauxtonAPI.View.extend({
+    template: 'addons/user/templates/info',
 
     initialize:function (options) {
       this.model.on('change', this.update_session, this);
     },
 
-    update_session: function () {
-      console.log('update session');
-      console.log(this.model);
-    }
-  });
+    serialize: function () {
+      return {
+        admin_party: this.model.is_admin_party()
+      };
+    },
+
+    events: {
+      "click #user-create-admin": 'show_admin_modal'
+    },
 
-  var session = new User.Session();
+    beforeRender: function () {
+      this.create_admin_modal = this.setView('#user-create-admin-modal', new  User.CreateAdminModal({model: this.model}));
+      this.create_admin_modal.on('admin_created', this.render);
+    },
+
+    afterRender: function () {
+      if (this.model.is_admin_party()) {
+        console.log('admin party');
+        return;
+      } else {
+        console.log('not admin');
+      }
+    },
+
+    show_admin_modal: function (event) {
+      event.preventDefault();
+      this.create_admin_modal.show_modal();
+    },
 
-  User.Layout = Backbone.Layout.extend({
-    views: {
-      'a[href="#user"]': new User.Info({model: session})
+    update_session: function () {
+      console.log(this.model);
     }
   });
 
-  var layout = new User.Layout();
-
-  layout.render();
-  session.fetch();
   return User;
 });

http://git-wip-us.apache.org/repos/asf/couchdb/blob/df184fc1/src/fauxton/app/addons/user/routes.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/user/routes.js b/src/fauxton/app/addons/user/routes.js
index 010ab24..9108072 100644
--- a/src/fauxton/app/addons/user/routes.js
+++ b/src/fauxton/app/addons/user/routes.js
@@ -5,5 +5,26 @@ define([
 ],
 
 function(app, FauxtonAPI, User) {
+
+  var userRoutes = function () {
+
+    var session = new User.Session();
+    return {
+      layout: 'one_pane',
+      crumbs: [{"name": "User","link": "_user"}],
+      views: {
+        "#dashboard-content": new User.Info({model: session})
+      },
+      establish: function () {
+        return [session.fetch()];
+      },
+      apiUrl: 'boom'
+    };
+  };
+
+  User.Routes = {
+    "_user": userRoutes
+  };
+
   return User;
 });

http://git-wip-us.apache.org/repos/asf/couchdb/blob/df184fc1/src/fauxton/settings.json.default
----------------------------------------------------------------------
diff --git a/src/fauxton/settings.json.default b/src/fauxton/settings.json.default
index b4c0dbc..ef986ba 100644
--- a/src/fauxton/settings.json.default
+++ b/src/fauxton/settings.json.default
@@ -3,7 +3,8 @@
   { "name": "config" },
   { "name": "logs" },
   { "name": "stats" },
-  { "name": "contribute" }
+  { "name": "contribute" },
+  { "name": "user" }
   ],
     "template": {
       "src": "assets/index.underscore",