diff options
author | 2023-04-14 17:45:16 -0700 | |
---|---|---|
committer | 2023-04-14 17:45:16 -0700 | |
commit | b4989a316b4b3dcf0e8e8145aa9541f70122f9ba (patch) | |
tree | 9ba477b212a485aa418183ba2ea4f06c55f907ff | |
parent | 8b897e1a6bbe026fae3af0c40d65331b44d00c21 (diff) | |
download | bun-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.ts | 5 | ||||
-rw-r--r-- | src/bun.js/module_loader.zig | 2 | ||||
-rw-r--r-- | src/bundler.zig | 26 | ||||
-rw-r--r-- | test/js/bun/util/text-loader-fixture-dynamic-import.ts | 3 | ||||
-rw-r--r-- | test/js/bun/util/text-loader-fixture-import.ts | 3 | ||||
-rw-r--r-- | test/js/bun/util/text-loader-fixture-require.ts | 3 | ||||
-rw-r--r-- | test/js/bun/util/text-loader-fixture-text-file.txt | 1 | ||||
-rw-r--r-- | test/js/bun/util/text-loader.test.ts | 28 |
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); + }); + }); + } +}); |