Rename to hkt.sh

This commit is contained in:
mango
2026-03-21 01:10:53 +08:00
parent 76a263d0f9
commit 8f1171fe99
6676 changed files with 1724268 additions and 0 deletions

21
node_modules/puppeteer-extra-plugin/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2019 berstend <github@berstend.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

533
node_modules/puppeteer-extra-plugin/dist/index.cjs.js generated vendored Normal file
View File

@@ -0,0 +1,533 @@
/*!
* puppeteer-extra-plugin v3.2.2 by berstend
* https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin
* @license MIT
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var debug = _interopDefault(require('debug'));
/** @private */
const merge = require('merge-deep');
/**
* Base class for `puppeteer-extra` plugins.
*
* Provides convenience methods to avoid boilerplate.
*
* All common `puppeteer` browser events will be bound to
* the plugin instance, if a respectively named class member is found.
*
* Please refer to the [puppeteer API documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) as well.
*
* @example
* // hello-world-plugin.js
* const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
*
* class Plugin extends PuppeteerExtraPlugin {
* constructor (opts = { }) { super(opts) }
*
* get name () { return 'hello-world' }
*
* async onPageCreated (page) {
* this.debug('page created', page.url())
* const ua = await page.browser().userAgent()
* this.debug('user agent', ua)
* }
* }
*
* module.exports = function (pluginConfig) { return new Plugin(pluginConfig) }
*
*
* // foo.js
* const puppeteer = require('puppeteer-extra')
* puppeteer.use(require('./hello-world-plugin')())
*
* ;(async () => {
* const browser = await puppeteer.launch({headless: false})
* const page = await browser.newPage()
* await page.goto('http://example.com', {waitUntil: 'domcontentloaded'})
* await browser.close()
* })()
*
*/
class PuppeteerExtraPlugin {
constructor(opts) {
this._debugBase = debug(`puppeteer-extra-plugin:base:${this.name}`);
this._childClassMembers = [];
this._opts = merge(this.defaults, opts || {});
this._debugBase('Initialized.');
}
/**
* Plugin name (required).
*
* Convention:
* - Package: `puppeteer-extra-plugin-anonymize-ua`
* - Name: `anonymize-ua`
*
* @example
* get name () { return 'anonymize-ua' }
*/
get name() {
throw new Error('Plugin must override "name"');
}
/**
* Plugin defaults (optional).
*
* If defined will be ([deep-](https://github.com/jonschlinkert/merge-deep))merged with the (optional) user supplied options (supplied during plugin instantiation).
*
* The result of merging defaults with user supplied options can be accessed through `this.opts`.
*
* @see [[opts]]
*
* @example
* get defaults () {
* return {
* stripHeadless: true,
* makeWindows: true,
* customFn: null
* }
* }
*
* // Users can overwrite plugin defaults during instantiation:
* puppeteer.use(require('puppeteer-extra-plugin-foobar')({ makeWindows: false }))
*/
get defaults() {
return {};
}
/**
* Plugin requirements (optional).
*
* Signal certain plugin requirements to the base class and the user.
*
* Currently supported:
* - `launch`
* - If the plugin only supports locally created browser instances (no `puppeteer.connect()`),
* will output a warning to the user.
* - `headful`
* - If the plugin doesn't work in `headless: true` mode,
* will output a warning to the user.
* - `dataFromPlugins`
* - In case the plugin requires data from other plugins.
* will enable usage of `this.getDataFromPlugins()`.
* - `runLast`
* - In case the plugin prefers to run after the others.
* Useful when the plugin needs data from others.
*
* @example
* get requirements () {
* return new Set(['runLast', 'dataFromPlugins'])
* }
*/
get requirements() {
return new Set([]);
}
/**
* Plugin dependencies (optional).
*
* Missing plugins will be required() by puppeteer-extra.
*
* @example
* get dependencies () {
* return new Set(['user-preferences'])
* }
* // Will ensure the 'puppeteer-extra-plugin-user-preferences' plugin is loaded.
*/
get dependencies() {
return new Set([]);
}
/**
* Plugin data (optional).
*
* Plugins can expose data (an array of objects), which in turn can be consumed by other plugins,
* that list the `dataFromPlugins` requirement (by using `this.getDataFromPlugins()`).
*
* Convention: `[ {name: 'Any name', value: 'Any value'} ]`
*
* @see [[getDataFromPlugins]]
*
* @example
* // plugin1.js
* get data () {
* return [
* {
* name: 'userPreferences',
* value: { foo: 'bar' }
* },
* {
* name: 'userPreferences',
* value: { hello: 'world' }
* }
* ]
*
* // plugin2.js
* get requirements () { return new Set(['dataFromPlugins']) }
*
* async beforeLaunch () {
* const prefs = this.getDataFromPlugins('userPreferences').map(d => d.value)
* this.debug(prefs) // => [ { foo: 'bar' }, { hello: 'world' } ]
* }
*/
get data() {
return [];
}
/**
* Access the plugin options (usually the `defaults` merged with user defined options)
*
* To skip the auto-merging of defaults with user supplied opts don't define a `defaults`
* property and set the `this._opts` Object in your plugin constructor directly.
*
* @see [[defaults]]
*
* @example
* get defaults () { return { foo: "bar" } }
*
* async onPageCreated (page) {
* this.debug(this.opts.foo) // => bar
* }
*/
get opts() {
return this._opts;
}
/**
* Convenience debug logger based on the [debug] module.
* Will automatically namespace the logging output to the plugin package name.
* [debug]: https://www.npmjs.com/package/debug
*
* ```bash
* # toggle output using environment variables
* DEBUG=puppeteer-extra-plugin:<plugin_name> node foo.js
* # to debug all the things:
* DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node foo.js
* ```
*
* @example
* this.debug('hello world')
* // will output e.g. 'puppeteer-extra-plugin:anonymize-ua hello world'
*/
get debug() {
return debug(`puppeteer-extra-plugin:${this.name}`);
}
/**
* Before a new browser instance is created/launched.
*
* Can be used to modify the puppeteer launch options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @example
* async beforeLaunch (options) {
* if (this.opts.flashPluginPath) {
* options.args.push(`--ppapi-flash-path=${this.opts.flashPluginPath}`)
* }
* }
*
* @param options - Puppeteer launch options
*/
async beforeLaunch(options) {
// noop
}
/**
* After the browser has launched.
*
* Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
* It's possible that `pupeeteer.launch` will be called multiple times and more than one browser created.
* In order to make the plugins as stateless as possible don't store a reference to the browser instance
* in the plugin but rather consider alternatives.
*
* E.g. when using `onPageCreated` you can get a browser reference by using `page.browser()`.
*
* Alternatively you could expose a class method that takes a browser instance as a parameter to work with:
*
* ```es6
* const fancyPlugin = require('puppeteer-extra-plugin-fancy')()
* puppeteer.use(fancyPlugin)
* const browser = await puppeteer.launch()
* await fancyPlugin.killBrowser(browser)
* ```
*
* @param browser - The `puppeteer` browser instance.
* @param opts.options - Puppeteer launch options used.
*
* @example
* async afterLaunch (browser, opts) {
* this.debug('browser has been launched', opts.options)
* }
*/
async afterLaunch(browser, opts = { options: {} }) {
// noop
}
/**
* Before connecting to an existing browser instance.
*
* Can be used to modify the puppeteer connect options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @param {Object} options - Puppeteer connect options
* @return {Object=}
*/
async beforeConnect(options) {
// noop
}
/**
* After connecting to an existing browser instance.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
* @param {Object} opts
* @param {Object} opts.options - Puppeteer connect options used.
*
*/
async afterConnect(browser, opts = {}) {
// noop
}
/**
* Called when a browser instance is available.
*
* This applies to both `puppeteer.launch()` and `puppeteer.connect()`.
*
* Convenience method created for plugins that need access to a browser instance
* and don't mind if it has been created through `launch` or `connect`.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
*/
async onBrowser(browser, opts) {
// noop
}
/**
* Called when a target is created, for example when a new page is opened by window.open or browser.newPage.
*
* > Note: This includes target creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetCreated(target) {
// noop
}
/**
* Same as `onTargetCreated` but prefiltered to only contain Pages, for convenience.
*
* > Note: This includes page creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*
* @example
* async onPageCreated (page) {
* let ua = await page.browser().userAgent()
* if (this.opts.stripHeadless) {
* ua = ua.replace('HeadlessChrome/', 'Chrome/')
* }
* this.debug('new ua', ua)
* await page.setUserAgent(ua)
* }
*/
async onPageCreated(page) {
// noop
}
/**
* Called when the url of a target changes.
*
* > Note: This includes target changes in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetChanged(target) {
// noop
}
/**
* Called when a target is destroyed, for example when a page is closed.
*
* > Note: This includes target destructions in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetDestroyed(target) {
// noop
}
/**
* Called when Puppeteer gets disconnected from the Chromium instance.
*
* This might happen because of one of the following:
* - Chromium is closed or crashed
* - The `browser.disconnect` method was called
*/
async onDisconnected() {
// noop
}
/**
* **Deprecated:** Since puppeteer v1.6.0 `onDisconnected` has been improved
* and should be used instead of `onClose`.
*
* In puppeteer < v1.6.0 `onDisconnected` was not catching all exit scenarios.
* In order for plugins to clean up properly (e.g. deleting temporary files)
* the `onClose` method had been introduced.
*
* > Note: Might be called multiple times on exit.
*
* > Note: This only includes browser instances created through `.launch()`.
*/
async onClose() {
// noop
}
/**
* After the plugin has been registered in `puppeteer-extra`.
*
* Normally right after `puppeteer.use(plugin)` is called
*/
async onPluginRegistered() {
// noop
}
/**
* Helper method to retrieve `data` objects from other plugins.
*
* A plugin needs to state the `dataFromPlugins` requirement
* in order to use this method. Will be mapped to `puppeteer.getPluginData`.
*
* @param name - Filter data by `name` property
*
* @see [data]
* @see [requirements]
*/
getDataFromPlugins(name) {
return [];
}
/**
* Will match plugin dependencies against all currently registered plugins.
* Is being called by `puppeteer-extra` and used to require missing dependencies.
*
* @param {Array<Object>} plugins
* @return {Set} - list of missing plugin names
*
* @private
*/
_getMissingDependencies(plugins) {
const pluginNames = new Set(plugins.map((p) => p.name));
const missing = new Set(Array.from(this.dependencies.values()).filter(x => !pluginNames.has(x)));
return missing;
}
/**
* Conditionally bind browser/process events to class members.
* The idea is to reduce event binding boilerplate in plugins.
*
* For efficiency we make sure the plugin is using the respective event
* by checking the child class members before registering the listener.
*
* @param {<Puppeteer.Browser>} browser
* @param {Object} opts - Options
* @param {string} opts.context - Puppeteer context (launch/connect)
* @param {Object} [opts.options] - Puppeteer launch or connect options
* @param {Array<string>} [opts.defaultArgs] - The default flags that Chromium will be launched with
*
* @private
*/
async _bindBrowserEvents(browser, opts = {}) {
if (this._hasChildClassMember('onTargetCreated') ||
this._hasChildClassMember('onPageCreated')) {
browser.on('targetcreated', this._onTargetCreated.bind(this));
}
if (this._hasChildClassMember('onTargetChanged') && this.onTargetChanged) {
browser.on('targetchanged', this.onTargetChanged.bind(this));
}
if (this._hasChildClassMember('onTargetDestroyed') &&
this.onTargetDestroyed) {
browser.on('targetdestroyed', this.onTargetDestroyed.bind(this));
}
if (this._hasChildClassMember('onDisconnected') && this.onDisconnected) {
browser.on('disconnected', this.onDisconnected.bind(this));
}
if (opts.context === 'launch' && this._hasChildClassMember('onClose')) {
// The disconnect event has been improved since puppeteer v1.6.0
// onClose is being kept mostly for legacy reasons
if (this.onClose) {
process.on('exit', this.onClose.bind(this));
browser.on('disconnected', this.onClose.bind(this));
if (opts.options.handleSIGINT !== false) {
process.on('SIGINT', this.onClose.bind(this));
}
if (opts.options.handleSIGTERM !== false) {
process.on('SIGTERM', this.onClose.bind(this));
}
if (opts.options.handleSIGHUP !== false) {
process.on('SIGHUP', this.onClose.bind(this));
}
}
}
if (opts.context === 'launch' && this.afterLaunch) {
await this.afterLaunch(browser, opts);
}
if (opts.context === 'connect' && this.afterConnect) {
await this.afterConnect(browser, opts);
}
if (this.onBrowser)
await this.onBrowser(browser, opts);
}
/**
* @private
*/
async _onTargetCreated(target) {
if (this.onTargetCreated)
await this.onTargetCreated(target);
// Pre filter pages for plugin developers convenience
if (target.type() === 'page') {
try {
const page = await target.page();
if (!page) {
return;
}
const validPage = 'isClosed' in page && !page.isClosed();
if (this.onPageCreated && validPage) {
await this.onPageCreated(page);
}
}
catch (err) {
console.error(err);
}
}
}
/**
* @private
*/
_register(prototype) {
this._registerChildClassMembers(prototype);
if (this.onPluginRegistered)
this.onPluginRegistered();
}
/**
* @private
*/
_registerChildClassMembers(prototype) {
this._childClassMembers = Object.getOwnPropertyNames(prototype);
}
/**
* @private
*/
_hasChildClassMember(name) {
return !!this._childClassMembers.includes(name);
}
/**
* @private
*/
get _isPuppeteerExtraPlugin() {
return true;
}
}
exports.PuppeteerExtraPlugin = PuppeteerExtraPlugin;
//# sourceMappingURL=index.cjs.js.map

