Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
1414
gaia/apps/calendar/js/ext/alameda.js
Executable file
1414
gaia/apps/calendar/js/ext/alameda.js
Executable file
File diff suppressed because it is too large
Load diff
4087
gaia/apps/calendar/js/ext/caldav.js
Executable file
4087
gaia/apps/calendar/js/ext/caldav.js
Executable file
File diff suppressed because it is too large
Load diff
369
gaia/apps/calendar/js/ext/chai-as-promised.js
Executable file
369
gaia/apps/calendar/js/ext/chai-as-promised.js
Executable file
|
|
@ -0,0 +1,369 @@
|
|||
(function () {
|
||||
"use strict";
|
||||
|
||||
// Module systems magic dance.
|
||||
|
||||
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
|
||||
// NodeJS
|
||||
module.exports = chaiAsPromised;
|
||||
} else if (typeof define === "function" && define.amd) {
|
||||
// AMD
|
||||
define(function () {
|
||||
return chaiAsPromised;
|
||||
});
|
||||
} else {
|
||||
/*global self: false */
|
||||
|
||||
// Other environment (usually <script> tag): plug in to global chai instance directly.
|
||||
chai.use(chaiAsPromised);
|
||||
|
||||
// Expose as a property of the global object so that consumers can configure the `transferPromiseness` property.
|
||||
self.chaiAsPromised = chaiAsPromised;
|
||||
}
|
||||
|
||||
chaiAsPromised.transferPromiseness = function (assertion, promise) {
|
||||
assertion.then = promise.then.bind(promise);
|
||||
};
|
||||
|
||||
function chaiAsPromised(chai, utils) {
|
||||
var Assertion = chai.Assertion;
|
||||
var assert = chai.assert;
|
||||
|
||||
function isJQueryPromise(thenable) {
|
||||
return typeof thenable.always === "function" &&
|
||||
typeof thenable.done === "function" &&
|
||||
typeof thenable.fail === "function" &&
|
||||
typeof thenable.pipe === "function" &&
|
||||
typeof thenable.progress === "function" &&
|
||||
typeof thenable.state === "function";
|
||||
}
|
||||
|
||||
function assertIsAboutPromise(assertion) {
|
||||
if (typeof assertion._obj.then !== "function") {
|
||||
throw new TypeError(utils.inspect(assertion._obj) + " is not a thenable.");
|
||||
}
|
||||
if (isJQueryPromise(assertion._obj)) {
|
||||
throw new TypeError("Chai as Promised is incompatible with jQuery's thenables, sorry! Please use a " +
|
||||
"Promises/A+ compatible library (see http://promisesaplus.com/).");
|
||||
}
|
||||
}
|
||||
|
||||
function method(name, asserter) {
|
||||
utils.addMethod(Assertion.prototype, name, function () {
|
||||
assertIsAboutPromise(this);
|
||||
return asserter.apply(this, arguments);
|
||||
});
|
||||
}
|
||||
|
||||
function property(name, asserter) {
|
||||
utils.addProperty(Assertion.prototype, name, function () {
|
||||
assertIsAboutPromise(this);
|
||||
return asserter.apply(this, arguments);
|
||||
});
|
||||
}
|
||||
|
||||
function doNotify(promise, done) {
|
||||
promise.then(function () { done(); }, done);
|
||||
}
|
||||
|
||||
// These are for clarity and to bypass Chai refusing to allow `undefined` as actual when used with `assert`.
|
||||
function assertIfNegated(assertion, message, extra) {
|
||||
assertion.assert(true, null, message, extra.expected, extra.actual);
|
||||
}
|
||||
|
||||
function assertIfNotNegated(assertion, message, extra) {
|
||||
assertion.assert(false, message, null, extra.expected, extra.actual);
|
||||
}
|
||||
|
||||
function getBasePromise(assertion) {
|
||||
// We need to chain subsequent asserters on top of ones in the chain already (consider
|
||||
// `eventually.have.property("foo").that.equals("bar")`), only running them after the existing ones pass.
|
||||
// So the first base-promise is `assertion._obj`, but after that we use the assertions themselves, i.e.
|
||||
// previously derived promises, to chain off of.
|
||||
return typeof assertion.then === "function" ? assertion : assertion._obj;
|
||||
}
|
||||
|
||||
// Grab these first, before we modify `Assertion.prototype`.
|
||||
|
||||
var propertyNames = Object.getOwnPropertyNames(Assertion.prototype);
|
||||
|
||||
var propertyDescs = {};
|
||||
propertyNames.forEach(function (name) {
|
||||
propertyDescs[name] = Object.getOwnPropertyDescriptor(Assertion.prototype, name);
|
||||
});
|
||||
|
||||
property("fulfilled", function () {
|
||||
var that = this;
|
||||
var derivedPromise = getBasePromise(that).then(
|
||||
function (value) {
|
||||
that._obj = value;
|
||||
assertIfNegated(that,
|
||||
"expected promise not to be fulfilled but it was fulfilled with #{act}",
|
||||
{ actual: value });
|
||||
return value;
|
||||
},
|
||||
function (reason) {
|
||||
assertIfNotNegated(that,
|
||||
"expected promise to be fulfilled but it was rejected with #{act}",
|
||||
{ actual: reason });
|
||||
}
|
||||
);
|
||||
|
||||
chaiAsPromised.transferPromiseness(that, derivedPromise);
|
||||
});
|
||||
|
||||
property("rejected", function () {
|
||||
var that = this;
|
||||
var derivedPromise = getBasePromise(that).then(
|
||||
function (value) {
|
||||
that._obj = value;
|
||||
assertIfNotNegated(that,
|
||||
"expected promise to be rejected but it was fulfilled with #{act}",
|
||||
{ actual: value });
|
||||
return value;
|
||||
},
|
||||
function (reason) {
|
||||
assertIfNegated(that,
|
||||
"expected promise not to be rejected but it was rejected with #{act}",
|
||||
{ actual: reason });
|
||||
|
||||
// Return the reason, transforming this into a fulfillment, to allow further assertions, e.g.
|
||||
// `promise.should.be.rejected.and.eventually.equal("reason")`.
|
||||
return reason;
|
||||
}
|
||||
);
|
||||
|
||||
chaiAsPromised.transferPromiseness(that, derivedPromise);
|
||||
});
|
||||
|
||||
method("rejectedWith", function (Constructor, message) {
|
||||
var desiredReason = null;
|
||||
var constructorName = null;
|
||||
|
||||
if (Constructor instanceof RegExp || typeof Constructor === "string") {
|
||||
message = Constructor;
|
||||
Constructor = null;
|
||||
} else if (Constructor && Constructor instanceof Error) {
|
||||
desiredReason = Constructor;
|
||||
Constructor = null;
|
||||
message = null;
|
||||
} else if (typeof Constructor === "function") {
|
||||
constructorName = (new Constructor()).name;
|
||||
} else {
|
||||
Constructor = null;
|
||||
}
|
||||
|
||||
var that = this;
|
||||
var derivedPromise = getBasePromise(that).then(
|
||||
function (value) {
|
||||
var assertionMessage = null;
|
||||
var expected = null;
|
||||
|
||||
if (Constructor) {
|
||||
assertionMessage = "expected promise to be rejected with #{exp} but it was fulfilled with " +
|
||||
"#{act}";
|
||||
expected = constructorName;
|
||||
} else if (message) {
|
||||
var verb = message instanceof RegExp ? "matching" : "including";
|
||||
assertionMessage = "expected promise to be rejected with an error " + verb + " #{exp} but it " +
|
||||
"was fulfilled with #{act}";
|
||||
expected = message;
|
||||
} else if (desiredReason) {
|
||||
assertionMessage = "expected promise to be rejected with #{exp} but it was fulfilled with " +
|
||||
"#{act}";
|
||||
expected = desiredReason;
|
||||
}
|
||||
|
||||
that._obj = value;
|
||||
|
||||
assertIfNotNegated(that, assertionMessage, { expected: expected, actual: value });
|
||||
},
|
||||
function (reason) {
|
||||
if (Constructor) {
|
||||
that.assert(reason instanceof Constructor,
|
||||
"expected promise to be rejected with #{exp} but it was rejected with #{act}",
|
||||
"expected promise not to be rejected with #{exp} but it was rejected with #{act}",
|
||||
constructorName,
|
||||
reason);
|
||||
}
|
||||
|
||||
var reasonMessage = utils.type(reason) === "object" && "message" in reason ?
|
||||
reason.message :
|
||||
"" + reason;
|
||||
if (message && reasonMessage !== null && reasonMessage !== undefined) {
|
||||
if (message instanceof RegExp) {
|
||||
that.assert(message.test(reasonMessage),
|
||||
"expected promise to be rejected with an error matching #{exp} but got #{act}",
|
||||
"expected promise not to be rejected with an error matching #{exp}",
|
||||
message,
|
||||
reasonMessage);
|
||||
}
|
||||
if (typeof message === "string") {
|
||||
that.assert(reasonMessage.indexOf(message) !== -1,
|
||||
"expected promise to be rejected with an error including #{exp} but got #{act}",
|
||||
"expected promise not to be rejected with an error including #{exp}",
|
||||
message,
|
||||
reasonMessage);
|
||||
}
|
||||
}
|
||||
|
||||
if (desiredReason) {
|
||||
that.assert(reason === desiredReason,
|
||||
"expected promise to be rejected with #{exp} but it was rejected with #{act}",
|
||||
"expected promise not to be rejected with #{exp}",
|
||||
desiredReason,
|
||||
reason);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
chaiAsPromised.transferPromiseness(that, derivedPromise);
|
||||
});
|
||||
|
||||
property("eventually", function () {
|
||||
utils.flag(this, "eventually", true);
|
||||
});
|
||||
|
||||
method("notify", function (done) {
|
||||
doNotify(getBasePromise(this), done);
|
||||
});
|
||||
|
||||
method("become", function (value) {
|
||||
return this.eventually.deep.equal(value);
|
||||
});
|
||||
|
||||
////////
|
||||
// `eventually`
|
||||
|
||||
// We need to be careful not to trigger any getters, thus `Object.getOwnPropertyDescriptor` usage.
|
||||
var methodNames = propertyNames.filter(function (name) {
|
||||
return name !== "assert" && typeof propertyDescs[name].value === "function";
|
||||
});
|
||||
|
||||
methodNames.forEach(function (methodName) {
|
||||
Assertion.overwriteMethod(methodName, function (originalMethod) {
|
||||
return function () {
|
||||
doAsserterAsyncAndAddThen(originalMethod, this, arguments);
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
var getterNames = propertyNames.filter(function (name) {
|
||||
return name !== "_obj" && typeof propertyDescs[name].get === "function";
|
||||
});
|
||||
|
||||
getterNames.forEach(function (getterName) {
|
||||
var propertyDesc = propertyDescs[getterName];
|
||||
|
||||
// Chainable methods are things like `an`, which can work both for `.should.be.an.instanceOf` and as
|
||||
// `should.be.an("object")`. We need to handle those specially.
|
||||
var isChainableMethod = false;
|
||||
try {
|
||||
isChainableMethod = typeof propertyDesc.get.call({}) === "function";
|
||||
} catch (e) { }
|
||||
|
||||
if (isChainableMethod) {
|
||||
Assertion.addChainableMethod(
|
||||
getterName,
|
||||
function () {
|
||||
var assertion = this;
|
||||
function originalMethod() {
|
||||
return propertyDesc.get.call(assertion).apply(assertion, arguments);
|
||||
}
|
||||
doAsserterAsyncAndAddThen(originalMethod, this, arguments);
|
||||
},
|
||||
function () {
|
||||
var originalGetter = propertyDesc.get;
|
||||
doAsserterAsyncAndAddThen(originalGetter, this);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
Assertion.overwriteProperty(getterName, function (originalGetter) {
|
||||
return function () {
|
||||
doAsserterAsyncAndAddThen(originalGetter, this);
|
||||
};
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function doAsserterAsyncAndAddThen(asserter, assertion, args) {
|
||||
// Since we're intercepting all methods/properties, we need to just pass through if they don't want
|
||||
// `eventually`, or if we've already fulfilled the promise (see below).
|
||||
if (!utils.flag(assertion, "eventually")) {
|
||||
return asserter.apply(assertion, args);
|
||||
}
|
||||
|
||||
var derivedPromise = getBasePromise(assertion).then(function (value) {
|
||||
// Set up the environment for the asserter to actually run: `_obj` should be the fulfillment value, and
|
||||
// now that we have the value, we're no longer in "eventually" mode, so we won't run any of this code,
|
||||
// just the base Chai code that we get to via the short-circuit above.
|
||||
assertion._obj = value;
|
||||
utils.flag(assertion, "eventually", false);
|
||||
asserter.apply(assertion, args);
|
||||
|
||||
// Because asserters, for example `property`, can change the value of `_obj` (i.e. change the "object"
|
||||
// flag), we need to communicate this value change to subsequent chained asserters. Since we build a
|
||||
// promise chain paralleling the asserter chain, we can use it to communicate such changes.
|
||||
return assertion._obj;
|
||||
});
|
||||
|
||||
chaiAsPromised.transferPromiseness(assertion, derivedPromise);
|
||||
}
|
||||
|
||||
///////
|
||||
// Now use the `Assertion` framework to build an `assert` interface.
|
||||
var originalAssertMethods = Object.getOwnPropertyNames(assert).filter(function (propName) {
|
||||
return typeof assert[propName] === "function";
|
||||
});
|
||||
|
||||
assert.isFulfilled = function (promise, message) {
|
||||
return (new Assertion(promise, message)).to.be.fulfilled;
|
||||
};
|
||||
|
||||
assert.isRejected = function (promise, toTestAgainst, message) {
|
||||
if (typeof toTestAgainst === "string") {
|
||||
message = toTestAgainst;
|
||||
toTestAgainst = undefined;
|
||||
}
|
||||
|
||||
var assertion = (new Assertion(promise, message));
|
||||
return toTestAgainst !== undefined ? assertion.to.be.rejectedWith(toTestAgainst) : assertion.to.be.rejected;
|
||||
};
|
||||
|
||||
assert.becomes = function (promise, value, message) {
|
||||
return assert.eventually.deepEqual(promise, value, message);
|
||||
};
|
||||
|
||||
assert.doesNotBecome = function (promise, value, message) {
|
||||
return assert.eventually.notDeepEqual(promise, value, message);
|
||||
};
|
||||
|
||||
assert.eventually = {};
|
||||
originalAssertMethods.forEach(function (assertMethodName) {
|
||||
assert.eventually[assertMethodName] = function (promise) {
|
||||
var otherArgs = Array.prototype.slice.call(arguments, 1);
|
||||
|
||||
var customRejectionHandler;
|
||||
var message = arguments[assert[assertMethodName].length - 1];
|
||||
if (typeof message === "string") {
|
||||
customRejectionHandler = function (reason) {
|
||||
throw new chai.AssertionError(message + "\n\nOriginal reason: " + utils.inspect(reason));
|
||||
};
|
||||
}
|
||||
|
||||
var returnedPromise = promise.then(
|
||||
function (fulfillmentValue) {
|
||||
return assert[assertMethodName].apply(assert, [fulfillmentValue].concat(otherArgs));
|
||||
},
|
||||
customRejectionHandler
|
||||
);
|
||||
|
||||
returnedPromise.notify = function (done) {
|
||||
doNotify(returnedPromise, done);
|
||||
};
|
||||
|
||||
return returnedPromise;
|
||||
};
|
||||
});
|
||||
}
|
||||
}());
|
||||
4804
gaia/apps/calendar/js/ext/chai.js
Executable file
4804
gaia/apps/calendar/js/ext/chai.js
Executable file
File diff suppressed because it is too large
Load diff
240
gaia/apps/calendar/js/ext/co.js
Executable file
240
gaia/apps/calendar/js/ext/co.js
Executable file
|
|
@ -0,0 +1,240 @@
|
|||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.co=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
|
||||
/**
|
||||
* slice() reference.
|
||||
*/
|
||||
|
||||
var slice = Array.prototype.slice;
|
||||
|
||||
/**
|
||||
* Expose `co`.
|
||||
*/
|
||||
|
||||
module.exports = co['default'] = co.co = co;
|
||||
|
||||
/**
|
||||
* Wrap the given generator `fn` into a
|
||||
* function that returns a promise.
|
||||
* This is a separate function so that
|
||||
* every `co()` call doesn't create a new,
|
||||
* unnecessary closure.
|
||||
*
|
||||
* @param {GeneratorFunction} fn
|
||||
* @return {Function}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
co.wrap = function (fn) {
|
||||
createPromise.__generatorFunction__ = fn;
|
||||
return createPromise;
|
||||
function createPromise() {
|
||||
return co.call(this, fn.apply(this, arguments));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Execute the generator function or a generator
|
||||
* and return a promise.
|
||||
*
|
||||
* @param {Function} fn
|
||||
* @return {Promise}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function co(gen) {
|
||||
var ctx = this;
|
||||
|
||||
// we wrap everything in a promise to avoid promise chaining,
|
||||
// which leads to memory leak errors.
|
||||
// see https://github.com/tj/co/issues/180
|
||||
return new Promise(function(resolve, reject) {
|
||||
if (typeof gen === 'function') gen = gen.call(ctx);
|
||||
if (!gen || typeof gen.next !== 'function') return resolve(gen);
|
||||
|
||||
onFulfilled();
|
||||
|
||||
/**
|
||||
* @param {Mixed} res
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function onFulfilled(res) {
|
||||
var ret;
|
||||
try {
|
||||
ret = gen.next(res);
|
||||
} catch (e) {
|
||||
return reject(e);
|
||||
}
|
||||
next(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Error} err
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function onRejected(err) {
|
||||
var ret;
|
||||
try {
|
||||
ret = gen.throw(err);
|
||||
} catch (e) {
|
||||
return reject(e);
|
||||
}
|
||||
next(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next value in the generator,
|
||||
* return a promise.
|
||||
*
|
||||
* @param {Object} ret
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function next(ret) {
|
||||
if (ret.done) return resolve(ret.value);
|
||||
var value = toPromise.call(ctx, ret.value);
|
||||
if (value && isPromise(value)) return value.then(onFulfilled, onRejected);
|
||||
return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
|
||||
+ 'but the following object was passed: "' + String(ret.value) + '"'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a `yield`ed value into a promise.
|
||||
*
|
||||
* @param {Mixed} obj
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function toPromise(obj) {
|
||||
if (!obj) return obj;
|
||||
if (isPromise(obj)) return obj;
|
||||
if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
|
||||
if ('function' == typeof obj) return thunkToPromise.call(this, obj);
|
||||
if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
|
||||
if (isObject(obj)) return objectToPromise.call(this, obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a thunk to a promise.
|
||||
*
|
||||
* @param {Function}
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function thunkToPromise(fn) {
|
||||
var ctx = this;
|
||||
return new Promise(function (resolve, reject) {
|
||||
fn.call(ctx, function (err, res) {
|
||||
if (err) return reject(err);
|
||||
if (arguments.length > 2) res = slice.call(arguments, 1);
|
||||
resolve(res);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of "yieldables" to a promise.
|
||||
* Uses `Promise.all()` internally.
|
||||
*
|
||||
* @param {Array} obj
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function arrayToPromise(obj) {
|
||||
return Promise.all(obj.map(toPromise, this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an object of "yieldables" to a promise.
|
||||
* Uses `Promise.all()` internally.
|
||||
*
|
||||
* @param {Object} obj
|
||||
* @return {Promise}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function objectToPromise(obj){
|
||||
var results = new obj.constructor();
|
||||
var keys = Object.keys(obj);
|
||||
var promises = [];
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
var key = keys[i];
|
||||
var promise = toPromise.call(this, obj[key]);
|
||||
if (promise && isPromise(promise)) defer(promise, key);
|
||||
else results[key] = obj[key];
|
||||
}
|
||||
return Promise.all(promises).then(function () {
|
||||
return results;
|
||||
});
|
||||
|
||||
function defer(promise, key) {
|
||||
// predefine the key in the result
|
||||
results[key] = undefined;
|
||||
promises.push(promise.then(function (res) {
|
||||
results[key] = res;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if `obj` is a promise.
|
||||
*
|
||||
* @param {Object} obj
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function isPromise(obj) {
|
||||
return 'function' == typeof obj.then;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if `obj` is a generator.
|
||||
*
|
||||
* @param {Mixed} obj
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function isGenerator(obj) {
|
||||
return 'function' == typeof obj.next && 'function' == typeof obj.throw;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if `obj` is a generator function.
|
||||
*
|
||||
* @param {Mixed} obj
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
function isGeneratorFunction(obj) {
|
||||
var constructor = obj.constructor;
|
||||
if (!constructor) return false;
|
||||
if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;
|
||||
return isGenerator(constructor.prototype);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for plain object.
|
||||
*
|
||||
* @param {Mixed} val
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function isObject(val) {
|
||||
return Object == val.constructor;
|
||||
}
|
||||
|
||||
},{}]},{},[1])(1)
|
||||
});
|
||||
1367
gaia/apps/calendar/js/ext/curl.js
Executable file
1367
gaia/apps/calendar/js/ext/curl.js
Executable file
File diff suppressed because it is too large
Load diff
573
gaia/apps/calendar/js/ext/eventemitter2.js
Executable file
573
gaia/apps/calendar/js/ext/eventemitter2.js
Executable file
|
|
@ -0,0 +1,573 @@
|
|||
/*!
|
||||
* EventEmitter2
|
||||
* https://github.com/hij1nx/EventEmitter2
|
||||
*
|
||||
* Copyright (c) 2013 hij1nx
|
||||
* Licensed under the MIT license.
|
||||
*/
|
||||
;!function(undefined) {
|
||||
|
||||
var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {
|
||||
return Object.prototype.toString.call(obj) === "[object Array]";
|
||||
};
|
||||
var defaultMaxListeners = 10;
|
||||
|
||||
function init() {
|
||||
this._events = {};
|
||||
if (this._conf) {
|
||||
configure.call(this, this._conf);
|
||||
}
|
||||
}
|
||||
|
||||
function configure(conf) {
|
||||
if (conf) {
|
||||
|
||||
this._conf = conf;
|
||||
|
||||
conf.delimiter && (this.delimiter = conf.delimiter);
|
||||
conf.maxListeners && (this._events.maxListeners = conf.maxListeners);
|
||||
conf.wildcard && (this.wildcard = conf.wildcard);
|
||||
conf.newListener && (this.newListener = conf.newListener);
|
||||
|
||||
if (this.wildcard) {
|
||||
this.listenerTree = {};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function EventEmitter(conf) {
|
||||
this._events = {};
|
||||
this.newListener = false;
|
||||
configure.call(this, conf);
|
||||
}
|
||||
|
||||
//
|
||||
// Attention, function return type now is array, always !
|
||||
// It has zero elements if no any matches found and one or more
|
||||
// elements (leafs) if there are matches
|
||||
//
|
||||
function searchListenerTree(handlers, type, tree, i) {
|
||||
if (!tree) {
|
||||
return [];
|
||||
}
|
||||
var listeners=[], leaf, len, branch, xTree, xxTree, isolatedBranch, endReached,
|
||||
typeLength = type.length, currentType = type[i], nextType = type[i+1];
|
||||
if (i === typeLength && tree._listeners) {
|
||||
//
|
||||
// If at the end of the event(s) list and the tree has listeners
|
||||
// invoke those listeners.
|
||||
//
|
||||
if (typeof tree._listeners === 'function') {
|
||||
handlers && handlers.push(tree._listeners);
|
||||
return [tree];
|
||||
} else {
|
||||
for (leaf = 0, len = tree._listeners.length; leaf < len; leaf++) {
|
||||
handlers && handlers.push(tree._listeners[leaf]);
|
||||
}
|
||||
return [tree];
|
||||
}
|
||||
}
|
||||
|
||||
if ((currentType === '*' || currentType === '**') || tree[currentType]) {
|
||||
//
|
||||
// If the event emitted is '*' at this part
|
||||
// or there is a concrete match at this patch
|
||||
//
|
||||
if (currentType === '*') {
|
||||
for (branch in tree) {
|
||||
if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+1));
|
||||
}
|
||||
}
|
||||
return listeners;
|
||||
} else if(currentType === '**') {
|
||||
endReached = (i+1 === typeLength || (i+2 === typeLength && nextType === '*'));
|
||||
if(endReached && tree._listeners) {
|
||||
// The next element has a _listeners, add it to the handlers.
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree, typeLength));
|
||||
}
|
||||
|
||||
for (branch in tree) {
|
||||
if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {
|
||||
if(branch === '*' || branch === '**') {
|
||||
if(tree[branch]._listeners && !endReached) {
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], typeLength));
|
||||
}
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));
|
||||
} else if(branch === nextType) {
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+2));
|
||||
} else {
|
||||
// No match on this one, shift into the tree but not in the type array.
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));
|
||||
}
|
||||
}
|
||||
}
|
||||
return listeners;
|
||||
}
|
||||
|
||||
listeners = listeners.concat(searchListenerTree(handlers, type, tree[currentType], i+1));
|
||||
}
|
||||
|
||||
xTree = tree['*'];
|
||||
if (xTree) {
|
||||
//
|
||||
// If the listener tree will allow any match for this part,
|
||||
// then recursively explore all branches of the tree
|
||||
//
|
||||
searchListenerTree(handlers, type, xTree, i+1);
|
||||
}
|
||||
|
||||
xxTree = tree['**'];
|
||||
if(xxTree) {
|
||||
if(i < typeLength) {
|
||||
if(xxTree._listeners) {
|
||||
// If we have a listener on a '**', it will catch all, so add its handler.
|
||||
searchListenerTree(handlers, type, xxTree, typeLength);
|
||||
}
|
||||
|
||||
// Build arrays of matching next branches and others.
|
||||
for(branch in xxTree) {
|
||||
if(branch !== '_listeners' && xxTree.hasOwnProperty(branch)) {
|
||||
if(branch === nextType) {
|
||||
// We know the next element will match, so jump twice.
|
||||
searchListenerTree(handlers, type, xxTree[branch], i+2);
|
||||
} else if(branch === currentType) {
|
||||
// Current node matches, move into the tree.
|
||||
searchListenerTree(handlers, type, xxTree[branch], i+1);
|
||||
} else {
|
||||
isolatedBranch = {};
|
||||
isolatedBranch[branch] = xxTree[branch];
|
||||
searchListenerTree(handlers, type, { '**': isolatedBranch }, i+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(xxTree._listeners) {
|
||||
// We have reached the end and still on a '**'
|
||||
searchListenerTree(handlers, type, xxTree, typeLength);
|
||||
} else if(xxTree['*'] && xxTree['*']._listeners) {
|
||||
searchListenerTree(handlers, type, xxTree['*'], typeLength);
|
||||
}
|
||||
}
|
||||
|
||||
return listeners;
|
||||
}
|
||||
|
||||
function growListenerTree(type, listener) {
|
||||
|
||||
type = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
|
||||
|
||||
//
|
||||
// Looks for two consecutive '**', if so, don't add the event at all.
|
||||
//
|
||||
for(var i = 0, len = type.length; i+1 < len; i++) {
|
||||
if(type[i] === '**' && type[i+1] === '**') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var tree = this.listenerTree;
|
||||
var name = type.shift();
|
||||
|
||||
while (name) {
|
||||
|
||||
if (!tree[name]) {
|
||||
tree[name] = {};
|
||||
}
|
||||
|
||||
tree = tree[name];
|
||||
|
||||
if (type.length === 0) {
|
||||
|
||||
if (!tree._listeners) {
|
||||
tree._listeners = listener;
|
||||
}
|
||||
else if(typeof tree._listeners === 'function') {
|
||||
tree._listeners = [tree._listeners, listener];
|
||||
}
|
||||
else if (isArray(tree._listeners)) {
|
||||
|
||||
tree._listeners.push(listener);
|
||||
|
||||
if (!tree._listeners.warned) {
|
||||
|
||||
var m = defaultMaxListeners;
|
||||
|
||||
if (typeof this._events.maxListeners !== 'undefined') {
|
||||
m = this._events.maxListeners;
|
||||
}
|
||||
|
||||
if (m > 0 && tree._listeners.length > m) {
|
||||
|
||||
tree._listeners.warned = true;
|
||||
console.error('(node) warning: possible EventEmitter memory ' +
|
||||
'leak detected. %d listeners added. ' +
|
||||
'Use emitter.setMaxListeners() to increase limit.',
|
||||
tree._listeners.length);
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
name = type.shift();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// By default EventEmitters will print a warning if more than
|
||||
// 10 listeners are added to it. This is a useful default which
|
||||
// helps finding memory leaks.
|
||||
//
|
||||
// Obviously not all Emitters should be limited to 10. This function allows
|
||||
// that to be increased. Set to zero for unlimited.
|
||||
|
||||
EventEmitter.prototype.delimiter = '.';
|
||||
|
||||
EventEmitter.prototype.setMaxListeners = function(n) {
|
||||
this._events || init.call(this);
|
||||
this._events.maxListeners = n;
|
||||
if (!this._conf) this._conf = {};
|
||||
this._conf.maxListeners = n;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.event = '';
|
||||
|
||||
EventEmitter.prototype.once = function(event, fn) {
|
||||
this.many(event, 1, fn);
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.many = function(event, ttl, fn) {
|
||||
var self = this;
|
||||
|
||||
if (typeof fn !== 'function') {
|
||||
throw new Error('many only accepts instances of Function');
|
||||
}
|
||||
|
||||
function listener() {
|
||||
if (--ttl === 0) {
|
||||
self.off(event, listener);
|
||||
}
|
||||
fn.apply(this, arguments);
|
||||
}
|
||||
|
||||
listener._origin = fn;
|
||||
|
||||
this.on(event, listener);
|
||||
|
||||
return self;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.emit = function() {
|
||||
|
||||
this._events || init.call(this);
|
||||
|
||||
var type = arguments[0];
|
||||
|
||||
if (type === 'newListener' && !this.newListener) {
|
||||
if (!this._events.newListener) { return false; }
|
||||
}
|
||||
|
||||
// Loop through the *_all* functions and invoke them.
|
||||
if (this._all) {
|
||||
var l = arguments.length;
|
||||
var args = new Array(l - 1);
|
||||
for (var i = 1; i < l; i++) args[i - 1] = arguments[i];
|
||||
for (i = 0, l = this._all.length; i < l; i++) {
|
||||
this.event = type;
|
||||
this._all[i].apply(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
// If there is no 'error' event listener then throw.
|
||||
if (type === 'error') {
|
||||
|
||||
if (!this._all &&
|
||||
!this._events.error &&
|
||||
!(this.wildcard && this.listenerTree.error)) {
|
||||
|
||||
if (arguments[1] instanceof Error) {
|
||||
throw arguments[1]; // Unhandled 'error' event
|
||||
} else {
|
||||
throw new Error("Uncaught, unspecified 'error' event.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var handler;
|
||||
|
||||
if(this.wildcard) {
|
||||
handler = [];
|
||||
var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
|
||||
searchListenerTree.call(this, handler, ns, this.listenerTree, 0);
|
||||
}
|
||||
else {
|
||||
handler = this._events[type];
|
||||
}
|
||||
|
||||
if (typeof handler === 'function') {
|
||||
this.event = type;
|
||||
if (arguments.length === 1) {
|
||||
handler.call(this);
|
||||
}
|
||||
else if (arguments.length > 1)
|
||||
switch (arguments.length) {
|
||||
case 2:
|
||||
handler.call(this, arguments[1]);
|
||||
break;
|
||||
case 3:
|
||||
handler.call(this, arguments[1], arguments[2]);
|
||||
break;
|
||||
// slower
|
||||
default:
|
||||
var l = arguments.length;
|
||||
var args = new Array(l - 1);
|
||||
for (var i = 1; i < l; i++) args[i - 1] = arguments[i];
|
||||
handler.apply(this, args);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (handler) {
|
||||
var l = arguments.length;
|
||||
var args = new Array(l - 1);
|
||||
for (var i = 1; i < l; i++) args[i - 1] = arguments[i];
|
||||
|
||||
var listeners = handler.slice();
|
||||
for (var i = 0, l = listeners.length; i < l; i++) {
|
||||
this.event = type;
|
||||
listeners[i].apply(this, args);
|
||||
}
|
||||
return (listeners.length > 0) || !!this._all;
|
||||
}
|
||||
else {
|
||||
return !!this._all;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
EventEmitter.prototype.on = function(type, listener) {
|
||||
|
||||
if (typeof type === 'function') {
|
||||
this.onAny(type);
|
||||
return this;
|
||||
}
|
||||
|
||||
if (typeof listener !== 'function') {
|
||||
throw new Error('on only accepts instances of Function');
|
||||
}
|
||||
this._events || init.call(this);
|
||||
|
||||
// To avoid recursion in the case that type == "newListeners"! Before
|
||||
// adding it to the listeners, first emit "newListeners".
|
||||
this.emit('newListener', type, listener);
|
||||
|
||||
if(this.wildcard) {
|
||||
growListenerTree.call(this, type, listener);
|
||||
return this;
|
||||
}
|
||||
|
||||
if (!this._events[type]) {
|
||||
// Optimize the case of one listener. Don't need the extra array object.
|
||||
this._events[type] = listener;
|
||||
}
|
||||
else if(typeof this._events[type] === 'function') {
|
||||
// Adding the second element, need to change to array.
|
||||
this._events[type] = [this._events[type], listener];
|
||||
}
|
||||
else if (isArray(this._events[type])) {
|
||||
// If we've already got an array, just append.
|
||||
this._events[type].push(listener);
|
||||
|
||||
// Check for listener leak
|
||||
if (!this._events[type].warned) {
|
||||
|
||||
var m = defaultMaxListeners;
|
||||
|
||||
if (typeof this._events.maxListeners !== 'undefined') {
|
||||
m = this._events.maxListeners;
|
||||
}
|
||||
|
||||
if (m > 0 && this._events[type].length > m) {
|
||||
|
||||
this._events[type].warned = true;
|
||||
console.error('(node) warning: possible EventEmitter memory ' +
|
||||
'leak detected. %d listeners added. ' +
|
||||
'Use emitter.setMaxListeners() to increase limit.',
|
||||
this._events[type].length);
|
||||
console.trace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.onAny = function(fn) {
|
||||
|
||||
if (typeof fn !== 'function') {
|
||||
throw new Error('onAny only accepts instances of Function');
|
||||
}
|
||||
|
||||
if(!this._all) {
|
||||
this._all = [];
|
||||
}
|
||||
|
||||
// Add the function to the event listener collection.
|
||||
this._all.push(fn);
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||||
|
||||
EventEmitter.prototype.off = function(type, listener) {
|
||||
if (typeof listener !== 'function') {
|
||||
throw new Error('removeListener only takes instances of Function');
|
||||
}
|
||||
|
||||
var handlers,leafs=[];
|
||||
|
||||
if(this.wildcard) {
|
||||
var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
|
||||
leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);
|
||||
}
|
||||
else {
|
||||
// does not use listeners(), so no side effect of creating _events[type]
|
||||
if (!this._events[type]) return this;
|
||||
handlers = this._events[type];
|
||||
leafs.push({_listeners:handlers});
|
||||
}
|
||||
|
||||
for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {
|
||||
var leaf = leafs[iLeaf];
|
||||
handlers = leaf._listeners;
|
||||
if (isArray(handlers)) {
|
||||
|
||||
var position = -1;
|
||||
|
||||
for (var i = 0, length = handlers.length; i < length; i++) {
|
||||
if (handlers[i] === listener ||
|
||||
(handlers[i].listener && handlers[i].listener === listener) ||
|
||||
(handlers[i]._origin && handlers[i]._origin === listener)) {
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (position < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(this.wildcard) {
|
||||
leaf._listeners.splice(position, 1);
|
||||
}
|
||||
else {
|
||||
this._events[type].splice(position, 1);
|
||||
}
|
||||
|
||||
if (handlers.length === 0) {
|
||||
if(this.wildcard) {
|
||||
delete leaf._listeners;
|
||||
}
|
||||
else {
|
||||
delete this._events[type];
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
else if (handlers === listener ||
|
||||
(handlers.listener && handlers.listener === listener) ||
|
||||
(handlers._origin && handlers._origin === listener)) {
|
||||
if(this.wildcard) {
|
||||
delete leaf._listeners;
|
||||
}
|
||||
else {
|
||||
delete this._events[type];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.offAny = function(fn) {
|
||||
var i = 0, l = 0, fns;
|
||||
if (fn && this._all && this._all.length > 0) {
|
||||
fns = this._all;
|
||||
for(i = 0, l = fns.length; i < l; i++) {
|
||||
if(fn === fns[i]) {
|
||||
fns.splice(i, 1);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this._all = [];
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.removeListener = EventEmitter.prototype.off;
|
||||
|
||||
EventEmitter.prototype.removeAllListeners = function(type) {
|
||||
if (arguments.length === 0) {
|
||||
!this._events || init.call(this);
|
||||
return this;
|
||||
}
|
||||
|
||||
if(this.wildcard) {
|
||||
var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
|
||||
var leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);
|
||||
|
||||
for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {
|
||||
var leaf = leafs[iLeaf];
|
||||
leaf._listeners = null;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!this._events[type]) return this;
|
||||
this._events[type] = null;
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.listeners = function(type) {
|
||||
if(this.wildcard) {
|
||||
var handlers = [];
|
||||
var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();
|
||||
searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);
|
||||
return handlers;
|
||||
}
|
||||
|
||||
this._events || init.call(this);
|
||||
|
||||
if (!this._events[type]) this._events[type] = [];
|
||||
if (!isArray(this._events[type])) {
|
||||
this._events[type] = [this._events[type]];
|
||||
}
|
||||
return this._events[type];
|
||||
};
|
||||
|
||||
EventEmitter.prototype.listenersAny = function() {
|
||||
|
||||
if(this._all) {
|
||||
return this._all;
|
||||
}
|
||||
else {
|
||||
return [];
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(function() {
|
||||
return EventEmitter;
|
||||
});
|
||||
} else if (typeof exports === 'object') {
|
||||
// CommonJS
|
||||
exports.EventEmitter2 = EventEmitter;
|
||||
}
|
||||
else {
|
||||
// Browser global.
|
||||
window.EventEmitter2 = EventEmitter;
|
||||
}
|
||||
}();
|
||||
6671
gaia/apps/calendar/js/ext/ical.js
Executable file
6671
gaia/apps/calendar/js/ext/ical.js
Executable file
File diff suppressed because it is too large
Load diff
639
gaia/apps/calendar/js/ext/page.js
Executable file
639
gaia/apps/calendar/js/ext/page.js
Executable file
|
|
@ -0,0 +1,639 @@
|
|||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.page=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||
/* globals require, module */
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
var pathtoRegexp = require('path-to-regexp');
|
||||
|
||||
/**
|
||||
* Module exports.
|
||||
*/
|
||||
|
||||
module.exports = page;
|
||||
|
||||
/**
|
||||
* To work properly with the URL
|
||||
* history.location generated polyfill in https://github.com/devote/HTML5-History-API
|
||||
*/
|
||||
|
||||
var location = window.history.location || window.location;
|
||||
|
||||
/**
|
||||
* Perform initial dispatch.
|
||||
*/
|
||||
|
||||
var dispatch = true;
|
||||
|
||||
/**
|
||||
* Base path.
|
||||
*/
|
||||
|
||||
var base = '';
|
||||
|
||||
/**
|
||||
* Running flag.
|
||||
*/
|
||||
|
||||
var running;
|
||||
|
||||
/**
|
||||
* HashBang option
|
||||
*/
|
||||
|
||||
var hashbang = false;
|
||||
|
||||
/**
|
||||
* Register `path` with callback `fn()`,
|
||||
* or route `path`, or `page.start()`.
|
||||
*
|
||||
* page(fn);
|
||||
* page('*', fn);
|
||||
* page('/user/:id', load, user);
|
||||
* page('/user/' + user.id, { some: 'thing' });
|
||||
* page('/user/' + user.id);
|
||||
* page();
|
||||
*
|
||||
* @param {String|Function} path
|
||||
* @param {Function} fn...
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function page(path, fn) {
|
||||
// <callback>
|
||||
if ('function' === typeof path) {
|
||||
return page('*', path);
|
||||
}
|
||||
|
||||
// route <path> to <callback ...>
|
||||
if ('function' === typeof fn) {
|
||||
var route = new Route(path);
|
||||
for (var i = 1; i < arguments.length; ++i) {
|
||||
page.callbacks.push(route.middleware(arguments[i]));
|
||||
}
|
||||
// show <path> with [state]
|
||||
} else if ('string' == typeof path) {
|
||||
'string' === typeof fn
|
||||
? page.redirect(path, fn)
|
||||
: page.show(path, fn);
|
||||
// start [options]
|
||||
} else {
|
||||
page.start(path);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback functions.
|
||||
*/
|
||||
|
||||
page.callbacks = [];
|
||||
|
||||
/**
|
||||
* Get or set basepath to `path`.
|
||||
*
|
||||
* @param {String} path
|
||||
* @api public
|
||||
*/
|
||||
|
||||
page.base = function(path){
|
||||
if (0 === arguments.length) return base;
|
||||
base = path;
|
||||
};
|
||||
|
||||
/**
|
||||
* Bind with the given `options`.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `click` bind to click events [true]
|
||||
* - `popstate` bind to popstate [true]
|
||||
* - `dispatch` perform initial dispatch [true]
|
||||
*
|
||||
* @param {Object} options
|
||||
* @api public
|
||||
*/
|
||||
|
||||
page.start = function(options){
|
||||
options = options || {};
|
||||
if (running) return;
|
||||
running = true;
|
||||
if (false === options.dispatch) dispatch = false;
|
||||
if (false !== options.popstate) window.addEventListener('popstate', onpopstate, false);
|
||||
if (false !== options.click) window.addEventListener('click', onclick, false);
|
||||
if (true === options.hashbang) hashbang = true;
|
||||
if (!dispatch) return;
|
||||
var url = (hashbang && ~location.hash.indexOf('#!'))
|
||||
? location.hash.substr(2) + location.search
|
||||
: location.pathname + location.search + location.hash;
|
||||
page.replace(url, null, true, dispatch);
|
||||
};
|
||||
|
||||
/**
|
||||
* Unbind click and popstate event handlers.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
page.stop = function(){
|
||||
if (!running) return;
|
||||
running = false;
|
||||
window.removeEventListener('click', onclick, false);
|
||||
window.removeEventListener('popstate', onpopstate, false);
|
||||
};
|
||||
|
||||
/**
|
||||
* Show `path` with optional `state` object.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Object} state
|
||||
* @param {Boolean} dispatch
|
||||
* @return {Context}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
page.show = function(path, state, dispatch){
|
||||
var ctx = new Context(path, state);
|
||||
if (false !== dispatch) page.dispatch(ctx);
|
||||
if (false !== ctx.handled) ctx.pushState();
|
||||
return ctx;
|
||||
};
|
||||
|
||||
/**
|
||||
* Show `path` with optional `state` object.
|
||||
*
|
||||
* @param {String} from
|
||||
* @param {String} to
|
||||
* @api public
|
||||
*/
|
||||
page.redirect = function(from, to) {
|
||||
page(from, function (e) {
|
||||
setTimeout(function() {
|
||||
page.replace(to);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Replace `path` with optional `state` object.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Object} state
|
||||
* @return {Context}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
page.replace = function(path, state, init, dispatch){
|
||||
var ctx = new Context(path, state);
|
||||
ctx.init = init;
|
||||
ctx.save(); // save before dispatching, which may redirect
|
||||
if (false !== dispatch) page.dispatch(ctx);
|
||||
return ctx;
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispatch the given `ctx`.
|
||||
*
|
||||
* @param {Object} ctx
|
||||
* @api private
|
||||
*/
|
||||
|
||||
page.dispatch = function(ctx){
|
||||
var i = 0;
|
||||
|
||||
function next() {
|
||||
var fn = page.callbacks[i++];
|
||||
if (!fn) return unhandled(ctx);
|
||||
fn(ctx, next);
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
/**
|
||||
* Unhandled `ctx`. When it's not the initial
|
||||
* popstate then redirect. If you wish to handle
|
||||
* 404s on your own use `page('*', callback)`.
|
||||
*
|
||||
* @param {Context} ctx
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function unhandled(ctx) {
|
||||
if (ctx.handled) return;
|
||||
var current;
|
||||
|
||||
if (hashbang) {
|
||||
current = base + location.hash.replace('#!','');
|
||||
} else {
|
||||
current = location.pathname + location.search;
|
||||
}
|
||||
|
||||
if (current === ctx.canonicalPath) return;
|
||||
page.stop();
|
||||
ctx.handled = false;
|
||||
location.href = ctx.canonicalPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a new "request" `Context`
|
||||
* with the given `path` and optional initial `state`.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Object} state
|
||||
* @api public
|
||||
*/
|
||||
|
||||
function Context(path, state) {
|
||||
if ('/' === path[0] && 0 !== path.indexOf(base)) path = base + path;
|
||||
var i = path.indexOf('?');
|
||||
|
||||
this.canonicalPath = path;
|
||||
this.path = path.replace(base, '') || '/';
|
||||
|
||||
this.title = document.title;
|
||||
this.state = state || {};
|
||||
this.state.path = path;
|
||||
this.querystring = ~i
|
||||
? path.slice(i + 1)
|
||||
: '';
|
||||
this.pathname = ~i
|
||||
? path.slice(0, i)
|
||||
: path;
|
||||
this.params = [];
|
||||
|
||||
// fragment
|
||||
this.hash = '';
|
||||
if (!~this.path.indexOf('#')) return;
|
||||
var parts = this.path.split('#');
|
||||
this.path = parts[0];
|
||||
this.hash = parts[1] || '';
|
||||
this.querystring = this.querystring.split('#')[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose `Context`.
|
||||
*/
|
||||
|
||||
page.Context = Context;
|
||||
|
||||
/**
|
||||
* Push state.
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Context.prototype.pushState = function(){
|
||||
history.pushState(this.state
|
||||
, this.title
|
||||
, hashbang && this.path !== '/'
|
||||
? '#!' + this.path
|
||||
: this.canonicalPath);
|
||||
};
|
||||
|
||||
/**
|
||||
* Save the context state.
|
||||
*
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Context.prototype.save = function(){
|
||||
history.replaceState(this.state
|
||||
, this.title
|
||||
, hashbang && this.path !== '/'
|
||||
? '#!' + this.path
|
||||
: this.canonicalPath);
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize `Route` with the given HTTP `path`,
|
||||
* and an array of `callbacks` and `options`.
|
||||
*
|
||||
* Options:
|
||||
*
|
||||
* - `sensitive` enable case-sensitive routes
|
||||
* - `strict` enable strict matching for trailing slashes
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Object} options.
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function Route(path, options) {
|
||||
options = options || {};
|
||||
this.path = (path === '*') ? '(.*)' : path;
|
||||
this.method = 'GET';
|
||||
this.regexp = pathtoRegexp(this.path,
|
||||
this.keys = [],
|
||||
options.sensitive,
|
||||
options.strict);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose `Route`.
|
||||
*/
|
||||
|
||||
page.Route = Route;
|
||||
|
||||
/**
|
||||
* Return route middleware with
|
||||
* the given callback `fn()`.
|
||||
*
|
||||
* @param {Function} fn
|
||||
* @return {Function}
|
||||
* @api public
|
||||
*/
|
||||
|
||||
Route.prototype.middleware = function(fn){
|
||||
var self = this;
|
||||
return function(ctx, next){
|
||||
if (self.match(ctx.path, ctx.params)) return fn(ctx, next);
|
||||
next();
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if this route matches `path`, if so
|
||||
* populate `params`.
|
||||
*
|
||||
* @param {String} path
|
||||
* @param {Array} params
|
||||
* @return {Boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
Route.prototype.match = function(path, params){
|
||||
var keys = this.keys,
|
||||
qsIndex = path.indexOf('?'),
|
||||
pathname = ~qsIndex
|
||||
? path.slice(0, qsIndex)
|
||||
: path,
|
||||
m = this.regexp.exec(decodeURIComponent(pathname));
|
||||
|
||||
if (!m) return false;
|
||||
|
||||
for (var i = 1, len = m.length; i < len; ++i) {
|
||||
var key = keys[i - 1];
|
||||
|
||||
var val = 'string' === typeof m[i]
|
||||
? decodeURIComponent(m[i])
|
||||
: m[i];
|
||||
|
||||
if (key) {
|
||||
params[key.name] = undefined !== params[key.name]
|
||||
? params[key.name]
|
||||
: val;
|
||||
} else {
|
||||
params.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Handle "populate" events.
|
||||
*/
|
||||
|
||||
function onpopstate(e) {
|
||||
if (e.state) {
|
||||
var path = e.state.path;
|
||||
page.replace(path, e.state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "click" events.
|
||||
*/
|
||||
|
||||
function onclick(e) {
|
||||
if (1 != which(e)) return;
|
||||
if (e.metaKey || e.ctrlKey || e.shiftKey) return;
|
||||
if (e.defaultPrevented) return;
|
||||
|
||||
// ensure link
|
||||
var el = e.target;
|
||||
while (el && 'A' != el.nodeName) el = el.parentNode;
|
||||
if (!el || 'A' != el.nodeName) return;
|
||||
|
||||
// ensure non-hash for the same path
|
||||
var link = el.getAttribute('href');
|
||||
if (el.pathname === location.pathname && (el.hash || '#' === link)) return;
|
||||
|
||||
// Check for mailto: in the href
|
||||
if (link && link.indexOf("mailto:") > -1) return;
|
||||
|
||||
// check target
|
||||
if (el.target) return;
|
||||
|
||||
// x-origin
|
||||
if (!sameOrigin(el.href)) return;
|
||||
|
||||
// rebuild path
|
||||
var path = el.pathname + el.search + (el.hash || '');
|
||||
|
||||
// same page
|
||||
var orig = path;
|
||||
|
||||
path = path.replace(base, '');
|
||||
|
||||
if (base && orig === path) return;
|
||||
|
||||
e.preventDefault();
|
||||
page.show(orig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Event button.
|
||||
*/
|
||||
|
||||
function which(e) {
|
||||
e = e || window.event;
|
||||
return null === e.which
|
||||
? e.button
|
||||
: e.which;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if `href` is the same origin.
|
||||
*/
|
||||
|
||||
function sameOrigin(href) {
|
||||
var origin = location.protocol + '//' + location.hostname;
|
||||
if (location.port) origin += ':' + location.port;
|
||||
return (href && (0 === href.indexOf(origin)));
|
||||
}
|
||||
|
||||
page.sameOrigin = sameOrigin;
|
||||
|
||||
},{"path-to-regexp":2}],2:[function(require,module,exports){
|
||||
/**
|
||||
* Expose `pathtoRegexp`.
|
||||
*/
|
||||
module.exports = pathtoRegexp;
|
||||
|
||||
/**
|
||||
* The main path matching regexp utility.
|
||||
*
|
||||
* @type {RegExp}
|
||||
*/
|
||||
var PATH_REGEXP = new RegExp([
|
||||
// Match already escaped characters that would otherwise incorrectly appear
|
||||
// in future matches. This allows the user to escape special characters that
|
||||
// shouldn't be transformed.
|
||||
'(\\\\.)',
|
||||
// Match Express-style parameters and un-named parameters with a prefix
|
||||
// and optional suffixes. Matches appear as:
|
||||
//
|
||||
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?"]
|
||||
// "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined]
|
||||
'([\\/.])?(?:\\:(\\w+)(?:\\(((?:\\\\.|[^)])*)\\))?|\\(((?:\\\\.|[^)])*)\\))([+*?])?',
|
||||
// Match regexp special characters that should always be escaped.
|
||||
'([.+*?=^!:${}()[\\]|\\/])'
|
||||
].join('|'), 'g');
|
||||
|
||||
/**
|
||||
* Escape the capturing group by escaping special characters and meaning.
|
||||
*
|
||||
* @param {String} group
|
||||
* @return {String}
|
||||
*/
|
||||
function escapeGroup (group) {
|
||||
return group.replace(/([=!:$\/()])/g, '\\$1');
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach the keys as a property of the regexp.
|
||||
*
|
||||
* @param {RegExp} re
|
||||
* @param {Array} keys
|
||||
* @return {RegExp}
|
||||
*/
|
||||
var attachKeys = function (re, keys) {
|
||||
re.keys = keys;
|
||||
|
||||
return re;
|
||||
};
|
||||
|
||||
/**
|
||||
* Normalize the given path string, returning a regular expression.
|
||||
*
|
||||
* An empty array should be passed in, which will contain the placeholder key
|
||||
* names. For example `/user/:id` will then contain `["id"]`.
|
||||
*
|
||||
* @param {(String|RegExp|Array)} path
|
||||
* @param {Array} keys
|
||||
* @param {Object} options
|
||||
* @return {RegExp}
|
||||
*/
|
||||
function pathtoRegexp (path, keys, options) {
|
||||
if (keys && !Array.isArray(keys)) {
|
||||
options = keys;
|
||||
keys = null;
|
||||
}
|
||||
|
||||
keys = keys || [];
|
||||
options = options || {};
|
||||
|
||||
var strict = options.strict;
|
||||
var end = options.end !== false;
|
||||
var flags = options.sensitive ? '' : 'i';
|
||||
var index = 0;
|
||||
|
||||
if (path instanceof RegExp) {
|
||||
// Match all capturing groups of a regexp.
|
||||
var groups = path.source.match(/\((?!\?)/g) || [];
|
||||
|
||||
// Map all the matches to their numeric keys and push into the keys.
|
||||
keys.push.apply(keys, groups.map(function (match, index) {
|
||||
return {
|
||||
name: index,
|
||||
delimiter: null,
|
||||
optional: false,
|
||||
repeat: false
|
||||
};
|
||||
}));
|
||||
|
||||
// Return the source back to the user.
|
||||
return attachKeys(path, keys);
|
||||
}
|
||||
|
||||
if (Array.isArray(path)) {
|
||||
// Map array parts into regexps and return their source. We also pass
|
||||
// the same keys and options instance into every generation to get
|
||||
// consistent matching groups before we join the sources together.
|
||||
path = path.map(function (value) {
|
||||
return pathtoRegexp(value, keys, options).source;
|
||||
});
|
||||
|
||||
// Generate a new regexp instance by joining all the parts together.
|
||||
return attachKeys(new RegExp('(?:' + path.join('|') + ')', flags), keys);
|
||||
}
|
||||
|
||||
// Alter the path string into a usable regexp.
|
||||
path = path.replace(PATH_REGEXP, function (match, escaped, prefix, key, capture, group, suffix, escape) {
|
||||
// Avoiding re-escaping escaped characters.
|
||||
if (escaped) {
|
||||
return escaped;
|
||||
}
|
||||
|
||||
// Escape regexp special characters.
|
||||
if (escape) {
|
||||
return '\\' + escape;
|
||||
}
|
||||
|
||||
var repeat = suffix === '+' || suffix === '*';
|
||||
var optional = suffix === '?' || suffix === '*';
|
||||
|
||||
keys.push({
|
||||
name: key || index++,
|
||||
delimiter: prefix || '/',
|
||||
optional: optional,
|
||||
repeat: repeat
|
||||
});
|
||||
|
||||
// Escape the prefix character.
|
||||
prefix = prefix ? '\\' + prefix : '';
|
||||
|
||||
// Match using the custom capturing group, or fallback to capturing
|
||||
// everything up to the next slash (or next period if the param was
|
||||
// prefixed with a period).
|
||||
capture = escapeGroup(capture || group || '[^' + (prefix || '\\/') + ']+?');
|
||||
|
||||
// Allow parameters to be repeated more than once.
|
||||
if (repeat) {
|
||||
capture = capture + '(?:' + prefix + capture + ')*';
|
||||
}
|
||||
|
||||
// Allow a parameter to be optional.
|
||||
if (optional) {
|
||||
return '(?:' + prefix + '(' + capture + '))?';
|
||||
}
|
||||
|
||||
// Basic parameter support.
|
||||
return prefix + '(' + capture + ')';
|
||||
});
|
||||
|
||||
// Check whether the path ends in a slash as it alters some match behaviour.
|
||||
var endsWithSlash = path[path.length - 1] === '/';
|
||||
|
||||
// In non-strict mode we allow an optional trailing slash in the match. If
|
||||
// the path to match already ended with a slash, we need to remove it for
|
||||
// consistency. The slash is only valid at the very end of a path match, not
|
||||
// anywhere in the middle. This is important for non-ending mode, otherwise
|
||||
// "/test/" will match "/test//route".
|
||||
if (!strict) {
|
||||
path = (endsWithSlash ? path.slice(0, -2) : path) + '(?:\\/(?=$))?';
|
||||
}
|
||||
|
||||
// In non-ending mode, we need prompt the capturing groups to match as much
|
||||
// as possible by using a positive lookahead for the end or next path segment.
|
||||
if (!end) {
|
||||
path += strict && endsWithSlash ? '' : '(?=\\/|$)';
|
||||
}
|
||||
|
||||
return attachKeys(new RegExp('^' + path + (end ? '$' : ''), flags), keys);
|
||||
};
|
||||
|
||||
},{}]},{},[1])(1)
|
||||
});
|
||||
1625
gaia/apps/calendar/js/ext/threads.js
Executable file
1625
gaia/apps/calendar/js/ext/threads.js
Executable file
File diff suppressed because it is too large
Load diff
245
gaia/apps/calendar/js/ext/uuid.js
Executable file
245
gaia/apps/calendar/js/ext/uuid.js
Executable file
|
|
@ -0,0 +1,245 @@
|
|||
// uuid.js
|
||||
//
|
||||
// Copyright (c) 2010-2012 Robert Kieffer
|
||||
// MIT License - http://opensource.org/licenses/mit-license.php
|
||||
|
||||
(function() {
|
||||
var _global = this;
|
||||
|
||||
// Unique ID creation requires a high quality random # generator. We feature
|
||||
// detect to determine the best RNG source, normalizing to a function that
|
||||
// returns 128-bits of randomness, since that's what's usually required
|
||||
var _rng;
|
||||
|
||||
// Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html
|
||||
//
|
||||
// Moderately fast, high quality
|
||||
if (typeof(_global.require) == 'function' && typeof(module) != 'undefined' && module.exports) {
|
||||
try {
|
||||
var _rb = _global.require('crypto').randomBytes;
|
||||
_rng = _rb && function() {return _rb(16);};
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
if (!_rng && _global.crypto && crypto.getRandomValues) {
|
||||
// WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
|
||||
//
|
||||
// Moderately fast, high quality
|
||||
var _rnds8 = new Uint8Array(16);
|
||||
_rng = function whatwgRNG() {
|
||||
crypto.getRandomValues(_rnds8);
|
||||
return _rnds8;
|
||||
};
|
||||
}
|
||||
|
||||
if (!_rng) {
|
||||
// Math.random()-based (RNG)
|
||||
//
|
||||
// If all else fails, use Math.random(). It's fast, but is of unspecified
|
||||
// quality.
|
||||
var _rnds = new Array(16);
|
||||
_rng = function() {
|
||||
for (var i = 0, r; i < 16; i++) {
|
||||
if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
|
||||
_rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
|
||||
}
|
||||
|
||||
return _rnds;
|
||||
};
|
||||
}
|
||||
|
||||
// Buffer class to use
|
||||
var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array;
|
||||
|
||||
// Maps for number <-> hex string conversion
|
||||
var _byteToHex = [];
|
||||
var _hexToByte = {};
|
||||
for (var i = 0; i < 256; i++) {
|
||||
_byteToHex[i] = (i + 0x100).toString(16).substr(1);
|
||||
_hexToByte[_byteToHex[i]] = i;
|
||||
}
|
||||
|
||||
// **`parse()` - Parse a UUID into it's component bytes**
|
||||
function parse(s, buf, offset) {
|
||||
var i = (buf && offset) || 0, ii = 0;
|
||||
|
||||
buf = buf || [];
|
||||
s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
|
||||
if (ii < 16) { // Don't overflow!
|
||||
buf[i + ii++] = _hexToByte[oct];
|
||||
}
|
||||
});
|
||||
|
||||
// Zero out remaining bytes if string was short
|
||||
while (ii < 16) {
|
||||
buf[i + ii++] = 0;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
// **`unparse()` - Convert UUID byte array (ala parse()) into a string**
|
||||
function unparse(buf, offset) {
|
||||
var i = offset || 0, bth = _byteToHex;
|
||||
return bth[buf[i++]] + bth[buf[i++]] +
|
||||
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
||||
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
||||
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
||||
bth[buf[i++]] + bth[buf[i++]] + '-' +
|
||||
bth[buf[i++]] + bth[buf[i++]] +
|
||||
bth[buf[i++]] + bth[buf[i++]] +
|
||||
bth[buf[i++]] + bth[buf[i++]];
|
||||
}
|
||||
|
||||
// **`v1()` - Generate time-based UUID**
|
||||
//
|
||||
// Inspired by https://github.com/LiosK/UUID.js
|
||||
// and http://docs.python.org/library/uuid.html
|
||||
|
||||
// random #'s we need to init node and clockseq
|
||||
var _seedBytes = _rng();
|
||||
|
||||
// Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
|
||||
var _nodeId = [
|
||||
_seedBytes[0] | 0x01,
|
||||
_seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
|
||||
];
|
||||
|
||||
// Per 4.2.2, randomize (14 bit) clockseq
|
||||
var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
|
||||
|
||||
// Previous uuid creation time
|
||||
var _lastMSecs = 0, _lastNSecs = 0;
|
||||
|
||||
// See https://github.com/broofa/node-uuid for API details
|
||||
function v1(options, buf, offset) {
|
||||
var i = buf && offset || 0;
|
||||
var b = buf || [];
|
||||
|
||||
options = options || {};
|
||||
|
||||
var clockseq = options.clockseq != null ? options.clockseq : _clockseq;
|
||||
|
||||
// UUID timestamps are 100 nano-second units since the Gregorian epoch,
|
||||
// (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
|
||||
// time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
|
||||
// (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
|
||||
var msecs = options.msecs != null ? options.msecs : new Date().getTime();
|
||||
|
||||
// Per 4.2.1.2, use count of uuid's generated during the current clock
|
||||
// cycle to simulate higher resolution clock
|
||||
var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1;
|
||||
|
||||
// Time since last uuid creation (in msecs)
|
||||
var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
|
||||
|
||||
// Per 4.2.1.2, Bump clockseq on clock regression
|
||||
if (dt < 0 && options.clockseq == null) {
|
||||
clockseq = clockseq + 1 & 0x3fff;
|
||||
}
|
||||
|
||||
// Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
|
||||
// time interval
|
||||
if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
|
||||
nsecs = 0;
|
||||
}
|
||||
|
||||
// Per 4.2.1.2 Throw error if too many uuids are requested
|
||||
if (nsecs >= 10000) {
|
||||
throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
|
||||
}
|
||||
|
||||
_lastMSecs = msecs;
|
||||
_lastNSecs = nsecs;
|
||||
_clockseq = clockseq;
|
||||
|
||||
// Per 4.1.4 - Convert from unix epoch to Gregorian epoch
|
||||
msecs += 12219292800000;
|
||||
|
||||
// `time_low`
|
||||
var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
|
||||
b[i++] = tl >>> 24 & 0xff;
|
||||
b[i++] = tl >>> 16 & 0xff;
|
||||
b[i++] = tl >>> 8 & 0xff;
|
||||
b[i++] = tl & 0xff;
|
||||
|
||||
// `time_mid`
|
||||
var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
|
||||
b[i++] = tmh >>> 8 & 0xff;
|
||||
b[i++] = tmh & 0xff;
|
||||
|
||||
// `time_high_and_version`
|
||||
b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
|
||||
b[i++] = tmh >>> 16 & 0xff;
|
||||
|
||||
// `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
|
||||
b[i++] = clockseq >>> 8 | 0x80;
|
||||
|
||||
// `clock_seq_low`
|
||||
b[i++] = clockseq & 0xff;
|
||||
|
||||
// `node`
|
||||
var node = options.node || _nodeId;
|
||||
for (var n = 0; n < 6; n++) {
|
||||
b[i + n] = node[n];
|
||||
}
|
||||
|
||||
return buf ? buf : unparse(b);
|
||||
}
|
||||
|
||||
// **`v4()` - Generate random UUID**
|
||||
|
||||
// See https://github.com/broofa/node-uuid for API details
|
||||
function v4(options, buf, offset) {
|
||||
// Deprecated - 'format' argument, as supported in v1.2
|
||||
var i = buf && offset || 0;
|
||||
|
||||
if (typeof(options) == 'string') {
|
||||
buf = options == 'binary' ? new BufferClass(16) : null;
|
||||
options = null;
|
||||
}
|
||||
options = options || {};
|
||||
|
||||
var rnds = options.random || (options.rng || _rng)();
|
||||
|
||||
// Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
|
||||
rnds[6] = (rnds[6] & 0x0f) | 0x40;
|
||||
rnds[8] = (rnds[8] & 0x3f) | 0x80;
|
||||
|
||||
// Copy bytes to buffer, if provided
|
||||
if (buf) {
|
||||
for (var ii = 0; ii < 16; ii++) {
|
||||
buf[i + ii] = rnds[ii];
|
||||
}
|
||||
}
|
||||
|
||||
return buf || unparse(rnds);
|
||||
}
|
||||
|
||||
// Export public API
|
||||
var uuid = v4;
|
||||
uuid.v1 = v1;
|
||||
uuid.v4 = v4;
|
||||
uuid.parse = parse;
|
||||
uuid.unparse = unparse;
|
||||
uuid.BufferClass = BufferClass;
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// Publish as AMD module
|
||||
define(function() {return uuid;});
|
||||
} else if (typeof(module) != 'undefined' && module.exports) {
|
||||
// Publish as node.js module
|
||||
module.exports = uuid;
|
||||
} else {
|
||||
// Publish as global (in browsers)
|
||||
var _previousRoot = _global.uuid;
|
||||
|
||||
// **`noConflict()` - (browser only) to reset global 'uuid' var**
|
||||
uuid.noConflict = function() {
|
||||
_global.uuid = _previousRoot;
|
||||
return uuid;
|
||||
};
|
||||
|
||||
_global.uuid = uuid;
|
||||
}
|
||||
}).call(this);
|
||||
Loading…
Reference in a new issue