addSkyEngine method

Folder addSkyEngine({
  1. required String sdkPath,
})

Adds a mock sky_engine package with an _embedder.yaml file, and returns the Folder of the sky_engine package's 'lib' directory.

Implementation

Folder addSkyEngine({required String sdkPath}) {
  // Emulate sky engine by writing to disk:
  // * a `sky_engine/lib` directory,
  // * a `sky_engine/lib/_embedder.yaml` file which points to the Dart SDK
  //   sources, and
  // * the `dart:ui` sources into `sky_engine/lib/ui`.
  var packageFolder = _addFiles('ui', mock_ui.units);

  var skyEngineFolder = resourceProvider.getFolder(
    resourceProvider.convertPath('$packagesRootPath/sky_engine'),
  )..create();
  var skyEngineLibFolder = skyEngineFolder.getChildAssumingFolder('lib')
    ..create();
  var embedderFile = skyEngineLibFolder.getChildAssumingFile(
    '_embedder.yaml',
  );
  // SDK-relative paths.
  var embeddedSdkLibRelativePaths = {
    'dart:async': 'lib/async/async.dart',
    'dart:collection': 'lib/collection/collection.dart',
    'dart:convert': 'lib/convert/convert.dart',
    'dart:core': 'lib/core/core.dart',
    'dart:developer': 'lib/developer/developer.dart',
    'dart:ffi': 'lib/ffi/ffi.dart',
    'dart:html': 'lib/html/dart2js/html_dart2js.dart',
    'dart:io': 'lib/io/io.dart',
    'dart:isolate': 'lib/isolate/isolate.dart',
    'dart:js': 'lib/js/js.dart',
    'dart:js_interop': 'lib/js/js_interop.dart',
    'dart:math': 'lib/math/math.dart',
    'dart:typed_data': 'lib/typed_data/typed_data.dart',
    'dart:_interceptors': 'lib/_interceptors/interceptors.dart',
    'dart:_internal': 'lib/internal/internal.dart',
  };
  // Build map of all absolute paths, including the project-specific dart:ui.
  var embeddedLibAbsolutePaths = {
    'dart:ui': path.join(packageFolder.path, 'lib', 'ui.dart'),
    for (var MapEntry(key: name, value: relativePath)
        in embeddedSdkLibRelativePaths.entries)
      // The paths above all use forward slashes, but we must use the correct
      // slashes for the platform here.
      name: path.join(
        sdkPath,
        relativePath.replaceAll(path.posix.separator, path.separator),
      ),
  };

  // Build the YAML file contents.
  var embeddedFileContents = StringBuffer();
  embeddedFileContents.writeln('embedded_libs:');
  for (var MapEntry(key: name, value: path)
      in embeddedLibAbsolutePaths.entries) {
    // Use jsonEncode to ensure escape is correct when the path contains
    // backslashes (Windows).
    embeddedFileContents.writeln(
      '  ${jsonEncode(name)}: ${jsonEncode(path)}',
    );
  }
  embedderFile.writeAsStringSync(embeddedFileContents.toString());

  return skyEngineLibFolder;
}