diff --git a/pouchDB/pouch-0.1.d.ts b/pouchDB/pouch-0.1.d.ts
new file mode 100644
index 000000000..da380db7a
--- /dev/null
+++ b/pouchDB/pouch-0.1.d.ts
@@ -0,0 +1,216 @@
+// Type definitions for Pouch 0.1
+// Project: http://pouchdb.com
+// Definitions by: Bill Sears
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+interface PouchError {
+ status: number;
+ error: string;
+ reason: string;
+}
+
+interface PouchApi {
+ id(): string;
+}
+
+interface PouchInfoResponse {
+ db_name: string;
+ doc_count: number;
+ update_seq: string;
+}
+
+interface PouchApi {
+ info(callback: (err: PouchError, res: PouchInfoResponse) => void): void;
+}
+
+interface PouchGetOptions {
+ rev?: string;
+ revs?: bool;
+ revs_info?: bool;
+ conflicts?: bool;
+ attachments?: bool;
+}
+
+interface PouchGetResponse {
+ _id: string;
+ _rev: string;
+ _attachments: any;
+}
+
+interface PouchAllDocsOptions {
+ startkey?: string;
+ endKey?: string;
+ descending?: bool;
+ include_docs?: bool;
+ conflicts?: bool;
+}
+
+interface PouchAllDocsItem {
+ id: string;
+ key: string;
+ value: any;
+}
+
+interface PouchAllDocsResponse {
+ total_rows: number;
+ rows: PouchAllDocsItem[];
+}
+
+interface PouchApi {
+ //
+ // get == select by id
+ //
+ get(id: string, opts: PouchGetOptions, callback: (err: PouchError, res: PouchGetResponse) => void): void;
+ get(id: string, callback: (err: PouchError, res: PouchGetResponse) => void): void;
+ allDocs(opts: PouchAllDocsOptions, callback: (err: PouchError, res: PouchAllDocsResponse) => void): void;
+ allDocs(callback: (err: PouchError, res: PouchAllDocsResponse) => void): void;
+}
+
+interface PouchUpdateOptions {
+ new_edits: bool;
+}
+
+interface PouchUpdateResponse {
+ ok: bool;
+ id: string;
+ rev: string;
+}
+
+interface PouchApi {
+ bulkDocs(req, opts: PouchUpdateOptions, callback: (err: PouchError, res: PouchUpdateResponse[]) => void): void;
+ bulkDocs(req, callback: (err: PouchError, res: PouchUpdateResponse[]) => void): void;
+ //
+ // post == insert (doc does not contain an _id)
+ //
+ post(doc: any, opts: PouchUpdateOptions, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ post(doc: any, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ //
+ // put == update (doc DOES contain an _id)
+ //
+ put(doc, opts: PouchUpdateOptions, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ put(doc, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ //
+ // remove == delete
+ //
+ remove(doc, opts: PouchUpdateOptions, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ remove(doc, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+}
+
+interface PouchFilter {
+ map: (doc: any) => void;
+ reduce?: (key: string, value: any) => any;
+}
+
+interface PouchQueryOptions {
+ complete?: any;
+ include_docs?: bool;
+ error?: (err: PouchError) => void;
+ descending?: bool;
+ reduce?: bool;
+}
+
+interface PouchQueryResponse {
+ rows: any[];
+}
+
+interface PouchApi {
+ //
+ // query == select by other criteria
+ //
+ query(fun: string, opts: PouchQueryOptions, callback: (err: PouchError, res: PouchQueryResponse) => void): void;
+ query(fun: string, callback: (err: PouchError, res: PouchQueryResponse) => void): void;
+ query(fun: PouchFilter, opts: PouchQueryOptions, callback: (err: PouchError, res: PouchQueryResponse) => void): void;
+ query(fun: PouchFilter, callback: (err: PouchError, res: PouchQueryResponse) => void): void;
+}
+
+interface PouchAttachmentOptions {
+ decode?: bool;
+}
+
+interface PouchApi {
+ getAttachment(id: string, opts: PouchAttachmentOptions, callback: (err: PouchError, res: any) => void): void;
+ getAttachment(id: string, callback: (err: PouchError, res: any) => void): void;
+ putAttachment(id: string, rev: string, doc: any, type: string, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+ removeAttachment(id: string, rev: string, callback: (err: PouchError, res: PouchUpdateResponse) => void): void;
+}
+
+interface PouchCancellable {
+ cancel: () => void;
+}
+
+interface PouchChangesOptions {
+ onChange: (change: PouchChange) => void;
+ complete?: (err: PouchError, res: PouchChanges) => void;
+ seq?: number;
+ since?: number;
+ descending?: bool;
+ filter?: PouchFilter;
+ continuous?: bool;
+ include_docs?: bool;
+ conflicts?: bool;
+}
+
+interface PouchChange {
+ changes: any;
+ doc: PouchGetResponse;
+ id: string;
+ seq: number;
+}
+
+interface PouchChanges {
+ results: PouchChange[];
+}
+
+interface PouchApi {
+ changes(opts: PouchChangesOptions, callback: (err: PouchError, res: PouchChanges) => void): PouchCancellable;
+ changes(callback: (err: PouchError, res: PouchChanges) => void): PouchCancellable;
+}
+
+interface PouchRevsDiffOptions {
+}
+
+interface PouchReplicateOptions {
+ continuous?: bool;
+ onChange?: (any) => void;
+ filter?: any; // Can be either string or PouchFilter
+ complete?: (err: PouchError, res: PouchChanges) => void;
+}
+
+interface PouchReplicateResponse {
+ ok: bool;
+ start_time: Date;
+ end_time: Date;
+ docs_read: number;
+ docs_written: number;
+}
+
+interface PouchReplicate {
+ from(url: string, opts: PouchReplicateOptions, callback: (err: PouchError, res: PouchReplicateResponse) => void): PouchCancellable;
+ from(url: string, callback: (err: PouchError, res: PouchReplicateResponse) => void): PouchCancellable;
+ to(dbName: string, opts: PouchReplicateOptions, callback: (err: PouchError, res: PouchReplicateResponse) => void): PouchCancellable;
+ to(dbName: string, callback: (err: PouchError, res: PouchReplicateResponse) => void): PouchCancellable;
+}
+
+interface PouchApi {
+ revsDiff(req: any, opts: PouchRevsDiffOptions, callback: (missing: any) => void): void;
+ revsDiff(req: any, callback: (missing: any) => void): void;
+ replicate: PouchReplicate;
+}
+
+interface PouchOptions {
+ name?: string;
+ adapter?: string;
+}
+
+interface Pouch extends PouchApi {
+ (name: string, opts: PouchOptions, callback: (err: PouchError, res: Pouch) => void ): Pouch;
+ (name: string, callback: (err: PouchError, res: Pouch) => void ): Pouch;
+ destroy(name: string, callback: (err: PouchError) => void): void;
+}
+
+var Pouch: Pouch;
+//
+// emit is the function that the PouchFilter.map function should call in order to add a particular item to
+// a filter view.
+//
+declare function emit(key: any, value: any);
diff --git a/pouchDB/pouch-tests.ts b/pouchDB/pouch-tests.ts
new file mode 100644
index 000000000..e5dc7bbe6
--- /dev/null
+++ b/pouchDB/pouch-tests.ts
@@ -0,0 +1,142 @@
+///
+
+declare var $: any;
+
+function alert(thing: any) {
+ $('body').append('
' + thing + '
');
+}
+
+var pouch: Pouch;
+
+function pouchTests() {
+ Pouch('idb://testdb', function (err: PouchError, res: Pouch) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ pouch = res;
+ alert("database opened");
+ runTests();
+ }
+ });
+}
+
+var tests = [
+ setupTests,
+ testId,
+ testAllDocs,
+ testGet,
+ testUpdate,
+ testDelete,
+ deleteDb
+];
+
+var testIndex;
+
+var revs: any = {};
+
+function runTests() {
+ testIndex = 0;
+ tests[testIndex++]();
+}
+
+// each test function except the last one needs to call nextTest when it is finished doing its thing.
+function nextTest() {
+ alert("starting test " + testIndex);
+ tests[testIndex++]();
+}
+
+function setupTests() {
+ alert('setupTests');
+ pouch.bulkDocs({
+ docs: [{ _id: '1', name: 'record 1' },
+ { _id: '2', name: 'record 2' },
+ { _id: '3', name: 'record 3' }
+ ]
+ }, function (err: PouchError, res: PouchUpdateResponse[]) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ for (var i = 0; i < res.length; i++) {
+ if (res[i].ok) {
+ revs[res[i].id] = res[i].rev;
+ }
+ }
+ alert("test records loaded");
+ }
+ nextTest();
+ });
+}
+
+function testId() {
+ alert('testId');
+ var id = pouch.id();
+ alert('Database Id = ' + id);
+ nextTest();
+}
+
+function testGet() {
+ alert('testGet');
+ pouch.get('1', function (err: PouchError, res: PouchGetResponse) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ alert('Retrieved record with id=1, name=[' + res['name'] + ']');
+ }
+ nextTest();
+ });
+}
+
+function testAllDocs() {
+ alert('testAllDocs');
+ pouch.allDocs(function (err: PouchError, res: PouchAllDocsResponse) {
+ alert('allDocs resulted in ' + res.total_rows + ' results');
+ for (var i = 0; i < res.total_rows; i++) {
+ alert('Retrieved record with id=' + res.rows[i].id + ', rev=[' + res.rows[i].value.rev + ']');
+ }
+ nextTest();
+ });
+}
+
+function testUpdate() {
+ alert('testUpdate');
+ pouch.put({ _id: '2', _rev: revs['2'], name: 'record 2 updated' }, function (err: PouchError, res: PouchUpdateResponse) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ alert('record updated id=' + res.id + ', rev=[' + res.rev + ']');
+ }
+ testAllDocs(); // spit out the db contents and then go on
+ });
+}
+
+function testDelete() {
+ alert('testDelete');
+ pouch.remove({ _id: '3', _rev: revs['3'] }, function (err: PouchError, res: PouchUpdateResponse) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ alert('record deleted id=' + res.id + ', rev=[' + res.rev + ']');
+ }
+ testAllDocs(); // spit out the db contents and then go on
+ });
+}
+
+function deleteDb() {
+ alert('deleteDb');
+ if (pouch) {
+ pouch = null;
+ Pouch.destroy('idb://testdb', function (err: PouchError) {
+ if (err) {
+ alert('Error ' + err.status + ' occurred ' + err.error + ' - ' + err.reason);
+ }
+ else {
+ alert("database destroyed");
+ }
+ });
+ }
+}