Merge remote-tracking branch 'origin/master' into oldclient-fix-auth

pull/293/head
Matthijs van Henten 2016-04-21 12:07:09 +00:00
commit f8ecaba7e9
9 zmienionych plików z 231 dodań i 38 usunięć

Wyświetl plik

@ -709,6 +709,7 @@ module.exports = function(options) {
premium: options.project.premium,
}
},
"plugins/c9.ide.abtesting/abtesting",
{
packagePath: "plugins/c9.ide.welcome/welcome",
staticPrefix: staticPrefix + "/plugins/c9.ide.welcome",

Wyświetl plik

@ -158,7 +158,6 @@ module.exports = function(config, optimist) {
"c9.vfs.client": true,
"c9.cli.bridge": true,
"c9.nodeapi": true,
"c9.ide.experiment": true,
"saucelabs.preview": true,
"salesforce.sync": true,
"salesforce.language": true
@ -194,7 +193,6 @@ module.exports = function(config, optimist) {
"./c9.vfs.server/statics",
"./c9.analytics/mock_analytics",
"./c9.metrics/mock_metrics",
"./c9.ide.experiment/mock_experiment",
{
packagePath: "./c9.vfs.server/vfs.connect.standalone",
workspaceDir: baseProc,

Wyświetl plik

@ -113,6 +113,7 @@ module.exports = function(mains, opts) {
}
function setModuleSource(mod, src, cb) {
src = src.replace(/\r\n/g, "\n"); // normalize windows newlines
if (cache)
cache.files[mod.file] = src;
mod.source = src;
@ -345,13 +346,14 @@ function removeUseStrict(module) {
module.source = module.source.replace(/['"]use strict['"];/g, "");
}
var commentRe = /^(;)?(?:\s*(?:\/\/.+\n|\/\*(?:[^*]|\*(?!\/))*\*\/))+(?: *\n)?/gm;
function removeLicenceComments(module) {
if (/\.(js|jsx|css|less)/.test(module.path))
module.source = module.source.replace(/(?:(;)|\n|^)\s*\/\*[\d\D]*?\*\/|(\n|^)\s*\/\/.*/g, "$1");
module.source = module.source.replace(commentRe, "$1");
}
function removeLicenceCommentsKeepLines(module) {
if (/\.(js|jsx|css|less)/.test(module.path)) {
module.source = module.source.replace(/(?:(;)|\n|^)\s*\/\*[\d\D]*?\*\/|\n\s*\/\/.*/g, function(cm, start) {
module.source = module.source.replace(commentRe, function(cm, start) {
return (start||"") + cm.replace(/.+/g, "");
});
}
@ -391,8 +393,8 @@ function wrapUMD(module) {
+ ' $build_deps$.module.define(name, [], function() { return $build_deps$.module.exports });\n'
+ ' }\n'
+ '}\n'
+ 'define.amd = true;'
+ module.source
+ 'define.amd = true;\n'
+ module.source + '\n'
+ '});';
}
@ -410,4 +412,7 @@ function quote(str) {
}
module.exports.resolveModulePath = resolveModulePath;
module.exports.getSubmodules = getSubmodules;
module.exports.resolveModulePath = resolveModulePath;
module.exports.removeLicenceComments = removeLicenceComments;
module.exports.removeLicenceCommentsKeepLines = removeLicenceCommentsKeepLines;

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "c9",
"description": "New Cloud9 Client",
"version": "3.1.2296",
"version": "3.1.2303",
"author": "Ajax.org B.V. <info@ajax.org>",
"private": true,
"main": "bin/c9",
@ -67,7 +67,7 @@
"c9.ide.language.javascript.infer": "#18acb93a3a",
"c9.ide.language.jsonalyzer": "#4b329741b1",
"c9.ide.language.codeintel": "#253ae15f5e",
"c9.ide.collab": "#cd36cae90c",
"c9.ide.collab": "#28129e17ae",
"c9.ide.local": "#10eb45842a",
"c9.ide.find": "#e33fbaed2f",
"c9.ide.find.infiles": "#c0a13737ef",

Wyświetl plik

@ -0,0 +1,86 @@
/**
* Server-side support for A/B testing experiments.
*
* Note that this plugin demands users and user IDs for most of its API,
* where this is optional in the client-side implementation.
*/
main.consumes = ["analytics"];
main.provides = ["abtesting"];
module.exports = main;
function main(options, imports, register) {
var analytics = imports["analytics"];
var outplan = require("outplan");
var MS_PER_DAY = 1000 * 60 * 60 * 24;
outplan.configure({
logFunction: function(e) {
var label = e.name + " - " + e.event;
analytics.track(label, { variation: e.params.name });
}
});
function create(name, choices, options) {
return outplan.create(name, choices, options);
}
function expose(experimentName, userId, options) {
return outplan.expose(experimentName, userId, options);
}
function isUserCreatedAfter(experimentDate, user) {
if (!user || !user.date_add)
throw new Error("Expected: user");
var diffDays = (experimentDate - Date.now()) / MS_PER_DAY;
if (diffDays > 20) {
// Sanity check: new Date() takes zero-based month argument, one-based day argument
throw new Error("Passed a date far in the future to isUserCreatedAfter()");
}
return user.date_add > experimentDate;
}
register(null, {
"abtesting": {
/**
* Create a new experiment. Alias for require("outplan").create()
*
* @param {String} name
* The name of the experiment.
* @param {String[]|Object[]} choices
* A list of variations, e.g. ["A", "B"],
* or variation objects, e.g. [{ name: "A", color: "#AAA" }, { name: "B", color: "#BBB" }]
* @param {Object} [option]
* Options for the experiment. This may also include
* arguments for the distribution operator, e.g. weight.
* @param {Function} [options.operator]
* The distribution operator, e.g. outplan.WeightedChoice.
*/
create: create,
/**
* Get the selected variation of an experiment, and call the log function with
* an "expose" event to track its exposure.
*
* @param {String} name The experiment name.
* @param {Number} userId A unique identifier for the current user.
* @param {Object} [options] Options
* @param {Boolean} [options.log=true] Whether to log an "exposure event"
*/
expose: expose,
/**
* Helper to determine if the current user was created after the start of an experiment.
*
* @throws {Error} when a date in the future (~20 days from now) is passed.
* This error is thrown as a sanity check to make sure `new Date()`
* is called with a zero-based month argument (and a one-based day).
*
* @param {Date} experimentDate
* @param {Object} user A user object
* @param {Number} user.date_add
*/
isUserCreatedAfter: isUserCreatedAfter,
}
});
}

Wyświetl plik

@ -0,0 +1,105 @@
/**
* Client-side support for A/B testing experiments.
*/
define(function(require, exports, module) {
"use strict";
main.consumes = ["Plugin", "info", "c9.analytics"];
main.provides = ["abtesting"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var plugin = new Plugin("Ajax.org", main.consumes);
var info = imports.info;
var analytics = imports["c9.analytics"];
var outplan = require("outplan");
var MS_PER_DAY = 1000 * 60 * 60 * 24;
var userId;
plugin.on("load", function() {
userId = info.getUser().id;
outplan.configure({
logFunction: function(e) {
var label = e.name + " - " + e.event;
analytics.track(label, { variation: e.params.name });
}
});
});
plugin.on("unload", function() {
userId = undefined;
});
function create(name, choices, options) {
var experiment = outplan.create(name, choices, options);
experiment.expose = expose.bind(null, name);
return experiment;
}
function expose(experimentName, overrideUserId, options) {
if (overrideUserId && typeof overrideUserId === "object")
return expose(experimentName, null, options);
return outplan.expose(experimentName, overrideUserId == null ? userId : overrideUserId, options);
}
function isUserCreatedAfter(experimentDate) {
var diffDays = (experimentDate - Date.now()) / MS_PER_DAY;
if (diffDays > 20) {
// Sanity check: new Date() takes zero-based month argument, one-based day argument
throw new Error("Passed a date far in the future to isUserCreatedAfter()");
}
return info.getUser().date_add > experimentDate;
}
/**
* Support for A/B testing experiments.
*/
plugin.freezePublicAPI({
/**
* Create a new experiment. Alias for require("outplan").create()
*
* @param {String} name
* The name of the experiment.
* @param {String[]|Object[]} choices
* A list of variations, e.g. ["A", "B"],
* or variation objects, e.g. [{ name: "A", color: "#AAA" }, { name: "B", color: "#BBB" }]
* @param {Object} [option]
* Options for the experiment. This may also include
* arguments for the distribution operator, e.g. weight.
* @param {Function} [options.operator]
* The distribution operator, e.g. outplan.WeightedChoice.
*/
create: create,
/**
* Get the selected variation of an experiment, and call the log function with
* an "expose" event to track its exposure.
*
* @param {String} name The experiment name.
* @param {Number} [userId] A unique identifier for the current user.
* @param {Object} [options] Options
* @param {Boolean} [options.log=true] Whether to log an "exposure event"
*/
expose: expose,
/**
* Helper to determine if the current user was created after the start of an experiment.
*
* @throws {Error} when a date in the future (~20 days from now) is passed.
* This error is thrown as a sanity check to make sure `new Date()`
* is called with a zero-based month argument (and a one-based day).
*
* @param {Date} experimentDate
*/
isUserCreatedAfter: isUserCreatedAfter,
});
register(null, {
"abtesting": plugin
});
}
});

Wyświetl plik

@ -1,26 +0,0 @@
/**
* Dummy implementation of experiments.
*/
"use strict";
plugin.consumes = [];
plugin.provides = ["experiment"];
module.exports = plugin;
function plugin(options, imports, register) {
register(null, {
"experiment": {
configure: function() {},
onStart: function() {
var chain = {
variation: function() {
return chain;
}
};
return chain;
}
}
});
}

Wyświetl plik

@ -41,6 +41,7 @@ define(function(require, exports, module) {
ui: "lib/ui",
c9: "lib/c9",
frontdoor: "lib/frontdoor",
outplan: "lib/outplan/dist/outplan",
};
if (whitelist === "*") {
@ -70,6 +71,7 @@ define(function(require, exports, module) {
"ui",
"emmet",
"frontdoor",
"outplan",
"mocha", // TESTING
"chai", // TESTING
].forEach(function(name) {

Wyświetl plik

@ -17,7 +17,7 @@ require("amd-loader");
var build, options, pathConfig;
describe("The Module", function(){
describe("The build module", function(){
this.timeout(60000);
beforeEach(function(next) {
@ -63,7 +63,7 @@ describe("The Module", function(){
});
});
it("test compile less", function(done) {
it("should compile less", function(done) {
build.buildSkin("ssh", "dark", pathConfig, function(err, result) {
if (err) return done(err);
@ -71,6 +71,28 @@ describe("The Module", function(){
assert(code);
done(err);
});
});
it("should remove comments", function(done) {
var removeLicenceComments = require("architect-build/module-deps").removeLicenceComments;
function remove(src) {
var module = { source: "" + src, path: ".js" };
removeLicenceComments(module);
return module.source;
}
assert.equal(remove("" + function() {
// 1
var a;
/***/ // hello
var x; // not removed
/* asd
*/
x += "he/*ll*/o" + a;
}) , function() {
var a;
var x; // not removed
x += "he/*ll*/o" + a;
});
done();
});
});