Files
firebase-tools/src/functionsConfigClone.js
Bryan Kendall 78f11b62ab Master Sync 10/25 (#970)
* Add emulator:run

* Cleanup

* Download emulators if needed

* Cleanup

* Remove unused dep

* Use CACHE_DIR

* Allow FIREBASE_EMULATORS_PATH to override the cache dir

* Format

* Simplify emulator remote storage

* Use fs-extra

* Hide emulator:run behind preview

* Cleanup

* Fix URL

* Remove old commands

* Point at real artifacts

* make emulators executable after downloading

* Allow --yes flag for emulator

* Prompt for emulator download

* Linter

* Emulator CLI per API Review (#318)

* Emulator CLI per API Review

* Cleanup

* Address comments

* Linter

* Add a useful error message for when the emulator cannot start because… (#329)

* Add a useful error message for when the emulator cannot start because Java is not installed

* linter

* action item

* Add start time to profiler dump (#323)

* Set emulator version for initial release (#336)

* Typescript (#338)

* The path structure layout seems like it changed (#341)

* The path structure layout seems like it changed

* Update src/auth.js

Co-Authored-By: ryanpbrewster <RyanPBrewster@gmail.com>

* Update functions init templates to v2.1.0 (#969) (#343)
2018-10-25 16:19:35 -07:00

89 lines
2.6 KiB
JavaScript

"use strict";
var _ = require("lodash");
var clc = require("cli-color");
var FirebaseError = require("./error");
var functionsConfig = require("./functionsConfig");
var runtimeconfig = require("./gcp/runtimeconfig");
// Tests whether short is a prefix of long
var _matchPrefix = function(short, long) {
if (short.length > long.length) {
return false;
}
return _.reduce(
short,
function(accum, x, i) {
return accum && x === long[i];
},
true
);
};
var _applyExcept = function(json, except) {
_.forEach(except, function(key) {
_.unset(json, key);
});
};
var _cloneVariable = function(varName, toProject) {
return runtimeconfig.variables.get(varName).then(function(variable) {
var id = functionsConfig.varNameToIds(variable.name);
return runtimeconfig.variables.set(toProject, id.config, id.variable, variable.text);
});
};
var _cloneConfig = function(configName, toProject) {
return runtimeconfig.variables.list(configName).then(function(variables) {
return Promise.all(
_.map(variables, function(variable) {
return _cloneVariable(variable.name, toProject);
})
);
});
};
var _cloneConfigOrVariable = function(key, fromProject, toProject) {
var parts = key.split(".");
if (_.includes(exports.RESERVED_NAMESPACES, parts[0])) {
throw new FirebaseError("Cannot clone reserved namespace " + clc.bold(parts[0]));
}
var configName = _.join(["projects", fromProject, "configs", parts[0]], "/");
if (parts.length === 1) {
return _cloneConfig(configName, toProject);
}
return runtimeconfig.variables.list(configName).then(function(variables) {
var promises = [];
_.forEach(variables, function(variable) {
var varId = functionsConfig.varNameToIds(variable.name).variable;
var variablePrefixFilter = parts.slice(1);
if (_matchPrefix(variablePrefixFilter, varId.split("/"))) {
promises.push(_cloneVariable(variable.name, toProject));
}
});
return Promise.all(promises);
});
};
module.exports = function(fromProject, toProject, only, except) {
except = except || [];
if (only) {
return Promise.all(
_.map(only, function(key) {
return _cloneConfigOrVariable(key, fromProject, toProject);
})
);
}
return functionsConfig.materializeAll(fromProject).then(function(toClone) {
_.unset(toClone, "firebase"); // Do not clone firebase config
_applyExcept(toClone, except);
return Promise.all(
_.map(toClone, function(val, configId) {
return functionsConfig.setVariablesRecursive(toProject, configId, "", val);
})
);
});
};