From 631b3d7ea02c090ea3e296497928bbe9a6e46bcd Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 13:59:11 -0400 Subject: [PATCH 1/9] Start adding application server example --- .../application-server-boilerplate/.gitignore | 3 ++ .../application-server-boilerplate/README.md | 4 +++ .../application-server-boilerplate/config.yml | 8 ++++++ .../db/README.md | 1 + .../application-server-boilerplate/index.js | 23 +++++++++++++++ .../package.json | 28 +++++++++++++++++++ 6 files changed, 67 insertions(+) create mode 100644 examples/application-server-boilerplate/.gitignore create mode 100644 examples/application-server-boilerplate/README.md create mode 100644 examples/application-server-boilerplate/config.yml create mode 100644 examples/application-server-boilerplate/db/README.md create mode 100644 examples/application-server-boilerplate/index.js create mode 100644 examples/application-server-boilerplate/package.json diff --git a/examples/application-server-boilerplate/.gitignore b/examples/application-server-boilerplate/.gitignore new file mode 100644 index 00000000..adef95e2 --- /dev/null +++ b/examples/application-server-boilerplate/.gitignore @@ -0,0 +1,3 @@ +log.txt +db +node_modules diff --git a/examples/application-server-boilerplate/README.md b/examples/application-server-boilerplate/README.md new file mode 100644 index 00000000..02786f68 --- /dev/null +++ b/examples/application-server-boilerplate/README.md @@ -0,0 +1,4 @@ +# express-pouchdb-server-boilerplate +Gets you set up with an express server with pouchdb, and admin user, and an app database. + +Work In Progress, see issue https://github.com/pouchdb/pouchdb-server/issues/224 diff --git a/examples/application-server-boilerplate/config.yml b/examples/application-server-boilerplate/config.yml new file mode 100644 index 00000000..dd47f45e --- /dev/null +++ b/examples/application-server-boilerplate/config.yml @@ -0,0 +1,8 @@ +admin: + username: "admin" + password: "password" +domain: "127.0.0.1" +protocol: "http://" +port: 3030 +dbServerEndpoint: '/db' +appDatabase: 'app' diff --git a/examples/application-server-boilerplate/db/README.md b/examples/application-server-boilerplate/db/README.md new file mode 100644 index 00000000..287cceb4 --- /dev/null +++ b/examples/application-server-boilerplate/db/README.md @@ -0,0 +1 @@ +Placeholder for databases. diff --git a/examples/application-server-boilerplate/index.js b/examples/application-server-boilerplate/index.js new file mode 100644 index 00000000..206e0b30 --- /dev/null +++ b/examples/application-server-boilerplate/index.js @@ -0,0 +1,23 @@ +var http = require('axios'); +var read = require('read-yaml'); +var PouchDB = require('pouchdb'); +var express = require('express'); +var app = express(); +var config = read.sync('./config.yml'); + +const DB_URL = `${config.protocol}${config.domain}:${config.port}${config.dbServerEndpoint}` +const DB_ADMIN_URL = `${config.protocol}${config.admin.username}:${config.admin.password}@${config.domain}:${config.port}${config.dbServerEndpoint}` + +app.use(config.dbServerEndpoint, require('express-pouchdb')(PouchDB.defaults({prefix: './db/'}))); +app.listen(config.port); + +async function setup() { + try { + await http.put(`${DB_URL}/_config/admins/${config.admin.username}`, config.admin.password); + await http.put(`${DB_ADMIN_URL}/app`); + } + catch (err) { + console.log(err); + } +} +setup(); diff --git a/examples/application-server-boilerplate/package.json b/examples/application-server-boilerplate/package.json new file mode 100644 index 00000000..6363a4b8 --- /dev/null +++ b/examples/application-server-boilerplate/package.json @@ -0,0 +1,28 @@ +{ + "name": "express-pouchdb-server-boilerplate", + "version": "0.0.0", + "description": "Boilerplate for creating an express-pouchdb-server", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rjsteinert/express-pouchdb-server-boilerplate.git" + }, + "keywords": [ + "express-pouchdb", + "pouchdb" + ], + "author": "R.J. Steinert", + "license": "ISC", + "bugs": { + "url": "https://github.com/rjsteinert/express-pouchdb-server-boilerplate/issues" + }, + "homepage": "https://github.com/rjsteinert/express-pouchdb-server-boilerplate#readme", + "dependencies": { + "axios": "^0.16.2", + "express-pouchdb": "^2.3.7", + "read-yaml": "^1.1.0" + } +} From 08cc22b882f3a93405cb2304351e957a8d807e65 Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:29:50 -0400 Subject: [PATCH 2/9] Fix use of Axios to send PUT of plain string body --- examples/application-server-boilerplate/index.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/application-server-boilerplate/index.js b/examples/application-server-boilerplate/index.js index 206e0b30..13eef5e5 100644 --- a/examples/application-server-boilerplate/index.js +++ b/examples/application-server-boilerplate/index.js @@ -12,12 +12,24 @@ app.use(config.dbServerEndpoint, require('express-pouchdb')(PouchDB.defaults({pr app.listen(config.port); async function setup() { + + // Set up the admin user. + try { + await http.put(`${DB_URL}/_config/admins/${config.admin.username}`, `"${config.admin.password}"`, {headers:{}}); + console.log("Admin created."); + } + catch (err) { + console.log("We already have admins."); + } + + // Set up the app database. try { - await http.put(`${DB_URL}/_config/admins/${config.admin.username}`, config.admin.password); await http.put(`${DB_ADMIN_URL}/app`); + console.log("App database created."); } catch (err) { - console.log(err); + console.log("We already have an app database."); } + } setup(); From cea0cdff7a6255a37928ae246206e9247c4b9e15 Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:35:05 -0400 Subject: [PATCH 3/9] Add a static mounted public folder in example-application-server --- examples/application-server-boilerplate/index.js | 3 +++ examples/application-server-boilerplate/public/index.html | 1 + 2 files changed, 4 insertions(+) create mode 100644 examples/application-server-boilerplate/public/index.html diff --git a/examples/application-server-boilerplate/index.js b/examples/application-server-boilerplate/index.js index 13eef5e5..cd67d270 100644 --- a/examples/application-server-boilerplate/index.js +++ b/examples/application-server-boilerplate/index.js @@ -2,6 +2,7 @@ var http = require('axios'); var read = require('read-yaml'); var PouchDB = require('pouchdb'); var express = require('express'); +var path = require('path'); var app = express(); var config = read.sync('./config.yml'); @@ -11,6 +12,8 @@ const DB_ADMIN_URL = `${config.protocol}${config.admin.username}:${config.admin. app.use(config.dbServerEndpoint, require('express-pouchdb')(PouchDB.defaults({prefix: './db/'}))); app.listen(config.port); +app.use(express.static(path.join(__dirname, 'public'))); + async function setup() { // Set up the admin user. diff --git a/examples/application-server-boilerplate/public/index.html b/examples/application-server-boilerplate/public/index.html new file mode 100644 index 00000000..18249f33 --- /dev/null +++ b/examples/application-server-boilerplate/public/index.html @@ -0,0 +1 @@ +Hello world. From 7150070ad16d578f8a4ee6f9d4a9086aff3163b6 Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:48:36 -0400 Subject: [PATCH 4/9] Add the Todos app to the application example server --- .../public/images/bg.png | Bin 0 -> 2126 bytes .../public/index.html | 36 +- .../public/scripts/app.js | 168 +++++++ .../public/scripts/pouchdb-nightly.min.js | 3 + .../public/styles/base.css | 424 ++++++++++++++++++ 5 files changed, 630 insertions(+), 1 deletion(-) create mode 100644 examples/application-server-boilerplate/public/images/bg.png create mode 100644 examples/application-server-boilerplate/public/scripts/app.js create mode 100644 examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js create mode 100644 examples/application-server-boilerplate/public/styles/base.css diff --git a/examples/application-server-boilerplate/public/images/bg.png b/examples/application-server-boilerplate/public/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a7600825ee11f21849ed475499c7d1ecbcc870 GIT binary patch literal 2126 zcmV-U2(kBxP)+9y`=HK7nt=~3t000O5Nklm=04hVa_lXl_bm=+M;=eI<%$rO2ta`suh*Sr#POw*?adq!O!CV z*0&b)rkCCEV)1nIuiLBntUH-MJI;&qYgz|d@Nhnn_abi2g`pu4NAMVid3hS%?quz~ zjlJf(x8cj{VS zUVEP1msg9`^OFUhSO5rtXHhRlyU2i>6$BT=glG`{JlctGHrwRIm)6Buu65jLQn^H8 zvl9lZqUBA+%qvM5XC+yY@mfA(YB~XP=e|6<{%$^eU8nrK?v2ccb@Jom5CG>rKAL7J zplHEIavVp|0p1&m!G`Ti?<7iZ;}@G7#Z)}Km%2!FHnQ0*&?PLR)G!HAaHgU#c|$dz zpj#0HmeadIe>`#)=Jjkb{B=FKnU3pc-&Y@j_j6(h4Y~+Uq!^J=LHunx1xi4QXK-Y{&MoT8ky6Vb9c|WhnOwF~c=3zOy8agktliS6# z`#8F`9H)D=bmk9B5MnW&_r#)f$c+;$LSr-@^An8dhc~Iquuv>jOK7pw7LJ;&X0i1C zGMsHdP1Os@ny$$j!>XAii%7bp5k>`pyNA!~epb)()p9zR4Yl6z=U}{CIdh1z(FpAo zQIW!;0zpCyC4*7YLkZCO@cul0R_&zghsA8Ek)z%jNpKa92{@NH+SstX%@}xB*Jk!l}PZ1cClIns~}5^!RncUk*rmA z%SIVgt58EQxLJ+OiFqKkBuwquyZLUp|gr zPUbUbFbBrPd1xO`^C*r-i3p9*F#(OBh!4Wy@aC&*!|O|GXcjDA&YhF{;cD7*o(GS^ z@pQSE7)x_81=Qyje6*LQ#TXu-7(o;S8u3tpDA0_ddj%hmCspeXdhYR}-i9A=C`EoChUYuH~^x!9+|&(Pgb*>Ck<=9j|)*@xyfT zpP#+Kt<}39b|3Wl4fxT(+G?aH>gG^d@MEaUOJRfy55TtFI7^Y)VuMU=7Pp0y55jS~ z+TJ)igMyrqkX;wU8j68iIDtqJYhS_D3_Oem-@g6me_RfiQ}uT_K-A-9qG%}gk3E9c z!8`KgsMNXm)beloPfMql*|&$M>1q`i!cY)RFYnjNYu*gSv@8XebV7%}xYL>6)GJPJ zJpA7K31lcJuIFKSw-{x4FX0K2Az)~Xg<`sOu$4|^-(^XJX4YzoiNRvL zyuY7~26w-P^Zw%6F}shBwV2$02c8RsSUy6dM92diCAxiX3IUqsq5ig6>U_!Vy*q5$ zjm}16tJr+QZ&T?HkkpeIwVX-r1EI=@%Zlt;6g*mj&E!A))%gXJ=x6u#l zcKEP>bx4rqV*k`BBrZ$Mqjt{TsHcxUH>;)iAK}B(Kila&VD%b?6m&^0WK4^&EZNAI z8AMYs_%$D%|M+@+cQqL-hi4yG>h*jwdii!W1{}p>ZhwFYt_4Su1kjY9<-5`!$VNOI1y(EDSH4WpCijE_>al!Nt=^eVER#uJ1=b z;BWF2IgyF5LexV+yec$Kin;Ai@myo;G>zJ&jrdW#ecXhIZph5OYqw_PEfcF56Z5Zu_ZZE#q3Mc+N&1O^7hoh9QR7`+L$cBP5pqG=fqA0uh zUBukaxTFmH)<|Xbvp2c=HSbNkpXw73a5lv7V$jb92#yZ141@$X?F}Jt8gIU7Wm6m9 z?e_;;zsnm6`LZeP>T=$)Kr>Z?kr*UmFqR7zx0C6^bmcsc@1AGtw_rNH>-Xm$d*|Q< zn&1Ln0u7=l&ILs>%CkJp`DiG9F18x4Ne+lg<#i?e7jL%x;4ZnRkN^Mx07*qoM6N<$ Ef(>0N!2kdN literal 0 HcmV?d00001 diff --git a/examples/application-server-boilerplate/public/index.html b/examples/application-server-boilerplate/public/index.html index 18249f33..17115ee5 100644 --- a/examples/application-server-boilerplate/public/index.html +++ b/examples/application-server-boilerplate/public/index.html @@ -1 +1,35 @@ -Hello world. + + + + + + VanillaJS • TodoMVC + + + +
+ +
+
    +
    +
    + +
    +
    Currently syncing
    +
    There was a problem syncing
    +
    +
    +
    + + + + + diff --git a/examples/application-server-boilerplate/public/scripts/app.js b/examples/application-server-boilerplate/public/scripts/app.js new file mode 100644 index 00000000..ba202611 --- /dev/null +++ b/examples/application-server-boilerplate/public/scripts/app.js @@ -0,0 +1,168 @@ +(function() { + + 'use strict'; + + var ENTER_KEY = 13; + var newTodoDom = document.getElementById('new-todo'); + var syncDom = document.getElementById('sync-wrapper'); + + // EDITING STARTS HERE (you dont need to edit anything above this line) + + var db = new PouchDB('todos'); + var remoteCouch = window.location.href + 'db/todos'; + + db.info(function(err, info) { + db.changes({ + since: info.update_seq, + continuous: true, + onChange: showTodos + }); + }); + + // We have to create a new todo document and enter it in the database + function addTodo(text) { + var todo = { + _id: new Date().toISOString(), + title: text, + completed: false + }; + db.put(todo, function callback (err, result) { + if (!err) { + console.log('Successfully posted a todo!'); + } + }); + } + + // Show the current list of todos by reading them from the database + function showTodos() { + db.allDocs({ + include_docs: true, + descending: true + }, function(err, doc) { + redrawTodosUI(doc.rows); + }); + } + + function checkboxChanged(todo, event) { + todo.completed = event.target.checked; + db.put(todo); + } + + // User pressed the delete button for a todo, delete it + function deleteButtonPressed(todo) { + db.remove(todo); + } + + // The input box when editing a todo has blurred, we should save + // the new title or delete the todo if the title is empty + function todoBlurred(todo, event) { + var trimmedText = event.target.value.trim(); + if (!trimmedText) { + db.remove(todo); + } else { + todo.title = trimmedText; + db.put(todo); + } + } + + // Initialise a sync with the remote server + function sync() { + syncDom.setAttribute('data-sync-state', 'syncing'); + var opts = {continuous: true, complete: syncError}; + db.replicate.to(remoteCouch, opts); + db.replicate.from(remoteCouch, opts); + } + + // EDITING STARTS HERE (you dont need to edit anything below this line) + + // There was some form or error syncing + function syncError() { + syncDom.setAttribute('data-sync-state', 'error'); + } + + // User has double clicked a todo, display an input so they can edit the title + function todoDblClicked(todo) { + var div = document.getElementById('li_' + todo._id); + var inputEditTodo = document.getElementById('input_' + todo._id); + div.className = 'editing'; + inputEditTodo.focus(); + } + + // If they press enter while editing an entry, blur it to trigger save + // (or delete) + function todoKeyPressed(todo, event) { + if (event.keyCode === ENTER_KEY) { + var inputEditTodo = document.getElementById('input_' + todo._id); + inputEditTodo.blur(); + } + } + + // Given an object representing a todo, this will create a list item + // to display it. + function createTodoListItem(todo) { + var checkbox = document.createElement('input'); + checkbox.className = 'toggle'; + checkbox.type = 'checkbox'; + checkbox.addEventListener('change', checkboxChanged.bind(this, todo)); + + var label = document.createElement('label'); + label.appendChild( document.createTextNode(todo.title)); + label.addEventListener('dblclick', todoDblClicked.bind(this, todo)); + + var deleteLink = document.createElement('button'); + deleteLink.className = 'destroy'; + deleteLink.addEventListener( 'click', deleteButtonPressed.bind(this, todo)); + + var divDisplay = document.createElement('div'); + divDisplay.className = 'view'; + divDisplay.appendChild(checkbox); + divDisplay.appendChild(label); + divDisplay.appendChild(deleteLink); + + var inputEditTodo = document.createElement('input'); + inputEditTodo.id = 'input_' + todo._id; + inputEditTodo.className = 'edit'; + inputEditTodo.value = todo.title; + inputEditTodo.addEventListener('keypress', todoKeyPressed.bind(this, todo)); + inputEditTodo.addEventListener('blur', todoBlurred.bind(this, todo)); + + var li = document.createElement('li'); + li.id = 'li_' + todo._id; + li.appendChild(divDisplay); + li.appendChild(inputEditTodo); + + if (todo.completed) { + li.className += 'complete'; + checkbox.checked = true; + } + + return li; + } + + function redrawTodosUI(todos) { + var ul = document.getElementById('todo-list'); + ul.innerHTML = ''; + todos.forEach(function(todo) { + ul.appendChild(createTodoListItem(todo.doc)); + }); + } + + function newTodoKeyPressHandler( event ) { + if (event.keyCode === ENTER_KEY) { + addTodo(newTodoDom.value); + newTodoDom.value = ''; + } + } + + function addEventListeners() { + newTodoDom.addEventListener('keypress', newTodoKeyPressHandler, false); + } + + addEventListeners(); + showTodos(); + + if (remoteCouch) { + sync(); + } + +})(); diff --git a/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js b/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js new file mode 100644 index 00000000..ef9a7e95 --- /dev/null +++ b/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js @@ -0,0 +1,3 @@ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.PouchDB=e():"undefined"!=typeof global?global.PouchDB=e():"undefined"!=typeof self&&(self.PouchDB=e())}(function(){var define,module,exports;return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);throw new Error("Cannot find module '"+a+"'")}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;at&&a.push(e)}),merge.traverseRevTree(o,function(e,t,n,r,o){var i=t+"-"+n;"available"===o.status&&-1!==a.indexOf(i)&&(o.status="missing",s.push(i))}),customApi._doCompaction(e,o,s,n)})}var api={},customApi=Pouch.adapters[opts.adapter](opts,function(e,t){if(e)return callback&&callback(e),void 0;for(var n in api)t.hasOwnProperty(n)||(t[n]=api[n]);opts.name===Pouch.prefix+Pouch.ALL_DBS?callback(e,t):Pouch.open(opts,function(e){callback(e,t)})}),auto_compaction=opts.auto_compaction===!0;api.post=function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e||Array.isArray(e)?call(n,errors.NOT_AN_OBJECT):customApi.bulkDocs({docs:[e]},t,autoCompact(yankError(n)))},api.put=function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e?call(n,errors.NOT_AN_OBJECT):"_id"in e?customApi.bulkDocs({docs:[e]},t,autoCompact(yankError(n))):call(n,errors.MISSING_ID)},api.putAttachment=function(e,t,n,r,o,i){function a(e){e._attachments=e._attachments||{},e._attachments[t]={content_type:o,data:r},api.put(e,i)}return api.taskqueue.ready()?("function"==typeof o&&(i=o,o=r,r=n,n=null),"undefined"==typeof o&&(o=r,r=n,n=null),api.get(e,function(t,r){return t&&t.error===errors.MISSING_DOC.error?(a({_id:e}),void 0):t?(call(i,t),void 0):r._rev!==n?(call(i,errors.REV_CONFLICT),void 0):(a(r),void 0)}),void 0):(api.taskqueue.addTask("putAttachment",arguments),void 0)},api.removeAttachment=function(e,t,n,r){api.get(e,function(e,o){return e?(call(r,e),void 0):o._rev!==n?(call(r,errors.REV_CONFLICT),void 0):o._attachments?(delete o._attachments[t],0===Object.keys(o._attachments).length&&delete o._attachments,api.put(o,r),void 0):call(r,null)})},api.remove=function(e,t,n){"function"==typeof t&&(n=t,t={}),void 0===t&&(t={}),t.was_delete=!0;var r={_id:e._id,_rev:e._rev};return r._deleted=!0,customApi.bulkDocs({docs:[r]},t,yankError(n))},api.revsDiff=function(e,t,n){function r(e,t){s[e]||(s[e]={missing:[]}),s[e].missing.push(t)}function o(t,n){var o=e[t].slice(0);merge.traverseRevTree(n,function(e,n,i,a,s){var u=n+"-"+i,c=o.indexOf(u);-1!==c&&(o.splice(c,1),"available"!==s.status&&r(t,u))}),o.forEach(function(e){r(t,e)})}"function"==typeof t&&(n=t,t={});var i=Object.keys(e),a=0,s={};i.map(function(t){customApi._getRevisionTree(t,function(r,u){if(r&&"not_found"===r.error&&"missing"===r.reason)s[t]={missing:e[t]};else{if(r)return call(n,r);o(t,u)}return++a===i.length?call(n,null,s):void 0})})},api.compact=function(e,t){"function"==typeof e&&(t=e,e={}),api.changes({complete:function(e,n){if(e)return call(t),void 0;var r=n.results.length;return r?(n.results.forEach(function(e){compactDocument(e.id,0,function(){r--,r||call(t)})}),void 0):(call(t),void 0)}})},api.get=function(e,t,n){function r(){var r=[],i=o.length;return i?(o.forEach(function(o){api.get(e,{rev:o,revs:t.revs},function(e,t){e?r.push({missing:o}):r.push({ok:t}),i--,i||call(n,null,r)})}),void 0):call(n,null,r)}if(!api.taskqueue.ready())return api.taskqueue.addTask("get",arguments),void 0;"function"==typeof t&&(n=t,t={});var o=[];{if(!t.open_revs)return customApi._get(e,t,function(e,r){if(e)return call(n,e);var o=r.doc,i=r.metadata,a=r.ctx;if(t.conflicts){var s=merge.collectConflicts(i);s.length&&(o._conflicts=s)}if(t.revs||t.revs_info){var u=merge.rootToLeaf(i.rev_tree),c=arrayFirst(u,function(e){return-1!==e.ids.map(function(e){return e.id}).indexOf(o._rev.split("-")[1])});if(c.ids.splice(c.ids.map(function(e){return e.id}).indexOf(o._rev.split("-")[1])+1),c.ids.reverse(),t.revs&&(o._revisions={start:c.pos+c.ids.length-1,ids:c.ids.map(function(e){return e.id})}),t.revs_info){var d=c.pos+c.ids.length;o._revs_info=c.ids.map(function(e){return d--,{rev:d+"-"+e.id,status:e.opts.status}})}}if(t.local_seq&&(o._local_seq=r.metadata.seq),t.attachments&&o._attachments){var l=o._attachments,f=Object.keys(l).length;if(0===f)return call(n,null,o);Object.keys(l).forEach(function(e){customApi._getAttachment(l[e],{encode:!0,ctx:a},function(t,r){o._attachments[e].data=r,--f||call(n,null,o)})})}else{if(o._attachments)for(var p in o._attachments)o._attachments[p].stub=!0;call(n,null,o)}});if("all"===t.open_revs)customApi._getRevisionTree(e,function(e,t){e&&(t=[]),o=merge.collectLeaves(t).map(function(e){return e.rev}),r()});else{if(!Array.isArray(t.open_revs))return call(n,utils.error(errors.UNKNOWN_ERROR,"function_clause"));o=t.open_revs;for(var i=0;i1&&"_design"!==d[0]&&"_local"!==d[0]||d.length>2&&"_design"===d[0]&&"_local"!==d[0])&&(c.binary=!0),n(c,function(e,t,n){return e?u.call(o,e):(u.call(o,null,t,n),void 0)})},l.remove=function(e,t,o){return l.taskqueue.ready()?("function"==typeof t&&(o=t,t={}),n({headers:s.headers,method:"DELETE",url:i(s,r(e._id))+"?rev="+e._rev},o),void 0):(l.taskqueue.addTask("remove",arguments),void 0)},l.getAttachment=function(e,t,n,o){"function"==typeof n&&(o=n,n={}),void 0===n.auto_encode&&(n.auto_encode=!0),n.auto_encode&&(e=r(e)),n.auto_encode=!1,l.get(e+"/"+t,n,o)},l.removeAttachment=function(e,t,o,a){return l.taskqueue.ready()?(n({headers:s.headers,method:"DELETE",url:i(s,r(e)+"/"+t)+"?rev="+o},a),void 0):(l.taskqueue.addTask("removeAttachment",arguments),void 0)},l.putAttachment=function(e,t,o,a,u,c){if(!l.taskqueue.ready())return l.taskqueue.addTask("putAttachment",arguments),void 0;"function"==typeof u&&(c=u,u=a,a=o,o=null),"undefined"==typeof u&&(u=a,a=o,o=null);var d=r(e)+"/"+t,f=i(s,d);o&&(f+="?rev="+o);var p={headers:s.headers,method:"PUT",url:f,processData:!1,body:a,timeout:6e4};p.headers["Content-Type"]=u,n(p,c)},l.put=function(e,t,o){if(!l.taskqueue.ready())return l.taskqueue.addTask("put",arguments),void 0;if("function"==typeof t&&(o=t,t={}),"object"!=typeof e)return u.call(o,c.NOT_AN_OBJECT);if(!("_id"in e))return u.call(o,c.MISSING_ID);var a=[];t&&"undefined"!=typeof t.new_edits&&a.push("new_edits="+t.new_edits),a=a.join("&"),""!==a&&(a="?"+a),n({headers:s.headers,method:"PUT",url:i(s,r(e._id))+a,body:e},o)},l.post=function(e,t,n){return l.taskqueue.ready()?("function"==typeof t&&(n=t,t={}),"object"!=typeof e?u.call(n,c.NOT_AN_OBJECT):("_id"in e?l.put(e,t,n):p.list.length>0?(e._id=p.list.pop(),l.put(e,t,n)):p.get(function(r){return r?u.call(n,c.UNKNOWN_ERROR):(e._id=p.list.pop(),l.put(e,t,n),void 0)}),void 0)):(l.taskqueue.addTask("post",arguments),void 0)},l.bulkDocs=function(e,t,r){return l.taskqueue.ready()?("function"==typeof t&&(r=t,t={}),t||(t={}),"undefined"!=typeof t.new_edits&&(e.new_edits=t.new_edits),n({headers:s.headers,method:"POST",url:i(s,"_bulk_docs"),body:e},r),void 0):(l.taskqueue.addTask("bulkDocs",arguments),void 0)},l.allDocs=function(e,t){if(!l.taskqueue.ready())return l.taskqueue.addTask("allDocs",arguments),void 0;"function"==typeof e&&(t=e,e={});var r,o=[],a="GET";e.conflicts&&o.push("conflicts=true"),e.descending&&o.push("descending=true"),e.include_docs&&o.push("include_docs=true"),e.startkey&&o.push("startkey="+encodeURIComponent(JSON.stringify(e.startkey))),e.endkey&&o.push("endkey="+encodeURIComponent(JSON.stringify(e.endkey))),e.limit&&o.push("limit="+e.limit),"undefined"!=typeof e.skip&&o.push("skip="+e.skip),o=o.join("&"),""!==o&&(o="?"+o),"undefined"!=typeof e.keys&&(a="POST",r=JSON.stringify({keys:e.keys})),n({headers:s.headers,method:a,url:i(s,"_all_docs"+o),body:r},t)},l.changes=function(e){var t=25;if(!l.taskqueue.ready()){var r=l.taskqueue.addTask("changes",arguments);return{cancel:function(){return r.task?r.task.cancel():(r.parameters[0].aborted=!0,void 0)}}}if("latest"===e.since){var o;return l.info(function(t,n){e.aborted||(e.since=n.update_seq,o=l.changes(e))}),{cancel:function(){return o?o.cancel():(e.aborted=!0,void 0)}}}var a={},d="undefined"!=typeof e.limit?e.limit:!1;0===d&&(d=1);var f=d;if(e.style&&(a.style=e.style),(e.include_docs||e.filter&&"function"==typeof e.filter)&&(a.include_docs=!0),e.continuous&&(a.feed="longpoll"),e.conflicts&&(a.conflicts=!0),e.descending&&(a.descending=!0),e.filter&&"string"==typeof e.filter&&(a.filter=e.filter,"_view"===e.filter&&e.view&&"string"==typeof e.view&&(a.view=e.view)),e.query_params&&"object"==typeof e.query_params)for(var p in e.query_params)e.query_params.hasOwnProperty(p)&&(a[p]=e.query_params[p]);var v,h,m,_,g=function(r,o){a.since=r,e.continuous||_||(_=m),a.limit=!d||f>t?t:f;var u="?"+Object.keys(a).map(function(e){return e+"="+a[e]}).join("&"),c={headers:s.headers,method:"GET",url:i(s,"_changes"+u),timeout:null};h=r,e.aborted||(v=n(c,o))},y=10,b=0,k={results:[]},w=function(n,r){if(r&&r.results){k.last_seq=r.last_seq;var o={};o.query=e.query_params,r.results=r.results.filter(function(t){f--;var n=u.filterChange(e)(t);return n&&(k.results.push(t),u.call(e.onChange,t)),n})}else n&&(e.aborted=!0,u.call(e.complete,n,null));r&&r.last_seq&&(h=r.last_seq);var i=r&&r.results.length||0;_-=t;var a=d&&0>=f||r&&!i&&0>=_||i&&r.last_seq===m||e.descending&&0!==h;if(e.continuous||!a){n?b+=1:b=0;var s=1<p&&u.call(e.complete,n||c.UNKNOWN_ERROR,null),setTimeout(function(){g(h,w)},l)}else u.call(e.complete,null,k)};return e.continuous?g(e.since||0,w):l.info(function(t,n){return t?u.call(e.complete,t):(m=n.update_seq,g(e.since||0,w),void 0)}),{cancel:function(){e.aborted=!0,v.abort()}}},l.revsDiff=function(e,t,r){return l.taskqueue.ready()?("function"==typeof t&&(r=t,t={}),n({headers:s.headers,method:"POST",url:i(s,"_revs_diff"),body:e},function(e,t){u.call(r,e,t)}),void 0):(l.taskqueue.addTask("revsDiff",arguments),void 0)},l.close=function(e){return l.taskqueue.ready()?(u.call(e,null),void 0):(l.taskqueue.addTask("close",arguments),void 0)},l.replicateOnServer=function(e,r,i){if(!l.taskqueue.ready())return l.taskqueue.addTask("replicateOnServer",arguments),i;var a=o(e.id()),c={source:s.db,target:a.protocol===s.protocol&&a.authority===s.authority?a.db:a.source};r.continuous&&(c.continuous=!0),r.create_target&&(c.create_target=!0),r.doc_ids&&(c.doc_ids=r.doc_ids),r.filter&&"string"==typeof r.filter&&(c.filter=r.filter),r.query_params&&(c.query_params=r.query_params);var d,f={},p={headers:s.headers,method:"POST",url:s.protocol+"://"+s.host+(80===s.port?"":":"+s.port)+"/_replicate",body:c};i.cancel=function(){this.cancelled=!0,d&&!f.ok&&d.abort(),f._local_id&&(p.body={replication_id:f._local_id}),p.body.cancel=!0,n(p,function(e,n,o){return e?u.call(t,e):(u.call(r.complete,null,f,o),void 0)})},i.cancelled||(d=n(p,function(e,n,o){return e?u.call(t,e):(f.ok=!0,n._local_id&&(f._local_id=n._local_id),u.call(r.complete,null,n,o),void 0)}))},l}var u=e("../utils"),c=e("../deps/errors");n.options={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},s.destroy=function(e,t,n){var r=o(e,t);t=t||{},"function"==typeof t&&(n=t,t={}),t.headers=r.headers,t.method="DELETE",t.url=i(r,""),u.ajax(t,n)},s.valid=function(){return!0},t.exports=s},{"../deps/errors":7,"../utils":14}],3:[function(e,t){"use strict";function n(e){return function(t){o.call(e,{status:500,error:t.type,reason:t.target})}}function r(e,t){function s(e){e.createObjectStore(l,{keyPath:"id"}).createIndex("seq","seq",{unique:!0}),e.createObjectStore(f,{autoIncrement:!0}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0}),e.createObjectStore(p,{keyPath:"digest"}),e.createObjectStore(v,{keyPath:"id",autoIncrement:!1}),e.createObjectStore(h)}function u(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),o=0;t>o;o++)r[o]=e.charCodeAt(o);return n}function c(e,t){return e._bulk_seq-t._bulk_seq}var d=1,l="document-store",f="by-sequence",p="attach-store",v="meta-store",h="detect-blob-support",m=e.name,_=window.indexedDB.open(m,d);"openReqList"in r||(r.openReqList={}),r.openReqList[m]=_;var g=null,y=null,b={},k=null;return _.onupgradeneeded=function(e){for(var t=e.target.result,n=e.oldVersion;n!==e.newVersion;)0===n&&s(t),n++},_.onsuccess=function(e){k=e.target.result,k.onversionchange=function(){k.close()};var n=k.transaction([v,h],"readwrite"),r=n.objectStore(v).get(v);r.onsuccess=function(e){var r=e.target.result||{id:v};m+"_id"in r?y=r[m+"_id"]:(y=o.uuid(),r[m+"_id"]=y,n.objectStore(v).put(r));try{n.objectStore(h).put(o.createBlob(),"key"),g=!0}catch(i){g=!1}finally{o.call(t,null,b)}}},_.onerror=n(t),b.type=function(){return"idb"},b.id=function(){return y},b._bulkDocs=function(e,t,s){function d(e){var t=e.target.result;t.updateSeq=(t.updateSeq||0)+x,N.objectStore(v).put(t)}function h(){if(!C.length)return N.objectStore(v).get(v).onsuccess=d,void 0;var e=C.shift(),t=N.objectStore(l).get(e.metadata.id);t.onsuccess=function(t){var n=t.target.result;n?q(n,e):S(e)}}function _(){var e=[];A.sort(c),A.forEach(function(t){if(delete t._bulk_seq,t.error)return e.push(t),void 0;var n=t.metadata,a=i.winningRev(n);e.push({ok:!0,id:n.id,rev:a}),o.isLocalId(n.id)||(r.Changes.notify(m),r.Changes.notifyLocalWindows(m))}),o.call(s,null,e)}function y(e,t){if(e.stub)return t();if("string"==typeof e.data){var n;try{n=atob(e.data)}catch(r){var i=o.error(a.BAD_ARG,"Attachments need to be base64 encoded");return o.call(s,i)}if(e.digest="md5-"+o.Crypto.MD5(n),g){var c=e.content_type;n=u(n),e.data=o.createBlob([n],{type:c})}return t()}var d=new FileReader;d.onloadend=function(){e.digest="md5-"+o.Crypto.MD5(this.result),g||(e.data=btoa(this.result)),t()},d.readAsBinaryString(e.data)}function b(e){function t(){n++,C.length===n&&e()}if(!C.length)return e();var n=0;C.forEach(function(e){function n(){o++,o===r.length&&t()}var r=e.data&&e.data._attachments?Object.keys(e.data._attachments):[];if(!r.length)return t();var o=0;for(var i in e.data._attachments)y(e.data._attachments[i],n)})}function w(e,t){function n(e){a||(e?(a=e,o.call(t,a)):s===u.length&&i())}function r(e){s++,n(e)}function i(){e.data._doc_id_rev=e.data._id+"::"+e.data._rev;var n=N.objectStore(f).put(e.data);n.onsuccess=function(n){e.metadata.seq=n.target.result,delete e.metadata.rev;var r=N.objectStore(l).put(e.metadata);r.onsuccess=function(){A.push(e),o.call(t)}}}var a=null,s=0;e.data._id=e.metadata.id,e.data._rev=e.metadata.rev,x++,o.isDeleted(e.metadata,e.metadata.rev)&&(e.data._deleted=!0);var u=e.data._attachments?Object.keys(e.data._attachments):[];for(var c in e.data._attachments)if(e.data._attachments[c].stub)s++,n();else{var d=e.data._attachments[c].data;delete e.data._attachments[c].data;var p=e.data._attachments[c].digest;O(e,p,d,r)}u.length||i()}function q(e,t){var n=i.merge(e.rev_tree,t.metadata.rev_tree[0],1e3),r=o.isDeleted(e),s=r&&o.isDeleted(t.metadata)||!r&&R&&"new_leaf"!==n.conflicts;return s?(A.push(E(a.REV_CONFLICT,t._bulk_seq)),h()):(t.metadata.rev_tree=n.tree,w(t,h),void 0)}function S(e){return"was_delete"in t&&o.isDeleted(e.metadata)?(A.push(a.MISSING_DOC),h()):(w(e,h),void 0)}function E(e,t){return e._bulk_seq=t,e}function O(e,t,n,r){{var i=N.objectStore(p);i.get(t).onsuccess=function(a){var s=a.target.result&&a.target.result.refs||{},u=[e.metadata.id,e.metadata.rev].join("@"),c={digest:t,body:n,refs:s};c.refs[u]=!0;i.put(c).onsuccess=function(){o.call(r)}}}}var R=t.new_edits,T=e.docs,C=T.map(function(e,t){var n=o.parseDoc(e,R);return n._bulk_seq=t,n}),D=C.filter(function(e){return e.error});if(D.length)return o.call(s,D[0]);var N,A=[],x=0;b(function(){N=k.transaction([l,f,p,v],"readwrite"),N.onerror=n(s),N.ontimeout=n(s),N.oncomplete=_,h()})},b._get=function(e,t,n){function r(){o.call(n,c,{doc:s,metadata:u,ctx:d})}var s,u,c,d;d=t.ctx?t.ctx:k.transaction([l,f,p],"readonly"),d.objectStore(l).get(e).onsuccess=function(e){if(u=e.target.result,!u)return c=a.MISSING_DOC,r();if(o.isDeleted(u)&&!t.rev)return c=o.error(a.MISSING_DOC,"deleted"),r();var n=i.winningRev(u),l=u.id+"::"+(t.rev?t.rev:n),p=d.objectStore(f).index("_doc_id_rev");p.get(l).onsuccess=function(e){return s=e.target.result,s&&s._doc_id_rev&&delete s._doc_id_rev,s?(r(),void 0):(c=a.MISSING_DOC,r())}}},b._getAttachment=function(e,t,n){var r,i;i=t.ctx?t.ctx:k.transaction([l,f,p],"readonly");var a=e.digest,s=e.content_type;i.objectStore(p).get(a).onsuccess=function(e){var i=e.target.result.body;if(t.encode)if(g){var a=new FileReader;a.onloadend=function(){r=btoa(this.result),o.call(n,null,r)},a.readAsBinaryString(i)}else r=i,o.call(n,null,r);else g?r=i:(i=u(atob(i)),r=o.createBlob([i],{type:s})),o.call(n,null,r)}},b._allDocs=function(e,t){var n="startkey"in e?e.startkey:!1,r="endkey"in e?e.endkey:!1,a="descending"in e?e.descending:!1;a=a?"prev":null;var s=n&&r?window.IDBKeyRange.bound(n,r):n?window.IDBKeyRange.lowerBound(n):r?window.IDBKeyRange.upperBound(r):null,u=k.transaction([l,f],"readonly");u.oncomplete=function(){"keys"in e&&(e.keys.forEach(function(e){e in v?p.push(v[e]):p.push({key:e,error:"not_found"})}),e.descending&&p.reverse()),o.call(t,null,{total_rows:p.length,offset:e.skip,rows:"limit"in e?p.slice(e.skip,e.limit+e.skip):e.skip>0?p.slice(e.skip):p})};var c=u.objectStore(l),d=a?c.openCursor(s,a):c.openCursor(s),p=[],v={};d.onsuccess=function(t){function n(t,n){if(o.isLocalId(t.id))return r["continue"]();var a={id:t.id,key:t.id,value:{rev:i.winningRev(t)}};if(e.include_docs){a.doc=n,a.doc._rev=i.winningRev(t),a.doc._doc_id_rev&&delete a.doc._doc_id_rev,e.conflicts&&(a.doc._conflicts=i.collectConflicts(t));for(var s in a.doc._attachments)a.doc._attachments[s].stub=!0}"keys"in e?e.keys.indexOf(t.id)>-1&&(o.isDeleted(t)&&(a.value.deleted=!0,a.doc=null),v[a.id]=a):o.isDeleted(t)||p.push(a),r["continue"]()}if(t.target.result){var r=t.target.result,a=r.value;if(e.include_docs){var s=u.objectStore(f).index("_doc_id_rev"),c=i.winningRev(a),d=a.id+"::"+c;s.get(d).onsuccess=function(e){n(r.value,e.target.result)}}else n(a)}}},b._info=function(e){function t(e){o=e.target.result&&e.target.result.updateSeq||0}function n(e){var n=e.target.result;return n?(n.value.deleted!==!0&&r++,n["continue"](),void 0):(i.objectStore(v).get(v).onsuccess=t,void 0)}var r=0,o=0,i=k.transaction([l,v],"readonly");i.oncomplete=function(){e(null,{db_name:m,doc_count:r,update_seq:o})},i.objectStore(l).openCursor().onsuccess=n},b._changes=function(e){function t(){p=k.transaction([l,f]),p.oncomplete=a;var t;t=c?p.objectStore(f).openCursor(window.IDBKeyRange.lowerBound(e.since,!0),c):p.objectStore(f).openCursor(window.IDBKeyRange.lowerBound(e.since,!0)),t.onsuccess=n,t.onerror=s}function n(t){if(!t.target.result){for(var n=0,r=v.length;r>n;n++){var a=v[n];a&&_.push(a)}return!1}var s=t.target.result,u=s.value._id,c=h[u];if(void 0!==c)return v[c].seq=s.key,v.push(v[c]),v[c]=null,h[u]=v.length-1,s["continue"]();var m=p.objectStore(l);m.get(s.value._id).onsuccess=function(t){var n=t.target.result;if(o.isLocalId(n.id))return s["continue"]();d= "'+u+'"'),c&&(p+=(u?" AND ":" WHERE ")+d+'.id <= "'+c+'"'),p+=" ORDER BY "+d+".id "+(f?"DESC":"ASC")),b.transaction(function(t){t.executeSql(p,[],function(t,n){for(var r=0,u=n.rows.length;u>r;r++){var c=n.rows.item(r),d=JSON.parse(c.metadata),l=JSON.parse(c.data);if(!i.isLocalId(d.id)){if(c={id:d.id,key:d.id,value:{rev:a.winningRev(d)}},e.include_docs){c.doc=l,c.doc._rev=a.winningRev(d),e.conflicts&&(c.doc._conflicts=a.collectConflicts(d));for(var f in c.doc._attachments)c.doc._attachments[f].stub=!0}"keys"in e?e.keys.indexOf(d.id)>-1&&(i.isDeleted(d)&&(c.value.deleted=!0,c.doc=null),s[c.id]=c):i.isDeleted(d)||o.push(c)}}})},r(t),function(){"keys"in e&&(e.keys.forEach(function(e){e in s?o.push(s[e]):o.push({key:e,error:"not_found"})}),e.descending&&o.reverse()),i.call(t,null,{total_rows:o.length,offset:e.skip,rows:"limit"in e?o.slice(e.skip,e.limit+e.skip):e.skip>0?o.slice(e.skip):o})})},_._changes=function(e){function t(){var t="SELECT "+d+".id, "+l+".seq, "+l+".json AS data, "+d+".json AS metadata FROM "+l+" JOIN "+d+" ON "+l+".seq = "+d+".winningseq WHERE "+d+".seq > "+e.since+" ORDER BY "+d+".seq "+(r?"DESC":"ASC");b.transaction(function(n){n.executeSql(t,[],function(t,n){for(var r=0,o=0,u=n.rows.length;u>o;o++){var c=n.rows.item(o),d=JSON.parse(c.metadata);if(!i.isLocalId(d.id)){r=200&&p.status<300){var r;r=e.binary?i([p.response||""],{type:p.getResponseHeader("Content-Type")}):p.responseText,n(a,r,p,t)}else n(s,p,t)},e.timeout>0&&(l=setTimeout(c,e.timeout)),p.send(e.body),{abort:c}}return e.json&&(e.binary||(e.headers.Accept="application/json"),e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json"),e.binary&&(e.encoding=null,e.json=!1),e.processData||(e.json=!1),r(e,function(r,o,i){if(r)return r.status=o?o.statusCode:400,n(s,r,t);var u=o.headers["content-type"],c=i||"";e.binary||!e.json&&e.processData||"object"==typeof c||!(/json/.test(u)||/^[\s]*\{/.test(c)&&/\}[\s]*$/.test(c))||(c=JSON.parse(c)),o.statusCode>=200&&o.statusCode<300?n(a,c,o,t):(e.binary&&(c=JSON.parse(c.toString())),c.status=o.statusCode,n(t,c))})}var r=e("request"),o=e("./extend.js"),i=e("./blob.js");t.exports=n},{"./blob.js":6,"./extend.js":8,request:16}],6:[function(e,t){function n(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(n){if("TypeError"!==n.name)throw n;for(var r=window.BlobBuilder||window.MSBlobBuilder||window.MozBlobBuilder||window.WebKitBlobBuilder,o=new r,i=0;id;d++)if(null!=(e=arguments[d]))for(t in e)n=c[t],r=e[t],c!==r&&(f&&r&&(o(r)||(s=p(r)))?(s?(s=!1,u=n&&p(n)?n:[]):u=n&&o(n)?n:{},c[t]=a(f,u,r)):void 0!==r&&(p(e)&&i(r)||(c[t]=r)));return c}for(var s={},u=["Boolean","Number","String","Function","Array","Date","RegExp","Object","Error"],c=0;c>>32-t}function n(e,t){var n,r,o,i,a;return o=2147483648&e,i=2147483648&t,n=1073741824&e,r=1073741824&t,a=(1073741823&e)+(1073741823&t),n&r?2147483648^a^o^i:n|r?1073741824&a?3221225472^a^o^i:1073741824^a^o^i:a^o^i}function i(e,t,n){return e&t|~e&n}function a(e,t,n){return e&n|t&~n}function s(e,t,n){return e^t^n}function u(e,t,n){return t^(e|~n)}function c(e,r,o,a,s,u,c){return e=n(e,n(n(i(r,o,a),s),c)),n(t(e,u),r)}function d(e,r,o,i,s,u,c){return e=n(e,n(n(a(r,o,i),s),c)),n(t(e,u),r)}function l(e,r,o,i,a,u,c){return e=n(e,n(n(s(r,o,i),a),c)),n(t(e,u),r)}function f(e,r,o,i,a,s,c){return e=n(e,n(n(u(r,o,i),a),c)),n(t(e,s),r)}function p(e){for(var t,n=e.length,r=n+8,o=(r-r%64)/64,i=16*(o+1),a=Array(i-1),s=0,u=0;n>u;)t=(u-u%4)/4,s=u%4*8,a[t]=a[t]|e.charCodeAt(u)<>>29,a}function v(e){var t,n,r="",o="";for(n=0;3>=n;n++)t=e>>>8*n&255,o="0"+t.toString(16),r+=o.substr(o.length-2,2);return r}if(!r.browser)return o.createHash("md5").update(e).digest("hex");var h,m,_,g,y,b,k,w,q,S=Array(),E=7,O=12,R=17,T=22,C=5,D=9,N=14,A=20,x=4,j=11,I=16,L=23,B=6,M=10,P=15,U=21;for(S=p(e),b=1732584193,k=4023233417,w=2562383102,q=271733878,h=0;hr;r++)i[r]=o[0|Math.random()*t];else{var a;for(i[8]=i[13]=i[18]=i[23]="-",i[14]="4",r=0;36>r;r++)i[r]||(a=0|16*Math.random(),i[r]=o[19==r?3&a|8:a])}return i.join("")}n.CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),t.exports=n},{}],11:[function(e,t){function n(e,t,r){if(!(this instanceof n))return new n(e,t,r);("function"==typeof t||"undefined"==typeof t)&&(r=t,t={}),"object"==typeof e&&(t=e,e=void 0),"undefined"==typeof r&&(r=function(){});var o=n.parseAdapter(t.name||e);if(t.originalName=e,t.name=t.name||o.name,t.adapter=t.adapter||o.adapter,!n.adapters[t.adapter])throw"Adapter is missing";if(!n.adapters[t.adapter].valid())throw"Invalid Adapter";var a=new i(t,function(e,t){if(e)return r&&r(e),void 0;for(var o in n.plugins){var i=n.plugins[o](t);for(var a in i)a in t||(t[a]=i[a])}t.taskqueue.ready(!0),t.taskqueue.execute(t),r(null,t)});for(var s in a)this[s]=a[s];for(var u in n.plugins){var c=n.plugins[u](this);for(var d in c)d in this||(this[d]=c[d])}}var r=e("__browserify_process"),o=e("./utils"),i=e("./adapter")(n);n.adapters={},n.plugins={},n.prefix="_pouch_",n.parseAdapter=function(e){var t,r=e.match(/([a-z\-]*):\/\/(.*)/);if(r){if(e=/http(s?)/.test(r[1])?r[1]+"://"+r[2]:r[2],t=r[1],!n.adapters[t].valid())throw"Invalid adapter";return{name:e,adapter:r[1]}}for(var o=["idb","leveldb","websql"],i=0;i0;){var o=n.pop(),i=o.tree1,a=o.tree2;(i[1].status||a[1].status)&&(i[1].status="available"===i[1].status||"available"===a[1].status?"available":"missing");for(var s=0;s0;){var p=f.pop();0!==p.diff?p.ids&&p.ids[2].forEach(function(e,t){f.push({ids:e,diff:p.diff-1,parent:p.ids,parentIdx:t})}):p.ids[0]===c.ids[0]&&l.push(p)}var v=l[0];v?(o=r(v.ids,c.ids),v.parent[2][v.parentIdx]=o.tree,i.push({pos:u.pos,ids:u.ids}),a=a||o.conflicts,s=!0):i.push(e)}else i.push(e)}),s||i.push(t),i.sort(function(e,t){return e.pos-t.pos}),{tree:i,conflicts:a||"internal_node"}):{tree:[t],conflicts:"new_leaf"}}function i(e,t){var r=s.rootToLeaf(e).map(function(e){var r=e.ids.slice(-t);return{pos:e.pos+(e.ids.length-r.length),ids:n(r)}});return r.reduce(function(e,t){return o(e,t,!0).tree},[r.shift()])}var a=e("./deps/extend"),s={};s.merge=function(e,t,n){e=a(!0,[],e),t=a(!0,{},t);var r=o(e,t);return{tree:i(r.tree,n),conflicts:r.conflicts}},s.winningRev=function(e){var t=[];return s.traverseRevTree(e.rev_tree,function(e,n,r,o,i){e&&t.push({pos:n,id:r,deleted:!!i.deleted})}),t.sort(function(e,t){return e.deleted!==t.deleted?e.deleted>t.deleted?1:-1:e.pos!==t.pos?t.pos-e.pos:e.id0;){var r=n.pop(),o=r.pos,i=r.ids,a=t(0===i[2].length,o,i[0],r.ctx,i[1]);i[2].forEach(function(e){n.push({pos:o+1,ids:e,ctx:a})})}},s.collectLeaves=function(e){var t=[];return s.traverseRevTree(e,function(e,n,r,o,i){e&&t.unshift({rev:n+"-"+r,pos:n,opts:i})}),t.sort(function(e,t){return t.pos-e.pos}),t.map(function(e){delete e.pos}),t},s.collectConflicts=function(e){var t=s.winningRev(e),n=s.collectLeaves(e.rev_tree),r=[];return n.forEach(function(e){e.rev===t||e.opts.deleted||r.push(e.rev)}),r},s.rootToLeaf=function(e){var t=[];return s.traverseRevTree(e,function(e,n,r,o,i){if(o=o?o.slice(0):[],o.push({id:r,opts:i}),e){var a=n+1-o.length;t.unshift({pos:a,ids:o})}return o}),t},t.exports=s},{"./deps/extend":8}],13:[function(e,t,n){"use strict";function r(){var e=this;this.cancelled=!1,this.cancel=function(){e.cancelled=!0}}function o(e){var t=[],n={},r=!1;return n.enqueue=function(e,o){t.push({fun:e,args:o}),r||n.process()},n.process=function(){if(!r&&t.length&&!e.cancelled){r=!0;var n=t.shift();n.fun.apply(null,n.args)}},n.notifyRequestComplete=function(){r=!1,n.process()},n}function i(e,t,n){var r=n.filter?n.filter.toString():"";return"_local/"+d.Crypto.MD5(e.id()+t.id()+r)}function a(e,t,n,r){t.get(n,function(t,o){t&&404===t.status?r(null,0):e.get(n,function(e,t){e&&404===e.status||o.last_seq!==t.last_seq?r(null,0):r(null,t.last_seq)})})}function s(e,t,n,r,o){function i(e,t){e.get(n,function(o,i){o&&404===o.status&&(i={_id:n}),i.last_seq=r,e.put(i,t)})}i(t,function(){i(e,function(){o()})})}function u(e,t,n,r){function u(r,o,i){if(n.onChange)for(var a=0;i>a;a++)n.onChange.apply(this,[O]);w-=i,O.docs_written+=i,s(e,t,y,q,function(){_.notifyRequestComplete(),m()})}function c(){if(!g.length)return _.notifyRequestComplete();var e=g.length;t.bulkDocs({docs:g},{new_edits:!1},function(t,n){u(t,n,e)}),g=[]}function l(t,n){e.get(t,{revs:!0,rev:n,attachments:!0},function(e,t){O.docs_read++,_.notifyRequestComplete(),g.push(t),_.enqueue(c)})}function f(e){return function(t,o){if(_.notifyRequestComplete(),t)return S&&r.cancel(),d.call(n.complete,t,null),void 0;if(0===Object.keys(o).length){for(var i in e)w-=e[i];return m(),void 0}var a=function(e){_.enqueue(l,[s,e])};for(var s in o){var u=e[s]-o[s].missing.length;w-=u,o[s].missing.forEach(a)}}}function p(e,n){t.revsDiff(e,f(n))}function v(e){q=e.seq,b.push(e);var t={};t[e.id]=e.changes.map(function(e){return e.rev});var n={};n[e.id]=e.changes.length,w+=e.changes.length,_.enqueue(p,[t,n])}function h(){k=!0,m()}function m(){k&&0===w&&(O.end_time=new Date,d.call(n.complete,null,O))}var _=new o(r),g=[],y=i(e,t,n),b=[],k=!1,w=0,q=0,S=n.continuous||!1,E=n.doc_ids,O={ok:!0,start_time:new Date,docs_read:0,docs_written:0};a(e,t,y,function(t,o){if(t)return d.call(n.complete,t);if(q=o,!r.cancelled){var i={continuous:S,since:q,style:"all_docs",onChange:v,complete:h,doc_ids:E};n.filter&&(i.filter=n.filter),n.query_params&&(i.query_params=n.query_params);var a=e.changes(i);if(n.continuous){var s=r.cancel;r.cancel=function(){s(),a.cancel()}}}})}function c(e,t){return"string"==typeof e?new l(e,t):(t(null,e),void 0)}var d=e("./utils"),l=e("./index");n.replicate=function(e,t,n,o){n instanceof Function&&(o=n,n={}),void 0===n&&(n={}),n.complete||(n.complete=o);var i=new r;return c(e,function(e,r){return e?d.call(o,e):(c(t,function(e,t){if(e)return d.call(o,e);if(n.server){if("function"!=typeof r.replicateOnServer)return d.call(o,{error:"Server replication not supported for "+r.type()+" adapter"});if(r.type()!==t.type())return d.call(o,{error:"Server replication for different adapter types ("+r.type()+" and "+t.type()+") is not supported"});r.replicateOnServer(t,n,i)}else u(r,t,n,i)}),void 0)}),i}},{"./index":11,"./utils":14}],14:[function(e,t,n){function r(e){return/^_/.test(e)?/^_(design|local)/.test(e):!0}function o(){return"undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage&&"undefined"!=typeof chrome.storage.local}var i=e("./merge");n.extend=e("./deps/extend"),n.ajax=e("./deps/ajax"),n.createBlob=e("./deps/blob");var a=e("./deps/uuid");n.Crypto=e("./deps/md5.js");var s=e("./deps/buffer"),u=e("./deps/errors");n.error=function(e,t){return n.extend({},e,{reason:t})};var c=["_id","_rev","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree"];n.uuids=function(e,t){"object"!=typeof t&&(t={});for(var n=t.length,r=t.radix,o=[];o.push(a(n,r))=0&&(t=t.split("-")[1]);var n=!1;return i.traverseRevTree(e.rev_tree,function(e,r,o,i,a){o===t&&(n=!!a.deleted)}),n},n.filterChange=function(e){return function(t){var n={},r=e.filter&&"function"==typeof e.filter;if(n.query=e.query_params,e.filter&&r&&!e.filter.call(this,t.doc,n))return!1;if(e.doc_ids&&-1===e.doc_ids.indexOf(t.id))return!1;if(e.include_docs)for(var o in t.doc._attachments)t.doc._attachments[o].stub=!0;else delete t.doc;return!0}},n.processChanges=function(e,t,r){t=t.filter(n.filterChange(e)),e.limit&&e.limito.since&&!o.cancelled&&(o.since=e.seq,n.call(o.onChange,e))}})})},e},n.atob="undefined"!=typeof window&&"atob"in window?function(e){return atob(e)}:function(e){var t=new s(e,"base64");if(t.toString("base64")!==e)throw"Cannot base64 encode full string";return t.toString("binary")},n.btoa="undefined"!=typeof window&&"btoa"in window?function(e){return btoa(e)}:function(e){return new s(e,"binary").toString("base64")},t.exports=n},{"./deps/ajax":5,"./deps/blob":6,"./deps/buffer":16,"./deps/errors":7,"./deps/extend":8,"./deps/md5.js":9,"./deps/uuid":10,"./merge":12}],15:[function(e,t){t.exports="1.0.0"},{}],16:[function(){},{}],17:[function(e,t){var n=t.exports={};n.nextTick=function(){var e="undefined"!=typeof window&&window.setImmediate,t="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&"process-tick"===e.data&&(e.stopPropagation(),n.length>0)){var t=n.shift();t()}},!0),function(e){n.push(e),window.postMessage("process-tick","*")}}return function(e){setTimeout(e,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(){throw new Error("process.chdir is not supported")}},{}],18:[function(require,module,exports){"use strict";function MapReduce(db){function viewQuery(fun,options){function sum(e){return e.reduce(function(e,t){return e+t +},0)}function emit(e,t){var n={id:current.doc._id,key:e,value:t};if(!(options.startkey&&pouchCollate(e,options.startkey)<0||options.endkey&&pouchCollate(e,options.endkey)>0||options.key&&0!==pouchCollate(e,options.key))){if(num_started++,options.include_docs){if(t&&"object"==typeof t&&t._id)return db.get(t._id,function(e,t){t&&(n.doc=t),results.push(n),checkComplete()}),void 0;n.doc=current.doc}results.push(n)}}function checkComplete(){if(completed&&results.length==num_started){if(results.sort(function(e,t){return pouchCollate(e.key,t.key)}),options.descending&&results.reverse(),options.reduce===!1)return options.complete(null,{total_rows:results.length,offset:options.skip,rows:"limit"in options?results.slice(options.skip,options.limit+options.skip):options.skip>0?results.slice(options.skip):results});var e=[];results.forEach(function(t){var n=e[e.length-1]||null;return n&&0===pouchCollate(n.key[0][0],t.key)?(n.key.push([t.key,t.id]),n.value.push(t.value),void 0):(e.push({key:[[t.key,t.id]],value:[t.value]}),void 0)}),e.forEach(function(e){e.value=fun.reduce(e.key,e.value),e.value="undefined"==typeof e.value?null:e.value,e.key=e.key[0][0]}),options.complete(null,{total_rows:e.length,offset:options.skip,rows:"limit"in options?e.slice(options.skip,options.limit+options.skip):options.skip>0?e.slice(options.skip):e})}}if(options.complete){options.skip||(options.skip=0),fun.reduce||(options.reduce=!1);var builtInReduce={_sum:function(e,t){return sum(t)},_count:function(e,t,n){return n?sum(t):t.length},_stats:function(e,t){return{sum:sum(t),min:Math.min.apply(null,t),max:Math.max.apply(null,t),count:t.length,sumsqr:function(){var e=0;for(var n in t)"number"==typeof t[n]&&(e+=t[n]*t[n]);return e}()}}},results=[],current=null,num_started=0,completed=!1;eval("fun.map = "+fun.map.toString()+";"),fun.reduce&&(builtInReduce[fun.reduce]&&(fun.reduce=builtInReduce[fun.reduce]),eval("fun.reduce = "+fun.reduce.toString()+";")),db.changes({conflicts:!0,include_docs:!0,onChange:function(e){"deleted"in e||(current={doc:e.doc},fun.map.call(this,e.doc))},complete:function(){completed=!0,checkComplete()}})}}function httpQuery(e,t,n){var r=[],o=void 0,i="GET";if("undefined"!=typeof t.reduce&&r.push("reduce="+t.reduce),"undefined"!=typeof t.include_docs&&r.push("include_docs="+t.include_docs),"undefined"!=typeof t.limit&&r.push("limit="+t.limit),"undefined"!=typeof t.descending&&r.push("descending="+t.descending),"undefined"!=typeof t.startkey&&r.push("startkey="+encodeURIComponent(JSON.stringify(t.startkey))),"undefined"!=typeof t.endkey&&r.push("endkey="+encodeURIComponent(JSON.stringify(t.endkey))),"undefined"!=typeof t.key&&r.push("key="+encodeURIComponent(JSON.stringify(t.key))),"undefined"!=typeof t.group&&r.push("group="+t.group),"undefined"!=typeof t.group_level&&r.push("group_level="+t.group_level),"undefined"!=typeof t.skip&&r.push("skip="+t.skip),"undefined"!=typeof t.keys&&(i="POST",o=JSON.stringify({keys:t.keys})),r=r.join("&"),r=""===r?"":"?"+r,"string"==typeof e){var a=e.split("/");return db.request({method:i,url:"_design/"+a[0]+"/_view/"+a[1]+r,body:o},n),void 0}var s=JSON.parse(JSON.stringify(e,function(e,t){return"function"==typeof t?t+"":t}));db.request({method:"POST",url:"_temp_view"+r,body:s},n)}return this instanceof MapReduce?(this.query=function(e,t,n){if("function"==typeof t&&(n=t,t={}),n&&(t.complete=n),"http"===db.type())return"function"==typeof e?httpQuery({map:e},t,n):httpQuery(e,t,n);if("object"==typeof e)return viewQuery(e,t);if("function"==typeof e)return viewQuery({map:e},t);var r=e.split("/");db.get("_design/"+r[0],function(e,o){return e?(n&&n(e),void 0):o.views[r[1]]?(viewQuery({map:o.views[r[1]].map,reduce:o.views[r[1]].reduce},t),void 0):(n&&n({error:"not_found",reason:"missing_named_view"}),void 0)})},void 0):new MapReduce(db)}var pouchCollate=require("pouchdb-collate");MapReduce._delete=function(){},module.exports=MapReduce},{"pouchdb-collate":19}],19:[function(e,t){"use strict";function n(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++){var o=a(e[r],t[r]);if(0!==o)return o}return e.length===t.length?0:e.length>t.length?1:-1}function r(e,t){return e===t?0:e>t?1:-1}function o(e,t){for(var n=Object.keys(e),r=Object.keys(t),o=Math.min(n.length,r.length),i=0;o>i;i++){var s=a(n[i],r[i]);if(0!==s)return s;if(s=a(e[n[i]],t[r[i]]),0!==s)return s}return n.length===r.length?0:n.length>r.length?1:-1}function i(e){var t=["boolean","number","string","object"];return-1!==t.indexOf(typeof e)?null===e?1:t.indexOf(typeof e)+2:Array.isArray(e)?4.5:void 0}function a(e,t){var a=i(e),s=i(t);return a-s!==0?a-s:null===e?0:"number"==typeof e?e-t:"boolean"==typeof e?t>e?-1:1:"string"==typeof e?r(e,t):Array.isArray(e)?n(e,t):"object"==typeof e?o(e,t):void 0}t.exports=a},{}]},{},[11])(11)}); \ No newline at end of file diff --git a/examples/application-server-boilerplate/public/styles/base.css b/examples/application-server-boilerplate/public/styles/base.css new file mode 100644 index 00000000..4a05fc23 --- /dev/null +++ b/examples/application-server-boilerplate/public/styles/base.css @@ -0,0 +1,424 @@ +html, +body { + margin: 0; + padding: 0; +} + +button { + margin: 0; + padding: 0; + border: 0; + background: none; + font-size: 100%; + vertical-align: baseline; + font-family: inherit; + color: inherit; + -webkit-appearance: none; + /*-moz-appearance: none;*/ + -ms-appearance: none; + -o-appearance: none; + appearance: none; +} + +body { + font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif; + line-height: 1.4em; + background: #eaeaea url('../images/bg.png'); + color: #4d4d4d; + width: 550px; + margin: 0 auto; + -webkit-font-smoothing: antialiased; + -moz-font-smoothing: antialiased; + -ms-font-smoothing: antialiased; + -o-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +#todoapp { + background: #fff; + background: rgba(255, 255, 255, 0.9); + margin: 130px 0 40px 0; + border: 1px solid #ccc; + position: relative; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2), + 0 25px 50px 0 rgba(0, 0, 0, 0.15); +} + +#todoapp:before { + content: ''; + border-left: 1px solid #f5d6d6; + border-right: 1px solid #f5d6d6; + width: 2px; + position: absolute; + top: 0; + left: 40px; + height: 100%; +} + +#todoapp input::-webkit-input-placeholder { + font-style: italic; +} + +#todoapp input:-moz-placeholder { + font-style: italic; + color: #a9a9a9; +} + +#todoapp h1 { + position: absolute; + top: -120px; + width: 100%; + font-size: 70px; + font-weight: bold; + text-align: center; + color: #b3b3b3; + color: rgba(255, 255, 255, 0.3); + text-shadow: -1px -1px rgba(0, 0, 0, 0.2); + -webkit-text-rendering: optimizeLegibility; + -moz-text-rendering: optimizeLegibility; + -ms-text-rendering: optimizeLegibility; + -o-text-rendering: optimizeLegibility; + text-rendering: optimizeLegibility; +} + +#header { + padding-top: 15px; + border-radius: inherit; +} + +#header:before { + content: ''; + position: absolute; + top: 0; + right: 0; + left: 0; + height: 15px; + z-index: 2; + border-bottom: 1px solid #6c615c; + background: #8d7d77; + background: -webkit-gradient(linear, left top, left bottom, from(rgba(132, 110, 100, 0.8)),to(rgba(101, 84, 76, 0.8))); + background: -webkit-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); + background: -moz-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); + background: -o-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); + background: -ms-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); + background: linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); + border-top-left-radius: 1px; + border-top-right-radius: 1px; +} + +#new-todo, +.edit { + position: relative; + margin: 0; + width: 100%; + font-size: 24px; + font-family: inherit; + line-height: 1.4em; + border: 0; + outline: none; + color: inherit; + padding: 6px; + border: 1px solid #999; + box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-font-smoothing: antialiased; + -ms-font-smoothing: antialiased; + -o-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +#new-todo { + padding: 16px 16px 16px 60px; + border: none; + background: rgba(0, 0, 0, 0.02); + z-index: 2; + box-shadow: none; +} + +#main { + position: relative; + z-index: 2; + border-top: 1px dotted #adadad; +} + +label[for='toggle-all'] { + display: none; +} + +#toggle-all { + position: absolute; + top: -42px; + left: -4px; + width: 40px; + text-align: center; + border: none; /* Mobile Safari */ +} + +#toggle-all:before { + content: '»'; + font-size: 28px; + color: #d9d9d9; + padding: 0 25px 7px; +} + +#toggle-all:checked:before { + color: #737373; +} + +#todo-list { + margin: 0; + padding: 0; + list-style: none; +} + +#todo-list li { + position: relative; + font-size: 24px; + border-bottom: 1px dotted #ccc; +} + +#todo-list li:last-child { + border-bottom: none; +} + +#todo-list li.editing { + border-bottom: none; + padding: 0; +} + +#todo-list li.editing .edit { + display: block; + width: 506px; + padding: 13px 17px 12px 17px; + margin: 0 0 0 43px; +} + +#todo-list li.editing .view { + display: none; +} + +#todo-list li .toggle { + text-align: center; + width: 40px; + /* auto, since non-WebKit browsers doesn't support input styling */ + height: auto; + position: absolute; + top: 0; + bottom: 0; + margin: auto 0; + border: none; /* Mobile Safari */ + -webkit-appearance: none; + /*-moz-appearance: none;*/ + -ms-appearance: none; + -o-appearance: none; + appearance: none; +} + +#todo-list li .toggle:after { + content: '✔'; + line-height: 43px; /* 40 + a couple of pixels visual adjustment */ + font-size: 20px; + color: #d9d9d9; + text-shadow: 0 -1px 0 #bfbfbf; +} + +#todo-list li .toggle:checked:after { + color: #85ada7; + text-shadow: 0 1px 0 #669991; + bottom: 1px; + position: relative; +} + +#todo-list li label { + word-break: break-word; + padding: 15px; + margin-left: 45px; + display: block; + line-height: 1.2; + -webkit-transition: color 0.4s; + -moz-transition: color 0.4s; + -ms-transition: color 0.4s; + -o-transition: color 0.4s; + transition: color 0.4s; +} + +#todo-list li.completed label { + color: #a9a9a9; + text-decoration: line-through; +} + +#todo-list li .destroy { + display: none; + position: absolute; + top: 0; + right: 10px; + bottom: 0; + width: 40px; + height: 40px; + margin: auto 0; + font-size: 22px; + color: #a88a8a; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -ms-transition: all 0.2s; + -o-transition: all 0.2s; + transition: all 0.2s; +} + +#todo-list li .destroy:hover { + text-shadow: 0 0 1px #000, 0 0 10px rgba(199, 107, 107, 0.8); + -webkit-transform: scale(1.3); + -moz-transform: scale(1.3); + -ms-transform: scale(1.3); + -o-transform: scale(1.3); + transform: scale(1.3); +} + +#todo-list li .destroy:after { + content: '✖'; +} + +#todo-list li:hover .destroy { + display: block; +} + +#todo-list li .edit { + display: none; +} + +#todo-list li.editing:last-child { + margin-bottom: -1px; +} + +#footer { + color: #777; + padding: 0 15px; + position: absolute; + right: 0; + bottom: -31px; + left: 0; + height: 20px; + z-index: 1; +} + +#footer:before { + content: ''; + position: absolute; + right: 0; + bottom: 31px; + left: 0; + height: 50px; + z-index: -1; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), + 0 6px 0 -3px rgba(255, 255, 255, 0.8), + 0 7px 1px -3px rgba(0, 0, 0, 0.3), + 0 43px 0 -6px rgba(255, 255, 255, 0.8), + 0 44px 2px -6px rgba(0, 0, 0, 0.2); +} + +#todo-count { + float: left; + text-align: left; +} + +#filters { + margin: 0; + padding: 0; + list-style: none; + position: absolute; + right: 0; + left: 0; +} + +#filters li { + display: inline; +} + +#filters li a { + color: #83756f; + margin: 2px; + text-decoration: none; +} + +#filters li a.selected { + font-weight: bold; +} + +#clear-completed { + float: right; + position: relative; + line-height: 20px; + text-decoration: none; + background: rgba(0, 0, 0, 0.1); + font-size: 11px; + padding: 0 10px; + border-radius: 3px; + box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.2); +} + +#clear-completed:hover { + background: rgba(0, 0, 0, 0.15); + box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.3); +} + +#info { + margin: 65px auto 0; + color: #a6a6a6; + font-size: 12px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7); + text-align: center; +} + +#info a { + color: inherit; +} + +/* + Hack to remove background from Mobile Safari. + Can't use it globally since it destroys checkboxes in Firefox and Opera +*/ +@media screen and (-webkit-min-device-pixel-ratio:0) { + #toggle-all, + #todo-list li .toggle { + background: none; + } + + #todo-list li .toggle { + height: 40px; + } + + #toggle-all { + top: -56px; + left: -15px; + width: 65px; + height: 41px; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + -webkit-appearance: none; + appearance: none; + } +} + +.hidden{ + display:none; +} + +#sync-error, #sync-success { + display: none; +} + +[data-sync-state=syncing] #sync-success { + display: block; +} + +[data-sync-state=error] #sync-error { + display: block; +} From c2e0080d3ebf2c0eda19b732977f12b54e60ee5f Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:52:08 -0400 Subject: [PATCH 5/9] Make the app database the todos database in the example --- examples/application-server-boilerplate/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/application-server-boilerplate/index.js b/examples/application-server-boilerplate/index.js index cd67d270..a8e60a06 100644 --- a/examples/application-server-boilerplate/index.js +++ b/examples/application-server-boilerplate/index.js @@ -27,8 +27,8 @@ async function setup() { // Set up the app database. try { - await http.put(`${DB_ADMIN_URL}/app`); - console.log("App database created."); + await http.put(`${DB_ADMIN_URL}/todos`); + console.log("Todos database created."); } catch (err) { console.log("We already have an app database."); From 24756568005114b3640b0b236a1790ecd1da0dcf Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:52:29 -0400 Subject: [PATCH 6/9] Fix the remote database URL in the example app --- examples/application-server-boilerplate/public/scripts/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/application-server-boilerplate/public/scripts/app.js b/examples/application-server-boilerplate/public/scripts/app.js index ba202611..99515d6e 100644 --- a/examples/application-server-boilerplate/public/scripts/app.js +++ b/examples/application-server-boilerplate/public/scripts/app.js @@ -9,7 +9,7 @@ // EDITING STARTS HERE (you dont need to edit anything above this line) var db = new PouchDB('todos'); - var remoteCouch = window.location.href + 'db/todos'; + var remoteCouch = window.location.origin + '/db/todos'; db.info(function(err, info) { db.changes({ From 394e785b82369555cae65ecd97dbccefd6a07bb2 Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:55:42 -0400 Subject: [PATCH 7/9] Update example app README --- examples/application-server-boilerplate/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/application-server-boilerplate/README.md b/examples/application-server-boilerplate/README.md index 02786f68..c087d665 100644 --- a/examples/application-server-boilerplate/README.md +++ b/examples/application-server-boilerplate/README.md @@ -1,4 +1,8 @@ # express-pouchdb-server-boilerplate Gets you set up with an express server with pouchdb, and admin user, and an app database. -Work In Progress, see issue https://github.com/pouchdb/pouchdb-server/issues/224 +## Install +``` +npm install +node index.js +``` From 944ad976d5af6ac0c976fa4d1351d58b00b6b06f Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:59:02 -0400 Subject: [PATCH 8/9] Merge application-server-boilerplate into todos example --- .../db/README.md | 1 - .../application-server-boilerplate/index.js | 38 -- .../public/images/bg.png | Bin 2126 -> 0 bytes .../public/index.html | 35 -- .../public/scripts/app.js | 168 ------- .../public/scripts/pouchdb-nightly.min.js | 3 - .../public/styles/base.css | 424 ------------------ .../.gitignore | 0 .../README.md | 0 examples/todos/app.js | 45 +- .../config.yml | 0 .../package.json | 8 +- examples/todos/public/scripts/app.js | 2 +- 13 files changed, 35 insertions(+), 689 deletions(-) delete mode 100644 examples/application-server-boilerplate/db/README.md delete mode 100644 examples/application-server-boilerplate/index.js delete mode 100644 examples/application-server-boilerplate/public/images/bg.png delete mode 100644 examples/application-server-boilerplate/public/index.html delete mode 100644 examples/application-server-boilerplate/public/scripts/app.js delete mode 100644 examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js delete mode 100644 examples/application-server-boilerplate/public/styles/base.css rename examples/{application-server-boilerplate => todos}/.gitignore (100%) rename examples/{application-server-boilerplate => todos}/README.md (100%) rename examples/{application-server-boilerplate => todos}/config.yml (100%) rename examples/{application-server-boilerplate => todos}/package.json (60%) diff --git a/examples/application-server-boilerplate/db/README.md b/examples/application-server-boilerplate/db/README.md deleted file mode 100644 index 287cceb4..00000000 --- a/examples/application-server-boilerplate/db/README.md +++ /dev/null @@ -1 +0,0 @@ -Placeholder for databases. diff --git a/examples/application-server-boilerplate/index.js b/examples/application-server-boilerplate/index.js deleted file mode 100644 index a8e60a06..00000000 --- a/examples/application-server-boilerplate/index.js +++ /dev/null @@ -1,38 +0,0 @@ -var http = require('axios'); -var read = require('read-yaml'); -var PouchDB = require('pouchdb'); -var express = require('express'); -var path = require('path'); -var app = express(); -var config = read.sync('./config.yml'); - -const DB_URL = `${config.protocol}${config.domain}:${config.port}${config.dbServerEndpoint}` -const DB_ADMIN_URL = `${config.protocol}${config.admin.username}:${config.admin.password}@${config.domain}:${config.port}${config.dbServerEndpoint}` - -app.use(config.dbServerEndpoint, require('express-pouchdb')(PouchDB.defaults({prefix: './db/'}))); -app.listen(config.port); - -app.use(express.static(path.join(__dirname, 'public'))); - -async function setup() { - - // Set up the admin user. - try { - await http.put(`${DB_URL}/_config/admins/${config.admin.username}`, `"${config.admin.password}"`, {headers:{}}); - console.log("Admin created."); - } - catch (err) { - console.log("We already have admins."); - } - - // Set up the app database. - try { - await http.put(`${DB_ADMIN_URL}/todos`); - console.log("Todos database created."); - } - catch (err) { - console.log("We already have an app database."); - } - -} -setup(); diff --git a/examples/application-server-boilerplate/public/images/bg.png b/examples/application-server-boilerplate/public/images/bg.png deleted file mode 100644 index b2a7600825ee11f21849ed475499c7d1ecbcc870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2126 zcmV-U2(kBxP)+9y`=HK7nt=~3t000O5Nklm=04hVa_lXl_bm=+M;=eI<%$rO2ta`suh*Sr#POw*?adq!O!CV z*0&b)rkCCEV)1nIuiLBntUH-MJI;&qYgz|d@Nhnn_abi2g`pu4NAMVid3hS%?quz~ zjlJf(x8cj{VS zUVEP1msg9`^OFUhSO5rtXHhRlyU2i>6$BT=glG`{JlctGHrwRIm)6Buu65jLQn^H8 zvl9lZqUBA+%qvM5XC+yY@mfA(YB~XP=e|6<{%$^eU8nrK?v2ccb@Jom5CG>rKAL7J zplHEIavVp|0p1&m!G`Ti?<7iZ;}@G7#Z)}Km%2!FHnQ0*&?PLR)G!HAaHgU#c|$dz zpj#0HmeadIe>`#)=Jjkb{B=FKnU3pc-&Y@j_j6(h4Y~+Uq!^J=LHunx1xi4QXK-Y{&MoT8ky6Vb9c|WhnOwF~c=3zOy8agktliS6# z`#8F`9H)D=bmk9B5MnW&_r#)f$c+;$LSr-@^An8dhc~Iquuv>jOK7pw7LJ;&X0i1C zGMsHdP1Os@ny$$j!>XAii%7bp5k>`pyNA!~epb)()p9zR4Yl6z=U}{CIdh1z(FpAo zQIW!;0zpCyC4*7YLkZCO@cul0R_&zghsA8Ek)z%jNpKa92{@NH+SstX%@}xB*Jk!l}PZ1cClIns~}5^!RncUk*rmA z%SIVgt58EQxLJ+OiFqKkBuwquyZLUp|gr zPUbUbFbBrPd1xO`^C*r-i3p9*F#(OBh!4Wy@aC&*!|O|GXcjDA&YhF{;cD7*o(GS^ z@pQSE7)x_81=Qyje6*LQ#TXu-7(o;S8u3tpDA0_ddj%hmCspeXdhYR}-i9A=C`EoChUYuH~^x!9+|&(Pgb*>Ck<=9j|)*@xyfT zpP#+Kt<}39b|3Wl4fxT(+G?aH>gG^d@MEaUOJRfy55TtFI7^Y)VuMU=7Pp0y55jS~ z+TJ)igMyrqkX;wU8j68iIDtqJYhS_D3_Oem-@g6me_RfiQ}uT_K-A-9qG%}gk3E9c z!8`KgsMNXm)beloPfMql*|&$M>1q`i!cY)RFYnjNYu*gSv@8XebV7%}xYL>6)GJPJ zJpA7K31lcJuIFKSw-{x4FX0K2Az)~Xg<`sOu$4|^-(^XJX4YzoiNRvL zyuY7~26w-P^Zw%6F}shBwV2$02c8RsSUy6dM92diCAxiX3IUqsq5ig6>U_!Vy*q5$ zjm}16tJr+QZ&T?HkkpeIwVX-r1EI=@%Zlt;6g*mj&E!A))%gXJ=x6u#l zcKEP>bx4rqV*k`BBrZ$Mqjt{TsHcxUH>;)iAK}B(Kila&VD%b?6m&^0WK4^&EZNAI z8AMYs_%$D%|M+@+cQqL-hi4yG>h*jwdii!W1{}p>ZhwFYt_4Su1kjY9<-5`!$VNOI1y(EDSH4WpCijE_>al!Nt=^eVER#uJ1=b z;BWF2IgyF5LexV+yec$Kin;Ai@myo;G>zJ&jrdW#ecXhIZph5OYqw_PEfcF56Z5Zu_ZZE#q3Mc+N&1O^7hoh9QR7`+L$cBP5pqG=fqA0uh zUBukaxTFmH)<|Xbvp2c=HSbNkpXw73a5lv7V$jb92#yZ141@$X?F}Jt8gIU7Wm6m9 z?e_;;zsnm6`LZeP>T=$)Kr>Z?kr*UmFqR7zx0C6^bmcsc@1AGtw_rNH>-Xm$d*|Q< zn&1Ln0u7=l&ILs>%CkJp`DiG9F18x4Ne+lg<#i?e7jL%x;4ZnRkN^Mx07*qoM6N<$ Ef(>0N!2kdN diff --git a/examples/application-server-boilerplate/public/index.html b/examples/application-server-boilerplate/public/index.html deleted file mode 100644 index 17115ee5..00000000 --- a/examples/application-server-boilerplate/public/index.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - VanillaJS • TodoMVC - - - -
    - -
    -
      -
      -
      - -
      -
      Currently syncing
      -
      There was a problem syncing
      -
      -
      -
      - - - - - diff --git a/examples/application-server-boilerplate/public/scripts/app.js b/examples/application-server-boilerplate/public/scripts/app.js deleted file mode 100644 index 99515d6e..00000000 --- a/examples/application-server-boilerplate/public/scripts/app.js +++ /dev/null @@ -1,168 +0,0 @@ -(function() { - - 'use strict'; - - var ENTER_KEY = 13; - var newTodoDom = document.getElementById('new-todo'); - var syncDom = document.getElementById('sync-wrapper'); - - // EDITING STARTS HERE (you dont need to edit anything above this line) - - var db = new PouchDB('todos'); - var remoteCouch = window.location.origin + '/db/todos'; - - db.info(function(err, info) { - db.changes({ - since: info.update_seq, - continuous: true, - onChange: showTodos - }); - }); - - // We have to create a new todo document and enter it in the database - function addTodo(text) { - var todo = { - _id: new Date().toISOString(), - title: text, - completed: false - }; - db.put(todo, function callback (err, result) { - if (!err) { - console.log('Successfully posted a todo!'); - } - }); - } - - // Show the current list of todos by reading them from the database - function showTodos() { - db.allDocs({ - include_docs: true, - descending: true - }, function(err, doc) { - redrawTodosUI(doc.rows); - }); - } - - function checkboxChanged(todo, event) { - todo.completed = event.target.checked; - db.put(todo); - } - - // User pressed the delete button for a todo, delete it - function deleteButtonPressed(todo) { - db.remove(todo); - } - - // The input box when editing a todo has blurred, we should save - // the new title or delete the todo if the title is empty - function todoBlurred(todo, event) { - var trimmedText = event.target.value.trim(); - if (!trimmedText) { - db.remove(todo); - } else { - todo.title = trimmedText; - db.put(todo); - } - } - - // Initialise a sync with the remote server - function sync() { - syncDom.setAttribute('data-sync-state', 'syncing'); - var opts = {continuous: true, complete: syncError}; - db.replicate.to(remoteCouch, opts); - db.replicate.from(remoteCouch, opts); - } - - // EDITING STARTS HERE (you dont need to edit anything below this line) - - // There was some form or error syncing - function syncError() { - syncDom.setAttribute('data-sync-state', 'error'); - } - - // User has double clicked a todo, display an input so they can edit the title - function todoDblClicked(todo) { - var div = document.getElementById('li_' + todo._id); - var inputEditTodo = document.getElementById('input_' + todo._id); - div.className = 'editing'; - inputEditTodo.focus(); - } - - // If they press enter while editing an entry, blur it to trigger save - // (or delete) - function todoKeyPressed(todo, event) { - if (event.keyCode === ENTER_KEY) { - var inputEditTodo = document.getElementById('input_' + todo._id); - inputEditTodo.blur(); - } - } - - // Given an object representing a todo, this will create a list item - // to display it. - function createTodoListItem(todo) { - var checkbox = document.createElement('input'); - checkbox.className = 'toggle'; - checkbox.type = 'checkbox'; - checkbox.addEventListener('change', checkboxChanged.bind(this, todo)); - - var label = document.createElement('label'); - label.appendChild( document.createTextNode(todo.title)); - label.addEventListener('dblclick', todoDblClicked.bind(this, todo)); - - var deleteLink = document.createElement('button'); - deleteLink.className = 'destroy'; - deleteLink.addEventListener( 'click', deleteButtonPressed.bind(this, todo)); - - var divDisplay = document.createElement('div'); - divDisplay.className = 'view'; - divDisplay.appendChild(checkbox); - divDisplay.appendChild(label); - divDisplay.appendChild(deleteLink); - - var inputEditTodo = document.createElement('input'); - inputEditTodo.id = 'input_' + todo._id; - inputEditTodo.className = 'edit'; - inputEditTodo.value = todo.title; - inputEditTodo.addEventListener('keypress', todoKeyPressed.bind(this, todo)); - inputEditTodo.addEventListener('blur', todoBlurred.bind(this, todo)); - - var li = document.createElement('li'); - li.id = 'li_' + todo._id; - li.appendChild(divDisplay); - li.appendChild(inputEditTodo); - - if (todo.completed) { - li.className += 'complete'; - checkbox.checked = true; - } - - return li; - } - - function redrawTodosUI(todos) { - var ul = document.getElementById('todo-list'); - ul.innerHTML = ''; - todos.forEach(function(todo) { - ul.appendChild(createTodoListItem(todo.doc)); - }); - } - - function newTodoKeyPressHandler( event ) { - if (event.keyCode === ENTER_KEY) { - addTodo(newTodoDom.value); - newTodoDom.value = ''; - } - } - - function addEventListeners() { - newTodoDom.addEventListener('keypress', newTodoKeyPressHandler, false); - } - - addEventListeners(); - showTodos(); - - if (remoteCouch) { - sync(); - } - -})(); diff --git a/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js b/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js deleted file mode 100644 index ef9a7e95..00000000 --- a/examples/application-server-boilerplate/public/scripts/pouchdb-nightly.min.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.PouchDB=e():"undefined"!=typeof global?global.PouchDB=e():"undefined"!=typeof self&&(self.PouchDB=e())}(function(){var define,module,exports;return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);throw new Error("Cannot find module '"+a+"'")}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;at&&a.push(e)}),merge.traverseRevTree(o,function(e,t,n,r,o){var i=t+"-"+n;"available"===o.status&&-1!==a.indexOf(i)&&(o.status="missing",s.push(i))}),customApi._doCompaction(e,o,s,n)})}var api={},customApi=Pouch.adapters[opts.adapter](opts,function(e,t){if(e)return callback&&callback(e),void 0;for(var n in api)t.hasOwnProperty(n)||(t[n]=api[n]);opts.name===Pouch.prefix+Pouch.ALL_DBS?callback(e,t):Pouch.open(opts,function(e){callback(e,t)})}),auto_compaction=opts.auto_compaction===!0;api.post=function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e||Array.isArray(e)?call(n,errors.NOT_AN_OBJECT):customApi.bulkDocs({docs:[e]},t,autoCompact(yankError(n)))},api.put=function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e?call(n,errors.NOT_AN_OBJECT):"_id"in e?customApi.bulkDocs({docs:[e]},t,autoCompact(yankError(n))):call(n,errors.MISSING_ID)},api.putAttachment=function(e,t,n,r,o,i){function a(e){e._attachments=e._attachments||{},e._attachments[t]={content_type:o,data:r},api.put(e,i)}return api.taskqueue.ready()?("function"==typeof o&&(i=o,o=r,r=n,n=null),"undefined"==typeof o&&(o=r,r=n,n=null),api.get(e,function(t,r){return t&&t.error===errors.MISSING_DOC.error?(a({_id:e}),void 0):t?(call(i,t),void 0):r._rev!==n?(call(i,errors.REV_CONFLICT),void 0):(a(r),void 0)}),void 0):(api.taskqueue.addTask("putAttachment",arguments),void 0)},api.removeAttachment=function(e,t,n,r){api.get(e,function(e,o){return e?(call(r,e),void 0):o._rev!==n?(call(r,errors.REV_CONFLICT),void 0):o._attachments?(delete o._attachments[t],0===Object.keys(o._attachments).length&&delete o._attachments,api.put(o,r),void 0):call(r,null)})},api.remove=function(e,t,n){"function"==typeof t&&(n=t,t={}),void 0===t&&(t={}),t.was_delete=!0;var r={_id:e._id,_rev:e._rev};return r._deleted=!0,customApi.bulkDocs({docs:[r]},t,yankError(n))},api.revsDiff=function(e,t,n){function r(e,t){s[e]||(s[e]={missing:[]}),s[e].missing.push(t)}function o(t,n){var o=e[t].slice(0);merge.traverseRevTree(n,function(e,n,i,a,s){var u=n+"-"+i,c=o.indexOf(u);-1!==c&&(o.splice(c,1),"available"!==s.status&&r(t,u))}),o.forEach(function(e){r(t,e)})}"function"==typeof t&&(n=t,t={});var i=Object.keys(e),a=0,s={};i.map(function(t){customApi._getRevisionTree(t,function(r,u){if(r&&"not_found"===r.error&&"missing"===r.reason)s[t]={missing:e[t]};else{if(r)return call(n,r);o(t,u)}return++a===i.length?call(n,null,s):void 0})})},api.compact=function(e,t){"function"==typeof e&&(t=e,e={}),api.changes({complete:function(e,n){if(e)return call(t),void 0;var r=n.results.length;return r?(n.results.forEach(function(e){compactDocument(e.id,0,function(){r--,r||call(t)})}),void 0):(call(t),void 0)}})},api.get=function(e,t,n){function r(){var r=[],i=o.length;return i?(o.forEach(function(o){api.get(e,{rev:o,revs:t.revs},function(e,t){e?r.push({missing:o}):r.push({ok:t}),i--,i||call(n,null,r)})}),void 0):call(n,null,r)}if(!api.taskqueue.ready())return api.taskqueue.addTask("get",arguments),void 0;"function"==typeof t&&(n=t,t={});var o=[];{if(!t.open_revs)return customApi._get(e,t,function(e,r){if(e)return call(n,e);var o=r.doc,i=r.metadata,a=r.ctx;if(t.conflicts){var s=merge.collectConflicts(i);s.length&&(o._conflicts=s)}if(t.revs||t.revs_info){var u=merge.rootToLeaf(i.rev_tree),c=arrayFirst(u,function(e){return-1!==e.ids.map(function(e){return e.id}).indexOf(o._rev.split("-")[1])});if(c.ids.splice(c.ids.map(function(e){return e.id}).indexOf(o._rev.split("-")[1])+1),c.ids.reverse(),t.revs&&(o._revisions={start:c.pos+c.ids.length-1,ids:c.ids.map(function(e){return e.id})}),t.revs_info){var d=c.pos+c.ids.length;o._revs_info=c.ids.map(function(e){return d--,{rev:d+"-"+e.id,status:e.opts.status}})}}if(t.local_seq&&(o._local_seq=r.metadata.seq),t.attachments&&o._attachments){var l=o._attachments,f=Object.keys(l).length;if(0===f)return call(n,null,o);Object.keys(l).forEach(function(e){customApi._getAttachment(l[e],{encode:!0,ctx:a},function(t,r){o._attachments[e].data=r,--f||call(n,null,o)})})}else{if(o._attachments)for(var p in o._attachments)o._attachments[p].stub=!0;call(n,null,o)}});if("all"===t.open_revs)customApi._getRevisionTree(e,function(e,t){e&&(t=[]),o=merge.collectLeaves(t).map(function(e){return e.rev}),r()});else{if(!Array.isArray(t.open_revs))return call(n,utils.error(errors.UNKNOWN_ERROR,"function_clause"));o=t.open_revs;for(var i=0;i1&&"_design"!==d[0]&&"_local"!==d[0]||d.length>2&&"_design"===d[0]&&"_local"!==d[0])&&(c.binary=!0),n(c,function(e,t,n){return e?u.call(o,e):(u.call(o,null,t,n),void 0)})},l.remove=function(e,t,o){return l.taskqueue.ready()?("function"==typeof t&&(o=t,t={}),n({headers:s.headers,method:"DELETE",url:i(s,r(e._id))+"?rev="+e._rev},o),void 0):(l.taskqueue.addTask("remove",arguments),void 0)},l.getAttachment=function(e,t,n,o){"function"==typeof n&&(o=n,n={}),void 0===n.auto_encode&&(n.auto_encode=!0),n.auto_encode&&(e=r(e)),n.auto_encode=!1,l.get(e+"/"+t,n,o)},l.removeAttachment=function(e,t,o,a){return l.taskqueue.ready()?(n({headers:s.headers,method:"DELETE",url:i(s,r(e)+"/"+t)+"?rev="+o},a),void 0):(l.taskqueue.addTask("removeAttachment",arguments),void 0)},l.putAttachment=function(e,t,o,a,u,c){if(!l.taskqueue.ready())return l.taskqueue.addTask("putAttachment",arguments),void 0;"function"==typeof u&&(c=u,u=a,a=o,o=null),"undefined"==typeof u&&(u=a,a=o,o=null);var d=r(e)+"/"+t,f=i(s,d);o&&(f+="?rev="+o);var p={headers:s.headers,method:"PUT",url:f,processData:!1,body:a,timeout:6e4};p.headers["Content-Type"]=u,n(p,c)},l.put=function(e,t,o){if(!l.taskqueue.ready())return l.taskqueue.addTask("put",arguments),void 0;if("function"==typeof t&&(o=t,t={}),"object"!=typeof e)return u.call(o,c.NOT_AN_OBJECT);if(!("_id"in e))return u.call(o,c.MISSING_ID);var a=[];t&&"undefined"!=typeof t.new_edits&&a.push("new_edits="+t.new_edits),a=a.join("&"),""!==a&&(a="?"+a),n({headers:s.headers,method:"PUT",url:i(s,r(e._id))+a,body:e},o)},l.post=function(e,t,n){return l.taskqueue.ready()?("function"==typeof t&&(n=t,t={}),"object"!=typeof e?u.call(n,c.NOT_AN_OBJECT):("_id"in e?l.put(e,t,n):p.list.length>0?(e._id=p.list.pop(),l.put(e,t,n)):p.get(function(r){return r?u.call(n,c.UNKNOWN_ERROR):(e._id=p.list.pop(),l.put(e,t,n),void 0)}),void 0)):(l.taskqueue.addTask("post",arguments),void 0)},l.bulkDocs=function(e,t,r){return l.taskqueue.ready()?("function"==typeof t&&(r=t,t={}),t||(t={}),"undefined"!=typeof t.new_edits&&(e.new_edits=t.new_edits),n({headers:s.headers,method:"POST",url:i(s,"_bulk_docs"),body:e},r),void 0):(l.taskqueue.addTask("bulkDocs",arguments),void 0)},l.allDocs=function(e,t){if(!l.taskqueue.ready())return l.taskqueue.addTask("allDocs",arguments),void 0;"function"==typeof e&&(t=e,e={});var r,o=[],a="GET";e.conflicts&&o.push("conflicts=true"),e.descending&&o.push("descending=true"),e.include_docs&&o.push("include_docs=true"),e.startkey&&o.push("startkey="+encodeURIComponent(JSON.stringify(e.startkey))),e.endkey&&o.push("endkey="+encodeURIComponent(JSON.stringify(e.endkey))),e.limit&&o.push("limit="+e.limit),"undefined"!=typeof e.skip&&o.push("skip="+e.skip),o=o.join("&"),""!==o&&(o="?"+o),"undefined"!=typeof e.keys&&(a="POST",r=JSON.stringify({keys:e.keys})),n({headers:s.headers,method:a,url:i(s,"_all_docs"+o),body:r},t)},l.changes=function(e){var t=25;if(!l.taskqueue.ready()){var r=l.taskqueue.addTask("changes",arguments);return{cancel:function(){return r.task?r.task.cancel():(r.parameters[0].aborted=!0,void 0)}}}if("latest"===e.since){var o;return l.info(function(t,n){e.aborted||(e.since=n.update_seq,o=l.changes(e))}),{cancel:function(){return o?o.cancel():(e.aborted=!0,void 0)}}}var a={},d="undefined"!=typeof e.limit?e.limit:!1;0===d&&(d=1);var f=d;if(e.style&&(a.style=e.style),(e.include_docs||e.filter&&"function"==typeof e.filter)&&(a.include_docs=!0),e.continuous&&(a.feed="longpoll"),e.conflicts&&(a.conflicts=!0),e.descending&&(a.descending=!0),e.filter&&"string"==typeof e.filter&&(a.filter=e.filter,"_view"===e.filter&&e.view&&"string"==typeof e.view&&(a.view=e.view)),e.query_params&&"object"==typeof e.query_params)for(var p in e.query_params)e.query_params.hasOwnProperty(p)&&(a[p]=e.query_params[p]);var v,h,m,_,g=function(r,o){a.since=r,e.continuous||_||(_=m),a.limit=!d||f>t?t:f;var u="?"+Object.keys(a).map(function(e){return e+"="+a[e]}).join("&"),c={headers:s.headers,method:"GET",url:i(s,"_changes"+u),timeout:null};h=r,e.aborted||(v=n(c,o))},y=10,b=0,k={results:[]},w=function(n,r){if(r&&r.results){k.last_seq=r.last_seq;var o={};o.query=e.query_params,r.results=r.results.filter(function(t){f--;var n=u.filterChange(e)(t);return n&&(k.results.push(t),u.call(e.onChange,t)),n})}else n&&(e.aborted=!0,u.call(e.complete,n,null));r&&r.last_seq&&(h=r.last_seq);var i=r&&r.results.length||0;_-=t;var a=d&&0>=f||r&&!i&&0>=_||i&&r.last_seq===m||e.descending&&0!==h;if(e.continuous||!a){n?b+=1:b=0;var s=1<p&&u.call(e.complete,n||c.UNKNOWN_ERROR,null),setTimeout(function(){g(h,w)},l)}else u.call(e.complete,null,k)};return e.continuous?g(e.since||0,w):l.info(function(t,n){return t?u.call(e.complete,t):(m=n.update_seq,g(e.since||0,w),void 0)}),{cancel:function(){e.aborted=!0,v.abort()}}},l.revsDiff=function(e,t,r){return l.taskqueue.ready()?("function"==typeof t&&(r=t,t={}),n({headers:s.headers,method:"POST",url:i(s,"_revs_diff"),body:e},function(e,t){u.call(r,e,t)}),void 0):(l.taskqueue.addTask("revsDiff",arguments),void 0)},l.close=function(e){return l.taskqueue.ready()?(u.call(e,null),void 0):(l.taskqueue.addTask("close",arguments),void 0)},l.replicateOnServer=function(e,r,i){if(!l.taskqueue.ready())return l.taskqueue.addTask("replicateOnServer",arguments),i;var a=o(e.id()),c={source:s.db,target:a.protocol===s.protocol&&a.authority===s.authority?a.db:a.source};r.continuous&&(c.continuous=!0),r.create_target&&(c.create_target=!0),r.doc_ids&&(c.doc_ids=r.doc_ids),r.filter&&"string"==typeof r.filter&&(c.filter=r.filter),r.query_params&&(c.query_params=r.query_params);var d,f={},p={headers:s.headers,method:"POST",url:s.protocol+"://"+s.host+(80===s.port?"":":"+s.port)+"/_replicate",body:c};i.cancel=function(){this.cancelled=!0,d&&!f.ok&&d.abort(),f._local_id&&(p.body={replication_id:f._local_id}),p.body.cancel=!0,n(p,function(e,n,o){return e?u.call(t,e):(u.call(r.complete,null,f,o),void 0)})},i.cancelled||(d=n(p,function(e,n,o){return e?u.call(t,e):(f.ok=!0,n._local_id&&(f._local_id=n._local_id),u.call(r.complete,null,n,o),void 0)}))},l}var u=e("../utils"),c=e("../deps/errors");n.options={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},s.destroy=function(e,t,n){var r=o(e,t);t=t||{},"function"==typeof t&&(n=t,t={}),t.headers=r.headers,t.method="DELETE",t.url=i(r,""),u.ajax(t,n)},s.valid=function(){return!0},t.exports=s},{"../deps/errors":7,"../utils":14}],3:[function(e,t){"use strict";function n(e){return function(t){o.call(e,{status:500,error:t.type,reason:t.target})}}function r(e,t){function s(e){e.createObjectStore(l,{keyPath:"id"}).createIndex("seq","seq",{unique:!0}),e.createObjectStore(f,{autoIncrement:!0}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0}),e.createObjectStore(p,{keyPath:"digest"}),e.createObjectStore(v,{keyPath:"id",autoIncrement:!1}),e.createObjectStore(h)}function u(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),o=0;t>o;o++)r[o]=e.charCodeAt(o);return n}function c(e,t){return e._bulk_seq-t._bulk_seq}var d=1,l="document-store",f="by-sequence",p="attach-store",v="meta-store",h="detect-blob-support",m=e.name,_=window.indexedDB.open(m,d);"openReqList"in r||(r.openReqList={}),r.openReqList[m]=_;var g=null,y=null,b={},k=null;return _.onupgradeneeded=function(e){for(var t=e.target.result,n=e.oldVersion;n!==e.newVersion;)0===n&&s(t),n++},_.onsuccess=function(e){k=e.target.result,k.onversionchange=function(){k.close()};var n=k.transaction([v,h],"readwrite"),r=n.objectStore(v).get(v);r.onsuccess=function(e){var r=e.target.result||{id:v};m+"_id"in r?y=r[m+"_id"]:(y=o.uuid(),r[m+"_id"]=y,n.objectStore(v).put(r));try{n.objectStore(h).put(o.createBlob(),"key"),g=!0}catch(i){g=!1}finally{o.call(t,null,b)}}},_.onerror=n(t),b.type=function(){return"idb"},b.id=function(){return y},b._bulkDocs=function(e,t,s){function d(e){var t=e.target.result;t.updateSeq=(t.updateSeq||0)+x,N.objectStore(v).put(t)}function h(){if(!C.length)return N.objectStore(v).get(v).onsuccess=d,void 0;var e=C.shift(),t=N.objectStore(l).get(e.metadata.id);t.onsuccess=function(t){var n=t.target.result;n?q(n,e):S(e)}}function _(){var e=[];A.sort(c),A.forEach(function(t){if(delete t._bulk_seq,t.error)return e.push(t),void 0;var n=t.metadata,a=i.winningRev(n);e.push({ok:!0,id:n.id,rev:a}),o.isLocalId(n.id)||(r.Changes.notify(m),r.Changes.notifyLocalWindows(m))}),o.call(s,null,e)}function y(e,t){if(e.stub)return t();if("string"==typeof e.data){var n;try{n=atob(e.data)}catch(r){var i=o.error(a.BAD_ARG,"Attachments need to be base64 encoded");return o.call(s,i)}if(e.digest="md5-"+o.Crypto.MD5(n),g){var c=e.content_type;n=u(n),e.data=o.createBlob([n],{type:c})}return t()}var d=new FileReader;d.onloadend=function(){e.digest="md5-"+o.Crypto.MD5(this.result),g||(e.data=btoa(this.result)),t()},d.readAsBinaryString(e.data)}function b(e){function t(){n++,C.length===n&&e()}if(!C.length)return e();var n=0;C.forEach(function(e){function n(){o++,o===r.length&&t()}var r=e.data&&e.data._attachments?Object.keys(e.data._attachments):[];if(!r.length)return t();var o=0;for(var i in e.data._attachments)y(e.data._attachments[i],n)})}function w(e,t){function n(e){a||(e?(a=e,o.call(t,a)):s===u.length&&i())}function r(e){s++,n(e)}function i(){e.data._doc_id_rev=e.data._id+"::"+e.data._rev;var n=N.objectStore(f).put(e.data);n.onsuccess=function(n){e.metadata.seq=n.target.result,delete e.metadata.rev;var r=N.objectStore(l).put(e.metadata);r.onsuccess=function(){A.push(e),o.call(t)}}}var a=null,s=0;e.data._id=e.metadata.id,e.data._rev=e.metadata.rev,x++,o.isDeleted(e.metadata,e.metadata.rev)&&(e.data._deleted=!0);var u=e.data._attachments?Object.keys(e.data._attachments):[];for(var c in e.data._attachments)if(e.data._attachments[c].stub)s++,n();else{var d=e.data._attachments[c].data;delete e.data._attachments[c].data;var p=e.data._attachments[c].digest;O(e,p,d,r)}u.length||i()}function q(e,t){var n=i.merge(e.rev_tree,t.metadata.rev_tree[0],1e3),r=o.isDeleted(e),s=r&&o.isDeleted(t.metadata)||!r&&R&&"new_leaf"!==n.conflicts;return s?(A.push(E(a.REV_CONFLICT,t._bulk_seq)),h()):(t.metadata.rev_tree=n.tree,w(t,h),void 0)}function S(e){return"was_delete"in t&&o.isDeleted(e.metadata)?(A.push(a.MISSING_DOC),h()):(w(e,h),void 0)}function E(e,t){return e._bulk_seq=t,e}function O(e,t,n,r){{var i=N.objectStore(p);i.get(t).onsuccess=function(a){var s=a.target.result&&a.target.result.refs||{},u=[e.metadata.id,e.metadata.rev].join("@"),c={digest:t,body:n,refs:s};c.refs[u]=!0;i.put(c).onsuccess=function(){o.call(r)}}}}var R=t.new_edits,T=e.docs,C=T.map(function(e,t){var n=o.parseDoc(e,R);return n._bulk_seq=t,n}),D=C.filter(function(e){return e.error});if(D.length)return o.call(s,D[0]);var N,A=[],x=0;b(function(){N=k.transaction([l,f,p,v],"readwrite"),N.onerror=n(s),N.ontimeout=n(s),N.oncomplete=_,h()})},b._get=function(e,t,n){function r(){o.call(n,c,{doc:s,metadata:u,ctx:d})}var s,u,c,d;d=t.ctx?t.ctx:k.transaction([l,f,p],"readonly"),d.objectStore(l).get(e).onsuccess=function(e){if(u=e.target.result,!u)return c=a.MISSING_DOC,r();if(o.isDeleted(u)&&!t.rev)return c=o.error(a.MISSING_DOC,"deleted"),r();var n=i.winningRev(u),l=u.id+"::"+(t.rev?t.rev:n),p=d.objectStore(f).index("_doc_id_rev");p.get(l).onsuccess=function(e){return s=e.target.result,s&&s._doc_id_rev&&delete s._doc_id_rev,s?(r(),void 0):(c=a.MISSING_DOC,r())}}},b._getAttachment=function(e,t,n){var r,i;i=t.ctx?t.ctx:k.transaction([l,f,p],"readonly");var a=e.digest,s=e.content_type;i.objectStore(p).get(a).onsuccess=function(e){var i=e.target.result.body;if(t.encode)if(g){var a=new FileReader;a.onloadend=function(){r=btoa(this.result),o.call(n,null,r)},a.readAsBinaryString(i)}else r=i,o.call(n,null,r);else g?r=i:(i=u(atob(i)),r=o.createBlob([i],{type:s})),o.call(n,null,r)}},b._allDocs=function(e,t){var n="startkey"in e?e.startkey:!1,r="endkey"in e?e.endkey:!1,a="descending"in e?e.descending:!1;a=a?"prev":null;var s=n&&r?window.IDBKeyRange.bound(n,r):n?window.IDBKeyRange.lowerBound(n):r?window.IDBKeyRange.upperBound(r):null,u=k.transaction([l,f],"readonly");u.oncomplete=function(){"keys"in e&&(e.keys.forEach(function(e){e in v?p.push(v[e]):p.push({key:e,error:"not_found"})}),e.descending&&p.reverse()),o.call(t,null,{total_rows:p.length,offset:e.skip,rows:"limit"in e?p.slice(e.skip,e.limit+e.skip):e.skip>0?p.slice(e.skip):p})};var c=u.objectStore(l),d=a?c.openCursor(s,a):c.openCursor(s),p=[],v={};d.onsuccess=function(t){function n(t,n){if(o.isLocalId(t.id))return r["continue"]();var a={id:t.id,key:t.id,value:{rev:i.winningRev(t)}};if(e.include_docs){a.doc=n,a.doc._rev=i.winningRev(t),a.doc._doc_id_rev&&delete a.doc._doc_id_rev,e.conflicts&&(a.doc._conflicts=i.collectConflicts(t));for(var s in a.doc._attachments)a.doc._attachments[s].stub=!0}"keys"in e?e.keys.indexOf(t.id)>-1&&(o.isDeleted(t)&&(a.value.deleted=!0,a.doc=null),v[a.id]=a):o.isDeleted(t)||p.push(a),r["continue"]()}if(t.target.result){var r=t.target.result,a=r.value;if(e.include_docs){var s=u.objectStore(f).index("_doc_id_rev"),c=i.winningRev(a),d=a.id+"::"+c;s.get(d).onsuccess=function(e){n(r.value,e.target.result)}}else n(a)}}},b._info=function(e){function t(e){o=e.target.result&&e.target.result.updateSeq||0}function n(e){var n=e.target.result;return n?(n.value.deleted!==!0&&r++,n["continue"](),void 0):(i.objectStore(v).get(v).onsuccess=t,void 0)}var r=0,o=0,i=k.transaction([l,v],"readonly");i.oncomplete=function(){e(null,{db_name:m,doc_count:r,update_seq:o})},i.objectStore(l).openCursor().onsuccess=n},b._changes=function(e){function t(){p=k.transaction([l,f]),p.oncomplete=a;var t;t=c?p.objectStore(f).openCursor(window.IDBKeyRange.lowerBound(e.since,!0),c):p.objectStore(f).openCursor(window.IDBKeyRange.lowerBound(e.since,!0)),t.onsuccess=n,t.onerror=s}function n(t){if(!t.target.result){for(var n=0,r=v.length;r>n;n++){var a=v[n];a&&_.push(a)}return!1}var s=t.target.result,u=s.value._id,c=h[u];if(void 0!==c)return v[c].seq=s.key,v.push(v[c]),v[c]=null,h[u]=v.length-1,s["continue"]();var m=p.objectStore(l);m.get(s.value._id).onsuccess=function(t){var n=t.target.result;if(o.isLocalId(n.id))return s["continue"]();d= "'+u+'"'),c&&(p+=(u?" AND ":" WHERE ")+d+'.id <= "'+c+'"'),p+=" ORDER BY "+d+".id "+(f?"DESC":"ASC")),b.transaction(function(t){t.executeSql(p,[],function(t,n){for(var r=0,u=n.rows.length;u>r;r++){var c=n.rows.item(r),d=JSON.parse(c.metadata),l=JSON.parse(c.data);if(!i.isLocalId(d.id)){if(c={id:d.id,key:d.id,value:{rev:a.winningRev(d)}},e.include_docs){c.doc=l,c.doc._rev=a.winningRev(d),e.conflicts&&(c.doc._conflicts=a.collectConflicts(d));for(var f in c.doc._attachments)c.doc._attachments[f].stub=!0}"keys"in e?e.keys.indexOf(d.id)>-1&&(i.isDeleted(d)&&(c.value.deleted=!0,c.doc=null),s[c.id]=c):i.isDeleted(d)||o.push(c)}}})},r(t),function(){"keys"in e&&(e.keys.forEach(function(e){e in s?o.push(s[e]):o.push({key:e,error:"not_found"})}),e.descending&&o.reverse()),i.call(t,null,{total_rows:o.length,offset:e.skip,rows:"limit"in e?o.slice(e.skip,e.limit+e.skip):e.skip>0?o.slice(e.skip):o})})},_._changes=function(e){function t(){var t="SELECT "+d+".id, "+l+".seq, "+l+".json AS data, "+d+".json AS metadata FROM "+l+" JOIN "+d+" ON "+l+".seq = "+d+".winningseq WHERE "+d+".seq > "+e.since+" ORDER BY "+d+".seq "+(r?"DESC":"ASC");b.transaction(function(n){n.executeSql(t,[],function(t,n){for(var r=0,o=0,u=n.rows.length;u>o;o++){var c=n.rows.item(o),d=JSON.parse(c.metadata);if(!i.isLocalId(d.id)){r=200&&p.status<300){var r;r=e.binary?i([p.response||""],{type:p.getResponseHeader("Content-Type")}):p.responseText,n(a,r,p,t)}else n(s,p,t)},e.timeout>0&&(l=setTimeout(c,e.timeout)),p.send(e.body),{abort:c}}return e.json&&(e.binary||(e.headers.Accept="application/json"),e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json"),e.binary&&(e.encoding=null,e.json=!1),e.processData||(e.json=!1),r(e,function(r,o,i){if(r)return r.status=o?o.statusCode:400,n(s,r,t);var u=o.headers["content-type"],c=i||"";e.binary||!e.json&&e.processData||"object"==typeof c||!(/json/.test(u)||/^[\s]*\{/.test(c)&&/\}[\s]*$/.test(c))||(c=JSON.parse(c)),o.statusCode>=200&&o.statusCode<300?n(a,c,o,t):(e.binary&&(c=JSON.parse(c.toString())),c.status=o.statusCode,n(t,c))})}var r=e("request"),o=e("./extend.js"),i=e("./blob.js");t.exports=n},{"./blob.js":6,"./extend.js":8,request:16}],6:[function(e,t){function n(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(n){if("TypeError"!==n.name)throw n;for(var r=window.BlobBuilder||window.MSBlobBuilder||window.MozBlobBuilder||window.WebKitBlobBuilder,o=new r,i=0;id;d++)if(null!=(e=arguments[d]))for(t in e)n=c[t],r=e[t],c!==r&&(f&&r&&(o(r)||(s=p(r)))?(s?(s=!1,u=n&&p(n)?n:[]):u=n&&o(n)?n:{},c[t]=a(f,u,r)):void 0!==r&&(p(e)&&i(r)||(c[t]=r)));return c}for(var s={},u=["Boolean","Number","String","Function","Array","Date","RegExp","Object","Error"],c=0;c>>32-t}function n(e,t){var n,r,o,i,a;return o=2147483648&e,i=2147483648&t,n=1073741824&e,r=1073741824&t,a=(1073741823&e)+(1073741823&t),n&r?2147483648^a^o^i:n|r?1073741824&a?3221225472^a^o^i:1073741824^a^o^i:a^o^i}function i(e,t,n){return e&t|~e&n}function a(e,t,n){return e&n|t&~n}function s(e,t,n){return e^t^n}function u(e,t,n){return t^(e|~n)}function c(e,r,o,a,s,u,c){return e=n(e,n(n(i(r,o,a),s),c)),n(t(e,u),r)}function d(e,r,o,i,s,u,c){return e=n(e,n(n(a(r,o,i),s),c)),n(t(e,u),r)}function l(e,r,o,i,a,u,c){return e=n(e,n(n(s(r,o,i),a),c)),n(t(e,u),r)}function f(e,r,o,i,a,s,c){return e=n(e,n(n(u(r,o,i),a),c)),n(t(e,s),r)}function p(e){for(var t,n=e.length,r=n+8,o=(r-r%64)/64,i=16*(o+1),a=Array(i-1),s=0,u=0;n>u;)t=(u-u%4)/4,s=u%4*8,a[t]=a[t]|e.charCodeAt(u)<>>29,a}function v(e){var t,n,r="",o="";for(n=0;3>=n;n++)t=e>>>8*n&255,o="0"+t.toString(16),r+=o.substr(o.length-2,2);return r}if(!r.browser)return o.createHash("md5").update(e).digest("hex");var h,m,_,g,y,b,k,w,q,S=Array(),E=7,O=12,R=17,T=22,C=5,D=9,N=14,A=20,x=4,j=11,I=16,L=23,B=6,M=10,P=15,U=21;for(S=p(e),b=1732584193,k=4023233417,w=2562383102,q=271733878,h=0;hr;r++)i[r]=o[0|Math.random()*t];else{var a;for(i[8]=i[13]=i[18]=i[23]="-",i[14]="4",r=0;36>r;r++)i[r]||(a=0|16*Math.random(),i[r]=o[19==r?3&a|8:a])}return i.join("")}n.CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),t.exports=n},{}],11:[function(e,t){function n(e,t,r){if(!(this instanceof n))return new n(e,t,r);("function"==typeof t||"undefined"==typeof t)&&(r=t,t={}),"object"==typeof e&&(t=e,e=void 0),"undefined"==typeof r&&(r=function(){});var o=n.parseAdapter(t.name||e);if(t.originalName=e,t.name=t.name||o.name,t.adapter=t.adapter||o.adapter,!n.adapters[t.adapter])throw"Adapter is missing";if(!n.adapters[t.adapter].valid())throw"Invalid Adapter";var a=new i(t,function(e,t){if(e)return r&&r(e),void 0;for(var o in n.plugins){var i=n.plugins[o](t);for(var a in i)a in t||(t[a]=i[a])}t.taskqueue.ready(!0),t.taskqueue.execute(t),r(null,t)});for(var s in a)this[s]=a[s];for(var u in n.plugins){var c=n.plugins[u](this);for(var d in c)d in this||(this[d]=c[d])}}var r=e("__browserify_process"),o=e("./utils"),i=e("./adapter")(n);n.adapters={},n.plugins={},n.prefix="_pouch_",n.parseAdapter=function(e){var t,r=e.match(/([a-z\-]*):\/\/(.*)/);if(r){if(e=/http(s?)/.test(r[1])?r[1]+"://"+r[2]:r[2],t=r[1],!n.adapters[t].valid())throw"Invalid adapter";return{name:e,adapter:r[1]}}for(var o=["idb","leveldb","websql"],i=0;i0;){var o=n.pop(),i=o.tree1,a=o.tree2;(i[1].status||a[1].status)&&(i[1].status="available"===i[1].status||"available"===a[1].status?"available":"missing");for(var s=0;s0;){var p=f.pop();0!==p.diff?p.ids&&p.ids[2].forEach(function(e,t){f.push({ids:e,diff:p.diff-1,parent:p.ids,parentIdx:t})}):p.ids[0]===c.ids[0]&&l.push(p)}var v=l[0];v?(o=r(v.ids,c.ids),v.parent[2][v.parentIdx]=o.tree,i.push({pos:u.pos,ids:u.ids}),a=a||o.conflicts,s=!0):i.push(e)}else i.push(e)}),s||i.push(t),i.sort(function(e,t){return e.pos-t.pos}),{tree:i,conflicts:a||"internal_node"}):{tree:[t],conflicts:"new_leaf"}}function i(e,t){var r=s.rootToLeaf(e).map(function(e){var r=e.ids.slice(-t);return{pos:e.pos+(e.ids.length-r.length),ids:n(r)}});return r.reduce(function(e,t){return o(e,t,!0).tree},[r.shift()])}var a=e("./deps/extend"),s={};s.merge=function(e,t,n){e=a(!0,[],e),t=a(!0,{},t);var r=o(e,t);return{tree:i(r.tree,n),conflicts:r.conflicts}},s.winningRev=function(e){var t=[];return s.traverseRevTree(e.rev_tree,function(e,n,r,o,i){e&&t.push({pos:n,id:r,deleted:!!i.deleted})}),t.sort(function(e,t){return e.deleted!==t.deleted?e.deleted>t.deleted?1:-1:e.pos!==t.pos?t.pos-e.pos:e.id0;){var r=n.pop(),o=r.pos,i=r.ids,a=t(0===i[2].length,o,i[0],r.ctx,i[1]);i[2].forEach(function(e){n.push({pos:o+1,ids:e,ctx:a})})}},s.collectLeaves=function(e){var t=[];return s.traverseRevTree(e,function(e,n,r,o,i){e&&t.unshift({rev:n+"-"+r,pos:n,opts:i})}),t.sort(function(e,t){return t.pos-e.pos}),t.map(function(e){delete e.pos}),t},s.collectConflicts=function(e){var t=s.winningRev(e),n=s.collectLeaves(e.rev_tree),r=[];return n.forEach(function(e){e.rev===t||e.opts.deleted||r.push(e.rev)}),r},s.rootToLeaf=function(e){var t=[];return s.traverseRevTree(e,function(e,n,r,o,i){if(o=o?o.slice(0):[],o.push({id:r,opts:i}),e){var a=n+1-o.length;t.unshift({pos:a,ids:o})}return o}),t},t.exports=s},{"./deps/extend":8}],13:[function(e,t,n){"use strict";function r(){var e=this;this.cancelled=!1,this.cancel=function(){e.cancelled=!0}}function o(e){var t=[],n={},r=!1;return n.enqueue=function(e,o){t.push({fun:e,args:o}),r||n.process()},n.process=function(){if(!r&&t.length&&!e.cancelled){r=!0;var n=t.shift();n.fun.apply(null,n.args)}},n.notifyRequestComplete=function(){r=!1,n.process()},n}function i(e,t,n){var r=n.filter?n.filter.toString():"";return"_local/"+d.Crypto.MD5(e.id()+t.id()+r)}function a(e,t,n,r){t.get(n,function(t,o){t&&404===t.status?r(null,0):e.get(n,function(e,t){e&&404===e.status||o.last_seq!==t.last_seq?r(null,0):r(null,t.last_seq)})})}function s(e,t,n,r,o){function i(e,t){e.get(n,function(o,i){o&&404===o.status&&(i={_id:n}),i.last_seq=r,e.put(i,t)})}i(t,function(){i(e,function(){o()})})}function u(e,t,n,r){function u(r,o,i){if(n.onChange)for(var a=0;i>a;a++)n.onChange.apply(this,[O]);w-=i,O.docs_written+=i,s(e,t,y,q,function(){_.notifyRequestComplete(),m()})}function c(){if(!g.length)return _.notifyRequestComplete();var e=g.length;t.bulkDocs({docs:g},{new_edits:!1},function(t,n){u(t,n,e)}),g=[]}function l(t,n){e.get(t,{revs:!0,rev:n,attachments:!0},function(e,t){O.docs_read++,_.notifyRequestComplete(),g.push(t),_.enqueue(c)})}function f(e){return function(t,o){if(_.notifyRequestComplete(),t)return S&&r.cancel(),d.call(n.complete,t,null),void 0;if(0===Object.keys(o).length){for(var i in e)w-=e[i];return m(),void 0}var a=function(e){_.enqueue(l,[s,e])};for(var s in o){var u=e[s]-o[s].missing.length;w-=u,o[s].missing.forEach(a)}}}function p(e,n){t.revsDiff(e,f(n))}function v(e){q=e.seq,b.push(e);var t={};t[e.id]=e.changes.map(function(e){return e.rev});var n={};n[e.id]=e.changes.length,w+=e.changes.length,_.enqueue(p,[t,n])}function h(){k=!0,m()}function m(){k&&0===w&&(O.end_time=new Date,d.call(n.complete,null,O))}var _=new o(r),g=[],y=i(e,t,n),b=[],k=!1,w=0,q=0,S=n.continuous||!1,E=n.doc_ids,O={ok:!0,start_time:new Date,docs_read:0,docs_written:0};a(e,t,y,function(t,o){if(t)return d.call(n.complete,t);if(q=o,!r.cancelled){var i={continuous:S,since:q,style:"all_docs",onChange:v,complete:h,doc_ids:E};n.filter&&(i.filter=n.filter),n.query_params&&(i.query_params=n.query_params);var a=e.changes(i);if(n.continuous){var s=r.cancel;r.cancel=function(){s(),a.cancel()}}}})}function c(e,t){return"string"==typeof e?new l(e,t):(t(null,e),void 0)}var d=e("./utils"),l=e("./index");n.replicate=function(e,t,n,o){n instanceof Function&&(o=n,n={}),void 0===n&&(n={}),n.complete||(n.complete=o);var i=new r;return c(e,function(e,r){return e?d.call(o,e):(c(t,function(e,t){if(e)return d.call(o,e);if(n.server){if("function"!=typeof r.replicateOnServer)return d.call(o,{error:"Server replication not supported for "+r.type()+" adapter"});if(r.type()!==t.type())return d.call(o,{error:"Server replication for different adapter types ("+r.type()+" and "+t.type()+") is not supported"});r.replicateOnServer(t,n,i)}else u(r,t,n,i)}),void 0)}),i}},{"./index":11,"./utils":14}],14:[function(e,t,n){function r(e){return/^_/.test(e)?/^_(design|local)/.test(e):!0}function o(){return"undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage&&"undefined"!=typeof chrome.storage.local}var i=e("./merge");n.extend=e("./deps/extend"),n.ajax=e("./deps/ajax"),n.createBlob=e("./deps/blob");var a=e("./deps/uuid");n.Crypto=e("./deps/md5.js");var s=e("./deps/buffer"),u=e("./deps/errors");n.error=function(e,t){return n.extend({},e,{reason:t})};var c=["_id","_rev","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree"];n.uuids=function(e,t){"object"!=typeof t&&(t={});for(var n=t.length,r=t.radix,o=[];o.push(a(n,r))=0&&(t=t.split("-")[1]);var n=!1;return i.traverseRevTree(e.rev_tree,function(e,r,o,i,a){o===t&&(n=!!a.deleted)}),n},n.filterChange=function(e){return function(t){var n={},r=e.filter&&"function"==typeof e.filter;if(n.query=e.query_params,e.filter&&r&&!e.filter.call(this,t.doc,n))return!1;if(e.doc_ids&&-1===e.doc_ids.indexOf(t.id))return!1;if(e.include_docs)for(var o in t.doc._attachments)t.doc._attachments[o].stub=!0;else delete t.doc;return!0}},n.processChanges=function(e,t,r){t=t.filter(n.filterChange(e)),e.limit&&e.limito.since&&!o.cancelled&&(o.since=e.seq,n.call(o.onChange,e))}})})},e},n.atob="undefined"!=typeof window&&"atob"in window?function(e){return atob(e)}:function(e){var t=new s(e,"base64");if(t.toString("base64")!==e)throw"Cannot base64 encode full string";return t.toString("binary")},n.btoa="undefined"!=typeof window&&"btoa"in window?function(e){return btoa(e)}:function(e){return new s(e,"binary").toString("base64")},t.exports=n},{"./deps/ajax":5,"./deps/blob":6,"./deps/buffer":16,"./deps/errors":7,"./deps/extend":8,"./deps/md5.js":9,"./deps/uuid":10,"./merge":12}],15:[function(e,t){t.exports="1.0.0"},{}],16:[function(){},{}],17:[function(e,t){var n=t.exports={};n.nextTick=function(){var e="undefined"!=typeof window&&window.setImmediate,t="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener("message",function(e){if(e.source===window&&"process-tick"===e.data&&(e.stopPropagation(),n.length>0)){var t=n.shift();t()}},!0),function(e){n.push(e),window.postMessage("process-tick","*")}}return function(e){setTimeout(e,0)}}(),n.title="browser",n.browser=!0,n.env={},n.argv=[],n.binding=function(){throw new Error("process.binding is not supported")},n.cwd=function(){return"/"},n.chdir=function(){throw new Error("process.chdir is not supported")}},{}],18:[function(require,module,exports){"use strict";function MapReduce(db){function viewQuery(fun,options){function sum(e){return e.reduce(function(e,t){return e+t -},0)}function emit(e,t){var n={id:current.doc._id,key:e,value:t};if(!(options.startkey&&pouchCollate(e,options.startkey)<0||options.endkey&&pouchCollate(e,options.endkey)>0||options.key&&0!==pouchCollate(e,options.key))){if(num_started++,options.include_docs){if(t&&"object"==typeof t&&t._id)return db.get(t._id,function(e,t){t&&(n.doc=t),results.push(n),checkComplete()}),void 0;n.doc=current.doc}results.push(n)}}function checkComplete(){if(completed&&results.length==num_started){if(results.sort(function(e,t){return pouchCollate(e.key,t.key)}),options.descending&&results.reverse(),options.reduce===!1)return options.complete(null,{total_rows:results.length,offset:options.skip,rows:"limit"in options?results.slice(options.skip,options.limit+options.skip):options.skip>0?results.slice(options.skip):results});var e=[];results.forEach(function(t){var n=e[e.length-1]||null;return n&&0===pouchCollate(n.key[0][0],t.key)?(n.key.push([t.key,t.id]),n.value.push(t.value),void 0):(e.push({key:[[t.key,t.id]],value:[t.value]}),void 0)}),e.forEach(function(e){e.value=fun.reduce(e.key,e.value),e.value="undefined"==typeof e.value?null:e.value,e.key=e.key[0][0]}),options.complete(null,{total_rows:e.length,offset:options.skip,rows:"limit"in options?e.slice(options.skip,options.limit+options.skip):options.skip>0?e.slice(options.skip):e})}}if(options.complete){options.skip||(options.skip=0),fun.reduce||(options.reduce=!1);var builtInReduce={_sum:function(e,t){return sum(t)},_count:function(e,t,n){return n?sum(t):t.length},_stats:function(e,t){return{sum:sum(t),min:Math.min.apply(null,t),max:Math.max.apply(null,t),count:t.length,sumsqr:function(){var e=0;for(var n in t)"number"==typeof t[n]&&(e+=t[n]*t[n]);return e}()}}},results=[],current=null,num_started=0,completed=!1;eval("fun.map = "+fun.map.toString()+";"),fun.reduce&&(builtInReduce[fun.reduce]&&(fun.reduce=builtInReduce[fun.reduce]),eval("fun.reduce = "+fun.reduce.toString()+";")),db.changes({conflicts:!0,include_docs:!0,onChange:function(e){"deleted"in e||(current={doc:e.doc},fun.map.call(this,e.doc))},complete:function(){completed=!0,checkComplete()}})}}function httpQuery(e,t,n){var r=[],o=void 0,i="GET";if("undefined"!=typeof t.reduce&&r.push("reduce="+t.reduce),"undefined"!=typeof t.include_docs&&r.push("include_docs="+t.include_docs),"undefined"!=typeof t.limit&&r.push("limit="+t.limit),"undefined"!=typeof t.descending&&r.push("descending="+t.descending),"undefined"!=typeof t.startkey&&r.push("startkey="+encodeURIComponent(JSON.stringify(t.startkey))),"undefined"!=typeof t.endkey&&r.push("endkey="+encodeURIComponent(JSON.stringify(t.endkey))),"undefined"!=typeof t.key&&r.push("key="+encodeURIComponent(JSON.stringify(t.key))),"undefined"!=typeof t.group&&r.push("group="+t.group),"undefined"!=typeof t.group_level&&r.push("group_level="+t.group_level),"undefined"!=typeof t.skip&&r.push("skip="+t.skip),"undefined"!=typeof t.keys&&(i="POST",o=JSON.stringify({keys:t.keys})),r=r.join("&"),r=""===r?"":"?"+r,"string"==typeof e){var a=e.split("/");return db.request({method:i,url:"_design/"+a[0]+"/_view/"+a[1]+r,body:o},n),void 0}var s=JSON.parse(JSON.stringify(e,function(e,t){return"function"==typeof t?t+"":t}));db.request({method:"POST",url:"_temp_view"+r,body:s},n)}return this instanceof MapReduce?(this.query=function(e,t,n){if("function"==typeof t&&(n=t,t={}),n&&(t.complete=n),"http"===db.type())return"function"==typeof e?httpQuery({map:e},t,n):httpQuery(e,t,n);if("object"==typeof e)return viewQuery(e,t);if("function"==typeof e)return viewQuery({map:e},t);var r=e.split("/");db.get("_design/"+r[0],function(e,o){return e?(n&&n(e),void 0):o.views[r[1]]?(viewQuery({map:o.views[r[1]].map,reduce:o.views[r[1]].reduce},t),void 0):(n&&n({error:"not_found",reason:"missing_named_view"}),void 0)})},void 0):new MapReduce(db)}var pouchCollate=require("pouchdb-collate");MapReduce._delete=function(){},module.exports=MapReduce},{"pouchdb-collate":19}],19:[function(e,t){"use strict";function n(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++){var o=a(e[r],t[r]);if(0!==o)return o}return e.length===t.length?0:e.length>t.length?1:-1}function r(e,t){return e===t?0:e>t?1:-1}function o(e,t){for(var n=Object.keys(e),r=Object.keys(t),o=Math.min(n.length,r.length),i=0;o>i;i++){var s=a(n[i],r[i]);if(0!==s)return s;if(s=a(e[n[i]],t[r[i]]),0!==s)return s}return n.length===r.length?0:n.length>r.length?1:-1}function i(e){var t=["boolean","number","string","object"];return-1!==t.indexOf(typeof e)?null===e?1:t.indexOf(typeof e)+2:Array.isArray(e)?4.5:void 0}function a(e,t){var a=i(e),s=i(t);return a-s!==0?a-s:null===e?0:"number"==typeof e?e-t:"boolean"==typeof e?t>e?-1:1:"string"==typeof e?r(e,t):Array.isArray(e)?n(e,t):"object"==typeof e?o(e,t):void 0}t.exports=a},{}]},{},[11])(11)}); \ No newline at end of file diff --git a/examples/application-server-boilerplate/public/styles/base.css b/examples/application-server-boilerplate/public/styles/base.css deleted file mode 100644 index 4a05fc23..00000000 --- a/examples/application-server-boilerplate/public/styles/base.css +++ /dev/null @@ -1,424 +0,0 @@ -html, -body { - margin: 0; - padding: 0; -} - -button { - margin: 0; - padding: 0; - border: 0; - background: none; - font-size: 100%; - vertical-align: baseline; - font-family: inherit; - color: inherit; - -webkit-appearance: none; - /*-moz-appearance: none;*/ - -ms-appearance: none; - -o-appearance: none; - appearance: none; -} - -body { - font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif; - line-height: 1.4em; - background: #eaeaea url('../images/bg.png'); - color: #4d4d4d; - width: 550px; - margin: 0 auto; - -webkit-font-smoothing: antialiased; - -moz-font-smoothing: antialiased; - -ms-font-smoothing: antialiased; - -o-font-smoothing: antialiased; - font-smoothing: antialiased; -} - -#todoapp { - background: #fff; - background: rgba(255, 255, 255, 0.9); - margin: 130px 0 40px 0; - border: 1px solid #ccc; - position: relative; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2), - 0 25px 50px 0 rgba(0, 0, 0, 0.15); -} - -#todoapp:before { - content: ''; - border-left: 1px solid #f5d6d6; - border-right: 1px solid #f5d6d6; - width: 2px; - position: absolute; - top: 0; - left: 40px; - height: 100%; -} - -#todoapp input::-webkit-input-placeholder { - font-style: italic; -} - -#todoapp input:-moz-placeholder { - font-style: italic; - color: #a9a9a9; -} - -#todoapp h1 { - position: absolute; - top: -120px; - width: 100%; - font-size: 70px; - font-weight: bold; - text-align: center; - color: #b3b3b3; - color: rgba(255, 255, 255, 0.3); - text-shadow: -1px -1px rgba(0, 0, 0, 0.2); - -webkit-text-rendering: optimizeLegibility; - -moz-text-rendering: optimizeLegibility; - -ms-text-rendering: optimizeLegibility; - -o-text-rendering: optimizeLegibility; - text-rendering: optimizeLegibility; -} - -#header { - padding-top: 15px; - border-radius: inherit; -} - -#header:before { - content: ''; - position: absolute; - top: 0; - right: 0; - left: 0; - height: 15px; - z-index: 2; - border-bottom: 1px solid #6c615c; - background: #8d7d77; - background: -webkit-gradient(linear, left top, left bottom, from(rgba(132, 110, 100, 0.8)),to(rgba(101, 84, 76, 0.8))); - background: -webkit-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); - background: -moz-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); - background: -o-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); - background: -ms-linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); - background: linear-gradient(top, rgba(132, 110, 100, 0.8), rgba(101, 84, 76, 0.8)); - filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670'); - border-top-left-radius: 1px; - border-top-right-radius: 1px; -} - -#new-todo, -.edit { - position: relative; - margin: 0; - width: 100%; - font-size: 24px; - font-family: inherit; - line-height: 1.4em; - border: 0; - outline: none; - color: inherit; - padding: 6px; - border: 1px solid #999; - box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - -webkit-font-smoothing: antialiased; - -moz-font-smoothing: antialiased; - -ms-font-smoothing: antialiased; - -o-font-smoothing: antialiased; - font-smoothing: antialiased; -} - -#new-todo { - padding: 16px 16px 16px 60px; - border: none; - background: rgba(0, 0, 0, 0.02); - z-index: 2; - box-shadow: none; -} - -#main { - position: relative; - z-index: 2; - border-top: 1px dotted #adadad; -} - -label[for='toggle-all'] { - display: none; -} - -#toggle-all { - position: absolute; - top: -42px; - left: -4px; - width: 40px; - text-align: center; - border: none; /* Mobile Safari */ -} - -#toggle-all:before { - content: '»'; - font-size: 28px; - color: #d9d9d9; - padding: 0 25px 7px; -} - -#toggle-all:checked:before { - color: #737373; -} - -#todo-list { - margin: 0; - padding: 0; - list-style: none; -} - -#todo-list li { - position: relative; - font-size: 24px; - border-bottom: 1px dotted #ccc; -} - -#todo-list li:last-child { - border-bottom: none; -} - -#todo-list li.editing { - border-bottom: none; - padding: 0; -} - -#todo-list li.editing .edit { - display: block; - width: 506px; - padding: 13px 17px 12px 17px; - margin: 0 0 0 43px; -} - -#todo-list li.editing .view { - display: none; -} - -#todo-list li .toggle { - text-align: center; - width: 40px; - /* auto, since non-WebKit browsers doesn't support input styling */ - height: auto; - position: absolute; - top: 0; - bottom: 0; - margin: auto 0; - border: none; /* Mobile Safari */ - -webkit-appearance: none; - /*-moz-appearance: none;*/ - -ms-appearance: none; - -o-appearance: none; - appearance: none; -} - -#todo-list li .toggle:after { - content: '✔'; - line-height: 43px; /* 40 + a couple of pixels visual adjustment */ - font-size: 20px; - color: #d9d9d9; - text-shadow: 0 -1px 0 #bfbfbf; -} - -#todo-list li .toggle:checked:after { - color: #85ada7; - text-shadow: 0 1px 0 #669991; - bottom: 1px; - position: relative; -} - -#todo-list li label { - word-break: break-word; - padding: 15px; - margin-left: 45px; - display: block; - line-height: 1.2; - -webkit-transition: color 0.4s; - -moz-transition: color 0.4s; - -ms-transition: color 0.4s; - -o-transition: color 0.4s; - transition: color 0.4s; -} - -#todo-list li.completed label { - color: #a9a9a9; - text-decoration: line-through; -} - -#todo-list li .destroy { - display: none; - position: absolute; - top: 0; - right: 10px; - bottom: 0; - width: 40px; - height: 40px; - margin: auto 0; - font-size: 22px; - color: #a88a8a; - -webkit-transition: all 0.2s; - -moz-transition: all 0.2s; - -ms-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; -} - -#todo-list li .destroy:hover { - text-shadow: 0 0 1px #000, 0 0 10px rgba(199, 107, 107, 0.8); - -webkit-transform: scale(1.3); - -moz-transform: scale(1.3); - -ms-transform: scale(1.3); - -o-transform: scale(1.3); - transform: scale(1.3); -} - -#todo-list li .destroy:after { - content: '✖'; -} - -#todo-list li:hover .destroy { - display: block; -} - -#todo-list li .edit { - display: none; -} - -#todo-list li.editing:last-child { - margin-bottom: -1px; -} - -#footer { - color: #777; - padding: 0 15px; - position: absolute; - right: 0; - bottom: -31px; - left: 0; - height: 20px; - z-index: 1; -} - -#footer:before { - content: ''; - position: absolute; - right: 0; - bottom: 31px; - left: 0; - height: 50px; - z-index: -1; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), - 0 6px 0 -3px rgba(255, 255, 255, 0.8), - 0 7px 1px -3px rgba(0, 0, 0, 0.3), - 0 43px 0 -6px rgba(255, 255, 255, 0.8), - 0 44px 2px -6px rgba(0, 0, 0, 0.2); -} - -#todo-count { - float: left; - text-align: left; -} - -#filters { - margin: 0; - padding: 0; - list-style: none; - position: absolute; - right: 0; - left: 0; -} - -#filters li { - display: inline; -} - -#filters li a { - color: #83756f; - margin: 2px; - text-decoration: none; -} - -#filters li a.selected { - font-weight: bold; -} - -#clear-completed { - float: right; - position: relative; - line-height: 20px; - text-decoration: none; - background: rgba(0, 0, 0, 0.1); - font-size: 11px; - padding: 0 10px; - border-radius: 3px; - box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.2); -} - -#clear-completed:hover { - background: rgba(0, 0, 0, 0.15); - box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.3); -} - -#info { - margin: 65px auto 0; - color: #a6a6a6; - font-size: 12px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7); - text-align: center; -} - -#info a { - color: inherit; -} - -/* - Hack to remove background from Mobile Safari. - Can't use it globally since it destroys checkboxes in Firefox and Opera -*/ -@media screen and (-webkit-min-device-pixel-ratio:0) { - #toggle-all, - #todo-list li .toggle { - background: none; - } - - #todo-list li .toggle { - height: 40px; - } - - #toggle-all { - top: -56px; - left: -15px; - width: 65px; - height: 41px; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - -webkit-appearance: none; - appearance: none; - } -} - -.hidden{ - display:none; -} - -#sync-error, #sync-success { - display: none; -} - -[data-sync-state=syncing] #sync-success { - display: block; -} - -[data-sync-state=error] #sync-error { - display: block; -} diff --git a/examples/application-server-boilerplate/.gitignore b/examples/todos/.gitignore similarity index 100% rename from examples/application-server-boilerplate/.gitignore rename to examples/todos/.gitignore diff --git a/examples/application-server-boilerplate/README.md b/examples/todos/README.md similarity index 100% rename from examples/application-server-boilerplate/README.md rename to examples/todos/README.md diff --git a/examples/todos/app.js b/examples/todos/app.js index 60fb7b05..a8e60a06 100644 --- a/examples/todos/app.js +++ b/examples/todos/app.js @@ -1,19 +1,38 @@ - -/** - * Module dependencies. - */ - -var express = require('express') - , path = require('path') - , morgan = require('morgan'); - +var http = require('axios'); +var read = require('read-yaml'); +var PouchDB = require('pouchdb'); +var express = require('express'); +var path = require('path'); var app = express(); +var config = read.sync('./config.yml'); +const DB_URL = `${config.protocol}${config.domain}:${config.port}${config.dbServerEndpoint}` +const DB_ADMIN_URL = `${config.protocol}${config.admin.username}:${config.admin.password}@${config.domain}:${config.port}${config.dbServerEndpoint}` + +app.use(config.dbServerEndpoint, require('express-pouchdb')(PouchDB.defaults({prefix: './db/'}))); +app.listen(config.port); -app.use(morgan('dev')); app.use(express.static(path.join(__dirname, 'public'))); -app.use('/db', require('../../')); +async function setup() { + + // Set up the admin user. + try { + await http.put(`${DB_URL}/_config/admins/${config.admin.username}`, `"${config.admin.password}"`, {headers:{}}); + console.log("Admin created."); + } + catch (err) { + console.log("We already have admins."); + } + + // Set up the app database. + try { + await http.put(`${DB_ADMIN_URL}/todos`); + console.log("Todos database created."); + } + catch (err) { + console.log("We already have an app database."); + } -app.listen(3000); -console.log("Express server listening on port " + 3000); +} +setup(); diff --git a/examples/application-server-boilerplate/config.yml b/examples/todos/config.yml similarity index 100% rename from examples/application-server-boilerplate/config.yml rename to examples/todos/config.yml diff --git a/examples/application-server-boilerplate/package.json b/examples/todos/package.json similarity index 60% rename from examples/application-server-boilerplate/package.json rename to examples/todos/package.json index 6363a4b8..db628262 100644 --- a/examples/application-server-boilerplate/package.json +++ b/examples/todos/package.json @@ -8,18 +8,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/rjsteinert/express-pouchdb-server-boilerplate.git" + "url": "" }, "keywords": [ "express-pouchdb", "pouchdb" ], - "author": "R.J. Steinert", + "author": "", "license": "ISC", - "bugs": { - "url": "https://github.com/rjsteinert/express-pouchdb-server-boilerplate/issues" - }, - "homepage": "https://github.com/rjsteinert/express-pouchdb-server-boilerplate#readme", "dependencies": { "axios": "^0.16.2", "express-pouchdb": "^2.3.7", diff --git a/examples/todos/public/scripts/app.js b/examples/todos/public/scripts/app.js index ba202611..99515d6e 100644 --- a/examples/todos/public/scripts/app.js +++ b/examples/todos/public/scripts/app.js @@ -9,7 +9,7 @@ // EDITING STARTS HERE (you dont need to edit anything above this line) var db = new PouchDB('todos'); - var remoteCouch = window.location.href + 'db/todos'; + var remoteCouch = window.location.origin + '/db/todos'; db.info(function(err, info) { db.changes({ From c830a915807353f2f5ff0158be19e71e3bda3585 Mon Sep 17 00:00:00 2001 From: "R.J. Steinert" Date: Wed, 28 Jun 2017 14:59:55 -0400 Subject: [PATCH 9/9] Update example readme --- examples/todos/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/todos/README.md b/examples/todos/README.md index c087d665..19d1e37a 100644 --- a/examples/todos/README.md +++ b/examples/todos/README.md @@ -4,5 +4,7 @@ Gets you set up with an express server with pouchdb, and admin user, and an app ## Install ``` npm install -node index.js +node app.js ``` + +Then go to http://127.0.0.1:3030/index.html