File diff suppressed because one or more lines are too long

420
node_modules/puppeteer-extra-plugin/dist/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,420 @@
import { Debugger } from 'debug';
import * as Puppeteer from './puppeteer';
export interface PluginOptions {
[key: string]: any;
}
export interface PluginData {
name: {
[key: string]: any;
};
value: {
[key: string]: any;
};
}
export declare type PluginDependencies = Set<string>;
export declare type PluginRequirements = Set<'launch' | 'headful' | 'dataFromPlugins' | 'runLast'>;
/**
* Base class for `puppeteer-extra` plugins.
*
* Provides convenience methods to avoid boilerplate.
*
* All common `puppeteer` browser events will be bound to
* the plugin instance, if a respectively named class member is found.
*
* Please refer to the [puppeteer API documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) as well.
*
* @example
* // hello-world-plugin.js
* const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
*
* class Plugin extends PuppeteerExtraPlugin {
* constructor (opts = { }) { super(opts) }
*
* get name () { return 'hello-world' }
*
* async onPageCreated (page) {
* this.debug('page created', page.url())
* const ua = await page.browser().userAgent()
* this.debug('user agent', ua)
* }
* }
*
* module.exports = function (pluginConfig) { return new Plugin(pluginConfig) }
*
*
* // foo.js
* const puppeteer = require('puppeteer-extra')
* puppeteer.use(require('./hello-world-plugin')())
*
* ;(async () => {
* const browser = await puppeteer.launch({headless: false})
* const page = await browser.newPage()
* await page.goto('http://example.com', {waitUntil: 'domcontentloaded'})
* await browser.close()
* })()
*
*/
export declare abstract class PuppeteerExtraPlugin {
/** @private */
private _debugBase;
/** @private */
private _opts;
/** @private */
private _childClassMembers;
constructor(opts?: PluginOptions);
/**
* Plugin name (required).
*
* Convention:
* - Package: `puppeteer-extra-plugin-anonymize-ua`
* - Name: `anonymize-ua`
*
* @example
* get name () { return 'anonymize-ua' }
*/
get name(): string;
/**
* Plugin defaults (optional).
*
* If defined will be ([deep-](https://github.com/jonschlinkert/merge-deep))merged with the (optional) user supplied options (supplied during plugin instantiation).
*
* The result of merging defaults with user supplied options can be accessed through `this.opts`.
*
* @see [[opts]]
*
* @example
* get defaults () {
* return {
* stripHeadless: true,
* makeWindows: true,
* customFn: null
* }
* }
*
* // Users can overwrite plugin defaults during instantiation:
* puppeteer.use(require('puppeteer-extra-plugin-foobar')({ makeWindows: false }))
*/
get defaults(): PluginOptions;
/**
* Plugin requirements (optional).
*
* Signal certain plugin requirements to the base class and the user.
*
* Currently supported:
* - `launch`
* - If the plugin only supports locally created browser instances (no `puppeteer.connect()`),
* will output a warning to the user.
* - `headful`
* - If the plugin doesn't work in `headless: true` mode,
* will output a warning to the user.
* - `dataFromPlugins`
* - In case the plugin requires data from other plugins.
* will enable usage of `this.getDataFromPlugins()`.
* - `runLast`
* - In case the plugin prefers to run after the others.
* Useful when the plugin needs data from others.
*
* @example
* get requirements () {
* return new Set(['runLast', 'dataFromPlugins'])
* }
*/
get requirements(): PluginRequirements;
/**
* Plugin dependencies (optional).
*
* Missing plugins will be required() by puppeteer-extra.
*
* @example
* get dependencies () {
* return new Set(['user-preferences'])
* }
* // Will ensure the 'puppeteer-extra-plugin-user-preferences' plugin is loaded.
*/
get dependencies(): PluginDependencies;
/**
* Plugin data (optional).
*
* Plugins can expose data (an array of objects), which in turn can be consumed by other plugins,
* that list the `dataFromPlugins` requirement (by using `this.getDataFromPlugins()`).
*
* Convention: `[ {name: 'Any name', value: 'Any value'} ]`
*
* @see [[getDataFromPlugins]]
*
* @example
* // plugin1.js
* get data () {
* return [
* {
* name: 'userPreferences',
* value: { foo: 'bar' }
* },
* {
* name: 'userPreferences',
* value: { hello: 'world' }
* }
* ]
*
* // plugin2.js
* get requirements () { return new Set(['dataFromPlugins']) }
*
* async beforeLaunch () {
* const prefs = this.getDataFromPlugins('userPreferences').map(d => d.value)
* this.debug(prefs) // => [ { foo: 'bar' }, { hello: 'world' } ]
* }
*/
get data(): PluginData[];
/**
* Access the plugin options (usually the `defaults` merged with user defined options)
*
* To skip the auto-merging of defaults with user supplied opts don't define a `defaults`
* property and set the `this._opts` Object in your plugin constructor directly.
*
* @see [[defaults]]
*
* @example
* get defaults () { return { foo: "bar" } }
*
* async onPageCreated (page) {
* this.debug(this.opts.foo) // => bar
* }
*/
get opts(): PluginOptions;
/**
* Convenience debug logger based on the [debug] module.
* Will automatically namespace the logging output to the plugin package name.
* [debug]: https://www.npmjs.com/package/debug
*
* ```bash
* # toggle output using environment variables
* DEBUG=puppeteer-extra-plugin:<plugin_name> node foo.js
* # to debug all the things:
* DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node foo.js
* ```
*
* @example
* this.debug('hello world')
* // will output e.g. 'puppeteer-extra-plugin:anonymize-ua hello world'
*/
get debug(): Debugger;
/**
* Before a new browser instance is created/launched.
*
* Can be used to modify the puppeteer launch options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @example
* async beforeLaunch (options) {
* if (this.opts.flashPluginPath) {
* options.args.push(`--ppapi-flash-path=${this.opts.flashPluginPath}`)
* }
* }
*
* @param options - Puppeteer launch options
*/
beforeLaunch(options: any): Promise<void>;
/**
* After the browser has launched.
*
* Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
* It's possible that `pupeeteer.launch` will be called multiple times and more than one browser created.
* In order to make the plugins as stateless as possible don't store a reference to the browser instance
* in the plugin but rather consider alternatives.
*
* E.g. when using `onPageCreated` you can get a browser reference by using `page.browser()`.
*
* Alternatively you could expose a class method that takes a browser instance as a parameter to work with:
*
* ```es6
* const fancyPlugin = require('puppeteer-extra-plugin-fancy')()
* puppeteer.use(fancyPlugin)
* const browser = await puppeteer.launch()
* await fancyPlugin.killBrowser(browser)
* ```
*
* @param browser - The `puppeteer` browser instance.
* @param opts.options - Puppeteer launch options used.
*
* @example
* async afterLaunch (browser, opts) {
* this.debug('browser has been launched', opts.options)
* }
*/
afterLaunch(browser: Puppeteer.Browser, opts?: {
options: Puppeteer.LaunchOptions;
}): Promise<void>;
/**
* Before connecting to an existing browser instance.
*
* Can be used to modify the puppeteer connect options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @param {Object} options - Puppeteer connect options
* @return {Object=}
*/
beforeConnect(options: Puppeteer.ConnectOptions): Promise<void>;
/**
* After connecting to an existing browser instance.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
* @param {Object} opts
* @param {Object} opts.options - Puppeteer connect options used.
*
*/
afterConnect(browser: Puppeteer.Browser, opts?: {}): Promise<void>;
/**
* Called when a browser instance is available.
*
* This applies to both `puppeteer.launch()` and `puppeteer.connect()`.
*
* Convenience method created for plugins that need access to a browser instance
* and don't mind if it has been created through `launch` or `connect`.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
*/
onBrowser(browser: Puppeteer.Browser, opts: any): Promise<void>;
/**
* Called when a target is created, for example when a new page is opened by window.open or browser.newPage.
*
* > Note: This includes target creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
onTargetCreated(target: Puppeteer.Target): Promise<void>;
/**
* Same as `onTargetCreated` but prefiltered to only contain Pages, for convenience.
*
* > Note: This includes page creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*
* @example
* async onPageCreated (page) {
* let ua = await page.browser().userAgent()
* if (this.opts.stripHeadless) {
* ua = ua.replace('HeadlessChrome/', 'Chrome/')
* }
* this.debug('new ua', ua)
* await page.setUserAgent(ua)
* }
*/
onPageCreated(page: Puppeteer.Page): Promise<void>;
/**
* Called when the url of a target changes.
*
* > Note: This includes target changes in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
onTargetChanged(target: Puppeteer.Target): Promise<void>;
/**
* Called when a target is destroyed, for example when a page is closed.
*
* > Note: This includes target destructions in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
onTargetDestroyed(target: Puppeteer.Target): Promise<void>;
/**
* Called when Puppeteer gets disconnected from the Chromium instance.
*
* This might happen because of one of the following:
* - Chromium is closed or crashed
* - The `browser.disconnect` method was called
*/
onDisconnected(): Promise<void>;
/**
* **Deprecated:** Since puppeteer v1.6.0 `onDisconnected` has been improved
* and should be used instead of `onClose`.
*
* In puppeteer < v1.6.0 `onDisconnected` was not catching all exit scenarios.
* In order for plugins to clean up properly (e.g. deleting temporary files)
* the `onClose` method had been introduced.
*
* > Note: Might be called multiple times on exit.
*
* > Note: This only includes browser instances created through `.launch()`.
*/
onClose(): Promise<void>;
/**
* After the plugin has been registered in `puppeteer-extra`.
*
* Normally right after `puppeteer.use(plugin)` is called
*/
onPluginRegistered(): Promise<void>;
/**
* Helper method to retrieve `data` objects from other plugins.
*
* A plugin needs to state the `dataFromPlugins` requirement
* in order to use this method. Will be mapped to `puppeteer.getPluginData`.
*
* @param name - Filter data by `name` property
*
* @see [data]
* @see [requirements]
*/
getDataFromPlugins(name?: string): PluginData[];
/**
* Will match plugin dependencies against all currently registered plugins.
* Is being called by `puppeteer-extra` and used to require missing dependencies.
*
* @param {Array<Object>} plugins
* @return {Set} - list of missing plugin names
*
* @private
*/
_getMissingDependencies(plugins: any): Set<string>;
/**
* Conditionally bind browser/process events to class members.
* The idea is to reduce event binding boilerplate in plugins.
*
* For efficiency we make sure the plugin is using the respective event
* by checking the child class members before registering the listener.
*
* @param {<Puppeteer.Browser>} browser
* @param {Object} opts - Options
* @param {string} opts.context - Puppeteer context (launch/connect)
* @param {Object} [opts.options] - Puppeteer launch or connect options
* @param {Array<string>} [opts.defaultArgs] - The default flags that Chromium will be launched with
*
* @private
*/
_bindBrowserEvents(browser: Puppeteer.Browser, opts?: any): Promise<void>;
/**
* @private
*/
_onTargetCreated(target: Puppeteer.Target): Promise<void>;
/**
* @private
*/
_register(prototype: any): void;
/**
* @private
*/
_registerChildClassMembers(prototype: any): void;
/**
* @private
*/
_hasChildClassMember(name: string): boolean;
/**
* @private
*/
get _isPuppeteerExtraPlugin(): boolean;
}

