recker 1.0.26 → 1.0.27-next.8396df6

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.
Files changed (181) hide show
  1. package/dist/browser/browser/cache.d.ts +40 -0
  2. package/dist/browser/browser/cache.js +199 -0
  3. package/dist/browser/browser/crypto.d.ts +24 -0
  4. package/dist/browser/browser/crypto.js +80 -0
  5. package/dist/browser/browser/index.d.ts +31 -0
  6. package/dist/browser/browser/index.js +31 -0
  7. package/dist/browser/browser/recker.d.ts +26 -0
  8. package/dist/browser/browser/recker.js +61 -0
  9. package/dist/browser/cache/basic-file-storage.d.ts +12 -0
  10. package/dist/browser/cache/basic-file-storage.js +50 -0
  11. package/dist/browser/cache/memory-limits.d.ts +20 -0
  12. package/dist/browser/cache/memory-limits.js +96 -0
  13. package/dist/browser/cache/memory-storage.d.ts +132 -0
  14. package/dist/browser/cache/memory-storage.js +454 -0
  15. package/dist/browser/cache.d.ts +40 -0
  16. package/dist/browser/cache.js +199 -0
  17. package/dist/browser/constants/http-status.d.ts +73 -0
  18. package/dist/browser/constants/http-status.js +156 -0
  19. package/dist/browser/cookies/memory-cookie-jar.d.ts +30 -0
  20. package/dist/browser/cookies/memory-cookie-jar.js +210 -0
  21. package/dist/browser/core/client.d.ts +118 -0
  22. package/dist/browser/core/client.js +667 -0
  23. package/dist/browser/core/errors.d.ts +142 -0
  24. package/dist/browser/core/errors.js +308 -0
  25. package/dist/browser/core/index.d.ts +5 -0
  26. package/dist/browser/core/index.js +5 -0
  27. package/dist/browser/core/request-promise.d.ts +23 -0
  28. package/dist/browser/core/request-promise.js +82 -0
  29. package/dist/browser/core/request.d.ts +20 -0
  30. package/dist/browser/core/request.js +76 -0
  31. package/dist/browser/core/response.d.ts +34 -0
  32. package/dist/browser/core/response.js +178 -0
  33. package/dist/browser/crypto.d.ts +24 -0
  34. package/dist/browser/crypto.js +80 -0
  35. package/dist/browser/index.d.ts +31 -0
  36. package/dist/browser/index.js +31 -0
  37. package/dist/browser/plugins/auth/api-key.d.ts +8 -0
  38. package/dist/browser/plugins/auth/api-key.js +27 -0
  39. package/dist/browser/plugins/auth/auth0.d.ts +33 -0
  40. package/dist/browser/plugins/auth/auth0.js +94 -0
  41. package/dist/browser/plugins/auth/aws-sigv4.d.ts +10 -0
  42. package/dist/browser/plugins/auth/aws-sigv4.js +88 -0
  43. package/dist/browser/plugins/auth/azure-ad.d.ts +48 -0
  44. package/dist/browser/plugins/auth/azure-ad.js +152 -0
  45. package/dist/browser/plugins/auth/basic.d.ts +7 -0
  46. package/dist/browser/plugins/auth/basic.js +13 -0
  47. package/dist/browser/plugins/auth/bearer.d.ts +8 -0
  48. package/dist/browser/plugins/auth/bearer.js +17 -0
  49. package/dist/browser/plugins/auth/cognito.d.ts +45 -0
  50. package/dist/browser/plugins/auth/cognito.js +208 -0
  51. package/dist/browser/plugins/auth/digest.d.ts +8 -0
  52. package/dist/browser/plugins/auth/digest.js +100 -0
  53. package/dist/browser/plugins/auth/firebase.d.ts +32 -0
  54. package/dist/browser/plugins/auth/firebase.js +195 -0
  55. package/dist/browser/plugins/auth/github-app.d.ts +36 -0
  56. package/dist/browser/plugins/auth/github-app.js +170 -0
  57. package/dist/browser/plugins/auth/google-service-account.d.ts +49 -0
  58. package/dist/browser/plugins/auth/google-service-account.js +172 -0
  59. package/dist/browser/plugins/auth/index.d.ts +15 -0
  60. package/dist/browser/plugins/auth/index.js +15 -0
  61. package/dist/browser/plugins/auth/mtls.d.ts +37 -0
  62. package/dist/browser/plugins/auth/mtls.js +140 -0
  63. package/dist/browser/plugins/auth/oauth2.d.ts +8 -0
  64. package/dist/browser/plugins/auth/oauth2.js +26 -0
  65. package/dist/browser/plugins/auth/oidc.d.ts +55 -0
  66. package/dist/browser/plugins/auth/oidc.js +222 -0
  67. package/dist/browser/plugins/auth/okta.d.ts +47 -0
  68. package/dist/browser/plugins/auth/okta.js +157 -0
  69. package/dist/browser/plugins/auth.d.ts +1 -0
  70. package/dist/browser/plugins/auth.js +1 -0
  71. package/dist/browser/plugins/cache.d.ts +15 -0
  72. package/dist/browser/plugins/cache.js +486 -0
  73. package/dist/browser/plugins/circuit-breaker.d.ts +13 -0
  74. package/dist/browser/plugins/circuit-breaker.js +100 -0
  75. package/dist/browser/plugins/compression.d.ts +4 -0
  76. package/dist/browser/plugins/compression.js +130 -0
  77. package/dist/browser/plugins/cookie-jar.d.ts +5 -0
  78. package/dist/browser/plugins/cookie-jar.js +72 -0
  79. package/dist/browser/plugins/dedup.d.ts +5 -0
  80. package/dist/browser/plugins/dedup.js +35 -0
  81. package/dist/browser/plugins/graphql.d.ts +13 -0
  82. package/dist/browser/plugins/graphql.js +58 -0
  83. package/dist/browser/plugins/grpc-web.d.ts +79 -0
  84. package/dist/browser/plugins/grpc-web.js +261 -0
  85. package/dist/browser/plugins/hls.d.ts +105 -0
  86. package/dist/browser/plugins/hls.js +395 -0
  87. package/dist/browser/plugins/jsonrpc.d.ts +75 -0
  88. package/dist/browser/plugins/jsonrpc.js +143 -0
  89. package/dist/browser/plugins/logger.d.ts +13 -0
  90. package/dist/browser/plugins/logger.js +108 -0
  91. package/dist/browser/plugins/odata.d.ts +181 -0
  92. package/dist/browser/plugins/odata.js +564 -0
  93. package/dist/browser/plugins/pagination.d.ts +16 -0
  94. package/dist/browser/plugins/pagination.js +105 -0
  95. package/dist/browser/plugins/rate-limit.d.ts +15 -0
  96. package/dist/browser/plugins/rate-limit.js +162 -0
  97. package/dist/browser/plugins/retry.d.ts +14 -0
  98. package/dist/browser/plugins/retry.js +116 -0
  99. package/dist/browser/plugins/scrape.d.ts +21 -0
  100. package/dist/browser/plugins/scrape.js +82 -0
  101. package/dist/browser/plugins/server-timing.d.ts +7 -0
  102. package/dist/browser/plugins/server-timing.js +24 -0
  103. package/dist/browser/plugins/soap.d.ts +72 -0
  104. package/dist/browser/plugins/soap.js +347 -0
  105. package/dist/browser/plugins/xml.d.ts +9 -0
  106. package/dist/browser/plugins/xml.js +194 -0
  107. package/dist/browser/plugins/xsrf.d.ts +9 -0
  108. package/dist/browser/plugins/xsrf.js +48 -0
  109. package/dist/browser/recker.d.ts +26 -0
  110. package/dist/browser/recker.js +61 -0
  111. package/dist/browser/runner/request-runner.d.ts +46 -0
  112. package/dist/browser/runner/request-runner.js +89 -0
  113. package/dist/browser/scrape/document.d.ts +44 -0
  114. package/dist/browser/scrape/document.js +210 -0
  115. package/dist/browser/scrape/element.d.ts +49 -0
  116. package/dist/browser/scrape/element.js +176 -0
  117. package/dist/browser/scrape/extractors.d.ts +16 -0
  118. package/dist/browser/scrape/extractors.js +356 -0
  119. package/dist/browser/scrape/types.d.ts +107 -0
  120. package/dist/browser/scrape/types.js +1 -0
  121. package/dist/browser/transport/fetch.d.ts +11 -0
  122. package/dist/browser/transport/fetch.js +143 -0
  123. package/dist/browser/transport/undici.d.ts +38 -0
  124. package/dist/browser/transport/undici.js +897 -0
  125. package/dist/browser/types/ai.d.ts +267 -0
  126. package/dist/browser/types/ai.js +1 -0
  127. package/dist/browser/types/index.d.ts +351 -0
  128. package/dist/browser/types/index.js +1 -0
  129. package/dist/browser/types/logger.d.ts +16 -0
  130. package/dist/browser/types/logger.js +66 -0
  131. package/dist/browser/types/udp.d.ts +138 -0
  132. package/dist/browser/types/udp.js +1 -0
  133. package/dist/browser/utils/agent-manager.d.ts +29 -0
  134. package/dist/browser/utils/agent-manager.js +160 -0
  135. package/dist/browser/utils/body.d.ts +10 -0
  136. package/dist/browser/utils/body.js +148 -0
  137. package/dist/browser/utils/charset.d.ts +15 -0
  138. package/dist/browser/utils/charset.js +169 -0
  139. package/dist/browser/utils/concurrency.d.ts +20 -0
  140. package/dist/browser/utils/concurrency.js +120 -0
  141. package/dist/browser/utils/dns.d.ts +6 -0
  142. package/dist/browser/utils/dns.js +26 -0
  143. package/dist/browser/utils/header-parser.d.ts +94 -0
  144. package/dist/browser/utils/header-parser.js +617 -0
  145. package/dist/browser/utils/html-cleaner.d.ts +1 -0
  146. package/dist/browser/utils/html-cleaner.js +21 -0
  147. package/dist/browser/utils/link-header.d.ts +69 -0
  148. package/dist/browser/utils/link-header.js +190 -0
  149. package/dist/browser/utils/optional-require.d.ts +19 -0
  150. package/dist/browser/utils/optional-require.js +105 -0
  151. package/dist/browser/utils/progress.d.ts +8 -0
  152. package/dist/browser/utils/progress.js +82 -0
  153. package/dist/browser/utils/request-pool.d.ts +22 -0
  154. package/dist/browser/utils/request-pool.js +101 -0
  155. package/dist/browser/utils/sse.d.ts +7 -0
  156. package/dist/browser/utils/sse.js +67 -0
  157. package/dist/browser/utils/streaming.d.ts +17 -0
  158. package/dist/browser/utils/streaming.js +84 -0
  159. package/dist/browser/utils/try-fn.d.ts +3 -0
  160. package/dist/browser/utils/try-fn.js +59 -0
  161. package/dist/browser/utils/user-agent.d.ts +44 -0
  162. package/dist/browser/utils/user-agent.js +100 -0
  163. package/dist/browser/utils/whois.d.ts +32 -0
  164. package/dist/browser/utils/whois.js +246 -0
  165. package/dist/browser/websocket/client.d.ts +65 -0
  166. package/dist/browser/websocket/client.js +313 -0
  167. package/dist/cli/index.d.ts +1 -0
  168. package/dist/cli/index.js +99 -3
  169. package/dist/index.d.ts +1 -0
  170. package/dist/index.js +1 -0
  171. package/dist/seo/analyzer.d.ts +20 -0
  172. package/dist/seo/analyzer.js +544 -0
  173. package/dist/seo/index.d.ts +2 -0
  174. package/dist/seo/index.js +1 -0
  175. package/dist/seo/types.d.ts +100 -0
  176. package/dist/seo/types.js +1 -0
  177. package/dist/transport/fetch.d.ts +7 -1
  178. package/dist/transport/fetch.js +58 -76
  179. package/dist/utils/columns.d.ts +14 -0
  180. package/dist/utils/columns.js +69 -0
  181. package/package.json +34 -2
