@xberg-io/crawlberg-wasm 1.10.2 → 1.11.0

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.
@@ -192,21 +192,31 @@ export const wasmcitationresult_new: (a: number, b: number, c: number, d: number
192
192
  export const wasmcitationresult_references: (a: number) => [number, number];
193
193
  export const wasmcitationresult_set_content: (a: number, b: number, c: number) => void;
194
194
  export const wasmcitationresult_set_references: (a: number, b: number, c: number) => void;
195
+ export const wasmcontentconfig_bullets: (a: number) => [number, number];
196
+ export const wasmcontentconfig_compactTables: (a: number) => number;
195
197
  export const wasmcontentconfig_copyForTransfer: (a: number) => number;
196
198
  export const wasmcontentconfig_default: () => number;
197
199
  export const wasmcontentconfig_excludeSelectors: (a: number) => [number, number];
198
200
  export const wasmcontentconfig_extractMetadata: (a: number) => number;
199
201
  export const wasmcontentconfig_includeDocumentStructure: (a: number) => number;
202
+ export const wasmcontentconfig_keepHidden: (a: number) => number;
203
+ export const wasmcontentconfig_keepInlineImagesIn: (a: number) => [number, number];
204
+ export const wasmcontentconfig_listIndentWidth: (a: number) => number;
200
205
  export const wasmcontentconfig_maxDepth: (a: number) => number;
201
- export const wasmcontentconfig_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number) => number;
206
+ export const wasmcontentconfig_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number) => number;
202
207
  export const wasmcontentconfig_outputFormat: (a: number) => [number, number];
203
208
  export const wasmcontentconfig_preprocessingPreset: (a: number) => [number, number];
204
209
  export const wasmcontentconfig_preserveTags: (a: number) => [number, number];
205
210
  export const wasmcontentconfig_removeForms: (a: number) => number;
206
211
  export const wasmcontentconfig_removeNavigation: (a: number) => number;
212
+ export const wasmcontentconfig_set_bullets: (a: number, b: number, c: number) => void;
213
+ export const wasmcontentconfig_set_compactTables: (a: number, b: number) => void;
207
214
  export const wasmcontentconfig_set_excludeSelectors: (a: number, b: number, c: number) => void;
208
215
  export const wasmcontentconfig_set_extractMetadata: (a: number, b: number) => void;
209
216
  export const wasmcontentconfig_set_includeDocumentStructure: (a: number, b: number) => void;
217
+ export const wasmcontentconfig_set_keepHidden: (a: number, b: number) => void;
218
+ export const wasmcontentconfig_set_keepInlineImagesIn: (a: number, b: number, c: number) => void;
219
+ export const wasmcontentconfig_set_listIndentWidth: (a: number, b: number) => void;
210
220
  export const wasmcontentconfig_set_maxDepth: (a: number, b: number) => void;
211
221
  export const wasmcontentconfig_set_outputFormat: (a: number, b: number, c: number) => void;
212
222
  export const wasmcontentconfig_set_preprocessingPreset: (a: number, b: number, c: number) => void;
@@ -214,11 +224,15 @@ export const wasmcontentconfig_set_preserveTags: (a: number, b: number, c: numbe
214
224
  export const wasmcontentconfig_set_removeForms: (a: number, b: number) => void;
215
225
  export const wasmcontentconfig_set_removeNavigation: (a: number, b: number) => void;
216
226
  export const wasmcontentconfig_set_skipImages: (a: number, b: number) => void;
227
+ export const wasmcontentconfig_set_stripNewlines: (a: number, b: number) => void;
217
228
  export const wasmcontentconfig_set_stripTags: (a: number, b: number, c: number) => void;
229
+ export const wasmcontentconfig_set_strongEmSymbol: (a: number, b: number, c: number) => void;
218
230
  export const wasmcontentconfig_set_wrap: (a: number, b: number) => void;
219
231
  export const wasmcontentconfig_set_wrapWidth: (a: number, b: number) => void;
220
232
  export const wasmcontentconfig_skipImages: (a: number) => number;
233
+ export const wasmcontentconfig_stripNewlines: (a: number) => number;
221
234
  export const wasmcontentconfig_stripTags: (a: number) => [number, number];
235
+ export const wasmcontentconfig_strongEmSymbol: (a: number) => [number, number];
222
236
  export const wasmcontentconfig_wrap: (a: number) => number;
223
237
  export const wasmcontentconfig_wrapWidth: (a: number) => number;
224
238
  export const wasmcookieinfo_copyForTransfer: (a: number) => number;
@@ -370,10 +384,11 @@ export const wasmcrawlpageresult_jsonLd: (a: number) => [number, number];
370
384
  export const wasmcrawlpageresult_links: (a: number) => [number, number];
371
385
  export const wasmcrawlpageresult_markdown: (a: number) => number;
372
386
  export const wasmcrawlpageresult_metadata: (a: number) => number;
373
- export const wasmcrawlpageresult_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number) => number;
387
+ export const wasmcrawlpageresult_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number, u: number, v: number, w: number, x: number, y: number, z: number, a1: number, b1: number, c1: number, d1: number, e1: number, f1: number, g1: number, h1: number, i1: number, j1: number, k1: number, l1: number, m1: number) => number;
374
388
  export const wasmcrawlpageresult_nofollowDetected: (a: number) => number;
375
389
  export const wasmcrawlpageresult_noindexDetected: (a: number) => number;
376
390
  export const wasmcrawlpageresult_normalizedUrl: (a: number) => [number, number];
