โ ๏ธ 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
โก 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

- [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