createSharedHeaders function

void createSharedHeaders(
  1. String nitroNativePath, {
  2. String baseDir = '.',
})

Implementation

void createSharedHeaders(String nitroNativePath, {String baseDir = '.'}) {
  Directory(p.join(baseDir, 'src')).createSync(recursive: true);
  final srcFile = File(p.join(nitroNativePath, 'nitro.h'));

  // If the source nitro.h is missing the required macros, update it first.
  if (srcFile.existsSync()) {
    final current = srcFile.readAsStringSync();
    if (!current.contains('NITRO_EXPORT')) {
      srcFile.writeAsStringSync(nitroHContent);
    }
  } else {
    // If it doesn't exist in the nitro package at all, create it.
    try {
      srcFile.createSync(recursive: true);
      srcFile.writeAsStringSync(nitroHContent);
    } catch (_) {
      // Might not have write access to pub-cache; that's fine, we'll write to the local project.
    }
  }

  // Always write the correct content to the local project directories.
  File(p.join(baseDir, 'src', 'nitro.h')).writeAsStringSync(nitroHContent);
  if (Directory(p.join(baseDir, 'ios', 'Classes')).existsSync()) {
    File(
      p.join(baseDir, 'ios', 'Classes', 'nitro.h'),
    ).writeAsStringSync(nitroHContent);
  }
  if (Directory(p.join(baseDir, 'macos', 'Classes')).existsSync()) {
    File(
      p.join(baseDir, 'macos', 'Classes', 'nitro.h'),
    ).writeAsStringSync(nitroHContent);
  }
  File(
    p.join(baseDir, 'src', 'dart_api_dl.c'),
  ).writeAsStringSync(dartApiDlForwarderContent(nitroNativePath));

  // Also populate any existing SPM C++ target include/ dirs (nested layout:
  // {platform}/<pluginName>/Sources/<ClassName>Cpp/include/).
  for (final platform in ['ios', 'macos']) {
    final platformDir = Directory(p.join(baseDir, platform));
    if (!platformDir.existsSync()) continue;
    for (final entry in platformDir.listSync().whereType<Directory>()) {
      final sourcesDir = Directory(p.join(entry.path, 'Sources'));
      if (!sourcesDir.existsSync()) continue;
      for (final targetDir in sourcesDir.listSync().whereType<Directory>()) {
        if (!p.basename(targetDir.path).endsWith('Cpp')) continue;
        final includeDir = Directory(p.join(targetDir.path, 'include'));
        if (!includeDir.existsSync()) continue;
        // Write nitro.h with the correct guard-protected content.
        File(p.join(includeDir.path, 'nitro.h')).writeAsStringSync(nitroHContent);
        // Copy dart API headers from the nitro native source.
        for (final headerName in ['dart_api_dl.h', 'dart_api.h', 'dart_native_api.h', 'dart_version.h']) {
          final src = File(p.join(nitroNativePath, headerName));
          if (src.existsSync()) src.copySync(p.join(includeDir.path, headerName));
        }
      }
    }
  }
}