vendor node_preamble so the test binary can be used by the Dart SDK
diff --git a/pkgs/test/CHANGELOG.md b/pkgs/test/CHANGELOG.md
index afe8dec..d376c7c 100644
--- a/pkgs/test/CHANGELOG.md
+++ b/pkgs/test/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.25.13-wip
+
+* Vendor node_preamble since it can't be pulled into the Dart SDK.
+
 ## 1.25.12
 
 * Fix hang when running multiple precompiled browser tests.
diff --git a/pkgs/test/lib/src/runner/node/platform.dart b/pkgs/test/lib/src/runner/node/platform.dart
index 16cd9c6..8f6e398 100644
--- a/pkgs/test/lib/src/runner/node/platform.dart
+++ b/pkgs/test/lib/src/runner/node/platform.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:async/async.dart';
-import 'package:node_preamble/preamble.dart' as preamble;
 import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as p;
 import 'package:stream_channel/stream_channel.dart';
@@ -33,6 +32,7 @@
 
 import '../../util/package_map.dart';
 import '../executable_settings.dart';
+import 'preamble.dart';
 
 /// A platform that loads tests in Node.js processes.
 class NodePlatform extends PlatformPlugin
@@ -193,7 +193,7 @@
     // compatible. Use the minified version so the source map remains valid.
     var jsFile = File(jsPath);
     await jsFile.writeAsString(
-        preamble.getPreamble(minified: true) + await jsFile.readAsString());
+        getPreamble(minified: true) + await jsFile.readAsString());
 
     StackTraceMapper? mapper;
     if (!suiteConfig.jsTrace) {
diff --git a/pkgs/test/lib/src/runner/node/preamble.dart b/pkgs/test/lib/src/runner/node/preamble.dart
new file mode 100644
index 0000000..63323fd
--- /dev/null
+++ b/pkgs/test/lib/src/runner/node/preamble.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2024, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Vendored version of node_preamble.
+
+final _minified =
+    r'''var dartNodeIsActuallyNode="undefined"!=typeof process&&(process.versions||{}).hasOwnProperty("node"),self=dartNodeIsActuallyNode?Object.create(globalThis):globalThis;if(self.scheduleImmediate="undefined"!=typeof setImmediate?function(e){setImmediate(e)}:function(e){setTimeout(e,0)},"undefined"!=typeof require)self.require=require;if("undefined"!=typeof exports)self.exports=exports;if("undefined"!=typeof process)self.process=process;if("undefined"!=typeof __dirname)self.__dirname=__dirname;if("undefined"!=typeof __filename)self.__filename=__filename;if("undefined"!=typeof Buffer)self.Buffer=Buffer;if(dartNodeIsActuallyNode){var url=("undefined"!=typeof __webpack_require__?__non_webpack_require__:require)("url");Object.defineProperty(self,"location",{value:{get href(){if(url.pathToFileURL)return url.pathToFileURL(process.cwd()).href+"/";else return"file://"+function(){var e=process.cwd();if("win32"!=process.platform)return e;else return"/"+e.replace(/\\/g,"/")}()+"/"}}}),function(){function e(){try{throw new Error}catch(n){var e=n.stack,r=new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","mg"),f=null;do{var t=r.exec(e);if(null!=t)f=t}while(null!=t);return f[1]}}var r=null;Object.defineProperty(self,"document",{value:{get currentScript(){if(null==r)r={src:e()};return r}}})}(),self.dartDeferredLibraryLoader=function(e,r,f){try{load(e),r()}catch(e){f(e)}}}''';
+
+final _normal = r'''
+var dartNodeIsActuallyNode = typeof process !== "undefined" && (process.versions || {}).hasOwnProperty('node');
+
+// make sure to keep this as 'var'
+// we don't want block scoping
+var self = dartNodeIsActuallyNode ? Object.create(globalThis) : globalThis;
+
+self.scheduleImmediate = typeof setImmediate !== "undefined"
+    ? function (cb) {
+        setImmediate(cb);
+      }
+    : function(cb) {
+        setTimeout(cb, 0);
+      };
+
+// CommonJS globals.
+if (typeof require !== "undefined") {
+  self.require = require;
+}
+if (typeof exports !== "undefined") {
+  self.exports = exports;
+}
+
+// Node.js specific exports, check to see if they exist & or polyfilled
+
+if (typeof process !== "undefined") {
+  self.process = process;
+}
+
+if (typeof __dirname !== "undefined") {
+  self.__dirname = __dirname;
+}
+
+if (typeof __filename !== "undefined") {
+  self.__filename = __filename;
+}
+
+if (typeof Buffer !== "undefined") {
+  self.Buffer = Buffer;
+}
+
+// if we're running in a browser, Dart supports most of this out of box
+// make sure we only run these in Node.js environment
+
+if (dartNodeIsActuallyNode) {
+  // This line is to:
+  // 1) Prevent Webpack from bundling.
+  // 2) In Webpack on Node.js, make sure we're using the native Node.js require, which is available via __non_webpack_require__
+  // https://github.com/mbullington/node_preamble.dart/issues/18#issuecomment-527305561
+  var url = ("undefined" !== typeof __webpack_require__ ? __non_webpack_require__ : require)("url");
+
+  // Setting `self.location=` in Electron throws a `TypeError`, so we define it
+  // as a property instead to be safe.
+  Object.defineProperty(self, "location", {
+    value: {
+      get href() {
+        if (url.pathToFileURL) {
+          return url.pathToFileURL(process.cwd()).href + "/";
+        } else {
+          // This isn't really a correct transformation, but it's the best we have
+          // for versions of Node <10.12.0 which introduced `url.pathToFileURL()`.
+          // For example, it will fail for paths that contain characters that need
+          // to be escaped in URLs.
+          return "file://" + (function() {
+            var cwd = process.cwd();
+            if (process.platform != "win32") return cwd;
+            return "/" + cwd.replace(/\\/g, "/");
+          })() + "/"
+        }
+      }
+    }
+  });
+
+  (function() {
+    function computeCurrentScript() {
+      try {
+        throw new Error();
+      } catch(e) {
+        var stack = e.stack;
+        var re = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "mg");
+        var lastMatch = null;
+        do {
+          var match = re.exec(stack);
+          if (match != null) lastMatch = match;
+        } while (match != null);
+        return lastMatch[1];
+      }
+    }
+
+    // Setting `self.document=` isn't known to throw an error anywhere like
+    // `self.location=` does on Electron, but it's better to be future-proof
+    // just in case..
+    var cachedCurrentScript = null;
+    Object.defineProperty(self, "document", {
+      value: {
+        get currentScript() {
+          if (cachedCurrentScript == null) {
+            cachedCurrentScript = {src: computeCurrentScript()};
+          }
+          return cachedCurrentScript;
+        }
+      }
+    });
+  })();
+
+  self.dartDeferredLibraryLoader = function(uri, successCallback, errorCallback) {
+    try {
+     load(uri);
+      successCallback();
+    } catch (error) {
+      errorCallback(error);
+    }
+  };
+}
+''';
+
+/// Returns the text of the preamble.
+///
+/// If [minified] is true, returns the minified version rather than the
+/// human-readable version.
+String getPreamble(
+        {bool minified = false, List<String> additionalGlobals = const []}) =>
+    (minified ? _minified : _normal) +
+    (additionalGlobals.map((global) => 'self.$global=$global;').join());
diff --git a/pkgs/test/pubspec.yaml b/pkgs/test/pubspec.yaml
index 0ab65ad..fb64ed5 100644
--- a/pkgs/test/pubspec.yaml
+++ b/pkgs/test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: test
-version: 1.25.12
+version: 1.25.13-wip
 description: >-
   A full featured library for writing and running Dart tests across platforms.
 repository: https://github.com/dart-lang/test/tree/master/pkgs/test
@@ -22,7 +22,6 @@
   # properly constrains all features it provides.
   matcher: '>=0.12.16 <0.12.17'
 
-  node_preamble: ^2.0.0
   package_config: ^2.0.0
   path: ^1.8.0
   pool: ^1.5.0
diff --git a/pkgs/test/test/runner/precompiled_test.dart b/pkgs/test/test/runner/precompiled_test.dart
index 51dde28..d6f06ab 100644
--- a/pkgs/test/test/runner/precompiled_test.dart
+++ b/pkgs/test/test/runner/precompiled_test.dart
@@ -10,9 +10,9 @@
 import 'dart:io';
 import 'dart:isolate';
 
-import 'package:node_preamble/preamble.dart' as preamble;
 import 'package:package_config/package_config.dart';
 import 'package:path/path.dart' as p;
+import 'package:test/src/runner/node/preamble.dart';
 import 'package:test/test.dart';
 import 'package:test_descriptor/test_descriptor.dart' as d;
 import 'package:test_process/test_process.dart';
@@ -102,7 +102,7 @@
 
       var jsFile = File(jsPath);
       await jsFile.writeAsString(
-          preamble.getPreamble(minified: true) + await jsFile.readAsString());
+          getPreamble(minified: true) + await jsFile.readAsString());
 
       await d.dir('test', [d.file('test.dart', 'invalid dart}')]).create();
     });