diff --git a/.gitignore b/.gitignore index 98a40da..22f648d 100755 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ stats.html packages/function/dist packages/mql/dist/index.js packages/mql/dist/index.umd.js +packages/core/src/puppeteer-core.d.ts diff --git a/packages/core/package.json b/packages/core/package.json index 1ebbbf5..4b28d03 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -17,7 +17,8 @@ "require": "./bin/run.js", "default": "./bin/cli.mjs" }, - "./docs": "./bin/docs.js" + "./docs": "./bin/docs.js", + "./src/puppeteer-core.d.ts": "./src/puppeteer-core.d.ts" }, "bin": { "microlink": "bin/index.js", @@ -72,7 +73,8 @@ "src" ], "scripts": { - "test": "ava && tsd" + "prepack": "node scripts/copy-puppeteer-dts.js", + "test": "node scripts/copy-puppeteer-dts.js && ava && tsd" }, "preferGlobal": true, "license": "MIT", diff --git a/packages/core/scripts/copy-puppeteer-dts.js b/packages/core/scripts/copy-puppeteer-dts.js new file mode 100644 index 0000000..276ba27 --- /dev/null +++ b/packages/core/scripts/copy-puppeteer-dts.js @@ -0,0 +1,14 @@ +'use strict' + +const { createRequire } = require('node:module') +const { dirname, join } = require('node:path') +const { readFileSync, writeFileSync } = require('node:fs') + +const requireFromCore = createRequire(join(__dirname, '../package.json')) +const pkgPath = requireFromCore.resolve('puppeteer-core/package.json') +const { types } = requireFromCore(pkgPath) + +writeFileSync( + join(__dirname, '../src/puppeteer-core.d.ts'), + readFileSync(join(dirname(pkgPath), types), 'utf8') +) diff --git a/packages/core/test/build.mjs b/packages/core/test/build.mjs index febedc1..cb07989 100644 --- a/packages/core/test/build.mjs +++ b/packages/core/test/build.mjs @@ -1,5 +1,6 @@ -import { readFile, access, constants } from 'fs/promises' +import { readFile, access, constants, mkdtemp, readdir, rm } from 'fs/promises' import { fileURLToPath } from 'url' +import { tmpdir } from 'os' import $ from 'tinyspawn' import test from 'ava' import path from 'path' @@ -89,3 +90,17 @@ test('published files include every bin entry', t => { ) ) }) + +test('ships puppeteer-core types next to the package dts', async t => { + t.is(pkg.exports['./src/puppeteer-core.d.ts'], './src/puppeteer-core.d.ts') + const dts = await readFile(path.join(root, 'src/puppeteer-core.d.ts'), 'utf8') + t.true(dts.includes('export declare abstract class Page')) + t.true(dts.includes('export declare abstract class HTTPResponse')) + + const dest = await mkdtemp(path.join(tmpdir(), 'microlink-pack-')) + t.teardown(() => rm(dest, { recursive: true, force: true })) + await $('pnpm', ['pack', '--pack-destination', dest], { cwd: root }) + const [tarball] = (await readdir(dest)).filter(name => name.endsWith('.tgz')) + const { stdout } = await $('tar', ['-tzf', path.join(dest, tarball)]) + t.true(stdout.includes('package/src/puppeteer-core.d.ts')) +})