@netlify/dev-utils
Advanced tools
Comparing version
import { Context } from '@netlify/types'; | ||
import * as ansis from 'ansis'; | ||
import { ExecaChildProcess } from 'execa'; | ||
import { ServerResponse, IncomingMessage } from 'node:http'; | ||
import { FSWatcher } from 'chokidar'; | ||
@@ -108,2 +109,5 @@ import { EventEmitter } from 'node:events'; | ||
declare const toWebRequest: (nodeReq: IncomingMessage, urlPath?: string) => Request; | ||
declare const fromWebResponse: (webRes: Response, res: ServerResponse) => Promise<void>; | ||
interface WatchDebouncedOptions { | ||
@@ -203,2 +207,2 @@ depth?: number; | ||
export { type DevEvent, type DevEventHandler, EventInspector, Fixture, type Geolocation, HTTPServer, type Handler, LocalState, type Logger, type MemoizeCache, MockFetch, type ProcessRef, createImageServerHandler, createMockLogger, ensureNetlifyIgnore, generateImage, getAPIToken, getImageResponseSize, globalConfig, headers, killProcess, memoize, mockLocation, netlifyBanner, netlifyCommand, netlifyCyan, renderFunctionErrorPage, shouldBase64Encode, toMultiValueHeaders, watchDebounced }; | ||
export { type DevEvent, type DevEventHandler, EventInspector, Fixture, type Geolocation, HTTPServer, type Handler, LocalState, type Logger, type MemoizeCache, MockFetch, type ProcessRef, createImageServerHandler, createMockLogger, ensureNetlifyIgnore, fromWebResponse, generateImage, getAPIToken, getImageResponseSize, globalConfig, headers, killProcess, memoize, mockLocation, netlifyBanner, netlifyCommand, netlifyCyan, renderFunctionErrorPage, shouldBase64Encode, toMultiValueHeaders, toWebRequest, watchDebounced }; |
@@ -402,2 +402,51 @@ var __defProp = Object.defineProperty; | ||
// src/lib/reqres.ts | ||
import { Readable } from "stream"; | ||
var normalizeHeaders = (headers2) => { | ||
const result = []; | ||
for (const [key, value] of Object.entries(headers2)) { | ||
if (Array.isArray(value)) { | ||
result.push([key, value.join(",")]); | ||
} else if (typeof value === "string") { | ||
result.push([key, value]); | ||
} | ||
} | ||
return result; | ||
}; | ||
var toWebRequest = (nodeReq, urlPath) => { | ||
const { method, headers: headers2, url = "" } = nodeReq; | ||
const ac = new AbortController(); | ||
const origin = `http://${headers2.host ?? "localhost"}`; | ||
const fullUrl = new URL(urlPath ?? url, origin); | ||
const webStream = Readable.toWeb(nodeReq); | ||
nodeReq.once("aborted", () => { | ||
ac.abort(); | ||
}); | ||
return new Request(fullUrl.href, { | ||
method, | ||
headers: normalizeHeaders(headers2), | ||
body: method === "GET" || method === "HEAD" ? null : webStream, | ||
// @ts-expect-error -- Not typed | ||
duplex: "half" | ||
}); | ||
}; | ||
var fromWebResponse = async (webRes, res) => { | ||
res.statusCode = webRes.status; | ||
webRes.headers.forEach((value, name) => { | ||
res.setHeader(name, value); | ||
}); | ||
if (webRes.body) { | ||
const reader = webRes.body.getReader(); | ||
const writer = res; | ||
while (true) { | ||
const { done, value } = await reader.read(); | ||
if (done) { | ||
break; | ||
} | ||
writer.write(value); | ||
} | ||
} | ||
res.end(); | ||
}; | ||
// src/lib/watch-debounced.ts | ||
@@ -484,3 +533,3 @@ import { once } from "events"; | ||
import assert from "assert"; | ||
import { Readable } from "stream"; | ||
import { Readable as Readable2 } from "stream"; | ||
var MockFetch = class { | ||
@@ -543,3 +592,3 @@ originalFetch; | ||
} else { | ||
requestBody = await readAsString(Readable.fromWeb(options.body)); | ||
requestBody = await readAsString(Readable2.fromWeb(options.body)); | ||
} | ||
@@ -745,2 +794,3 @@ } | ||
ensureNetlifyIgnore, | ||
fromWebResponse, | ||
generateImage, | ||
@@ -760,3 +810,4 @@ getAPIToken, | ||
toMultiValueHeaders, | ||
toWebRequest, | ||
watchDebounced | ||
}; |
{ | ||
"name": "@netlify/dev-utils", | ||
"version": "3.2.2", | ||
"version": "3.3.0", | ||
"description": "TypeScript utilities for the local emulation of the Netlify environment", | ||
@@ -5,0 +5,0 @@ "type": "module", |
31858
5.5%970
5.78%