Config.fromJson constructor

Config.fromJson(
  1. Map<String, dynamic> json, {
  2. required CliConfig cliConfig,
  3. required File pubspecFile,
})

Creates a Config instance from a JSON map, typically read from pubspec.yaml.

Validates the configuration and exits with an error if invalid values are found.

Implementation

factory Config.fromJson(
  Map<String, dynamic> json, {
  required CliConfig cliConfig,
  required File pubspecFile,
}) {
  if (json['inno_bundle'] is! Map<String, dynamic>) {
    CliLogger.exitError("inno_bundle section is missing from pubspec.yaml.");
  }
  final Map<String, dynamic> inno = json['inno_bundle'];

  if (inno['id'] is! String) {
    CliLogger.exitError(
        "inno_bundle.id attribute is missing from pubspec.yaml. "
        "Run `dart run inno_bundle:guid` to generate a new one, "
        "then put it in your pubspec.yaml.");
  } else if (!Uuid.isValidUUID(fromString: inno['id'])) {
    CliLogger.exitError("inno_bundle.id from pubspec.yaml is not valid. "
        "Run `dart run inno_bundle:guid` to generate a new one, "
        "then put it in your pubspec.yaml.");
  }
  final String id = inno['id'];

  if (json['name'] is! String) {
    CliLogger.exitError("name attribute is missing from pubspec.yaml.");
  }
  final String pubspecName = json['name'];

  if (inno['name'] != null && !validFilenameRegex.hasMatch(inno['name'])) {
    CliLogger.exitError("inno_bundle.name from pubspec.yaml is not valid. "
        "`${inno['name']}` is not a valid file name.");
  }
  final String name = inno['name'] ?? pubspecName;

  if ((cliConfig.appVersion ?? inno['version'] ?? json['version'])
      is! String) {
    CliLogger.exitError("version attribute is missing from pubspec.yaml.");
  }
  final String version =
      cliConfig.appVersion ?? inno['version'] ?? json['version'];

  if ((inno['description'] ?? json['description']) is! String) {
    CliLogger.exitError(
        "description attribute is missing from pubspec.yaml.");
  }
  final String description = inno['description'] ?? json['description'];

  if ((inno['publisher'] ?? json['maintainer']) is! String) {
    CliLogger.exitError("maintainer or inno_bundle.publisher attributes are "
        "missing from pubspec.yaml.");
  }
  final String publisher = inno['publisher'] ?? json['maintainer'];

  final url = (inno['url'] ?? json['homepage'] ?? "") as String;
  final supportUrl = (inno['support_url'] as String?) ?? url;
  final updatesUrl = (inno['updates_url'] as String?) ?? url;

  if (inno['installer_icon'] != null && inno['installer_icon'] is! String) {
    CliLogger.exitError("inno_bundle.installer_icon attribute is invalid "
        "in pubspec.yaml.");
  }
  final installerIcon = inno['installer_icon'] != null
      ? p.join(
          Directory.current.path,
          p.fromUri(inno['installer_icon']),
        )
      : defaultInstallerIconPlaceholder;
  if (installerIcon != defaultInstallerIconPlaceholder &&
      !File(installerIcon).existsSync()) {
    CliLogger.exitError(
        "inno_bundle.installer_icon attribute value is invalid, "
        "`$installerIcon` file does not exist.");
  }

  if (inno['languages'] != null && inno['languages'] is! List) {
    CliLogger.exitError("inno_bundle.languages attribute is invalid "
        "in pubspec.yaml, only a list of strings is allowed.");
  }
  final languages = (inno['languages'] as List?)
          ?.map((l) {
            final languageError = Language.validateConfig(l);
            if (languageError != null) CliLogger.exitError(languageError);
            final language = Language.getByNameOrNull(l);
            if (language == null) return null;
            return language;
          })
          .whereType<Language>()
          .toList(growable: false) ??
      Language.values;

  if (inno['admin'] != null &&
      inno['admin'] is! bool &&
      inno['admin'] != "auto") {
    CliLogger.exitError("inno_bundle.admin attribute is invalid value "
        "in pubspec.yaml");
  }
  final admin = AdminMode.fromOption(inno['admin'] ?? true);

  if (inno['license_file'] != null && inno['license_file'] is! String) {
    CliLogger.exitError("inno_bundle.license_file attribute is invalid "
        "in pubspec.yaml.");
  }

  final licenseFilePath = p.join(
    Directory.current.path,
    inno['license_file'] != null
        ? p.fromUri(inno['license_file'])
        : 'LICENSE',
  );
  final licenseFile =
      File(licenseFilePath).existsSync() ? licenseFilePath : '';

  final signToolError = SignTool.validateConfig(
    inno["sign_tool"],
    signToolName: cliConfig.signToolName,
    signToolCommand: cliConfig.signToolCommand,
    signToolParams: cliConfig.signToolParams,
  );
  if (signToolError != null) CliLogger.exitError(signToolError);
  final signTool = SignTool.fromOption(
    inno['sign_tool'],
    signToolName: cliConfig.signToolName,
    signToolCommand: cliConfig.signToolCommand,
    signToolParams: cliConfig.signToolParams,
  );

  final archError = BuildArch.validateConfig(inno['arch']);
  if (archError != null) CliLogger.exitError(archError);
  final arch = BuildArch.fromOption(inno['arch']);

  if (inno['vc_redist'] != null &&
      inno['vc_redist'] is! bool &&
      inno['vc_redist'] != "download") {
    CliLogger.exitError("inno_bundle.vc_redist attribute is invalid value "
        "in pubspec.yaml");
  }
  final vcRedist = VcRedistMode.fromOption(inno['vc_redist'] ?? true);

  if (inno['dlls'] != null && inno['dlls'] is! List) {
    CliLogger.exitError("inno_bundle.dlls attribute is invalid "
        "in pubspec.yaml, only a list of dll entries is allowed.");
  }
  final dlls = ((inno['dlls'] ?? []) as List)
      .map((d) {
        if (d == null) return null;

        final dllError = DllEntry.validateConfig(d);
        if (dllError != null) CliLogger.exitError(dllError);

        return DllEntry.fromJson(d);
      })
      .whereType<DllEntry>()
      .toList(growable: false);

  return Config(
    pubspecFile: pubspecFile,
    buildArgs: cliConfig.buildArgs,
    id: id,
    pubspecName: pubspecName,
    name: name,
    description: description,
    version: version,
    publisher: publisher,
    url: url,
    supportUrl: supportUrl,
    updatesUrl: updatesUrl,
    installerIcon: installerIcon,
    languages: languages,
    admin: admin,
    type: cliConfig.type,
    app: cliConfig.app,
    installer: cliConfig.installer,
    licenseFile: licenseFile,
    signTool: signTool,
    arch: arch,
    vcRedist: vcRedist,
    dlls: dlls,
  );
}