portadom 1.0.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.
Files changed (38) hide show
  1. package/README.md +202 -0
  2. package/dist/cjs/dom/dom.d.ts +19 -0
  3. package/dist/cjs/dom/dom.js +813 -0
  4. package/dist/cjs/dom/dom.js.map +1 -0
  5. package/dist/cjs/dom/domUtils.d.ts +42 -0
  6. package/dist/cjs/dom/domUtils.js +126 -0
  7. package/dist/cjs/dom/domUtils.js.map +1 -0
  8. package/dist/cjs/dom/types.d.ts +371 -0
  9. package/dist/cjs/dom/types.js +216 -0
  10. package/dist/cjs/dom/types.js.map +1 -0
  11. package/dist/cjs/index.d.ts +6 -0
  12. package/dist/cjs/index.js +22 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/page/page.d.ts +12 -0
  15. package/dist/cjs/page/page.js +105 -0
  16. package/dist/cjs/page/page.js.map +1 -0
  17. package/dist/cjs/page/pageUtils.d.ts +16 -0
  18. package/dist/cjs/page/pageUtils.js +116 -0
  19. package/dist/cjs/page/pageUtils.js.map +1 -0
  20. package/dist/cjs/page/types.d.ts +61 -0
  21. package/dist/cjs/page/types.js +3 -0
  22. package/dist/cjs/page/types.js.map +1 -0
  23. package/dist/cjs/utils/async.d.ts +19 -0
  24. package/dist/cjs/utils/async.js +74 -0
  25. package/dist/cjs/utils/async.js.map +1 -0
  26. package/dist/cjs/utils/error.d.ts +1 -0
  27. package/dist/cjs/utils/error.js +10 -0
  28. package/dist/cjs/utils/error.js.map +1 -0
  29. package/dist/cjs/utils/format.d.ts +9 -0
  30. package/dist/cjs/utils/format.js +19 -0
  31. package/dist/cjs/utils/format.js.map +1 -0
  32. package/dist/cjs/utils/types.d.ts +6 -0
  33. package/dist/cjs/utils/types.js +9 -0
  34. package/dist/cjs/utils/types.js.map +1 -0
  35. package/dist/cjs/utils/url.d.ts +9 -0
  36. package/dist/cjs/utils/url.js +32 -0
  37. package/dist/cjs/utils/url.js.map +1 -0
  38. package/package.json +68 -0
