diff --git a/cradle/cradle-tests.ts b/cradle/cradle-tests.ts
new file mode 100644
index 000000000..655e92a87
--- /dev/null
+++ b/cradle/cradle-tests.ts
@@ -0,0 +1,185 @@
+///
+
+import cradle = require("cradle");
+
+cradle.setup({
+ host: 'living-room.couch',
+ cache: true,
+ raw: false,
+ forceSave: true
+});
+
+const connection = new cradle.Connection();
+const connection2 = new(cradle.Connection);
+const connection3 = new(cradle.Connection)('173.45.66.92');
+
+connection.databases(function(error, response) {});
+connection.config(function(error, response) {});
+connection.databases(function(error, response) {});
+connection.info(function(error, response) {});
+connection.stats(function(error, response) {});
+connection.activeTasks(function(error, response) {});
+connection.uuids(function(error, response) {});
+connection.uuids(10, function(error, response) {});
+connection.replicate({
+ source: "database",
+ target: "targetDatabase"
+}, function(error, response) {});
+
+const db = connection.database('starwars');
+
+db.exists(function (error, exists) {
+ if (error) {
+ console.log('error', error);
+ } else if (exists) {
+ console.log('the force is with you.');
+ } else {
+ console.log('database does not exists.');
+ db.create(function(error){
+ /* do something if there's an erroror */
+ /* populate design documents */
+ });
+ }
+});
+
+db.get<{
+ name: string;
+}>('vader', function (error, doc) {
+ doc.name; // 'Darth Vader'
+});
+
+db.get('luke', function (error, doc) {
+ doc.prop;
+});
+
+ db.get(['luke', 'vader'], function (error, doc) {
+ //
+ });
+
+db.save('skywalker', {
+ force: 'light',
+ name: 'Luke Skywalker'
+}, function (error, res) {
+ if (error) {
+ // Handle erroror
+ } else {
+ // Handle success
+ }
+});
+
+db.save({
+ force: 'dark', name: 'Darth'
+ }, function (err, res) {
+ // Handle response
+ });
+
+db.save('luke', '1-94B6F82', {
+ force: 'dark', name: 'Luke'
+}, function (err, res) {
+ // Handle response
+});
+
+db.save([
+ { name: 'Yoda' },
+ { name: 'Han Solo' },
+ { name: 'Leia' }
+], function (err, res) {
+ // Handle response
+});
+
+db.merge('luke', {jedi: true}, function (err, res) {
+ // Luke is now a jedi,
+ // but remains on the dark side of the force.
+});
+
+db.view('characters/all', function (err, res) {
+ res.forEach(function (row: any) {
+ console.log("%s is on the %s side of the force.", row.name, row.force);
+ });
+});
+
+db.view('characters/all', {group: true, reduce: true} , function (err, res) {
+ res.forEach(function (row: any) {
+ console.log("%s is on the %s side of the force.", row.name, row.force);
+ });
+ });
+
+ db.temporaryView({
+ map: function (doc: any) {
+ //
+ }
+ }, function (err, res) {
+ if (err) console.log(err);
+ console.log(res);
+ });
+
+db.remove('luke', '1-94B6F82', function (err, res) {
+ // Handle response
+});
+
+db.update('my_designdoc/update_handler_name', 'luke', undefined, { my_param: false }, function (err, res) {
+ // Handle the response, specified by the update handler
+});
+
+db.changes(function (err, list) {
+ list.forEach(function (change) { console.log(change) });
+});
+
+db.changes({ since: 42 }, function (err, list) {
+ //
+});
+
+const feed = db.changes({ since: 42 });
+
+feed.on('change', function (change: any) {
+ console.log(change);
+});
+
+const idAndRevData = {
+ id: 'luke',
+ rev: 'my-rev'
+};
+
+const attachmentData = {
+ name: 'fooAttachment.txt',
+ 'Content-Type': 'text/plain',
+ body: 'Foo document text'
+};
+
+db.saveAttachment(idAndRevData, attachmentData, function (err, reply) {
+ if (err) {
+ console.dir(err)
+ return
+ }
+ console.dir(reply)
+});
+
+
+db.getAttachment('luke', 'foo.txt', function (err, reply) {
+ if (err) {
+ console.dir(err);
+ return;
+ }
+ console.dir(reply);
+});
+
+db.removeAttachment('luke', 'foo.txt', function (err, reply) {
+ if (err) {
+ console.dir(err);
+ return;
+ }
+ console.dir(reply);
+});
+
+db.info(function(error, response) {});
+db.all(function(error, response) {});
+db.all({
+ body: {
+ keys: ['key1', 'key2']
+ }
+}, function(error, response) {});
+db.compact(function(error, response) {});
+db.compact('design', function(error, response) {});
+db.viewCleanup(function(error, response) {});
+db.replicate('database', function(error, response) {});
+db.replicate('database', {}, function(error, response) {});
diff --git a/cradle/cradle.d.ts b/cradle/cradle.d.ts
new file mode 100644
index 000000000..6434af26c
--- /dev/null
+++ b/cradle/cradle.d.ts
@@ -0,0 +1,122 @@
+// Type definitions for cradle
+// Project: https://github.com/flatiron/cradle
+// Definitions by: Panu Horsmalahti
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module "cradle" {
+ interface Options {
+ host?: string;
+ hostname?: string;
+ cache?: boolean;
+ raw?: boolean;
+ forceSave?: boolean;
+ auth?: string | {
+ username: string;
+ password: string;
+ }
+ ca?: string;
+ secure?: boolean;
+ retries?: number;
+ retryTimeout?: number;
+ maxSockets?: number;
+ }
+
+ interface Callback {
+ (error: any, response: any): void;
+ }
+
+ interface ErrorCallback {
+ (error: any): void;
+ }
+
+ export class Connection {
+ constructor(uri?: string, port?: number, options?: Options);
+ database(name: string): Database;
+ databases(Callback: Callback): void;
+ config(callback: Callback): void;
+ info(callback: Callback): void;
+ stats(callback: Callback): void;
+ activeTasks(callback: Callback): void;
+ uuids(callback: Callback): void;
+ uuids(count: number, callback: Callback): void;
+ replicate(options: {
+ source: string | {
+ url: string;
+ };
+ target: string | {
+ url: string;
+ };
+ cancel?: boolean;
+ continuous?: boolean;
+ create_target?: boolean;
+ doc_ids?: string[];
+ filter?: string;
+ proxy?: string;
+ query_params?: any;
+ }, callback: Callback): void;
+ }
+
+ export interface ChangesOptions {
+ since: number;
+ }
+
+ export class Database {
+ name: string;
+ get(id: string, callback: (error: any, document: any) => void): void;
+ get(id: string, callback: (error: any, document: T) => void): void;
+ get(id: string, rev: string, callback: (error: any, document: any) => void): void;
+ get(id: string, rev: string, callback: (error: any, document: T) => void): void;
+ get(ids: string[], callback: Callback): void;
+ save(document: any, callback: Callback): void;
+ save(id: string, document: any, callback: Callback): void;
+ save(id: string, revision: string, document: any,
+ callback: Callback): void;
+ save(document: T, callback: Callback): void;
+ save(id: string, document: T, callback: Callback): void;
+ save(id: string, revision: string, document: T,
+ callback: Callback): void;
+ save(documents: any[], callback: Callback): void;
+ merge(id: string, document: any, callback: Callback): void;
+ merge(id: string, document: T, callback: Callback): void;
+ remove(id: string, revision: string, callback: Callback): void;
+ update(name: string, id: string, queryObject: any, documentBody: any,
+ callback: Callback): void;
+ view(name: string, callback: Callback): void;
+ view(name: string, options: {
+ group?: boolean;
+ reduce?: boolean;
+ key?: string;
+ startkey?: any;
+ endkey?: any;
+ include_docs?: boolean;
+ limit?: number;
+ descending?: boolean;
+ }, callback: Callback): void;
+ temporaryView(view: any, callback: Callback): void;
+ create(callback: ErrorCallback): void;
+ exists(callback: (error: any, exists: boolean) => void): void;
+ destroy(callback: ErrorCallback): void;
+ changes(options: ChangesOptions): any;
+ changes(callback: (error: any, list: any[]) => void): void;
+ changes(options: ChangesOptions, callback: (error: any,
+ list: any[]) => void): void;
+ saveAttachment(idAndRevData: {
+ id: string;
+ rev: string;
+ }, attachmentData: any, callback: Callback): void;
+ getAttachment(id: string, attachmentName: string,
+ callback: Callback): void;
+ removeAttachment(id: string, attachmentName: string,
+ callback: Callback): void;
+ info(callback: Callback): void;
+ all(callback: Callback): void;
+ all(options: any, callback: Callback): void;
+ compact(callback: Callback): void;
+ compact(design: string, callback: Callback): void;
+ viewCleanup(callback: Callback): void;
+ replicate(target: string, callback: Callback): void;
+ replicate(target: string, options: any, callback: Callback): void;
+ }
+
+ export function setup(options: Options): void;
+}