527
node_modules/puppeteer-extra-plugin/dist/index.esm.js generated vendored Normal file
View File

@@ -0,0 +1,527 @@
/*!
* puppeteer-extra-plugin v3.2.2 by berstend
* https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin
* @license MIT
*/
import debug from 'debug';
/** @private */
const merge = require('merge-deep');
/**
* Base class for `puppeteer-extra` plugins.
*
* Provides convenience methods to avoid boilerplate.
*
* All common `puppeteer` browser events will be bound to
* the plugin instance, if a respectively named class member is found.
*
* Please refer to the [puppeteer API documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) as well.
*
* @example
* // hello-world-plugin.js
* const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
*
* class Plugin extends PuppeteerExtraPlugin {
* constructor (opts = { }) { super(opts) }
*
* get name () { return 'hello-world' }
*
* async onPageCreated (page) {
* this.debug('page created', page.url())
* const ua = await page.browser().userAgent()
* this.debug('user agent', ua)
* }
* }
*
* module.exports = function (pluginConfig) { return new Plugin(pluginConfig) }
*
*
* // foo.js
* const puppeteer = require('puppeteer-extra')
* puppeteer.use(require('./hello-world-plugin')())
*
* ;(async () => {
* const browser = await puppeteer.launch({headless: false})
* const page = await browser.newPage()
* await page.goto('http://example.com', {waitUntil: 'domcontentloaded'})
* await browser.close()
* })()
*
*/
class PuppeteerExtraPlugin {
constructor(opts) {
this._debugBase = debug(`puppeteer-extra-plugin:base:${this.name}`);
this._childClassMembers = [];
this._opts = merge(this.defaults, opts || {});
this._debugBase('Initialized.');
}
/**
* Plugin name (required).
*
* Convention:
* - Package: `puppeteer-extra-plugin-anonymize-ua`
* - Name: `anonymize-ua`
*
* @example
* get name () { return 'anonymize-ua' }
*/
get name() {
throw new Error('Plugin must override "name"');
}
/**
* Plugin defaults (optional).
*
* If defined will be ([deep-](https://github.com/jonschlinkert/merge-deep))merged with the (optional) user supplied options (supplied during plugin instantiation).
*
* The result of merging defaults with user supplied options can be accessed through `this.opts`.
*
* @see [[opts]]
*
* @example
* get defaults () {
* return {
* stripHeadless: true,
* makeWindows: true,
* customFn: null
* }
* }
*
* // Users can overwrite plugin defaults during instantiation:
* puppeteer.use(require('puppeteer-extra-plugin-foobar')({ makeWindows: false }))
*/
get defaults() {
return {};
}
/**
* Plugin requirements (optional).
*
* Signal certain plugin requirements to the base class and the user.
*
* Currently supported:
* - `launch`
* - If the plugin only supports locally created browser instances (no `puppeteer.connect()`),
* will output a warning to the user.
* - `headful`
* - If the plugin doesn't work in `headless: true` mode,
* will output a warning to the user.
* - `dataFromPlugins`
* - In case the plugin requires data from other plugins.
* will enable usage of `this.getDataFromPlugins()`.
* - `runLast`
* - In case the plugin prefers to run after the others.
* Useful when the plugin needs data from others.
*
* @example
* get requirements () {
* return new Set(['runLast', 'dataFromPlugins'])
* }
*/
get requirements() {
return new Set([]);
}
/**
* Plugin dependencies (optional).
*
* Missing plugins will be required() by puppeteer-extra.
*
* @example
* get dependencies () {
* return new Set(['user-preferences'])
* }
* // Will ensure the 'puppeteer-extra-plugin-user-preferences' plugin is loaded.
*/
get dependencies() {
return new Set([]);
}
/**
* Plugin data (optional).
*
* Plugins can expose data (an array of objects), which in turn can be consumed by other plugins,
* that list the `dataFromPlugins` requirement (by using `this.getDataFromPlugins()`).
*
* Convention: `[ {name: 'Any name', value: 'Any value'} ]`
*
* @see [[getDataFromPlugins]]
*
* @example
* // plugin1.js
* get data () {
* return [
* {
* name: 'userPreferences',
* value: { foo: 'bar' }
* },
* {
* name: 'userPreferences',
* value: { hello: 'world' }
* }
* ]
*
* // plugin2.js
* get requirements () { return new Set(['dataFromPlugins']) }
*
* async beforeLaunch () {
* const prefs = this.getDataFromPlugins('userPreferences').map(d => d.value)
* this.debug(prefs) // => [ { foo: 'bar' }, { hello: 'world' } ]
* }
*/
get data() {
return [];
}
/**
* Access the plugin options (usually the `defaults` merged with user defined options)
*
* To skip the auto-merging of defaults with user supplied opts don't define a `defaults`
* property and set the `this._opts` Object in your plugin constructor directly.
*
* @see [[defaults]]
*
* @example
* get defaults () { return { foo: "bar" } }
*
* async onPageCreated (page) {
* this.debug(this.opts.foo) // => bar
* }
*/
get opts() {
return this._opts;
}
/**
* Convenience debug logger based on the [debug] module.
* Will automatically namespace the logging output to the plugin package name.
* [debug]: https://www.npmjs.com/package/debug
*
* ```bash
* # toggle output using environment variables
* DEBUG=puppeteer-extra-plugin:<plugin_name> node foo.js
* # to debug all the things:
* DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node foo.js
* ```
*
* @example
* this.debug('hello world')
* // will output e.g. 'puppeteer-extra-plugin:anonymize-ua hello world'
*/
get debug() {
return debug(`puppeteer-extra-plugin:${this.name}`);
}
/**
* Before a new browser instance is created/launched.
*
* Can be used to modify the puppeteer launch options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @example
* async beforeLaunch (options) {
* if (this.opts.flashPluginPath) {
* options.args.push(`--ppapi-flash-path=${this.opts.flashPluginPath}`)
* }
* }
*
* @param options - Puppeteer launch options
*/
async beforeLaunch(options) {
// noop
}
/**
* After the browser has launched.
*
* Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
* It's possible that `pupeeteer.launch` will be called multiple times and more than one browser created.
* In order to make the plugins as stateless as possible don't store a reference to the browser instance
* in the plugin but rather consider alternatives.
*
* E.g. when using `onPageCreated` you can get a browser reference by using `page.browser()`.
*
* Alternatively you could expose a class method that takes a browser instance as a parameter to work with:
*
* ```es6
* const fancyPlugin = require('puppeteer-extra-plugin-fancy')()
* puppeteer.use(fancyPlugin)
* const browser = await puppeteer.launch()
* await fancyPlugin.killBrowser(browser)
* ```
*
* @param browser - The `puppeteer` browser instance.
* @param opts.options - Puppeteer launch options used.
*
* @example
* async afterLaunch (browser, opts) {
* this.debug('browser has been launched', opts.options)
* }
*/
async afterLaunch(browser, opts = { options: {} }) {
// noop
}
/**
* Before connecting to an existing browser instance.
*
* Can be used to modify the puppeteer connect options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @param {Object} options - Puppeteer connect options
* @return {Object=}
*/
async beforeConnect(options) {
// noop
}
/**
* After connecting to an existing browser instance.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
* @param {Object} opts
* @param {Object} opts.options - Puppeteer connect options used.
*
*/
async afterConnect(browser, opts = {}) {
// noop
}
/**
* Called when a browser instance is available.
*
* This applies to both `puppeteer.launch()` and `puppeteer.connect()`.
*
* Convenience method created for plugins that need access to a browser instance
* and don't mind if it has been created through `launch` or `connect`.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
*/
async onBrowser(browser, opts) {
// noop
}
/**
* Called when a target is created, for example when a new page is opened by window.open or browser.newPage.
*
* > Note: This includes target creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetCreated(target) {
// noop
}
/**
* Same as `onTargetCreated` but prefiltered to only contain Pages, for convenience.
*
* > Note: This includes page creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*
* @example
* async onPageCreated (page) {
* let ua = await page.browser().userAgent()
* if (this.opts.stripHeadless) {
* ua = ua.replace('HeadlessChrome/', 'Chrome/')
* }
* this.debug('new ua', ua)
* await page.setUserAgent(ua)
* }
*/
async onPageCreated(page) {
// noop
}
/**
* Called when the url of a target changes.
*
* > Note: This includes target changes in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetChanged(target) {
// noop
}
/**
* Called when a target is destroyed, for example when a page is closed.
*
* > Note: This includes target destructions in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetDestroyed(target) {
// noop
}
/**
* Called when Puppeteer gets disconnected from the Chromium instance.
*
* This might happen because of one of the following:
* - Chromium is closed or crashed
* - The `browser.disconnect` method was called
*/
async onDisconnected() {
// noop
}
/**
* **Deprecated:** Since puppeteer v1.6.0 `onDisconnected` has been improved
* and should be used instead of `onClose`.
*
* In puppeteer < v1.6.0 `onDisconnected` was not catching all exit scenarios.
* In order for plugins to clean up properly (e.g. deleting temporary files)
* the `onClose` method had been introduced.
*
* > Note: Might be called multiple times on exit.
*
* > Note: This only includes browser instances created through `.launch()`.
*/
async onClose() {
// noop
}
/**
* After the plugin has been registered in `puppeteer-extra`.
*
* Normally right after `puppeteer.use(plugin)` is called
*/
async onPluginRegistered() {
// noop
}
/**
* Helper method to retrieve `data` objects from other plugins.
*
* A plugin needs to state the `dataFromPlugins` requirement
* in order to use this method. Will be mapped to `puppeteer.getPluginData`.
*
* @param name - Filter data by `name` property
*
* @see [data]
* @see [requirements]
*/
getDataFromPlugins(name) {
return [];
}
/**
* Will match plugin dependencies against all currently registered plugins.
* Is being called by `puppeteer-extra` and used to require missing dependencies.
*
* @param {Array<Object>} plugins
* @return {Set} - list of missing plugin names
*
* @private
*/
_getMissingDependencies(plugins) {
const pluginNames = new Set(plugins.map((p) => p.name));
const missing = new Set(Array.from(this.dependencies.values()).filter(x => !pluginNames.has(x)));
return missing;
}
/**
* Conditionally bind browser/process events to class members.
* The idea is to reduce event binding boilerplate in plugins.
*
* For efficiency we make sure the plugin is using the respective event
* by checking the child class members before registering the listener.
*
* @param {<Puppeteer.Browser>} browser
* @param {Object} opts - Options
* @param {string} opts.context - Puppeteer context (launch/connect)
* @param {Object} [opts.options] - Puppeteer launch or connect options
* @param {Array<string>} [opts.defaultArgs] - The default flags that Chromium will be launched with
*
* @private
*/
async _bindBrowserEvents(browser, opts = {}) {
if (this._hasChildClassMember('onTargetCreated') ||
this._hasChildClassMember('onPageCreated')) {
browser.on('targetcreated', this._onTargetCreated.bind(this));
}
if (this._hasChildClassMember('onTargetChanged') && this.onTargetChanged) {
browser.on('targetchanged', this.onTargetChanged.bind(this));
}
if (this._hasChildClassMember('onTargetDestroyed') &&
this.onTargetDestroyed) {
browser.on('targetdestroyed', this.onTargetDestroyed.bind(this));
}
if (this._hasChildClassMember('onDisconnected') && this.onDisconnected) {
browser.on('disconnected', this.onDisconnected.bind(this));
}
if (opts.context === 'launch' && this._hasChildClassMember('onClose')) {
// The disconnect event has been improved since puppeteer v1.6.0
// onClose is being kept mostly for legacy reasons
if (this.onClose) {
process.on('exit', this.onClose.bind(this));
browser.on('disconnected', this.onClose.bind(this));
if (opts.options.handleSIGINT !== false) {
process.on('SIGINT', this.onClose.bind(this));
}
if (opts.options.handleSIGTERM !== false) {
process.on('SIGTERM', this.onClose.bind(this));
}
if (opts.options.handleSIGHUP !== false) {
process.on('SIGHUP', this.onClose.bind(this));
}
}
}
if (opts.context === 'launch' && this.afterLaunch) {
await this.afterLaunch(browser, opts);
}
if (opts.context === 'connect' && this.afterConnect) {
await this.afterConnect(browser, opts);
}
if (this.onBrowser)
await this.onBrowser(browser, opts);
}
/**
* @private
*/
async _onTargetCreated(target) {
if (this.onTargetCreated)
await this.onTargetCreated(target);
// Pre filter pages for plugin developers convenience
if (target.type() === 'page') {
try {
const page = await target.page();
if (!page) {
return;
}
const validPage = 'isClosed' in page && !page.isClosed();
if (this.onPageCreated && validPage) {
await this.onPageCreated(page);
}
}
catch (err) {
console.error(err);
}
}
}
/**
* @private
*/
_register(prototype) {
this._registerChildClassMembers(prototype);
if (this.onPluginRegistered)
this.onPluginRegistered();
}
/**
* @private
*/
_registerChildClassMembers(prototype) {
this._childClassMembers = Object.getOwnPropertyNames(prototype);
}
/**
* @private
*/
_hasChildClassMember(name) {
return !!this._childClassMembers.includes(name);
}
/**
* @private
*/
get _isPuppeteerExtraPlugin() {
return true;
}
}
export { PuppeteerExtraPlugin };
//# sourceMappingURL=index.esm.js.map

