mirror of
https://github.com/oven-sh/bun
synced 2026-02-10 10:58:56 +00:00
* [install] allow parallel execution of `postinstall` scripts - fixes spurious exit code 42 from `spawn()` * postinstall to a pipe * feat(install): include top 500 packages as defaults for postinstall * windows newline handling* *i did not test it * stuff * cool * a * fix merge * set `has_trusted_dependencies` * fix a bunch of tests * fix merge * remove `PackageManager` * remove commented code * change to function * Update lockfile.zig * run scripts if added to `trustedDependencies` after install * packages without `resolved` properties * node-gyp scripts * node-gyp script in the root * another test * git deps run prepare scripts * fix merge * run lifecycle scripts during installation * Update lockfile.zig * always increment * 🏗️ * update tests * tickWIthoutIdle * const uws * loop forwards through trees * single buffer bitset list * tag.isGit * windows path separators * `bun.sys.read` and enable/disable buffering * fix test and waiter thread * waiter thread and tests * Update bun-install-registry.test.ts * workspace exclude `preprepare` and `postprepare` * Create esbuild.test.ts * make sure length is the same * remove deferred binlinks, add estrella test * test with another version * address some comments * remove .verdaccio-db.json * ooops * fix build * use `pid` to wait * dont register pid_poll when using waiter thread * stress test * free * fix failing tests * fix linux crash, snapshot stress test * oops * concurrent scripts * activate as soon as possible * test * delete stress test packages * remove unused packages * comment stress test and maybe fix segfault * delete snapshot * fix assertion * use cpu_count * 2 for default concurrent scripts * gear emoji * add --concurrent-scripts to docs * more docs --------- Co-authored-by: alexlamsl <alexlamsl@gmail.com> Co-authored-by: dave caruso <me@paperdave.net> Co-authored-by: Dylan Conway <33744874+MilesWright7@users.noreply.github.com> Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
159 lines
4.1 KiB
TypeScript
159 lines
4.1 KiB
TypeScript
import { gc as bunGC, unsafe, which } from "bun";
|
|
|
|
export const bunEnv: any = {
|
|
...process.env,
|
|
GITHUB_ACTIONS: "false",
|
|
BUN_DEBUG_QUIET_LOGS: "1",
|
|
NO_COLOR: "1",
|
|
FORCE_COLOR: undefined,
|
|
TZ: "Etc/UTC",
|
|
CI: "1",
|
|
BUN_RUNTIME_TRANSPILER_CACHE_PATH: "0",
|
|
};
|
|
|
|
export function bunExe() {
|
|
return process.execPath;
|
|
}
|
|
|
|
export function nodeExe(): string | null {
|
|
return which("node") || null;
|
|
}
|
|
|
|
export function gc(force = true) {
|
|
bunGC(force);
|
|
}
|
|
|
|
/**
|
|
* The garbage collector is not 100% deterministic
|
|
*
|
|
* We want to assert that SOME of the objects are collected
|
|
* But we cannot reliably assert that ALL of them are collected
|
|
*
|
|
* Therefore, we check that the count is less than or equal to the expected count
|
|
*
|
|
* @param type
|
|
* @param count
|
|
* @param maxWait
|
|
* @returns
|
|
*/
|
|
export async function expectMaxObjectTypeCount(
|
|
expect: typeof import("bun:test").expect,
|
|
type: string,
|
|
count: number,
|
|
maxWait = 1000,
|
|
) {
|
|
var { heapStats } = require("bun:jsc");
|
|
|
|
gc();
|
|
if (heapStats().objectTypeCounts[type] <= count) return;
|
|
gc(true);
|
|
for (const wait = 20; maxWait > 0; maxWait -= wait) {
|
|
if (heapStats().objectTypeCounts[type] <= count) break;
|
|
await Bun.sleep(wait);
|
|
gc();
|
|
}
|
|
expect(heapStats().objectTypeCounts[type]).toBeLessThanOrEqual(count);
|
|
}
|
|
|
|
// we must ensure that finalizers are run
|
|
// so that the reference-counting logic is exercised
|
|
export function gcTick(trace = false) {
|
|
trace && console.trace("");
|
|
// console.trace("hello");
|
|
gc();
|
|
return Bun.sleep(0);
|
|
}
|
|
|
|
export function withoutAggressiveGC(block: () => unknown) {
|
|
if (!unsafe.gcAggressionLevel) return block();
|
|
|
|
const origGC = unsafe.gcAggressionLevel();
|
|
unsafe.gcAggressionLevel(0);
|
|
try {
|
|
return block();
|
|
} finally {
|
|
unsafe.gcAggressionLevel(origGC);
|
|
}
|
|
}
|
|
|
|
export function hideFromStackTrace(block: CallableFunction) {
|
|
Object.defineProperty(block, "name", {
|
|
value: "::bunternal::",
|
|
configurable: true,
|
|
enumerable: true,
|
|
writable: true,
|
|
});
|
|
}
|
|
|
|
export function tempDirWithFiles(basename: string, files: Record<string, string | Record<string, string>>): string {
|
|
var fs = require("fs");
|
|
var path = require("path");
|
|
var { tmpdir } = require("os");
|
|
|
|
const dir = fs.mkdtempSync(path.join(fs.realpathSync(tmpdir()), basename + "_"));
|
|
for (const [name, contents] of Object.entries(files)) {
|
|
if (typeof contents === "object") {
|
|
for (const [_name, _contents] of Object.entries(contents)) {
|
|
fs.mkdirSync(path.dirname(path.join(dir, name, _name)), { recursive: true });
|
|
fs.writeFileSync(path.join(dir, name, _name), _contents);
|
|
}
|
|
continue;
|
|
}
|
|
fs.mkdirSync(path.dirname(path.join(dir, name)), { recursive: true });
|
|
fs.writeFileSync(path.join(dir, name), contents);
|
|
}
|
|
return dir;
|
|
}
|
|
|
|
export function bunRun(file: string, env?: Record<string, string>) {
|
|
var path = require("path");
|
|
const result = Bun.spawnSync([bunExe(), file], {
|
|
cwd: path.dirname(file),
|
|
env: {
|
|
...bunEnv,
|
|
NODE_ENV: undefined,
|
|
...env,
|
|
},
|
|
});
|
|
if (!result.success) throw new Error(result.stderr.toString("utf8"));
|
|
return {
|
|
stdout: result.stdout.toString("utf8").trim(),
|
|
stderr: result.stderr.toString("utf8").trim(),
|
|
};
|
|
}
|
|
|
|
export function bunTest(file: string, env?: Record<string, string>) {
|
|
var path = require("path");
|
|
const result = Bun.spawnSync([bunExe(), "test", path.basename(file)], {
|
|
cwd: path.dirname(file),
|
|
env: {
|
|
...bunEnv,
|
|
NODE_ENV: undefined,
|
|
...env,
|
|
},
|
|
});
|
|
if (!result.success) throw new Error(result.stderr.toString("utf8"));
|
|
return {
|
|
stdout: result.stdout.toString("utf8").trim(),
|
|
stderr: result.stderr.toString("utf8").trim(),
|
|
};
|
|
}
|
|
|
|
export function bunRunAsScript(dir: string, script: string, env?: Record<string, string>) {
|
|
const result = Bun.spawnSync([bunExe(), `run`, `${script}`], {
|
|
cwd: dir,
|
|
env: {
|
|
...bunEnv,
|
|
NODE_ENV: undefined,
|
|
...env,
|
|
},
|
|
});
|
|
|
|
if (!result.success) throw new Error(result.stderr.toString("utf8"));
|
|
|
|
return {
|
|
stdout: result.stdout.toString("utf8").trim(),
|
|
stderr: result.stderr.toString("utf8").trim(),
|
|
};
|
|
}
|