Skip to content

Commit

Permalink
Merge branch 'main' into esm_support
Browse files Browse the repository at this point in the history
  • Loading branch information
jrandolf committed May 3, 2022
2 parents 7a8f9d9 + a414827 commit db42e8f
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 51 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/main.yml
Expand Up @@ -19,7 +19,7 @@ jobs:
matrix:
# Include all major maintenance + active LTS + current Node.js versions.
# https://github.com/nodejs/Release#release-schedule
node: [12, 14, 16]
node: [14, 16]
steps:
- name: Checkout
uses: actions/checkout@v3
Expand Down Expand Up @@ -111,7 +111,7 @@ jobs:
with:
# Test only the oldest maintenance LTS Node.js version.
# https://github.com/nodejs/Release#release-schedule
node-version: 12
node-version: 14

- name: Install dependencies
run: |
Expand Down Expand Up @@ -152,7 +152,7 @@ jobs:
with:
# Test only the oldest maintenance LTS Node.js version.
# https://github.com/nodejs/Release#release-schedule
node-version: 12
node-version: 14

- name: Install dependencies
run: |
Expand Down
2 changes: 0 additions & 2 deletions compat/cjs/compat.ts
Expand Up @@ -13,6 +13,4 @@ try {
puppeteerDirname = __dirname;
}

export const rootDirname = dirname(dirname(dirname(puppeteerDirname)));

export { puppeteerDirname };
5 changes: 2 additions & 3 deletions compat/esm/compat.ts
@@ -1,5 +1,6 @@
import { createRequire } from 'module';
import { dirname } from 'path';
import { fileURLToPath } from 'url';

const require = createRequire(import.meta.url);

Expand All @@ -13,9 +14,7 @@ try {
puppeteerDirname = dirname(require.resolve('./compat'));
} catch (error) {
// Fallback to __dirname.
puppeteerDirname = __dirname;
puppeteerDirname = dirname(fileURLToPath(import.meta.url));
}

export const rootDirname = dirname(dirname(dirname(puppeteerDirname)));

export { puppeteerDirname };
6 changes: 3 additions & 3 deletions docs/troubleshooting.md
Expand Up @@ -156,7 +156,7 @@ If you get an error that looks like this when trying to launch Chromium:
spawn /Users/.../node_modules/puppeteer/.local-chromium/mac-756035/chrome-mac/Chromium.app/Contents/MacOS/Chromium ENOENT
```

This means that the browser was downloaded but failed to be extracted correctly. The most common cause is a bug in Node.js v14.0.0 which broke `extract-zip`, the module Puppeteer uses to extract browser downloads into the right place. The bug was fixed in Node.js v14.1.0, so please make sure you're running that version or higher. Alternatively, if you cannot upgrade, you could downgrade to Node.js v12, but we recommend upgrading when possible.
This means that the browser was downloaded but failed to be extracted correctly. The most common cause is a bug in Node.js v14.0.0 which broke `extract-zip`, the module Puppeteer uses to extract browser downloads into the right place. The bug was fixed in Node.js v14.1.0, so please make sure you're running that version or higher.

## Setting Up Chrome Linux Sandbox

Expand Down Expand Up @@ -242,7 +242,7 @@ Running Puppeteer smoothly on CircleCI requires the following steps:
like so:
```yaml
docker:
- image: circleci/node:12 # Use your desired version
- image: circleci/node:14 # Use your desired version
environment:
NODE_ENV: development # Only needed if puppeteer is in `devDependencies`
```
Expand Down Expand Up @@ -277,7 +277,7 @@ To fix, you'll need to install the missing dependencies and the
latest Chromium package in your Dockerfile:

```Dockerfile
FROM node:12-slim
FROM node:14-slim

# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
Expand Down
4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -23,7 +23,7 @@
"types": "lib/types.d.ts",
"repository": "github:puppeteer/puppeteer",
"engines": {
"node": ">=10.18.1"
"node": ">=14.1.0"
},
"scripts": {
"test-browser": "wtr",
Expand Down Expand Up @@ -126,7 +126,7 @@
"jpeg-js": "0.4.3",
"mime": "3.0.0",
"minimist": "1.2.6",
"mocha": "9.2.2",
"mocha": "10.0.0",
"ncp": "2.0.0",
"pixelmatch": "5.3.0",
"pngjs": "6.0.0",
Expand Down
69 changes: 45 additions & 24 deletions scripts/test-install.sh
@@ -1,33 +1,34 @@
#!/usr/bin/env sh
set -e

# All tests are headed by a echo 'Test'.
# The general schema is:
# 1. Check we can install from the tarball.
# 2. The install script works and correctly exits without errors
# 3. Requiring/importing Puppeteer from Node works.

## Puppeter tests

# Setup
ROOTDIR="$(pwd)"
# Pack the module into a tarball
npm pack
tarball="$(realpath puppeteer-*.tgz)"

echo "Testing... Chrome CommonJS"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
# Check we can install from the tarball.
# This emulates installing from npm and ensures that:
# 1. we publish the right files in the `files` list from package.json
# 2. The install script works and correctly exits without errors
# 3. Requiring Puppeteer from Node works.
npm install --loglevel silent "${tarball}"
node --eval="require('puppeteer')"
node --eval="
require('puppeteer/lib/cjs/puppeteer/revisions.js');
"
node --eval="require('puppeteer/lib/cjs/puppeteer/revisions.js');"
ls $TMPDIR/node_modules/puppeteer/.local-chromium/

# Testing ES module features
echo "Testing... Chrome ES Modules"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
echo '{"type":"module"}' >>$TMPDIR/package.json
npm install --loglevel silent "${tarball}"
node --input-type="module" --eval="import puppeteer from 'puppeteer'"
node --input-type="module" --eval="
import 'puppeteer/lib/esm/puppeteer/revisions.js';
"
node --input-type="module" --eval="import 'puppeteer/lib/esm/puppeteer/revisions.js';"
node --input-type="module" --eval="
import puppeteer from 'puppeteer';
(async () => {
Expand All @@ -39,33 +40,53 @@ import puppeteer from 'puppeteer';
})();
"

# Again for Firefox
echo "Testing... Firefox CommonJS"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
PUPPETEER_PRODUCT=firefox npm install --loglevel silent "${tarball}"
node --eval="require('puppeteer')"
rm "${tarball}"
node --eval="require('puppeteer/lib/cjs/puppeteer/revisions.js');"
ls $TMPDIR/node_modules/puppeteer/.local-firefox/linux-*/firefox/firefox

# Testing ES module features
echo "Testing... Firefox ES Modules"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
echo '{"type":"module"}' >>$TMPDIR/package.json
npm install --loglevel silent "${tarball}"
node --input-type="module" --eval="import puppeteer from 'puppeteer-core'"
PUPPETEER_PRODUCT=firefox npm install --loglevel silent "${tarball}"
node --input-type="module" --eval="import puppeteer from 'puppeteer'"
node --input-type="module" --eval="import 'puppeteer/lib/esm/puppeteer/revisions.js';"
node --input-type="module" --eval="
import puppeteer from 'puppeteer';
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
"

# Again for puppeteer-core
## Puppeteer Core tests

# Setup
cd $ROOTDIR
rm "${tarball}"
node ./utils/prepare_puppeteer_core.js
npm pack
tarball="$(realpath puppeteer-core-*.tgz)"

echo "Testing... Puppeteer Core CommonJS"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
# Check we can install from the tarball.
# This emulates installing from npm and ensures that:
# 1. we publish the right files in the `files` list from package.json
# 2. The install script works and correctly exits without errors
# 3. Requiring Puppeteer Core from Node works.
npm install --loglevel silent "${tarball}"
node --eval="require('puppeteer-core')"
node --eval="require('puppeteer-core/lib/cjs/puppeteer/revisions.js');"

echo "Testing... Puppeteer Core ES Modules"
TMPDIR="$(mktemp -d)"
cd $TMPDIR
echo '{"type":"module"}' >>$TMPDIR/package.json
npm install --loglevel silent "${tarball}"
node --input-type="module" --eval="import puppeteer from 'puppeteer-core'"
node --input-type="module" --eval="import 'puppeteer-core/lib/esm/puppeteer/revisions.js';"

3 changes: 1 addition & 2 deletions src/compat.ts
@@ -1,4 +1,3 @@
declare const puppeteerDirname: string;
declare const rootDirname: string;

export { puppeteerDirname, rootDirname };
export { puppeteerDirname };
8 changes: 8 additions & 0 deletions src/constants.ts
@@ -0,0 +1,8 @@
import { readFileSync } from 'fs';
import { dirname, join } from 'path';
import { puppeteerDirname } from './compat.js';

export const rootDirname = dirname(dirname(dirname(puppeteerDirname)));
export const packageVersion = JSON.parse(
readFileSync(join(rootDirname, 'package.json'), { encoding: 'utf8' })
).version;
4 changes: 2 additions & 2 deletions src/initialize-node.ts
Expand Up @@ -18,10 +18,10 @@ import { PuppeteerNode } from './node/Puppeteer.js';
import { PUPPETEER_REVISIONS } from './revisions.js';
import { sync } from 'pkg-dir';
import { Product } from './common/Product.js';
import { puppeteerDirname } from './compat.js';
import { rootDirname } from './constants.js';

export const initializePuppeteerNode = (packageName: string): PuppeteerNode => {
const puppeteerRootDirectory = sync(puppeteerDirname);
const puppeteerRootDirectory = sync(rootDirname);
let preferredRevision = PUPPETEER_REVISIONS.chromium;
const isPuppeteerCore = packageName === 'puppeteer-core';
// puppeteer-core ignores environment variables
Expand Down
13 changes: 3 additions & 10 deletions src/node/NodeWebSocketTransport.ts
Expand Up @@ -13,16 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ConnectionTransport } from '../common/ConnectionTransport.js';
import NodeWebSocket from 'ws';
import { readFileSync } from 'fs';
import { join } from 'path';
import { rootDirname } from '../compat.js';

// We parse rather than import for ES module compatibility.
const version = JSON.parse(
readFileSync(join(rootDirname, 'package.json'), { encoding: 'utf8' })
).version;
import { ConnectionTransport } from '../common/ConnectionTransport.js';
import { packageVersion } from '../constants.js';

export class NodeWebSocketTransport implements ConnectionTransport {
static create(url: string): Promise<NodeWebSocketTransport> {
Expand All @@ -32,7 +25,7 @@ export class NodeWebSocketTransport implements ConnectionTransport {
perMessageDeflate: false,
maxPayload: 256 * 1024 * 1024, // 256Mb
headers: {
'User-Agent': `Puppeteer ${version}`,
'User-Agent': `Puppeteer ${packageVersion}`,
},
});

Expand Down

0 comments on commit db42e8f

Please sign in to comment.