@@ -1,12 +1,29 @@
1
1
  export class FetchTransport {
2
- constructor() { }
2
+ options;
3
+ constructor(options = {}) {
4
+ this.options = options;
5
+ }
3
6
  async dispatch(req) {
4
7
  const start = performance.now();
8
+ let timeoutId;
9
+ let abortController;
10
+ const timeoutMs = typeof req.timeout === 'number'
11
+ ? req.timeout
12
+ : req.timeout?.request;
13
+ let signal = req.signal;
14
+ if (timeoutMs && !signal) {
15
+ abortController = new AbortController();
16
+ signal = abortController.signal;
17
+ timeoutId = setTimeout(() => abortController.abort(), timeoutMs);
18
+ }
5
19
  const requestInit = {
6
20
  method: req.method,
7
21
  headers: req.headers,
8
22
  body: req.body,
9
- signal: req.signal,
23
+ signal,
24
+ credentials: this.options.credentials,
25
+ cache: this.options.cache,
26
+ keepalive: this.options.keepalive ?? true,
10
27
  duplex: req.body ? 'half' : undefined
11
28
  };
12
29
  try {
@@ -16,84 +33,22 @@ export class FetchTransport {
16
33
  total: totalTime,
17
34
  firstByte: totalTime,
18
35
  };
19
- const reckerResponse = {
20
- status: response.status,
21
- statusText: response.statusText,
22
- headers: response.headers,
23
- ok: response.ok,
24
- url: response.url,
25
- timings,
26
- raw: response,
27
- json: () => response.json(),
28
- text: () => response.text(),
29
- blob: () => response.blob(),
30
- cleanText: async () => {
31
- const text = await response.text();
32
- return text.replace(/<[^>]*>?/gm, '');
33
- },
34
- read: () => response.body,
35
- clone: () => {
36
- const cloned = response.clone();
37
- return createReckerResponseWrapper(cloned, timings);
38
- },
39
- async *sse() {
40
- if (!response.body)
41
- return;
42
- const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
43
- while (true) {
44
- const { done, value } = await reader.read();
45
- if (done)
46
- break;
47
- const lines = value.split('\n');
48
- for (const line of lines) {
49
- if (line.startsWith('data: ')) {
50
- yield { data: line.slice(6) };
51
- }
52
- }
53
- }
54
- },
55
- async *download() {
56
- if (!response.body)
57
- return;
58
- const reader = response.body.getReader();
59
- let loaded = 0;
60
- const total = Number(response.headers.get('content-length')) || undefined;
61
- while (true) {
62
- const { done, value } = await reader.read();
63
- if (done)
64
- break;
65
- loaded += value.length;
66
- yield {
67
- loaded,
68
- transferred: loaded,
69
- total,
70
- percent: total ? (loaded / total) * 100 : undefined,
71
- direction: 'download'
72
- };
73
- }
74
- },
75
- async *[Symbol.asyncIterator]() {
76
- if (!response.body)
77
- return;
78
- const reader = response.body.getReader();
79
- while (true) {
80
- const { done, value } = await reader.read();
81
- if (done)
82
- break;
83
- yield value;
84
- }
85
- }
86
- };
87
- return reckerResponse;
36
+ return new FetchResponseWrapper(response, timings);
88
37
  }
89
38
  catch (error) {
39
+ if (error.name === 'AbortError' && abortController) {
40
+ const timeoutError = new Error(`Request timeout after ${timeoutMs}ms`);
41
+ timeoutError.name = 'TimeoutError';
42
+ throw timeoutError;
43
+ }
90
44
  throw error;
91
45
  }
46
+ finally {
47
+ if (timeoutId)
48
+ clearTimeout(timeoutId);
49
+ }
92
50
  }
93
51
  }
