Skip to content

Commit 66d9385

Browse files
feat: add package version for bun
BREAKING CHANGE WIP
1 parent d82a8a8 commit 66d9385

8 files changed

+101
-41
lines changed

package.json

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,15 @@
77
"files": [
88
"dist/**/*"
99
],
10-
"main": "./dist/cjs/index.js",
11-
"module": "./dist/esm/index.mjs",
1210
"exports": {
1311
".": {
14-
"import": {
15-
"types": "./dist/esm/index.d.mts",
16-
"default": "./dist/esm/index.mjs"
12+
"bun": {
13+
"types": "./dist/bun.d.mts",
14+
"default": "./dist/bun.mjs"
1715
},
18-
"require": {
19-
"types": "./dist/cjs/index.d.ts",
20-
"default": "./dist/cjs/index.js"
16+
"default": {
17+
"types": "./dist/generic.d.ts",
18+
"default": "./dist/generic.js"
2119
}
2220
},
2321
"./package.json": "./package.json"
File renamed without changes.

src/bun.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { builtinModules } from "node:module";
2+
3+
import { checkModule, bundledBunModules, supportedNodeModules } from "./shared";
4+
import type { BunVersion, Modules } from "./shared";
5+
6+
export type { BunVersion };
7+
export { MINIMUM_BUN_VERSION } from "./shared";
8+
9+
const bunModules = { ...bundledBunModules } as Modules;
10+
// don't do the same with node modules because `builtinModules` in bun contains even not implemented node modules
11+
for (const moduleName of builtinModules) {
12+
if (moduleName.startsWith("bun:")) {
13+
bunModules[moduleName] ??= `>=${Bun.version}`;
14+
}
15+
}
16+
17+
export function isBunModule(moduleName: string, bunVersion?: BunVersion): boolean {
18+
return checkModule(moduleName, bunModules, bunVersion);
19+
}
20+
21+
export function isSupportedNodeModule(moduleName: string, bunVersion?: BunVersion): boolean {
22+
return checkModule(moduleName.replace(/^node:/, ""), supportedNodeModules, bunVersion);
23+
}
24+
25+
export function isBunBuiltin(moduleName: string, bunVersion?: BunVersion): boolean {
26+
return isBunModule(moduleName, bunVersion) || isSupportedNodeModule(moduleName, bunVersion);
27+
}

src/generic.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { checkModule, bundledBunModules, supportedNodeModules } from "./shared";
2+
import type { BunVersion } from "./shared";
3+
4+
export type { BunVersion };
5+
export { MINIMUM_BUN_VERSION } from "./shared";
6+
7+
export function isBunModule(moduleName: string, bunVersion?: BunVersion): boolean {
8+
return checkModule(moduleName, bundledBunModules, bunVersion);
9+
}
10+
11+
export function isSupportedNodeModule(moduleName: string, bunVersion?: BunVersion): boolean {
12+
return checkModule(moduleName.replace(/^node:/, ""), supportedNodeModules, bunVersion);
13+
}
14+
15+
export function isBunBuiltin(moduleName: string, bunVersion?: BunVersion): boolean {
16+
return isBunModule(moduleName, bunVersion) || isSupportedNodeModule(moduleName, bunVersion);
17+
}

src/index.ts renamed to src/shared.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,23 @@ import valid from "semver/functions/valid";
22
import satisfies from "semver/functions/satisfies";
33
import lt from "semver/functions/lt";
44

5-
import bunModules from "@assets/bun-modules.json";
6-
import nodeModules from "@assets/node-modules.json";
5+
export { default as bundledBunModules } from "@assets/bun-modules.json";
6+
export { default as supportedNodeModules } from "@assets/supported-node-modules.json";
77

88
type SemVerBaseStringified = `${bigint}.${bigint}.${bigint}`;
99
type SemVerStringifiedWithReleaseName = `${SemVerBaseStringified}-${string}`;
1010
type SemVerStringified = SemVerBaseStringified | SemVerStringifiedWithReleaseName;
1111
export type BunVersion = SemVerStringified | "latest";
1212

13-
export const MINIMUM_BUN_VERSION = "1.0.0" satisfies SemVerBaseStringified;
14-
15-
export function isBunModule(moduleName: string, bunVersion?: BunVersion): boolean {
16-
return checkModule(moduleName, bunModules, bunVersion);
17-
}
18-
19-
export function isSupportedNodeModule(moduleName: string, bunVersion?: BunVersion): boolean {
20-
return checkModule(moduleName.replace(/^node:/, ""), nodeModules, bunVersion);
21-
}
22-
23-
export function isBunBuiltin(moduleName: string, bunVersion?: BunVersion): boolean {
24-
return isBunModule(moduleName, bunVersion) || isSupportedNodeModule(moduleName, bunVersion);
25-
}
13+
export type Modules = Record<string, string | boolean>;
2614

27-
type BunModules = typeof bunModules;
28-
type SupportedNodeModules = typeof nodeModules;
29-
type CoreModules = BunModules | SupportedNodeModules;
15+
export const MINIMUM_BUN_VERSION = "1.0.0" satisfies SemVerBaseStringified;
3016

31-
function checkModule(moduleName: string, modules: CoreModules, bunVersion?: BunVersion): boolean {
17+
export function checkModule(
18+
moduleName: string,
19+
modules: Modules,
20+
bunVersion?: BunVersion,
21+
): boolean {
3222
if (typeof moduleName !== "string") throw new TypeError("Module name must be a string");
3323
if (!(moduleName in modules)) return false;
3424

@@ -49,13 +39,13 @@ function checkModule(moduleName: string, modules: CoreModules, bunVersion?: BunV
4939
throw new RangeError(`Bun version must be at least ${MINIMUM_BUN_VERSION}`);
5040
}
5141

52-
const versionRange = modules[moduleName as keyof typeof modules];
42+
const versionRange = modules[moduleName]!;
5343
if (typeof versionRange === "boolean") return versionRange;
5444
return satisfies(targetBunVersion, versionRange);
5545
}
5646

5747
function toSemVerStringified(input: unknown): SemVerStringified | undefined {
5848
if (typeof input !== "string") return;
5949
if (input === "latest") return "999.999.999";
60-
if (valid(input)) return input as SemVerBaseStringified;
50+
if (valid(input)) return input as SemVerStringified;
6151
}

test/isBunBuiltin.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { test, expect, describe } from "bun:test";
2+
3+
import { isBunBuiltin } from "is-bun-module";
4+
5+
describe("Bun built-ins checking", () => {
6+
test("Return true for bun", () => {
7+
expect(isBunBuiltin("bun")).toBe(true);
8+
expect(isBunBuiltin("bun:test")).toBe(true);
9+
});
10+
11+
test("Return true for supported node", () => {
12+
expect(isBunBuiltin("fs")).toBe(true);
13+
expect(isBunBuiltin("node:fs")).toBe(true);
14+
expect(isBunBuiltin("http2", "1.0.13")).toBe(true);
15+
expect(isBunBuiltin("node:http2", "1.0.13")).toBe(true);
16+
});
17+
18+
test("Return false for non-node/not supported", () => {
19+
expect(isBunBuiltin("node:bun")).toBe(false);
20+
expect(isBunBuiltin("node:http2", "1.0.0")).toBe(false);
21+
expect(isBunBuiltin("http2", "1.0.0")).toBe(false);
22+
});
23+
});

test/versionRanges.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { test, expect, describe } from "bun:test";
33

44
describe("Version ranges parsing", () => {
55
test("Node modules is parsebable", async () => {
6-
const nodeModules = (await import("@assets/node-modules.json")).default;
6+
const nodeModules = (await import("@assets/supported-node-modules.json")).default;
77

88
for (const range of Object.values(nodeModules)) {
99
expect(isValidRange(range)).toBe(true);

tsup.config.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import { defineConfig, type Options } from "tsup";
22

3-
const baseConfig = {
4-
entry: ["src/index.ts"],
3+
const sharedConfig = {
4+
entry: ["src/shared.ts"],
55
target: "es2019",
6+
format: ["cjs"],
67
dts: true,
78
clean: true,
89
} satisfies Options;
910

10-
const cjsConfig = {
11-
...baseConfig,
12-
format: "cjs",
13-
outDir: "dist/cjs",
11+
const genericConfig = {
12+
entry: ["src/generic.ts"],
13+
target: "es2019",
14+
format: ["cjs"],
15+
external: ["./shared"],
16+
dts: true,
1417
} satisfies Options;
1518

16-
const esmConfig = {
17-
...baseConfig,
18-
format: "esm",
19-
outDir: "dist/esm",
19+
const bunConfig = {
20+
entry: ["src/bun.ts"],
21+
target: "es2020",
22+
format: ["esm"],
23+
external: ["./shared"],
24+
dts: true,
2025
} satisfies Options;
2126

22-
export default defineConfig([cjsConfig, esmConfig]);
27+
export default defineConfig([sharedConfig, genericConfig, bunConfig]);

0 commit comments

Comments
 (0)