wrangler
Advanced tools
Comparing version 0.0.0-dfa31a7 to 0.0.0-e5182f6
@@ -1,2 +0,2 @@ | ||
#!/usr/bin/env node --no-warnings | ||
#!/usr/bin/env node --no-warnings --experimental-vm-modules | ||
require("../wrangler-dist/index_node.js"); |
{ | ||
"name": "wrangler", | ||
"version": "0.0.0-dfa31a7", | ||
"version": "0.0.0-e5182f6", | ||
"author": "wrangler@cloudflare.com", | ||
@@ -36,5 +36,5 @@ "description": "Command-line interface for all things Cloudflare Workers", | ||
"dependencies": { | ||
"esbuild": "^0.12.19", | ||
"miniflare": "^1.3.3", | ||
"yargs": "^17.1.1" | ||
"esbuild": "^0.13.12", | ||
"miniflare": "^1.4.1", | ||
"yargs": "^17.2.1" | ||
}, | ||
@@ -47,10 +47,12 @@ "optionalDependencies": { | ||
"@types/cloudflare": "^2.7.6", | ||
"@types/react": "^17.0.19", | ||
"@types/react": "^17.0.34", | ||
"@types/signal-exit": "^3.0.1", | ||
"@types/ws": "^7.4.7", | ||
"@types/yargs": "^17.0.2", | ||
"clipboardy": "^2.3.0", | ||
"@types/ws": "^8.2.0", | ||
"@types/yargs": "^17.0.5", | ||
"clipboardy": "^3.0.0", | ||
"cloudflare": "^2.9.1", | ||
"find-up": "^6.0.0", | ||
"formdata-node": "^3.6.3", | ||
"command-exists": "^1.2.9", | ||
"finalhandler": "^1.1.2", | ||
"find-up": "^6.2.0", | ||
"formdata-node": "^4.3.1", | ||
"http-proxy": "^1.18.1", | ||
@@ -60,7 +62,8 @@ "ink": "^3.2.0", | ||
"node-fetch": "github:tekwiz/node-fetch#fix/redirect-with-empty-chunked-transfer-encoding", | ||
"open": "^8.2.1", | ||
"open": "^8.4.0", | ||
"react": "^17.0.2", | ||
"serve-static": "^1.14.1", | ||
"signal-exit": "^3.0.5", | ||
"tmp-promise": "^3.0.2", | ||
"ws": "^8.2.0" | ||
"tmp-promise": "^3.0.3", | ||
"ws": "^8.2.3" | ||
}, | ||
@@ -71,3 +74,3 @@ "files": [ | ||
"wrangler-dist", | ||
"facade.js", | ||
"static-asset-facade.js", | ||
"vendor" | ||
@@ -74,0 +77,0 @@ ], |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
var __awaiter = | ||
(this && this.__awaiter) || | ||
function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { | ||
return value instanceof P | ||
? value | ||
: new P(function (resolve) { | ||
resolve(value); | ||
}); | ||
} | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
function fulfilled(value) { | ||
try { | ||
step(generator.next(value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
} | ||
function rejected(value) { | ||
try { | ||
step(generator["throw"](value)); | ||
} catch (e) { | ||
reject(e); | ||
} | ||
} | ||
function step(result) { | ||
result.done | ||
? resolve(result.value) | ||
: adopt(result.value).then(fulfilled, rejected); | ||
} | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.InternalError = exports.NotFoundError = exports.MethodNotAllowedError = exports.serveSinglePageApp = exports.mapRequestToAsset = exports.getAssetFromKV = void 0; | ||
const mime = require("mime"); | ||
exports.InternalError = | ||
exports.NotFoundError = | ||
exports.MethodNotAllowedError = | ||
exports.serveSinglePageApp = | ||
exports.mapRequestToAsset = | ||
exports.getAssetFromKV = | ||
void 0; | ||
const mime = require("wrangler-mime"); | ||
const types_1 = require("./types"); | ||
Object.defineProperty(exports, "MethodNotAllowedError", { enumerable: true, get: function () { return types_1.MethodNotAllowedError; } }); | ||
Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return types_1.NotFoundError; } }); | ||
Object.defineProperty(exports, "InternalError", { enumerable: true, get: function () { return types_1.InternalError; } }); | ||
Object.defineProperty(exports, "MethodNotAllowedError", { | ||
enumerable: true, | ||
get: function () { | ||
return types_1.MethodNotAllowedError; | ||
}, | ||
}); | ||
Object.defineProperty(exports, "NotFoundError", { | ||
enumerable: true, | ||
get: function () { | ||
return types_1.NotFoundError; | ||
}, | ||
}); | ||
Object.defineProperty(exports, "InternalError", { | ||
enumerable: true, | ||
get: function () { | ||
return types_1.InternalError; | ||
}, | ||
}); | ||
const defaultCacheControl = { | ||
browserTTL: null, | ||
edgeTTL: 2 * 60 * 60 * 24, | ||
bypassCache: false, // do not bypass Cloudflare's cache | ||
browserTTL: null, | ||
edgeTTL: 2 * 60 * 60 * 24, | ||
bypassCache: false, // do not bypass Cloudflare's cache | ||
}; | ||
function assignOptions(options) { | ||
// Assign any missing options passed in to the default | ||
// options.mapRequestToAsset is handled manually later | ||
return Object.assign({ | ||
ASSET_NAMESPACE: __STATIC_CONTENT, | ||
ASSET_MANIFEST: __STATIC_CONTENT_MANIFEST, | ||
cacheControl: defaultCacheControl, | ||
defaultMimeType: 'text/plain', | ||
defaultDocument: 'index.html', | ||
}, options); | ||
// Assign any missing options passed in to the default | ||
// options.mapRequestToAsset is handled manually later | ||
return Object.assign( | ||
{ | ||
ASSET_NAMESPACE: __STATIC_CONTENT, | ||
ASSET_MANIFEST: __STATIC_CONTENT_MANIFEST, | ||
cacheControl: defaultCacheControl, | ||
defaultMimeType: "text/plain", | ||
defaultDocument: "index.html", | ||
}, | ||
options | ||
); | ||
} | ||
@@ -42,17 +90,16 @@ /** | ||
const mapRequestToAsset = (request, options) => { | ||
options = assignOptions(options); | ||
const parsedUrl = new URL(request.url); | ||
let pathname = parsedUrl.pathname; | ||
if (pathname.endsWith('/')) { | ||
// If path looks like a directory append options.defaultDocument | ||
// e.g. If path is /about/ -> /about/index.html | ||
pathname = pathname.concat(options.defaultDocument); | ||
} | ||
else if (!mime.getType(pathname)) { | ||
// If path doesn't look like valid content | ||
// e.g. /about.me -> /about.me/index.html | ||
pathname = pathname.concat('/' + options.defaultDocument); | ||
} | ||
parsedUrl.pathname = pathname; | ||
return new Request(parsedUrl.toString(), request); | ||
options = assignOptions(options); | ||
const parsedUrl = new URL(request.url); | ||
let pathname = parsedUrl.pathname; | ||
if (pathname.endsWith("/")) { | ||
// If path looks like a directory append options.defaultDocument | ||
// e.g. If path is /about/ -> /about/index.html | ||
pathname = pathname.concat(options.defaultDocument); | ||
} else if (!mime.getType(pathname)) { | ||
// If path doesn't look like valid content | ||
// e.g. /about.me -> /about.me/index.html | ||
pathname = pathname.concat("/" + options.defaultDocument); | ||
} | ||
parsedUrl.pathname = pathname; | ||
return new Request(parsedUrl.toString(), request); | ||
}; | ||
@@ -66,18 +113,20 @@ exports.mapRequestToAsset = mapRequestToAsset; | ||
function serveSinglePageApp(request, options) { | ||
options = assignOptions(options); | ||
// First apply the default handler, which already has logic to detect | ||
// paths that should map to HTML files. | ||
request = mapRequestToAsset(request, options); | ||
const parsedUrl = new URL(request.url); | ||
// Detect if the default handler decided to map to | ||
// a HTML file in some specific directory. | ||
if (parsedUrl.pathname.endsWith('.html')) { | ||
// If expected HTML file was missing, just return the root index.html (or options.defaultDocument) | ||
return new Request(`${parsedUrl.origin}/${options.defaultDocument}`, request); | ||
} | ||
else { | ||
// The default handler decided this is not an HTML page. It's probably | ||
// an image, CSS, or JS file. Leave it as-is. | ||
return request; | ||
} | ||
options = assignOptions(options); | ||
// First apply the default handler, which already has logic to detect | ||
// paths that should map to HTML files. | ||
request = mapRequestToAsset(request, options); | ||
const parsedUrl = new URL(request.url); | ||
// Detect if the default handler decided to map to | ||
// a HTML file in some specific directory. | ||
if (parsedUrl.pathname.endsWith(".html")) { | ||
// If expected HTML file was missing, just return the root index.html (or options.defaultDocument) | ||
return new Request( | ||
`${parsedUrl.origin}/${options.defaultDocument}`, | ||
request | ||
); | ||
} else { | ||
// The default handler decided this is not an HTML page. It's probably | ||
// an image, CSS, or JS file. Leave it as-is. | ||
return request; | ||
} | ||
} | ||
@@ -96,13 +145,17 @@ exports.serveSinglePageApp = serveSinglePageApp; | ||
* */ | ||
const getAssetFromKV = (event, options) => __awaiter(void 0, void 0, void 0, function* () { | ||
const getAssetFromKV = (event, options) => | ||
__awaiter(void 0, void 0, void 0, function* () { | ||
options = assignOptions(options); | ||
const request = event.request; | ||
const ASSET_NAMESPACE = options.ASSET_NAMESPACE; | ||
const ASSET_MANIFEST = typeof options.ASSET_MANIFEST === 'string' | ||
const ASSET_MANIFEST = | ||
typeof options.ASSET_MANIFEST === "string" | ||
? JSON.parse(options.ASSET_MANIFEST) | ||
: options.ASSET_MANIFEST; | ||
if (typeof ASSET_NAMESPACE === 'undefined') { | ||
throw new types_1.InternalError(`there is no KV namespace bound to the script`); | ||
if (typeof ASSET_NAMESPACE === "undefined") { | ||
throw new types_1.InternalError( | ||
`there is no KV namespace bound to the script` | ||
); | ||
} | ||
const rawPathKey = new URL(request.url).pathname.replace(/^\/+/, ''); // strip any preceding /'s | ||
const rawPathKey = new URL(request.url).pathname.replace(/^\/+/, ""); // strip any preceding /'s | ||
let pathIsEncoded = false; | ||
@@ -113,45 +166,48 @@ let requestKey; | ||
if (options.mapRequestToAsset) { | ||
requestKey = options.mapRequestToAsset(request); | ||
} | ||
else if (ASSET_MANIFEST[rawPathKey]) { | ||
requestKey = request; | ||
} | ||
else if (ASSET_MANIFEST[decodeURIComponent(rawPathKey)]) { | ||
requestKey = options.mapRequestToAsset(request); | ||
} else if (ASSET_MANIFEST[rawPathKey]) { | ||
requestKey = request; | ||
} else if (ASSET_MANIFEST[decodeURIComponent(rawPathKey)]) { | ||
pathIsEncoded = true; | ||
requestKey = request; | ||
} else { | ||
const mappedRequest = mapRequestToAsset(request); | ||
const mappedRawPathKey = new URL(mappedRequest.url).pathname.replace( | ||
/^\/+/, | ||
"" | ||
); | ||
if (ASSET_MANIFEST[decodeURIComponent(mappedRawPathKey)]) { | ||
pathIsEncoded = true; | ||
requestKey = request; | ||
requestKey = mappedRequest; | ||
} else { | ||
// use default mapRequestToAsset | ||
requestKey = mapRequestToAsset(request, options); | ||
} | ||
} | ||
else { | ||
const mappedRequest = mapRequestToAsset(request); | ||
const mappedRawPathKey = new URL(mappedRequest.url).pathname.replace(/^\/+/, ''); | ||
if (ASSET_MANIFEST[decodeURIComponent(mappedRawPathKey)]) { | ||
pathIsEncoded = true; | ||
requestKey = mappedRequest; | ||
} | ||
else { | ||
// use default mapRequestToAsset | ||
requestKey = mapRequestToAsset(request, options); | ||
} | ||
} | ||
const SUPPORTED_METHODS = ['GET', 'HEAD']; | ||
const SUPPORTED_METHODS = ["GET", "HEAD"]; | ||
if (!SUPPORTED_METHODS.includes(requestKey.method)) { | ||
throw new types_1.MethodNotAllowedError(`${requestKey.method} is not a valid request method`); | ||
throw new types_1.MethodNotAllowedError( | ||
`${requestKey.method} is not a valid request method` | ||
); | ||
} | ||
const parsedUrl = new URL(requestKey.url); | ||
const pathname = pathIsEncoded ? decodeURIComponent(parsedUrl.pathname) : parsedUrl.pathname; // decode percentage encoded path only when necessary | ||
const pathname = pathIsEncoded | ||
? decodeURIComponent(parsedUrl.pathname) | ||
: parsedUrl.pathname; // decode percentage encoded path only when necessary | ||
// pathKey is the file path to look up in the manifest | ||
let pathKey = pathname.replace(/^\/+/, ''); // remove prepended / | ||
let pathKey = pathname.replace(/^\/+/, ""); // remove prepended / | ||
// @ts-ignore | ||
const cache = caches.default; | ||
let mimeType = mime.getType(pathKey) || options.defaultMimeType; | ||
if (mimeType.startsWith('text') || mimeType === 'application/javascript') { | ||
mimeType += '; charset=utf-8'; | ||
if (mimeType.startsWith("text") || mimeType === "application/javascript") { | ||
mimeType += "; charset=utf-8"; | ||
} | ||
let shouldEdgeCache = false; // false if storing in KV by raw file path i.e. no hash | ||
// check manifest for map from file path to hash | ||
if (typeof ASSET_MANIFEST !== 'undefined') { | ||
if (ASSET_MANIFEST[pathKey]) { | ||
pathKey = ASSET_MANIFEST[pathKey]; | ||
// if path key is in asset manifest, we can assume it contains a content hash and can be cached | ||
shouldEdgeCache = true; | ||
} | ||
if (typeof ASSET_MANIFEST !== "undefined") { | ||
if (ASSET_MANIFEST[pathKey]) { | ||
pathKey = ASSET_MANIFEST[pathKey]; | ||
// if path key is in asset manifest, we can assume it contains a content hash and can be cached | ||
shouldEdgeCache = true; | ||
} | ||
} | ||
@@ -164,10 +220,10 @@ // TODO this excludes search params from cache, investigate ideal behavior | ||
const evalCacheOpts = (() => { | ||
switch (typeof options.cacheControl) { | ||
case 'function': | ||
return options.cacheControl(request); | ||
case 'object': | ||
return options.cacheControl; | ||
default: | ||
return defaultCacheControl; | ||
} | ||
switch (typeof options.cacheControl) { | ||
case "function": | ||
return options.cacheControl(request); | ||
case "object": | ||
return options.cacheControl; | ||
default: | ||
return defaultCacheControl; | ||
} | ||
})(); | ||
@@ -178,113 +234,127 @@ // formats the etag depending on the response context. if the entityId | ||
// header is "null". Could be modified in future to base64 encode etc | ||
const formatETag = (entityId = pathKey, validatorType = 'strong') => { | ||
if (!entityId) { | ||
return ''; | ||
} | ||
switch (validatorType) { | ||
case 'weak': | ||
if (!entityId.startsWith('W/')) { | ||
return `W/${entityId}`; | ||
} | ||
return entityId; | ||
case 'strong': | ||
if (entityId.startsWith(`W/"`)) { | ||
entityId = entityId.replace('W/', ''); | ||
} | ||
if (!entityId.endsWith(`"`)) { | ||
entityId = `"${entityId}"`; | ||
} | ||
return entityId; | ||
default: | ||
return ''; | ||
} | ||
const formatETag = (entityId = pathKey, validatorType = "strong") => { | ||
if (!entityId) { | ||
return ""; | ||
} | ||
switch (validatorType) { | ||
case "weak": | ||
if (!entityId.startsWith("W/")) { | ||
return `W/${entityId}`; | ||
} | ||
return entityId; | ||
case "strong": | ||
if (entityId.startsWith(`W/"`)) { | ||
entityId = entityId.replace("W/", ""); | ||
} | ||
if (!entityId.endsWith(`"`)) { | ||
entityId = `"${entityId}"`; | ||
} | ||
return entityId; | ||
default: | ||
return ""; | ||
} | ||
}; | ||
options.cacheControl = Object.assign({}, defaultCacheControl, evalCacheOpts); | ||
options.cacheControl = Object.assign( | ||
{}, | ||
defaultCacheControl, | ||
evalCacheOpts | ||
); | ||
// override shouldEdgeCache if options say to bypassCache | ||
if (options.cacheControl.bypassCache || | ||
options.cacheControl.edgeTTL === null || | ||
request.method == 'HEAD') { | ||
shouldEdgeCache = false; | ||
if ( | ||
options.cacheControl.bypassCache || | ||
options.cacheControl.edgeTTL === null || | ||
request.method == "HEAD" | ||
) { | ||
shouldEdgeCache = false; | ||
} | ||
// only set max-age if explicitly passed in a number as an arg | ||
const shouldSetBrowserCache = typeof options.cacheControl.browserTTL === 'number'; | ||
const shouldSetBrowserCache = | ||
typeof options.cacheControl.browserTTL === "number"; | ||
let response = null; | ||
if (shouldEdgeCache) { | ||
response = yield cache.match(cacheKey); | ||
response = yield cache.match(cacheKey); | ||
} | ||
if (response) { | ||
if (response.status > 300 && response.status < 400) { | ||
if (response.body && 'cancel' in Object.getPrototypeOf(response.body)) { | ||
response.body.cancel(); | ||
console.log('Body exists and environment supports readable streams. Body cancelled'); | ||
} | ||
else { | ||
console.log('Environment doesnt support readable streams'); | ||
} | ||
response = new Response(null, response); | ||
if (response.status > 300 && response.status < 400) { | ||
if (response.body && "cancel" in Object.getPrototypeOf(response.body)) { | ||
response.body.cancel(); | ||
console.log( | ||
"Body exists and environment supports readable streams. Body cancelled" | ||
); | ||
} else { | ||
console.log("Environment doesnt support readable streams"); | ||
} | ||
else { | ||
// fixes #165 | ||
let opts = { | ||
headers: new Headers(response.headers), | ||
status: 0, | ||
statusText: '', | ||
}; | ||
opts.headers.set('cf-cache-status', 'HIT'); | ||
if (response.status) { | ||
opts.status = response.status; | ||
opts.statusText = response.statusText; | ||
} | ||
else if (opts.headers.has('Content-Range')) { | ||
opts.status = 206; | ||
opts.statusText = 'Partial Content'; | ||
} | ||
else { | ||
opts.status = 200; | ||
opts.statusText = 'OK'; | ||
} | ||
response = new Response(response.body, opts); | ||
response = new Response(null, response); | ||
} else { | ||
// fixes #165 | ||
let opts = { | ||
headers: new Headers(response.headers), | ||
status: 0, | ||
statusText: "", | ||
}; | ||
opts.headers.set("cf-cache-status", "HIT"); | ||
if (response.status) { | ||
opts.status = response.status; | ||
opts.statusText = response.statusText; | ||
} else if (opts.headers.has("Content-Range")) { | ||
opts.status = 206; | ||
opts.statusText = "Partial Content"; | ||
} else { | ||
opts.status = 200; | ||
opts.statusText = "OK"; | ||
} | ||
} | ||
else { | ||
const body = yield ASSET_NAMESPACE.get(pathKey, 'arrayBuffer'); | ||
if (body === null) { | ||
throw new types_1.NotFoundError(`could not find ${pathKey} in your content namespace`); | ||
response = new Response(response.body, opts); | ||
} | ||
} else { | ||
const body = yield ASSET_NAMESPACE.get(pathKey, "arrayBuffer"); | ||
if (body === null) { | ||
throw new types_1.NotFoundError( | ||
`could not find ${pathKey} in your content namespace` | ||
); | ||
} | ||
response = new Response(body); | ||
if (shouldEdgeCache) { | ||
response.headers.set("Accept-Ranges", "bytes"); | ||
response.headers.set("Content-Length", body.length); | ||
// set etag before cache insertion | ||
if (!response.headers.has("etag")) { | ||
response.headers.set("etag", formatETag(pathKey, "strong")); | ||
} | ||
response = new Response(body); | ||
if (shouldEdgeCache) { | ||
response.headers.set('Accept-Ranges', 'bytes'); | ||
response.headers.set('Content-Length', body.length); | ||
// set etag before cache insertion | ||
if (!response.headers.has('etag')) { | ||
response.headers.set('etag', formatETag(pathKey, 'strong')); | ||
} | ||
// determine Cloudflare cache behavior | ||
response.headers.set('Cache-Control', `max-age=${options.cacheControl.edgeTTL}`); | ||
event.waitUntil(cache.put(cacheKey, response.clone())); | ||
response.headers.set('CF-Cache-Status', 'MISS'); | ||
} | ||
// determine Cloudflare cache behavior | ||
response.headers.set( | ||
"Cache-Control", | ||
`max-age=${options.cacheControl.edgeTTL}` | ||
); | ||
event.waitUntil(cache.put(cacheKey, response.clone())); | ||
response.headers.set("CF-Cache-Status", "MISS"); | ||
} | ||
} | ||
response.headers.set('Content-Type', mimeType); | ||
response.headers.set("Content-Type", mimeType); | ||
if (response.status === 304) { | ||
let etag = formatETag(response.headers.get('etag'), 'strong'); | ||
let ifNoneMatch = cacheKey.headers.get('if-none-match'); | ||
let proxyCacheStatus = response.headers.get('CF-Cache-Status'); | ||
if (etag) { | ||
if (ifNoneMatch && ifNoneMatch === etag && proxyCacheStatus === 'MISS') { | ||
response.headers.set('CF-Cache-Status', 'EXPIRED'); | ||
} | ||
else { | ||
response.headers.set('CF-Cache-Status', 'REVALIDATED'); | ||
} | ||
response.headers.set('etag', formatETag(etag, 'weak')); | ||
let etag = formatETag(response.headers.get("etag"), "strong"); | ||
let ifNoneMatch = cacheKey.headers.get("if-none-match"); | ||
let proxyCacheStatus = response.headers.get("CF-Cache-Status"); | ||
if (etag) { | ||
if ( | ||
ifNoneMatch && | ||
ifNoneMatch === etag && | ||
proxyCacheStatus === "MISS" | ||
) { | ||
response.headers.set("CF-Cache-Status", "EXPIRED"); | ||
} else { | ||
response.headers.set("CF-Cache-Status", "REVALIDATED"); | ||
} | ||
response.headers.set("etag", formatETag(etag, "weak")); | ||
} | ||
} | ||
if (shouldSetBrowserCache) { | ||
response.headers.set('Cache-Control', `max-age=${options.cacheControl.browserTTL}`); | ||
response.headers.set( | ||
"Cache-Control", | ||
`max-age=${options.cacheControl.browserTTL}` | ||
); | ||
} else { | ||
response.headers.delete("Cache-Control"); | ||
} | ||
else { | ||
response.headers.delete('Cache-Control'); | ||
} | ||
return response; | ||
}); | ||
}); | ||
exports.getAssetFromKV = getAssetFromKV; |
@@ -40,3 +40,3 @@ { | ||
"dependencies": { | ||
"mime": "^2.5.2" | ||
"wrangler-mime": "^2.5.2" | ||
}, | ||
@@ -43,0 +43,0 @@ "devDependencies": { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
9897493
104397
22
+ Addedesbuild@0.13.15(transitive)
+ Addedesbuild-android-arm64@0.13.15(transitive)
+ Addedesbuild-darwin-64@0.13.15(transitive)
+ Addedesbuild-darwin-arm64@0.13.15(transitive)
+ Addedesbuild-freebsd-64@0.13.15(transitive)
+ Addedesbuild-freebsd-arm64@0.13.15(transitive)
+ Addedesbuild-linux-32@0.13.15(transitive)
+ Addedesbuild-linux-64@0.13.15(transitive)
+ Addedesbuild-linux-arm@0.13.15(transitive)
+ Addedesbuild-linux-arm64@0.13.15(transitive)
+ Addedesbuild-linux-mips64le@0.13.15(transitive)
+ Addedesbuild-linux-ppc64le@0.13.15(transitive)
+ Addedesbuild-netbsd-64@0.13.15(transitive)
+ Addedesbuild-openbsd-64@0.13.15(transitive)
+ Addedesbuild-sunos-64@0.13.15(transitive)
+ Addedesbuild-windows-32@0.13.15(transitive)
+ Addedesbuild-windows-64@0.13.15(transitive)
+ Addedesbuild-windows-arm64@0.13.15(transitive)
- Removedesbuild@0.12.29(transitive)
Updatedesbuild@^0.13.12
Updatedminiflare@^1.4.1
Updatedyargs@^17.2.1