Skip to content

Commit 2a016a6

Browse files
committed
feat: make Source.buffers() self-contained and benchmark source/buffer/buffers per class
- lib/Source.js: buffers() now reads source() directly and wraps a Buffer result without the indirect this.buffer() call. buffer() gains the matching @returns JSDoc. - benchmark: add buffers() cases for RawSource (string, buffer, cached), OriginalSource (string, buffer), PrefixSource, ReplaceSource (no replacements + 1000 small replacements), SourceMapSource (string, buffer), and SizeOnlySource (throws). Existing source()/buffer() cases already cover those methods. - test: add a Source case verifying buffers() returns the buffer directly when source() returns a Buffer. https://claude.ai/code/session_01EHhGq9PRFRGefVtwwasCqZ
1 parent 64afb00 commit 2a016a6

8 files changed

Lines changed: 93 additions & 1 deletion

File tree

benchmark/cases/original-source/index.bench.mjs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ export default function register(bench) {
4343
}
4444
});
4545

46+
bench.add("original-source: buffers() (from string)", () => {
47+
for (let i = 0; i < 50; i++) {
48+
new sources.OriginalSource(fixtureCode, "fixture.js").buffers();
49+
}
50+
});
51+
52+
bench.add("original-source: buffers() (from buffer)", () => {
53+
for (let i = 0; i < 50; i++) {
54+
new sources.OriginalSource(fixtureBuffer, "fixture.js").buffers();
55+
}
56+
});
57+
4658
bench.add("original-source: size()", () => {
4759
for (let i = 0; i < 50; i++) {
4860
new sources.OriginalSource(fixtureCode, "fixture.js").size();

benchmark/cases/prefix-source/index.bench.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ export default function register(bench) {
6868
for (let i = 0; i < 10; i++) ps.buffer();
6969
});
7070

71+
bench.add("prefix-source: buffers()", () => {
72+
const ps = new sources.PrefixSource(
73+
"\t",
74+
new sources.RawSource(fixtureCode),
75+
);
76+
for (let i = 0; i < 10; i++) ps.buffers();
77+
});
78+
7179
bench.add("prefix-source: size()", () => {
7280
const ps = new sources.PrefixSource(
7381
"\t",

benchmark/cases/raw-source/index.bench.mjs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ export default function register(bench) {
4343
for (let i = 0; i < 50; i++) new sources.RawSource(fixtureBuffer).buffer();
4444
});
4545

46+
bench.add("raw-source: buffers() (from string)", () => {
47+
for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).buffers();
48+
});
49+
50+
bench.add("raw-source: buffers() (from buffer)", () => {
51+
for (let i = 0; i < 50; i++) new sources.RawSource(fixtureBuffer).buffers();
52+
});
53+
54+
bench.add("raw-source: buffers() cached", () => {
55+
const src = new sources.RawSource(fixtureBuffer);
56+
for (let i = 0; i < 500; i++) src.buffers();
57+
});
58+
4659
bench.add("raw-source: size()", () => {
4760
for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).size();
4861
});

benchmark/cases/replace-source/index.bench.mjs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ export default function register(bench) {
9696
buildManyReplacements(1000).buffer();
9797
});
9898

99+
bench.add("replace-source: buffers() (no replacements)", () => {
100+
for (let i = 0; i < 100; i++) {
101+
new sources.ReplaceSource(new sources.RawSource(fixtureCode)).buffers();
102+
}
103+
});
104+
105+
bench.add("replace-source: buffers() (1000 small replacements)", () => {
106+
buildManyReplacements(1000).buffers();
107+
});
108+
99109
bench.add("replace-source: map() (no replacements)", () => {
100110
for (let i = 0; i < 10; i++) {
101111
new sources.ReplaceSource(

benchmark/cases/size-only-source/index.bench.mjs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ export default function register(bench) {
4444
}
4545
});
4646

47+
bench.add("size-only-source: buffers() (throws)", () => {
48+
const src = new sources.SizeOnlySource(1024);
49+
for (let i = 0; i < 100; i++) {
50+
try {
51+
src.buffers();
52+
} catch {
53+
// expected
54+
}
55+
}
56+
});
57+
4758
bench.add("size-only-source: map() (throws)", () => {
4859
const src = new sources.SizeOnlySource(1024);
4960
for (let i = 0; i < 100; i++) {

benchmark/cases/source-map-source/index.bench.mjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,26 @@ export default function register(bench) {
6666
}
6767
});
6868

69+
bench.add("source-map-source: buffers() (from string)", () => {
70+
for (let i = 0; i < 50; i++) {
71+
new sources.SourceMapSource(
72+
fixtureCode,
73+
"fixture.js",
74+
fixtureMap,
75+
).buffers();
76+
}
77+
});
78+
79+
bench.add("source-map-source: buffers() (from buffer)", () => {
80+
for (let i = 0; i < 50; i++) {
81+
new sources.SourceMapSource(
82+
fixtureBuffer,
83+
"fixture.js",
84+
fixtureMap,
85+
).buffers();
86+
}
87+
});
88+
6989
bench.add("source-map-source: size()", () => {
7090
for (let i = 0; i < 50; i++) {
7191
new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap).size();

lib/Source.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ class Source {
4646
throw new Error("Abstract");
4747
}
4848

49+
/**
50+
* @returns {Buffer} buffer
51+
*/
4952
buffer() {
5053
const source = this.source();
5154
if (Buffer.isBuffer(source)) return source;
@@ -56,7 +59,9 @@ class Source {
5659
* @returns {Buffer[]} buffers
5760
*/
5861
buffers() {
59-
return [this.buffer()];
62+
const source = this.source();
63+
if (Buffer.isBuffer(source)) return [source];
64+
return [Buffer.from(source, "utf8")];
6065
}
6166

6267
size() {

test/Source.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,17 @@ describe("source", () => {
8686
expect(buffers).toHaveLength(1);
8787
expect(buffers[0]).toEqual(Buffer.from("dummy", "utf8"));
8888
});
89+
90+
it("should return the buffer directly from buffers() when source is a buffer", () => {
91+
const buffer = Buffer.from([1, 2, 3]);
92+
class DummySource extends Source {
93+
source() {
94+
return buffer;
95+
}
96+
}
97+
const source = new DummySource();
98+
const buffers = source.buffers();
99+
expect(buffers).toHaveLength(1);
100+
expect(buffers[0]).toBe(buffer);
101+
});
89102
});

0 commit comments

Comments
 (0)