in src/extensions/displayExtensionInfo.ts [131:250]
export async function displayUpdateChangesRequiringConfirmation(args: {
spec: extensionsApi.ExtensionSpec;
newSpec: extensionsApi.ExtensionSpec;
nonInteractive: boolean;
force: boolean;
}): Promise<void> {
const equals = (a: any, b: any) => {
return _.isEqual(a, b);
};
if (args.spec.license !== args.newSpec.license) {
const message =
"\n" +
"**License**\n" +
deletionColor(args.spec.license ? `- ${args.spec.license}\n` : "- None\n") +
additionColor(args.newSpec.license ? `+ ${args.newSpec.license}\n` : "+ None\n");
logger.info(message);
if (
!(await confirm({ nonInteractive: args.nonInteractive, force: args.force, default: true }))
) {
throw new FirebaseError(
"Unable to update this extension instance without explicit consent for the change to 'License'."
);
}
}
const apisDiffDeletions = _.differenceWith(
args.spec.apis,
_.get(args.newSpec, "apis", []),
equals
);
const apisDiffAdditions = _.differenceWith(
args.newSpec.apis,
_.get(args.spec, "apis", []),
equals
);
if (apisDiffDeletions.length || apisDiffAdditions.length) {
let message = "\n**APIs:**\n";
apisDiffDeletions.forEach((api) => {
message += deletionColor(`- ${api.apiName} (${api.reason})\n`);
});
apisDiffAdditions.forEach((api) => {
message += additionColor(`+ ${api.apiName} (${api.reason})\n`);
});
logger.info(message);
if (
!(await confirm({ nonInteractive: args.nonInteractive, force: args.force, default: true }))
) {
throw new FirebaseError(
"Unable to update this extension instance without explicit consent for the change to 'APIs'."
);
}
}
const resourcesDiffDeletions = _.differenceWith(
args.spec.resources,
_.get(args.newSpec, "resources", []),
compareResources
);
const resourcesDiffAdditions = _.differenceWith(
args.newSpec.resources,
_.get(args.spec, "resources", []),
compareResources
);
if (resourcesDiffDeletions.length || resourcesDiffAdditions.length) {
let message = "\n**Resources:**\n";
resourcesDiffDeletions.forEach((resource) => {
message += deletionColor(` - ${getResourceReadableName(resource)}`);
});
resourcesDiffAdditions.forEach((resource) => {
message += additionColor(`+ ${getResourceReadableName(resource)}`);
});
logger.info(message);
if (
!(await confirm({ nonInteractive: args.nonInteractive, force: args.force, default: true }))
) {
throw new FirebaseError(
"Unable to update this extension instance without explicit consent for the change to 'Resources'."
);
}
}
const rolesDiffDeletions = _.differenceWith(
args.spec.roles,
_.get(args.newSpec, "roles", []),
equals
);
const rolesDiffAdditions = _.differenceWith(
args.newSpec.roles,
_.get(args.spec, "roles", []),
equals
);
if (rolesDiffDeletions.length || rolesDiffAdditions.length) {
let message = "\n**Permissions:**\n";
rolesDiffDeletions.forEach((role) => {
message += deletionColor(`- ${role.role} (${role.reason})\n`);
});
rolesDiffAdditions.forEach((role) => {
message += additionColor(`+ ${role.role} (${role.reason})\n`);
});
logger.info(message);
if (
!(await confirm({ nonInteractive: args.nonInteractive, force: args.force, default: true }))
) {
throw new FirebaseError(
"Unable to update this extension instance without explicit consent for the change to 'Permissions'."
);
}
}
if (!args.spec.billingRequired && args.newSpec.billingRequired) {
logger.info("Billing is now required for the new version of this extension.");
if (
!(await confirm({ nonInteractive: args.nonInteractive, force: args.force, default: true }))
) {
throw new FirebaseError(
"Unable to update this extension instance without explicit consent for the change to 'BillingRequired'."
);
}
}
}