Skip to content

jcbhmr/fetch-with-file-support

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

30 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

fetch() with file: support

πŸ“‚ fetch() but with support for file:///my/file.txt URLs

// Native Node.js fetch
const response = await fetch(import.meta.resolve("./data.txt"));
const text = await response.text();
console.log(text);
// πŸ›‘ TypeError: fetch failed
//   cause: Error: not implemented... yet...
// Using fetch-with-file-support in Node.js
import { fetch } from "fetch-with-file-support";
const response = await fetch(import.meta.resolve("./data.txt"));
const text = await response.text();
console.log(text);
// 'Hello from data.txt!'

πŸ”Ž Works great for writing isomorphic fetch(import.meta.resolve()) code
🌊 Uses fs.createReadStream() for streaming reads
πŸ¦• Mirrors Deno's implementation of fetch() for file: URLs

Installation

npm pnpm Yarn Bun Deno

You can install this package using your favorite npm package manager like npm, Yarn, pnpm, or Bun.

npm install fetch-with-file-support

β„Ή Deno already supports fetch()-ing file: URLs. This package will delegate to the native fetch() implementation.

πŸ›‘ In browsers this will delegate to the global fetch() function. Some browsers support fetch()-ing file: URLs while others do not. Some support file: URLs only under special circumstances.

Usage

Node.js Deno Bun

The quickest way to get started is to import the fetch() function straight from the module:

import { fetch } from "fetch-with-file-support";

const response = await fetch(import.meta.resolve("./package.json"));
const json = await response.json();

This is very useful when writing code that imports configuration, data, or other information from a file located right next to the .js source file. WASM is a good example.

import { fetch } from "fetch-with-file-support";

// Normally 'fetch("file:///mypkg/app_bg.wasm")' would fail in Node.js!
const { module, instance } = await WebAssembly.instantiateStreaming(
  fetch(import.meta.resolve("./app_bg.wasm")),
  imports,
);

🌎 If you prefer global polyfills, you can import fetch-with-file-support/auto.

import "fetch-with-file-support/auto";
const response = await fetch(import.meta.resolve("./data.json"));
const json = await response.json();

Development

Node.js TypeScript