Skip to content

Commit

Permalink
feat(typescript): allow using puppeteer without dom lib (#6998)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
remcohaszing committed Sep 11, 2021
1 parent 3c6029c commit 723052d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
29 changes: 29 additions & 0 deletions 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();
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -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",
Expand Down
20 changes: 20 additions & 0 deletions 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<TNode> {}
}

export {};

0 comments on commit 723052d

Please sign in to comment.