import { file, spawn, spawnSync } from "bun";
import { afterEach, beforeEach, expect, it, describe } from "bun:test";
import { bunEnv, bunExe, bunEnv as env } from "harness";
import { mkdtemp, realpath, rm, writeFile } from "fs/promises";
import { tmpdir } from "os";
import { join } from "path";
import { readdirSorted } from "./dummy.registry";
let run_dir: string;
beforeEach(async () => {
run_dir = await realpath(
await mkdtemp(join(tmpdir(), "bun-run.test." + Math.trunc(Math.random() * 9999999).toString(32))),
);
});
afterEach(async () => {
await rm(run_dir, { force: true, recursive: true });
});
for (let withRun of [false, true]) {
describe(withRun ? "bun run" : "bun", () => {
describe("should work with .", () => {
it("respecting 'main' field", async () => {
await writeFile(join(run_dir, "test.js"), "console.log('Hello, world!');");
await writeFile(
join(run_dir, "package.json"),
JSON.stringify({
name: "test",
version: "0.0.0",
main: "test.js",
}),
);
const { stdout, stderr, exitCode } = spawnSync({
cmd: [bunExe(), withRun ? "run" : "", "."].filter(Boolean),
cwd: run_dir,
env: bunEnv,
});
expect(stderr.toString()).toBe("");
expect(stdout.toString()).toBe("Hello, world!\n");
expect(exitCode).toBe(0);
});
it("falling back to index", async () => {
await writeFile(join(run_dir, "index.ts"), "console.log('Hello, world!');");
await writeFile(
join(run_dir, "package.json"),
JSON.stringify({
name: "test",
version: "0.0.0",
}),
);
const { stdout, stderr, exitCode } = spawnSync({
cmd: [bunExe(), withRun ? "run" : "", "."].filter(Boolean),
cwd: run_dir,
env: bunEnv,
});
expect(stderr.toString()).toBe("");
expect(stdout.toString()).toBe("Hello, world!\n");
expect(exitCode).toBe(0);
});
it("falling back to index with no package.json", async () => {
await writeFile(join(run_dir, "index.ts"), "console.log('Hello, world!');");
const { stdout, stderr, exitCode } = spawnSync({
cmd: [bunExe(), withRun ? "run" : "", "."].filter(Boolean),
cwd: run_dir,
env: bunEnv,
});
expect(stderr.toString()).toBe("");
expect(stdout.toString()).toBe("Hello, world!\n");
expect(exitCode).toBe(0);
});
});
});
}
it("should download dependency to run local file", async () => {
await writeFile(
join(run_dir, "test.js"),
`
const { minify } = require("uglify-js@3.17.4");
console.log(minify("print(6 * 7)").code);
`,
);
const {
stdout: stdout1,
stderr: stderr1,
exited: exited1,
} = spawn({
cmd: [bunExe(), "run", "test.js"],
cwd: run_dir,
stdout: null,
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"),
},
});
expect(stderr1).toBeDefined();
const err1 = await new Response(stderr1).text();
expect(err1).toBe("");
expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]);
expect(await readdirSorted(join(run_dir, ".cache"))).toContain("uglify-js");
expect(await readdirSorted(join(run_dir, ".cache", "uglify-js"))).toEqual(["3.17.4"]);
expect(stdout1).toBeDefined();
const out1 = await new Response(stdout1).text();
expect(out1.split(/\r?\n/)).toEqual(["print(42);", ""]);
expect(await exited1).toBe(0);
// Perform `bun test.js` with cached dependencies
const {
stdout: stdout2,
stderr: stderr2,
exited: exited2,
} = spawn({
cmd: [bunExe(), "test.js"],
cwd: run_dir,
stdout: null,
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"),
},
});
expect(stderr2).toBeDefined();
const err2 = await new Response(stderr2).text();
expect(err2).toBe("");
expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]);
expect(await readdirSorted(join(run_dir, ".cache"))).toContain("uglify-js");
expect(await readdirSorted(join(run_dir, ".cache", "uglify-js"))).toEqual(["3.17.4"]);
expect(stdout2).toBeDefined();
const out2 = await new Response(stdout2).text();
expect(out2.split(/\r?\n/)).toEqual(["print(42);", ""]);
expect(await exited2).toBe(0);
});
it("should download dependencies to run local file", async () => {
await writeFile(
join(run_dir, "test.js"),
`
import { file } from "bun";
import decompress from "decompress@4.2.1";
const buffer = await file("${join(import.meta.dir, "baz-0.0.3.tgz")}").arrayBuffer();
for (const entry of await decompress(Buffer.from(buffer))) {
console.log(\`\${entry.type}: \${entry.path}\`);
}
`,
);
const {
stdout: stdout1,
stderr: stderr1,
exited: exited1,
} = spawn({
cmd: [bunExe(), "test.js"],
cwd: run_dir,
stdout: null,
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"),
},
});
expect(stderr1).toBeDefined();
const err1 = await new Response(stderr1).text();
expect(err1).toBe("");
expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]);
expect(await readdirSorted(join(run_dir, ".cache"))).toContain("decompress");
expect(await readdirSorted(join(run_dir, ".cache", "decompress"))).toEqual(["4.2.1"]);
expect(await readdirSorted(join(run_dir, ".cache", "decompress", "4.2.1"))).toEqual([
"index.js",
"license",
"package.json",
"readme.md",
]);
expect(await file(join(run_dir, ".cache", "decompress", "4.2.1", "index.js")).text()).toContain(
"\nmodule.exports = ",
);
expect(stdout1).toBeDefined();
const out1 = await new Response(stdout1).text();
expect(out1.split(/\r?\n/)).toEqual([
"directory: package/",
"file: package/index.js",
"file: package/package.json",
"",
]);
expect(await exited1).toBe(0);
// Perform `bun run test.js` with cached dependencies
const {
stdout: stdout2,
stderr: stderr2,
exited: exited2,
} = spawn({
cmd: [bunExe(), "run", "test.js"],
cwd: run_dir,
stdout: null,
stdin: "pipe",
stderr: "pipe",
env: {
...env,
BUN_INSTALL_CACHE_DIR: join(run_dir, ".cache"),
},
});
expect(stderr2).toBeDefined();
const err2 = await new Response(stderr2).text();
expect(err2).toBe("");
expect(await readdirSorted(run_dir)).toEqual([".cache", "test.js"]);
expect(await readdirSorted(join(run_dir, ".cache"))).toContain("decompress");
expect(await readdirSorted(join(run_dir, ".cache", "decompress"))).toEqual(["4.2.1"]);
expect(await readdirSorted(join(run_dir, ".cache", "decompress", "4.2.1"))).toEqual([
"index.js",
"license",
"package.json",
"readme.md",
]);
expect(await file(join(run_dir, ".cache", "decompress", "4.2.1", "index.js")).text()).toContain(
"\nmodule.exports = ",
);
expect(stdout2).toBeDefined();
const out2 = await new Response(stdout2).text();
expect(out2.split(/\r?\n/)).toEqual([
"directory: package/",
"file: package/index.js",
"file: package/package.json",
"",
]);
expect(await exited2).toBe(0);
});
xpose-action-api-context'>feat/expose-action-api-context
feat/expose-frontmatter-to-build-done-hook
feat/fetch-cache
feat/flow-components
feat/fonts-granular-preload
feat/fonts-retrieve-data
feat/foreign-key-migrations
feat/foreign-keys
feat/html-pages
feat/image-placeholders
feat/improve-custom-element-detection
feat/incremental-build
feat/indexes
feat/integration-kit
feat/jsx-transform
feat/legacy-markdown-flag
feat/markdoc-embeds
feat/markdown-components
feat/mdx-js-injection
feat/mdx-plugin-export
feat/minify-html
feat/next-get-env
feat/og
feat/ooo-streaming
feat/pragma
feat/preview
feat/react-19
feat/react-19-actions
feat/redirect-on-html-backup
feat/references
feat/remote-flag
feat/remove-astro-image-backup
feat/remove-studio
feat/render-with-queue
feat/reroute-ssr
feat/resolve-entrypoint
feat/router
feat/router-ii
feat/seo-components
feat/skip-sync-flag
feat/spa
feat/spa-ii
feat/squoosh
feat/standard-schema
feat/storage-studio
feat/streaming-rendering
feat/style-obj
feat/test-utils
feat/xray-improvements
fetch-astro-pages-mvp
fix-408
fix-all-pages-key
fix-beta-ref
fix-create-ref
fix-netlify-edge
fix-next-basics
fix-nullish-slot-name
fix-s-island-fallback
fix-vite-asset
fix/actions-cookies
fix/actions-pending-timeout
fix/assets-types
fix/astro-config-refresh
fix/astro-html-escape-bug
fix/build-subpaths
fix/client-only-component-css
fix/client-scripts-windows
fix/config-migration-defaults
fix/container-directives
fix/dates
fix/db-integration-with-missing-config
fix/devtoolbar-data-unset
fix/empty-slots
fix/filepath-layer
fix/frontmatter-file-url
fix/head-propagation
fix/hmr-css-deps
fix/import-ts-errors
fix/main-build-failure
fix/map-file-404-logs
fix/mdx-named-slots
fix/middleware-import
fix/multi-images
fix/nested-get-collection-call
fix/preact-package-build-failure
fix/primary-key-optional
fix/regex-flags
fix/server-headers
fix/stable-renderer-order
fix/transaction-type
fix/vue-nested
fix/webapi-dev
fork/markdoc-poc-with-md-support
fork/markdoc-poc-with-parser
format-imports-run
formatting
forward-button
framework-agnostic-astro-components
fryuni/db-pluggable-backend
fryuni/test-route-setup-hook
fryuni/tracing-hooks
hippotastic/legitimate-bat
hoisted-script-ts
host-ssr-example-2
hostfornode
image-non-node
improve-base-handling
inline-hoisted-scripts-now
jn.convert-assertions-to-query-params
latest
live-loaders
main
mandar1jn/ci-repo-check
markdoc-embed-prototyping
markdown
markdown-poc
mdx-path
mk/render-slot-template-backup
move-default-md-code-component
mt/lit-DSD
mt/lit-regen
mt/parse-DSD
mt/router_refactoring
nate/new-blog-template
netlify-1
netlify-preview
new-adapter-api
next
next-render
no-more-vite-postprocess
no-more-vite-postprocess2
old-build
plt-1006/unified-and-mdx
plt-1768-trailing-slash-object
preact-shared-signals
process-env-override
progress-log
re-export-drivers
react-fast-refresh
redirects-priority2
redirects-ssg-object
refactor-how-client-directives-work
refactor/image-internals
refactor/markdoc-renderer
refactor/rendere-queue
refactor/sitemap
refactor/ssr-size
release/0.17
release/0.18
remote-cdn-link
remove-fs-abstraction
remove-start
restart-on-lock
revert-13008-renovate/all-minor-patch
revert-lockfile
route-manifest-adapter
sarah11918-image-errors
sarah11918-patch-2
sb-tests2
seroval
server-islands-children
session-docs
single-file-build-2
slash-404-hint
slot-bug-1
solid-ecosystem-pkg
spike/app-setup
spike/autonav
spike/codehike
spike/context
spike/csr
spike/default-content
spike/incremental
spike/incremental-ii
spike/markdown-wasm
spike/render
spike/streaming
spike/svg
sqlite-test
squeal
ssr-redirect
stream-buffer
streaming
telemetry-audit-1
test/new-integrations-demo
test/new-ssr-demo
top-level-exports-integrations
ts-in-hoisted-script
ts-no-err
upd-vite-vendored
upgrade-deps
v1-beta
vercel-test
vite-fork
vscode-astro-global
vt-follow-redirects
warn-exp-flag
win
windows-tests-beta
wip-assets
wip-component-api-2
wip-docs-components
wip-docs-reference-gen
wip-fetch-cache
wip-fun-flags
wip-icons
wip-logging
wip-logging-saved
wip-mdc
wip-mdx-to-astro-js
wip-preview-command-integrations
wip-setup-content
wip-smoke
wip-speed-up-markdown
wip-stage
wip/react-19-test
Unnamed repository; edit this file 'description' to name the repository.
Age Commit message (Collapse ) Author Files Lines
* fixed search bar not working
* fixed search bar not working during build
* fix search bar throwing error on production site
* Add config option customPages
Add config option customPages to be able to add custom URL pages to the sitemap.xml
* add comment to document customPages option
* Re-export vite types and added them to zod schema
* Removed casted typed
* Changeset
* [ci] update lockfile
* chore: fix lockfile
* fix: pin turbo
Co-authored-by: FredKSchott <FredKSchott@users.noreply.github.com>
Co-authored-by: Nate Moore <nate@skypack.dev>
* add error hints
* chore: add changeset
Co-authored-by: Nate Moore <nate@skypack.dev>
* feat: pass "client" directive to clientEntrypoints
* refactor: remove hydration warning suppression react 17
* feat: remove hydration warning suppression react 18
* chore: changeset
* fix: change metadata to options bag
* WIP: adding test coverage
* test fixes
* moving the shared lib up a directory to reproduce the bug
* fix: transform with the module ID instead of parsing the filepath
* adding the shared lib to the workspaces list
* fix: client-only assets now get the full URL from vite
* why is this needed for windows?
* WIP: using /@fs to handle windows filepaths
* fix: remove /@fs from hoisted script imports
* nit: removing unused imports
* fix: strip off the path root when mapping client:only styles
* had to reverse the `/@fs` handling to work on windows and unix
* chore: adding comments to explain the fix
* chore: adding changeset
* fix: exclude `node-fetch` from vite.optimizeDeps
* chore: format
* Removed ignores
* Migration to v3
* More changes
* Remove legacy redirects
* Fail when there is no ENABLE_VC_BUILD
* Fix edge
* Updated readme
* Changeset
* Added static mode
* Updated documentation
* Updated shim
* Made edge work!
* Updated changeset
* Ensure empty dir
* Fixed redirects for dynamic paths
* Removed extra declaration
* Splited imports
* Updated readme
* Fixed some urls
* Deprecated shim!
* [test]: Vercel NFT
* Beautify
* Edge bundle to node 14.19
Vercel runs 14.19.1 (I've checked it manually)
* Re-added shim (#3304)
* Added `node:` prefix
* Use the same bundling as Deno for Edge
* Remove esbuild
* Fixed shim
* Moved nft
* Updated changeset
* Added note about Edge
* fix typo
* Added support for Node 16 (vercel/vercel#7772)
* Fix APIRoute type
* Adds a changeset
* Update usage of the two API route signatures
* wip: port gradient helpers from sandbox ideas
* feat: wire up rocket gradient 🚀
* feat: wire up rocket gradient on install step
* refactor: update "next steps" wording
* deps: add chalk (for rendering gradient)
* chore: changeset
* chore: clean up sstray template string