Skip to content

Commit

Permalink
feat(types): expose typedefs to consumers (#6745)
Browse files Browse the repository at this point in the history
This PR replaces #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 (#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.
  • Loading branch information
jackfranklin committed Jan 13, 2021
1 parent 9dd1aa3 commit ebd087a
Show file tree
Hide file tree
Showing 4 changed files with 5 additions and 11 deletions.
3 changes: 3 additions & 0 deletions cjs-entry.d.ts
@@ -0,0 +1,3 @@
declare const _default: typeof import('./lib/cjs/puppeteer/node').default;

export default _default;
4 changes: 1 addition & 3 deletions src/tsconfig.esm.json
Expand Up @@ -5,7 +5,5 @@
"outDir": "../lib/esm/puppeteer",
"module": "esnext"
},
"references": [
{ "path": "../vendor/tsconfig.esm.json"}
]
"references": [{ "path": "../vendor/tsconfig.esm.json" }]
}
7 changes: 0 additions & 7 deletions tsconfig-esm.json

This file was deleted.

2 changes: 1 addition & 1 deletion tsconfig.base.json
Expand Up @@ -9,6 +9,6 @@
"declaration": true,
"declarationMap": true,
"resolveJsonModule": true,
"sourceMap": true,
"sourceMap": true
}
}

0 comments on commit ebd087a

Please sign in to comment.