391
+ export const wasmcrawlpageresult_originalUrl: (a: number) => [number, number];
377
392
  export const wasmcrawlpageresult_redirectCount: (a: number) => number;
378
393
  export const wasmcrawlpageresult_set_bodySize: (a: number, b: number) => void;
379
394
  export const wasmcrawlpageresult_set_browserUsed: (a: number, b: number) => void;
@@ -395,6 +410,7 @@ export const wasmcrawlpageresult_set_metadata: (a: number, b: number) => void;
395
410
  export const wasmcrawlpageresult_set_nofollowDetected: (a: number, b: number) => void;
396
411
  export const wasmcrawlpageresult_set_noindexDetected: (a: number, b: number) => void;
397
412
  export const wasmcrawlpageresult_set_normalizedUrl: (a: number, b: number, c: number) => void;
413
+ export const wasmcrawlpageresult_set_originalUrl: (a: number, b: number, c: number) => void;
398
414
  export const wasmcrawlpageresult_set_redirectCount: (a: number, b: number) => void;
399
415
  export const wasmcrawlpageresult_set_ssrfRefusedUrls: (a: number, b: number, c: number) => void;
400
416
  export const wasmcrawlpageresult_set_statusCode: (a: number, b: number) => void;
@@ -553,11 +569,13 @@ export const wasmjsonldentry_set_schemaType: (a: number, b: number, c: number) =
553
569
  export const wasmlinkinfo_copyForTransfer: (a: number) => number;
554
570
  export const wasmlinkinfo_default: () => number;
555
571
  export const wasmlinkinfo_linkType: (a: number) => [number, number];
556
- export const wasmlinkinfo_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number;
572
+ export const wasmlinkinfo_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => number;
557
573
  export const wasmlinkinfo_nofollow: (a: number) => number;
574
+ export const wasmlinkinfo_originalUrl: (a: number) => [number, number];
558
575
  export const wasmlinkinfo_rel: (a: number) => [number, number];
559
576
  export const wasmlinkinfo_set_linkType: (a: number, b: number) => void;
560
577
  export const wasmlinkinfo_set_nofollow: (a: number, b: number) => void;
578
+ export const wasmlinkinfo_set_originalUrl: (a: number, b: number, c: number) => void;
561
579
  export const wasmlinkinfo_set_rel: (a: number, b: number, c: number) => void;
562
580
  export const wasmlinkinfo_set_text: (a: number, b: number, c: number) => void;
563
581
  export const wasmlinkinfo_set_url: (a: number, b: number, c: number) => void;
@@ -812,9 +830,9 @@ export const wasmssrfpolicy_set_denyPrivate: (a: number, b: number) => void;
812
830
  export const wasmssrfpolicy_set_denylist: (a: number, b: any) => void;
813
831
  export const wasmssrfpolicy_set_maxRedirects: (a: number, b: number) => void;
814
832
  export const wasmssrfpolicy_set_schemeAllowlist: (a: number, b: number, c: number) => void;
815
- export const wasm_bindgen__convert__closures_____invoke__h2eedacf566f3748c: (a: number, b: number, c: any) => [number, number];
816
- export const wasm_bindgen__convert__closures_____invoke__h8ad11faaa2905452: (a: number, b: number, c: any, d: any) => void;
817
- export const wasm_bindgen__convert__closures_____invoke__h3a7ccac3e94bbb5c: (a: number, b: number) => void;
833
+ export const wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
834
+ export const wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___wasm_bindgen_ceaac9754e66b2fe___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_ceaac9754e66b2fe___JsError___true_: (a: number, b: number, c: any) => [number, number];
835
+ export const wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke_______true_: (a: number, b: number) => void;
818
836
  export const __wbindgen_malloc: (a: number, b: number) => number;
819
837
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
820
838
  export const __wbindgen_exn_store: (a: number) => void;
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "crawlberg-wasm",
3
3
  "type": "module",
4
+ "collaborators": [
5
+ "Na'aman Hirschfeld <naaman@xberg.io>",
6
+ "Tobias Perlstein <tobias@xberg.io>"
7
+ ],
4
8
  "description": "High-performance web crawling engine",
5
- "version": "1.10.2",
9
+ "version": "1.11.0",
6
10
  "license": "MIT",
