diff --git a/.gitignore b/.gitignore index 7db3ffd3274d1..0e7ca0bb92f41 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ yarn.lock test/coverage.json temp/ new-docs/ -puppeteer.tgz +puppeteer*.tgz docs-api-json/ docs-dist/ website/docs diff --git a/compat/cjs/compat.ts b/compat/cjs/compat.ts index 5b51524dd12ab..50dd7695be684 100644 --- a/compat/cjs/compat.ts +++ b/compat/cjs/compat.ts @@ -1 +1,3 @@ -export const puppeteerDirname = __dirname; +import { dirname } from 'path'; + +export const puppeteerDirname = dirname(dirname(dirname(__dirname))); diff --git a/compat/esm/compat.ts b/compat/esm/compat.ts index 2ddd69ef0e448..a08e10991c77a 100644 --- a/compat/esm/compat.ts +++ b/compat/esm/compat.ts @@ -1,4 +1,8 @@ import { dirname } from 'path'; import { fileURLToPath } from 'url'; -export const puppeteerDirname = dirname(fileURLToPath(import.meta.url)); +// `import.meta.url` resolves to the nearest package.json which for ES modules +// is in `lib/esm` for compatibility reasons. Thus we go up three levels. +export const puppeteerDirname = dirname( + dirname(dirname(dirname(fileURLToPath(import.meta.url)))) +); diff --git a/docs/api.md b/docs/api.md index 499aa74570f38..69ad05c6f14cb 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,4 +1,4 @@ -# Puppeteer API v13.2.0 +# Puppeteer API Tip-Of-Tree diff --git a/package.json b/package.json index 8c6d41b84d82e..0ea5da3ed75b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "puppeteer", - "version": "13.2.0", + "version": "13.2.0-post", "description": "A high-level API to control headless Chrome over the DevTools Protocol", "type": "commonjs", "main": "./cjs-entry.js", @@ -58,6 +58,7 @@ "lib/**/*.d.ts.map", "lib/**/*.js", "lib/**/*.js.map", + "lib/**/package.json", "install.js", "typescript-if-required.js", "cjs-entry.js", @@ -87,7 +88,7 @@ "@types/debug": "4.1.7", "@types/mime": "2.0.3", "@types/mocha": "9.0.0", - "@types/node": "16.10.9", + "@types/node": "17.0.15", "@types/progress": "2.0.5", "@types/proxy-from-env": "1.0.1", "@types/rimraf": "3.0.2", diff --git a/scripts/test-install.sh b/scripts/test-install.sh index e59aa39d00be1..ea42f4d7ee5eb 100755 --- a/scripts/test-install.sh +++ b/scripts/test-install.sh @@ -16,6 +16,26 @@ npm install --loglevel silent "${tarball}" node --eval="require('puppeteer')" ls $TMPDIR/node_modules/puppeteer/.local-chromium/ +# Testing ES module features +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'" +ls $TMPDIR/node_modules/puppeteer/.local-chromium/ + +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 Firefox TMPDIR="$(mktemp -d)" cd $TMPDIR @@ -39,3 +59,9 @@ cd $TMPDIR npm install --loglevel silent "${tarball}" node --eval="require('puppeteer-core')" +# Testing ES module features +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'" diff --git a/src/node/BrowserFetcher.ts b/src/node/BrowserFetcher.ts index 01140df4c487b..646602e7b6046 100644 --- a/src/node/BrowserFetcher.ts +++ b/src/node/BrowserFetcher.ts @@ -34,6 +34,8 @@ import createHttpsProxyAgent, { } from 'https-proxy-agent'; import { getProxyForUrl } from 'proxy-from-env'; import { assert } from '../common/assert.js'; +import tar from 'tar-fs'; +import bzip from 'unbzip2-stream'; const debugFetcher = debug('puppeteer:fetcher'); @@ -499,10 +501,6 @@ function install(archivePath: string, folderPath: string): Promise { * @internal */ function extractTar(tarPath: string, folderPath: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const tar = require('tar-fs'); - // eslint-disable-next-line @typescript-eslint/no-var-requires - const bzip = require('unbzip2-stream'); return new Promise((fulfill, reject) => { const tarStream = tar.extract(folderPath); tarStream.on('error', reject); diff --git a/src/node/NodeWebSocketTransport.ts b/src/node/NodeWebSocketTransport.ts index 393763239fef3..1e679b6e6d2f6 100644 --- a/src/node/NodeWebSocketTransport.ts +++ b/src/node/NodeWebSocketTransport.ts @@ -15,18 +15,26 @@ */ import { ConnectionTransport } from '../common/ConnectionTransport.js'; import NodeWebSocket from 'ws'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { puppeteerDirname } from '../compat.js'; + +// We parse rather than import for ES module compatibility. +const version = JSON.parse( + readFileSync(join(puppeteerDirname, 'package.json'), { + encoding: 'utf8', + }) +).version; export class NodeWebSocketTransport implements ConnectionTransport { static create(url: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const pkg = require('../../../../package.json'); return new Promise((resolve, reject) => { const ws = new NodeWebSocket(url, [], { followRedirects: true, perMessageDeflate: false, maxPayload: 256 * 1024 * 1024, // 256Mb headers: { - 'User-Agent': `Puppeteer ${pkg.version}`, + 'User-Agent': `Puppeteer ${version}`, }, }); diff --git a/utils/prepare_puppeteer_core.js b/utils/prepare_puppeteer_core.js index e1e9a64f2f4ed..7b42cd3f58a6e 100755 --- a/utils/prepare_puppeteer_core.js +++ b/utils/prepare_puppeteer_core.js @@ -21,7 +21,9 @@ const path = require('path'); const packagePath = path.join(__dirname, '..', 'package.json'); const json = require(packagePath); -json.name = 'puppeteer-core'; delete json.scripts.install; + +json.name = 'puppeteer-core'; json.main = './cjs-entry-core.js'; +json.exports.import = './lib/esm/puppeteer/node-puppeteer-core.js'; fs.writeFileSync(packagePath, JSON.stringify(json, null, ' '));