@tstdl/base 0.83.27 → 0.83.28
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.
- package/application/application.js +1 -1
- package/browser/browser-controller.d.ts +26 -0
- package/browser/browser-controller.js +99 -0
- package/browser/browser.service.d.ts +32 -0
- package/browser/browser.service.js +110 -0
- package/browser/index.d.ts +4 -0
- package/browser/index.js +21 -0
- package/browser/page-controller.d.ts +56 -0
- package/browser/page-controller.js +189 -0
- package/browser/pdf-options.d.ts +32 -0
- package/browser/pdf-options.js +134 -0
- package/browser/types.d.ts +3 -0
- package/browser/types.js +16 -0
- package/core.d.ts +1 -1
- package/examples/browser/basic.d.ts +1 -0
- package/examples/browser/basic.js +19 -0
- package/examples/mail/basic.js +11 -3
- package/examples/pdf/basic.js +29 -7
- package/examples/pdf/templates/hello-name.js +10 -2
- package/package.json +3 -3
- package/pdf/pdf.service.d.ts +10 -39
- package/pdf/pdf.service.js +43 -174
- package/pool/pool.js +3 -0
- package/types.d.ts +4 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
- package/utils/stream/finalize-stream.d.ts +22 -1
- package/utils/stream/finalize-stream.js +14 -4
- package/utils/stream/readable-stream-from-promise.d.ts +2 -1
- package/utils/stream/readable-stream-from-promise.js +3 -2
- package/utils/type-guards.d.ts +6 -0
- package/utils/type-guards.js +26 -0
- package/utils/value-or-provider.d.ts +2 -0
- package/utils/value-or-provider.js +30 -0
|
@@ -24,8 +24,8 @@ module.exports = __toCommonJS(application_exports);
|
|
|
24
24
|
var import_container = require("../container/index.js");
|
|
25
25
|
var import_core = require("../core.js");
|
|
26
26
|
var import_logger = require("../logger/index.js");
|
|
27
|
-
var import_module = require("../module/module.js");
|
|
28
27
|
var import_module_base = require("../module/module-base.js");
|
|
28
|
+
var import_module = require("../module/module.js");
|
|
29
29
|
var import_function_module = require("../module/modules/function.module.js");
|
|
30
30
|
var import_process_shutdown = require("../process-shutdown.js");
|
|
31
31
|
var import_deferred_promise = require("../promise/deferred-promise.js");
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Injectable } from '../container/interfaces.js';
|
|
2
|
+
import { resolveArgumentType } from '../container/interfaces.js';
|
|
3
|
+
import type { AsyncDisposable } from '../disposable/disposable.js';
|
|
4
|
+
import { disposeAsync } from '../disposable/disposable.js';
|
|
5
|
+
import * as puppeteer from 'puppeteer';
|
|
6
|
+
import type { NewBrowserOptions } from './browser.service.js';
|
|
7
|
+
import type { PageControllerOptions } from './page-controller.js';
|
|
8
|
+
import { PageController } from './page-controller.js';
|
|
9
|
+
export type BrowserControllerOptions = {
|
|
10
|
+
defaultNewPageOptions?: NewPageOptions;
|
|
11
|
+
};
|
|
12
|
+
export type NewPageOptions = {
|
|
13
|
+
extraHttpHeaders?: Record<string, string>;
|
|
14
|
+
controllerOptions?: PageControllerOptions;
|
|
15
|
+
};
|
|
16
|
+
export declare class BrowserController implements AsyncDisposable, Injectable<NewBrowserOptions> {
|
|
17
|
+
/** @deprecated should be avoided */
|
|
18
|
+
readonly browser: puppeteer.Browser;
|
|
19
|
+
readonly options: BrowserControllerOptions | undefined;
|
|
20
|
+
readonly [resolveArgumentType]: NewBrowserOptions;
|
|
21
|
+
constructor(browser: puppeteer.Browser, options?: BrowserControllerOptions);
|
|
22
|
+
[disposeAsync](): Promise<void>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
newPage(options?: NewPageOptions): Promise<PageController>;
|
|
25
|
+
waitForClose(): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var browser_controller_exports = {};
|
|
30
|
+
__export(browser_controller_exports, {
|
|
31
|
+
BrowserController: () => BrowserController
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(browser_controller_exports);
|
|
34
|
+
var import_decorators = require("../container/decorators.js");
|
|
35
|
+
var import_interfaces = require("../container/interfaces.js");
|
|
36
|
+
var import_disposable = require("../disposable/disposable.js");
|
|
37
|
+
var import_object = require("../utils/object/object.js");
|
|
38
|
+
var import_type_guards = require("../utils/type-guards.js");
|
|
39
|
+
var puppeteer = __toESM(require("puppeteer"), 1);
|
|
40
|
+
var import_browser_service = require("./browser.service.js");
|
|
41
|
+
var import_page_controller = require("./page-controller.js");
|
|
42
|
+
var __decorate = function(decorators, target, key, desc) {
|
|
43
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
44
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
45
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
46
|
+
else
|
|
47
|
+
for (var i = decorators.length - 1; i >= 0; i--)
|
|
48
|
+
if (d = decorators[i])
|
|
49
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
50
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
51
|
+
};
|
|
52
|
+
var __metadata = function(k, v) {
|
|
53
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
54
|
+
return Reflect.metadata(k, v);
|
|
55
|
+
};
|
|
56
|
+
let BrowserController = class BrowserController2 {
|
|
57
|
+
/** @deprecated should be avoided */
|
|
58
|
+
browser;
|
|
59
|
+
options;
|
|
60
|
+
constructor(browser, options) {
|
|
61
|
+
this.browser = browser;
|
|
62
|
+
this.options = options;
|
|
63
|
+
}
|
|
64
|
+
async [import_disposable.disposeAsync]() {
|
|
65
|
+
return this.close();
|
|
66
|
+
}
|
|
67
|
+
async close() {
|
|
68
|
+
if (this.browser.isConnected()) {
|
|
69
|
+
await this.browser.close();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async newPage(options) {
|
|
73
|
+
const mergedExtraHttpHeaderEntries = [...(0, import_object.objectEntries)(options?.extraHttpHeaders ?? {}), ...(0, import_object.objectEntries)(this.options?.defaultNewPageOptions?.extraHttpHeaders ?? {})];
|
|
74
|
+
const newPageOptions = {
|
|
75
|
+
controllerOptions: options?.controllerOptions ?? this.options?.defaultNewPageOptions?.controllerOptions,
|
|
76
|
+
extraHttpHeaders: mergedExtraHttpHeaderEntries.length > 0 ? (0, import_object.fromEntries)(mergedExtraHttpHeaderEntries) : void 0
|
|
77
|
+
};
|
|
78
|
+
const page = await this.browser.newPage();
|
|
79
|
+
const controller = new import_page_controller.PageController(page, newPageOptions.controllerOptions);
|
|
80
|
+
if ((0, import_type_guards.isDefined)(newPageOptions.extraHttpHeaders)) {
|
|
81
|
+
await controller.setExtraHttpHeaders(newPageOptions.extraHttpHeaders);
|
|
82
|
+
}
|
|
83
|
+
return controller;
|
|
84
|
+
}
|
|
85
|
+
async waitForClose() {
|
|
86
|
+
return new Promise((resolve) => this.browser.once("disconnected", resolve));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
BrowserController = __decorate([
|
|
90
|
+
(0, import_decorators.injectable)({
|
|
91
|
+
provider: {
|
|
92
|
+
useFactory: async (argument, context) => {
|
|
93
|
+
const browserService = await context.resolveAsync(import_browser_service.BrowserService);
|
|
94
|
+
return browserService.newBrowser(argument);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}),
|
|
98
|
+
__metadata("design:paramtypes", [puppeteer.Browser, Object])
|
|
99
|
+
], BrowserController);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Injectable } from '../container/interfaces.js';
|
|
2
|
+
import { afterResolve, resolveArgumentType } from '../container/interfaces.js';
|
|
3
|
+
import type { AsyncDisposable } from '../disposable/disposable.js';
|
|
4
|
+
import { disposeAsync } from '../disposable/disposable.js';
|
|
5
|
+
import type { BrowserControllerOptions } from './browser-controller.js';
|
|
6
|
+
import { BrowserController } from './browser-controller.js';
|
|
7
|
+
export declare class BrowserServiceOptions {
|
|
8
|
+
defaultNewBrowserOptions?: NewBrowserOptions;
|
|
9
|
+
}
|
|
10
|
+
export type BrowserServiceArgument = BrowserServiceOptions;
|
|
11
|
+
export type NewBrowserOptions = {
|
|
12
|
+
headless?: boolean;
|
|
13
|
+
width?: number;
|
|
14
|
+
height?: number;
|
|
15
|
+
language?: string;
|
|
16
|
+
proxy?: string;
|
|
17
|
+
/** @deprecated should be avoided */
|
|
18
|
+
browserArguments?: string[];
|
|
19
|
+
/** @deprecated should be avoided */
|
|
20
|
+
browserEnvironment?: Record<string, string | undefined>;
|
|
21
|
+
controllerOptions?: BrowserControllerOptions;
|
|
22
|
+
};
|
|
23
|
+
export declare class BrowserService implements AsyncDisposable, Injectable<BrowserServiceArgument> {
|
|
24
|
+
private readonly browsers;
|
|
25
|
+
readonly options: BrowserServiceOptions | undefined;
|
|
26
|
+
readonly [resolveArgumentType]: BrowserServiceArgument;
|
|
27
|
+
constructor(options?: BrowserServiceOptions);
|
|
28
|
+
[afterResolve](): void;
|
|
29
|
+
[disposeAsync](): Promise<void>;
|
|
30
|
+
newBrowser(options?: NewBrowserOptions): Promise<BrowserController>;
|
|
31
|
+
dispose(): Promise<void>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var browser_service_exports = {};
|
|
30
|
+
__export(browser_service_exports, {
|
|
31
|
+
BrowserService: () => BrowserService,
|
|
32
|
+
BrowserServiceOptions: () => BrowserServiceOptions
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(browser_service_exports);
|
|
35
|
+
var import_decorators = require("../container/decorators.js");
|
|
36
|
+
var import_interfaces = require("../container/interfaces.js");
|
|
37
|
+
var import_core = require("../core.js");
|
|
38
|
+
var import_disposable = require("../disposable/disposable.js");
|
|
39
|
+
var import_type_guards = require("../utils/type-guards.js");
|
|
40
|
+
var puppeteer = __toESM(require("puppeteer"), 1);
|
|
41
|
+
var import_browser_controller = require("./browser-controller.js");
|
|
42
|
+
var __decorate = function(decorators, target, key, desc) {
|
|
43
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
44
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
45
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
46
|
+
else
|
|
47
|
+
for (var i = decorators.length - 1; i >= 0; i--)
|
|
48
|
+
if (d = decorators[i])
|
|
49
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
50
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
51
|
+
};
|
|
52
|
+
var __metadata = function(k, v) {
|
|
53
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
54
|
+
return Reflect.metadata(k, v);
|
|
55
|
+
};
|
|
56
|
+
var __param = function(paramIndex, decorator) {
|
|
57
|
+
return function(target, key) {
|
|
58
|
+
decorator(target, key, paramIndex);
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
class BrowserServiceOptions {
|
|
62
|
+
defaultNewBrowserOptions;
|
|
63
|
+
}
|
|
64
|
+
let BrowserService = class BrowserService2 {
|
|
65
|
+
browsers;
|
|
66
|
+
options;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
this.options = options;
|
|
69
|
+
this.browsers = [];
|
|
70
|
+
}
|
|
71
|
+
[import_interfaces.afterResolve]() {
|
|
72
|
+
import_core.disposer.add(this);
|
|
73
|
+
}
|
|
74
|
+
async [import_disposable.disposeAsync]() {
|
|
75
|
+
return this.dispose();
|
|
76
|
+
}
|
|
77
|
+
async newBrowser(options) {
|
|
78
|
+
const { width = 1e3, height = 1e3, browserArguments, browserEnvironment, proxy, language, headless, controllerOptions } = { ...this.options?.defaultNewBrowserOptions, ...options };
|
|
79
|
+
const args = [`--window-size=${width},${height}`, ...browserArguments ?? []];
|
|
80
|
+
const env = { ...process.env, ...browserEnvironment };
|
|
81
|
+
if ((0, import_type_guards.isDefined)(proxy)) {
|
|
82
|
+
args.push(`--proxy-server=${proxy}`);
|
|
83
|
+
}
|
|
84
|
+
if ((0, import_type_guards.isDefined)(language)) {
|
|
85
|
+
args.push(`--lang=${language}`);
|
|
86
|
+
env["LANGUAGE"] = language;
|
|
87
|
+
}
|
|
88
|
+
const browser = await puppeteer.launch({
|
|
89
|
+
headless: headless == true ? "new" : false,
|
|
90
|
+
args,
|
|
91
|
+
env,
|
|
92
|
+
defaultViewport: { width, height }
|
|
93
|
+
});
|
|
94
|
+
this.browsers.push(new WeakRef(browser));
|
|
95
|
+
return new import_browser_controller.BrowserController(browser, controllerOptions);
|
|
96
|
+
}
|
|
97
|
+
async dispose() {
|
|
98
|
+
for (const browserRef of this.browsers) {
|
|
99
|
+
const browser = browserRef.deref();
|
|
100
|
+
if ((0, import_type_guards.isDefined)(browser) && browser.isConnected()) {
|
|
101
|
+
await browser.close();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
BrowserService = __decorate([
|
|
107
|
+
(0, import_decorators.singleton)(),
|
|
108
|
+
__param(0, (0, import_decorators.injectArg)()),
|
|
109
|
+
__metadata("design:paramtypes", [BrowserServiceOptions])
|
|
110
|
+
], BrowserService);
|
package/browser/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
16
|
+
var browser_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(browser_exports);
|
|
18
|
+
__reExport(browser_exports, require("./browser-controller.js"), module.exports);
|
|
19
|
+
__reExport(browser_exports, require("./browser.service.js"), module.exports);
|
|
20
|
+
__reExport(browser_exports, require("./page-controller.js"), module.exports);
|
|
21
|
+
__reExport(browser_exports, require("./types.js"), module.exports);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as puppeteer from 'puppeteer';
|
|
2
|
+
import type { AsyncDisposable } from '../disposable/disposable.js';
|
|
3
|
+
import { disposeAsync } from '../disposable/disposable.js';
|
|
4
|
+
import type { WritableOneOrMany } from '../types.js';
|
|
5
|
+
import type { PdfRenderOptions } from './pdf-options.js';
|
|
6
|
+
export type Delay = number | DelayProvider;
|
|
7
|
+
export type DelayProvider = () => number;
|
|
8
|
+
export type PageControllerOptions = {
|
|
9
|
+
actionDelay?: Delay;
|
|
10
|
+
typeDelay?: Delay;
|
|
11
|
+
};
|
|
12
|
+
export type SelectorOptions = {
|
|
13
|
+
xpath?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type WaitForElementOptions = {
|
|
16
|
+
timeout?: number;
|
|
17
|
+
};
|
|
18
|
+
export type PageLifecycleEvent = puppeteer.PuppeteerLifeCycleEvent;
|
|
19
|
+
export type WaitForOptions = {
|
|
20
|
+
timeout?: number;
|
|
21
|
+
waitUntil?: WritableOneOrMany<PageLifecycleEvent>;
|
|
22
|
+
};
|
|
23
|
+
export declare class PageController implements AsyncDisposable {
|
|
24
|
+
/** @deprecated should be avoided */
|
|
25
|
+
readonly page: puppeteer.Page;
|
|
26
|
+
readonly options: PageControllerOptions;
|
|
27
|
+
constructor(pageOrFrame: puppeteer.Page | puppeteer.Frame, options?: PageControllerOptions);
|
|
28
|
+
[disposeAsync](): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
setContent(html: string, options?: WaitForOptions): Promise<void>;
|
|
31
|
+
setExtraHttpHeaders(headers: Record<string, string>): Promise<void>;
|
|
32
|
+
authenticate(username: string, password: string): Promise<void>;
|
|
33
|
+
navigate(url: string, options?: WaitForOptions): Promise<void>;
|
|
34
|
+
waitForClose(): Promise<void>;
|
|
35
|
+
waitForIdle(options?: {
|
|
36
|
+
idleTime?: number;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
waitForUrl(urlOrPredicate: string | ((url: string) => boolean | Promise<boolean>), options?: {
|
|
40
|
+
timeout?: number;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
waitForFrame(selector: string, options?: SelectorOptions): Promise<PageController>;
|
|
43
|
+
waitForFrameByUrl(urlOrPredicate: string | ((frame: puppeteer.Frame) => boolean | Promise<boolean>), options?: {
|
|
44
|
+
timeout?: number;
|
|
45
|
+
}): Promise<PageController>;
|
|
46
|
+
getDeepestFrame(): PageController;
|
|
47
|
+
type(handleOrSelector: puppeteer.ElementHandle | string, text: string, options?: SelectorOptions): Promise<void>;
|
|
48
|
+
select(handleOrSelector: puppeteer.ElementHandle | string, value: string, options?: SelectorOptions): Promise<void>;
|
|
49
|
+
click(handleOrSelector: puppeteer.ElementHandle | string, options?: SelectorOptions): Promise<void>;
|
|
50
|
+
getValue(handleOrSelector: puppeteer.ElementHandle | string, options?: SelectorOptions): Promise<string>;
|
|
51
|
+
waitForElement(selector: string, options?: WaitForElementOptions & SelectorOptions): Promise<void>;
|
|
52
|
+
renderPdf(options?: PdfRenderOptions): Promise<Uint8Array>;
|
|
53
|
+
renderPdfStream(options?: PdfRenderOptions): ReadableStream<Uint8Array>;
|
|
54
|
+
private waitForElementHandle;
|
|
55
|
+
private prepareAction;
|
|
56
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var page_controller_exports = {};
|
|
30
|
+
__export(page_controller_exports, {
|
|
31
|
+
PageController: () => PageController
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(page_controller_exports);
|
|
34
|
+
var import_node_stream = require("node:stream");
|
|
35
|
+
var puppeteer = __toESM(require("puppeteer"), 1);
|
|
36
|
+
var import_disposable = require("../disposable/disposable.js");
|
|
37
|
+
var import_readable_stream_from_promise = require("../utils/stream/readable-stream-from-promise.js");
|
|
38
|
+
var import_timing = require("../utils/timing.js");
|
|
39
|
+
var import_type_guards = require("../utils/type-guards.js");
|
|
40
|
+
class PageController {
|
|
41
|
+
/** @deprecated should be avoided */
|
|
42
|
+
page;
|
|
43
|
+
options;
|
|
44
|
+
constructor(pageOrFrame, options = {}) {
|
|
45
|
+
this.page = pageOrFrame instanceof puppeteer.Page ? pageOrFrame : pageOrFrame.page();
|
|
46
|
+
this.options = options;
|
|
47
|
+
}
|
|
48
|
+
async [import_disposable.disposeAsync]() {
|
|
49
|
+
return this.close();
|
|
50
|
+
}
|
|
51
|
+
async close() {
|
|
52
|
+
return this.page.close();
|
|
53
|
+
}
|
|
54
|
+
async setContent(html, options) {
|
|
55
|
+
await this.page.setContent(html, options);
|
|
56
|
+
}
|
|
57
|
+
async setExtraHttpHeaders(headers) {
|
|
58
|
+
await this.page.setExtraHTTPHeaders(headers);
|
|
59
|
+
}
|
|
60
|
+
async authenticate(username, password) {
|
|
61
|
+
await this.page.authenticate({ username, password });
|
|
62
|
+
}
|
|
63
|
+
async navigate(url, options) {
|
|
64
|
+
await this.page.goto(url, options);
|
|
65
|
+
}
|
|
66
|
+
async waitForClose() {
|
|
67
|
+
return new Promise((resolve) => this.page.once("close", resolve));
|
|
68
|
+
}
|
|
69
|
+
async waitForIdle(options) {
|
|
70
|
+
await this.page.waitForNetworkIdle(options);
|
|
71
|
+
}
|
|
72
|
+
async waitForUrl(urlOrPredicate, options) {
|
|
73
|
+
const pageFrame = this.page.mainFrame();
|
|
74
|
+
await this.page.waitForFrame(async (frame) => {
|
|
75
|
+
if (frame != pageFrame) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if ((0, import_type_guards.isString)(urlOrPredicate)) {
|
|
79
|
+
return frame.url().includes(urlOrPredicate);
|
|
80
|
+
}
|
|
81
|
+
return urlOrPredicate(frame.url());
|
|
82
|
+
}, { timeout: options?.timeout });
|
|
83
|
+
}
|
|
84
|
+
async waitForFrame(selector, options) {
|
|
85
|
+
const frame = await this.waitForElementHandle(selector, options);
|
|
86
|
+
return new PageController(frame.frame.page());
|
|
87
|
+
}
|
|
88
|
+
async waitForFrameByUrl(urlOrPredicate, options) {
|
|
89
|
+
const frame = await this.page.waitForFrame(urlOrPredicate, options);
|
|
90
|
+
return new PageController(frame.page());
|
|
91
|
+
}
|
|
92
|
+
getDeepestFrame() {
|
|
93
|
+
let frame = this.page.mainFrame();
|
|
94
|
+
while (true) {
|
|
95
|
+
const children = frame.childFrames();
|
|
96
|
+
if (children.length > 1) {
|
|
97
|
+
throw new Error("Multiple frames found. Only works with single frame.");
|
|
98
|
+
}
|
|
99
|
+
if (children.length == 0) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
frame = children[0];
|
|
103
|
+
}
|
|
104
|
+
return new PageController(frame);
|
|
105
|
+
}
|
|
106
|
+
async type(handleOrSelector, text, options) {
|
|
107
|
+
await this.prepareAction();
|
|
108
|
+
const handle = (0, import_type_guards.isString)(handleOrSelector) ? await this.waitForElementHandle(handleOrSelector, options) : handleOrSelector;
|
|
109
|
+
await handle.evaluate((element) => element.select());
|
|
110
|
+
if ((0, import_type_guards.isUndefined)(this.options.typeDelay)) {
|
|
111
|
+
await handle.type(text);
|
|
112
|
+
} else {
|
|
113
|
+
for (const char of text) {
|
|
114
|
+
await handle.type(char);
|
|
115
|
+
await delay(this.options.typeDelay);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async select(handleOrSelector, value, options) {
|
|
120
|
+
await this.prepareAction();
|
|
121
|
+
const handle = (0, import_type_guards.isString)(handleOrSelector) ? await this.waitForElementHandle(handleOrSelector, options) : handleOrSelector;
|
|
122
|
+
await handle.select(value);
|
|
123
|
+
}
|
|
124
|
+
async click(handleOrSelector, options) {
|
|
125
|
+
await this.prepareAction();
|
|
126
|
+
const handle = (0, import_type_guards.isString)(handleOrSelector) ? await this.waitForElementHandle(handleOrSelector, options) : handleOrSelector;
|
|
127
|
+
await handle.click();
|
|
128
|
+
}
|
|
129
|
+
async getValue(handleOrSelector, options) {
|
|
130
|
+
const handle = (0, import_type_guards.isString)(handleOrSelector) ? await this.waitForElementHandle(handleOrSelector, options) : handleOrSelector;
|
|
131
|
+
return handle.evaluate((element) => element.value);
|
|
132
|
+
}
|
|
133
|
+
async waitForElement(selector, options) {
|
|
134
|
+
await this.waitForElementHandle(selector, options);
|
|
135
|
+
}
|
|
136
|
+
async renderPdf(options = {}) {
|
|
137
|
+
const createPdfOptions = convertPdfOptions(options);
|
|
138
|
+
return this.page.pdf(createPdfOptions);
|
|
139
|
+
}
|
|
140
|
+
renderPdfStream(options = {}) {
|
|
141
|
+
return (0, import_readable_stream_from_promise.readableStreamFromPromise)(async () => {
|
|
142
|
+
const createPdfOptions = convertPdfOptions(options);
|
|
143
|
+
const pdfStream = await this.page.createPDFStream(createPdfOptions);
|
|
144
|
+
return import_node_stream.Readable.toWeb(pdfStream);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async waitForElementHandle(selector, { timeout: waitTimeout = 5e3, xpath = false } = {}) {
|
|
148
|
+
const handle = xpath ? await this.page.waitForXPath(selector, { timeout: waitTimeout }) : await this.page.waitForSelector(selector, { timeout: waitTimeout });
|
|
149
|
+
if ((0, import_type_guards.isNull)(handle)) {
|
|
150
|
+
throw new Error("Element not found");
|
|
151
|
+
}
|
|
152
|
+
return handle;
|
|
153
|
+
}
|
|
154
|
+
async prepareAction() {
|
|
155
|
+
await delay(this.options.actionDelay);
|
|
156
|
+
await this.waitForIdle();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function delay(milliseconds) {
|
|
160
|
+
if ((0, import_type_guards.isUndefined)(milliseconds)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if ((0, import_type_guards.isNumber)(milliseconds)) {
|
|
164
|
+
await (0, import_timing.timeout)(milliseconds);
|
|
165
|
+
} else {
|
|
166
|
+
await (0, import_timing.timeout)(milliseconds());
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function convertPdfOptions(options) {
|
|
170
|
+
const margin = (0, import_type_guards.isUndefined)(options.margin) ? void 0 : (0, import_type_guards.isObject)(options.margin) ? options.margin : {
|
|
171
|
+
top: options.margin,
|
|
172
|
+
bottom: options.margin,
|
|
173
|
+
right: options.margin,
|
|
174
|
+
left: options.margin
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
format: options.format ?? "a4",
|
|
178
|
+
scale: options.scale,
|
|
179
|
+
landscape: options.landscape,
|
|
180
|
+
width: options.width,
|
|
181
|
+
height: options.height,
|
|
182
|
+
omitBackground: options.omitDefaultBackground,
|
|
183
|
+
printBackground: options.renderBackground,
|
|
184
|
+
margin,
|
|
185
|
+
displayHeaderFooter: options.displayHeaderFooter ?? ((0, import_type_guards.isDefined)(options.headerTemplate) || (0, import_type_guards.isDefined)(options.footerTemplate)),
|
|
186
|
+
headerTemplate: options.headerTemplate,
|
|
187
|
+
footerTemplate: options.footerTemplate
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare enum PdfFormat {
|
|
2
|
+
Letter = "letter",
|
|
3
|
+
Legal = "legal",
|
|
4
|
+
Tabloid = "tabloid",
|
|
5
|
+
Ledger = "ledger",
|
|
6
|
+
A0 = "a0",
|
|
7
|
+
A1 = "a1",
|
|
8
|
+
A2 = "a2",
|
|
9
|
+
A3 = "a3",
|
|
10
|
+
A4 = "a4",
|
|
11
|
+
A5 = "a5",
|
|
12
|
+
A6 = "a6"
|
|
13
|
+
}
|
|
14
|
+
export declare class PdfMarginObject {
|
|
15
|
+
top?: number | string;
|
|
16
|
+
bottom?: number | string;
|
|
17
|
+
right?: number | string;
|
|
18
|
+
left?: number | string;
|
|
19
|
+
}
|
|
20
|
+
export declare class PdfRenderOptions {
|
|
21
|
+
omitDefaultBackground?: boolean;
|
|
22
|
+
renderBackground?: boolean;
|
|
23
|
+
landscape?: boolean;
|
|
24
|
+
format?: PdfFormat;
|
|
25
|
+
width?: string | number;
|
|
26
|
+
height?: string | number;
|
|
27
|
+
scale?: number;
|
|
28
|
+
margin?: string | number | PdfMarginObject;
|
|
29
|
+
displayHeaderFooter?: boolean;
|
|
30
|
+
headerTemplate?: string;
|
|
31
|
+
footerTemplate?: string;
|
|
32
|
+
}
|