diff --git a/pinkyswear/pinkyswear-tests.ts b/pinkyswear/pinkyswear-tests.ts
new file mode 100644
index 000000000..450e9bc81
--- /dev/null
+++ b/pinkyswear/pinkyswear-tests.ts
@@ -0,0 +1,40 @@
+///
+
+var promise: PinkySwear.Promise = pinkySwear();
+
+promise.then(function(value) {
+ console.log("Success with value " + value + "1");
+}, function(value) {
+ console.log("Failure with value " + value + "!");
+});
+
+promise(true, [42]);
+
+// Promise rejected with multiple values
+
+promise = pinkySwear();
+
+promise.then(function(...values) {
+ console.log("Success with value " + Array.from(values).join(',') + "1");
+}, function(...values) {
+ console.log("Failure with value " + Array.from(values).join(',') + "!");
+});
+
+promise(false, [6, 6, 6]);
+
+var state: boolean = promise();
+
+// A PinkySwear-powered timeout function that returns a promise:
+
+function promiseTimeout(timeoutMs) {
+ var prom = pinkySwear();
+ setTimeout(function() {
+ prom(true, []);
+ }, timeoutMs);
+ return prom;
+}
+
+console.log('Starting timeout now.');
+promiseTimeout(5000).then(function() {
+ console.log('5s have passed.');
+});
diff --git a/pinkyswear/pinkyswear.d.ts b/pinkyswear/pinkyswear.d.ts
new file mode 100644
index 000000000..6cc3b9d64
--- /dev/null
+++ b/pinkyswear/pinkyswear.d.ts
@@ -0,0 +1,235 @@
+// Type definitions for PinkySwear v2.2.2
+// Project: https://github.com/timjansen/PinkySwear.js
+// Definitions by: Chance Snow
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+/*
+ * PinkySwear.js 2.2.2 - Minimalistic implementation of the Promises/A+ spec
+ *
+ * Public Domain. Use, modify and distribute it any way you like. No attribution required.
+ *
+ * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+*/
+
+declare module PinkySwear {
+
+ interface Promise {
+
+ /**
+ * Get the promise's current state; true if fulfilled, false if rejected, and undefined, otherwise.
+ */
+ (): boolean;
+
+ /**
+ * Fulfill or reject the promise.
+ *
+ * @param fulfilled true to fulfill promise, false to reject
+ * @param values Value(s) with which to fulfill or reject the promise
+ * @returns PinkySwear.Promise
+ */
+ (fulfilled: boolean, ...values: any[]): Promise;
+
+ /**
+ * Called when or if the promise is either resolved or rejected.
+ *
+ * @returns PinkySwear.Promise
+ */
+ then(): Promise;
+
+ /**
+ * Called when or if the promise is either resolved or rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: () => Promise, onRejected?: () => void): Promise;
+
+ /**
+ * Called when or if the promise is either resolved or rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: () => void, onRejected?: () => void): Promise;
+
+ /**
+ * Called when or if the promise is either resolved or rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: () => any, onRejected?: () => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => Promise, onRejected?: (...values: any[]) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => void, onRejected?: (...values: any[]) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => any, onRejected?: (...values: any[]) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => Promise, onRejected?: (error?: TypeError) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => void, onRejected?: (error: TypeError) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (...values: any[]) => any, onRejected?: (error: TypeError) => void): Promise;
+ }
+
+ interface GenericPromise extends Promise {
+
+ /**
+ * Fulfill or reject the promise.
+ *
+ * @param fulfilled true to fulfill promise, false to reject
+ * @param value Value with which to fulfill or reject the promise
+ */
+ (fulfilled: boolean, value: T): boolean;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.GenericPromise
+ */
+ then(onFulfilled?: (value: T) => G, onRejected?: (value: T) => void): GenericPromise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.GenericPromise
+ */
+ then(onFulfilled?: (value: T) => GenericPromise, onRejected?: (value: T) => void): GenericPromise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (value: T) => void, onRejected?: (value: T) => void): Promise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.GenericPromise
+ */
+ then(onFulfilled?: (value: T) => G, onRejected?: (error: TypeError) => void): GenericPromise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.GenericPromise
+ */
+ then(onFulfilled?: (value: T) => GenericPromise, onRejected?: (error: TypeError) => void): GenericPromise;
+
+ /**
+ * onFulfilled is called when or if the promise is resolved.
+ * onRejected is called when or if the promise is rejected.
+ *
+ * @param onFulfilled Called when or if the promise is resolved.
+ * @param onRejected Called when or if the promise is rejected.
+ * @returns PinkySwear.Promise
+ */
+ then(onFulfilled?: (value: T) => void, onRejected?: (error: TypeError) => void): Promise;
+ }
+}
+
+interface PinkySwearStatic {
+ /**
+ * Create a new generic promise in pending state that promises a value of a specific type and that also extends
+ * the returned generic promise object as specified in an extend function.
+ *
+ * @param extend Called when the promise is created and is ready to be extended.
+ * @returns PinkySwear.GenericPromise
+ */
+ (extend: (promise: PinkySwear.GenericPromise) => PinkySwear.GenericPromise): PinkySwear.GenericPromise;
+
+ /**
+ * Create a new generic promise in pending state that promises a value of a specific type.
+ *
+ * @see PinkySwear.GenericPromise
+ * @returns PinkySwear.GenericPromise
+ */
+ (): PinkySwear.GenericPromise;
+
+ /**
+ * Create a new promise in pending state that promises a value of a specific type and that also extends the
+ * returned promise object as specified in an extend function.
+ *
+ * @param extend Called when the promise is created and is ready to be extended.
+ * @returns PinkySwear.Promise
+ */
+ (extend: (promise: PinkySwear.Promise) => PinkySwear.Promise): PinkySwear.Promise;
+
+ /**
+ * Create a new promise in pending state that promises a value or set of values.
+ *
+ * @see PinkySwear.Promise
+ * @returns PinkySwear.Promise
+ */
+ (): PinkySwear.Promise;
+}
+
+declare var pinkySwear: PinkySwearStatic;