From 502ed8c84cc620885c39c098663bb9ad78f895d9 Mon Sep 17 00:00:00 2001 From: Jack Franklin Date: Wed, 7 Oct 2020 14:48:01 +0100 Subject: [PATCH] chore(agnostify): Create Node and Web initializer. (#6477) * chore(agnostify): Create Node and Web initializer. This PR splits `initialize.ts` into two files, one for web, and one for Node. The Node initializer requires much more information as it needs to know which browser(s) to download and where to store them, whereas the web one does not. A future PR that I'm working on will tidy up `src/common/Puppeteer.ts` (as it contains a lot of Node specific logic around downloading and installing browsers), but this change enables us to stop the browser bundle attempting to use the `pkg-dir` dependency, which wouldn't work within a browser, as well as keeping the size of the PRs down and avoiding one mammoth PR. --- src/common/Puppeteer.ts | 3 +- src/index-core.ts | 9 ++++-- src/index.ts | 9 ++++-- src/{initialize.ts => initialize-node.ts} | 2 +- src/initialize-web.ts | 34 +++++++++++++++++++++++ 5 files changed, 51 insertions(+), 6 deletions(-) rename src/{initialize.ts => initialize-node.ts} (94%) create mode 100644 src/initialize-web.ts diff --git a/src/common/Puppeteer.ts b/src/common/Puppeteer.ts index 503e1b5d20d..d324a09da4b 100644 --- a/src/common/Puppeteer.ts +++ b/src/common/Puppeteer.ts @@ -67,7 +67,8 @@ import { PUPPETEER_REVISIONS } from '../revisions.js'; * @public */ export class Puppeteer { - private _projectRoot: string; + // Will be undefined in a browser environment + private _projectRoot?: string; private _isPuppeteerCore: boolean; private _changedProduct = false; private __productName: string; diff --git a/src/index-core.ts b/src/index-core.ts index 600808a0f31..2bd07b930b9 100644 --- a/src/index-core.ts +++ b/src/index-core.ts @@ -14,7 +14,12 @@ * limitations under the License. */ -import { initializePuppeteer } from './initialize.js'; +import { initializePuppeteerNode } from './initialize-node.js'; +import { isNode } from './environment.js'; +import { initializePuppeteerWeb } from './initialize-web.js'; -const puppeteer = initializePuppeteer('puppeteer-core'); +const initializeFunc = isNode + ? initializePuppeteerNode + : initializePuppeteerWeb; +const puppeteer = initializeFunc('puppeteer-core'); export default puppeteer; diff --git a/src/index.ts b/src/index.ts index 4d89fe4d535..8857d0bae97 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,7 +14,12 @@ * limitations under the License. */ -import { initializePuppeteer } from './initialize.js'; +import { initializePuppeteerNode } from './initialize-node.js'; +import { isNode } from './environment.js'; +import { initializePuppeteerWeb } from './initialize-web.js'; -const puppeteer = initializePuppeteer('puppeteer'); +const initializeFunc = isNode + ? initializePuppeteerNode + : initializePuppeteerWeb; +const puppeteer = initializeFunc('puppeteer'); export default puppeteer; diff --git a/src/initialize.ts b/src/initialize-node.ts similarity index 94% rename from src/initialize.ts rename to src/initialize-node.ts index 1c63a62ca3a..0ef0094f531 100644 --- a/src/initialize.ts +++ b/src/initialize-node.ts @@ -18,7 +18,7 @@ import { Puppeteer } from './common/Puppeteer.js'; import { PUPPETEER_REVISIONS } from './revisions.js'; import pkgDir from 'pkg-dir'; -export const initializePuppeteer = (packageName: string): Puppeteer => { +export const initializePuppeteerNode = (packageName: string): Puppeteer => { const puppeteerRootDirectory = pkgDir.sync(__dirname); let preferredRevision = PUPPETEER_REVISIONS.chromium; diff --git a/src/initialize-web.ts b/src/initialize-web.ts new file mode 100644 index 00000000000..342f899698f --- /dev/null +++ b/src/initialize-web.ts @@ -0,0 +1,34 @@ +/** + * 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. + */ + +import { Puppeteer } from './common/Puppeteer.js'; + +export const initializePuppeteerWeb = (packageName: string): Puppeteer => { + const isPuppeteerCore = packageName === 'puppeteer-core'; + + // puppeteer-core ignores environment variables + return new Puppeteer( + // Product root directory is undefined as we're not concerned about + // downloading and installing browsers in the web environment. + undefined, + // Preferred revision is undefined as we use the browser we are running in. + undefined, + isPuppeteerCore, + // Preferred product is undefined as we use the browser we are + // running in. + undefined + ); +};