feat(types): expose typedefs to consumers (#6745)

This PR replaces https://github.com/puppeteer/puppeteer/pull/6289 with a simpler approach to types where we compile them all alongside the compiled code (so for every `foo.js` that is generated, we generate `foo.d.ts`).

By default that's not enough, as when you `import puppeteer from 'puppeteer'` in Node land you import `cjs-entry.js`, so we also create `cjs-entry.d.ts` which TypeScript will then pick up. This type file tells TypeScript that the thing that `cjs-entry.js` exposes is an instance of the `Puppeteer` class, which then hooks all the types up.

The previous PR (https://github.com/puppeteer/puppeteer/pull/6289) tried to merge all our typedefs into one big file via API Extractor, but this isn't really necessary a good experience for the developer.

One important consideration is that you _could_ consider this a breaking change. I'm not sure how likely it is, but it could cause problems for:

* Projects that didn't have any type info for Puppeteer and treated all its exports as `any` may now start having legitimate type failures.
* Projects that depend on the `@types/puppeteer` package may have issues if they now swap to use this one and the types aren't quite aligned.

In addition, once we do ship a release with this change in, it will mean that we have to treat any changes to any type definitions as release-note-worthy, and any breaking changes to type definitions will need to be treated as breaking code changes (nearly always a breaking type def means a breaking change anyway), but it's worth considering that once we expose these typedefs we should treat them as first class citizens of the project just like we would with the actual source code.

I also fully expect to have some bugs with our types, or have users create issues/PRs to change our types, but I think that's a good thing and it should settle down.

I've tested this locally by creating a new package, linking Puppeteer via `npm link puppeteer` and then checking that VSCode correctly shows me the right things when I use `Go to Definition` on something that comes from the Puppeteer source code.
This commit is contained in:
Jack Franklin 2021-01-13 09:37:35 +00:00 committed by GitHub
parent 9dd1aa302d
commit ebd087a316
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 5 additions and 11 deletions

3
cjs-entry.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
declare const _default: typeof import('./lib/cjs/puppeteer/node').default;
export default _default;

View File

@ -5,7 +5,5 @@
"outDir": "../lib/esm/puppeteer", "outDir": "../lib/esm/puppeteer",
"module": "esnext" "module": "esnext"
}, },
"references": [ "references": [{ "path": "../vendor/tsconfig.esm.json" }]
{ "path": "../vendor/tsconfig.esm.json"}
]
} }

View File

@ -1,7 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./lib/esm",
"module": "ES2015",
},
}

View File

@ -9,6 +9,6 @@
"declaration": true, "declaration": true,
"declarationMap": true, "declarationMap": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"sourceMap": true, "sourceMap": true
} }
} }