File diff suppressed because one or more lines are too long

526
node_modules/puppeteer-extra-plugin/dist/index.js generated vendored Normal file
View File

@@ -0,0 +1,526 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PuppeteerExtraPlugin = void 0;
const debug_1 = __importDefault(require("debug"));
/** @private */
const merge = require('merge-deep');
/**
* Base class for `puppeteer-extra` plugins.
*
* Provides convenience methods to avoid boilerplate.
*
* All common `puppeteer` browser events will be bound to
* the plugin instance, if a respectively named class member is found.
*
* Please refer to the [puppeteer API documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) as well.
*
* @example
* // hello-world-plugin.js
* const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
*
* class Plugin extends PuppeteerExtraPlugin {
* constructor (opts = { }) { super(opts) }
*
* get name () { return 'hello-world' }
*
* async onPageCreated (page) {
* this.debug('page created', page.url())
* const ua = await page.browser().userAgent()
* this.debug('user agent', ua)
* }
* }
*
* module.exports = function (pluginConfig) { return new Plugin(pluginConfig) }
*
*
* // foo.js
* const puppeteer = require('puppeteer-extra')
* puppeteer.use(require('./hello-world-plugin')())
*
* ;(async () => {
* const browser = await puppeteer.launch({headless: false})
* const page = await browser.newPage()
* await page.goto('http://example.com', {waitUntil: 'domcontentloaded'})
* await browser.close()
* })()
*
*/
class PuppeteerExtraPlugin {
constructor(opts) {
this._debugBase = (0, debug_1.default)(`puppeteer-extra-plugin:base:${this.name}`);
this._childClassMembers = [];
this._opts = merge(this.defaults, opts || {});
this._debugBase('Initialized.');
}
/**
* Plugin name (required).
*
* Convention:
* - Package: `puppeteer-extra-plugin-anonymize-ua`
* - Name: `anonymize-ua`
*
* @example
* get name () { return 'anonymize-ua' }
*/
get name() {
throw new Error('Plugin must override "name"');
}
/**
* Plugin defaults (optional).
*
* If defined will be ([deep-](https://github.com/jonschlinkert/merge-deep))merged with the (optional) user supplied options (supplied during plugin instantiation).
*
* The result of merging defaults with user supplied options can be accessed through `this.opts`.
*
* @see [[opts]]
*
* @example
* get defaults () {
* return {
* stripHeadless: true,
* makeWindows: true,
* customFn: null
* }
* }
*
* // Users can overwrite plugin defaults during instantiation:
* puppeteer.use(require('puppeteer-extra-plugin-foobar')({ makeWindows: false }))
*/
get defaults() {
return {};
}
/**
* Plugin requirements (optional).
*
* Signal certain plugin requirements to the base class and the user.
*
* Currently supported:
* - `launch`
* - If the plugin only supports locally created browser instances (no `puppeteer.connect()`),
* will output a warning to the user.
* - `headful`
* - If the plugin doesn't work in `headless: true` mode,
* will output a warning to the user.
* - `dataFromPlugins`
* - In case the plugin requires data from other plugins.
* will enable usage of `this.getDataFromPlugins()`.
* - `runLast`
* - In case the plugin prefers to run after the others.
* Useful when the plugin needs data from others.
*
* @example
* get requirements () {
* return new Set(['runLast', 'dataFromPlugins'])
* }
*/
get requirements() {
return new Set([]);
}
/**
* Plugin dependencies (optional).
*
* Missing plugins will be required() by puppeteer-extra.
*
* @example
* get dependencies () {
* return new Set(['user-preferences'])
* }
* // Will ensure the 'puppeteer-extra-plugin-user-preferences' plugin is loaded.
*/
get dependencies() {
return new Set([]);
}
/**
* Plugin data (optional).
*
* Plugins can expose data (an array of objects), which in turn can be consumed by other plugins,
* that list the `dataFromPlugins` requirement (by using `this.getDataFromPlugins()`).
*
* Convention: `[ {name: 'Any name', value: 'Any value'} ]`
*
* @see [[getDataFromPlugins]]
*
* @example
* // plugin1.js
* get data () {
* return [
* {
* name: 'userPreferences',
* value: { foo: 'bar' }
* },
* {
* name: 'userPreferences',
* value: { hello: 'world' }
* }
* ]
*
* // plugin2.js
* get requirements () { return new Set(['dataFromPlugins']) }
*
* async beforeLaunch () {
* const prefs = this.getDataFromPlugins('userPreferences').map(d => d.value)
* this.debug(prefs) // => [ { foo: 'bar' }, { hello: 'world' } ]
* }
*/
get data() {
return [];
}
/**
* Access the plugin options (usually the `defaults` merged with user defined options)
*
* To skip the auto-merging of defaults with user supplied opts don't define a `defaults`
* property and set the `this._opts` Object in your plugin constructor directly.
*
* @see [[defaults]]
*
* @example
* get defaults () { return { foo: "bar" } }
*
* async onPageCreated (page) {
* this.debug(this.opts.foo) // => bar
* }
*/
get opts() {
return this._opts;
}
/**
* Convenience debug logger based on the [debug] module.
* Will automatically namespace the logging output to the plugin package name.
* [debug]: https://www.npmjs.com/package/debug
*
* ```bash
* # toggle output using environment variables
* DEBUG=puppeteer-extra-plugin:<plugin_name> node foo.js
* # to debug all the things:
* DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node foo.js
* ```
*
* @example
* this.debug('hello world')
* // will output e.g. 'puppeteer-extra-plugin:anonymize-ua hello world'
*/
get debug() {
return (0, debug_1.default)(`puppeteer-extra-plugin:${this.name}`);
}
/**
* Before a new browser instance is created/launched.
*
* Can be used to modify the puppeteer launch options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @example
* async beforeLaunch (options) {
* if (this.opts.flashPluginPath) {
* options.args.push(`--ppapi-flash-path=${this.opts.flashPluginPath}`)
* }
* }
*
* @param options - Puppeteer launch options
*/
async beforeLaunch(options) {
// noop
}
/**
* After the browser has launched.
*
* Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
* It's possible that `pupeeteer.launch` will be called multiple times and more than one browser created.
* In order to make the plugins as stateless as possible don't store a reference to the browser instance
* in the plugin but rather consider alternatives.
*
* E.g. when using `onPageCreated` you can get a browser reference by using `page.browser()`.
*
* Alternatively you could expose a class method that takes a browser instance as a parameter to work with:
*
* ```es6
* const fancyPlugin = require('puppeteer-extra-plugin-fancy')()
* puppeteer.use(fancyPlugin)
* const browser = await puppeteer.launch()
* await fancyPlugin.killBrowser(browser)
* ```
*
* @param browser - The `puppeteer` browser instance.
* @param opts.options - Puppeteer launch options used.
*
* @example
* async afterLaunch (browser, opts) {
* this.debug('browser has been launched', opts.options)
* }
*/
async afterLaunch(browser, opts = { options: {} }) {
// noop
}
/**
* Before connecting to an existing browser instance.
*
* Can be used to modify the puppeteer connect options by modifying or returning them.
*
* Plugins using this method will be called in sequence to each
* be able to update the launch options.
*
* @param {Object} options - Puppeteer connect options
* @return {Object=}
*/
async beforeConnect(options) {
// noop
}
/**
* After connecting to an existing browser instance.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
* @param {Object} opts
* @param {Object} opts.options - Puppeteer connect options used.
*
*/
async afterConnect(browser, opts = {}) {
// noop
}
/**
* Called when a browser instance is available.
*
* This applies to both `puppeteer.launch()` and `puppeteer.connect()`.
*
* Convenience method created for plugins that need access to a browser instance
* and don't mind if it has been created through `launch` or `connect`.
*
* > Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
*
* @param browser - The `puppeteer` browser instance.
*/
async onBrowser(browser, opts) {
// noop
}
/**
* Called when a target is created, for example when a new page is opened by window.open or browser.newPage.
*
* > Note: This includes target creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetCreated(target) {
// noop
}
/**
* Same as `onTargetCreated` but prefiltered to only contain Pages, for convenience.
*
* > Note: This includes page creations in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*
* @example
* async onPageCreated (page) {
* let ua = await page.browser().userAgent()
* if (this.opts.stripHeadless) {
* ua = ua.replace('HeadlessChrome/', 'Chrome/')
* }
* this.debug('new ua', ua)
* await page.setUserAgent(ua)
* }
*/
async onPageCreated(page) {
// noop
}
/**
* Called when the url of a target changes.
*
* > Note: This includes target changes in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetChanged(target) {
// noop
}
/**
* Called when a target is destroyed, for example when a page is closed.
*
* > Note: This includes target destructions in incognito browser contexts.
*
* > Note: This includes browser instances created through `.launch()` as well as `.connect()`.
*
* @param {Puppeteer.Target} target
*/
async onTargetDestroyed(target) {
// noop
}
/**
* Called when Puppeteer gets disconnected from the Chromium instance.
*
* This might happen because of one of the following:
* - Chromium is closed or crashed
* - The `browser.disconnect` method was called
*/
async onDisconnected() {
// noop
}
/**
* **Deprecated:** Since puppeteer v1.6.0 `onDisconnected` has been improved
* and should be used instead of `onClose`.
*
* In puppeteer < v1.6.0 `onDisconnected` was not catching all exit scenarios.
* In order for plugins to clean up properly (e.g. deleting temporary files)
* the `onClose` method had been introduced.
*
* > Note: Might be called multiple times on exit.
*
* > Note: This only includes browser instances created through `.launch()`.
*/
async onClose() {
// noop
}
/**
* After the plugin has been registered in `puppeteer-extra`.
*
* Normally right after `puppeteer.use(plugin)` is called
*/
async onPluginRegistered() {
// noop
}
/**
* Helper method to retrieve `data` objects from other plugins.
*
* A plugin needs to state the `dataFromPlugins` requirement
* in order to use this method. Will be mapped to `puppeteer.getPluginData`.
*
* @param name - Filter data by `name` property
*
* @see [data]
* @see [requirements]
*/
getDataFromPlugins(name) {
return [];
}
/**
* Will match plugin dependencies against all currently registered plugins.
* Is being called by `puppeteer-extra` and used to require missing dependencies.
*
* @param {Array<Object>} plugins
* @return {Set} - list of missing plugin names
*
* @private
*/
_getMissingDependencies(plugins) {
const pluginNames = new Set(plugins.map((p) => p.name));
const missing = new Set(Array.from(this.dependencies.values()).filter(x => !pluginNames.has(x)));
return missing;
}
/**
* Conditionally bind browser/process events to class members.
* The idea is to reduce event binding boilerplate in plugins.
*
* For efficiency we make sure the plugin is using the respective event
* by checking the child class members before registering the listener.
*
* @param {<Puppeteer.Browser>} browser
* @param {Object} opts - Options
* @param {string} opts.context - Puppeteer context (launch/connect)
* @param {Object} [opts.options] - Puppeteer launch or connect options
* @param {Array<string>} [opts.defaultArgs] - The default flags that Chromium will be launched with
*
* @private
*/
async _bindBrowserEvents(browser, opts = {}) {
if (this._hasChildClassMember('onTargetCreated') ||
this._hasChildClassMember('onPageCreated')) {
browser.on('targetcreated', this._onTargetCreated.bind(this));
}
if (this._hasChildClassMember('onTargetChanged') && this.onTargetChanged) {
browser.on('targetchanged', this.onTargetChanged.bind(this));
}
if (this._hasChildClassMember('onTargetDestroyed') &&
this.onTargetDestroyed) {
browser.on('targetdestroyed', this.onTargetDestroyed.bind(this));
}
if (this._hasChildClassMember('onDisconnected') && this.onDisconnected) {
browser.on('disconnected', this.onDisconnected.bind(this));
}
if (opts.context === 'launch' && this._hasChildClassMember('onClose')) {
// The disconnect event has been improved since puppeteer v1.6.0
// onClose is being kept mostly for legacy reasons
if (this.onClose) {
process.on('exit', this.onClose.bind(this));
browser.on('disconnected', this.onClose.bind(this));
if (opts.options.handleSIGINT !== false) {
process.on('SIGINT', this.onClose.bind(this));
}
if (opts.options.handleSIGTERM !== false) {
process.on('SIGTERM', this.onClose.bind(this));
}
if (opts.options.handleSIGHUP !== false) {
process.on('SIGHUP', this.onClose.bind(this));
}
}
}
if (opts.context === 'launch' && this.afterLaunch) {
await this.afterLaunch(browser, opts);
}
if (opts.context === 'connect' && this.afterConnect) {
await this.afterConnect(browser, opts);
}
if (this.onBrowser)
await this.onBrowser(browser, opts);
}
/**
* @private
*/
async _onTargetCreated(target) {
if (this.onTargetCreated)
await this.onTargetCreated(target);
// Pre filter pages for plugin developers convenience
if (target.type() === 'page') {
try {
const page = await target.page();
if (!page) {
return;
}
const validPage = 'isClosed' in page && !page.isClosed();
if (this.onPageCreated && validPage) {
await this.onPageCreated(page);
}
}
catch (err) {
console.error(err);
}
}
}
/**
* @private
*/
_register(prototype) {
this._registerChildClassMembers(prototype);
if (this.onPluginRegistered)
this.onPluginRegistered();
}
/**
* @private
*/
_registerChildClassMembers(prototype) {
this._childClassMembers = Object.getOwnPropertyNames(prototype);
}
/**
* @private
*/
_hasChildClassMember(name) {
return !!this._childClassMembers.includes(name);
}
/**
* @private
*/
get _isPuppeteerExtraPlugin() {
return true;
}
}
exports.PuppeteerExtraPlugin = PuppeteerExtraPlugin;
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
export {};

