export async function displayUpdateChangesRequiringConfirmation()

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'."
      );
    }
  }
}