helloadhavan/github_issues huggingface dataset:
Repository: vercel/next.js
Pull request: Update Turbopack development test manifest

This auto-generated PR updates the development integration test manifest used when testing Turbopack.

Changed files:
filename: test/turbopack-dev-tests-manifest.json
patch: @@ -2633,7 +2633,10 @@
     "runtimeError": false
   },
   "test/development/app-dir/segment-explorer/segment-explorer.test.ts": {
-    "passed": ["segment-explorer should render the segment explorer"],
+    "passed": [
+      "segment-explorer should render the segment explorer for nested routes",
+      "segment-explorer should render the segment explorer for parallel routes"
+    ],
     "failed": [],
     "pending": [],
     "flakey": [],
@@ -3404,6 +3407,15 @@
     "flakey": [],
     "runtimeError": false
   },
+  "test/development/dev-indicator/dev-rendering-indicator.test.ts": {
+    "passed": [
+      "Dev Rendering Indicator Shows build indicator when page is built from modifying"
+    ],
+    "failed": [],
+    "pending": [],
+    "flakey": [],
+    "runtimeError": false
+  },
   "test/development/dotenv-default-expansion/index.test.ts": {
     "passed": ["Dotenv default expansion should work"],
     "failed": [],
@@ -8058,6 +8070,7 @@
       "ppr-metadata-streaming dynamic metadata should generate metadata in body when page is fully dynamic",
       "ppr-metadata-streaming partial shell should insert metadata into body with dynamic metadata and wrapped under layout Suspense boundary",
       "ppr-metadata-streaming partial shell should insert metadata into head with dynamic metadata and dynamic page wrapped under layout Suspense boundary",
+      "ppr-metadata-streaming partial shell should not yield hydration errors after revalidation",
       "ppr-metadata-streaming static metadata should generate metadata in head when page is fully static",
       "ppr-metadata-streaming static metadata should insert metadata in body when page is dynamic page content"
     ],
@@ -9490,6 +9503,7 @@
       "use-cache can reference server actions in \"use cache\" functions",
       "use-cache renders the not-found page when `notFound()` is used",
       "use-cache replays logs from \"use cache\" functions",
+      "use-cache shares caches between the page/layout and generateMetadata",
       "use-cache should be able to revalidate a page using unstable_expireTag",
       "use-cache should cache complex args",
       "use-cache should cache fetch without no-store",
Repository: nodejs/node
Pull request: esm: fix import.meta.resolve crash

Fixes: https://github.com/nodejs/node/issues/55518


Changed files:
filename: src/node_modules.cc
patch: @@ -412,7 +412,10 @@ void BindingData::GetPackageScopeConfig(
     }
 
     auto file_url = url::FileURLToPath(realm->env(), *package_json_url);
-    CHECK(file_url);
+    if (!file_url) {
+      url::ThrowInvalidURL(realm->env(), resolved.ToStringView(), std::nullopt);
+      return;
+    }
     error_context.specifier = resolved.ToString();
     auto package_json = GetPackageJSON(realm, *file_url, &error_context);
     if (package_json != nullptr) {

filename: test/es-module/test-esm-import-meta-resolve.mjs
patch: @@ -106,3 +106,15 @@ await assert.rejects(import('data:text/javascript,export default import.meta.res
     stdout: 'http://example.com/\n',
   });
 }
+
+{
+  const result = await spawnPromisified(execPath, [
+    '--no-warnings',
+    '--experimental-import-meta-resolve',
+    '--eval',
+    'import.meta.resolve("foo", "http://example.com/bar.js")',
+  ]);
+  assert.match(result.stderr, /ERR_INVALID_URL/);
+  assert.strictEqual(result.stdout, '');
+  assert.strictEqual(result.code, 1);
+}
Repository: denoland/deno
Pull request: fix(outdated): respect --quiet flag for hints


Changed files:
filename: cli/tools/registry/pm/outdated.rs
patch: @@ -100,15 +100,14 @@ fn print_outdated_table(packages: &[OutdatedPackage]) {
   println!("└{package_fill}┴{current_fill}┴{update_fill}┴{latest_fill}┘",);
 }
 