115
node_modules/puppeteer-extra-plugin/dist/index.test.js generated vendored Normal file
View File

@@ -0,0 +1,115 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = __importDefault(require("ava"));
const _1 = require(".");
(0, ava_1.default)('is a function', async (t) => {
t.is(typeof _1.PuppeteerExtraPlugin, 'function');
});
(0, ava_1.default)('will throw without a name', async (t) => {
class Derived extends _1.PuppeteerExtraPlugin {
}
const error = await t.throws(() => new Derived());
t.is(error.message, `Plugin must override "name"`);
});
(0, ava_1.default)('should have the basic class members', async (t) => {
const pluginName = 'hello-world';
class Plugin extends _1.PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts);
}
get name() {
return pluginName;
}
}
const instance = new Plugin();
t.is(instance.name, pluginName);
t.true(instance.requirements instanceof Set);
t.true(instance.dependencies instanceof Set);
t.true(instance.data instanceof Array);
t.true(instance.defaults instanceof Object);
t.is(instance.data.length, 0);
t.true(instance.debug instanceof Function);
t.is(instance.debug.namespace, `puppeteer-extra-plugin:${pluginName}`);
t.true(instance._isPuppeteerExtraPlugin);
});
(0, ava_1.default)('should have the public class members', async (t) => {
const pluginName = 'hello-world';
class Plugin extends _1.PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts);
}
get name() {
return pluginName;
}
}
const instance = new Plugin();
t.true(instance.beforeLaunch instanceof Function);
t.true(instance.afterLaunch instanceof Function);
t.true(instance.onTargetCreated instanceof Function);
t.true(instance.onBrowser instanceof Function);
t.true(instance.onPageCreated instanceof Function);
t.true(instance.onTargetChanged instanceof Function);
t.true(instance.onTargetDestroyed instanceof Function);
t.true(instance.onDisconnected instanceof Function);
t.true(instance.onClose instanceof Function);
t.true(instance.onPluginRegistered instanceof Function);
t.true(instance.getDataFromPlugins instanceof Function);
});
(0, ava_1.default)('should have the internal class members', async (t) => {
const pluginName = 'hello-world';
class Plugin extends _1.PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts);
}
get name() {
return pluginName;
}
}
const instance = new Plugin();
t.true(instance._getMissingDependencies instanceof Function);
t.true(instance._bindBrowserEvents instanceof Function);
t.true(instance._onTargetCreated instanceof Function);
t.true(instance._register instanceof Function);
t.true(instance._registerChildClassMembers instanceof Function);
t.true(instance._hasChildClassMember instanceof Function);
});
(0, ava_1.default)('should merge opts with defaults automatically', async (t) => {
const pluginName = 'hello-world';
const pluginDefaults = { foo: 'bar', foo2: 'bar2', extra1: 123 };
const userOpts = { foo2: 'bob', extra2: 666 };
class Plugin extends _1.PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts);
}
get name() {
return pluginName;
}
get defaults() {
return pluginDefaults;
}
}
const instance = new Plugin(userOpts);
t.deepEqual(instance.defaults, pluginDefaults);
t.is(instance.opts.foo, pluginDefaults.foo);
t.is(instance.opts.foo2, userOpts.foo2);
t.is(instance.opts.extra1, pluginDefaults.extra1);
t.is(instance.opts.extra2, userOpts.extra2);
});
(0, ava_1.default)('should have opts when defaults is not defined', async (t) => {
const pluginName = 'hello-world';
const userOpts = { foo2: 'bob', extra2: 666 };
class Plugin extends _1.PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts);
}
get name() {
return pluginName;
}
}
const instance = new Plugin(userOpts);
t.deepEqual(instance.opts, userOpts);
});
//# sourceMappingURL=index.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":";;;;;AAAA,8CAAsB;AAEtB,wBAAwC;AAExC,IAAA,aAAI,EAAC,eAAe,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC9B,CAAC,CAAC,EAAE,CAAC,OAAO,uBAAoB,EAAE,UAAU,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,2BAA2B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC1C,MAAM,OAAQ,SAAQ,uBAAoB;KAAG;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;IACjD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAA;AACpD,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,qCAAqC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACpD,MAAM,UAAU,GAAG,aAAa,CAAA;IAChC,MAAM,MAAO,SAAQ,uBAAoB;QACvC,YAAY,IAAI,GAAG,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QACD,IAAI,IAAI;YACN,OAAO,UAAU,CAAA;QACnB,CAAC;KACF;IACD,MAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAA;IAE7B,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IAC/B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,YAAY,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,YAAY,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,YAAY,MAAM,CAAC,CAAA;IAC3C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAA;IAC1C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACtE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,sCAAsC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACrD,MAAM,UAAU,GAAG,aAAa,CAAA;IAChC,MAAM,MAAO,SAAQ,uBAAoB;QACvC,YAAY,IAAI,GAAG,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QACD,IAAI,IAAI;YACN,OAAO,UAAU,CAAA;QACnB,CAAC;KACF;IACD,MAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAA;IAE7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,YAAY,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,YAAY,QAAQ,CAAC,CAAA;IAChD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,YAAY,QAAQ,CAAC,CAAA;IACpD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,YAAY,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,YAAY,QAAQ,CAAC,CAAA;IAClD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,YAAY,QAAQ,CAAC,CAAA;IACpD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,YAAY,QAAQ,CAAC,CAAA;IACtD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,YAAY,QAAQ,CAAC,CAAA;IACnD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,YAAY,QAAQ,CAAC,CAAA;IAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,YAAY,QAAQ,CAAC,CAAA;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,YAAY,QAAQ,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,wCAAwC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IACvD,MAAM,UAAU,GAAG,aAAa,CAAA;IAChC,MAAM,MAAO,SAAQ,uBAAoB;QACvC,YAAY,IAAI,GAAG,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QACD,IAAI,IAAI;YACN,OAAO,UAAU,CAAA;QACnB,CAAC;KACF;IACD,MAAM,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAA;IAE7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,YAAY,QAAQ,CAAC,CAAA;IAC5D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,YAAY,QAAQ,CAAC,CAAA;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,YAAY,QAAQ,CAAC,CAAA;IACrD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,YAAY,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,0BAA0B,YAAY,QAAQ,CAAC,CAAA;IAC/D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,YAAY,QAAQ,CAAC,CAAA;AAC3D,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,+CAA+C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC9D,MAAM,UAAU,GAAG,aAAa,CAAA;IAChC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAChE,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAE7C,MAAM,MAAO,SAAQ,uBAAoB;QACvC,YAAY,IAAI,GAAG,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QACD,IAAI,IAAI;YACN,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,cAAc,CAAA;QACvB,CAAC;KACF;IACD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IAErC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IAC9C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAA;IAC3C,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,IAAA,aAAI,EAAC,+CAA+C,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC9D,MAAM,UAAU,GAAG,aAAa,CAAA;IAChC,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;IAE7C,MAAM,MAAO,SAAQ,uBAAoB;QACvC,YAAY,IAAI,GAAG,EAAE;YACnB,KAAK,CAAC,IAAI,CAAC,CAAA;QACb,CAAC;QACD,IAAI,IAAI;YACN,OAAO,UAAU,CAAA;QACnB,CAAC;KACF;IACD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAA;IAErC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA"}

