diff --git a/index.js b/index.js deleted file mode 100644 index 2960a9db62d76..0000000000000 --- a/index.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright 2017 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const { initializePuppeteer } = require('./lib/index'); - -const puppeteer = initializePuppeteer({ - packageJson: require('./package.json'), - rootDirectory: __dirname, -}); - -module.exports = puppeteer; diff --git a/install.js b/install.js index 13272b60ba297..cf56da410ea48 100644 --- a/install.js +++ b/install.js @@ -41,7 +41,7 @@ async function download() { process.env.PUPPETEER_DOWNLOAD_HOST || process.env.npm_config_puppeteer_download_host || process.env.npm_package_config_puppeteer_download_host; - const puppeteer = require('./index'); + const puppeteer = require('.'); const product = process.env.PUPPETEER_PRODUCT || process.env.npm_config_puppeteer_product || diff --git a/package.json b/package.json index 28569351a39d5..ba0d15dbe314d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "puppeteer", "version": "4.0.0-post", "description": "A high-level API to control headless Chrome over the DevTools Protocol", - "main": "index.js", + "main": "lib/index.js", "repository": "github:puppeteer/puppeteer", "engines": { "node": ">=10.18.1" diff --git a/src/index.ts b/src/index.ts index a083eacbcc79e..3df618f8c3874 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020 Google Inc. All rights reserved. + * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,59 +14,21 @@ * limitations under the License. */ -// api.ts has to use module.exports as it's also consumed by DocLint which runs -// on Node. -// eslint-disable-next-line @typescript-eslint/no-var-requires -const api = require('./api'); +import { initializePuppeteer } from './initialize'; +import * as path from 'path'; -import { helper } from './common/helper'; -import { Page } from './common/Page'; -import { Puppeteer } from './common/Puppeteer'; +const puppeteer = initializePuppeteer({ + packageJson: require(path.join(__dirname, '..', 'package.json')), + rootDirectory: path.join(__dirname, '..'), +}); -interface InitOptions { - packageJson: { - puppeteer: { - chromium_revision: string; - firefox_revision: string; - }; - name: string; - }; - rootDirectory: string; -} - -export const initializePuppeteer = (options: InitOptions): Puppeteer => { - const { packageJson, rootDirectory } = options; - - for (const className in api) { - if (typeof api[className] === 'function') - helper.installAsyncStackHooks(api[className]); - } - - // Expose alias for deprecated method. - // @ts-expect-error emulateMedia does not exist error - Page.prototype.emulateMedia = Page.prototype.emulateMediaType; - - let preferredRevision = packageJson.puppeteer.chromium_revision; - const isPuppeteerCore = packageJson.name === 'puppeteer-core'; - // puppeteer-core ignores environment variables - const product = isPuppeteerCore - ? undefined - : process.env.PUPPETEER_PRODUCT || - process.env.npm_config_puppeteer_product || - process.env.npm_package_config_puppeteer_product; - if (!isPuppeteerCore && product === 'firefox') - preferredRevision = packageJson.puppeteer.firefox_revision; - - const puppeteer = new Puppeteer( - rootDirectory, - preferredRevision, - isPuppeteerCore, - product - ); - - // The introspection in `Helper.installAsyncStackHooks` references `Puppeteer._launcher` - // before the Puppeteer ctor is called, such that an invalid Launcher is selected at import, - // so we reset it. - puppeteer._lazyLauncher = undefined; - return puppeteer; -}; +/* + * Has to be CJS here rather than ESM such that the output file ends with + * module.exports = puppeteer. + * + * If this was export default puppeteer the output would be: + * exports.default = puppeteer + * And therefore consuming via require('puppeteer') would break / require the user + * to access require('puppeteer').default; + */ +module.exports = puppeteer; diff --git a/src/initialize.ts b/src/initialize.ts new file mode 100644 index 0000000000000..a083eacbcc79e --- /dev/null +++ b/src/initialize.ts @@ -0,0 +1,72 @@ +/** + * Copyright 2020 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// api.ts has to use module.exports as it's also consumed by DocLint which runs +// on Node. +// eslint-disable-next-line @typescript-eslint/no-var-requires +const api = require('./api'); + +import { helper } from './common/helper'; +import { Page } from './common/Page'; +import { Puppeteer } from './common/Puppeteer'; + +interface InitOptions { + packageJson: { + puppeteer: { + chromium_revision: string; + firefox_revision: string; + }; + name: string; + }; + rootDirectory: string; +} + +export const initializePuppeteer = (options: InitOptions): Puppeteer => { + const { packageJson, rootDirectory } = options; + + for (const className in api) { + if (typeof api[className] === 'function') + helper.installAsyncStackHooks(api[className]); + } + + // Expose alias for deprecated method. + // @ts-expect-error emulateMedia does not exist error + Page.prototype.emulateMedia = Page.prototype.emulateMediaType; + + let preferredRevision = packageJson.puppeteer.chromium_revision; + const isPuppeteerCore = packageJson.name === 'puppeteer-core'; + // puppeteer-core ignores environment variables + const product = isPuppeteerCore + ? undefined + : process.env.PUPPETEER_PRODUCT || + process.env.npm_config_puppeteer_product || + process.env.npm_package_config_puppeteer_product; + if (!isPuppeteerCore && product === 'firefox') + preferredRevision = packageJson.puppeteer.firefox_revision; + + const puppeteer = new Puppeteer( + rootDirectory, + preferredRevision, + isPuppeteerCore, + product + ); + + // The introspection in `Helper.installAsyncStackHooks` references `Puppeteer._launcher` + // before the Puppeteer ctor is called, such that an invalid Launcher is selected at import, + // so we reset it. + puppeteer._lazyLauncher = undefined; + return puppeteer; +};