bun-types 1.1.37-canary.20241123T140655 → 1.1.37-canary.20241125T140601
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/docs/api/binary-data.md +1028 -0
- package/docs/api/cc.md +197 -0
- package/docs/api/color.md +262 -0
- package/docs/api/console.md +38 -0
- package/docs/api/dns.md +113 -0
- package/docs/api/fetch.md +308 -0
- package/docs/api/ffi.md +536 -0
- package/docs/api/file-io.md +358 -0
- package/docs/api/file-system-router.md +112 -0
- package/docs/api/file.md +19 -0
- package/docs/api/glob.md +157 -0
- package/docs/api/globals.md +387 -0
- package/docs/api/hashing.md +314 -0
- package/docs/api/html-rewriter.md +31 -0
- package/docs/api/http.md +661 -0
- package/docs/api/import-meta.md +69 -0
- package/docs/api/node-api.md +16 -0
- package/docs/api/semver.md +52 -0
- package/docs/api/spawn.md +441 -0
- package/docs/api/sqlite.md +692 -0
- package/docs/api/streams.md +214 -0
- package/docs/api/tcp.md +221 -0
- package/docs/api/test.md +1 -0
- package/docs/api/transpiler.md +274 -0
- package/docs/api/udp.md +125 -0
- package/docs/api/utils.md +773 -0
- package/docs/api/websockets.md +547 -0
- package/docs/api/workers.md +230 -0
- package/docs/benchmarks.md +120 -0
- package/docs/bun-flavored-toml.md +42 -0
- package/docs/bundler/executables.md +291 -0
- package/docs/bundler/index.md +1543 -0
- package/docs/bundler/intro.md +75 -0
- package/docs/bundler/loaders.md +288 -0
- package/docs/bundler/macros.md +327 -0
- package/docs/bundler/plugins.md +30 -0
- package/docs/bundler/vs-esbuild.md +1127 -0
- package/docs/cli/add.md +163 -0
- package/docs/cli/bun-completions.md +3 -0
- package/docs/cli/bun-create.md +254 -0
- package/docs/cli/bun-dev.md +21 -0
- package/docs/cli/bun-install.md +255 -0
- package/docs/cli/bun-upgrade.md +39 -0
- package/docs/cli/bunx.md +80 -0
- package/docs/cli/filter.md +57 -0
- package/docs/cli/init.md +40 -0
- package/docs/cli/install.md +205 -0
- package/docs/cli/link.md +38 -0
- package/docs/cli/outdated.md +61 -0
- package/docs/cli/patch-commit.md +9 -0
- package/docs/cli/pm.md +150 -0
- package/docs/cli/publish.md +107 -0
- package/docs/cli/remove.md +5 -0
- package/docs/cli/run.md +196 -0
- package/docs/cli/test.md +247 -0
- package/docs/cli/unlink.md +7 -0
- package/docs/cli/update.md +34 -0
- package/docs/contributing/upgrading-webkit.md +57 -0
- package/docs/ecosystem/elysia.md +24 -0
- package/docs/ecosystem/express.md +37 -0
- package/docs/ecosystem/hono.md +18 -0
- package/docs/ecosystem/react.md +65 -0
- package/docs/ecosystem/stric.md +37 -0
- package/docs/guides/binary/arraybuffer-to-array.md +27 -0
- package/docs/guides/binary/arraybuffer-to-blob.md +24 -0
- package/docs/guides/binary/arraybuffer-to-buffer.md +25 -0
- package/docs/guides/binary/arraybuffer-to-string.md +15 -0
- package/docs/guides/binary/arraybuffer-to-typedarray.md +39 -0
- package/docs/guides/binary/blob-to-arraybuffer.md +14 -0
- package/docs/guides/binary/blob-to-dataview.md +14 -0
- package/docs/guides/binary/blob-to-stream.md +14 -0
- package/docs/guides/binary/blob-to-string.md +15 -0
- package/docs/guides/binary/blob-to-typedarray.md +14 -0
- package/docs/guides/binary/buffer-to-arraybuffer.md +14 -0
- package/docs/guides/binary/buffer-to-blob.md +14 -0
- package/docs/guides/binary/buffer-to-readablestream.md +41 -0
- package/docs/guides/binary/buffer-to-string.md +25 -0
- package/docs/guides/binary/buffer-to-typedarray.md +14 -0
- package/docs/guides/binary/dataview-to-string.md +15 -0
- package/docs/guides/binary/typedarray-to-arraybuffer.md +25 -0
- package/docs/guides/binary/typedarray-to-blob.md +16 -0
- package/docs/guides/binary/typedarray-to-buffer.md +14 -0
- package/docs/guides/binary/typedarray-to-dataview.md +14 -0
- package/docs/guides/binary/typedarray-to-readablestream.md +41 -0
- package/docs/guides/binary/typedarray-to-string.md +16 -0
- package/docs/guides/ecosystem/astro.md +72 -0
- package/docs/guides/ecosystem/discordjs.md +77 -0
- package/docs/guides/ecosystem/docker.md +140 -0
- package/docs/guides/ecosystem/drizzle.md +185 -0
- package/docs/guides/ecosystem/edgedb.md +228 -0
- package/docs/guides/ecosystem/elysia.md +31 -0
- package/docs/guides/ecosystem/express.md +40 -0
- package/docs/guides/ecosystem/hono.md +39 -0
- package/docs/guides/ecosystem/mongoose.md +87 -0
- package/docs/guides/ecosystem/neon-drizzle.md +220 -0
- package/docs/guides/ecosystem/neon-serverless-postgres.md +55 -0
- package/docs/guides/ecosystem/nextjs.md +38 -0
- package/docs/guides/ecosystem/nuxt.md +56 -0
- package/docs/guides/ecosystem/pm2.md +57 -0
- package/docs/guides/ecosystem/prisma.md +140 -0
- package/docs/guides/ecosystem/qwik.md +107 -0
- package/docs/guides/ecosystem/react.md +49 -0
- package/docs/guides/ecosystem/remix.md +78 -0
- package/docs/guides/ecosystem/render.md +79 -0
- package/docs/guides/ecosystem/sentry.md +52 -0
- package/docs/guides/ecosystem/solidstart.md +58 -0
- package/docs/guides/ecosystem/ssr-react.md +51 -0
- package/docs/guides/ecosystem/stric.md +55 -0
- package/docs/guides/ecosystem/sveltekit.md +125 -0
- package/docs/guides/ecosystem/systemd.md +113 -0
- package/docs/guides/ecosystem/vite.md +70 -0
- package/docs/guides/http/cluster.md +66 -0
- package/docs/guides/http/fetch-unix.md +33 -0
- package/docs/guides/http/fetch.md +24 -0
- package/docs/guides/http/file-uploads.md +94 -0
- package/docs/guides/http/hot.md +22 -0
- package/docs/guides/http/proxy.md +24 -0
- package/docs/guides/http/server.md +46 -0
- package/docs/guides/http/simple.md +18 -0
- package/docs/guides/http/stream-file.md +48 -0
- package/docs/guides/http/stream-iterator.md +47 -0
- package/docs/guides/http/stream-node-streams-in-bun.md +20 -0
- package/docs/guides/http/tls.md +30 -0
- package/docs/guides/install/add-dev.md +26 -0
- package/docs/guides/install/add-git.md +36 -0
- package/docs/guides/install/add-optional.md +25 -0
- package/docs/guides/install/add-peer.md +17 -0
- package/docs/guides/install/add-tarball.md +33 -0
- package/docs/guides/install/add.md +42 -0
- package/docs/guides/install/azure-artifacts.md +73 -0
- package/docs/guides/install/cicd.md +41 -0
- package/docs/guides/install/custom-registry.md +30 -0
- package/docs/guides/install/from-npm-install-to-bun-install.md +214 -0
- package/docs/guides/install/git-diff-bun-lockfile.md +38 -0
- package/docs/guides/install/jfrog-artifactory.md +28 -0
- package/docs/guides/install/npm-alias.md +23 -0
- package/docs/guides/install/registry-scope.md +36 -0
- package/docs/guides/install/trusted.md +48 -0
- package/docs/guides/install/workspaces.md +70 -0
- package/docs/guides/install/yarnlock.md +42 -0
- package/docs/guides/process/argv.md +57 -0
- package/docs/guides/process/ctrl-c.md +16 -0
- package/docs/guides/process/ipc.md +66 -0
- package/docs/guides/process/nanoseconds.md +13 -0
- package/docs/guides/process/os-signals.md +39 -0
- package/docs/guides/process/spawn-stderr.md +31 -0
- package/docs/guides/process/spawn-stdout.md +26 -0
- package/docs/guides/process/spawn.md +41 -0
- package/docs/guides/process/stdin.md +54 -0
- package/docs/guides/read-file/arraybuffer.md +28 -0
- package/docs/guides/read-file/buffer.md +19 -0
- package/docs/guides/read-file/exists.md +16 -0
- package/docs/guides/read-file/json.md +17 -0
- package/docs/guides/read-file/mime.md +20 -0
- package/docs/guides/read-file/stream.md +26 -0
- package/docs/guides/read-file/string.md +22 -0
- package/docs/guides/read-file/uint8array.md +21 -0
- package/docs/guides/read-file/watch.md +68 -0
- package/docs/guides/runtime/cicd.md +43 -0
- package/docs/guides/runtime/define-constant.md +145 -0
- package/docs/guides/runtime/import-html.md +15 -0
- package/docs/guides/runtime/import-json.md +44 -0
- package/docs/guides/runtime/import-toml.md +30 -0
- package/docs/guides/runtime/read-env.md +32 -0
- package/docs/guides/runtime/set-env.md +37 -0
- package/docs/guides/runtime/shell.md +40 -0
- package/docs/guides/runtime/timezone.md +35 -0
- package/docs/guides/runtime/tsconfig-paths.md +29 -0
- package/docs/guides/runtime/typescript.md +47 -0
- package/docs/guides/runtime/vscode-debugger.md +47 -0
- package/docs/guides/runtime/web-debugger.md +82 -0
- package/docs/guides/streams/node-readable-to-arraybuffer.md +11 -0
- package/docs/guides/streams/node-readable-to-blob.md +11 -0
- package/docs/guides/streams/node-readable-to-json.md +12 -0
- package/docs/guides/streams/node-readable-to-string.md +12 -0
- package/docs/guides/streams/node-readable-to-uint8array.md +11 -0
- package/docs/guides/streams/to-array.md +14 -0
- package/docs/guides/streams/to-arraybuffer.md +14 -0
- package/docs/guides/streams/to-blob.md +14 -0
- package/docs/guides/streams/to-buffer.md +15 -0
- package/docs/guides/streams/to-json.md +14 -0
- package/docs/guides/streams/to-string.md +14 -0
- package/docs/guides/streams/to-typedarray.md +22 -0
- package/docs/guides/test/bail.md +22 -0
- package/docs/guides/test/coverage-threshold.md +60 -0
- package/docs/guides/test/coverage.md +44 -0
- package/docs/guides/test/happy-dom.md +68 -0
- package/docs/guides/test/migrate-from-jest.md +110 -0
- package/docs/guides/test/mock-clock.md +48 -0
- package/docs/guides/test/mock-functions.md +68 -0
- package/docs/guides/test/rerun-each.md +14 -0
- package/docs/guides/test/run-tests.md +111 -0
- package/docs/guides/test/skip-tests.md +39 -0
- package/docs/guides/test/snapshot.md +99 -0
- package/docs/guides/test/spy-on.md +46 -0
- package/docs/guides/test/testing-library.md +87 -0
- package/docs/guides/test/timeout.md +15 -0
- package/docs/guides/test/todo-tests.md +67 -0
- package/docs/guides/test/update-snapshots.md +50 -0
- package/docs/guides/test/watch-mode.md +19 -0
- package/docs/guides/util/base64.md +15 -0
- package/docs/guides/util/deep-equals.md +39 -0
- package/docs/guides/util/deflate.md +18 -0
- package/docs/guides/util/detect-bun.md +23 -0
- package/docs/guides/util/entrypoint.md +17 -0
- package/docs/guides/util/escape-html.md +22 -0
- package/docs/guides/util/file-url-to-path.md +14 -0
- package/docs/guides/util/gzip.md +18 -0
- package/docs/guides/util/hash-a-password.md +54 -0
- package/docs/guides/util/import-meta-dir.md +13 -0
- package/docs/guides/util/import-meta-file.md +13 -0
- package/docs/guides/util/import-meta-path.md +13 -0
- package/docs/guides/util/main.md +32 -0
- package/docs/guides/util/path-to-file-url.md +14 -0
- package/docs/guides/util/sleep.md +22 -0
- package/docs/guides/util/version.md +21 -0
- package/docs/guides/util/which-path-to-executable-bin.md +15 -0
- package/docs/guides/websocket/compression.md +31 -0
- package/docs/guides/websocket/context.md +72 -0
- package/docs/guides/websocket/pubsub.md +38 -0
- package/docs/guides/websocket/simple.md +33 -0
- package/docs/guides/write-file/append.md +52 -0
- package/docs/guides/write-file/basic.md +44 -0
- package/docs/guides/write-file/blob.md +28 -0
- package/docs/guides/write-file/cat.md +17 -0
- package/docs/guides/write-file/file-cp.md +16 -0
- package/docs/guides/write-file/filesink.md +52 -0
- package/docs/guides/write-file/response.md +17 -0
- package/docs/guides/write-file/stdout.md +21 -0
- package/docs/guides/write-file/stream.md +17 -0
- package/docs/guides/write-file/unlink.md +23 -0
- package/docs/index.md +77 -0
- package/docs/install/cache.md +57 -0
- package/docs/install/index.md +202 -0
- package/docs/install/lifecycle.md +46 -0
- package/docs/install/lockfile.md +90 -0
- package/docs/install/npmrc.md +75 -0
- package/docs/install/overrides.md +73 -0
- package/docs/install/patch.md +57 -0
- package/docs/install/registries.md +30 -0
- package/docs/install/workspaces.md +70 -0
- package/docs/installation.md +289 -0
- package/docs/project/benchmarking.md +203 -0
- package/docs/project/building-windows.md +162 -0
- package/docs/project/internals/build-process-for-ci.md +75 -0
- package/docs/project/roadmap.md +87 -0
- package/docs/quickstart.md +144 -0
- package/docs/runtime/autoimport.md +94 -0
- package/docs/runtime/bun-apis.md +129 -0
- package/docs/runtime/bunfig.md +532 -0
- package/docs/runtime/debugger.md +325 -0
- package/docs/runtime/env.md +214 -0
- package/docs/runtime/hot.md +139 -0
- package/docs/runtime/index.md +309 -0
- package/docs/runtime/jsx.md +326 -0
- package/docs/runtime/loaders.md +127 -0
- package/docs/runtime/modules.md +298 -0
- package/docs/runtime/nodejs-apis.md +456 -0
- package/docs/runtime/plugins.md +605 -0
- package/docs/runtime/shell.md +537 -0
- package/docs/runtime/typescript.md +60 -0
- package/docs/runtime/web-apis.md +128 -0
- package/docs/test/coverage.md +91 -0
- package/docs/test/dom.md +75 -0
- package/docs/test/hot.md +15 -0
- package/docs/test/lifecycle.md +81 -0
- package/docs/test/mocks.md +236 -0
- package/docs/test/snapshots.md +15 -0
- package/docs/test/time.md +106 -0
- package/docs/test/writing.md +547 -0
- package/docs/typescript.md +51 -0
- package/package.json +5 -4
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
Streams are an important abstraction for working with binary data without loading it all into memory at once. They are commonly used for reading and writing files, sending and receiving network requests, and processing large amounts of data.
|
|
2
|
+
|
|
3
|
+
Bun implements the Web APIs [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) and [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream).
|
|
4
|
+
|
|
5
|
+
{% callout %}
|
|
6
|
+
Bun also implements the `node:stream` module, including [`Readable`](https://nodejs.org/api/stream.html#stream_readable_streams), [`Writable`](https://nodejs.org/api/stream.html#stream_writable_streams), and [`Duplex`](https://nodejs.org/api/stream.html#stream_duplex_and_transform_streams). For complete documentation, refer to the [Node.js docs](https://nodejs.org/api/stream.html).
|
|
7
|
+
{% /callout %}
|
|
8
|
+
|
|
9
|
+
To create a simple `ReadableStream`:
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
const stream = new ReadableStream({
|
|
13
|
+
start(controller) {
|
|
14
|
+
controller.enqueue("hello");
|
|
15
|
+
controller.enqueue("world");
|
|
16
|
+
controller.close();
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The contents of a `ReadableStream` can be read chunk-by-chunk with `for await` syntax.
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
for await (const chunk of stream) {
|
|
25
|
+
console.log(chunk);
|
|
26
|
+
// => "hello"
|
|
27
|
+
// => "world"
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Direct `ReadableStream`
|
|
32
|
+
|
|
33
|
+
Bun implements an optimized version of `ReadableStream` that avoid unnecessary data copying & queue management logic. With a traditional `ReadableStream`, chunks of data are _enqueued_. Each chunk is copied into a queue, where it sits until the stream is ready to send more data.
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
const stream = new ReadableStream({
|
|
37
|
+
start(controller) {
|
|
38
|
+
controller.enqueue("hello");
|
|
39
|
+
controller.enqueue("world");
|
|
40
|
+
controller.close();
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
With a direct `ReadableStream`, chunks of data are written directly to the stream. No queueing happens, and there's no need to clone the chunk data into memory. The `controller` API is updated to reflect this; instead of `.enqueue()` you call `.write`.
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
const stream = new ReadableStream({
|
|
49
|
+
type: "direct",
|
|
50
|
+
pull(controller) {
|
|
51
|
+
controller.write("hello");
|
|
52
|
+
controller.write("world");
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
When using a direct `ReadableStream`, all chunk queueing is handled by the destination. The consumer of the stream receives exactly what is passed to `controller.write()`, without any encoding or modification.
|
|
58
|
+
|
|
59
|
+
## Async generator streams
|
|
60
|
+
|
|
61
|
+
Bun also supports async generator functions as a source for `Response` and `Request`. This is an easy way to create a `ReadableStream` that fetches data from an asynchronous source.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
const response = new Response(async function* () {
|
|
65
|
+
yield "hello";
|
|
66
|
+
yield "world";
|
|
67
|
+
}());
|
|
68
|
+
|
|
69
|
+
await response.text(); // "helloworld"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
You can also use `[Symbol.asyncIterator]` directly.
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
const response = new Response({
|
|
76
|
+
[Symbol.asyncIterator]: async function* () {
|
|
77
|
+
yield "hello";
|
|
78
|
+
yield "world";
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await response.text(); // "helloworld"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
If you need more granular control over the stream, `yield` will return the direct ReadableStream controller.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
const response = new Response({
|
|
89
|
+
[Symbol.asyncIterator]: async function* () {
|
|
90
|
+
const controller = yield "hello";
|
|
91
|
+
await controller.end();
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
await response.text(); // "hello"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## `Bun.ArrayBufferSink`
|
|
99
|
+
|
|
100
|
+
The `Bun.ArrayBufferSink` class is a fast incremental writer for constructing an `ArrayBuffer` of unknown size.
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
const sink = new Bun.ArrayBufferSink();
|
|
104
|
+
|
|
105
|
+
sink.write("h");
|
|
106
|
+
sink.write("e");
|
|
107
|
+
sink.write("l");
|
|
108
|
+
sink.write("l");
|
|
109
|
+
sink.write("o");
|
|
110
|
+
|
|
111
|
+
sink.end();
|
|
112
|
+
// ArrayBuffer(5) [ 104, 101, 108, 108, 111 ]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
To instead retrieve the data as a `Uint8Array`, pass the `asUint8Array` option to the `start` method.
|
|
116
|
+
|
|
117
|
+
```ts-diff
|
|
118
|
+
const sink = new Bun.ArrayBufferSink();
|
|
119
|
+
sink.start({
|
|
120
|
+
+ asUint8Array: true
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
sink.write("h");
|
|
124
|
+
sink.write("e");
|
|
125
|
+
sink.write("l");
|
|
126
|
+
sink.write("l");
|
|
127
|
+
sink.write("o");
|
|
128
|
+
|
|
129
|
+
sink.end();
|
|
130
|
+
// Uint8Array(5) [ 104, 101, 108, 108, 111 ]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The `.write()` method supports strings, typed arrays, `ArrayBuffer`, and `SharedArrayBuffer`.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
sink.write("h");
|
|
137
|
+
sink.write(new Uint8Array([101, 108]));
|
|
138
|
+
sink.write(Buffer.from("lo").buffer);
|
|
139
|
+
|
|
140
|
+
sink.end();
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Once `.end()` is called, no more data can be written to the `ArrayBufferSink`. However, in the context of buffering a stream, it's useful to continuously write data and periodically `.flush()` the contents (say, into a `WriteableStream`). To support this, pass `stream: true` to the constructor.
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
const sink = new Bun.ArrayBufferSink();
|
|
147
|
+
sink.start({
|
|
148
|
+
stream: true,
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
sink.write("h");
|
|
152
|
+
sink.write("e");
|
|
153
|
+
sink.write("l");
|
|
154
|
+
sink.flush();
|
|
155
|
+
// ArrayBuffer(5) [ 104, 101, 108 ]
|
|
156
|
+
|
|
157
|
+
sink.write("l");
|
|
158
|
+
sink.write("o");
|
|
159
|
+
sink.flush();
|
|
160
|
+
// ArrayBuffer(5) [ 108, 111 ]
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The `.flush()` method returns the buffered data as an `ArrayBuffer` (or `Uint8Array` if `asUint8Array: true`) and clears internal buffer.
|
|
164
|
+
|
|
165
|
+
To manually set the size of the internal buffer in bytes, pass a value for `highWaterMark`:
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
const sink = new Bun.ArrayBufferSink();
|
|
169
|
+
sink.start({
|
|
170
|
+
highWaterMark: 1024 * 1024, // 1 MB
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
{% details summary="Reference" %}
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
/**
|
|
178
|
+
* Fast incremental writer that becomes an `ArrayBuffer` on end().
|
|
179
|
+
*/
|
|
180
|
+
export class ArrayBufferSink {
|
|
181
|
+
constructor();
|
|
182
|
+
|
|
183
|
+
start(options?: {
|
|
184
|
+
asUint8Array?: boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Preallocate an internal buffer of this size
|
|
187
|
+
* This can significantly improve performance when the chunk size is small
|
|
188
|
+
*/
|
|
189
|
+
highWaterMark?: number;
|
|
190
|
+
/**
|
|
191
|
+
* On {@link ArrayBufferSink.flush}, return the written data as a `Uint8Array`.
|
|
192
|
+
* Writes will restart from the beginning of the buffer.
|
|
193
|
+
*/
|
|
194
|
+
stream?: boolean;
|
|
195
|
+
}): void;
|
|
196
|
+
|
|
197
|
+
write(
|
|
198
|
+
chunk: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer,
|
|
199
|
+
): number;
|
|
200
|
+
/**
|
|
201
|
+
* Flush the internal buffer
|
|
202
|
+
*
|
|
203
|
+
* If {@link ArrayBufferSink.start} was passed a `stream` option, this will return a `ArrayBuffer`
|
|
204
|
+
* If {@link ArrayBufferSink.start} was passed a `stream` option and `asUint8Array`, this will return a `Uint8Array`
|
|
205
|
+
* Otherwise, this will return the number of bytes written since the last flush
|
|
206
|
+
*
|
|
207
|
+
* This API might change later to separate Uint8ArraySink and ArrayBufferSink
|
|
208
|
+
*/
|
|
209
|
+
flush(): number | Uint8Array | ArrayBuffer;
|
|
210
|
+
end(): ArrayBuffer | Uint8Array;
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
{% /details %}
|
package/docs/api/tcp.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
Use Bun's native TCP API to implement performance sensitive systems like database clients, game servers, or anything that needs to communicate over TCP (instead of HTTP). This is a low-level API intended for library authors and for advanced use cases.
|
|
2
|
+
|
|
3
|
+
## Start a server (`Bun.listen()`)
|
|
4
|
+
|
|
5
|
+
To start a TCP server with `Bun.listen`:
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
Bun.listen({
|
|
9
|
+
hostname: "localhost",
|
|
10
|
+
port: 8080,
|
|
11
|
+
socket: {
|
|
12
|
+
data(socket, data) {}, // message received from client
|
|
13
|
+
open(socket) {}, // socket opened
|
|
14
|
+
close(socket) {}, // socket closed
|
|
15
|
+
drain(socket) {}, // socket ready for more data
|
|
16
|
+
error(socket, error) {}, // error handler
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
{% details summary="An API designed for speed" %}
|
|
22
|
+
|
|
23
|
+
In Bun, a set of handlers are declared once per server instead of assigning callbacks to each socket, as with Node.js `EventEmitters` or the web-standard `WebSocket` API.
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
Bun.listen({
|
|
27
|
+
hostname: "localhost",
|
|
28
|
+
port: 8080,
|
|
29
|
+
socket: {
|
|
30
|
+
open(socket) {},
|
|
31
|
+
data(socket, data) {},
|
|
32
|
+
drain(socket) {},
|
|
33
|
+
close(socket) {},
|
|
34
|
+
error(socket, error) {},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For performance-sensitive servers, assigning listeners to each socket can cause significant garbage collector pressure and increase memory usage. By contrast, Bun only allocates one handler function for each event and shares it among all sockets. This is a small optimization, but it adds up.
|
|
40
|
+
|
|
41
|
+
{% /details %}
|
|
42
|
+
|
|
43
|
+
Contextual data can be attached to a socket in the `open` handler.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
type SocketData = { sessionId: string };
|
|
47
|
+
|
|
48
|
+
Bun.listen<SocketData>({
|
|
49
|
+
hostname: "localhost",
|
|
50
|
+
port: 8080,
|
|
51
|
+
socket: {
|
|
52
|
+
data(socket, data) {
|
|
53
|
+
socket.write(`${socket.data.sessionId}: ack`);
|
|
54
|
+
},
|
|
55
|
+
open(socket) {
|
|
56
|
+
socket.data = { sessionId: "abcd" };
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
To enable TLS, pass a `tls` object containing `key` and `cert` fields.
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
Bun.listen({
|
|
66
|
+
hostname: "localhost",
|
|
67
|
+
port: 8080,
|
|
68
|
+
socket: {
|
|
69
|
+
data(socket, data) {},
|
|
70
|
+
},
|
|
71
|
+
tls: {
|
|
72
|
+
// can be string, BunFile, TypedArray, Buffer, or array thereof
|
|
73
|
+
key: Bun.file("./key.pem"),
|
|
74
|
+
cert: Bun.file("./cert.pem"),
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The `key` and `cert` fields expect the _contents_ of your TLS key and certificate. This can be a string, `BunFile`, `TypedArray`, or `Buffer`.
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
Bun.listen({
|
|
83
|
+
// ...
|
|
84
|
+
tls: {
|
|
85
|
+
// BunFile
|
|
86
|
+
key: Bun.file("./key.pem"),
|
|
87
|
+
// Buffer
|
|
88
|
+
key: fs.readFileSync("./key.pem"),
|
|
89
|
+
// string
|
|
90
|
+
key: fs.readFileSync("./key.pem", "utf8"),
|
|
91
|
+
// array of above
|
|
92
|
+
key: [Bun.file("./key1.pem"), Bun.file("./key2.pem")],
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The result of `Bun.listen` is a server that conforms to the `TCPSocket` interface.
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
const server = Bun.listen({
|
|
101
|
+
/* config*/
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// stop listening
|
|
105
|
+
// parameter determines whether active connections are closed
|
|
106
|
+
server.stop(true);
|
|
107
|
+
|
|
108
|
+
// let Bun process exit even if server is still listening
|
|
109
|
+
server.unref();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Create a connection (`Bun.connect()`)
|
|
113
|
+
|
|
114
|
+
Use `Bun.connect` to connect to a TCP server. Specify the server to connect to with `hostname` and `port`. TCP clients can define the same set of handlers as `Bun.listen`, plus a couple client-specific handlers.
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
// The client
|
|
118
|
+
const socket = await Bun.connect({
|
|
119
|
+
hostname: "localhost",
|
|
120
|
+
port: 8080,
|
|
121
|
+
|
|
122
|
+
socket: {
|
|
123
|
+
data(socket, data) {},
|
|
124
|
+
open(socket) {},
|
|
125
|
+
close(socket) {},
|
|
126
|
+
drain(socket) {},
|
|
127
|
+
error(socket, error) {},
|
|
128
|
+
|
|
129
|
+
// client-specific handlers
|
|
130
|
+
connectError(socket, error) {}, // connection failed
|
|
131
|
+
end(socket) {}, // connection closed by server
|
|
132
|
+
timeout(socket) {}, // connection timed out
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
To require TLS, specify `tls: true`.
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
// The client
|
|
141
|
+
const socket = await Bun.connect({
|
|
142
|
+
// ... config
|
|
143
|
+
tls: true,
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Hot reloading
|
|
148
|
+
|
|
149
|
+
Both TCP servers and sockets can be hot reloaded with new handlers.
|
|
150
|
+
|
|
151
|
+
{% codetabs %}
|
|
152
|
+
|
|
153
|
+
```ts#Server
|
|
154
|
+
const server = Bun.listen({ /* config */ })
|
|
155
|
+
|
|
156
|
+
// reloads handlers for all active server-side sockets
|
|
157
|
+
server.reload({
|
|
158
|
+
socket: {
|
|
159
|
+
data(){
|
|
160
|
+
// new 'data' handler
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
```ts#Client
|
|
167
|
+
const socket = await Bun.connect({ /* config */ })
|
|
168
|
+
socket.reload({
|
|
169
|
+
data(){
|
|
170
|
+
// new 'data' handler
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
{% /codetabs %}
|
|
176
|
+
|
|
177
|
+
## Buffering
|
|
178
|
+
|
|
179
|
+
Currently, TCP sockets in Bun do not buffer data. For performance-sensitive code, it's important to consider buffering carefully. For example, this:
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
socket.write("h");
|
|
183
|
+
socket.write("e");
|
|
184
|
+
socket.write("l");
|
|
185
|
+
socket.write("l");
|
|
186
|
+
socket.write("o");
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
...performs significantly worse than this:
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
socket.write("hello");
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
To simplify this for now, consider using Bun's `ArrayBufferSink` with the `{stream: true}` option:
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
import { ArrayBufferSink } from "bun";
|
|
199
|
+
|
|
200
|
+
const sink = new ArrayBufferSink();
|
|
201
|
+
sink.start({ stream: true, highWaterMark: 1024 });
|
|
202
|
+
|
|
203
|
+
sink.write("h");
|
|
204
|
+
sink.write("e");
|
|
205
|
+
sink.write("l");
|
|
206
|
+
sink.write("l");
|
|
207
|
+
sink.write("o");
|
|
208
|
+
|
|
209
|
+
queueMicrotask(() => {
|
|
210
|
+
const data = sink.flush();
|
|
211
|
+
const wrote = socket.write(data);
|
|
212
|
+
if (wrote < data.byteLength) {
|
|
213
|
+
// put it back in the sink if the socket is full
|
|
214
|
+
sink.write(data.subarray(wrote));
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
{% callout %}
|
|
220
|
+
**Corking** — Support for corking is planned, but in the meantime backpressure must be managed manually with the `drain` handler.
|
|
221
|
+
{% /callout %}
|
package/docs/api/test.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
See the [`bun test`](https://bun.sh/docs/cli/test) documentation.
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
Bun exposes its internal transpiler via the `Bun.Transpiler` class. To create an instance of Bun's transpiler:
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
const transpiler = new Bun.Transpiler({
|
|
5
|
+
loader: "tsx", // "js | "jsx" | "ts" | "tsx"
|
|
6
|
+
});
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## `.transformSync()`
|
|
10
|
+
|
|
11
|
+
Transpile code synchronously with the `.transformSync()` method. Modules are not resolved and the code is not executed. The result is a string of vanilla JavaScript code.
|
|
12
|
+
|
|
13
|
+
<!-- It is synchronous and runs in the same thread as other JavaScript code. -->
|
|
14
|
+
|
|
15
|
+
{% codetabs %}
|
|
16
|
+
|
|
17
|
+
```js#Example
|
|
18
|
+
const transpiler = new Bun.Transpiler({
|
|
19
|
+
loader: 'tsx',
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const code = `
|
|
23
|
+
import * as whatever from "./whatever.ts"
|
|
24
|
+
export function Home(props: {title: string}){
|
|
25
|
+
return <p>{props.title}</p>;
|
|
26
|
+
}`;
|
|
27
|
+
|
|
28
|
+
const result = transpiler.transformSync(code);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```js#Result
|
|
32
|
+
import { __require as require } from "bun:wrap";
|
|
33
|
+
import * as JSX from "react/jsx-dev-runtime";
|
|
34
|
+
var jsx = require(JSX).jsxDEV;
|
|
35
|
+
|
|
36
|
+
export default jsx(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
children: "hi!",
|
|
40
|
+
},
|
|
41
|
+
undefined,
|
|
42
|
+
false,
|
|
43
|
+
undefined,
|
|
44
|
+
this,
|
|
45
|
+
);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
{% /codetabs %}
|
|
49
|
+
|
|
50
|
+
To override the default loader specified in the `new Bun.Transpiler()` constructor, pass a second argument to `.transformSync()`.
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
transpiler.transformSync("<div>hi!</div>", "tsx");
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
{% details summary="Nitty gritty" %}
|
|
57
|
+
When `.transformSync` is called, the transpiler is run in the same thread as the currently executed code.
|
|
58
|
+
|
|
59
|
+
If a macro is used, it will be run in the same thread as the transpiler, but in a separate event loop from the rest of your application. Currently, globals between macros and regular code are shared, which means it is possible (but not recommended) to share states between macros and regular code. Attempting to use AST nodes outside of a macro is undefined behavior.
|
|
60
|
+
{% /details %}
|
|
61
|
+
|
|
62
|
+
## `.transform()`
|
|
63
|
+
|
|
64
|
+
The `transform()` method is an async version of `.transformSync()` that returns a `Promise<string>`.
|
|
65
|
+
|
|
66
|
+
```js
|
|
67
|
+
const transpiler = new Bun.Transpiler({ loader: "jsx" });
|
|
68
|
+
const result = await transpiler.transform("<div>hi!</div>");
|
|
69
|
+
console.log(result);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Unless you're transpiling _many_ large files, you should probably use `Bun.Transpiler.transformSync`. The cost of the threadpool will often take longer than actually transpiling code.
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
await transpiler.transform("<div>hi!</div>", "tsx");
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
{% details summary="Nitty gritty" %}
|
|
79
|
+
The `.transform()` method runs the transpiler in Bun's worker threadpool, so if you run it 100 times, it will run it across `Math.floor($cpu_count * 0.8)` threads, without blocking the main JavaScript thread.
|
|
80
|
+
|
|
81
|
+
If your code uses a macro, it will potentially spawn a new copy of Bun's JavaScript runtime environment in that new thread.
|
|
82
|
+
{% /details %}
|
|
83
|
+
|
|
84
|
+
## `.scan()`
|
|
85
|
+
|
|
86
|
+
The `Transpiler` instance can also scan some source code and return a list of its imports and exports, plus additional metadata about each one. [Type-only](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export) imports and exports are ignored.
|
|
87
|
+
|
|
88
|
+
{% codetabs %}
|
|
89
|
+
|
|
90
|
+
```ts#Example
|
|
91
|
+
const transpiler = new Bun.Transpiler({
|
|
92
|
+
loader: 'tsx',
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const code = `
|
|
96
|
+
import React from 'react';
|
|
97
|
+
import type {ReactNode} from 'react';
|
|
98
|
+
const val = require('./cjs.js')
|
|
99
|
+
import('./loader');
|
|
100
|
+
|
|
101
|
+
export const name = "hello";
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
const result = transpiler.scan(code);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```json#Output
|
|
108
|
+
{
|
|
109
|
+
"exports": [
|
|
110
|
+
"name"
|
|
111
|
+
],
|
|
112
|
+
"imports": [
|
|
113
|
+
{
|
|
114
|
+
"kind": "import-statement",
|
|
115
|
+
"path": "react"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"kind": "import-statement",
|
|
119
|
+
"path": "remix"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"kind": "dynamic-import",
|
|
123
|
+
"path": "./loader"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
{% /codetabs %}
|
|
130
|
+
|
|
131
|
+
Each import in the `imports` array has a `path` and `kind`. Bun categories imports into the following kinds:
|
|
132
|
+
|
|
133
|
+
- `import-statement`: `import React from 'react'`
|
|
134
|
+
- `require-call`: `const val = require('./cjs.js')`
|
|
135
|
+
- `require-resolve`: `require.resolve('./cjs.js')`
|
|
136
|
+
- `dynamic-import`: `import('./loader')`
|
|
137
|
+
- `import-rule`: `@import 'foo.css'`
|
|
138
|
+
- `url-token`: `url('./foo.png')`
|
|
139
|
+
<!-- - `internal`: `import {foo} from 'bun:internal'`
|
|
140
|
+
- `entry-point`: `import {foo} from 'bun:entry'` -->
|
|
141
|
+
|
|
142
|
+
## `.scanImports()`
|
|
143
|
+
|
|
144
|
+
For performance-sensitive code, you can use the `.scanImports()` method to get a list of imports. It's faster than `.scan()` (especially for large files) but marginally less accurate due to some performance optimizations.
|
|
145
|
+
|
|
146
|
+
{% codetabs %}
|
|
147
|
+
|
|
148
|
+
```ts#Example
|
|
149
|
+
const transpiler = new Bun.Transpiler({
|
|
150
|
+
loader: 'tsx',
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const code = `
|
|
154
|
+
import React from 'react';
|
|
155
|
+
import type {ReactNode} from 'react';
|
|
156
|
+
const val = require('./cjs.js')
|
|
157
|
+
import('./loader');
|
|
158
|
+
|
|
159
|
+
export const name = "hello";
|
|
160
|
+
`;
|
|
161
|
+
|
|
162
|
+
const result = transpiler.scanImports(code);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```json#Results
|
|
166
|
+
[
|
|
167
|
+
{
|
|
168
|
+
kind: "import-statement",
|
|
169
|
+
path: "react"
|
|
170
|
+
}, {
|
|
171
|
+
kind: "require-call",
|
|
172
|
+
path: "./cjs.js"
|
|
173
|
+
}, {
|
|
174
|
+
kind: "dynamic-import",
|
|
175
|
+
path: "./loader"
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
{% /codetabs %}
|
|
181
|
+
|
|
182
|
+
## Reference
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
type Loader = "jsx" | "js" | "ts" | "tsx";
|
|
186
|
+
|
|
187
|
+
interface TranspilerOptions {
|
|
188
|
+
// Replace key with value. Value must be a JSON string.
|
|
189
|
+
// { "process.env.NODE_ENV": "\"production\"" }
|
|
190
|
+
define?: Record<string, string>,
|
|
191
|
+
|
|
192
|
+
// Default loader for this transpiler
|
|
193
|
+
loader?: Loader,
|
|
194
|
+
|
|
195
|
+
// Default platform to target
|
|
196
|
+
// This affects how import and/or require is used
|
|
197
|
+
target?: "browser" | "bun" | "node",
|
|
198
|
+
|
|
199
|
+
// Specify a tsconfig.json file as stringified JSON or an object
|
|
200
|
+
// Use this to set a custom JSX factory, fragment, or import source
|
|
201
|
+
// For example, if you want to use Preact instead of React. Or if you want to use Emotion.
|
|
202
|
+
tsconfig?: string | TSConfig,
|
|
203
|
+
|
|
204
|
+
// Replace imports with macros
|
|
205
|
+
macro?: MacroMap,
|
|
206
|
+
|
|
207
|
+
// Specify a set of exports to eliminate
|
|
208
|
+
// Or rename certain exports
|
|
209
|
+
exports?: {
|
|
210
|
+
eliminate?: string[];
|
|
211
|
+
replace?: Record<string, string>;
|
|
212
|
+
},
|
|
213
|
+
|
|
214
|
+
// Whether to remove unused imports from transpiled file
|
|
215
|
+
// Default: false
|
|
216
|
+
trimUnusedImports?: boolean,
|
|
217
|
+
|
|
218
|
+
// Whether to enable a set of JSX optimizations
|
|
219
|
+
// jsxOptimizationInline ...,
|
|
220
|
+
|
|
221
|
+
// Experimental whitespace minification
|
|
222
|
+
minifyWhitespace?: boolean,
|
|
223
|
+
|
|
224
|
+
// Whether to inline constant values
|
|
225
|
+
// Typically improves performance and decreases bundle size
|
|
226
|
+
// Default: true
|
|
227
|
+
inline?: boolean,
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Map import paths to macros
|
|
231
|
+
interface MacroMap {
|
|
232
|
+
// {
|
|
233
|
+
// "react-relay": {
|
|
234
|
+
// "graphql": "bun-macro-relay/bun-macro-relay.tsx"
|
|
235
|
+
// }
|
|
236
|
+
// }
|
|
237
|
+
[packagePath: string]: {
|
|
238
|
+
[importItemName: string]: string,
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
class Bun.Transpiler {
|
|
243
|
+
constructor(options: TranspilerOptions)
|
|
244
|
+
|
|
245
|
+
transform(code: string, loader?: Loader): Promise<string>
|
|
246
|
+
transformSync(code: string, loader?: Loader): string
|
|
247
|
+
|
|
248
|
+
scan(code: string): {exports: string[], imports: Import}
|
|
249
|
+
scanImports(code: string): Import[]
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
type Import = {
|
|
253
|
+
path: string,
|
|
254
|
+
kind:
|
|
255
|
+
// import foo from 'bar'; in JavaScript
|
|
256
|
+
| "import-statement"
|
|
257
|
+
// require("foo") in JavaScript
|
|
258
|
+
| "require-call"
|
|
259
|
+
// require.resolve("foo") in JavaScript
|
|
260
|
+
| "require-resolve"
|
|
261
|
+
// Dynamic import() in JavaScript
|
|
262
|
+
| "dynamic-import"
|
|
263
|
+
// @import() in CSS
|
|
264
|
+
| "import-rule"
|
|
265
|
+
// url() in CSS
|
|
266
|
+
| "url-token"
|
|
267
|
+
// The import was injected by Bun
|
|
268
|
+
| "internal"
|
|
269
|
+
// Entry point (not common)
|
|
270
|
+
| "entry-point"
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const transpiler = new Bun.Transpiler({ loader: "jsx" });
|
|
274
|
+
```
|