View File

@@ -0,0 +1,5 @@
export { Browser } from 'puppeteer';
export { Page } from 'puppeteer';
export { Target } from 'puppeteer';
export { ConnectOptions } from 'puppeteer';
export { LaunchOptions } from 'puppeteer';

13
node_modules/puppeteer-extra-plugin/dist/puppeteer.js generated vendored Normal file
View File

@@ -0,0 +1,13 @@
"use strict";
// A wildcard import would result in a `require("puppeteer")` statement
// at the top of the transpiled js file, not what we want. :-/
// "import type" is a solution here but requires TS >= v3.8 which we don't want to require yet as a minimum.
Object.defineProperty(exports, "__esModule", { value: true });
exports.Target = exports.Page = exports.Browser = void 0;
var puppeteer_1 = require("puppeteer");
Object.defineProperty(exports, "Browser", { enumerable: true, get: function () { return puppeteer_1.Browser; } });
var puppeteer_2 = require("puppeteer");
Object.defineProperty(exports, "Page", { enumerable: true, get: function () { return puppeteer_2.Page; } });
var puppeteer_3 = require("puppeteer");
Object.defineProperty(exports, "Target", { enumerable: true, get: function () { return puppeteer_3.Target; } });
//# sourceMappingURL=puppeteer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../src/puppeteer.ts"],"names":[],"mappings":";AAAA,uEAAuE;AACvE,8DAA8D;AAC9D,4GAA4G;;;AAE5G,uCAAmC;AAA1B,oGAAA,OAAO,OAAA;AAChB,uCAAgC;AAAvB,iGAAA,IAAI,OAAA;AACb,uCAAkC;AAAzB,mGAAA,MAAM,OAAA"}

