puppeteer/package.json

140 lines
5.1 KiB
JSON
Raw Normal View History

2017-05-11 07:06:41 +00:00
{
"name": "puppeteer",
"version": "14.1.1-post",
2017-08-16 05:30:56 +00:00
"description": "A high-level API to control headless Chrome over the DevTools Protocol",
"keywords": [
"puppeteer",
"chrome",
"headless",
"automation"
],
2022-05-09 11:17:24 +00:00
"type": "commonjs",
chore(agnostic): ship CJS and ESM builds (#6095) * chore(agnostic): ship CJS and ESM builds For our work to enable Puppeteer in other environments (e.g. a browser) we need to ship an ESM build. This commit changes our config to ship to `lib/cjs` and `lib/esm` accordingly. The majority of our code stays the same, with one small fix for the CJS build to ensure that we ship a version that lets you `require('puppeteer')` rather than have to `require('puppeteer').default`. We do this with the `cjs-entry.js` which is what the `main` field in our `package.json` points to. We also swap to `read-pkg-up` to find the `package.json` file. This is because the folder structure of `lib/` does not match `src/` now we ship to `cjs` and `esm`, so you cannot rely on exact paths. This module works up from the file to find the nearest `package.json` so it will always find Puppeteer's `package.json`. Note that we *do not* point any users to the ESM build. We happen to ship those files so people who know about them can get at them but it's not expected (nor will we actively support) that people will rely on them. The CommonJS build is considered our main build. We may make breaking changes to the structure of the ESM build which we will do without requiring new major versions. For example the ESM build currently ships all files that the CJS build does, but given we are working on the ESM build being able to run in the browser this may change over time. Long term once the Node versions catch up we can ditch CJS and ship exclusively ESM but we are not there yet.
2020-06-25 13:24:46 +00:00
"main": "./cjs-entry.js",
2022-05-09 11:17:24 +00:00
"exports": {
".": {
"import": "./lib/esm/puppeteer/node.js",
"require": "./cjs-entry.js"
},
"./*": {
"import": "./*",
"require": "./*"
}
},
fix: much better TypeScript definitions (#6837) This PR aims to vastly improve our TS types and how we ship them. Our previous attempt at shipping TypeScript was unfortunately flawed for many reasons when compared to the @types/puppeteer package: * It only worked if you needed the default export. If you wanted to import a type that Puppeteer uses, you'd have to do `import type X from 'puppeteer/lib/...'`. This is not something we want to encourage because that means our internal file structure becomes almost public API. * It gave absolutely no help to CommonJS users in JS files because it would warn people they needed to do `const pptr = require('puppeteer').default, which is not correct. * I found a bug in the `evaluate` types which mean't you couldn't override the types to provide more info, and TS would insist the types were all `unknown`. The goal of this PR is to support: 1. In a `ts` file, `import puppeteer from 'puppeteer'` 1. In a `ts` file, `import type {ElementHandle} from 'puppeteer'` 1. In a `ts` file, referencing a type as `puppeteer.ElementHandle` 1. In a `ts` file, you can get good type inference when running `foo.evaluate(x => x.clientHeight)`. 1. In a `js` file using CJS, you can do `const puppeteer = require('puppeteer')` and get good type help from VSCode. To test this I created a new empty repository with two test files in, one `.ts` file with this in: https://gist.github.com/jackfranklin/22ba2f390f97c7312cd70025a2096fc8, and a `js` file with this in: https://gist.github.com/jackfranklin/06bed136fdb22419cb7a8a9a4d4ef32f. These files included enough code to check that the types were behaving as I expected. The fix for our types was to make use of API Extractor, which we already use for our docs, to "rollup" all the disparate type files that TS generates into one large `types.d.ts` which contains all the various types that we define, such as: ```ts export declare class ElementHandle {...} export type EvaluateFn ... ``` If we then update our `package.json` `types` field to point to that file in `lib/types.d.ts`, this then allows a developer to write: ``` import type {ElementHandle} from 'puppeteer' ``` And get the correct type definitions. However, what the `types.d.ts` file doesn't do out of the box is declare the default export, so importing Puppeteer's default export to call a method such as `launch` on it will get you an error. That's where the `script/add-default-export-to-types.ts` comes in. It appends the following to the auto-generated `types.d.ts` file: ```ts declare const puppeteer: PuppeteerNode; export = puppeteer; ``` This tells TypeScript what the default export is, and by using the `export =` syntax, we make sure TS understands both in a TS ESM environment and in a JS CJS environment. Now the `build` step, which is run by GitHub Actions when we release, will generate the `.d.ts` file and then extend it with the default export code. To ensure that I was generating a valid package, I created a new repository locally with the two code samples linked in Gists above. I then ran: ``` npm init -y npm install --save-dev typescript npx tsc --init ``` Which gives me a base to test from. In Puppeteer, I ran `npm pack`, which packs the module into a tar that's almost identical to what would be published, so I can be confident that the .d.ts files in there are what would be published. I then installed it: ``` npm install --save-dev ../../puppeteer/puppeteer-7.0.1-post.tgz ``` And then reloaded VSCode in my dummy project. By deliberately making typos and hovering over the code, I could confirm that all the goals listed above were met, and this seems like a vast improvement on our types.
2021-02-09 08:00:42 +00:00
"types": "lib/types.d.ts",
2019-11-26 12:12:25 +00:00
"repository": "github:puppeteer/puppeteer",
2017-06-19 22:01:14 +00:00
"engines": {
"node": ">=14.1.0"
2017-06-19 22:01:14 +00:00
},
2017-05-11 07:06:41 +00:00
"scripts": {
2020-07-22 11:14:35 +00:00
"test-browser": "wtr",
"test-browser-watch": "wtr --watch",
"unit": "npm run tsc-cjs && npm run tsc-compat-cjs && mocha --config mocha-config/puppeteer-unit-tests.js",
"chrome-headless-unit": "cross-env HEADLESS=chrome npm run unit",
"unit-debug": "npm run tsc-cjs && npm run tsc-compat-cjs && mocha --inspect-brk --config mocha-config/puppeteer-unit-tests.js",
"unit-with-coverage": "cross-env COVERAGE=1 npm run unit",
"assert-unit-coverage": "cross-env COVERAGE=1 mocha --config mocha-config/coverage-tests.js",
"funit": "cross-env PUPPETEER_PRODUCT=firefox npm run unit",
2022-05-09 11:17:24 +00:00
"test": "npm run build && npm run lint --silent && npm run unit-with-coverage && npm run test-browser",
"prepare": "node typescript-if-required.js && ([[ $HUSKY = 0 ]] || husky install)",
"prepublishOnly": "npm run build",
2022-05-09 11:17:24 +00:00
"dev-install": "npm run build && node install.js",
2017-06-19 21:43:05 +00:00
"install": "node install.js",
"eslint": "([ \"$CI\" = true ] && eslint --ext js --ext ts --quiet -f codeframe . || eslint --ext js --ext ts .)",
"eslint-fix": "eslint --ext js --ext ts --fix .",
"commitlint": "commitlint --from=HEAD~1",
"prettier": "prettier --check .",
"prettier-fix": "prettier --write .",
"lint": "npm run eslint && npm run build && npm run doc && npm run prettier",
"doc": "node utils/doclint/cli.js",
"generate-api-docs-for-testing": "commonmark docs/api.md > docs/api.html",
"clean-lib": "rimraf lib",
2022-05-09 11:17:24 +00:00
"build": "npm run tsc && npm run generate-d-ts && npm run generate-esm-package-json",
"tsc": "npm run clean-lib && tsc --version && (npm run tsc-cjs & npm run tsc-esm) && (npm run tsc-compat-cjs & npm run tsc-compat-esm)",
"tsc-cjs": "tsc -b src/tsconfig.cjs.json",
"tsc-esm": "tsc -b src/tsconfig.esm.json",
2022-05-09 11:17:24 +00:00
"tsc-compat-cjs": "tsc -b compat/cjs/tsconfig.json",
"tsc-compat-esm": "tsc -b compat/esm/tsconfig.json",
"apply-next-version": "node utils/apply_next_version.js",
"test-install": "scripts/test-install.sh",
"clean-docs": "rimraf website/docs && rimraf docs-api-json",
"generate-d-ts": "npm run clean-docs && api-extractor run --local --verbose",
"generate-docs": "npm run generate-d-ts && api-documenter markdown -i docs-api-json -o website/docs && node utils/remove-tag.js",
2022-05-09 11:17:24 +00:00
"generate-esm-package-json": "echo '{\"type\": \"module\"}' > lib/esm/package.json",
"ensure-correct-devtools-protocol-revision": "ts-node -s scripts/ensure-correct-devtools-protocol-package",
"ensure-pinned-deps": "ts-node -s scripts/ensure-pinned-deps",
fix: wider compat TS types and CI checks to ensure correct type defs (#6855) * fix: wider compat TS types and CI checks to ensure correct type defs This PR improves our TS types further to make sure they are usable in a TS environment where ES Modules are the target output. Our use of `export =` is problematic this environment as TypeScript does not allow `export =` to be used and it errors. The fix for the type issues to avoid `export =` is to instead define the functions that you gain access to when you import Puppeteer as top level functions in our `types.d.ts` file. We can do this by declaring them explicitly in `src/node.ts`. These are then rolled into `lib/types.d.ts` at build time. The downside to this is that we have to keep those declarations in sync with the Puppeteer API; should we add a new method to the `Puppeteer` class, we must add it to the `nodes.ts` declarations. However, this could easily be automated by a small script that walks the AST and generates these. I will do that in a follow-up PR, but I consider this low risk given how rarely the very top level API of Puppeteer changes. The nice thing about this approach is we no longer need our script that hacks on changes to `lib/types.d.ts`. To avoid yet more releases to fix issues in one particular TS environment, this PR also includes a suite of example setups that we test on each CI run. Each sample folder contains `good.ts`, which should have no TS errors, and `bad.ts`, which should have some errors. The test first packs Puppeteer into a tar, and then installs it from that tar into each project. This should replicate how the published package behaves when it is installed. We then check that we get no errors on `good.ts`, and the expected errors on `bad.ts`. We have a variety of test projects that cover both TS and JS source code, and CJS and ESM imports and outputs.
2021-02-10 12:04:36 +00:00
"test-types-file": "ts-node -s scripts/test-ts-definition-files.ts",
"build-docs-production": "cd website && npm install && npm run build"
2017-05-11 07:06:41 +00:00
},
"files": [
"lib/types.d.ts",
"lib/**/*.d.ts",
"lib/**/*.d.ts.map",
"lib/**/*.js",
"lib/**/*.js.map",
2022-05-09 11:17:24 +00:00
"lib/**/package.json",
"install.js",
chore(agnostic): ship CJS and ESM builds (#6095) * chore(agnostic): ship CJS and ESM builds For our work to enable Puppeteer in other environments (e.g. a browser) we need to ship an ESM build. This commit changes our config to ship to `lib/cjs` and `lib/esm` accordingly. The majority of our code stays the same, with one small fix for the CJS build to ensure that we ship a version that lets you `require('puppeteer')` rather than have to `require('puppeteer').default`. We do this with the `cjs-entry.js` which is what the `main` field in our `package.json` points to. We also swap to `read-pkg-up` to find the `package.json` file. This is because the folder structure of `lib/` does not match `src/` now we ship to `cjs` and `esm`, so you cannot rely on exact paths. This module works up from the file to find the nearest `package.json` so it will always find Puppeteer's `package.json`. Note that we *do not* point any users to the ESM build. We happen to ship those files so people who know about them can get at them but it's not expected (nor will we actively support) that people will rely on them. The CommonJS build is considered our main build. We may make breaking changes to the structure of the ESM build which we will do without requiring new major versions. For example the ESM build currently ships all files that the CJS build does, but given we are working on the ESM build being able to run in the browser this may change over time. Long term once the Node versions catch up we can ditch CJS and ship exclusively ESM but we are not there yet.
2020-06-25 13:24:46 +00:00
"typescript-if-required.js",
"cjs-entry.js",
fix: much better TypeScript definitions (#6837) This PR aims to vastly improve our TS types and how we ship them. Our previous attempt at shipping TypeScript was unfortunately flawed for many reasons when compared to the @types/puppeteer package: * It only worked if you needed the default export. If you wanted to import a type that Puppeteer uses, you'd have to do `import type X from 'puppeteer/lib/...'`. This is not something we want to encourage because that means our internal file structure becomes almost public API. * It gave absolutely no help to CommonJS users in JS files because it would warn people they needed to do `const pptr = require('puppeteer').default, which is not correct. * I found a bug in the `evaluate` types which mean't you couldn't override the types to provide more info, and TS would insist the types were all `unknown`. The goal of this PR is to support: 1. In a `ts` file, `import puppeteer from 'puppeteer'` 1. In a `ts` file, `import type {ElementHandle} from 'puppeteer'` 1. In a `ts` file, referencing a type as `puppeteer.ElementHandle` 1. In a `ts` file, you can get good type inference when running `foo.evaluate(x => x.clientHeight)`. 1. In a `js` file using CJS, you can do `const puppeteer = require('puppeteer')` and get good type help from VSCode. To test this I created a new empty repository with two test files in, one `.ts` file with this in: https://gist.github.com/jackfranklin/22ba2f390f97c7312cd70025a2096fc8, and a `js` file with this in: https://gist.github.com/jackfranklin/06bed136fdb22419cb7a8a9a4d4ef32f. These files included enough code to check that the types were behaving as I expected. The fix for our types was to make use of API Extractor, which we already use for our docs, to "rollup" all the disparate type files that TS generates into one large `types.d.ts` which contains all the various types that we define, such as: ```ts export declare class ElementHandle {...} export type EvaluateFn ... ``` If we then update our `package.json` `types` field to point to that file in `lib/types.d.ts`, this then allows a developer to write: ``` import type {ElementHandle} from 'puppeteer' ``` And get the correct type definitions. However, what the `types.d.ts` file doesn't do out of the box is declare the default export, so importing Puppeteer's default export to call a method such as `launch` on it will get you an error. That's where the `script/add-default-export-to-types.ts` comes in. It appends the following to the auto-generated `types.d.ts` file: ```ts declare const puppeteer: PuppeteerNode; export = puppeteer; ``` This tells TypeScript what the default export is, and by using the `export =` syntax, we make sure TS understands both in a TS ESM environment and in a JS CJS environment. Now the `build` step, which is run by GitHub Actions when we release, will generate the `.d.ts` file and then extend it with the default export code. To ensure that I was generating a valid package, I created a new repository locally with the two code samples linked in Gists above. I then ran: ``` npm init -y npm install --save-dev typescript npx tsc --init ``` Which gives me a base to test from. In Puppeteer, I ran `npm pack`, which packs the module into a tar that's almost identical to what would be published, so I can be confident that the .d.ts files in there are what would be published. I then installed it: ``` npm install --save-dev ../../puppeteer/puppeteer-7.0.1-post.tgz ``` And then reloaded VSCode in my dummy project. By deliberately making typos and hovering over the code, I could confirm that all the goals listed above were met, and this seems like a vast improvement on our types.
2021-02-09 08:00:42 +00:00
"cjs-entry-core.js"
],
2017-05-11 07:06:41 +00:00
"author": "The Chromium Authors",
"license": "Apache-2.0",
2017-05-11 07:06:41 +00:00
"dependencies": {
"cross-fetch": "3.1.5",
"debug": "4.3.4",
"devtools-protocol": "0.0.982423",
"extract-zip": "2.0.1",
"https-proxy-agent": "5.0.1",
"pkg-dir": "4.2.0",
"progress": "2.0.3",
"proxy-from-env": "1.1.0",
"rimraf": "3.0.2",
"tar-fs": "2.1.1",
"unbzip2-stream": "1.4.3",
"ws": "8.6.0"
2017-05-11 07:06:41 +00:00
},
"devDependencies": {
"@commitlint/cli": "17.0.0",
"@commitlint/config-conventional": "16.2.4",
"@microsoft/api-documenter": "7.17.12",
"@microsoft/api-extractor": "7.23.2",
"@types/debug": "4.1.7",
"@types/mime": "2.0.3",
"@types/mocha": "9.1.1",
"@types/node": "17.0.31",
"@types/progress": "2.0.5",
"@types/proxy-from-env": "1.0.1",
"@types/rimraf": "3.0.2",
"@types/sinon": "10.0.11",
"@types/tar-fs": "2.0.1",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "5.23.0",
"@typescript-eslint/parser": "5.22.0",
"@web/test-runner": "0.13.27",
"commonmark": "0.30.0",
"cross-env": "7.0.3",
"eslint": "8.15.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-mocha": "10.0.4",
"eslint-plugin-prettier": "4.0.0",
"eslint-plugin-unicorn": "42.0.0",
"esprima": "4.0.1",
"expect": "25.2.7",
"husky": "7.0.4",
2022-01-28 10:03:36 +00:00
"jpeg-js": "0.4.3",
"mime": "3.0.0",
"minimist": "1.2.6",
"mocha": "10.0.0",
"ncp": "2.0.0",
"pixelmatch": "5.3.0",
"pngjs": "6.0.0",
"prettier": "2.6.2",
"sinon": "14.0.0",
"source-map-support": "0.5.21",
"text-diff": "1.0.1",
"ts-node": "10.7.0",
"typescript": "4.6.4"
2017-05-11 07:06:41 +00:00
}
}