aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-04-14 17:45:16 -0700
committerGravatar GitHub <noreply@github.com> 2023-04-14 17:45:16 -0700
commitb4989a316b4b3dcf0e8e8145aa9541f70122f9ba (patch)
tree9ba477b212a485aa418183ba2ea4f06c55f907ff
parent8b897e1a6bbe026fae3af0c40d65331b44d00c21 (diff)
downloadbun-b4989a316b4b3dcf0e8e8145aa9541f70122f9ba.tar.gz
bun-b4989a316b4b3dcf0e8e8145aa9541f70122f9ba.tar.zst
bun-b4989a316b4b3dcf0e8e8145aa9541f70122f9ba.zip
Support importing `.txt` files as strings (#2660)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
-rw-r--r--packages/bun-types/globals.d.ts5
-rw-r--r--src/bun.js/module_loader.zig2
-rw-r--r--src/bundler.zig26
-rw-r--r--test/js/bun/util/text-loader-fixture-dynamic-import.ts3
-rw-r--r--test/js/bun/util/text-loader-fixture-import.ts3
-rw-r--r--test/js/bun/util/text-loader-fixture-require.ts3
-rw-r--r--test/js/bun/util/text-loader-fixture-text-file.txt1
-rw-r--r--test/js/bun/util/text-loader.test.ts28
8 files changed, 70 insertions, 1 deletions
diff --git a/packages/bun-types/globals.d.ts b/packages/bun-types/globals.d.ts
index a9fdc01a1..ebe62bf30 100644
--- a/packages/bun-types/globals.d.ts
+++ b/packages/bun-types/globals.d.ts
@@ -3168,3 +3168,8 @@ declare var module: NodeModule;
// Same as module.exports
declare var exports: any;
declare var global: typeof globalThis;
+
+declare module "*.txt" {
+ var text: string;
+ export = text;
+}
diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig
index 9ec142176..bfdb9462d 100644
--- a/src/bun.js/module_loader.zig
+++ b/src/bun.js/module_loader.zig
@@ -879,7 +879,7 @@ pub const ModuleLoader = struct {
const disable_transpilying = comptime flags.disableTranspiling();
switch (loader) {
- .js, .jsx, .ts, .tsx, .json, .toml => {
+ .js, .jsx, .ts, .tsx, .json, .toml, .text => {
jsc_vm.transpiled_count += 1;
jsc_vm.bundler.resetStore();
const hash = http.Watcher.getHash(path.text);
diff --git a/src/bundler.zig b/src/bundler.zig
index 629e377ae..8c9775808 100644
--- a/src/bundler.zig
+++ b/src/bundler.zig
@@ -1454,6 +1454,7 @@ pub const Bundler = struct {
},
};
},
+ // TODO: use lazy export AST
.json => {
var expr = json_parser.ParseJSON(&source, bundler.log, allocator) catch return null;
var stmt = js_ast.Stmt.alloc(js_ast.S.ExportDefault, js_ast.S.ExportDefault{
@@ -1475,6 +1476,7 @@ pub const Bundler = struct {
.input_fd = input_fd,
};
},
+ // TODO: use lazy export AST
.toml => {
var expr = TOML.parse(&source, bundler.log, allocator) catch return null;
var stmt = js_ast.Stmt.alloc(js_ast.S.ExportDefault, js_ast.S.ExportDefault{
@@ -1496,6 +1498,30 @@ pub const Bundler = struct {
.input_fd = input_fd,
};
},
+ // TODO: use lazy export AST
+ .text => {
+ var expr = js_ast.Expr.init(js_ast.E.String, js_ast.E.String{
+ .data = source.contents,
+ }, logger.Loc.Empty);
+ var stmt = js_ast.Stmt.alloc(js_ast.S.ExportDefault, js_ast.S.ExportDefault{
+ .value = js_ast.StmtOrExpr{ .expr = expr },
+ .default_name = js_ast.LocRef{
+ .loc = logger.Loc{},
+ .ref = Ref.None,
+ },
+ }, logger.Loc{ .start = 0 });
+ var stmts = allocator.alloc(js_ast.Stmt, 1) catch unreachable;
+ stmts[0] = stmt;
+ var parts = allocator.alloc(js_ast.Part, 1) catch unreachable;
+ parts[0] = js_ast.Part{ .stmts = stmts };
+
+ return ParseResult{
+ .ast = js_ast.Ast.initTest(parts),
+ .source = source,
+ .loader = loader,
+ .input_fd = input_fd,
+ };
+ },
.wasm => {
if (bundler.options.platform.isBun()) {
if (!source.isWebAssembly()) {
diff --git a/test/js/bun/util/text-loader-fixture-dynamic-import.ts b/test/js/bun/util/text-loader-fixture-dynamic-import.ts
new file mode 100644
index 000000000..fe22eb5a6
--- /dev/null
+++ b/test/js/bun/util/text-loader-fixture-dynamic-import.ts
@@ -0,0 +1,3 @@
+const { default: text } = await import("./text-loader-fixture-text-file.txt");
+
+console.write(text);
diff --git a/test/js/bun/util/text-loader-fixture-import.ts b/test/js/bun/util/text-loader-fixture-import.ts
new file mode 100644
index 000000000..ec72286ac
--- /dev/null
+++ b/test/js/bun/util/text-loader-fixture-import.ts
@@ -0,0 +1,3 @@
+import text from "./text-loader-fixture-text-file.txt";
+
+console.write(text);
diff --git a/test/js/bun/util/text-loader-fixture-require.ts b/test/js/bun/util/text-loader-fixture-require.ts
new file mode 100644
index 000000000..5fb4102fc
--- /dev/null
+++ b/test/js/bun/util/text-loader-fixture-require.ts
@@ -0,0 +1,3 @@
+// TODO: should .default really be necessary here?
+const { default: text } = require("./text-loader-fixture-text-file.txt");
+console.write(text);
diff --git a/test/js/bun/util/text-loader-fixture-text-file.txt b/test/js/bun/util/text-loader-fixture-text-file.txt
new file mode 100644
index 000000000..299e8b604
--- /dev/null
+++ b/test/js/bun/util/text-loader-fixture-text-file.txt
@@ -0,0 +1 @@
+These are words! \ No newline at end of file
diff --git a/test/js/bun/util/text-loader.test.ts b/test/js/bun/util/text-loader.test.ts
new file mode 100644
index 000000000..f7d3b2a28
--- /dev/null
+++ b/test/js/bun/util/text-loader.test.ts
@@ -0,0 +1,28 @@
+import { spawnSync } from "bun";
+import { describe, expect, it } from "bun:test";
+import { bunEnv, bunExe } from "harness";
+import { join } from "path";
+
+describe("text-loader", () => {
+ const fixtures = [
+ ["dynamic-import", "text-loader-fixture-dynamic-import.ts"],
+ ["import", "text-loader-fixture-import.ts"],
+ ["require", "text-loader-fixture-require.ts"],
+ ] as const;
+ for (let [kind, path] of fixtures) {
+ describe("should load text", () => {
+ it(`using ${kind}`, () => {
+ const result = spawnSync({
+ cmd: [bunExe(), join(import.meta.dir, path)],
+ env: bunEnv,
+ stdout: "pipe",
+ stderr: "inherit",
+ stdin: "ignore",
+ });
+
+ expect(result.stdout.toString()).toBe("These are words!");
+ expect(result.exitCode).toBe(0);
+ });
+ });
+ }
+});