82
node_modules/puppeteer-extra-plugin/package.json generated vendored Normal file
View File

@@ -0,0 +1,82 @@
{
"name": "puppeteer-extra-plugin",
"version": "3.2.3",
"description": "Base class for puppeteer-extra plugins.",
"main": "dist/index.cjs.js",
"module": "dist/index.esm.js",
"typings": "dist/index.d.ts",
"files": [
"dist"
],
"repository": "berstend/puppeteer-extra",
"homepage": "https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin",
"author": "berstend",
"license": "MIT",
"scripts": {
"clean": "rimraf dist/*",
"prebuild": "run-s clean",
"build": "run-s build:tsc build:rollup",
"build:tsc": "tsc --module commonjs",
"build:rollup": "rollup -c rollup.config.ts",
"docs": "documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts",
"postdocs": "npx prettier --write readme.md",
"test": "ava -v --config ava.config-ts.js",
"pretest-ci": "run-s build",
"test-ci": "ava --fail-fast -v"
},
"engines": {
"node": ">=9.11.2"
},
"prettier": {
"printWidth": 80,
"semi": false,
"singleQuote": true
},
"keywords": [
"puppeteer",
"puppeteer-extra",
"puppeteer-extra-plugin",
"ua",
"user-agent",
"chrome",
"headless",
"pupeteer"
],
"devDependencies": {
"@types/node": "14.14.34",
"@types/puppeteer": "*",
"ava": "2.4.0",
"documentation-markdown-themes": "^12.1.5",
"npm-run-all": "^4.1.5",
"puppeteer": "9",
"rimraf": "^3.0.0",
"rollup": "^1.27.5",
"rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-sourcemaps": "^0.4.2",
"rollup-plugin-typescript2": "^0.25.2",
"ts-node": "^8.5.4",
"tslint": "^5.12.1",
"tslint-config-prettier": "^1.18.0",
"tslint-config-standard": "^9.0.0",
"typescript": "4.4.3"
},
"dependencies": {
"@types/debug": "^4.1.0",
"debug": "^4.1.1",
"merge-deep": "^3.0.1"
},
"peerDependencies": {
"playwright-extra": "*",
"puppeteer-extra": "*"
},
"peerDependenciesMeta": {
"puppeteer-extra": {
"optional": true
},
"playwright-extra": {
"optional": true
}
},
"gitHead": "2f4a357f233b35a7a20f16ce007f5ef3f62765b9"
}

509
node_modules/puppeteer-extra-plugin/readme.md generated vendored Normal file
View File

