From 723052d5bb3c3d1d3908508467512bea4d8fdc80 Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Sat, 11 Sep 2021 22:59:51 +0200 Subject: [PATCH] feat(typescript): allow using puppeteer without dom lib (#6998) The dom lib inserts all dom related types into the project, which is often undesirable when working on a NodeJS project. This change injects global stubs for the dom types required by puppeteer, so puppeteer can work without users having to add dom types to their project. Closes #6989 --- inject-global-type-stubs.js | 29 +++++++++++++++++++++++++++++ package.json | 2 +- src/global.ts | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 inject-global-type-stubs.js create mode 100644 src/global.ts diff --git a/inject-global-type-stubs.js b/inject-global-type-stubs.js new file mode 100644 index 00000000000..adc63499032 --- /dev/null +++ b/inject-global-type-stubs.js @@ -0,0 +1,29 @@ +/** + * Copyright 2021 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. + */ + +// This script is needed because of https://github.com/microsoft/rushstack/issues/1709 +const { promises: fs } = require('fs'); +const { join } = require('path'); + +async function injctGlobalTypeStubs() { + const typesPath = join(__dirname, 'lib', 'types.d.ts'); + const globalsPath = join(__dirname, 'lib', 'cjs', 'puppeteer', 'global.d.ts'); + const types = await fs.readFile(typesPath, 'utf-8'); + const globals = await fs.readFile(globalsPath, 'utf-8'); + await fs.writeFile(typesPath, `${globals}\n${types}`); +} + +injctGlobalTypeStubs(); diff --git a/package.json b/package.json index e960d7ab34c..61ae8dc256d 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "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-d-ts": "npm run clean-docs && api-extractor run --local --verbose && node inject-global-type-stubs.js", "generate-docs": "npm run generate-d-ts && api-documenter markdown -i docs-api-json -o website/docs && node utils/remove-tag.js", "ensure-correct-devtools-protocol-revision": "ts-node -s scripts/ensure-correct-devtools-protocol-package", "ensure-pinned-deps": "ts-node -s scripts/ensure-pinned-deps", diff --git a/src/global.ts b/src/global.ts new file mode 100644 index 00000000000..2dce058df26 --- /dev/null +++ b/src/global.ts @@ -0,0 +1,20 @@ +/** + * These global declarations exist so puppeteer can work without the need to use `"dom"` + * types. + * + * To get full type information for these interfaces, add `"types": "dom"`in your + * `tsconfig.json` file. + */ +declare global { + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface Document {} + + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface Element {} + + // eslint-disable-next-line max-len + // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars + interface NodeListOf {} +} + +export {};