bun-types 1.3.2-canary.20251105T140650 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun.d.ts +102 -6
- package/docs/README.md +28 -0
- package/docs/bundler/bytecode.mdx +465 -0
- package/docs/bundler/{css.md → css.mdx} +97 -101
- package/docs/bundler/esbuild.mdx +253 -0
- package/docs/bundler/{executables.md → executables.mdx} +130 -221
- package/docs/bundler/fullstack.mdx +1064 -0
- package/docs/bundler/{hmr.md → hot-reloading.mdx} +74 -79
- package/docs/bundler/{html.md → html-static.mdx} +148 -111
- package/docs/bundler/index.mdx +1499 -0
- package/docs/bundler/loaders.mdx +356 -0
- package/docs/bundler/{macros.md → macros.mdx} +83 -84
- package/docs/bundler/minifier.mdx +1306 -0
- package/docs/bundler/plugins.mdx +411 -0
- package/docs/feedback.mdx +85 -0
- package/docs/guides/binary/{arraybuffer-to-array.md → arraybuffer-to-array.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-blob.md → arraybuffer-to-blob.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-buffer.md → arraybuffer-to-buffer.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-string.md → arraybuffer-to-string.mdx} +3 -1
- package/docs/guides/binary/{arraybuffer-to-typedarray.md → arraybuffer-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{blob-to-arraybuffer.md → blob-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{blob-to-dataview.md → blob-to-dataview.mdx} +3 -1
- package/docs/guides/binary/{blob-to-stream.md → blob-to-stream.mdx} +3 -1
- package/docs/guides/binary/{blob-to-string.md → blob-to-string.mdx} +3 -1
- package/docs/guides/binary/{blob-to-typedarray.md → blob-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-arraybuffer.md → buffer-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-blob.md → buffer-to-blob.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-readablestream.md → buffer-to-readablestream.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-string.md → buffer-to-string.mdx} +3 -1
- package/docs/guides/binary/{buffer-to-typedarray.md → buffer-to-typedarray.mdx} +3 -1
- package/docs/guides/binary/{dataview-to-string.md → dataview-to-string.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-arraybuffer.md → typedarray-to-arraybuffer.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-blob.md → typedarray-to-blob.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-buffer.md → typedarray-to-buffer.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-dataview.md → typedarray-to-dataview.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-readablestream.md → typedarray-to-readablestream.mdx} +3 -1
- package/docs/guides/binary/{typedarray-to-string.md → typedarray-to-string.mdx} +3 -1
- package/docs/guides/deployment/aws-lambda.mdx +204 -0
- package/docs/guides/deployment/digital-ocean.mdx +161 -0
- package/docs/guides/deployment/google-cloud-run.mdx +197 -0
- package/docs/guides/deployment/{railway.md → railway.mdx} +42 -54
- package/docs/guides/deployment/render.mdx +82 -0
- package/docs/guides/deployment/vercel.mdx +99 -0
- package/docs/guides/ecosystem/{astro.md → astro.mdx} +16 -6
- package/docs/guides/ecosystem/{discordjs.md → discordjs.mdx} +21 -18
- package/docs/guides/ecosystem/{docker.md → docker.mdx} +25 -14
- package/docs/guides/ecosystem/{drizzle.md → drizzle.mdx} +32 -22
- package/docs/guides/ecosystem/{edgedb.md → edgedb.mdx} +63 -34
- package/docs/guides/ecosystem/{elysia.md → elysia.mdx} +11 -11
- package/docs/guides/ecosystem/{express.md → express.mdx} +12 -9
- package/docs/guides/ecosystem/{hono.md → hono.mdx} +16 -8
- package/docs/guides/ecosystem/{mongoose.md → mongoose.mdx} +26 -21
- package/docs/guides/ecosystem/{neon-drizzle.md → neon-drizzle.mdx} +49 -35
- package/docs/guides/ecosystem/{neon-serverless-postgres.md → neon-serverless-postgres.mdx} +16 -11
- package/docs/guides/ecosystem/{nextjs.md → nextjs.mdx} +18 -10
- package/docs/guides/ecosystem/{nuxt.md → nuxt.mdx} +45 -11
- package/docs/guides/ecosystem/{pm2.md → pm2.mdx} +7 -9
- package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
- package/docs/guides/ecosystem/prisma.mdx +164 -0
- package/docs/guides/ecosystem/{qwik.md → qwik.mdx} +18 -11
- package/docs/guides/ecosystem/{react.md → react.mdx} +9 -7
- package/docs/guides/ecosystem/{remix.md → remix.mdx} +45 -26
- package/docs/guides/ecosystem/{sentry.md → sentry.mdx} +7 -5
- package/docs/guides/ecosystem/{solidstart.md → solidstart.mdx} +21 -13
- package/docs/guides/ecosystem/{ssr-react.md → ssr-react.mdx} +9 -11
- package/docs/guides/ecosystem/{stric.md → stric.mdx} +16 -17
- package/docs/guides/ecosystem/{sveltekit.md → sveltekit.mdx} +42 -29
- package/docs/guides/ecosystem/{systemd.md → systemd.mdx} +27 -26
- package/docs/guides/ecosystem/upstash.mdx +87 -0
- package/docs/guides/ecosystem/{vite.md → vite.mdx} +20 -14
- package/docs/guides/html-rewriter/{extract-links.md → extract-links.mdx} +11 -7
- package/docs/guides/html-rewriter/{extract-social-meta.md → extract-social-meta.mdx} +6 -2
- package/docs/guides/http/{cluster.md → cluster.mdx} +10 -7
- package/docs/guides/http/{fetch-unix.md → fetch-unix.mdx} +5 -3
- package/docs/guides/http/{fetch.md → fetch.mdx} +5 -3
- package/docs/guides/http/{file-uploads.md → file-uploads.mdx} +18 -15
- package/docs/guides/http/{hot.md → hot.mdx} +9 -7
- package/docs/guides/http/{proxy.md → proxy.mdx} +7 -5
- package/docs/guides/http/{server.md → server.mdx} +4 -2
- package/docs/guides/http/{simple.md → simple.mdx} +4 -2
- package/docs/guides/http/{stream-file.md → stream-file.mdx} +6 -4
- package/docs/guides/http/{stream-iterator.md → stream-iterator.mdx} +5 -3
- package/docs/guides/http/{stream-node-streams-in-bun.md → stream-node-streams-in-bun.mdx} +4 -2
- package/docs/guides/http/{tls.md → tls.mdx} +5 -3
- package/docs/guides/index.mdx +10 -0
- package/docs/guides/install/{add-dev.md → add-dev.mdx} +8 -6
- package/docs/guides/install/add-git.mdx +38 -0
- package/docs/guides/install/{add-optional.md → add-optional.mdx} +7 -5
- package/docs/guides/install/{add-peer.md → add-peer.mdx} +13 -11
- package/docs/guides/install/{add-tarball.md → add-tarball.mdx} +7 -5
- package/docs/guides/install/{add.md → add.mdx} +12 -10
- package/docs/guides/install/{azure-artifacts.md → azure-artifacts.mdx} +15 -12
- package/docs/guides/{runtime/cicd.md → install/cicd.mdx} +13 -13
- package/docs/guides/install/{custom-registry.md → custom-registry.mdx} +6 -4
- package/docs/guides/install/{from-npm-install-to-bun-install.md → from-npm-install-to-bun-install.mdx} +50 -34
- package/docs/guides/install/{git-diff-bun-lockfile.md → git-diff-bun-lockfile.mdx} +14 -11
- package/docs/guides/install/{jfrog-artifactory.md → jfrog-artifactory.mdx} +4 -4
- package/docs/guides/install/{npm-alias.md → npm-alias.mdx} +6 -4
- package/docs/guides/install/{registry-scope.md → registry-scope.mdx} +6 -4
- package/docs/guides/install/{trusted.md → trusted.mdx} +22 -18
- package/docs/guides/install/{workspaces.md → workspaces.mdx} +13 -13
- package/docs/guides/install/{yarnlock.md → yarnlock.mdx} +15 -9
- package/docs/guides/process/{argv.md → argv.mdx} +17 -9
- package/docs/guides/process/{ctrl-c.md → ctrl-c.mdx} +4 -2
- package/docs/guides/process/{ipc.md → ipc.mdx} +13 -10
- package/docs/guides/process/{nanoseconds.md → nanoseconds.mdx} +3 -1
- package/docs/guides/process/{os-signals.md → os-signals.mdx} +3 -1
- package/docs/guides/process/{spawn-stderr.md → spawn-stderr.mdx} +4 -1
- package/docs/guides/process/{spawn-stdout.md → spawn-stdout.mdx} +3 -1
- package/docs/guides/process/{spawn.md → spawn.mdx} +3 -1
- package/docs/guides/process/{stdin.md → stdin.mdx} +15 -7
- package/docs/guides/read-file/{arraybuffer.md → arraybuffer.mdx} +5 -3
- package/docs/guides/read-file/{buffer.md → buffer.mdx} +4 -2
- package/docs/guides/read-file/{exists.md → exists.mdx} +4 -2
- package/docs/guides/read-file/{json.md → json.mdx} +4 -2
- package/docs/guides/read-file/{mime.md → mime.mdx} +3 -1
- package/docs/guides/read-file/{stream.md → stream.mdx} +3 -1
- package/docs/guides/read-file/{string.md → string.mdx} +3 -1
- package/docs/guides/read-file/{uint8array.md → uint8array.mdx} +3 -1
- package/docs/guides/read-file/{watch.md → watch.mdx} +6 -8
- package/docs/guides/runtime/{build-time-constants.md → build-time-constants.mdx} +24 -22
- package/docs/guides/{install/cicd.md → runtime/cicd.mdx} +11 -7
- package/docs/guides/runtime/{codesign-macos-executable.md → codesign-macos-executable.mdx} +14 -9
- package/docs/guides/runtime/{define-constant.md → define-constant.mdx} +20 -16
- package/docs/guides/runtime/{delete-directory.md → delete-directory.mdx} +5 -3
- package/docs/guides/runtime/{delete-file.md → delete-file.mdx} +4 -2
- package/docs/guides/runtime/{heap-snapshot.md → heap-snapshot.mdx} +5 -3
- package/docs/guides/runtime/{import-html.md → import-html.mdx} +4 -2
- package/docs/guides/runtime/{import-json.md → import-json.mdx} +6 -4
- package/docs/guides/runtime/{import-toml.md → import-toml.mdx} +5 -3
- package/docs/guides/runtime/{import-yaml.md → import-yaml.mdx} +9 -7
- package/docs/guides/runtime/{read-env.md → read-env.mdx} +10 -5
- package/docs/guides/runtime/{set-env.md → set-env.mdx} +14 -10
- package/docs/guides/runtime/{shell.md → shell.mdx} +6 -4
- package/docs/guides/runtime/{timezone.md → timezone.mdx} +10 -7
- package/docs/guides/runtime/{tsconfig-paths.md → tsconfig-paths.mdx} +5 -3
- package/docs/guides/runtime/{typescript.md → typescript.mdx} +8 -6
- package/docs/guides/runtime/{vscode-debugger.md → vscode-debugger.mdx} +12 -11
- package/docs/guides/runtime/{web-debugger.md → web-debugger.mdx} +39 -18
- package/docs/guides/streams/{node-readable-to-arraybuffer.md → node-readable-to-arraybuffer.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-blob.md → node-readable-to-blob.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-json.md → node-readable-to-json.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-string.md → node-readable-to-string.mdx} +3 -1
- package/docs/guides/streams/{node-readable-to-uint8array.md → node-readable-to-uint8array.mdx} +3 -1
- package/docs/guides/streams/{to-array.md → to-array.mdx} +3 -1
- package/docs/guides/streams/{to-arraybuffer.md → to-arraybuffer.mdx} +3 -1
- package/docs/guides/streams/{to-blob.md → to-blob.mdx} +3 -1
- package/docs/guides/streams/{to-buffer.md → to-buffer.mdx} +3 -1
- package/docs/guides/streams/{to-json.md → to-json.mdx} +4 -2
- package/docs/guides/streams/{to-string.md → to-string.mdx} +3 -1
- package/docs/guides/streams/{to-typedarray.md → to-typedarray.mdx} +3 -1
- package/docs/guides/test/{bail.md → bail.mdx} +7 -5
- package/docs/guides/test/{coverage-threshold.md → coverage-threshold.mdx} +14 -7
- package/docs/guides/test/{coverage.md → coverage.mdx} +9 -4
- package/docs/guides/test/{happy-dom.md → happy-dom.mdx} +13 -8
- package/docs/guides/test/{migrate-from-jest.md → migrate-from-jest.mdx} +19 -37
- package/docs/guides/test/{mock-clock.md → mock-clock.mdx} +3 -1
- package/docs/guides/test/{mock-functions.md → mock-functions.mdx} +7 -5
- package/docs/guides/test/{rerun-each.md → rerun-each.mdx} +5 -3
- package/docs/guides/test/{run-tests.md → run-tests.mdx} +16 -11
- package/docs/guides/test/{skip-tests.md → skip-tests.mdx} +8 -4
- package/docs/guides/test/{snapshot.md → snapshot.mdx} +20 -13
- package/docs/guides/test/spy-on.mdx +49 -0
- package/docs/guides/test/{svelte-test.md → svelte-test.mdx} +16 -23
- package/docs/guides/test/{testing-library.md → testing-library.mdx} +18 -17
- package/docs/guides/test/{timeout.md → timeout.mdx} +5 -3
- package/docs/guides/test/{todo-tests.md → todo-tests.mdx} +13 -6
- package/docs/guides/test/{update-snapshots.md → update-snapshots.mdx} +9 -6
- package/docs/guides/test/{watch-mode.md → watch-mode.mdx} +9 -4
- package/docs/guides/util/{base64.md → base64.mdx} +3 -1
- package/docs/guides/util/{deep-equals.md → deep-equals.mdx} +5 -3
- package/docs/guides/util/{deflate.md → deflate.mdx} +3 -1
- package/docs/guides/util/{detect-bun.md → detect-bun.mdx} +3 -1
- package/docs/guides/util/{entrypoint.md → entrypoint.mdx} +4 -2
- package/docs/guides/util/{escape-html.md → escape-html.mdx} +3 -1
- package/docs/guides/util/{file-url-to-path.md → file-url-to-path.mdx} +3 -1
- package/docs/guides/util/{gzip.md → gzip.mdx} +3 -1
- package/docs/guides/util/{hash-a-password.md → hash-a-password.mdx} +3 -1
- package/docs/guides/util/{import-meta-dir.md → import-meta-dir.mdx} +4 -2
- package/docs/guides/util/{import-meta-file.md → import-meta-file.mdx} +4 -2
- package/docs/guides/util/{import-meta-path.md → import-meta-path.mdx} +4 -2
- package/docs/guides/util/{javascript-uuid.md → javascript-uuid.mdx} +3 -1
- package/docs/guides/util/{main.md → main.mdx} +19 -8
- package/docs/guides/util/{path-to-file-url.md → path-to-file-url.mdx} +3 -1
- package/docs/guides/util/{sleep.md → sleep.mdx} +3 -1
- package/docs/guides/util/{version.md → version.mdx} +6 -4
- package/docs/guides/util/{which-path-to-executable-bin.md → which-path-to-executable-bin.mdx} +4 -2
- package/docs/guides/websocket/{compression.md → compression.mdx} +5 -3
- package/docs/guides/websocket/{context.md → context.mdx} +9 -12
- package/docs/guides/websocket/{pubsub.md → pubsub.mdx} +5 -6
- package/docs/guides/websocket/{simple.md → simple.mdx} +5 -3
- package/docs/guides/write-file/{append.md → append.mdx} +3 -1
- package/docs/guides/write-file/{basic.md → basic.mdx} +3 -1
- package/docs/guides/write-file/{blob.md → blob.mdx} +3 -1
- package/docs/guides/write-file/{cat.md → cat.mdx} +4 -2
- package/docs/guides/write-file/{file-cp.md → file-cp.mdx} +3 -1
- package/docs/guides/write-file/{filesink.md → filesink.mdx} +3 -1
- package/docs/guides/write-file/{response.md → response.mdx} +3 -1
- package/docs/guides/write-file/{stdout.md → stdout.mdx} +3 -1
- package/docs/guides/write-file/{stream.md → stream.mdx} +3 -1
- package/docs/guides/write-file/{unlink.md → unlink.mdx} +3 -1
- package/docs/{index.md → index.mdx} +97 -41
- package/docs/installation.mdx +365 -0
- package/docs/{cli/bunx.md → pm/bunx.mdx} +25 -31
- package/docs/{install/catalogs.md → pm/catalogs.mdx} +18 -24
- package/docs/{cli/add.md → pm/cli/add.mdx} +61 -55
- package/docs/{install/audit.md → pm/cli/audit.mdx} +11 -8
- package/docs/{cli/install.md → pm/cli/install.mdx} +208 -81
- package/docs/{cli/link.md → pm/cli/link.mdx} +27 -19
- package/docs/{cli/outdated.md → pm/cli/outdated.mdx} +119 -12
- package/docs/{install/patch.md → pm/cli/patch.mdx} +25 -15
- package/docs/{cli/pm.md → pm/cli/pm.mdx} +96 -62
- package/docs/{cli/publish.md → pm/cli/publish.mdx} +38 -35
- package/docs/pm/cli/remove.mdx +16 -0
- package/docs/{cli/update.md → pm/cli/update.mdx} +26 -15
- package/docs/{cli/why.md → pm/cli/why.mdx} +27 -10
- package/docs/{cli/filter.md → pm/filter.mdx} +26 -14
- package/docs/{install/cache.md → pm/global-cache.mdx} +25 -12
- package/docs/{install/isolated.md → pm/isolated-installs.mdx} +32 -24
- package/docs/{install/lifecycle.md → pm/lifecycle.mdx} +20 -9
- package/docs/{install/lockfile.md → pm/lockfile.mdx} +18 -12
- package/docs/{install/npmrc.md → pm/npmrc.mdx} +30 -24
- package/docs/{install/overrides.md → pm/overrides.mdx} +47 -37
- package/docs/{install/registries.md → pm/scopes-registries.mdx} +8 -3
- package/docs/{install/security-scanner-api.md → pm/security-scanner-api.mdx} +22 -8
- package/docs/{install/workspaces.md → pm/workspaces.mdx} +17 -22
- package/docs/project/{benchmarking.md → benchmarking.mdx} +26 -11
- package/docs/project/{bindgen.md → bindgen.mdx} +12 -14
- package/docs/project/{building-windows.md → building-windows.mdx} +18 -47
- package/docs/project/{contributing.md → contributing.mdx} +56 -60
- package/docs/project/feedback.mdx +20 -0
- package/docs/project/license.mdx +78 -0
- package/docs/project/roadmap.mdx +8 -0
- package/docs/quickstart.mdx +240 -0
- package/docs/runtime/{autoimport.md → auto-install.mdx} +34 -31
- package/docs/{api/binary-data.md → runtime/binary-data.mdx} +77 -269
- package/docs/runtime/bun-apis.mdx +59 -0
- package/docs/runtime/{bunfig.md → bunfig.mdx} +95 -225
- package/docs/{api/cc.md → runtime/c-compiler.mdx} +16 -9
- package/docs/{api/spawn.md → runtime/child-process.mdx} +69 -119
- package/docs/{api/color.md → runtime/color.mdx} +6 -1
- package/docs/{api/console.md → runtime/console.mdx} +17 -7
- package/docs/{api/cookie.md → runtime/cookies.mdx} +24 -19
- package/docs/runtime/{debugger.md → debugger.mdx} +61 -51
- package/docs/runtime/environment-variables.mdx +214 -0
- package/docs/{api/ffi.md → runtime/ffi.mdx} +53 -45
- package/docs/{api/file-io.md → runtime/file-io.mdx} +41 -101
- package/docs/{api/file-system-router.md → runtime/file-system-router.mdx} +8 -2
- package/docs/{bundler/loaders.md → runtime/file-types.mdx} +56 -112
- package/docs/{api/glob.md → runtime/glob.mdx} +4 -1
- package/docs/runtime/globals.mdx +72 -0
- package/docs/{api/hashing.md → runtime/hashing.mdx} +18 -22
- package/docs/{api/html-rewriter.md → runtime/html-rewriter.mdx} +36 -30
- package/docs/runtime/http/cookies.mdx +79 -0
- package/docs/runtime/http/error-handling.mdx +40 -0
- package/docs/runtime/http/metrics.mdx +36 -0
- package/docs/runtime/http/routing.mdx +289 -0
- package/docs/runtime/http/server.mdx +647 -0
- package/docs/runtime/http/tls.mdx +101 -0
- package/docs/{api/websockets.md → runtime/http/websockets.mdx} +62 -231
- package/docs/{cli/run.md → runtime/index.mdx} +70 -108
- package/docs/runtime/jsx.mdx +115 -0
- package/docs/runtime/{modules.md → module-resolution.mdx} +83 -61
- package/docs/{api/dns.md → runtime/networking/dns.mdx} +23 -22
- package/docs/{api/fetch.md → runtime/networking/fetch.mdx} +10 -5
- package/docs/{api/tcp.md → runtime/networking/tcp.mdx} +59 -41
- package/docs/{api/udp.md → runtime/networking/udp.mdx} +14 -8
- package/docs/{api/node-api.md → runtime/node-api.mdx} +5 -0
- package/docs/runtime/{nodejs-apis.md → nodejs-compat.mdx} +9 -4
- package/docs/{bundler/plugins.md → runtime/plugins.mdx} +17 -61
- package/docs/{api/redis.md → runtime/redis.mdx} +65 -80
- package/docs/{api/s3.md → runtime/s3.mdx} +79 -66
- package/docs/{api/secrets.md → runtime/secrets.mdx} +27 -10
- package/docs/{api/semver.md → runtime/semver.mdx} +9 -4
- package/docs/runtime/{shell.md → shell.mdx} +52 -20
- package/docs/{api/sql.md → runtime/sql.mdx} +129 -99
- package/docs/{api/sqlite.md → runtime/sqlite.mdx} +162 -157
- package/docs/{api/streams.md → runtime/streams.mdx} +33 -31
- package/docs/{cli/bun-create.md → runtime/templating/create.mdx} +74 -143
- package/docs/{cli/init.md → runtime/templating/init.mdx} +24 -51
- package/docs/{api/transpiler.md → runtime/transpiler.mdx} +50 -38
- package/docs/{typescript.md → runtime/typescript.mdx} +7 -2
- package/docs/{api/utils.md → runtime/utils.mdx} +81 -50
- package/docs/runtime/{hot.md → watch-mode.mdx} +53 -37
- package/docs/runtime/web-apis.mdx +29 -0
- package/docs/{api/workers.md → runtime/workers.mdx} +28 -22
- package/docs/{api/yaml.md → runtime/yaml.mdx} +33 -232
- package/docs/snippets/cli/add.mdx +166 -0
- package/docs/snippets/cli/build.mdx +196 -0
- package/docs/snippets/cli/feedback.mdx +17 -0
- package/docs/snippets/cli/init.mdx +84 -0
- package/docs/snippets/cli/install.mdx +173 -0
- package/docs/snippets/cli/link.mdx +163 -0
- package/docs/snippets/cli/outdated.mdx +140 -0
- package/docs/snippets/cli/patch.mdx +171 -0
- package/docs/snippets/cli/publish.mdx +198 -0
- package/docs/snippets/cli/remove.mdx +146 -0
- package/docs/snippets/cli/run.mdx +293 -0
- package/docs/snippets/cli/test.mdx +100 -0
- package/docs/snippets/cli/update.mdx +144 -0
- package/docs/snippets/product-card.mdx +32 -0
- package/docs/snippets/product-tiles.mdx +94 -0
- package/docs/test/code-coverage.mdx +409 -0
- package/docs/test/configuration.mdx +467 -0
- package/docs/test/{time.md → dates-times.mdx} +23 -20
- package/docs/test/{discovery.md → discovery.mdx} +15 -10
- package/docs/test/dom.mdx +226 -0
- package/docs/{cli/test.md → test/index.mdx} +77 -94
- package/docs/test/lifecycle.mdx +348 -0
- package/docs/test/mocks.mdx +637 -0
- package/docs/test/{reporters.md → reporters.mdx} +15 -15
- package/docs/test/runtime-behavior.mdx +342 -0
- package/docs/test/snapshots.mdx +434 -0
- package/docs/test/writing-tests.mdx +635 -0
- package/docs/typescript.mdx +54 -0
- package/package.json +8 -6
- package/test.d.ts +2 -2
- package/docs/api/file.md +0 -19
- package/docs/api/globals.md +0 -387
- package/docs/api/http.md +0 -1408
- package/docs/api/import-meta.md +0 -69
- package/docs/benchmarks.md +0 -120
- package/docs/bun-flavored-toml.md +0 -42
- package/docs/bundler/css_modules.md +0 -145
- package/docs/bundler/fullstack.md +0 -418
- package/docs/bundler/index.md +0 -1735
- package/docs/bundler/intro.md +0 -75
- package/docs/bundler/vs-esbuild.md +0 -1127
- package/docs/cli/bun-completions.md +0 -3
- package/docs/cli/bun-install.md +0 -349
- package/docs/cli/bun-upgrade.md +0 -39
- package/docs/cli/info.md +0 -65
- package/docs/cli/patch-commit.md +0 -11
- package/docs/cli/remove.md +0 -7
- package/docs/cli/unlink.md +0 -9
- package/docs/contributing/upgrading-webkit.md +0 -57
- package/docs/ecosystem/elysia.md +0 -24
- package/docs/ecosystem/express.md +0 -37
- package/docs/ecosystem/hono.md +0 -18
- package/docs/ecosystem/react.md +0 -65
- package/docs/ecosystem/stric.md +0 -38
- package/docs/guides/ecosystem/prisma.md +0 -141
- package/docs/guides/ecosystem/render.md +0 -79
- package/docs/guides/install/add-git.md +0 -36
- package/docs/guides/test/spy-on.md +0 -46
- package/docs/install/index.md +0 -248
- package/docs/installation.md +0 -327
- package/docs/project/asan.md +0 -124
- package/docs/project/internals/build-process-for-ci.md +0 -75
- package/docs/project/licensing.md +0 -73
- package/docs/project/roadmap.md +0 -87
- package/docs/quickstart.md +0 -157
- package/docs/runtime/bun-apis.md +0 -207
- package/docs/runtime/env.md +0 -253
- package/docs/runtime/index.md +0 -312
- package/docs/runtime/jsx.md +0 -385
- package/docs/runtime/loaders.md +0 -130
- package/docs/runtime/plugins.md +0 -561
- package/docs/runtime/typescript.md +0 -139
- package/docs/runtime/web-apis.md +0 -128
- package/docs/test/configuration.md +0 -154
- package/docs/test/coverage.md +0 -142
- package/docs/test/dom.md +0 -75
- package/docs/test/examples/concurrent-test-glob.md +0 -132
- package/docs/test/hot.md +0 -15
- package/docs/test/lifecycle.md +0 -81
- package/docs/test/mocks.md +0 -313
- package/docs/test/runtime-behavior.md +0 -95
- package/docs/test/snapshots.md +0 -68
- package/docs/test/writing.md +0 -825
|
@@ -1,11 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: SQLite
|
|
3
|
+
description: Bun natively implements a high-performance SQLite3 driver.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
Bun natively implements a high-performance [SQLite3](https://www.sqlite.org/) driver. To use it import from the built-in `bun:sqlite` module.
|
|
2
7
|
|
|
3
|
-
```ts
|
|
8
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
4
9
|
import { Database } from "bun:sqlite";
|
|
5
10
|
|
|
6
11
|
const db = new Database(":memory:");
|
|
7
12
|
const query = db.query("select 'Hello world' as message;");
|
|
8
|
-
query.get();
|
|
13
|
+
query.get();
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```txt
|
|
17
|
+
{ message: "Hello world" }
|
|
9
18
|
```
|
|
10
19
|
|
|
11
20
|
The API is simple, synchronous, and fast. Credit to [better-sqlite3](https://github.com/JoshuaWise/better-sqlite3) and its contributors for inspiring the API of `bun:sqlite`.
|
|
@@ -23,13 +32,18 @@ Features include:
|
|
|
23
32
|
|
|
24
33
|
The `bun:sqlite` module is roughly 3-6x faster than `better-sqlite3` and 8-9x faster than `deno.land/x/sqlite` for read queries. Each driver was benchmarked against the [Northwind Traders](https://github.com/jpwhite3/northwind-SQLite3/blob/46d5f8a64f396f87cd374d1600dbf521523980e8/Northwind_large.sqlite.zip) dataset. View and run the [benchmark source](https://github.com/oven-sh/bun/tree/main/bench/sqlite).
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
<Frame caption="Benchmarked on an M1 MacBook Pro (64GB) running macOS 12.3.1">
|
|
36
|
+

|
|
38
|
+
</Frame>
|
|
39
|
+
|
|
40
|
+
---
|
|
27
41
|
|
|
28
42
|
## Database
|
|
29
43
|
|
|
30
44
|
To open or create a SQLite3 database:
|
|
31
45
|
|
|
32
|
-
```ts
|
|
46
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
33
47
|
import { Database } from "bun:sqlite";
|
|
34
48
|
|
|
35
49
|
const db = new Database("mydb.sqlite");
|
|
@@ -37,7 +51,7 @@ const db = new Database("mydb.sqlite");
|
|
|
37
51
|
|
|
38
52
|
To open an in-memory database:
|
|
39
53
|
|
|
40
|
-
```ts
|
|
54
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
41
55
|
import { Database } from "bun:sqlite";
|
|
42
56
|
|
|
43
57
|
// all of these do the same thing
|
|
@@ -48,64 +62,50 @@ const db = new Database("");
|
|
|
48
62
|
|
|
49
63
|
To open in `readonly` mode:
|
|
50
64
|
|
|
51
|
-
```ts
|
|
65
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
52
66
|
import { Database } from "bun:sqlite";
|
|
53
67
|
const db = new Database("mydb.sqlite", { readonly: true });
|
|
54
68
|
```
|
|
55
69
|
|
|
56
70
|
To create the database if the file doesn't exist:
|
|
57
71
|
|
|
58
|
-
```ts
|
|
72
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
59
73
|
import { Database } from "bun:sqlite";
|
|
60
74
|
const db = new Database("mydb.sqlite", { create: true });
|
|
61
75
|
```
|
|
62
76
|
|
|
63
77
|
### Strict mode
|
|
64
78
|
|
|
65
|
-
{% callout %}
|
|
66
|
-
Added in Bun v1.1.14
|
|
67
|
-
{% /callout %}
|
|
68
|
-
|
|
69
79
|
By default, `bun:sqlite` requires binding parameters to include the `$`, `:`, or `@` prefix, and does not throw an error if a parameter is missing.
|
|
70
80
|
|
|
71
81
|
To instead throw an error when a parameter is missing and allow binding without a prefix, set `strict: true` on the `Database` constructor:
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
```ts
|
|
83
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
75
84
|
import { Database } from "bun:sqlite";
|
|
76
85
|
|
|
77
|
-
const strict = new Database(
|
|
78
|
-
":memory:",
|
|
79
|
-
{ strict: true }
|
|
80
|
-
);
|
|
86
|
+
const strict = new Database(":memory:", { strict: true });
|
|
81
87
|
|
|
82
88
|
// throws error because of the typo:
|
|
83
|
-
const query = strict
|
|
84
|
-
.query("SELECT $message;")
|
|
85
|
-
.all({ message: "Hello world" });
|
|
89
|
+
const query = strict.query("SELECT $message;").all({ message: "Hello world" });
|
|
86
90
|
|
|
87
|
-
const notStrict = new Database(
|
|
88
|
-
":memory:"
|
|
89
|
-
);
|
|
91
|
+
const notStrict = new Database(":memory:");
|
|
90
92
|
// does not throw error:
|
|
91
|
-
notStrict
|
|
92
|
-
.query("SELECT $message;")
|
|
93
|
-
.all({ message: "Hello world" });
|
|
93
|
+
notStrict.query("SELECT $message;").all({ message: "Hello world" });
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
### Load via ES module import
|
|
97
97
|
|
|
98
98
|
You can also use an import attribute to load a database.
|
|
99
99
|
|
|
100
|
-
```ts
|
|
101
|
-
import db from "./mydb.sqlite" with {
|
|
100
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={1}
|
|
101
|
+
import db from "./mydb.sqlite" with { type: "sqlite" };
|
|
102
102
|
|
|
103
103
|
console.log(db.query("select * from users LIMIT 1").get());
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
This is equivalent to the following:
|
|
107
107
|
|
|
108
|
-
```ts
|
|
108
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
109
109
|
import { Database } from "bun:sqlite";
|
|
110
110
|
const db = new Database("./mydb.sqlite");
|
|
111
111
|
```
|
|
@@ -114,7 +114,7 @@ const db = new Database("./mydb.sqlite");
|
|
|
114
114
|
|
|
115
115
|
To close a database connection, but allow existing queries to finish, call `.close(false)`:
|
|
116
116
|
|
|
117
|
-
```ts
|
|
117
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
118
118
|
const db = new Database();
|
|
119
119
|
// ... do stuff
|
|
120
120
|
db.close(false);
|
|
@@ -122,33 +122,40 @@ db.close(false);
|
|
|
122
122
|
|
|
123
123
|
To close the database and throw an error if there are any pending queries, call `.close(true)`:
|
|
124
124
|
|
|
125
|
-
```ts
|
|
125
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
126
126
|
const db = new Database();
|
|
127
127
|
// ... do stuff
|
|
128
128
|
db.close(true);
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
Note
|
|
131
|
+
<Note>
|
|
132
|
+
`close(false)` is called automatically when the database is garbage collected. It is safe to call multiple times but
|
|
133
|
+
has no effect after the first.
|
|
134
|
+
</Note>
|
|
132
135
|
|
|
133
136
|
### `using` statement
|
|
134
137
|
|
|
135
138
|
You can use the `using` statement to ensure that a database connection is closed when the `using` block is exited.
|
|
136
139
|
|
|
137
|
-
```ts
|
|
140
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={4, 5}
|
|
138
141
|
import { Database } from "bun:sqlite";
|
|
139
142
|
|
|
140
143
|
{
|
|
141
144
|
using db = new Database("mydb.sqlite");
|
|
142
145
|
using query = db.query("select 'Hello world' as message;");
|
|
143
|
-
console.log(query.get());
|
|
146
|
+
console.log(query.get());
|
|
144
147
|
}
|
|
145
148
|
```
|
|
146
149
|
|
|
150
|
+
```txt
|
|
151
|
+
{ message: "Hello world" }
|
|
152
|
+
```
|
|
153
|
+
|
|
147
154
|
### `.serialize()`
|
|
148
155
|
|
|
149
156
|
`bun:sqlite` supports SQLite's built-in mechanism for [serializing](https://www.sqlite.org/c3ref/serialize.html) and [deserializing](https://www.sqlite.org/c3ref/deserialize.html) databases to and from memory.
|
|
150
157
|
|
|
151
|
-
```ts
|
|
158
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
152
159
|
const olddb = new Database("mydb.sqlite");
|
|
153
160
|
const contents = olddb.serialize(); // => Uint8Array
|
|
154
161
|
const newdb = Database.deserialize(contents);
|
|
@@ -160,20 +167,21 @@ Internally, `.serialize()` calls [`sqlite3_serialize`](https://www.sqlite.org/c3
|
|
|
160
167
|
|
|
161
168
|
Use the `db.query()` method on your `Database` instance to [prepare](https://www.sqlite.org/c3ref/prepare.html) a SQL query. The result is a `Statement` instance that will be cached on the `Database` instance. _The query will not be executed._
|
|
162
169
|
|
|
163
|
-
```ts
|
|
170
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
164
171
|
const query = db.query(`select "Hello world" as message`);
|
|
165
172
|
```
|
|
166
173
|
|
|
167
|
-
|
|
174
|
+
<Note>
|
|
175
|
+
Use the `.prepare()` method to prepare a query _without_ caching it on the `Database` instance.
|
|
168
176
|
|
|
169
|
-
|
|
177
|
+
```ts
|
|
178
|
+
// compile the prepared statement
|
|
179
|
+
const query = db.prepare("SELECT * FROM foo WHERE bar = ?");
|
|
180
|
+
```
|
|
170
181
|
|
|
171
|
-
|
|
172
|
-
// compile the prepared statement
|
|
173
|
-
const query = db.prepare("SELECT * FROM foo WHERE bar = ?");
|
|
174
|
-
```
|
|
182
|
+
</Note>
|
|
175
183
|
|
|
176
|
-
|
|
184
|
+
---
|
|
177
185
|
|
|
178
186
|
## WAL mode
|
|
179
187
|
|
|
@@ -181,15 +189,18 @@ SQLite supports [write-ahead log mode](https://www.sqlite.org/wal.html) (WAL) wh
|
|
|
181
189
|
|
|
182
190
|
To enable WAL mode, run this pragma query at the beginning of your application:
|
|
183
191
|
|
|
184
|
-
```ts
|
|
192
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
185
193
|
db.exec("PRAGMA journal_mode = WAL;");
|
|
186
194
|
```
|
|
187
195
|
|
|
188
|
-
|
|
196
|
+
<Accordion title="What is WAL mode?">
|
|
189
197
|
In WAL mode, writes to the database are written directly to a separate file called the "WAL file" (write-ahead log). This file will be later integrated into the main database file. Think of it as a buffer for pending writes. Refer to the [SQLite docs](https://www.sqlite.org/wal.html) for a more detailed overview.
|
|
190
198
|
|
|
191
199
|
On macOS, WAL files may be persistent by default. This is not a bug, it is how macOS configured the system version of SQLite.
|
|
192
|
-
|
|
200
|
+
|
|
201
|
+
</Accordion>
|
|
202
|
+
|
|
203
|
+
---
|
|
193
204
|
|
|
194
205
|
## Statements
|
|
195
206
|
|
|
@@ -197,13 +208,13 @@ A `Statement` is a _prepared query_, which means it's been parsed and compiled i
|
|
|
197
208
|
|
|
198
209
|
Create a statement with the `.query` method on your `Database` instance.
|
|
199
210
|
|
|
200
|
-
```ts
|
|
211
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
201
212
|
const query = db.query(`select "Hello world" as message`);
|
|
202
213
|
```
|
|
203
214
|
|
|
204
215
|
Queries can contain parameters. These can be numerical (`?1`) or named (`$param` or `:param` or `@param`).
|
|
205
216
|
|
|
206
|
-
```ts
|
|
217
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
207
218
|
const query = db.query(`SELECT ?1, ?2;`);
|
|
208
219
|
const query = db.query(`SELECT $param1, $param2;`);
|
|
209
220
|
```
|
|
@@ -214,32 +225,28 @@ Values are bound to these parameters when the query is executed. A `Statement` c
|
|
|
214
225
|
|
|
215
226
|
To bind values to a statement, pass an object to the `.all()`, `.get()`, `.run()`, or `.values()` method.
|
|
216
227
|
|
|
217
|
-
```ts
|
|
228
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
218
229
|
const query = db.query(`select $message;`);
|
|
219
230
|
query.all({ $message: "Hello world" });
|
|
220
231
|
```
|
|
221
232
|
|
|
222
233
|
You can bind using positional parameters too:
|
|
223
234
|
|
|
224
|
-
```ts
|
|
235
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
225
236
|
const query = db.query(`select ?1;`);
|
|
226
237
|
query.all("Hello world");
|
|
227
238
|
```
|
|
228
239
|
|
|
229
240
|
#### `strict: true` lets you bind values without prefixes
|
|
230
241
|
|
|
231
|
-
{% callout %}
|
|
232
|
-
Added in Bun v1.1.14
|
|
233
|
-
{% /callout %}
|
|
234
|
-
|
|
235
242
|
By default, the `$`, `:`, and `@` prefixes are **included** when binding values to named parameters. To bind without these prefixes, use the `strict` option in the `Database` constructor.
|
|
236
243
|
|
|
237
|
-
```ts
|
|
244
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
238
245
|
import { Database } from "bun:sqlite";
|
|
239
246
|
|
|
240
247
|
const db = new Database(":memory:", {
|
|
241
248
|
// bind values without prefixes
|
|
242
|
-
strict: true,
|
|
249
|
+
strict: true, // [!code ++]
|
|
243
250
|
});
|
|
244
251
|
|
|
245
252
|
const query = db.query(`select $message;`);
|
|
@@ -255,10 +262,13 @@ query.all({ message: "Hello world" });
|
|
|
255
262
|
|
|
256
263
|
Use `.all()` to run a query and get back the results as an array of objects.
|
|
257
264
|
|
|
258
|
-
```ts
|
|
265
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
259
266
|
const query = db.query(`select $message;`);
|
|
260
267
|
query.all({ $message: "Hello world" });
|
|
261
|
-
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```txt
|
|
271
|
+
[{ message: "Hello world" }]
|
|
262
272
|
```
|
|
263
273
|
|
|
264
274
|
Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sqlite3_reset) and repeatedly calls [`sqlite3_step`](https://www.sqlite.org/capi3ref.html#sqlite3_step) until it returns `SQLITE_DONE`.
|
|
@@ -267,10 +277,13 @@ Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sq
|
|
|
267
277
|
|
|
268
278
|
Use `.get()` to run a query and get back the first result as an object.
|
|
269
279
|
|
|
270
|
-
```ts
|
|
280
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
271
281
|
const query = db.query(`select $message;`);
|
|
272
282
|
query.get({ $message: "Hello world" });
|
|
273
|
-
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```txt
|
|
286
|
+
{ $message: "Hello world" }
|
|
274
287
|
```
|
|
275
288
|
|
|
276
289
|
Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sqlite3_reset) followed by [`sqlite3_step`](https://www.sqlite.org/capi3ref.html#sqlite3_step) until it no longer returns `SQLITE_ROW`. If the query returns no rows, `undefined` is returned.
|
|
@@ -279,32 +292,27 @@ Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sq
|
|
|
279
292
|
|
|
280
293
|
Use `.run()` to run a query and get back `undefined`. This is useful for schema-modifying queries (e.g. `CREATE TABLE`) or bulk write operations.
|
|
281
294
|
|
|
282
|
-
```ts
|
|
295
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
283
296
|
const query = db.query(`create table foo;`);
|
|
284
297
|
query.run();
|
|
285
|
-
// {
|
|
286
|
-
// lastInsertRowid: 0,
|
|
287
|
-
// changes: 0,
|
|
288
|
-
// }
|
|
289
298
|
```
|
|
290
299
|
|
|
291
|
-
|
|
300
|
+
```txt
|
|
301
|
+
{
|
|
302
|
+
lastInsertRowid: 0,
|
|
303
|
+
changes: 0,
|
|
304
|
+
}
|
|
305
|
+
```
|
|
292
306
|
|
|
293
|
-
|
|
294
|
-
Since Bun v1.1.14, `.run()` returns an object with two properties: `lastInsertRowid` and `changes`.
|
|
295
|
-
{% /callout %}
|
|
307
|
+
Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sqlite3_reset) and calls [`sqlite3_step`](https://www.sqlite.org/capi3ref.html#sqlite3_step) once. Stepping through all the rows is not necessary when you don't care about the results.
|
|
296
308
|
|
|
297
309
|
The `lastInsertRowid` property returns the ID of the last row inserted into the database. The `changes` property is the number of rows affected by the query.
|
|
298
310
|
|
|
299
311
|
### `.as(Class)` - Map query results to a class
|
|
300
312
|
|
|
301
|
-
{% callout %}
|
|
302
|
-
Added in Bun v1.1.14
|
|
303
|
-
{% /callout %}
|
|
304
|
-
|
|
305
313
|
Use `.as(Class)` to run a query and get back the results as instances of a class. This lets you attach methods & getters/setters to results.
|
|
306
314
|
|
|
307
|
-
```ts
|
|
315
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={10}
|
|
308
316
|
class Movie {
|
|
309
317
|
title: string;
|
|
310
318
|
year: number;
|
|
@@ -317,8 +325,14 @@ class Movie {
|
|
|
317
325
|
const query = db.query("SELECT title, year FROM movies").as(Movie);
|
|
318
326
|
const movies = query.all();
|
|
319
327
|
const first = query.get();
|
|
320
|
-
|
|
321
|
-
console.log(
|
|
328
|
+
|
|
329
|
+
console.log(movies[0].isMarvel);
|
|
330
|
+
console.log(first.isMarvel);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
```txt
|
|
334
|
+
true
|
|
335
|
+
true
|
|
322
336
|
```
|
|
323
337
|
|
|
324
338
|
As a performance optimization, the class constructor is not called, default initializers are not run, and private fields are not accessible. This is more like using `Object.create` than `new`. The class's prototype is assigned to the object, methods are attached, and getters/setters are set up, but the constructor is not called.
|
|
@@ -329,7 +343,7 @@ The database columns are set as properties on the class instance.
|
|
|
329
343
|
|
|
330
344
|
Use `.iterate()` to run a query and incrementally return results. This is useful for large result sets that you want to process one row at a time without loading all the results into memory.
|
|
331
345
|
|
|
332
|
-
```ts
|
|
346
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
333
347
|
const query = db.query("SELECT * FROM foo");
|
|
334
348
|
for (const row of query.iterate()) {
|
|
335
349
|
console.log(row);
|
|
@@ -338,7 +352,7 @@ for (const row of query.iterate()) {
|
|
|
338
352
|
|
|
339
353
|
You can also use the `@@iterator` protocol:
|
|
340
354
|
|
|
341
|
-
```ts
|
|
355
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
342
356
|
const query = db.query("SELECT * FROM foo");
|
|
343
357
|
for (const row of query) {
|
|
344
358
|
console.log(row);
|
|
@@ -351,16 +365,19 @@ This feature was added in Bun v1.1.31.
|
|
|
351
365
|
|
|
352
366
|
Use `values()` to run a query and get back all results as an array of arrays.
|
|
353
367
|
|
|
354
|
-
```ts
|
|
368
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3, 4}
|
|
355
369
|
const query = db.query(`select $message;`);
|
|
356
|
-
query.values({ $message: "Hello world" });
|
|
357
370
|
|
|
371
|
+
query.values({ $message: "Hello world" });
|
|
358
372
|
query.values(2);
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
```txt
|
|
376
|
+
[
|
|
377
|
+
[ "Iron Man", 2008 ],
|
|
378
|
+
[ "The Avengers", 2012 ],
|
|
379
|
+
[ "Ant-Man: Quantumania", 2023 ],
|
|
380
|
+
]
|
|
364
381
|
```
|
|
365
382
|
|
|
366
383
|
Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sqlite3_reset) and repeatedly calls [`sqlite3_step`](https://www.sqlite.org/capi3ref.html#sqlite3_step) until it returns `SQLITE_DONE`.
|
|
@@ -369,7 +386,7 @@ Internally, this calls [`sqlite3_reset`](https://www.sqlite.org/capi3ref.html#sq
|
|
|
369
386
|
|
|
370
387
|
Use `.finalize()` to destroy a `Statement` and free any resources associated with it. Once finalized, a `Statement` cannot be executed again. Typically, the garbage collector will do this for you, but explicit finalization may be useful in performance-sensitive applications.
|
|
371
388
|
|
|
372
|
-
```ts
|
|
389
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
373
390
|
const query = db.query("SELECT title, year FROM movies");
|
|
374
391
|
const movies = query.all();
|
|
375
392
|
query.finalize();
|
|
@@ -379,7 +396,7 @@ query.finalize();
|
|
|
379
396
|
|
|
380
397
|
Calling `toString()` on a `Statement` instance prints the expanded SQL query. This is useful for debugging.
|
|
381
398
|
|
|
382
|
-
```ts
|
|
399
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={6, 9, 12}
|
|
383
400
|
import { Database } from "bun:sqlite";
|
|
384
401
|
|
|
385
402
|
// setup
|
|
@@ -400,42 +417,34 @@ Internally, this calls [`sqlite3_expanded_sql`](https://www.sqlite.org/capi3ref.
|
|
|
400
417
|
|
|
401
418
|
Queries can contain parameters. These can be numerical (`?1`) or named (`$param` or `:param` or `@param`). Bind values to these parameters when executing the query:
|
|
402
419
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
```ts#Query
|
|
420
|
+
```ts title="query.ts" icon="/icons/typescript.svg"
|
|
406
421
|
const query = db.query("SELECT * FROM foo WHERE bar = $bar");
|
|
407
422
|
const results = query.all({
|
|
408
423
|
$bar: "bar",
|
|
409
424
|
});
|
|
410
425
|
```
|
|
411
426
|
|
|
412
|
-
```
|
|
413
|
-
[
|
|
414
|
-
{ "$bar": "bar" }
|
|
415
|
-
]
|
|
427
|
+
```txt
|
|
428
|
+
[{ "$bar": "bar" }]
|
|
416
429
|
```
|
|
417
430
|
|
|
418
|
-
{% /codetabs %}
|
|
419
|
-
|
|
420
431
|
Numbered (positional) parameters work too:
|
|
421
432
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
```ts#Query
|
|
433
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
425
434
|
const query = db.query("SELECT ?1, ?2");
|
|
426
435
|
const results = query.all("hello", "goodbye");
|
|
427
436
|
```
|
|
428
437
|
|
|
429
|
-
```
|
|
438
|
+
```txt
|
|
430
439
|
[
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
]
|
|
440
|
+
{
|
|
441
|
+
"?1": "hello",
|
|
442
|
+
"?2": "goodbye",
|
|
443
|
+
},
|
|
444
|
+
];
|
|
436
445
|
```
|
|
437
446
|
|
|
438
|
-
|
|
447
|
+
---
|
|
439
448
|
|
|
440
449
|
## Integers
|
|
441
450
|
|
|
@@ -447,26 +456,25 @@ By default, `bun:sqlite` returns integers as `number` types. If you need to hand
|
|
|
447
456
|
|
|
448
457
|
### `safeIntegers: true`
|
|
449
458
|
|
|
450
|
-
{% callout %}
|
|
451
|
-
Added in Bun v1.1.14
|
|
452
|
-
{% /callout %}
|
|
453
|
-
|
|
454
459
|
When `safeIntegers` is `true`, `bun:sqlite` will return integers as `bigint` types:
|
|
455
460
|
|
|
456
|
-
```ts
|
|
461
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
457
462
|
import { Database } from "bun:sqlite";
|
|
458
463
|
|
|
459
464
|
const db = new Database(":memory:", { safeIntegers: true });
|
|
460
|
-
const query = db.query(
|
|
461
|
-
`SELECT ${BigInt(Number.MAX_SAFE_INTEGER) + 102n} as max_int`,
|
|
462
|
-
);
|
|
465
|
+
const query = db.query(`SELECT ${BigInt(Number.MAX_SAFE_INTEGER) + 102n} as max_int`);
|
|
463
466
|
const result = query.get();
|
|
464
|
-
|
|
467
|
+
|
|
468
|
+
console.log(result.max_int);
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
```txt
|
|
472
|
+
9007199254741093n
|
|
465
473
|
```
|
|
466
474
|
|
|
467
475
|
When `safeIntegers` is `true`, `bun:sqlite` will throw an error if a `bigint` value in a bound parameter exceeds 64 bits:
|
|
468
476
|
|
|
469
|
-
```ts
|
|
477
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
470
478
|
import { Database } from "bun:sqlite";
|
|
471
479
|
|
|
472
480
|
const db = new Database(":memory:", { safeIntegers: true });
|
|
@@ -477,30 +485,38 @@ const query = db.query("INSERT INTO test (value) VALUES ($value)");
|
|
|
477
485
|
try {
|
|
478
486
|
query.run({ $value: BigInt(Number.MAX_SAFE_INTEGER) ** 2n });
|
|
479
487
|
} catch (e) {
|
|
480
|
-
console.log(e.message);
|
|
488
|
+
console.log(e.message);
|
|
481
489
|
}
|
|
482
490
|
```
|
|
483
491
|
|
|
492
|
+
```txt
|
|
493
|
+
BigInt value '81129638414606663681390495662081' is out of range
|
|
494
|
+
```
|
|
495
|
+
|
|
484
496
|
### `safeIntegers: false` (default)
|
|
485
497
|
|
|
486
498
|
When `safeIntegers` is `false`, `bun:sqlite` will return integers as `number` types and truncate any bits beyond 53:
|
|
487
499
|
|
|
488
|
-
```ts
|
|
500
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
489
501
|
import { Database } from "bun:sqlite";
|
|
490
502
|
|
|
491
503
|
const db = new Database(":memory:", { safeIntegers: false });
|
|
492
|
-
const query = db.query(
|
|
493
|
-
`SELECT ${BigInt(Number.MAX_SAFE_INTEGER) + 102n} as max_int`,
|
|
494
|
-
);
|
|
504
|
+
const query = db.query(`SELECT ${BigInt(Number.MAX_SAFE_INTEGER) + 102n} as max_int`);
|
|
495
505
|
const result = query.get();
|
|
496
|
-
console.log(result.max_int);
|
|
506
|
+
console.log(result.max_int);
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
```txt
|
|
510
|
+
9007199254741092
|
|
497
511
|
```
|
|
498
512
|
|
|
513
|
+
---
|
|
514
|
+
|
|
499
515
|
## Transactions
|
|
500
516
|
|
|
501
517
|
Transactions are a mechanism for executing multiple queries in an _atomic_ way; that is, either all of the queries succeed or none of them do. Create a transaction with the `db.transaction()` method:
|
|
502
518
|
|
|
503
|
-
```ts
|
|
519
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={2}
|
|
504
520
|
const insertCat = db.prepare("INSERT INTO cats (name) VALUES ($name)");
|
|
505
521
|
const insertCats = db.transaction(cats => {
|
|
506
522
|
for (const cat of cats) insertCat.run(cat);
|
|
@@ -511,42 +527,32 @@ At this stage, we haven't inserted any cats! The call to `db.transaction()` retu
|
|
|
511
527
|
|
|
512
528
|
To execute the transaction, call this function. All arguments will be passed through to the wrapped function; the return value of the wrapped function will be returned by the transaction function. The wrapped function also has access to the `this` context as defined where the transaction is executed.
|
|
513
529
|
|
|
514
|
-
```ts
|
|
530
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
515
531
|
const insert = db.prepare("INSERT INTO cats (name) VALUES ($name)");
|
|
516
532
|
const insertCats = db.transaction(cats => {
|
|
517
533
|
for (const cat of cats) insert.run(cat);
|
|
518
534
|
return cats.length;
|
|
519
535
|
});
|
|
520
536
|
|
|
521
|
-
const count = insertCats([
|
|
522
|
-
{ $name: "Keanu" },
|
|
523
|
-
{ $name: "Salem" },
|
|
524
|
-
{ $name: "Crookshanks" },
|
|
525
|
-
]);
|
|
537
|
+
const count = insertCats([{ $name: "Keanu" }, { $name: "Salem" }, { $name: "Crookshanks" }]);
|
|
526
538
|
|
|
527
539
|
console.log(`Inserted ${count} cats`);
|
|
528
540
|
```
|
|
529
541
|
|
|
530
542
|
The driver will automatically [`begin`](https://www.sqlite.org/lang_transaction.html) a transaction when `insertCats` is called and `commit` it when the wrapped function returns. If an exception is thrown, the transaction will be rolled back. The exception will propagate as usual; it is not caught.
|
|
531
543
|
|
|
532
|
-
|
|
544
|
+
<Note>
|
|
533
545
|
**Nested transactions** — Transaction functions can be called from inside other transaction functions. When doing so, the inner transaction becomes a [savepoint](https://www.sqlite.org/lang_savepoint.html).
|
|
534
546
|
|
|
535
|
-
|
|
547
|
+
<Accordion title="View nested transaction example">
|
|
536
548
|
|
|
537
|
-
```ts
|
|
549
|
+
```ts db.ts icon="/icons/typescript.svg"
|
|
538
550
|
// setup
|
|
539
551
|
import { Database } from "bun:sqlite";
|
|
540
552
|
const db = Database.open(":memory:");
|
|
541
|
-
db.run(
|
|
542
|
-
|
|
543
|
-
);
|
|
544
|
-
db.run(
|
|
545
|
-
"CREATE TABLE cats (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER)",
|
|
546
|
-
);
|
|
547
|
-
const insertExpense = db.prepare(
|
|
548
|
-
"INSERT INTO expenses (note, dollars) VALUES (?, ?)",
|
|
549
|
-
);
|
|
553
|
+
db.run("CREATE TABLE expenses (id INTEGER PRIMARY KEY AUTOINCREMENT, note TEXT, dollars INTEGER);");
|
|
554
|
+
db.run("CREATE TABLE cats (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER)");
|
|
555
|
+
const insertExpense = db.prepare("INSERT INTO expenses (note, dollars) VALUES (?, ?)");
|
|
550
556
|
const insert = db.prepare("INSERT INTO cats (name, age) VALUES ($name, $age)");
|
|
551
557
|
const insertCats = db.transaction(cats => {
|
|
552
558
|
for (const cat of cats) insert.run(cat);
|
|
@@ -564,8 +570,8 @@ adopt([
|
|
|
564
570
|
]);
|
|
565
571
|
```
|
|
566
572
|
|
|
567
|
-
|
|
568
|
-
|
|
573
|
+
</Accordion>
|
|
574
|
+
</Note>
|
|
569
575
|
|
|
570
576
|
Transactions also come with `deferred`, `immediate`, and `exclusive` versions.
|
|
571
577
|
|
|
@@ -580,24 +586,24 @@ insertCats.exclusive(cats); // uses "BEGIN EXCLUSIVE"
|
|
|
580
586
|
|
|
581
587
|
To load a [SQLite extension](https://www.sqlite.org/loadext.html), call `.loadExtension(name)` on your `Database` instance
|
|
582
588
|
|
|
583
|
-
```ts
|
|
589
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={4}
|
|
584
590
|
import { Database } from "bun:sqlite";
|
|
585
591
|
|
|
586
592
|
const db = new Database();
|
|
587
593
|
db.loadExtension("myext");
|
|
588
594
|
```
|
|
589
595
|
|
|
590
|
-
|
|
596
|
+
<Note>
|
|
591
597
|
**MacOS users** By default, macOS ships with Apple's proprietary build of SQLite, which doesn't support extensions. To use extensions, you'll need to install a vanilla build of SQLite.
|
|
592
598
|
|
|
593
|
-
```bash
|
|
594
|
-
|
|
595
|
-
|
|
599
|
+
```bash terminal icon="terminal"
|
|
600
|
+
brew install sqlite
|
|
601
|
+
which sqlite # get path to binary
|
|
596
602
|
```
|
|
597
603
|
|
|
598
604
|
To point `bun:sqlite` to the new build, call `Database.setCustomSQLite(path)` before creating any `Database` instances. (On other operating systems, this is a no-op.) Pass a path to the SQLite `.dylib` file, _not_ the executable. With recent versions of Homebrew this is something like `/opt/homebrew/Cellar/sqlite/<version>/libsqlite3.dylib`.
|
|
599
605
|
|
|
600
|
-
```ts
|
|
606
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={3}
|
|
601
607
|
import { Database } from "bun:sqlite";
|
|
602
608
|
|
|
603
609
|
Database.setCustomSQLite("/path/to/libsqlite.dylib");
|
|
@@ -606,13 +612,13 @@ const db = new Database();
|
|
|
606
612
|
db.loadExtension("myext");
|
|
607
613
|
```
|
|
608
614
|
|
|
609
|
-
|
|
615
|
+
</Note>
|
|
610
616
|
|
|
611
|
-
###
|
|
617
|
+
### `.fileControl(cmd: number, value: any)`
|
|
612
618
|
|
|
613
619
|
To use the advanced `sqlite3_file_control` API, call `.fileControl(cmd, value)` on your `Database` instance.
|
|
614
620
|
|
|
615
|
-
```ts
|
|
621
|
+
```ts db.ts icon="/icons/typescript.svg" highlight={6}
|
|
616
622
|
import { Database, constants } from "bun:sqlite";
|
|
617
623
|
|
|
618
624
|
const db = new Database();
|
|
@@ -627,9 +633,11 @@ db.fileControl(constants.SQLITE_FCNTL_PERSIST_WAL, 0);
|
|
|
627
633
|
- `TypedArray`
|
|
628
634
|
- `undefined` or `null`
|
|
629
635
|
|
|
636
|
+
---
|
|
637
|
+
|
|
630
638
|
## Reference
|
|
631
639
|
|
|
632
|
-
```ts
|
|
640
|
+
```ts Type Reference icon="/icons/typescript.svg" expandable
|
|
633
641
|
class Database {
|
|
634
642
|
constructor(
|
|
635
643
|
filename: string,
|
|
@@ -643,10 +651,7 @@ class Database {
|
|
|
643
651
|
);
|
|
644
652
|
|
|
645
653
|
query<Params, ReturnType>(sql: string): Statement<Params, ReturnType>;
|
|
646
|
-
run(
|
|
647
|
-
sql: string,
|
|
648
|
-
params?: SQLQueryBindings,
|
|
649
|
-
): { lastInsertRowid: number; changes: number };
|
|
654
|
+
run(sql: string, params?: SQLQueryBindings): { lastInsertRowid: number; changes: number };
|
|
650
655
|
exec = this.run;
|
|
651
656
|
}
|
|
652
657
|
|