diff --git a/src/cli/pack_command.zig b/src/cli/pack_command.zig index dc9db0f63a364d..b23e5ebaaf5f64 100644 --- a/src/cli/pack_command.zig +++ b/src/cli/pack_command.zig @@ -1356,10 +1356,12 @@ pub const PackCommand = struct { var includes: std.ArrayListUnmanaged(Pattern) = .{}; defer includes.deinit(ctx.allocator); + var path_buf: PathBuffer = undefined; var files_array = _files_array; while (files_array.next()) |files_entry| { if (files_entry.asString(ctx.allocator)) |file_entry_str| { - const parsed = try Pattern.fromUTF8(ctx.allocator, file_entry_str) orelse continue; + const normalized = bun.path.normalizeBuf(file_entry_str, &path_buf, .posix); + const parsed = try Pattern.fromUTF8(ctx.allocator, normalized) orelse continue; try includes.append(ctx.allocator, parsed); continue; } diff --git a/test/cli/install/bun-pack.test.ts b/test/cli/install/bun-pack.test.ts index ac74efa8e7a6dc..482a5cc56776d9 100644 --- a/test/cli/install/bun-pack.test.ts +++ b/test/cli/install/bun-pack.test.ts @@ -921,7 +921,7 @@ describe("files", () => { write( join(packageDir, "package.json"), JSON.stringify({ - name: "pack-files-3", + name: "pack-files-2", version: "1.2.3", files: ["index.js"], }), @@ -932,16 +932,41 @@ describe("files", () => { ]); await pack(packageDir, bunEnv); - const tarball = readTarball(join(packageDir, "pack-files-3-1.2.3.tgz")); + const tarball = readTarball(join(packageDir, "pack-files-2-1.2.3.tgz")); expect(tarball.entries).toMatchObject([{ "pathname": "package/package.json" }, { "pathname": "package/index.js" }]); }); + test("matches './' as the root", async () => { + await Promise.all([ + write( + join(packageDir, "package.json"), + JSON.stringify({ + name: "pack-files-3", + version: "1.2.3", + files: ["./dist", "!./subdir", "!./dist/index.js", "./////src//index.ts"], + }), + ), + write(join(packageDir, "dist", "index.js"), "console.log('hello ./dist/index.js')"), + write(join(packageDir, "subdir", "index.js"), "console.log('hello ./subdir/index.js')"), + write(join(packageDir, "src", "dist", "index.js"), "console.log('hello ./src/dist/index.js')"), + write(join(packageDir, "src", "index.ts"), "console.log('hello ./src/index.ts')"), + ]); + + await pack(packageDir, bunEnv); + const tarball = readTarball(join(packageDir, "pack-files-3-1.2.3.tgz")); + expect(tarball.entries).toMatchObject([ + { "pathname": "package/package.json" }, + { "pathname": "package/dist/index.js" }, + { "pathname": "package/src/index.ts" }, + ]); + }); + test("recursive only if leading **/", async () => { await Promise.all([ write( join(packageDir, "package.json"), JSON.stringify({ - name: "pack-files-2", + name: "pack-files-4", version: "1.2.123", files: ["**/index.js"], }), @@ -953,7 +978,7 @@ describe("files", () => { ]); await pack(packageDir, bunEnv); - const tarball = readTarball(join(packageDir, "pack-files-2-1.2.123.tgz")); + const tarball = readTarball(join(packageDir, "pack-files-4-1.2.123.tgz")); expect(tarball.entries).toMatchObject([ { "pathname": "package/package.json" }, { "pathname": "package/index.js" },