build function

Future<BuildResult> build(
  1. BuildOptions options, {
  2. BuildLogger? logger,
})

Implementation

Future<BuildResult> build(BuildOptions options, {BuildLogger? logger}) async {
  final resolvedEntry = resolveEntry(
    options.entry,
    defaultEntry: options.defaultEntry,
    fallbackEntry: options.fallbackEntry,
    workingDirectory: options.workingDirectory,
  );
  if (resolvedEntry == null) {
    throw ArgumentError(
      'Entry not found. Tried `${options.entry}` '
      'and fallback `${options.fallbackEntry}`.',
    );
  }

  _ensureDir(
    '${options.outDir}/js/core',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/js/node',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/js/bun',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/js/deno',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/edge/cloudflare',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/edge/vercel',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/edge/netlify',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/shared',
    workingDirectory: options.workingDirectory,
  );
  _ensureDir(
    '${options.outDir}/bin',
    workingDirectory: options.workingDirectory,
  );

  final baseName = _basenameWithoutExtension(resolvedEntry);
  final coreJsName = '$baseName.js';
  final coreJsPath = '${options.outDir}/js/core/$coreJsName';
  final exeName = Platform.isWindows ? '$baseName.exe' : baseName;
  final exePath = '${options.outDir}/bin/$exeName';

  await _run(
    options.dartExecutable,
    <String>['compile', 'js', resolvedEntry, '-o', coreJsPath],
    silent: options.silent,
    logger: logger,
    workingDirectory: options.workingDirectory,
  );

  await _run(
    options.dartExecutable,
    <String>['compile', 'exe', resolvedEntry, '-o', exePath],
    silent: options.silent,
    logger: logger,
    workingDirectory: options.workingDirectory,
  );

  await _writeRuntimeWrappers(
    options.outDir,
    coreJsName: coreJsName,
    workingDirectory: options.workingDirectory,
  );

  if (!options.silent && logger != null) {
    logger('[osrv] build complete');
    logger('[osrv] js core: $coreJsPath');
    logger('[osrv] exe: $exePath');
  }

  return BuildResult(
    entry: resolvedEntry,
    outDir: options.outDir,
    coreJsPath: coreJsPath,
    executablePath: exePath,
  );
}