-#[allow(clippy::print_stdout)]
 fn print_suggestion(compatible: bool) {
-  println!();
+  log::info!("");
   let (cmd, txt) = if compatible {
     ("", "compatible")
   } else {
     (" --latest", "available")
   };
-  println!(
+  log::info!(
     "{}",
     color_print::cformat!(
       "<p(245)>Run</> <u>deno outdated --update{}</> <p(245)>to update to the latest {} versions,</>\n<p(245)>or</> <u>deno outdated --help</> <p(245)>for more information.</>",

filename: tests/specs/update/deno_json/__test__.jsonc
patch: @@ -26,6 +26,11 @@
         {
           "args": "outdated",
           "output": "outdated.out"
+        },
+        {
+          // Respect `--quiet flag and don't print hint how to update
+          "args": "outdated --quiet",
+          "output": "outdated_quiet.out"
         }
       ]
     },

filename: tests/specs/update/deno_json/outdated_quiet.out
patch: @@ -0,0 +1,15 @@
+┌────────────────────────────────────────────────┬─────────┬────────┬────────┐
+│ Package                                        │ Current │ Update │ Latest │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ jsr:@denotest/multiple-exports                 │ 0.2.0   │ 0.2.0  │ 1.0.0  │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ jsr:@denotest/subtract                         │ 0.2.0   │ 0.2.0  │ 1.0.0  │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ jsr:@denotest/add                              │ 0.2.0   │ 0.2.1  │ 1.0.0  │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ npm:@denotest/has-patch-versions               │ 0.1.0   │ 0.1.1  │ 0.2.0  │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ npm:@denotest/bin                              │ 0.6.0   │ 0.6.0  │ 1.0.0  │
+├────────────────────────────────────────────────┼─────────┼────────┼────────┤
+│ npm:@denotest/breaking-change-between-versions │ 1.0.0   │ 1.0.0  │ 2.0.0  │
+└────────────────────────────────────────────────┴─────────┴────────┴────────┘
Repository: facebook/react
Pull request: Distribute bundles more evenly into CI shards

## Summary

Previously, we distributed bundles into shards and then checked if we need to actually build that bundle. This can under-utilize shards heavily (e.g. https://app.circleci.com/pipelines/github/facebook/react/38611/workflows/df9e56e7-d476-49ee-9392-d8b37c81aa66/jobs/630545/parallel-runs/28?filterBy=ALL only building a single bundle).

This won't result in an optimal distribution but, if we're lucky, we might end up with shard #26 not taking 7mins anymore. The slowest shard ultimately decicdes when we can start with testing builds.

## How did you test this change?

- [x] `CIRCLE_NODE_INDEX=28 CIRCLE_NODE_TOTAL=40 yarn build` building more than 1 bundle
- [x] Check timings of `yarn_build` so that we don't up with an over-stuffed shard (e.g. a shard having to build all the expensive bundles). Casually dropping 60min idle time 🎉:
   - Before: https://app.circleci.com/pipelines/github/facebook/react/38683/workflows/a41533d7-811c-439d-9751-214ba06035c5/jobs/632230/timing
   - After: https://app.circleci.com/pipelines/github/facebook/react/38686/workflows/8a770df6-5b3e-41ea-b3b5-10abeae703e7/jobs/632247/timing


Changed files:
filename: scripts/rollup/build.js
patch: @@ -527,10 +527,6 @@ function resolveEntryFork(resolvedEntry, isFBBundle) {
 }
 
 async function createBundle(bundle, bundleType) {
-  if (shouldSkipBundle(bundle, bundleType)) {
-    return;
-  }
-
   const filename = getFilename(bundle, bundleType);
   const logKey =
     chalk.white.bold(filename) + chalk.dim(` (${bundleType.toLowerCase()})`);
@@ -766,6 +762,10 @@ async function buildEverything() {
     );
   }
 
+  bundles = bundles.filter(([bundle, bundleType]) => {
+    return !shouldSkipBundle(bundle, bundleType);
+  });
+
   if (process.env.CIRCLE_NODE_TOTAL) {
     // In CI, parallelize bundles across multiple tasks.
     const nodeTotal = parseInt(process.env.CIRCLE_NODE_TOTAL, 10);
Repository: huggingface/transformers
Pull request: [llava] fix integration tests with Siglip

# What does this PR do?

Fixes https://github.com/huggingface/transformers/pull/38722#issuecomment-2958809929


Changed files:
filename: tests/models/llava/test_modeling_llava.py
patch: @@ -557,10 +557,6 @@ def test_generation_siglip_backbone(self):
         model = LlavaForConditionalGeneration.from_pretrained(model_id, torch_dtype="float16", device_map=torch_device)
         processor = AutoProcessor.from_pretrained(model_id)
 
-        # check processing with expansion of inputs (w/o expansion should work with any backbone)
-        processor.vision_feature_select_strategy = "default"
-        processor.patch_size = 14
-
         image_file = "http://images.cocodataset.org/val2017/000000039769.jpg"
         raw_image = Image.open(requests.get(image_file, stream=True).raw)
         inputs = processor(
Repository: denoland/deno
Pull request: perf(compile): improve FileBackedVfsFile

Noticed this while working on another issue.

Changed files:
filename: cli/standalone/virtual_fs.rs
patch: @@ -1,6 +1,7 @@
 // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
 
 use std::borrow::Cow;
+use std::cell::RefCell;
 use std::collections::HashMap;
 use std::collections::HashSet;
 use std::fs::File;
@@ -637,18 +638,17 @@ impl VfsRoot {
   }
 }
 
-#[derive(Clone)]
 struct FileBackedVfsFile {
   file: VirtualFile,
-  pos: Arc<Mutex<u64>>,
+  pos: RefCell<u64>,
   vfs: Arc<FileBackedVfs>,
 }
 
 impl FileBackedVfsFile {
   fn seek(&self, pos: SeekFrom) -> FsResult<u64> {
     match pos {
       SeekFrom::Start(pos) => {
-        *self.pos.lock() = pos;
+        *self.pos.borrow_mut() = pos;
         Ok(pos)
       }
       SeekFrom::End(offset) => {
@@ -659,7 +659,7 @@ impl FileBackedVfsFile {
               .into(),
           )
         } else {
-          let mut current_pos = self.pos.lock();
+          let mut current_pos = self.pos.borrow_mut();
           *current_pos = if offset >= 0 {
             self.file.offset.len - (offset as u64)
           } else {
@@ -669,7 +669,7 @@ impl FileBackedVfsFile {
         }
       }
       SeekFrom::Current(offset) => {
-        let mut current_pos = self.pos.lock();
+        let mut current_pos = self.pos.borrow_mut();
         if offset >= 0 {
           *current_pos += offset as u64;
         } else if -offset as u64 > *current_pos {
@@ -684,7 +684,7 @@ impl FileBackedVfsFile {
 
   fn read_to_buf(&self, buf: &mut [u8]) -> FsResult<usize> {
     let read_pos = {
-      let mut pos = self.pos.lock();
+      let mut pos = self.pos.borrow_mut();
       let read_pos = *pos;
       // advance the position due to the read
       *pos = std::cmp::min(self.file.offset.len, *pos + buf.len() as u64);
@@ -698,7 +698,7 @@ impl FileBackedVfsFile {
 
   fn read_to_end(&self) -> FsResult<Cow<'static, [u8]>> {
     let read_pos = {
-      let mut pos = self.pos.lock();
+      let mut pos = self.pos.borrow_mut();
       let read_pos = *pos;
       // todo(dsherret): should this always set it to the end of the file?
       if *pos < self.file.offset.len {
@@ -734,12 +734,9 @@ impl deno_io::fs::File for FileBackedVfsFile {
     self: Rc<Self>,
     mut buf: BufMutView,
   ) -> FsResult<(usize, BufMutView)> {
-    let inner = (*self).clone();
-    tokio::task::spawn(async move {
-      let nread = inner.read_to_buf(&mut buf)?;
-      Ok((nread, buf))
-    })
-    .await?
+    // this is fast, no need to spawn a task
+    let nread = self.read_to_buf(&mut buf)?;
+    Ok((nread, buf))
   }
 
   fn write_sync(self: Rc<Self>, _buf: &[u8]) -> FsResult<usize> {
@@ -763,8 +760,8 @@ impl deno_io::fs::File for FileBackedVfsFile {
     self.read_to_end()
   }
   async fn read_all_async(self: Rc<Self>) -> FsResult<Cow<'static, [u8]>> {
-    let inner = (*self).clone();
-    tokio::task::spawn_blocking(move || inner.read_to_end()).await?
+    // this is fast, no need to spawn a task
+    self.read_to_end()
   }
 
   fn chmod_sync(self: Rc<Self>, _pathmode: u32) -> FsResult<()> {
Repository: ggml-org/llama.cpp
Pull request: sync : ggml


Changed files:
filename: scripts/sync-ggml.last
patch: @@ -1 +1 @@
-56938c4a3b2d923f42040f9ad32d229c76c466cd
+b7bfde9c88aa4b063ce68dab6cc4f5c6caae37fd
Repository: facebook/react
Pull request: Fail yarn build if any bundle fails to build

## Summary

`yarn build` would previously still exit with zero exit code hiding build errors such as https://app.circleci.com/pipelines/github/facebook/react/38609/workflows/62a73635-3bf3-4264-8c48-a61844a27764/jobs/630503/parallel-runs/11?filterBy=ALL&invite=true#step-105-17. These issues are still surfaced due to missing size bot artifacts but the overall PR status would still be green which we don't want.

Now we just exit with the same exit has a the process of a single build if it's non-zero.

## How did you test this change?

- [x] fails based on the parent of 62e6c4612ec704cf07c99b318bc8f26d3ec3f588: https://app.circleci.com/pipelines/github/facebook/react/38681/workflows/654c68ed-cebc-48d4-a156-bac719772f6f/jobs/632166
- [x] passes based on `main`


Changed files:
filename: scripts/rollup/build-all-release-channels.js
patch: @@ -93,15 +93,24 @@ if (process.env.CIRCLE_NODE_TOTAL) {
 }
 
 function buildForChannel(channel, nodeTotal, nodeIndex) {
-  spawnSync('node', ['./scripts/rollup/build.js', ...process.argv.slice(2)], {
-    stdio: ['pipe', process.stdout, process.stderr],
-    env: {
-      ...process.env,
-      RELEASE_CHANNEL: channel,
-      CIRCLE_NODE_TOTAL: nodeTotal,
-      CIRCLE_NODE_INDEX: nodeIndex,
-    },
-  });
+  const {status} = spawnSync(
+    'node',
+    ['./scripts/rollup/build.js', ...process.argv.slice(2)],
+    {
+      stdio: ['pipe', process.stdout, process.stderr],
+      env: {
+        ...process.env,
+        RELEASE_CHANNEL: channel,
+        CIRCLE_NODE_TOTAL: nodeTotal,
+        CIRCLE_NODE_INDEX: nodeIndex,
+      },
+    }
+  );
+
+  if (status !== 0) {
+    // Error of spawned process is already piped to this stderr
+    process.exit(status);
+  }
 }
 
 function processStable(buildDir) {
Repository: huggingface/transformers
Pull request: Fixed a multiple-devices issue in SmolVLM model

This PR fixes a multiple-devices issue in SmolVLM model. It was originally fixed in the `amd-hf-ci-branch` but it would be nice to have it in `main`.

Without this PR, the test `tests/models/smolvlm/test_modeling_smolvlm.py::SmolVLMForConditionalGenerationIntegrationTest::test_integration_test` failed on MI3XX machines.

cc. @zucchini-nlp (I think)

Changed files:
filename: src/transformers/models/smolvlm/modeling_smolvlm.py
patch: @@ -750,7 +750,7 @@ def forward(
         if pixel_values is not None and image_hidden_states is not None:
             raise ValueError("You cannot specify both pixel_values and image_hidden_states at the same time")
         elif pixel_values is not None:
-            image_hidden_states = self.get_image_features(pixel_values, pixel_attention_mask)
+            image_hidden_states = self.get_image_features(pixel_values, pixel_attention_mask).to(input_ids.device)
         elif image_hidden_states is not None:
             image_hidden_states = image_hidden_states.to(dtype=self.dtype, device=input_ids.device)
 

filename: src/transformers/models/smolvlm/modular_smolvlm.py
patch: @@ -307,7 +307,7 @@ def forward(
         if pixel_values is not None and image_hidden_states is not None:
             raise ValueError("You cannot specify both pixel_values and image_hidden_states at the same time")
         elif pixel_values is not None:
-            image_hidden_states = self.get_image_features(pixel_values, pixel_attention_mask)
+            image_hidden_states = self.get_image_features(pixel_values, pixel_attention_mask).to(input_ids.device)
         elif image_hidden_states is not None:
             image_hidden_states = image_hidden_states.to(dtype=self.dtype, device=input_ids.device)
Repository: ggml-org/llama.cpp
Pull request: quantize: fix minor logic flaw in --tensor-type

When two or more quant types are specified for the same tensor, the last entry will win

Changed files:
filename: src/llama-quant.cpp
patch: @@ -884,8 +884,7 @@ static void llama_model_quantize_impl(const std::string & fname_inp, const std::
                         if (std::regex pattern(tname); std::regex_search(tensor_name, pattern)) {
                             if  (qtype != new_type) {
                                 LLAMA_LOG_DEBUG("(overriding %s) ", ggml_type_name(new_type));
-                                new_type = qtype;
-                                break; // if two or more types are specified for the tensor, first match wins
+                                new_type = qtype; // if two or more types are specified for the same tensor, the last match wins
                             }
                         }
                     }
Repository: nodejs/node
Pull request: fs: fix bufferSize option for opendir recursive

The bufferSize option was not respected in recursive mode. This PR
implements a naive solution to fix this issue until a better
implementation can be designed.

Fixes: https://github.com/nodejs/node/issues/48820

Changed files:
filename: lib/internal/fs/dir.js
patch: @@ -164,12 +164,16 @@ class Dir {
       return;
     }
 
-    const result = handle.read(
+    // Fully read the directory and buffer the entries.
+    // This is a naive solution and for very large sub-directories
+    // it can even block the event loop. Essentially, `bufferSize` is
+    // not respected for recursive mode. This is a known limitation.
+    // Issue to fix: https://github.com/nodejs/node/issues/55764
+    let result;
+    while ((result = handle.read(
       this.#options.encoding,
       this.#options.bufferSize,
-    );
-
-    if (result) {
+    ))) {
       this.processReadResult(path, result);
     }
 

filename: test/sequential/test-fs-opendir-recursive.js
patch: @@ -132,6 +132,7 @@ function getDirentPath(dirent) {
 }
 
 function assertDirents(dirents) {
+  assert.strictEqual(dirents.length, expected.length);
   dirents.sort((a, b) => (getDirentPath(a) < getDirentPath(b) ? -1 : 1));
   assert.deepStrictEqual(
     dirents.map((dirent) => {
@@ -221,3 +222,21 @@ function processDirCb(dir, cb) {
 
   test().then(common.mustCall());
 }
+
+// Issue https://github.com/nodejs/node/issues/48820 highlights that
+// opendir recursive does not properly handle the buffer size option.
+// This test asserts that the buffer size option is respected.
+{
+  const dir = fs.opendirSync(testDir, { bufferSize: 1, recursive: true });
+  processDirSync(dir);
+  dir.closeSync();
+}
+
+{
+  fs.opendir(testDir, { recursive: true, bufferSize: 1 }, common.mustSucceed((dir) => {
+    processDirCb(dir, common.mustSucceed((dirents) => {
+      assertDirents(dirents);
+      dir.close(common.mustSucceed());
+    }));
+  }));
+}
Repository: electron/electron
Pull request: fix: `utilityProcess` pid should be `undefined` after exit

Backport of #44677

See that PR for details.


Notes: Fixed an issue where a `utilityProcess` pid would not be `undefined` after exit.

Changed files:
filename: docs/api/utility-process.md
patch: @@ -92,6 +92,8 @@ the child process exits, then the value is `undefined` after the `exit` event is
 ```js
 const child = utilityProcess.fork(path.join(__dirname, 'test.js'))
 
+console.log(child.pid) // undefined
+
 child.on('spawn', () => {
   console.log(child.pid) // Integer
 })
@@ -101,6 +103,8 @@ child.on('exit', () => {
 })
 ```
 
+**Note:** You can use the `pid` to determine if the process is currently running.
+
 #### `child.stdout`
 
 A `NodeJS.ReadableStream | null` that represents the child process's stdout.

filename: shell/browser/api/electron_api_utility_process.cc
patch: @@ -254,6 +254,8 @@ void UtilityProcessWrapper::HandleTermination(uint64_t exit_code) {
 
   if (pid_ != base::kNullProcessId)
     GetAllUtilityProcessWrappers().Remove(pid_);
+
+  pid_ = base::kNullProcessId;
   CloseConnectorPort();
   EmitWithoutEvent("exit", exit_code);
   Unpin();

filename: spec/api-utility-process-spec.ts
patch: @@ -210,13 +210,31 @@ describe('utilityProcess module', () => {
     it('is valid when child process launches successfully', async () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
       await once(child, 'spawn');
-      expect(child.pid).to.not.be.null();
+      expect(child).to.have.property('pid').that.is.a('number');
     });
 
     it('is undefined when child process fails to launch', async () => {
       const child = utilityProcess.fork(path.join(fixturesPath, 'does-not-exist.js'));
       expect(child.pid).to.be.undefined();
     });
+
+    it('is undefined before the child process is spawned succesfully', async () => {
+      const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
+      expect(child.pid).to.be.undefined();
+      await once(child, 'spawn');
+      child.kill();
+    });
+
+    it('is undefined when child process is killed', async () => {
+      const child = utilityProcess.fork(path.join(fixturesPath, 'empty.js'));
+      await once(child, 'spawn');
+
+      expect(child).to.have.property('pid').that.is.a('number');
+      expect(child.kill()).to.be.true();
+
+      await once(child, 'exit');
+      expect(child.pid).to.be.undefined();
+    });
   });
 
   describe('stdout property', () => {
Repository: denoland/deno
Pull request: fix(node): update list of builtin node modules, add missing export to _http_common

Fixes https://github.com/denoland/deno/issues/27289

We exported these but forgot to add them to the list of builtins used by the resolver, so we weren't resolving bare imports of some modules (e.g. `"_http_common"`)

Also adds a missing export of `HTTPParser` from `_http_common`

Changed files:
filename: cli/lsp/completions.rs
patch: @@ -743,13 +743,16 @@ fn get_node_completions(
   }
   let items = SUPPORTED_BUILTIN_NODE_MODULES
     .iter()
-    .map(|name| {
+    .filter_map(|name| {
+      if name.starts_with('_') {
+        return None;
+      }
       let specifier = format!("node:{}", name);
       let text_edit = Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
         range: *range,
         new_text: specifier.clone(),
       }));
-      lsp::CompletionItem {
+      Some(lsp::CompletionItem {
         label: specifier,
         kind: Some(lsp::CompletionItemKind::FILE),
         detail: Some("(node)".to_string()),
@@ -758,7 +761,7 @@ fn get_node_completions(
           IMPORT_COMMIT_CHARS.iter().map(|&c| c.into()).collect(),
         ),
         ..Default::default()
-      }
+      })
     })
     .collect();
   Some(CompletionList {

filename: ext/node/polyfill.rs
patch: @@ -25,6 +25,17 @@ macro_rules! generate_builtin_node_module_lists {
 
 // NOTE(bartlomieju): keep this list in sync with `ext/node/polyfills/01_require.js`
 generate_builtin_node_module_lists! {
+  "_http_agent",
+  "_http_common",
+  "_http_outgoing",
+  "_http_server",
+  "_stream_duplex",
+  "_stream_passthrough",
+  "_stream_readable",
+  "_stream_transform",
+  "_stream_writable",
+  "_tls_common",
+  "_tls_wrap",
   "assert",
   "assert/strict",
   "async_hooks",

filename: ext/node/polyfills/_http_common.ts
patch: @@ -7,6 +7,7 @@ const {
   SafeRegExp,
   Symbol,
 } = primordials;
+import { HTTPParser } from "ext:deno_node/internal_binding/http_parser.ts";
 
 export const CRLF = "\r\n";
 export const kIncomingMessage = Symbol("IncomingMessage");
@@ -79,6 +80,8 @@ export {
   checkIsHttpToken as _checkIsHttpToken,
 };
 
+export { HTTPParser };
+
 export default {
   _checkInvalidHeaderChar: checkInvalidHeaderChar,
   _checkIsHttpToken: checkIsHttpToken,
@@ -87,4 +90,5 @@ export default {
   continueExpression,
   kIncomingMessage,
   methods,
+  HTTPParser,
 };