7
11
  "repository": {
8
12
  "type": "git",
@@ -1,5 +1,5 @@
1
1
  <!-- This file is auto-generated by alef — DO NOT EDIT. -->
2
- <!-- alef:hash:3e2f4a488c2c856faef7619c7da3856ab9b8cdad4534264dea7b27a2ebf8bf35 -->
2
+ <!-- alef:hash:317aa594b0d20c83a18e8cdb5342b90b90f56e94e51ba85fc80ebb44ab9c1331 -->
3
3
  <!-- To regenerate: alef readme -->
4
4
  <!-- To verify freshness: alef verify -->
5
5
 
@@ -101,14 +101,14 @@ pnpm add @xberg-io/crawlberg-wasm
101
101
 
102
102
  ## Agent plugin
103
103
 
104
- The `crawlberg` plugin is available via the `xberg-io/plugins` marketplace.
104
+ The `crawlberg` plugin is available via the `xberg-io/crawlberg` marketplace.
105
105
 
106
106
  ```text
107
- /plugin marketplace add xberg-io/plugins
108
- /plugin install crawlberg@xberg
107
+ /plugin marketplace add xberg-io/crawlberg
108
+ /plugin install crawlberg@crawlberg
109
109
  ```
110
110
 
111
- Works with Claude Code, Codex, Cursor, Gemini CLI, Factory Droid, GitHub Copilot CLI, and opencode. See [the marketplace README](https://github.com/xberg-io/plugins) for harness-specific install instructions.
111
+ See [the plugin guide](https://github.com/xberg-io/crawlberg/blob/main/plugin/README.md) for all supported runtimes, CLI prerequisites and standalone public skills.
112
112
 
113
113
  ## Quick Start
114
114
 
@@ -427,10 +427,15 @@ export class WasmContentConfig {
427
427
  */
428
428
  copyForTransfer(): WasmContentConfig;
429
429
  static default(): WasmContentConfig;
430
- constructor(outputFormat?: string | null, preprocessingPreset?: string | null, removeNavigation?: boolean | null, removeForms?: boolean | null, stripTags?: string[] | null, preserveTags?: string[] | null, excludeSelectors?: string[] | null, skipImages?: boolean | null, wrap?: boolean | null, wrapWidth?: number | null, includeDocumentStructure?: boolean | null, extractMetadata?: boolean | null, maxDepth?: number | null);
430
+ constructor(outputFormat?: string | null, preprocessingPreset?: string | null, removeNavigation?: boolean | null, removeForms?: boolean | null, stripTags?: string[] | null, preserveTags?: string[] | null, excludeSelectors?: string[] | null, skipImages?: boolean | null, wrap?: boolean | null, wrapWidth?: number | null, includeDocumentStructure?: boolean | null, extractMetadata?: boolean | null, maxDepth?: number | null, stripNewlines?: boolean | null, bullets?: string | null, listIndentWidth?: number | null, strongEmSymbol?: string | null, compactTables?: boolean | null, keepInlineImagesIn?: string[] | null, keepHidden?: boolean | null);
431
+ bullets: string;
432
+ compactTables: boolean;
431
433
  excludeSelectors: string[];
432
434
  extractMetadata: boolean;
433
435
  includeDocumentStructure: boolean;
436
+ keepHidden: boolean;
437
+ keepInlineImagesIn: string[];
438
+ listIndentWidth: number;
434
439
  get maxDepth(): number | undefined;
435
440
  set maxDepth(value: number | null | undefined);
436
441
  outputFormat: string;
@@ -439,7 +444,9 @@ export class WasmContentConfig {
439
444
  removeForms: boolean;
440
445
  removeNavigation: boolean;
441
446
  skipImages: boolean;
447
+ stripNewlines: boolean;
442
448
  stripTags: string[];
449
+ strongEmSymbol: string;
443
450
  wrapWidth: number;
444
451
  wrap: boolean;
445
452
  }
@@ -452,7 +459,10 @@ export enum WasmContentFilterKind {
452
459
  }
453
460
 
454
461
  /**
455
- * Information about an HTTP cookie received from a response.
462
+ * Information about a cookie that a crawled page set.
463
+ *
464
+ * A crawl result gives `domain` and `path` as the browser stores the cookie, so a cookie has
465
+ * the same fields whether an HTTP fetch or the browser received it.
456
466
  */
457
467
  export class WasmCookieInfo {
458
468
  free(): void;
@@ -655,7 +665,7 @@ export class WasmCrawlPageResult {
655
665
  * wasm-bindgen cannot borrow class values nested in an array. To keep those handles,
656
666
  * copy each retained element with `copyForTransfer()` before passing the array.
657
667
  */
658
- constructor(url?: string | null, normalizedUrl?: string | null, statusCode?: number | null, contentType?: string | null, html?: string | null, bodySize?: number | null, metadata?: WasmPageMetadata | null, links?: WasmLinkInfo[] | null, images?: WasmImageInfo[] | null, feeds?: WasmFeedInfo[] | null, jsonLd?: WasmJsonLdEntry[] | null, depth?: number | null, stayedOnDomain?: boolean | null, wasSkipped?: boolean | null, isPdf?: boolean | null, browserUsed?: boolean | null, finalUrl?: string | null, redirectCount?: number | null, noindexDetected?: boolean | null, nofollowDetected?: boolean | null, ssrfRefusedUrls?: string[] | null, detectedCharset?: string | null, markdown?: WasmMarkdownResult | null, extractedData?: any | null, extractionMeta?: WasmExtractionMeta | null, downloadedDocument?: WasmDownloadedDocument | null);
668
+ constructor(url?: string | null, normalizedUrl?: string | null, statusCode?: number | null, contentType?: string | null, html?: string | null, bodySize?: number | null, metadata?: WasmPageMetadata | null, links?: WasmLinkInfo[] | null, images?: WasmImageInfo[] | null, feeds?: WasmFeedInfo[] | null, jsonLd?: WasmJsonLdEntry[] | null, depth?: number | null, stayedOnDomain?: boolean | null, wasSkipped?: boolean | null, isPdf?: boolean | null, browserUsed?: boolean | null, finalUrl?: string | null, redirectCount?: number | null, noindexDetected?: boolean | null, nofollowDetected?: boolean | null, ssrfRefusedUrls?: string[] | null, detectedCharset?: string | null, markdown?: WasmMarkdownResult | null, extractedData?: any | null, extractionMeta?: WasmExtractionMeta | null, downloadedDocument?: WasmDownloadedDocument | null, originalUrl?: string | null);
659
669
  bodySize: number;
660
670
  browserUsed: boolean;
661
671
  contentType: string;
@@ -729,6 +739,7 @@ export class WasmCrawlPageResult {
729
739
  nofollowDetected: boolean;
730
740
  noindexDetected: boolean;
731
741
  normalizedUrl: string;
742
+ originalUrl: string;
732
743
  redirectCount: number;
733
744
  ssrfRefusedUrls: string[];
734
745
  statusCode: number;
@@ -1126,10 +1137,11 @@ export class WasmLinkInfo {
1126
1137
  */
1127
1138
  copyForTransfer(): WasmLinkInfo;
1128
1139
  static default(): WasmLinkInfo;
1129
- constructor(url?: string | null, text?: string | null, linkType?: WasmLinkType | null, nofollow?: boolean | null, rel?: string | null);
1140
+ constructor(url?: string | null, text?: string | null, linkType?: WasmLinkType | null, nofollow?: boolean | null, rel?: string | null, originalUrl?: string | null);
1130
1141
  get linkType(): string;
1131
1142
  set linkType(value: WasmLinkType);
1132
1143
  nofollow: boolean;
1144
+ originalUrl: string;
1133
1145
  get rel(): string | undefined;
1134
1146
  set rel(value: string | null | undefined);
1135
1147
  text: string;
@@ -1792,6 +1792,28 @@ export class WasmContentConfig {
1792
1792
  const ptr = this.__destroy_into_raw();
1793
1793
  wasm.__wbg_wasmcontentconfig_free(ptr, 0);
1794
1794
  }
1795
+ /**
1796
+ * @returns {string}
1797
+ */
1798
+ get bullets() {
1799
+ let deferred1_0;
1800
+ let deferred1_1;
1801
+ try {
1802
+ const ret = wasm.wasmcontentconfig_bullets(this.__wbg_ptr);
1803
+ deferred1_0 = ret[0];
1804
+ deferred1_1 = ret[1];
1805
+ return getStringFromWasm0(ret[0], ret[1]);
1806
+ } finally {
1807
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
1808
+ }
1809
+ }
1810
+ /**
1811
+ * @returns {boolean}
1812
+ */
1813
+ get compactTables() {
1814
+ const ret = wasm.wasmcontentconfig_compactTables(this.__wbg_ptr);
1815
+ return ret !== 0;
1816
+ }
1795
1817
  /**
1796
1818
  * Return an independent handle for an ownership-taking API.
1797
1819
  *
@@ -1833,6 +1855,29 @@ export class WasmContentConfig {
1833
1855
  const ret = wasm.wasmcontentconfig_includeDocumentStructure(this.__wbg_ptr);
1834
1856
  return ret !== 0;
1835
1857
  }
1858
+ /**
1859
+ * @returns {boolean}
1860
+ */
1861
+ get keepHidden() {
1862
+ const ret = wasm.wasmcontentconfig_keepHidden(this.__wbg_ptr);
1863
+ return ret !== 0;
1864
+ }
1865
+ /**
1866
+ * @returns {string[]}
1867
+ */
1868
+ get keepInlineImagesIn() {
1869
+ const ret = wasm.wasmcontentconfig_keepInlineImagesIn(this.__wbg_ptr);
1870
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]);
1871
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
1872
+ return v1;
1873
+ }
1874
+ /**
1875
+ * @returns {number}
1876
+ */
1877
+ get listIndentWidth() {
1878
+ const ret = wasm.wasmcontentconfig_listIndentWidth(this.__wbg_ptr);
1879
+ return ret >>> 0;
1880
+ }
1836
1881
  /**
1837
1882
  * @returns {number | undefined}
1838
1883
  */
@@ -1854,8 +1899,15 @@ export class WasmContentConfig {
1854
1899
  * @param {boolean | null} [includeDocumentStructure]
1855
1900
  * @param {boolean | null} [extractMetadata]
1856
1901
  * @param {number | null} [maxDepth]
1857
- */
1858
- constructor(outputFormat, preprocessingPreset, removeNavigation, removeForms, stripTags, preserveTags, excludeSelectors, skipImages, wrap, wrapWidth, includeDocumentStructure, extractMetadata, maxDepth) {
1902
+ * @param {boolean | null} [stripNewlines]
1903
+ * @param {string | null} [bullets]
1904
+ * @param {number | null} [listIndentWidth]
1905
+ * @param {string | null} [strongEmSymbol]
1906
+ * @param {boolean | null} [compactTables]
1907
+ * @param {string[] | null} [keepInlineImagesIn]
1908
+ * @param {boolean | null} [keepHidden]
1909
+ */
1910
+ constructor(outputFormat, preprocessingPreset, removeNavigation, removeForms, stripTags, preserveTags, excludeSelectors, skipImages, wrap, wrapWidth, includeDocumentStructure, extractMetadata, maxDepth, stripNewlines, bullets, listIndentWidth, strongEmSymbol, compactTables, keepInlineImagesIn, keepHidden) {
1859
1911
  var ptr0 = isLikeNone(outputFormat) ? 0 : passStringToWasm0(outputFormat, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1860
1912
  var len0 = WASM_VECTOR_LEN;
1861
1913
  var ptr1 = isLikeNone(preprocessingPreset) ? 0 : passStringToWasm0(preprocessingPreset, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
@@ -1866,7 +1918,13 @@ export class WasmContentConfig {
1866
1918
  var len3 = WASM_VECTOR_LEN;
1867
1919
  var ptr4 = isLikeNone(excludeSelectors) ? 0 : passArrayJsValueToWasm0(excludeSelectors, wasm.__wbindgen_malloc);
1868
1920
  var len4 = WASM_VECTOR_LEN;
1869
- const ret = wasm.wasmcontentconfig_new(ptr0, len0, ptr1, len1, isLikeNone(removeNavigation) ? 0xFFFFFF : removeNavigation ? 1 : 0, isLikeNone(removeForms) ? 0xFFFFFF : removeForms ? 1 : 0, ptr2, len2, ptr3, len3, ptr4, len4, isLikeNone(skipImages) ? 0xFFFFFF : skipImages ? 1 : 0, isLikeNone(wrap) ? 0xFFFFFF : wrap ? 1 : 0, isLikeNone(wrapWidth) ? Number.MAX_SAFE_INTEGER : (wrapWidth) >>> 0, isLikeNone(includeDocumentStructure) ? 0xFFFFFF : includeDocumentStructure ? 1 : 0, isLikeNone(extractMetadata) ? 0xFFFFFF : extractMetadata ? 1 : 0, isLikeNone(maxDepth) ? Number.MAX_SAFE_INTEGER : (maxDepth) >>> 0);
1921
+ var ptr5 = isLikeNone(bullets) ? 0 : passStringToWasm0(bullets, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1922
+ var len5 = WASM_VECTOR_LEN;
1923
+ var ptr6 = isLikeNone(strongEmSymbol) ? 0 : passStringToWasm0(strongEmSymbol, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1924
+ var len6 = WASM_VECTOR_LEN;
1925
+ var ptr7 = isLikeNone(keepInlineImagesIn) ? 0 : passArrayJsValueToWasm0(keepInlineImagesIn, wasm.__wbindgen_malloc);
1926
+ var len7 = WASM_VECTOR_LEN;
1927
+ const ret = wasm.wasmcontentconfig_new(ptr0, len0, ptr1, len1, isLikeNone(removeNavigation) ? 0xFFFFFF : removeNavigation ? 1 : 0, isLikeNone(removeForms) ? 0xFFFFFF : removeForms ? 1 : 0, ptr2, len2, ptr3, len3, ptr4, len4, isLikeNone(skipImages) ? 0xFFFFFF : skipImages ? 1 : 0, isLikeNone(wrap) ? 0xFFFFFF : wrap ? 1 : 0, isLikeNone(wrapWidth) ? Number.MAX_SAFE_INTEGER : (wrapWidth) >>> 0, isLikeNone(includeDocumentStructure) ? 0xFFFFFF : includeDocumentStructure ? 1 : 0, isLikeNone(extractMetadata) ? 0xFFFFFF : extractMetadata ? 1 : 0, isLikeNone(maxDepth) ? Number.MAX_SAFE_INTEGER : (maxDepth) >>> 0, isLikeNone(stripNewlines) ? 0xFFFFFF : stripNewlines ? 1 : 0, ptr5, len5, isLikeNone(listIndentWidth) ? Number.MAX_SAFE_INTEGER : (listIndentWidth) >>> 0, ptr6, len6, isLikeNone(compactTables) ? 0xFFFFFF : compactTables ? 1 : 0, ptr7, len7, isLikeNone(keepHidden) ? 0xFFFFFF : keepHidden ? 1 : 0);
1870
1928
  this.__wbg_ptr = ret;
1871
1929
  WasmContentConfigFinalization.register(this, this.__wbg_ptr, this);
1872
1930
  return this;
@@ -1924,6 +1982,20 @@ export class WasmContentConfig {
1924
1982
  const ret = wasm.wasmcontentconfig_removeNavigation(this.__wbg_ptr);
1925
1983
  return ret !== 0;
1926
1984
  }
1985
+ /**
1986
+ * @param {string} value
1987
+ */
1988
+ set bullets(value) {
1989
+ const ptr0 = passStringToWasm0(value, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1990
+ const len0 = WASM_VECTOR_LEN;
1991
+ wasm.wasmcontentconfig_set_bullets(this.__wbg_ptr, ptr0, len0);
1992
+ }
1993
+ /**
1994
+ * @param {boolean} value
1995
+ */
1996
+ set compactTables(value) {
1997
+ wasm.wasmcontentconfig_set_compactTables(this.__wbg_ptr, value);
1998
+ }
1927
1999
  /**
1928
2000
  * @param {string[]} value
1929
2001
  */
@@ -1944,6 +2016,26 @@ export class WasmContentConfig {
1944
2016
  set includeDocumentStructure(value) {
1945
2017
  wasm.wasmcontentconfig_set_includeDocumentStructure(this.__wbg_ptr, value);
1946
2018
  }
2019
+ /**
2020
+ * @param {boolean} value
2021
+ */
2022
+ set keepHidden(value) {
2023
+ wasm.wasmcontentconfig_set_keepHidden(this.__wbg_ptr, value);
2024
+ }
2025
+ /**
2026
+ * @param {string[]} value
2027
+ */
2028
+ set keepInlineImagesIn(value) {
2029
+ const ptr0 = passArrayJsValueToWasm0(value, wasm.__wbindgen_malloc);
2030
+ const len0 = WASM_VECTOR_LEN;
2031
+ wasm.wasmcontentconfig_set_keepInlineImagesIn(this.__wbg_ptr, ptr0, len0);
2032
+ }
2033
+ /**
2034
+ * @param {number} value
2035
+ */
2036
+ set listIndentWidth(value) {
2037
+ wasm.wasmcontentconfig_set_listIndentWidth(this.__wbg_ptr, value);
2038
+ }
1947
2039
  /**
1948
2040
  * @param {number | null} [value]
1949
2041
  */
@@ -1992,6 +2084,12 @@ export class WasmContentConfig {
1992
2084
  set skipImages(value) {
1993
2085
  wasm.wasmcontentconfig_set_skipImages(this.__wbg_ptr, value);
1994
2086
  }
2087
+ /**
2088
+ * @param {boolean} value
2089
+ */
2090
+ set stripNewlines(value) {
2091
+ wasm.wasmcontentconfig_set_stripNewlines(this.__wbg_ptr, value);
2092
+ }
1995
2093
  /**
1996
2094
  * @param {string[]} value
1997
2095
  */
@@ -2000,6 +2098,14 @@ export class WasmContentConfig {
2000
2098
  const len0 = WASM_VECTOR_LEN;
2001
2099
  wasm.wasmcontentconfig_set_stripTags(this.__wbg_ptr, ptr0, len0);
2002
2100
  }
2101
+ /**
2102
+ * @param {string} value
2103
+ */
2104
+ set strongEmSymbol(value) {
2105
+ const ptr0 = passStringToWasm0(value, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
2106
+ const len0 = WASM_VECTOR_LEN;
2107
+ wasm.wasmcontentconfig_set_strongEmSymbol(this.__wbg_ptr, ptr0, len0);
2108
+ }
2003
2109
  /**
2004
2110
  * @param {number} value
2005
2111
  */
@@ -2019,6 +2125,13 @@ export class WasmContentConfig {
2019
2125
  const ret = wasm.wasmcontentconfig_skipImages(this.__wbg_ptr);
2020
2126
  return ret !== 0;
2021
2127
  }
2128
+ /**
2129
+ * @returns {boolean}
2130
+ */
2131
+ get stripNewlines() {
2132
+ const ret = wasm.wasmcontentconfig_stripNewlines(this.__wbg_ptr);
2133
+ return ret !== 0;
2134
+ }
2022
2135
  /**
2023
2136
  * @returns {string[]}
2024
2137
  */
@@ -2028,6 +2141,21 @@ export class WasmContentConfig {
2028
2141
  wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
2029
2142
  return v1;
2030
2143
  }
2144
+ /**
2145
+ * @returns {string}
2146
+ */
2147
+ get strongEmSymbol() {
2148
+ let deferred1_0;
2149
+ let deferred1_1;
2150
+ try {
2151
+ const ret = wasm.wasmcontentconfig_strongEmSymbol(this.__wbg_ptr);
2152
+ deferred1_0 = ret[0];
2153
+ deferred1_1 = ret[1];
2154
+ return getStringFromWasm0(ret[0], ret[1]);
2155
+ } finally {
2156
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
2157
+ }
2158
+ }
2031
2159
  /**
2032
2160
  * @returns {number}
2033
2161
  */
@@ -2054,7 +2182,10 @@ export const WasmContentFilterKind = Object.freeze({
2054
2182
  });
2055
2183
 
2056
2184
  /**
2057
- * Information about an HTTP cookie received from a response.
2185
+ * Information about a cookie that a crawled page set.
2186
+ *
2187
+ * A crawl result gives `domain` and `path` as the browser stores the cookie, so a cookie has
2188
+ * the same fields whether an HTTP fetch or the browser received it.
2058
2189
  */
2059
2190
  export class WasmCookieInfo {
2060
2191
  static __wrap(ptr) {
@@ -3518,8 +3649,9 @@ export class WasmCrawlPageResult {
3518
3649
  * @param {any | null} [extractedData]
3519
3650
  * @param {WasmExtractionMeta | null} [extractionMeta]
3520
3651
  * @param {WasmDownloadedDocument | null} [downloadedDocument]
3652
+ * @param {string | null} [originalUrl]
3521
3653
  */
3522
- constructor(url, normalizedUrl, statusCode, contentType, html, bodySize, metadata, links, images, feeds, jsonLd, depth, stayedOnDomain, wasSkipped, isPdf, browserUsed, finalUrl, redirectCount, noindexDetected, nofollowDetected, ssrfRefusedUrls, detectedCharset, markdown, extractedData, extractionMeta, downloadedDocument) {
3654
+ constructor(url, normalizedUrl, statusCode, contentType, html, bodySize, metadata, links, images, feeds, jsonLd, depth, stayedOnDomain, wasSkipped, isPdf, browserUsed, finalUrl, redirectCount, noindexDetected, nofollowDetected, ssrfRefusedUrls, detectedCharset, markdown, extractedData, extractionMeta, downloadedDocument, originalUrl) {
3523
3655
  var ptr0 = isLikeNone(url) ? 0 : passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
3524
3656
  var len0 = WASM_VECTOR_LEN;
3525
3657
  var ptr1 = isLikeNone(normalizedUrl) ? 0 : passStringToWasm0(normalizedUrl, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
@@ -3562,7 +3694,9 @@ export class WasmCrawlPageResult {
3562
3694
  _assertClass(downloadedDocument, WasmDownloadedDocument);
3563
3695
  ptr14 = downloadedDocument.__destroy_into_raw();
3564
3696
  }
3565
- const ret = wasm.wasmcrawlpageresult_new(ptr0, len0, ptr1, len1, isLikeNone(statusCode) ? 0xFFFFFF : statusCode, ptr2, len2, ptr3, len3, isLikeNone(bodySize) ? Number.MAX_SAFE_INTEGER : (bodySize) >>> 0, ptr4, ptr5, len5, ptr6, len6, ptr7, len7, ptr8, len8, isLikeNone(depth) ? Number.MAX_SAFE_INTEGER : (depth) >>> 0, isLikeNone(stayedOnDomain) ? 0xFFFFFF : stayedOnDomain ? 1 : 0, isLikeNone(wasSkipped) ? 0xFFFFFF : wasSkipped ? 1 : 0, isLikeNone(isPdf) ? 0xFFFFFF : isPdf ? 1 : 0, isLikeNone(browserUsed) ? 0xFFFFFF : browserUsed ? 1 : 0, ptr9, len9, isLikeNone(redirectCount) ? Number.MAX_SAFE_INTEGER : (redirectCount) >>> 0, isLikeNone(noindexDetected) ? 0xFFFFFF : noindexDetected ? 1 : 0, isLikeNone(nofollowDetected) ? 0xFFFFFF : nofollowDetected ? 1 : 0, ptr10, len10, ptr11, len11, ptr12, isLikeNone(extractedData) ? 0 : addToExternrefTable0(extractedData), ptr13, ptr14);
3697
+ var ptr15 = isLikeNone(originalUrl) ? 0 : passStringToWasm0(originalUrl, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
3698
+ var len15 = WASM_VECTOR_LEN;
3699
+ const ret = wasm.wasmcrawlpageresult_new(ptr0, len0, ptr1, len1, isLikeNone(statusCode) ? 0xFFFFFF : statusCode, ptr2, len2, ptr3, len3, isLikeNone(bodySize) ? Number.MAX_SAFE_INTEGER : (bodySize) >>> 0, ptr4, ptr5, len5, ptr6, len6, ptr7, len7, ptr8, len8, isLikeNone(depth) ? Number.MAX_SAFE_INTEGER : (depth) >>> 0, isLikeNone(stayedOnDomain) ? 0xFFFFFF : stayedOnDomain ? 1 : 0, isLikeNone(wasSkipped) ? 0xFFFFFF : wasSkipped ? 1 : 0, isLikeNone(isPdf) ? 0xFFFFFF : isPdf ? 1 : 0, isLikeNone(browserUsed) ? 0xFFFFFF : browserUsed ? 1 : 0, ptr9, len9, isLikeNone(redirectCount) ? Number.MAX_SAFE_INTEGER : (redirectCount) >>> 0, isLikeNone(noindexDetected) ? 0xFFFFFF : noindexDetected ? 1 : 0, isLikeNone(nofollowDetected) ? 0xFFFFFF : nofollowDetected ? 1 : 0, ptr10, len10, ptr11, len11, ptr12, isLikeNone(extractedData) ? 0 : addToExternrefTable0(extractedData), ptr13, ptr14, ptr15, len15);
3566
3700
  this.__wbg_ptr = ret;
3567
3701
  WasmCrawlPageResultFinalization.register(this, this.__wbg_ptr, this);
3568
3702
  return this;
@@ -3596,6 +3730,21 @@ export class WasmCrawlPageResult {
3596
3730
  wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
3597
3731
  }
3598
3732
  }
3733
+ /**
3734
+ * @returns {string}
3735
+ */
3736
+ get originalUrl() {
3737
+ let deferred1_0;
3738
+ let deferred1_1;
3739
+ try {
3740
+ const ret = wasm.wasmcrawlpageresult_originalUrl(this.__wbg_ptr);
3741
+ deferred1_0 = ret[0];
3742
+ deferred1_1 = ret[1];
3743
+ return getStringFromWasm0(ret[0], ret[1]);
3744
+ } finally {
3745
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
3746
+ }
3747
+ }
3599
3748
  /**
3600
3749
  * @returns {number}
3601
3750
  */
@@ -3757,6 +3906,14 @@ export class WasmCrawlPageResult {
3757
3906
  const len0 = WASM_VECTOR_LEN;
3758
3907
  wasm.wasmcrawlpageresult_set_normalizedUrl(this.__wbg_ptr, ptr0, len0);
3759
3908
  }
3909
+ /**
3910
+ * @param {string} value
3911
+ */
3912
+ set originalUrl(value) {
3913
+ const ptr0 = passStringToWasm0(value, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
3914
+ const len0 = WASM_VECTOR_LEN;
3915
+ wasm.wasmcrawlpageresult_set_originalUrl(this.__wbg_ptr, ptr0, len0);
3916
+ }
3760
3917
  /**
3761
3918
  * @param {number} value
3762
3919
  */
@@ -5776,15 +5933,18 @@ export class WasmLinkInfo {
5776
5933
  * @param {WasmLinkType | null} [linkType]
5777
5934
  * @param {boolean | null} [nofollow]
5778
5935
  * @param {string | null} [rel]
5936
+ * @param {string | null} [originalUrl]
5779
5937
  */
5780
- constructor(url, text, linkType, nofollow, rel) {
5938
+ constructor(url, text, linkType, nofollow, rel, originalUrl) {
5781
5939
  var ptr0 = isLikeNone(url) ? 0 : passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5782
5940
  var len0 = WASM_VECTOR_LEN;
5783
5941
  var ptr1 = isLikeNone(text) ? 0 : passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5784
5942
  var len1 = WASM_VECTOR_LEN;
5785
5943
  var ptr2 = isLikeNone(rel) ? 0 : passStringToWasm0(rel, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5786
5944
  var len2 = WASM_VECTOR_LEN;
5787
- const ret = wasm.wasmlinkinfo_new(ptr0, len0, ptr1, len1, isLikeNone(linkType) ? 4 : linkType, isLikeNone(nofollow) ? 0xFFFFFF : nofollow ? 1 : 0, ptr2, len2);
5945
+ var ptr3 = isLikeNone(originalUrl) ? 0 : passStringToWasm0(originalUrl, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5946
+ var len3 = WASM_VECTOR_LEN;
5947
+ const ret = wasm.wasmlinkinfo_new(ptr0, len0, ptr1, len1, isLikeNone(linkType) ? 4 : linkType, isLikeNone(nofollow) ? 0xFFFFFF : nofollow ? 1 : 0, ptr2, len2, ptr3, len3);
5788
5948
  this.__wbg_ptr = ret;
5789
5949
  WasmLinkInfoFinalization.register(this, this.__wbg_ptr, this);
5790
5950
  return this;
@@ -5796,6 +5956,21 @@ export class WasmLinkInfo {
5796
5956
  const ret = wasm.wasmlinkinfo_nofollow(this.__wbg_ptr);
5797
5957
  return ret !== 0;
5798
5958
  }
5959
+ /**
5960
+ * @returns {string}
5961
+ */
5962
+ get originalUrl() {
5963
+ let deferred1_0;
5964
+ let deferred1_1;
5965
+ try {
5966
+ const ret = wasm.wasmlinkinfo_originalUrl(this.__wbg_ptr);
5967
+ deferred1_0 = ret[0];
5968
+ deferred1_1 = ret[1];
5969
+ return getStringFromWasm0(ret[0], ret[1]);
5970
+ } finally {
5971
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
5972
+ }
5973
+ }
5799
5974
  /**
5800
5975
  * @returns {string | undefined}
5801
5976
  */
@@ -5820,6 +5995,14 @@ export class WasmLinkInfo {
5820
5995
  set nofollow(value) {
5821
5996
  wasm.wasmlinkinfo_set_nofollow(this.__wbg_ptr, value);
5822
5997
  }
5998
+ /**
5999
+ * @param {string} value
6000
+ */
6001
+ set originalUrl(value) {
6002
+ const ptr0 = passStringToWasm0(value, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
6003
+ const len0 = WASM_VECTOR_LEN;
6004
+ wasm.wasmlinkinfo_set_originalUrl(this.__wbg_ptr, ptr0, len0);
6005
+ }
5823
6006
  /**
5824
6007
  * @param {string | null} [value]
5825
6008
  */
@@ -9070,7 +9253,7 @@ function __wbg_get_imports() {
9070
9253
  const a = state0.a;
9071
9254
  state0.a = 0;
9072
9255
  try {
9073
- return wasm_bindgen__convert__closures_____invoke__h8ad11faaa2905452(a, state0.b, arg0, arg1);
9256
+ return wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined_______true_(a, state0.b, arg0, arg1);
9074
9257
  } finally {
9075
9258
  state0.a = a;
9076
9259
  }
@@ -9364,13 +9547,13 @@ function __wbg_get_imports() {
9364
9547
  return ret;
9365
9548
  },
9366
9549
  __wbindgen_generic_0000000000000001: function(arg0, arg1) {
9367
- // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1331, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
9368
- const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2eedacf566f3748c);
9550
+ // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1467, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
9551
+ const ret = makeMutClosure(arg0, arg1, wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___wasm_bindgen_ceaac9754e66b2fe___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_ceaac9754e66b2fe___JsError___true_);
9369
9552
  return ret;
9370
9553
  },
9371
9554
  __wbindgen_generic_0000000000000002: function(arg0, arg1) {
9372
- // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1222, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
9373
- const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h3a7ccac3e94bbb5c);
9555
+ // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1309, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
9556
+ const ret = makeMutClosure(arg0, arg1, wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke_______true_);
9374
9557
  return ret;
9375
9558
  },
9376
9559
  __wbindgen_generic_0000000000000003: function(arg0) {
@@ -9409,19 +9592,19 @@ function __wbg_get_imports() {
9409
9592
  };
9410
9593
  }
9411
9594
 
9412
- function wasm_bindgen__convert__closures_____invoke__h3a7ccac3e94bbb5c(arg0, arg1) {
9413
- wasm.wasm_bindgen__convert__closures_____invoke__h3a7ccac3e94bbb5c(arg0, arg1);
9595
+ function wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke_______true_(arg0, arg1) {
9596
+ wasm.wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke_______true_(arg0, arg1);
9414
9597
  }
9415
9598
 
9416
- function wasm_bindgen__convert__closures_____invoke__h2eedacf566f3748c(arg0, arg1, arg2) {
9417
- const ret = wasm.wasm_bindgen__convert__closures_____invoke__h2eedacf566f3748c(arg0, arg1, arg2);
9599
+ function wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___wasm_bindgen_ceaac9754e66b2fe___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_ceaac9754e66b2fe___JsError___true_(arg0, arg1, arg2) {
9600
+ const ret = wasm.wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___wasm_bindgen_ceaac9754e66b2fe___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_ceaac9754e66b2fe___JsError___true_(arg0, arg1, arg2);
9418
9601
  if (ret[1]) {
9419
9602
  throw takeFromExternrefTable0(ret[0]);
9420
9603
  }
9421
9604
  }
9422
9605
 
9423
- function wasm_bindgen__convert__closures_____invoke__h8ad11faaa2905452(arg0, arg1, arg2, arg3) {
9424
- wasm.wasm_bindgen__convert__closures_____invoke__h8ad11faaa2905452(arg0, arg1, arg2, arg3);
9606
+ function wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined_______true_(arg0, arg1, arg2, arg3) {
9607
+ wasm.wasm_bindgen_ceaac9754e66b2fe___convert__closures_____invoke___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined___js_sys_6b40a5061b778857___Function_fn_wasm_bindgen_ceaac9754e66b2fe___JsValue_____wasm_bindgen_ceaac9754e66b2fe___sys__Undefined_______true_(arg0, arg1, arg2, arg3);
9425
9608
  }
9426
9609
 
9427
9610
 
Binary file