Bun bun-v0.0.71stable Released Feb 25, 2022
โš ๏ธ Breaking Change Impact Score: 7/10

bun v0.0.71

Source available โ€” automated, not human-reviewed

Component: bun ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Breaking-change evidence from the source

  • - Breaking changes to `bun install` lockfile format change means your next `bun install` will invalidate existing ones. The changes improve the reliability of saving and loading the lockfile
Read the original context โ†—
Source flags breaking changes โ€” review applicability
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Bun bun-v0.0.71. Source highlight: <summary>Having trouble?</summary>

Who Does This Impact? (Role-Based Analysis)

๐Ÿ’ป Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

๐Ÿ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

โš™๏ธ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

โš ๏ธ Breaking Changes & Deprecations (1)

  • - Breaking changes to `bun install` lockfile format change means your next `bun install` will invalidate existing ones. The changes improve the reliability of saving and loading the lockfile

โšก Performance & Enhancements (1)

  • Breaking changes to `bun install` lockfile format change means your next `bun install` will invalidate existing ones. The changes improve the reliability of saving and loading the lockfile

๐Ÿ”ง Bug Fixes & Patches (6)

  • More reliable `bun install`: numerous bug fixes to linking, serialization, deserialization, extracting files. It probably works in many projects now. There are still a couple bugs that need to be fixed, no node-gyp yet, and `git`/`github` dependencies don't work yet
  • bug fixes to bun dev & bun run
  • More reliably set permissions on bin links - https://github.com/Jarred-Sumner/bun/commit/185f74dfae6a1c755915939fe4b7d69cad3f03af
  • Fix lockfile corruption - https://github.com/Jarred-Sumner/bun/commit/5d51b4c3972c7d0733a54ba2038721ce3236a92a
  • Fix bun add multiple packages writing malformed packages - https://github.com/Jarred-Sumner/bun/commit/fce94e29a00f7b0b533c2725fe36b807a61ea517
  • Implement private registry support & scoped packages. Note: this is not sufficiently well-tested yet. https://github.com/Jarred-Sumner/bun/commit/8570b4a9d7a4acd7e528912c5d6a9f71a63f5c9b
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
To upgrade: ```bash bun upgrade ``` <details> <summary>Having trouble?</summary> ```bash # Try this curl https://bun.sh/install | bash ``` Please let me know though if it doesn't work and you're on bun v0.0.69. bun v0.0.61 - v0.0.68 had issues with the HTTP client </details> ## Highlights: - More reliable `bun install`: numerous bug fixes to linking, serialization, deserialization, extracting files. It probably works in many projects now. There are still a couple bugs that need to be fixed, no node-gyp yet, and `git`/`github` dependencies don't work yet - "Copy as markdown" for error messages - Macros can now be used like regular JavaScript, with automatic conversion of primitives & objects to Bun's AST - `bun pm hash` returns a hash of the resolved all package@version in your lockfile - `bun install --global` lets you globally install npm packages with bun! - bug fixes to bun dev & bun run - `TextEncoder`, `TextDecoder`, `process.exit`, `crypto.randomUUID`, `crypto.randomBytes` are now available in bun.js - Better support for Next.js v12.1 ```bash # Install a package globally with bun install > bun install -g typescript # "bun i" is shorthand for bun install > bun i -g typescript # It symlinks into your $BUN_INSTALL/bin folder > which tsc /Users/jarred/.bun/bin/tsc # print the path of the global bin > bun pm -g bin /Users/jarred/.bun/bin ``` #### Lowlights: - Breaking changes to `bun install` lockfile format change means your next `bun install` will invalidate existing ones. The changes improve the reliability of saving and loading the lockfile ### "Copy as markdown" button for error messages Before this release, `bun dev` did not support displaying runtime errors. It only showed errors for build/ssr ๐Ÿ™ˆ <img height=300 src=https://user-images.githubusercontent.com/709451/155702170-2a42660c-7e22-4055-8030-90485e830d61.gif /> ### Use macros like regular JavaScript Now you can move code from runtime to build-time by writing ordinary javascript. Input: ```js // This line is removed at build time import {weatherIn} from 'macro:./weather' // This function call is replaced with the value of `weatherIn(94609)` at build-time const {current_condition: [{temp_F: degrees}]} = weatherIn(94609); export default `It is ${degrees} in Oakland, California` ``` weather.js: ```js export async function weatherIn(call) { const location = call.arguments[0]; return fetch(`https://wttr.in/${location.toString()}?format=j1`) } ``` Output: ```js const { current_condition: [{ temp_F: degrees }] } = { current_condition: [ { temp_F: "42" } ] }; // once bun gets a minifier, this line would be all that remains export default `It is ${degrees} in Oakland, California`; ``` <details> <summary>Normally, this 48 KB of JSON would be fetched client-side</summary> ```json { "current_condition": [ { "FeelsLikeC": "4", "FeelsLikeF": "39", "cloudcover": "100", "humidity": "79", "localObsDateTime": "2022-02-25 03:18 AM", "observation_time": "11:18 AM", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "temp_C": "4", "temp_F": "40", "uvIndex": "1", "visibility": "16", "visibilityMiles": "9", "weatherCode": "122", "weatherDesc": [ { "value": "Overcast" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "70", "windspeedKmph": "7", "windspeedMiles": "4" } ], "nearest_area": [ { "areaName": [ { "value": "Emeryville" } ], "country": [ { "value": "United States of America" } ], "latitude": "37.831", "longitude": "-122.284", "population": "0", "region": [ { "value": "California" } ], "weatherUrl": [ { "value": "" } ] } ], "request": [ { "query": "Lat 37.83 and Lon -122.26", "type": "LatLon" } ], "weather": [ { "astronomy": [ { "moon_illumination": "24", "moon_phase": "Last Quarter", "moonrise": "03:03 AM", "moonset": "12:25 PM", "sunrise": "06:46 AM", "sunset": "05:59 PM" } ], "avgtempC": "10", "avgtempF": "49", "date": "2022-02-25", "hourly": [ { "DewPointC": "2", "DewPointF": "36", "FeelsLikeC": "5", "FeelsLikeF": "42", "HeatIndexC": "7", "HeatIndexF": "44", "WindChillC": "5", "WindChillF": "42", "WindGustKmph": "11", "WindGustMiles": "7", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "82", "chanceofsnow": "0", "chanceofsunshine": "88", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "4", "humidity": "75", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1025", "pressureInches": "30", "tempC": "7", "tempF": "44", "time": "0", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "WNW", "winddirDegree": "300", "windspeedKmph": "6", "windspeedMiles": "4" }, { "DewPointC": "2", "DewPointF": "35", "FeelsLikeC": "6", "FeelsLikeF": "42", "HeatIndexC": "6", "HeatIndexF": "42", "WindChillC": "6", "WindChillF": "42", "WindGustKmph": "3", "WindGustMiles": "2", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "81", "chanceofsnow": "0", "chanceofsunshine": "93", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "78", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "6", "tempF": "42", "time": "300", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "N", "winddirDegree": "360", "windspeedKmph": "2", "windspeedMiles": "1" }, { "DewPointC": "1", "DewPointF": "34", "FeelsLikeC": "4", "FeelsLikeF": "39", "HeatIndexC": "5", "HeatIndexF": "40", "WindChillC": "4", "WindChillF": "39", "WindGustKmph": "9", "WindGustMiles": "5", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "91", "chanceofsnow": "0", "chanceofsunshine": "94", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "78", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1025", "pressureInches": "30", "tempC": "5", "tempF": "40", "time": "600", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "72", "windspeedKmph": "5", "windspeedMiles": "3" }, { "DewPointC": "-1", "DewPointF": "31", "FeelsLikeC": "5", "FeelsLikeF": "41", "HeatIndexC": "6", "HeatIndexF": "42", "WindChillC": "5", "WindChillF": "41", "WindGustKmph": "7", "WindGustMiles": "4", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "89", "chanceofsnow": "0", "chanceofsunshine": "87", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "64", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "6", "tempF": "42", "time": "900", "uvIndex": "3", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "72", "windspeedKmph": "5", "windspeedMiles": "3" }, { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "13", "FeelsLikeF": "56", "HeatIndexC": "13", "HeatIndexF": "56", "WindChillC": "13", "WindChillF": "56", "WindGustKmph": "8", "WindGustMiles": "5", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "80", "chanceofsnow": "0", "chanceofsunshine": "85", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "40", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "13", "tempF": "56", "time": "1200", "uvIndex": "4", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "70", "windspeedKmph": "7", "windspeedMiles": "4" }, { "DewPointC": "1", "DewPointF": "33", "FeelsLikeC": "17", "FeelsLikeF": "62", "HeatIndexC": "17", "HeatIndexF": "62", "WindChillC": "17", "WindChillF": "62", "WindGustKmph": "8", "WindGustMiles": "5", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "89", "chanceofsnow": "0", "chanceofsunshine": "88", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "34", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1025", "pressureInches": "30", "tempC": "17", "tempF": "62", "time": "1500", "uvIndex": "5", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NNW", "winddirDegree": "330", "windspeedKmph": "7", "windspeedMiles": "4" }, { "DewPointC": "2", "DewPointF": "36", "FeelsLikeC": "16", "FeelsLikeF": "61", "HeatIndexC": "16", "HeatIndexF": "61", "WindChillC": "16", "WindChillF": "61", "WindGustKmph": "9", "WindGustMiles": "6", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "80", "chanceofsnow": "0", "chanceofsunshine": "93", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "39", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1024", "pressureInches": "30", "tempC": "16", "tempF": "61", "time": "1800", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NW", "winddirDegree": "307", "windspeedKmph": "8", "windspeedMiles": "5" }, { "DewPointC": "2", "DewPointF": "35", "FeelsLikeC": "8", "FeelsLikeF": "47", "HeatIndexC": "9", "HeatIndexF": "48", "WindChillC": "8", "WindChillF": "47", "WindGustKmph": "12", "WindGustMiles": "7", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "87", "chanceofsnow": "0", "chanceofsunshine": "85", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "61", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1025", "pressureInches": "30", "tempC": "9", "tempF": "48", "time": "2100", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NW", "winddirDegree": "305", "windspeedKmph": "6", "windspeedMiles": "4" } ], "maxtempC": "17", "maxtempF": "63", "mintempC": "4", "mintempF": "39", "sunHour": "11.0", "totalSnow_cm": "0.0", "uvIndex": "4" }, { "astronomy": [ { "moon_illumination": "17", "moon_phase": "Waning Crescent", "moonrise": "04:08 AM", "moonset": "01:29 PM", "sunrise": "06:44 AM", "sunset": "06:00 PM" } ], "avgtempC": "10", "avgtempF": "51", "date": "2022-02-26", "hourly": [ { "DewPointC": "2", "DewPointF": "35", "FeelsLikeC": "7", "FeelsLikeF": "45", "HeatIndexC": "8", "HeatIndexF": "46", "WindChillC": "7", "WindChillF": "45", "WindGustKmph": "8", "WindGustMiles": "5", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "83", "chanceofsnow": "0", "chanceofsunshine": "91", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "67", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "8", "tempF": "46", "time": "0", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "N", "winddirDegree": "353", "windspeedKmph": "4", "windspeedMiles": "3" }, { "DewPointC": "0", "DewPointF": "33", "FeelsLikeC": "7", "FeelsLikeF": "45", "HeatIndexC": "7", "HeatIndexF": "45", "WindChillC": "7", "WindChillF": "45", "WindGustKmph": "7", "WindGustMiles": "4", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "91", "chanceofsnow": "0", "chanceofsunshine": "94", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "12", "humidity": "62", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1025", "pressureInches": "30", "tempC": "7", "tempF": "45", "time": "300", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "E", "winddirDegree": "90", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "-1", "DewPointF": "31", "FeelsLikeC": "6", "FeelsLikeF": "42", "HeatIndexC": "7", "HeatIndexF": "44", "WindChillC": "6", "WindChillF": "42", "WindGustKmph": "11", "WindGustMiles": "7", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "81", "chanceofsnow": "0", "chanceofsunshine": "92", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "9", "humidity": "61", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "7", "tempF": "44", "time": "600", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "66", "windspeedKmph": "6", "windspeedMiles": "4" }, { "DewPointC": "-1", "DewPointF": "31", "FeelsLikeC": "6", "FeelsLikeF": "43", "HeatIndexC": "7", "HeatIndexF": "45", "WindChillC": "6", "WindChillF": "43", "WindGustKmph": "9", "WindGustMiles": "5", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "83", "chanceofsnow": "0", "chanceofsunshine": "92", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "4", "humidity": "57", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1027", "pressureInches": "30", "tempC": "7", "tempF": "45", "time": "900", "uvIndex": "3", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "71", "windspeedKmph": "6", "windspeedMiles": "4" }, { "DewPointC": "1", "DewPointF": "33", "FeelsLikeC": "14", "FeelsLikeF": "57", "HeatIndexC": "13", "HeatIndexF": "56", "WindChillC": "14", "WindChillF": "57", "WindGustKmph": "4", "WindGustMiles": "2", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "83", "chanceofsnow": "0", "chanceofsunshine": "89", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "7", "humidity": "43", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1027", "pressureInches": "30", "tempC": "13", "tempF": "56", "time": "1200", "uvIndex": "4", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NE", "winddirDegree": "48", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "2", "DewPointF": "35", "FeelsLikeC": "15", "FeelsLikeF": "60", "HeatIndexC": "15", "HeatIndexF": "60", "WindChillC": "15", "WindChillF": "60", "WindGustKmph": "5", "WindGustMiles": "3", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "88", "chanceofsnow": "0", "chanceofsunshine": "86", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "12", "humidity": "39", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "15", "tempF": "60", "time": "1500", "uvIndex": "5", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "WNW", "winddirDegree": "296", "windspeedKmph": "5", "windspeedMiles": "3" }, { "DewPointC": "1", "DewPointF": "33", "FeelsLikeC": "13", "FeelsLikeF": "55", "HeatIndexC": "13", "HeatIndexF": "56", "WindChillC": "13", "WindChillF": "55", "WindGustKmph": "12", "WindGustMiles": "8", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "39", "chanceofrain": "0", "chanceofremdry": "91", "chanceofsnow": "0", "chanceofsunshine": "80", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "49", "humidity": "42", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1027", "pressureInches": "30", "tempC": "13", "tempF": "56", "time": "1800", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "116", "weatherDesc": [ { "value": "Partly cloudy" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "W", "winddirDegree": "278", "windspeedKmph": "9", "windspeedMiles": "5" }, { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "11", "FeelsLikeF": "51", "HeatIndexC": "11", "HeatIndexF": "52", "WindChillC": "11", "WindChillF": "51", "WindGustKmph": "12", "WindGustMiles": "8", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "90", "chanceofrain": "0", "chanceofremdry": "87", "chanceofsnow": "0", "chanceofsunshine": "16", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "77", "humidity": "46", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1027", "pressureInches": "30", "tempC": "11", "tempF": "52", "time": "2100", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "119", "weatherDesc": [ { "value": "Cloudy" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "E", "winddirDegree": "90", "windspeedKmph": "7", "windspeedMiles": "4" } ], "maxtempC": "15", "maxtempF": "60", "mintempC": "6", "mintempF": "42", "sunHour": "11.6", "totalSnow_cm": "0.0", "uvIndex": "4" }, { "astronomy": [ { "moon_illumination": "9", "moon_phase": "Waning Crescent", "moonrise": "05:05 AM", "moonset": "02:39 PM", "sunrise": "06:43 AM", "sunset": "06:01 PM" } ], "avgtempC": "13", "avgtempF": "56", "date": "2022-02-27", "hourly": [ { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "11", "FeelsLikeF": "51", "HeatIndexC": "11", "HeatIndexF": "51", "WindChillC": "11", "WindChillF": "51", "WindGustKmph": "1", "WindGustMiles": "0", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "92", "chanceofrain": "0", "chanceofremdry": "86", "chanceofsnow": "0", "chanceofsunshine": "11", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "74", "humidity": "47", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1028", "pressureInches": "30", "tempC": "11", "tempF": "51", "time": "0", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "119", "weatherDesc": [ { "value": "Cloudy" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "WNW", "winddirDegree": "297", "windspeedKmph": "0", "windspeedMiles": "0" }, { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "10", "FeelsLikeF": "50", "HeatIndexC": "10", "HeatIndexF": "50", "WindChillC": "10", "WindChillF": "50", "WindGustKmph": "7", "WindGustMiles": "4", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "38", "chanceofrain": "0", "chanceofremdry": "85", "chanceofsnow": "0", "chanceofsunshine": "86", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "29", "humidity": "51", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1028", "pressureInches": "30", "tempC": "10", "tempF": "50", "time": "300", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "116", "weatherDesc": [ { "value": "Partly cloudy" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NW", "winddirDegree": "326", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "9", "FeelsLikeF": "48", "HeatIndexC": "9", "HeatIndexF": "48", "WindChillC": "9", "WindChillF": "48", "WindGustKmph": "7", "WindGustMiles": "4", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "92", "chanceofsnow": "0", "chanceofsunshine": "91", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "16", "humidity": "54", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1029", "pressureInches": "30", "tempC": "9", "tempF": "48", "time": "600", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "N", "winddirDegree": "1", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "0", "DewPointF": "32", "FeelsLikeC": "10", "FeelsLikeF": "51", "HeatIndexC": "10", "HeatIndexF": "50", "WindChillC": "10", "WindChillF": "51", "WindGustKmph": "6", "WindGustMiles": "4", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "86", "chanceofsnow": "0", "chanceofsunshine": "88", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "10", "humidity": "50", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1030", "pressureInches": "30", "tempC": "10", "tempF": "50", "time": "900", "uvIndex": "4", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "ENE", "winddirDegree": "72", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "2", "DewPointF": "35", "FeelsLikeC": "17", "FeelsLikeF": "62", "HeatIndexC": "17", "HeatIndexF": "62", "WindChillC": "17", "WindChillF": "62", "WindGustKmph": "5", "WindGustMiles": "3", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "94", "chanceofsnow": "0", "chanceofsunshine": "92", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "7", "humidity": "36", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1029", "pressureInches": "30", "tempC": "17", "tempF": "62", "time": "1200", "uvIndex": "5", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "NNE", "winddirDegree": "30", "windspeedKmph": "4", "windspeedMiles": "2" }, { "DewPointC": "3", "DewPointF": "37", "FeelsLikeC": "19", "FeelsLikeF": "66", "HeatIndexC": "19", "HeatIndexF": "66", "WindChillC": "19", "WindChillF": "66", "WindGustKmph": "9", "WindGustMiles": "6", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "91", "chanceofsnow": "0", "chanceofsunshine": "91", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "3", "humidity": "34", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "19", "tempF": "66", "time": "1500", "uvIndex": "5", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "WNW", "winddirDegree": "299", "windspeedKmph": "8", "windspeedMiles": "5" }, { "DewPointC": "5", "DewPointF": "42", "FeelsLikeC": "18", "FeelsLikeF": "64", "HeatIndexC": "18", "HeatIndexF": "64", "WindChillC": "18", "WindChillF": "64", "WindGustKmph": "12", "WindGustMiles": "7", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "83", "chanceofsnow": "0", "chanceofsunshine": "90", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "0", "humidity": "43", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1026", "pressureInches": "30", "tempC": "18", "tempF": "64", "time": "1800", "uvIndex": "5", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Sunny" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "W", "winddirDegree": "271", "windspeedKmph": "10", "windspeedMiles": "6" }, { "DewPointC": "5", "DewPointF": "42", "FeelsLikeC": "12", "FeelsLikeF": "53", "HeatIndexC": "12", "HeatIndexF": "53", "WindChillC": "12", "WindChillF": "53", "WindGustKmph": "11", "WindGustMiles": "7", "chanceoffog": "0", "chanceoffrost": "0", "chanceofhightemp": "0", "chanceofovercast": "0", "chanceofrain": "0", "chanceofremdry": "83", "chanceofsnow": "0", "chanceofsunshine": "87", "chanceofthunder": "0", "chanceofwindy": "0", "cloudcover": "16", "humidity": "64", "precipInches": "0.0", "precipMM": "0.0", "pressure": "1027", "pressureInches": "30", "tempC": "12", "tempF": "53", "time": "2100", "uvIndex": "1", "visibility": "10", "visibilityMiles": "6", "weatherCode": "113", "weatherDesc": [ { "value": "Clear" } ], "weatherIconUrl": [ { "value": "" } ], "winddir16Point": "WNW", "winddirDegree": "292", "windspeedKmph": "6", "windspeedMiles": "4" } ], "maxtempC": "20", "maxtempF": "68", "mintempC": "9", "mintempF": "47", "sunHour": "11.6", "totalSnow_cm": "0.0", "uvIndex": "3" } ] } ``` </details> ### JavaScript Parser reliability I ported some of esbuild's tests to bun's testing library and that led to uncovering & fixing some parser bugs ```ts // what some of the tests look like expectParseError("-x.y() ** 2", "Unexpected **"); expectParseError("+x.y() ** 2", "Unexpected **"); expectParseError("~x.y() ** 2", "Unexpected **"); expectParseError("!x.y() ** 2", "Unexpected **"); expectParseError("void x.y() ** 2", "Unexpected **"); expectParseError("delete x.y() ** 2", "Unexpected **"); expectParseError("typeof x.y() ** 2", "Unexpected **"); ``` #### New features `type` inside of import clauses is now supported. This is a TypeScript feature. ```ts // previously, this would error import {type FooType} from 'bar'; ``` Import assertions are now parsed by bun. Currently, they're removed from the final output ```js import("./foo.json", { type: "json" }); // โฌ‡๏ธ import("./foo.json"); import json from "./foo.json" assert { type: "json" }; // โฌ‡๏ธ import json from "./foo.json"; ``` Fixed a number of whitespace/formatting bugs with the printer <img width=200 src="https://user-images.githubusercontent.com/709451/155717306-1dd560ad-c5f3-4c69-b439-ded5d6eb1322.png" /> ## bun install reliability This release brings `bun install` much closer to something you can use daily. It's _not_ there yet, but it is close. Somewhat controversially, `bun install` uses a binary lockfile format. One thing several people asked for: a hash. So I added a hash. ```bash > bun pm hash 1A0FF3DFFE05333A-b20fd0e1259d2de5-9E3B657EA8BD4436-9f3132e0eb95a60e ``` This is a SHA512/256 hash of the following string. The string is created by looping through all the resolved packages in the lockfile, sorting alphabetically, then sorting any packages with multiple duplicate versions. ```bash > bun pm hash-string -- BEGIN SHA512/256(`${alphabetize(name)}@${order(version)}`) -- @types/[email protected] @types/[email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] -- END HASH-- ``` `bun pm` is a new subcommand for "miscellaneous package manager things" ```bash > bun pm bun pm - package manager related commands bun pm bin print the path to bin folder bun pm -g bin print the global path to bin folder bun pm hash generate & print the hash of the current lockfile bun pm hash-string print the string used to hash the lockfile bun pm hash-print print the hash stored in the current lockfile ``` When using `bun install -y`, the hash is inserted into the saved yarn.lock: ```bash # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 # bun ./bun.lockb --hash: 3982DAEC20B10CF8-4da4f73e6f1d3ab1-77B62BB40B50C631-a7674fe7d3217550 ``` You can now configure `bun install` with `bunfig.toml`. it will search for `bunfig.toml` in `$XDG_CONFIG_HOME/bunfig.toml` and `$HOME/bunfig.toml`, in addition to `./bunfig.toml` #### bun install bugfixes - More reliably set permissions on bin links - https://github.com/Jarred-Sumner/bun/commit/185f74dfae6a1c755915939fe4b7d69cad3f03af - Fix lockfile corruption - https://github.com/Jarred-Sumner/bun/commit/5d51b4c3972c7d0733a54ba2038721ce3236a92a - Fix bun add multiple packages writing malformed packages - https://github.com/Jarred-Sumner/bun/commit/fce94e29a00f7b0b533c2725fe36b807a61ea517 - Implement private registry support & scoped packages. Note: this is not sufficiently well-tested yet. https://github.com/Jarred-Sumner/bun/commit/8570b4a9d7a4acd7e528912c5d6a9f71a63f5c9b - Add bun r as an alias for bun remove - https://github.com/Jarred-Sumner/bun/commit/757a1686f07a04c17b1d9384839a6b1a229b9989 - Improve error handling when package is not found - https://github.com/Jarred-Sumner/bun/commit/297ddfd972a2d6056268d196f590a62961bbaf85 - Make bun install fast by default on linux - https://github.com/Jarred-Sumner/bun/commit/614d810ef4ba7da59a80772ae0d044062befe08c - Fix directory bin link bug - https://github.com/Jarred-Sumner/bun/commit/b9567eb193a90aebb3e271de56dd3edf1d2905c1 - With --production, fail the build if symlinking fails - https://github.com/Jarred-Sumner/bun/commit/ff38312b7dc81fd6475b494c57f7168b2f71d6f4 - Reduce noise in printed yarn.lock - https://github.com/Jarred-Sumner/bun/commit/9c54b0605d09e2e28c981add848f67040bde1104 - Resolve nested folder: dependencies - https://github.com/Jarred-Sumner/bun/commit/4749df7c518a83e600e4dd0022e24cdc7928e0ac ## `bun run` - Fix exit code when script fails - https://github.com/Jarred-Sumner/bun/commit/29a718e25dcddcf0f0d5b0b73246697286d1be90 - Fix exit code when running a bin - https://github.com/Jarred-Sumner/bun/commit/9369663317bf526c0fce8a98f5ee8c89f806a025 ## `bun bun` - Fix race condition # bun dev Open-in-editor is now implemented ![Screen Recording 2022-02-25 at 5 15 01 AM](https://user-images.githubusercontent.com/709451/155724914-cab7969b-34ec-4c63-bd2e-43e0c80acbbc.gif) - [Support Next.js 12.1](https://github.com/Jarred-Sumner/bun/commit/23596b48ca03a74c7555ada3fe1f184d29b777a8) - Fix bug with not transpiling files at the root - https://github.com/Jarred-Sumner/bun/commit/208885e3d24d9ac5059b7360cba04c23821da2d9 ## Bun.js - [Upgraded to the latest version of JavaScriptCore/WebKit, enabling `ShadowRealm` support](https://twitter.com/jarredsumner/status/1496779025825480708) - [Fast `TextEncoder` and `TextDecoder` implementation](https://twitter.com/jarredsumner/status/1496455856224972808) - `process.exit(exitCode)` is now implemented - [`crypto.randomUUID`](https://twitter.com/jarredsumner/status/1494633556718456832) and `crypto.randomBytes()` - `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval` are stubbed in to bun.js. They do not actually work yet, but at least code that calls it won't error anymore ### Other try running `bun wiptest` in a project that uses jest it'll probably throw a not implemented error, but it might work