94
- function createReckerResponseWrapper(response, timings) {
95
- return new FetchResponseWrapper(response, timings);
96
- }
97
52
  class FetchResponseWrapper {
98
53
  raw;
99
54
  timings;
@@ -118,12 +73,39 @@ class FetchResponseWrapper {
118
73
  return;
119
74
  const stream = this.raw.body.pipeThrough(new TextDecoderStream());
120
75
  const reader = stream.getReader();
76
+ let buffer = '';
121
77
  while (true) {
122
78
  const { done, value } = await reader.read();
123
79
  if (done)
124
80
  break;
125
- if (value.startsWith('data: ')) {
126
- yield { data: value.slice(6) };
81
+ buffer += value;
82
+ const events = buffer.split('\n\n');
83
+ buffer = events.pop() || '';
84
+ for (const event of events) {
85
+ if (!event.trim())
86
+ continue;
87
+ let data = '';
88
+ let eventType;
89
+ let id;
90
+ let retry;
91
+ const lines = event.split('\n');
92
+ for (const line of lines) {
93
+ if (line.startsWith('data: ')) {
94
+ data = data ? data + '\n' + line.slice(6) : line.slice(6);
95
+ }
96
+ else if (line.startsWith('event: ')) {
97
+ eventType = line.slice(7);
98
+ }
99
+ else if (line.startsWith('id: ')) {
100
+ id = line.slice(4);
101
+ }
102
+ else if (line.startsWith('retry: ')) {
103
+ retry = parseInt(line.slice(7), 10);
104
+ }
105
+ }
106
+ if (data) {
107
+ yield { data, event: eventType, id, retry };
108
+ }
127
109
  }
128
110
  }
129
111
  }
@@ -0,0 +1,14 @@
1
+ export interface ColumnOptions {
2
+ minWidth?: number;
3
+ maxColumns?: number;
4
+ padding?: number;
5
+ prefix?: string;
6
+ indent?: number;
7
+ transform?: (item: string) => string;
8
+ }
9
+ export declare function getTerminalWidth(): number;
10
+ export declare function formatColumns(items: string[], options?: ColumnOptions): string;
11
+ export declare function formatColumnsRowMajor(items: string[], options?: ColumnOptions): string;
12
+ export declare function formatGroupedColumns(groups: Record<string, string[]>, options?: ColumnOptions & {
13
+ groupPrefix?: string;
14
+ }): string;
@@ -0,0 +1,69 @@
1
+ export function getTerminalWidth() {
2
+ return process.stdout.columns || 80;
3
+ }
4
+ export function formatColumns(items, options = {}) {
5
+ const { minWidth = 15, maxColumns = Infinity, padding = 2, prefix = '', indent = 2, transform, } = options;
6
+ if (items.length === 0)
7
+ return '';
8
+ const prefixedItems = items.map(item => prefix + item);
9
+ const maxItemWidth = Math.max(...prefixedItems.map(item => item.length));
10
+ const columnWidth = Math.max(minWidth, maxItemWidth + padding);
11
+ const terminalWidth = getTerminalWidth();
12
+ const availableWidth = terminalWidth - indent;
13
+ const calculatedColumns = Math.floor(availableWidth / columnWidth);
14
+ const numColumns = Math.min(Math.max(1, calculatedColumns), maxColumns, items.length);
15
+ const actualColumnWidth = Math.floor(availableWidth / numColumns);
16
+ const numRows = Math.ceil(prefixedItems.length / numColumns);
17
+ const lines = [];
18
+ const indentStr = ' '.repeat(indent);
19
+ for (let row = 0; row < numRows; row++) {
20
+ let line = indentStr;
21
+ for (let col = 0; col < numColumns; col++) {
22
+ const index = col * numRows + row;
23
+ if (index < prefixedItems.length) {
24
+ const rawItem = prefixedItems[index];
25
+ const displayItem = transform ? transform(rawItem) : rawItem;
26
+ const paddingNeeded = actualColumnWidth - rawItem.length;
27
+ line += displayItem + ' '.repeat(Math.max(0, paddingNeeded));
28
+ }
29
+ }
30
+ lines.push(line.trimEnd());
31
+ }
32
+ return lines.join('\n');
33
+ }
34
+ export function formatColumnsRowMajor(items, options = {}) {
35
+ const { minWidth = 15, maxColumns = Infinity, padding = 2, prefix = '', indent = 2, } = options;
36
+ if (items.length === 0)
37
+ return '';
38
+ const prefixedItems = items.map(item => prefix + item);
39
+ const maxItemWidth = Math.max(...prefixedItems.map(item => item.length));
40
+ const columnWidth = Math.max(minWidth, maxItemWidth + padding);
41
+ const terminalWidth = getTerminalWidth();
42
+ const availableWidth = terminalWidth - indent;
43
+ const calculatedColumns = Math.floor(availableWidth / columnWidth);
44
+ const numColumns = Math.min(Math.max(1, calculatedColumns), maxColumns, items.length);
45
+ const actualColumnWidth = Math.floor(availableWidth / numColumns);
46
+ const lines = [];
47
+ const indentStr = ' '.repeat(indent);
48
+ for (let i = 0; i < prefixedItems.length; i += numColumns) {
49
+ let line = indentStr;
50
+ for (let col = 0; col < numColumns && i + col < prefixedItems.length; col++) {
51
+ const item = prefixedItems[i + col];
52
+ line += item.padEnd(actualColumnWidth);
53
+ }
54
+ lines.push(line.trimEnd());
55
+ }
56
+ return lines.join('\n');
57
+ }
58
+ export function formatGroupedColumns(groups, options = {}) {
59
+ const lines = [];
60
+ const { groupPrefix = '', ...columnOptions } = options;
61
+ for (const [groupName, items] of Object.entries(groups)) {
62
+ if (items.length === 0)
63
+ continue;
64
+ lines.push(groupPrefix + groupName + ':');
65
+ lines.push(formatColumns(items, columnOptions));
66
+ lines.push('');
67
+ }
68
+ return lines.join('\n').trimEnd();
69
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "recker",
3
- "version": "1.0.26",
3
+ "version": "1.0.27-next.8396df6",
4
4
  "description": "AI & DevX focused HTTP client for Node.js 18+",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -58,6 +58,24 @@
58
58
  ],
59
59
  "exports": {
60
60
  ".": {
61
+ "types": "./dist/index.d.ts",
62
+ "node": {
63
+ "import": "./dist/index.js",
64
+ "require": "./dist/index.cjs"
65
+ },
66
+ "browser": {
67
+ "import": "./dist/browser/browser/index.js",
68
+ "default": "./dist/browser/browser/index.js"
69
+ },
70
+ "import": "./dist/index.js",
71
+ "default": "./dist/index.js"
72
+ },
73
+ "./browser": {
74
+ "types": "./dist/browser/browser/index.d.ts",
75
+ "import": "./dist/browser/browser/index.js",
76
+ "default": "./dist/browser/browser/index.js"
77
+ },
78
+ "./node": {
61
79
  "types": "./dist/index.d.ts",
62
80
  "import": "./dist/index.js",
63
81
  "default": "./dist/index.js"
@@ -114,8 +132,15 @@
114
132
  "types": "./dist/mini.d.ts",
115
133
  "import": "./dist/mini.js"
116
134
  },
135
+ "./presets/*": {
136
+ "types": "./dist/presets/*.d.ts",
137
+ "import": "./dist/presets/*.js"
138
+ },
117
139
  "./package.json": "./package.json"
118
140
  },
141
+ "browser": "./dist/browser/browser/index.js",
142
+ "unpkg": "./dist/browser/index.umd.min.js",
143
+ "jsdelivr": "./dist/browser/index.umd.min.js",
119
144
  "bin": {
120
145
  "rek": "./dist/cli/index.js",
121
146
  "recker": "./dist/cli/index.js"
@@ -164,8 +189,10 @@
164
189
  "commander": "^14.0.0",
165
190
  "cross-fetch": "^4.1.0",
166
191
  "domhandler": "^5.0.3",
192
+ "esbuild": "^0.24.2",
167
193
  "fastembed": "^2.0.0",
168
194
  "got": "^14.6.5",
195
+ "happy-dom": "^20.0.11",
169
196
  "husky": "^9.1.7",
170
197
  "ky": "^1.14.0",
171
198
  "make-fetch-happen": "^15.0.3",
@@ -186,11 +213,16 @@
186
213
  "zod": "^4.1.13"
187
214
  },
188
215
  "scripts": {
189
- "build": "tsc",
216
+ "build": "pnpm build:node && pnpm build:browser",
217
+ "build:node": "tsc",
218
+ "build:browser": "tsc -p tsconfig.browser.json",
219
+ "build:browser:bundle": "pnpm build:browser && node scripts/bundle-browser.js",
190
220
  "build:embeddings": "tsx scripts/build-embeddings.ts",
191
221
  "test": "NODE_OPTIONS='--max-old-space-size=512' vitest run",
192
222
  "test:coverage": "NODE_OPTIONS='--max-old-space-size=512' vitest run --coverage",
193
223
  "test:light": "NODE_OPTIONS='--max-old-space-size=256' vitest run --poolOptions.forks.maxForks=1",
224
+ "test:browser": "vitest run --config vitest.config.browser.ts",
225
+ "test:browser:coverage": "vitest run --config vitest.config.browser.ts --coverage",
194
226
  "bench": "tsx benchmark/index.ts",
195
227
  "bench:compare": "tsx benchmark/http-clients-comparison.ts",
196
228
  "bench:all": "tsx benchmark/run-all.ts",