@@ -0,0 +1,509 @@
# puppeteer-extra-plugin [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/berstend/puppeteer-extra/test.yml?branch=master&event=push)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](https://extra.community) [![npm](https://img.shields.io/npm/v/puppeteer-extra-plugin.svg)](https://www.npmjs.com/package/puppeteer-extra-plugin)
## Installation
```bash
yarn add puppeteer-extra-plugin
```
## Changelog
<details>
<summary><strong>v3.0.1</strong></summary><br>
- Now written in TypeScript 🎉
- **Breaking change:** Now using a named export:
```js
// Before
const PuppeteerExtraPlugin = require('puppeteer-extra-plugin')
// After (>= v3.0.1)
const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
```
</details>
## API
<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
#### Table of Contents
- [puppeteer-extra-plugin ![GitHub Workflow Status](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](https://extra.community) [![npm](https://img.shields.io/npm/v/puppeteer-extra-plugin.svg)](https://www.npmjs.com/package/puppeteer-extra-plugin)](#puppeteer-extra-plugin---)
- [Installation](#installation)
- [Changelog](#changelog)
- [API](#api)
- [Table of Contents](#table-of-contents)
- [class: PuppeteerExtraPlugin](#class-puppeteerextraplugin)
- [.name](#name)
- [.defaults](#defaults)
- [.requirements](#requirements)
- [.dependencies](#dependencies)
- [.data](#data)
- [.opts](#opts)
- [.debug](#debug)
- [.beforeLaunch(options)](#beforelaunchoptions)
- [.afterLaunch(browser, opts)](#afterlaunchbrowser-opts)
- [.beforeConnect(options)](#beforeconnectoptions)
- [.afterConnect(browser, opts)](#afterconnectbrowser-opts)
- [.onBrowser(browser, opts)](#onbrowserbrowser-opts)
- [.onTargetCreated(target)](#ontargetcreatedtarget)
- [.onPageCreated(page, target)](#onpagecreatedpage-target)
- [.onTargetChanged(target)](#ontargetchangedtarget)
- [.onTargetDestroyed(target)](#ontargetdestroyedtarget)
- [.onDisconnected()](#ondisconnected)
- [.onClose()](#onclose)
- [.onPluginRegistered()](#onpluginregistered)
- [.getDataFromPlugins(name?)](#getdatafrompluginsname)
### class: [PuppeteerExtraPlugin](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L65-L572)
- `opts` **PluginOptions?**
Base class for `puppeteer-extra` plugins.
Provides convenience methods to avoid boilerplate.
All common `puppeteer` browser events will be bound to
the plugin instance, if a respectively named class member is found.
Please refer to the [puppeteer API documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) as well.
Example:
```javascript
// hello-world-plugin.js
const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin')
class Plugin extends PuppeteerExtraPlugin {
constructor(opts = {}) {
super(opts)
}
get name() {
return 'hello-world'
}
async onPageCreated(page) {
this.debug('page created', page.url())
const ua = await page.browser().userAgent()
this.debug('user agent', ua)
}
}
module.exports = function(pluginConfig) {
return new Plugin(pluginConfig)
}
// foo.js
const puppeteer = require('puppeteer-extra')
puppeteer.use(require('./hello-world-plugin')())
;(async () => {
const browser = await puppeteer.launch({ headless: false })
const page = await browser.newPage()
await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })
await browser.close()
})()
```
---
#### .[name](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L92-L94)
Type: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**
Plugin name (required).
Convention:
- Package: `puppeteer-extra-plugin-anonymize-ua`
- Name: `anonymize-ua`
Example:
```javascript
get name () { return 'anonymize-ua' }
```
---
#### .[defaults](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L117-L119)
Type: **PluginOptions**
Plugin defaults (optional).
If defined will be ([deep-](https://github.com/jonschlinkert/merge-deep))merged with the (optional) user supplied options (supplied during plugin instantiation).
The result of merging defaults with user supplied options can be accessed through `this.opts`.
Example:
```javascript
get defaults () {
return {
stripHeadless: true,
makeWindows: true,
customFn: null
}
}
// Users can overwrite plugin defaults during instantiation:
puppeteer.use(require('puppeteer-extra-plugin-foobar')({ makeWindows: false }))
```
- **See: \[[opts]]**
---
#### .[requirements](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L145-L147)
Type: **PluginRequirements**
Plugin requirements (optional).
Signal certain plugin requirements to the base class and the user.
Currently supported:
- `launch`
- If the plugin only supports locally created browser instances (no `puppeteer.connect()`),
will output a warning to the user.
- `headful`
- If the plugin doesn't work in `headless: true` mode,
will output a warning to the user.
- `dataFromPlugins`
- In case the plugin requires data from other plugins.
will enable usage of `this.getDataFromPlugins()`.
- `runLast`
- In case the plugin prefers to run after the others.
Useful when the plugin needs data from others.
Example:
```javascript
get requirements () {
return new Set(['runLast', 'dataFromPlugins'])
}
```
---
#### .[dependencies](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L160-L162)
Type: **PluginDependencies**
Plugin dependencies (optional).
Missing plugins will be required() by puppeteer-extra.
Example:
```javascript
get dependencies () {
return new Set(['user-preferences'])
}
// Will ensure the 'puppeteer-extra-plugin-user-preferences' plugin is loaded.
```
---
#### .[data](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L196-L198)
Type: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PluginData>**
Plugin data (optional).
Plugins can expose data (an array of objects), which in turn can be consumed by other plugins,
that list the `dataFromPlugins` requirement (by using `this.getDataFromPlugins()`).
Convention: `[ {name: 'Any name', value: 'Any value'} ]`
Example:
```javascript
// plugin1.js
get data () {
return [
{
name: 'userPreferences',
value: { foo: 'bar' }
},
{
name: 'userPreferences',
value: { hello: 'world' }
}
]
// plugin2.js
get requirements () { return new Set(['dataFromPlugins']) }
async beforeLaunch () {
const prefs = this.getDataFromPlugins('userPreferences').map(d => d.value)
this.debug(prefs) // => [ { foo: 'bar' }, { hello: 'world' } ]
}
```
- **See: \[[getDataFromPlugins]]**
---
#### .[opts](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L215-L217)
Type: **PluginOptions**
Access the plugin options (usually the `defaults` merged with user defined options)
To skip the auto-merging of defaults with user supplied opts don't define a `defaults`
property and set the `this._opts` Object in your plugin constructor directly.
Example:
```javascript
get defaults () { return { foo: "bar" } }
async onPageCreated (page) {
this.debug(this.opts.foo) // => bar
}
```
- **See: \[[defaults]]**
---
#### .[debug](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L235-L237)
Type: **Debugger**
Convenience debug logger based on the [debug] module.
Will automatically namespace the logging output to the plugin package name.
[debug]: https://www.npmjs.com/package/debug
```bash
# toggle output using environment variables
DEBUG=puppeteer-extra-plugin:<plugin_name> node foo.js
# to debug all the things:
DEBUG=puppeteer-extra,puppeteer-extra-plugin:* node foo.js
```
Example:
```javascript
this.debug('hello world')
// will output e.g. 'puppeteer-extra-plugin:anonymize-ua hello world'
```
---
#### .[beforeLaunch(options)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L256-L258)
- `options` **any** Puppeteer launch options
Before a new browser instance is created/launched.
Can be used to modify the puppeteer launch options by modifying or returning them.
Plugins using this method will be called in sequence to each
be able to update the launch options.
Example:
```javascript
async beforeLaunch (options) {
if (this.opts.flashPluginPath) {
options.args.push(`--ppapi-flash-path=${this.opts.flashPluginPath}`)
}
}
```
---
#### .[afterLaunch(browser, opts)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L287-L292)
- `browser` **Puppeteer.Browser** The `puppeteer` browser instance.
- `opts` (optional, default `{options:({}as Puppeteer.LaunchOptions)}`)
After the browser has launched.
Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
It's possible that `pupeeteer.launch` will be called multiple times and more than one browser created.
In order to make the plugins as stateless as possible don't store a reference to the browser instance
in the plugin but rather consider alternatives.
E.g. when using `onPageCreated` you can get a browser reference by using `page.browser()`.
Alternatively you could expose a class method that takes a browser instance as a parameter to work with:
```es6
const fancyPlugin = require('puppeteer-extra-plugin-fancy')()
puppeteer.use(fancyPlugin)
const browser = await puppeteer.launch()
await fancyPlugin.killBrowser(browser)
```
Example:
```javascript
async afterLaunch (browser, opts) {
this.debug('browser has been launched', opts.options)
}
```
---
#### .[beforeConnect(options)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L305-L307)
- `options` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** Puppeteer connect options
Before connecting to an existing browser instance.
Can be used to modify the puppeteer connect options by modifying or returning them.
Plugins using this method will be called in sequence to each
be able to update the launch options.
---
#### .[afterConnect(browser, opts)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L319-L321)
- `browser` **Puppeteer.Browser** The `puppeteer` browser instance.
- `opts` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** (optional, default `{}`)
- `opts.options` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** Puppeteer connect options used.
After connecting to an existing browser instance.
> Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
---
#### .[onBrowser(browser, opts)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L335-L337)
- `browser` **Puppeteer.Browser** The `puppeteer` browser instance.
- `opts` **any**
Returns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;void>**
Called when a browser instance is available.
This applies to both `puppeteer.launch()` and `puppeteer.connect()`.
Convenience method created for plugins that need access to a browser instance
and don't mind if it has been created through `launch` or `connect`.
> Note: Don't assume that there will only be a single browser instance during the lifecycle of a plugin.
---
#### .[onTargetCreated(target)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L348-L350)
- `target` **Puppeteer.Target**
Called when a target is created, for example when a new page is opened by window.open or browser.newPage.
> Note: This includes target creations in incognito browser contexts.
>
> Note: This includes browser instances created through `.launch()` as well as `.connect()`.
---
#### .[onPageCreated(page, target)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L371-L373)
- `page` **Puppeteer.Page**
- `target` **Puppeteer.Target**
Same as `onTargetCreated` but prefiltered to only contain Pages, for convenience.
> Note: This includes page creations in incognito browser contexts.
>
> Note: This includes browser instances created through `.launch()` as well as `.connect()`.
Example:
```javascript
async onPageCreated (page) {
let ua = await page.browser().userAgent()
if (this.opts.stripHeadless) {
ua = ua.replace('HeadlessChrome/', 'Chrome/')
}
this.debug('new ua', ua)
await page.setUserAgent(ua)
}
```
---
#### .[onTargetChanged(target)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L384-L386)
- `target` **Puppeteer.Target**
Called when the url of a target changes.
> Note: This includes target changes in incognito browser contexts.
>
> Note: This includes browser instances created through `.launch()` as well as `.connect()`.
---
#### .[onTargetDestroyed(target)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L397-L399)
- `target` **Puppeteer.Target**
Called when a target is destroyed, for example when a page is closed.
> Note: This includes target destructions in incognito browser contexts.
>
> Note: This includes browser instances created through `.launch()` as well as `.connect()`.
---
#### .[onDisconnected()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L408-L410)
Called when Puppeteer gets disconnected from the Chromium instance.
This might happen because of one of the following:
- Chromium is closed or crashed
- The `browser.disconnect` method was called
---
#### .[onClose()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L424-L426)
**Deprecated:** Since puppeteer v1.6.0 `onDisconnected` has been improved
and should be used instead of `onClose`.
In puppeteer &lt; v1.6.0 `onDisconnected` was not catching all exit scenarios.
In order for plugins to clean up properly (e.g. deleting temporary files)
the `onClose` method had been introduced.
> Note: Might be called multiple times on exit.
>
> Note: This only includes browser instances created through `.launch()`.
---
#### .[onPluginRegistered()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L433-L435)
After the plugin has been registered in `puppeteer-extra`.
Normally right after `puppeteer.use(plugin)` is called
---
#### .[getDataFromPlugins(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra-plugin/src/index.ts#L448-L450)
- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by `name` property
Returns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PluginData>**
Helper method to retrieve `data` objects from other plugins.
A plugin needs to state the `dataFromPlugins` requirement
in order to use this method. Will be mapped to `puppeteer.getPluginData`.
- **See: [data]**
- **See: [requirements]**
---