mirror of
https://github.com/zhigang1992/firebase-tools.git
synced 2026-05-21 14:38:50 +08:00
82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
var _ = require("lodash");
|
|
var chalk = require("chalk");
|
|
var path = require("path");
|
|
|
|
var FirebaseError = require("../../error");
|
|
var parseBoltRules = require("../../parseBoltRules");
|
|
var rtdb = require("../../rtdb");
|
|
var utils = require("../../utils");
|
|
|
|
module.exports = function(context, options) {
|
|
var rulesConfig = options.config.get("database");
|
|
var next = Promise.resolve();
|
|
|
|
if (!rulesConfig) {
|
|
return next;
|
|
}
|
|
|
|
if (_.isString(_.get(rulesConfig, "rules"))) {
|
|
rulesConfig = [_.assign(rulesConfig, { instance: options.instance })];
|
|
}
|
|
|
|
var ruleFiles = {};
|
|
var deploys = [];
|
|
|
|
rulesConfig.forEach(function(ruleConfig) {
|
|
if (!ruleConfig.rules) {
|
|
return;
|
|
}
|
|
|
|
ruleFiles[ruleConfig.rules] = null;
|
|
|
|
if (ruleConfig.target) {
|
|
options.rc.requireTarget(context.projectId, "database", ruleConfig.target);
|
|
var instances = options.rc.target(context.projectId, "database", ruleConfig.target);
|
|
deploys = deploys.concat(
|
|
instances.map(function(inst) {
|
|
return { instance: inst, rules: ruleConfig.rules };
|
|
})
|
|
);
|
|
} else if (!ruleConfig.instance) {
|
|
throw new FirebaseError('Must supply either "target" or "instance" in database config');
|
|
} else {
|
|
deploys.push(ruleConfig);
|
|
}
|
|
});
|
|
|
|
_.forEach(ruleFiles, function(v, file) {
|
|
switch (path.extname(file)) {
|
|
case ".json":
|
|
ruleFiles[file] = options.config.readProjectFile(file);
|
|
break;
|
|
case ".bolt":
|
|
ruleFiles[file] = parseBoltRules(file);
|
|
break;
|
|
default:
|
|
throw new FirebaseError("Unexpected rules format " + path.extname(file));
|
|
}
|
|
});
|
|
|
|
context.database = {
|
|
deploys: deploys,
|
|
ruleFiles: ruleFiles,
|
|
};
|
|
utils.logBullet(chalk.bold.cyan("database: ") + "checking rules syntax...");
|
|
return Promise.all(
|
|
deploys.map(function(deploy) {
|
|
return rtdb
|
|
.updateRules(deploy.instance, ruleFiles[deploy.rules], { dryRun: true })
|
|
.then(function() {
|
|
utils.logSuccess(
|
|
chalk.bold.green("database: ") +
|
|
"rules syntax for database " +
|
|
chalk.bold(deploy.instance) +
|
|
" is valid"
|
|
);
|
|
});
|
|
})
|
|
);
|
|
};
|