Skip to content

Commit 798971c

Browse files
authored
chore(app): drop core-js polyfills (#59007)
1 parent 9aeaa3c commit 798971c

4 files changed

Lines changed: 100 additions & 8 deletions

File tree

‎bun.lock‎

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎packages/app/package.json‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
"@solidjs/router": "catalog:",
8282
"@tanstack/solid-query": "5.91.4",
8383
"@tanstack/solid-virtual": "catalog:",
84-
"core-js": "3.50.0",
8584
"effect": "catalog:",
8685
"fuzzysort": "catalog:",
8786
"qr-scanner": "1.4.2",
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { afterEach, beforeEach, expect, test } from "bun:test"
2+
3+
const native = { groupBy: Map.groupBy, withResolvers: Promise.withResolvers, try: Promise.try }
4+
5+
const maps: Partial<typeof Map> = Map
6+
7+
const promises: Partial<typeof Promise> = Promise
8+
9+
beforeEach(async () => {
10+
delete maps.groupBy
11+
delete promises.withResolvers
12+
delete promises.try
13+
await import(`./polyfills?${Math.random()}`)
14+
})
15+
16+
afterEach(() => {
17+
Map.groupBy = native.groupBy
18+
Promise.withResolvers = native.withResolvers
19+
Promise.try = native.try
20+
})
21+
22+
test("Map.groupBy keeps first-seen key order and passes the index", () => {
23+
const groups = Map.groupBy([1, 2, 3, 4, 5], (n) => (n % 2 ? "odd" : "even"))
24+
expect([...groups]).toEqual([
25+
["odd", [1, 3, 5]],
26+
["even", [2, 4]],
27+
])
28+
expect([...Map.groupBy(["a", "b"], (_, index) => index).keys()]).toEqual([0, 1])
29+
})
30+
31+
test("Promise.withResolvers settles from outside", async () => {
32+
const resolved = Promise.withResolvers<number>()
33+
resolved.resolve(1)
34+
expect(await resolved.promise).toBe(1)
35+
36+
const rejected = Promise.withResolvers<number>()
37+
rejected.reject(new Error("no"))
38+
39+
await expect(rejected.promise).rejects.toThrow("no")
40+
})
41+
42+
test("Promise.try runs synchronously and isolates a throw", async () => {
43+
let ran = false
44+
45+
const value = Promise.try(() => {
46+
ran = true
47+
48+
return 2
49+
})
50+
51+
expect(ran).toBe(true)
52+
expect(await value).toBe(2)
53+
54+
expect(await Promise.try((a: number, b: number) => a + b, 1, 2)).toBe(3)
55+
56+
await expect(
57+
Promise.try(() => {
58+
throw new Error("boom")
59+
}),
60+
).rejects.toThrow("boom")
61+
})
Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,39 @@
1-
// Safari before 17.4 does not provide these runtime APIs; Promise.try arrived in Safari 18.2.
2-
import "core-js/es/map/group-by"
3-
import "core-js/es/promise/with-resolvers"
4-
import "core-js/es/promise/try"
1+
// Safari before 17.4 lacks Map.groupBy and Promise.withResolvers, and Promise.try arrived in Safari 18.2. Electron's
2+
// Chromium has all three, so these only matter for the web app.
3+
if (!Map.groupBy) {
4+
Map.groupBy = function groupBy<K, T>(items: Iterable<T>, callback: (item: T, index: number) => K) {
5+
const groups = new Map<K, T[]>()
6+
let index = 0
7+
8+
for (const item of items) {
9+
const key = callback(item, index++)
10+
const group = groups.get(key)
11+
12+
if (group) group.push(item)
13+
else groups.set(key, [item])
14+
}
15+
16+
return groups
17+
}
18+
}
19+
20+
if (!Promise.withResolvers) {
21+
Promise.withResolvers = function withResolvers<T>() {
22+
let resolve!: (value: T | PromiseLike<T>) => void
23+
let reject!: (reason?: Error) => void
24+
25+
const promise = new Promise<T>((res, rej) => {
26+
resolve = res
27+
reject = rej
28+
})
29+
30+
return { promise, resolve, reject }
31+
}
32+
}
33+
34+
if (!Promise.try) {
35+
// SAFETY: the callback's return type is carried through unchanged, which is all Promise.try promises.
36+
Promise.try = function tryCall<T, U extends unknown[]>(callback: (...args: U) => T | PromiseLike<T>, ...args: U) {
37+
return new Promise<T>((resolve) => resolve(callback(...args)))
38+
} as typeof Promise.try
39+
}

0 commit comments

Comments
 (0)