@@ -0,0 +1,371 @@
1
+ import type { StrAsNumOptions } from '../utils/format';
2
+ import type { FormatUrlOptions } from '../utils/url';
3
+ import type { MaybeArray, MaybePromise } from '../utils/types';
4
+ /**
5
+ * Common interface for working with DOM despite different environments.
6
+ *
7
+ * Consider these environments:
8
+ * 1) Browser (via Playwright & Chromium) - uses Browser API to work with DOM
9
+ * 2) Cheerio - uses own API to work with DOM
10
+ *
11
+ * This common interfaces makes the scraping code more portable between the two.
12
+ */
13
+ export interface Portadom<El extends BaseEl, BaseEl> {
14
+ node: El | null;
15
+ /** Get element's text (trimmed) */
16
+ text: (options?: {
17
+ allowEmpty?: boolean;
18
+ }) => MaybePromise<string | null>;
19
+ /** Get element's text as uppercase (trimmed) */
20
+ textAsUpper: (options?: {
21
+ allowEmpty?: boolean;
22
+ }) => MaybePromise<string | null>;
23
+ /** Get element's text as lowercase (trimmed) */
24
+ textAsLower: (options?: {
25
+ allowEmpty?: boolean;
26
+ }) => MaybePromise<string | null>;
27
+ /** Get element's text and convert it to number */
28
+ textAsNumber: (options?: StrAsNumOptions) => MaybePromise<number | null>;
29
+ /** Get element's attribute */
30
+ attr: (attrName: string, options?: {
31
+ allowEmpty?: boolean;
32
+ }) => MaybePromise<string | null>;
33
+ /** Get element's attributes */
34
+ attrs: <T extends string>(attrNames: T[], options?: {
35
+ allowEmpty?: boolean;
36
+ }) => MaybePromise<Record<T, string | null>>;
37
+ /** Get element's property */
38
+ prop: <R = unknown>(
39
+ /** Single or nested prop path */
40
+ propName: MaybeArray<string>, options?: {
41
+ allowEmpty?: boolean;
42
+ }) => MaybePromise<R>;
43
+ /** Get element's properties */
44
+ props: <R extends any[]>(
45
+ /** List of single or nested prop paths */
46
+ propName: MaybeArray<string>[], options?: {
47
+ allowEmpty?: boolean;
48
+ }) => MaybePromise<R>;
49
+ /** Get element's href */
50
+ href: (options?: {
51
+ allowEmpty?: boolean;
52
+ } & FormatUrlOptions) => MaybePromise<string | null>;
53
+ /** Get element's src */
54
+ src: (options?: {
55
+ allowEmpty?: boolean;
56
+ } & FormatUrlOptions) => MaybePromise<string | null>;
57
+ /** Get element's nodeName */
58
+ nodeName: () => MaybePromise<string | null>;
59
+ /** Get URL of website associated with the DOM */
60
+ url: () => MaybePromise<string | null>;
61
+ /** Freely modify the underlying DOM node */
62
+ map: <TVal>(map: (node: El | null) => TVal) => MaybePromise<TVal>;
63
+ /** Get a single descendant matching the selector */
64
+ findOne: <TNewEl extends BaseEl = El>(selector: string) => PortadomPromise<TNewEl, BaseEl>;
65
+ /** Get all descendants matching the selector */
66
+ findMany: <TNewEl extends BaseEl = El>(selector: string) => PortadomArrayPromise<TNewEl, BaseEl>;
67
+ /** Get a single ancestor (or itself) matching the selector */
68
+ closest: <TNewEl extends BaseEl = El>(selector: string) => PortadomPromise<TNewEl, BaseEl>;
69
+ /** Get element's parent */
70
+ parent: <TNewEl extends BaseEl = El>() => PortadomPromise<TNewEl, BaseEl>;
71
+ /** Get element's children */
72
+ children: <TNewEl extends BaseEl = El>() => PortadomArrayPromise<TNewEl, BaseEl>;
73
+ /** Remove the element */
74
+ remove: () => MaybePromise<void>;
75
+ /** Get root element */
76
+ root: <TNewEl extends BaseEl = El>() => PortadomPromise<TNewEl, BaseEl>;
77
+ /**
78
+ * Given two elements, return closest ancestor element that encompases them both,
79
+ * or `null` if none such found.
80
+ */
81
+ getCommonAncestor: <TNewEl extends BaseEl = El>(otherEl: El) => PortadomPromise<TNewEl, BaseEl>;
82
+ /**
83
+ * Given a selector, find all DOM elements that match the selector,
84
+ * and return closest ancestor element that encompases them all,
85
+ * or `null` if none such found.
86
+ */
87
+ getCommonAncestorFromSelector: <TNewEl extends BaseEl = El>(selector: string) => PortadomPromise<TNewEl, BaseEl>;
88
+ }
89
+ /**
90
+ * Wrapper for a {@link Promise} that resolves to a {@link Portadom} instance. This allows us to chain
91
+ * Portadom methods before the Promise is resolved.
92
+ *
93
+ * Example:
94
+ *
95
+ * ```js
96
+ * const dom = Promise.resolve(browserPortadom({}));
97
+ * ```
98
+ *
99
+ * Instead of:
100
+ * ```js
101
+ * const resA = await (await dom).findOne('..');
102
+ * const resB = await (await dom).text();
103
+ * ```
104
+ *
105
+ * You can call:
106
+ * ```js
107
+ * const domP = createPortadomPromise(dom);
108
+ * const resA = await domP.findOne('..');
109
+ * const resB = await domP.text();
110
+ * ```
111
+ */
112
+ export interface PortadomPromise<El extends BaseEl, BaseEl> {
113
+ promise: Promise<Portadom<El, BaseEl> | null>;
114
+ node: Promise<NonNullable<El> | null>;
115
+ /** Get element's text (trimmed) */
116
+ text: (...args: Parameters<Portadom<El, BaseEl>['text']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['text']>>>;
117
+ /** Get element's text as uppercase (trimmed) */
118
+ textAsUpper: (...args: Parameters<Portadom<El, BaseEl>['textAsUpper']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['textAsUpper']>>>;
119
+ /** Get element's text as lowercase (trimmed) */
120
+ textAsLower: (...args: Parameters<Portadom<El, BaseEl>['textAsLower']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['textAsLower']>>>;
121
+ /** Get element's text and convert it to number */
122
+ textAsNumber: (...args: Parameters<Portadom<El, BaseEl>['textAsNumber']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['textAsNumber']>>>;
123
+ /** Get element's attribute */
124
+ attr: (...args: Parameters<Portadom<El, BaseEl>['attr']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['attr']>>>;
125
+ /** Get element's attributes */
126
+ attrs: <Attrs extends string>(...args: [attrNames: Attrs[], options?: {
127
+ allowEmpty?: boolean;
128
+ }]) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['attrs']> | null>>;
129
+ /** Get element's property */
130
+ prop: <R = unknown>(...args: Parameters<Portadom<El, BaseEl>['prop']>) => Promise<R | null>;
131
+ /** Get element's properties */
132
+ props: <R extends any[]>(...args: Parameters<Portadom<El, BaseEl>['props']>) => Promise<R | null>;
133
+ /** Get element's href */
134
+ href: (...args: Parameters<Portadom<El, BaseEl>['href']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['href']>>>;
135
+ /** Get element's src */
136
+ src: (...args: Parameters<Portadom<El, BaseEl>['src']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['src']>>>;
137
+ /** Get element's nodeName */
138
+ nodeName: (...args: Parameters<Portadom<El, BaseEl>['nodeName']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['nodeName']>>>;
139
+ /** Get URL of website associated with the DOM */
140
+ url: (...args: Parameters<Portadom<El, BaseEl>['url']>) => Promise<Awaited<ReturnType<Portadom<El, BaseEl>['url']>>>;
141
+ /** Freely modify the underlying DOM node */
142
+ map: <TVal>(...args: [map: (node: El | null) => TVal]) => Promise<TVal | null>;
143
+ /** Get a single descendant matching the selector */
144
+ findOne: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['findOne']>) => PortadomPromise<TNewEl, BaseEl>;
145
+ /** Get all descendants matching the selector */
146
+ findMany: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['findMany']>) => PortadomArrayPromise<TNewEl, BaseEl>;
147
+ /** Get a single ancestor (or itself) matching the selector */
148
+ closest: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['closest']>) => PortadomPromise<TNewEl, BaseEl>;
149
+ /** Get element's parent */
150
+ parent: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['parent']>) => PortadomPromise<TNewEl, BaseEl>;
151
+ /** Get element's children */
152
+ children: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['children']>) => PortadomArrayPromise<TNewEl, BaseEl>;
153
+ /** Remove the element */
154
+ remove: (...args: Parameters<Portadom<El, BaseEl>['remove']>) => MaybePromise<void>;
155
+ /** Get root element */
156
+ root: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['root']>) => PortadomPromise<TNewEl, BaseEl>;
157
+ /**
158
+ * Given two elements, return closest ancestor element that encompases them both,
159
+ * or `null` if none such found.
160
+ */
161
+ getCommonAncestor: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['getCommonAncestor']>) => PortadomPromise<TNewEl, BaseEl>;
162
+ /**
163
+ * Given a selector, find all DOM elements that match the selector,
164
+ * and return closest ancestor element that encompases them all,
165
+ * or `null` if none such found.
166
+ */
167
+ getCommonAncestorFromSelector: <TNewEl extends BaseEl = El>(...args: Parameters<Portadom<El, BaseEl>['getCommonAncestorFromSelector']>) => PortadomPromise<TNewEl, BaseEl>;
168
+ }
169
+ /**
170
+ * Wrapper for a {@link Promise} that resolves to a {@link Portadom} instance. This allows us to chain
171
+ * Portadom methods before the Promise is resolved.
172
+ *
173
+ * Example:
174
+ *
175
+ * ```js
176
+ * const dom = Promise.resolve(browserPortadom({}));
177
+ * ```
178
+ *
179
+ * Instead of:
180
+ * ```js
181
+ * const resA = await (await dom).findOne('..');
182
+ * const resB = await (await dom).text();
183
+ * ```
184
+ *
185
+ * You can call:
186
+ * ```js
187
+ * const domP = createPortadomPromise(dom);
188
+ * const resA = await domP.findOne('..');
189
+ * const resB = await domP.text();
190
+ * ```
191
+ */
192
+ export declare const createPortadomPromise: <El extends BaseEl, BaseEl>(promiseDom: MaybePromise<Portadom<El, BaseEl> | null>) => PortadomPromise<El, BaseEl>;
193
+ /**
194
+ * Wrapper for a {@link Promise} that resolves to a n Array of {@link Portadom} instances. This allows us to chain
195
+ * Portadom methods before the Promise is resolved.
196
+ *
197
+ * Example:
198
+ *
199
+ * ```js
200
+ * const dom = Promise.resolve(browserPortadom({}));
201
+ * ```
202
+ *
203
+ * Instead of:
204
+ * ```js
205
+ * const resA = await (await dom).findOne('..');
206
+ * const resB = await (await dom).text();
207
+ * ```
208
+ *
209
+ * You can call:
210
+ * ```js
211
+ * const domP = createPortadomArrayPromise(dom);
212
+ * const resA = await domP.findOne('..');
213
+ * const resB = await domP.text();
214
+ * ```
215
+ */
216
+ export interface PortadomArrayPromise<El extends BaseEl, BaseEl> {
217
+ /** Wrapped Promise of an array of {@link Portadom} instances */
218
+ promise: Promise<Portadom<El, BaseEl>[]>;
219
+ /** Wrapper for {@link Array.at} that returns the resulting item as {@link PortadomPromise}. */
220
+ at: (...args: Parameters<Portadom<El, BaseEl>[]['at']>) => PortadomPromise<El, BaseEl>;
221
+ /**
222
+ * Wrapper for {@link Array.concat} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
223
+ *
224
+ * NOTE: The concat values are expected to be {@link Portadom} instances
225
+ */
226
+ concat: (...args: Parameters<Portadom<El, BaseEl>[]['concat']>) => PortadomArrayPromise<El, BaseEl>;
227
+ /**
228
+ * Wrapper for {@link Array.copyWithin} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
229
+ *
230
+ * NOTE: The concat values are expected to be {@link Portadom} instances
231
+ */
232
+ copyWithin: (...args: Parameters<Portadom<El, BaseEl>[]['copyWithin']>) => PortadomArrayPromise<El, BaseEl>;
233
+ /**
234
+ * Wrapper for {@link Array.entries}.
235
+ *
236
+ * NOTE: Does NOT return an instance of {@link PortadomArrayPromise}
237
+ */
238
+ entries: (...args: Parameters<Portadom<El, BaseEl>[]['entries']>) => Promise<IterableIterator<[number, Portadom<El, BaseEl>]>>;
239
+ /** Wrapper for {@link Array.every}. */
240
+ every: (...args: Parameters<Portadom<El, BaseEl>[]['every']>) => Promise<boolean>;
241
+ /**
242
+ * Wrapper for {@link Array.fill}.
243
+ *
244
+ * NOTE: Fill values can be anything, so result is NOT wrapped in an instance of {@link PortadomArrayPromise}.
245
+ *
246
+ * NOTE2: Unlike {@link Array.fill}, this option doesn't allow to specify `start` and `end`.
247
+ */
248
+ fill: <U>(...args: [value: U]) => Promise<U[]>;
249
+ /**
250
+ * Wrapper for {@link Array.filter} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
251
+ */
252
+ filter: (...args: Parameters<Portadom<El, BaseEl>[]['filter']>) => PortadomArrayPromise<El, BaseEl>;
253
+ /** Wrapper for {@link Array.find} that returns the resulting item as {@link PortadomPromise}. */
254
+ find: (...args: Parameters<Portadom<El, BaseEl>[]['find']>) => PortadomPromise<El, BaseEl>;
255
+ /** Wrapper for {@link Array.findIndex}. */
256
+ findIndex: (...args: Parameters<Portadom<El, BaseEl>[]['findIndex']>) => Promise<number>;
257
+ /** Wrapper for {@link Array.flat} that returns the resulting array wrapped in {@link PortadomArrayPromise}. */
258
+ flat: (...args: Parameters<Portadom<El, BaseEl>[]['flat']>) => PortadomArrayPromise<El, BaseEl>;
259
+ /**
260
+ * Wrapper for {@link Array.entries}.
261
+ *
262
+ * NOTE: Mapped values can be anything, so result is NOT wrapped in an instance of {@link PortadomArrayPromise}
263
+ */
264
+ flatMap: <U, This>(...args: [
265
+ callback: (this: This, value: Portadom<El, BaseEl>, index: number, array: Portadom<El, BaseEl>[]) => U | readonly U[],
266
+ thisArg?: This | undefined
267
+ ]) => Promise<U[]>;
268
+ /** Wrapper for {@link Array.forEach}. */
269
+ forEach: (...args: Parameters<Portadom<El, BaseEl>[]['forEach']>) => Promise<void>;
270
+ /** Wrapper for {@link Array.includes}. */
271
+ includes: (...args: Parameters<Portadom<El, BaseEl>[]['includes']>) => Promise<boolean>;
272
+ /** Wrapper for {@link Array.indexOf}. */
273
+ indexOf: (...args: Parameters<Portadom<El, BaseEl>[]['indexOf']>) => Promise<number>;
274
+ /** Wrapper for {@link Array.join}. */
275
+ join: (...args: Parameters<Portadom<El, BaseEl>[]['join']>) => Promise<string>;
276
+ /** Wrapper for {@link Array.keys}. */
277
+ keys: (...args: Parameters<Portadom<El, BaseEl>[]['keys']>) => Promise<IterableIterator<number>>;
278
+ /** Wrapper for {@link Array.lastIndexOf}. */
279
+ lastIndexOf: (...args: Parameters<Portadom<El, BaseEl>[]['lastIndexOf']>) => Promise<number>;
280
+ /** Wrapper for {@link Array.length}. */
281
+ length: Promise<number>;
282
+ /**
283
+ * Wrapper for {@link Array.map}.
284
+ *
285
+ * NOTE: Mapped values can be anything, so result is NOT wrapped in an instance of {@link PortadomArrayPromise}
286
+ */
287
+ map: <U>(...args: [
288
+ callbackfn: (value: Portadom<El, BaseEl>, index: number, array: Portadom<El, BaseEl>[]) => U,
289
+ thisArg?: any
290
+ ]) => Promise<U[]>;
291
+ /** Wrapper for {@link Array.pop} that returns the resulting item as {@link PortadomPromise}. */
292
+ pop: (...args: Parameters<Portadom<El, BaseEl>[]['pop']>) => PortadomPromise<El, BaseEl>;
293
+ /**
294
+ * Wrapper for {@link Array.push}.
295
+ *
296
+ * NOTE: The pushed values are expected to be {@link Portadom} instances.
297
+ */
298
+ push: (...args: Parameters<Portadom<El, BaseEl>[]['push']>) => Promise<number>;
299
+ /**
300
+ * Wrapper for {@link Array.reduce}.
301
+ *
302
+ * NOTE: The reduce value can be anything, so result is NOT wrapped in an instance of {@link PortadomArrayPromise}
303
+ */
304
+ reduce: {
305
+ (callbackfn: (previousValue: Portadom<El, BaseEl>, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => Portadom<El, BaseEl>): Promise<Portadom<El, BaseEl>>;
306
+ (callbackfn: (previousValue: Portadom<El, BaseEl>, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => Portadom<El, BaseEl>, initialValue: Portadom<El, BaseEl>): Promise<Portadom<El, BaseEl>>;
307
+ <U>(callbackfn: (previousValue: U, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => U, initialValue: U): Promise<U>;
308
+ };
309
+ /**
310
+ * Wrapper for {@link Array.reduceRight}.
311
+ *
312
+ * NOTE: The reduce value can be anything, so result is NOT wrapped in an instance of {@link PortadomArrayPromise}
313
+ */
314
+ reduceRight: {
315
+ reduceRight(callbackfn: (previousValue: Portadom<El, BaseEl>, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => Portadom<El, BaseEl>): Promise<Portadom<El, BaseEl>>;
316
+ reduceRight(callbackfn: (previousValue: Portadom<El, BaseEl>, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => Portadom<El, BaseEl>, initialValue: Portadom<El, BaseEl>): Promise<Portadom<El, BaseEl>>;
317
+ reduceRight<U>(callbackfn: (previousValue: U, currentValue: Portadom<El, BaseEl>, currentIndex: number, array: Portadom<El, BaseEl>[]) => U, initialValue: U): Promise<U>;
318
+ };
319
+ /**
320
+ * Wrapper for {@link Array.reverse} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
321
+ */
322
+ reverse: (...args: Parameters<Portadom<El, BaseEl>[]['reverse']>) => PortadomArrayPromise<El, BaseEl>;
323
+ /** Wrapper for {@link Array.shift} that returns the resulting item as {@link PortadomPromise}. */
324
+ shift: (...args: Parameters<Portadom<El, BaseEl>[]['shift']>) => PortadomPromise<El, BaseEl>;
325
+ /**
326
+ * Wrapper for {@link Array.slice} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
327
+ */
328
+ slice: (...args: Parameters<Portadom<El, BaseEl>[]['slice']>) => PortadomArrayPromise<El, BaseEl>;
329
+ /** Wrapper for {@link Array.some}. */
330
+ some: (...args: Parameters<Portadom<El, BaseEl>[]['some']>) => Promise<boolean>;
331
+ /**
332
+ * Wrapper for {@link Array.sort} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
333
+ */
334
+ sort: (...args: Parameters<Portadom<El, BaseEl>[]['sort']>) => PortadomArrayPromise<El, BaseEl>;
335
+ /**
336
+ * Wrapper for {@link Array.splice} that returns the resulting array wrapped in {@link PortadomArrayPromise}.
337
+ */
338
+ splice: (...args: Parameters<Portadom<El, BaseEl>[]['splice']>) => PortadomArrayPromise<El, BaseEl>;
339
+ /**
340
+ * Wrapper for {@link Array.unshift}.
341
+ *
342
+ * NOTE: The added values are expected to be {@link Portadom} instances.
343
+ */
344
+ unshift: (...args: Parameters<Portadom<El, BaseEl>[]['unshift']>) => Promise<number>;
345
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
346
+ values: (...args: Parameters<Portadom<El, BaseEl>[]['values']>) => Promise<IterableIterator<Portadom<El, BaseEl>>>;
347
+ }
348
+ /**
349
+ * Wrapper for a {@link Promise} that resolves to a n Array of {@link Portadom} instances. This allows us to chain
350
+ * Portadom methods before the Promise is resolved.
351
+ *
352
+ * Example:
353
+ *
354
+ * ```js
355
+ * const dom = Promise.resolve(browserPortadom({}));
356
+ * ```
357
+ *
358
+ * Instead of:
359
+ * ```js
360
+ * const resA = await (await dom).findOne('..');
361
+ * const resB = await (await dom).text();
362
+ * ```
363
+ *
364
+ * You can call:
365
+ * ```js
366
+ * const domP = createPortadomArrayPromise(dom);
367
+ * const resA = await domP.findOne('..');
368
+ * const resB = await domP.text();
369
+ * ```
370
+ */
371
+ export declare const createPortadomArrayPromise: <El extends BaseEl, BaseEl>(promiseDom: MaybePromise<Portadom<El, BaseEl>[]>) => PortadomArrayPromise<El, BaseEl>;
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createPortadomArrayPromise = exports.createPortadomPromise = void 0;
13
+ /**
14
+ * Wrapper for a {@link Promise} that resolves to a {@link Portadom} instance. This allows us to chain
15
+ * Portadom methods before the Promise is resolved.
16
+ *
17
+ * Example:
18
+ *
19
+ * ```js
20
+ * const dom = Promise.resolve(browserPortadom({}));
21
+ * ```
22
+ *
23
+ * Instead of:
24
+ * ```js
25
+ * const resA = await (await dom).findOne('..');
26
+ * const resB = await (await dom).text();
27
+ * ```
28
+ *
29
+ * You can call:
30
+ * ```js
31
+ * const domP = createPortadomPromise(dom);
32
+ * const resA = await domP.findOne('..');
33
+ * const resB = await domP.text();
34
+ * ```
35
+ */
36
+ const createPortadomPromise = (promiseDom) => {
37
+ const promise = Promise.resolve(promiseDom);
38
+ return {
39
+ promise,
40
+ get node() {
41
+ return promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.node) !== null && _a !== void 0 ? _a : null; });
42
+ },
43
+ ///////////////////////
44
+ // SCALAR OPERATIONS
45
+ ///////////////////////
46
+ /** Get element's text (trimmed) */
47
+ text: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.text(...args)) !== null && _a !== void 0 ? _a : null; }),
48
+ /** Get element's text as uppercase (trimmed) */
49
+ textAsUpper: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.textAsUpper(...args)) !== null && _a !== void 0 ? _a : null; }),
50
+ /** Get element's text as lowercase (trimmed) */
51
+ textAsLower: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.textAsLower(...args)) !== null && _a !== void 0 ? _a : null; }),
52
+ /** Get element's text and convert it to number */
53
+ textAsNumber: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.textAsNumber(...args)) !== null && _a !== void 0 ? _a : null; }),
54
+ /** Get element's attribute */
55
+ attr: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.attr(...args)) !== null && _a !== void 0 ? _a : null; }),
56
+ /** Get element's attributes */
57
+ attrs: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.attrs(...args)) !== null && _a !== void 0 ? _a : null; }),
58
+ /** Get element's property */
59
+ prop: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.prop(...args)) !== null && _a !== void 0 ? _a : null; }),
60
+ /** Get element's properties */
61
+ props: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.props(...args)) !== null && _a !== void 0 ? _a : null; }),
62
+ /** Get element's href */
63
+ href: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.href(...args)) !== null && _a !== void 0 ? _a : null; }),
64
+ /** Get element's src */
65
+ src: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.src(...args)) !== null && _a !== void 0 ? _a : null; }),
66
+ /** Get element's nodeName */
67
+ nodeName: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.nodeName(...args)) !== null && _a !== void 0 ? _a : null; }),
68
+ /** Get URL of website associated with the DOM */
69
+ url: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.url(...args)) !== null && _a !== void 0 ? _a : null; }),
70
+ /** Freely modify the underlying DOM node */
71
+ map: (...args) => promise.then((d) => { var _a; return (_a = d === null || d === void 0 ? void 0 : d.map(...args)) !== null && _a !== void 0 ? _a : null; }),
72
+ ///////////////////////
73
+ // NODE OPERATIONS
74
+ ///////////////////////
75
+ /** Get a single descendant matching the selector */
76
+ findOne: (...args) => {
77
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
78
+ var _a;
79
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.findOne(...args).promise)) !== null && _a !== void 0 ? _a : null;
80
+ return res;
81
+ })));
82
+ },
83
+ /** Get all descendants matching the selector */
84
+ findMany: (...args) => {
85
+ return (0, exports.createPortadomArrayPromise)(promise.then((d) => d ? d.findMany(...args).promise : []));
86
+ },
87
+ /** Get a single ancestor (or itself) matching the selector */
88
+ closest: (...args) => {
89
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
90
+ var _a;
91
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.closest(...args).promise)) !== null && _a !== void 0 ? _a : null;
92
+ return res;
93
+ })));
94
+ },
95
+ /** Get element's parent */
96
+ parent: (...args) => {
97
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
98
+ var _a;
99
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.parent(...args).promise)) !== null && _a !== void 0 ? _a : null;
100
+ return res;
101
+ })));
102
+ },
103
+ /** Get element's children */
104
+ children: (...args) => {
105
+ return (0, exports.createPortadomArrayPromise)(promise.then((d) => d ? d.children(...args).promise : []));
106
+ },
107
+ /** Get remove the element */
108
+ remove: (...args) => promise.then((d) => d === null || d === void 0 ? void 0 : d.remove(...args)),
109
+ /** Get root element */
110
+ root: (...args) => {
111
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
112
+ var _a;
113
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.root(...args).promise)) !== null && _a !== void 0 ? _a : null;
114
+ return res;
115
+ })));
116
+ },
117
+ /**
118
+ * Given two elements, return closest ancestor element that encompases them both,
119
+ * or `null` if none such found.
120
+ */
121
+ getCommonAncestor: (...args) => {
122
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
123
+ var _a;
124
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.getCommonAncestor(...args).promise)) !== null && _a !== void 0 ? _a : null;
125
+ return res;
126
+ })));
127
+ },
128
+ /**
129
+ * Given a selector, find all DOM elements that match the selector,
130
+ * and return closest ancestor element that encompases them all,
131
+ * or `null` if none such found.
132
+ */
133
+ getCommonAncestorFromSelector: (...args) => {
134
+ return (0, exports.createPortadomPromise)(promise.then((d) => __awaiter(void 0, void 0, void 0, function* () {
135
+ var _a;
136
+ const res = (_a = yield (d === null || d === void 0 ? void 0 : d.getCommonAncestorFromSelector(...args).promise)) !== null && _a !== void 0 ? _a : null;
137
+ return res;
138
+ })));
139
+ },
140
+ }; // prettier-ignore
141
+ };
142
+ exports.createPortadomPromise = createPortadomPromise;
143
+ /**
144
+ * Wrapper for a {@link Promise} that resolves to a n Array of {@link Portadom} instances. This allows us to chain
145
+ * Portadom methods before the Promise is resolved.
146
+ *
147
+ * Example:
148
+ *
149
+ * ```js
150
+ * const dom = Promise.resolve(browserPortadom({}));
151
+ * ```
152
+ *
153
+ * Instead of:
154
+ * ```js
155
+ * const resA = await (await dom).findOne('..');
156
+ * const resB = await (await dom).text();
157
+ * ```
158
+ *
159
+ * You can call:
160
+ * ```js
161
+ * const domP = createPortadomArrayPromise(dom);
162
+ * const resA = await domP.findOne('..');
163
+ * const resB = await domP.text();
164
+ * ```
165
+ */
166
+ const createPortadomArrayPromise = (promiseDom) => {
167
+ const promise = Promise.resolve(promiseDom);
168
+ return {
169
+ promise,
170
+ at: (...args) => (0, exports.createPortadomPromise)(promise.then((d) => { var _a; return (_a = d.at(...args)) !== null && _a !== void 0 ? _a : null; })),
171
+ /** NOTE: The concat values are expected to be Portadom instances */
172
+ concat: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.concat(...args))),
173
+ copyWithin: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.copyWithin(...args))),
174
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
175
+ entries: (...args) => promise.then((d) => d.entries(...args)),
176
+ every: (...args) => promise.then((d) => d.every(...args)),
177
+ /** NOTE: The fill value is expected to be a Portadom instance */
178
+ fill: (...args) => promise.then((d) => d.fill(...args)),
179
+ filter: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.filter(...args))),
180
+ find: (...args) => (0, exports.createPortadomPromise)(promise.then((d) => { var _a; return (_a = d.find(...args)) !== null && _a !== void 0 ? _a : null; })),
181
+ findIndex: (...args) => promise.then((d) => d.findIndex(...args)),
182
+ flat: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.flat(...args))),
183
+ /** NOTE: Items are expected to be mapped to Portadom instances */
184
+ flatMap: (...args) => promise.then((d) => d.flatMap(...args)),
185
+ forEach: (...args) => promise.then((d) => d.forEach(...args)),
186
+ includes: (...args) => promise.then((d) => d.includes(...args)),
187
+ indexOf: (...args) => promise.then((d) => d.indexOf(...args)),
188
+ join: (...args) => promise.then((d) => d.join(...args)),
189
+ keys: (...args) => promise.then((d) => d.keys(...args)),
190
+ lastIndexOf: (...args) => promise.then((d) => d.lastIndexOf(...args)),
191
+ get length() {
192
+ return promise.then((d) => d.length);
193
+ },
194
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
195
+ map: (...args) => promise.then((d) => d.map(...args)),
196
+ pop: (...args) => (0, exports.createPortadomPromise)(promise.then((d) => { var _a; return (_a = d.pop(...args)) !== null && _a !== void 0 ? _a : null; })),
197
+ push: (...args) => promise.then((d) => d.push(...args)),
198
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
199
+ // NOTE: reduce has a complex type, so let the type definition handle that
200
+ reduce: (...args) => promise.then((d) => d.reduce(...args)),
201
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
202
+ // NOTE: reduceRight has a complex type, so let the type definition handle that
203
+ reduceRight: ((...args) => promise.then((d) => d.reduceRight(...args))),
204
+ reverse: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.reverse(...args))),
205
+ shift: (...args) => (0, exports.createPortadomPromise)(promise.then((d) => { var _a; return (_a = d.shift(...args)) !== null && _a !== void 0 ? _a : null; })),
206
+ slice: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.slice(...args))),
207
+ some: (...args) => promise.then((d) => d.some(...args)),
208
+ sort: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.sort(...args))),
209
+ splice: (...args) => (0, exports.createPortadomArrayPromise)(promise.then((d) => d.splice(...args))),
210
+ unshift: (...args) => promise.then((d) => d.unshift(...args)),
211
+ /** NOTE: Does NOT return an instance of PortadomArrayPromise */
212
+ values: (...args) => promise.then((d) => d.values(...args)),
213
+ }; // prettier-ignore
214
+ };
215
+ exports.createPortadomArrayPromise = createPortadomArrayPromise;
216
+ //# sourceMappingURL=types.js.map