{"_id":"@bitwild/nest-puppeteer","_rev":"10-3ce818e3f997e6c1006062d93a94688d","name":"@bitwild/nest-puppeteer","dist-tags":{"latest":"0.0.10"},"versions":{"0.0.1":{"name":"@bitwild/nest-puppeteer","version":"0.0.1","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.1","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"50843b67c13ae3e4d64bc4e062944ef93d21483a","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.1.tgz","fileCount":6,"integrity":"sha512-XMfcTZqiafJ7jTXu1MfIa0m4ELeAMokarWOAvAIunT6BOkOiI+moFPE4yqphvTizQlMMkhPol7X/l/ofr6TT/g==","signatures":[{"sig":"MEUCIQDtJXIHDOe1KzjmFheMc+i1/9icm0atwIoNFucpNrnM9AIgIsQzFNPBnamr1gZyD1TninsaGJFv11bYlMPYC8+PoYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365392},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.1_1775575122129_0.5240680086005305","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@bitwild/nest-puppeteer","version":"0.0.2","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.2","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"247dd0c542c4db9b67f2098f546cffe5376993a6","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.2.tgz","fileCount":6,"integrity":"sha512-rMUIO/SB8GqDG09g+ztfDXk5qxWsP1pvBIEJ1ma0OglfcUxaWCKIdpp00SuOLSr9xJwBNi8kWhEIm9XuxBwfmw==","signatures":[{"sig":"MEQCIChlBL35b6S1kOVVJV8x2jvRU/vwC/SbB0GuoyGjFhmiAiAOzV2lXJ5v6EVH9HcBGQpCKzNmE5WCC5lNc2ctyOoK8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371048},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.2_1775575849700_0.09873030199956045","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@bitwild/nest-puppeteer","version":"0.0.3","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.3","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"5c80a92c4f16055170c77e1a2016abbe0b4c6a2a","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.3.tgz","fileCount":6,"integrity":"sha512-yeqlun+6mgzH0RVyTQM1VaRM8Zl0mNlr2+69xNPe4jAwnIJSEycOwuBoz3iw8gLFWqiPjEDIFlJIzNZnj4wwxg==","signatures":[{"sig":"MEQCIFgE1bibypl4M5ymQ2+6MSdJZyEx5mQwq6dBqeENuxCtAiArMEIM8+v0P2zMd5ESHuc75hmgdbFIGrOnPKgKnGURRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372111},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.3_1775578461478_0.36080484093080933","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@bitwild/nest-puppeteer","version":"0.0.4","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.4","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"7556a5d045c9538289ef21e54f19955d69cfdbfa","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.4.tgz","fileCount":6,"integrity":"sha512-EKy1gdW82zsz87Wp1F8m3HspI8nuVS+n+DYI7+EKMf4c6CkvLKCtFo1NgIC23q5Cp22g/pxQ/uRaRa+yiVwAag==","signatures":[{"sig":"MEUCIQCWnyI/t/nLPCxIgxF5GfkbLtNJ1BXzTFtlsb5DZrfUwwIgZ3dUIqd/1wBTjhuMIF3O7qVY5z+88kHKSLxRRs8ci2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":372110},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.4_1775578635424_0.8615367129688465","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@bitwild/nest-puppeteer","version":"0.0.5","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.5","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"abd65d20de2facc103d2decdf8213d02d50ce8d8","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.5.tgz","fileCount":6,"integrity":"sha512-InYPGeGUM4YFNeDZF2c1ARRoqxBso/0iNTxXoYHWhfK9hbS50UjlYmddUlQFqVjM7c4xgz8zBjmJu5Fpm2Uo+g==","signatures":[{"sig":"MEYCIQDmZYINc3xKTVmPI9GkhjcoBYROfBoOXF8KSxKfPbmY8AIhAPV6kamCnPD8sNXQ1RuLut+/eAVM4uE7IWlZdA0aiKZR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371398},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.5_1775579066145_0.1276069462956968","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@bitwild/nest-puppeteer","version":"0.0.6","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.6","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"5c19effbb347db7da714935e4077507a50ee0c19","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.6.tgz","fileCount":6,"integrity":"sha512-NCsDxbugeIA6gJH026AhQODwtM5GbXyl5uQo6IexeQC8wCk7pXKk0SLxVU0HmivuXhovoQdUL0SdrYF0Mml9fA==","signatures":[{"sig":"MEQCIBKAsjq+DUvuqB/wji+8/tHV7jPacL0E+JwFe9+Jtn9DAiB8Stj1ClgPeMX3qH/JePhUXHyixf1fquoVgrdpyyySrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373039},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.6_1775580070284_0.1742328001860849","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@bitwild/nest-puppeteer","version":"0.0.7","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.7","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"f9af3ed8a267e94d17c44c90f05b1fb75770c4c4","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.7.tgz","fileCount":6,"integrity":"sha512-V3AsjiDvqle20Iu4U9+UF1gQCMJZtNRFwW168S0Vz/6hjHg8gdrQJqNoYfg7Tj7woqa5kJi2pvLxGOlxJxmX9Q==","signatures":[{"sig":"MEQCICt91Q3sQLWJNx7+JoqNtLTvfi8UY143diJVKoQkUvdTAiAkwvV3JDmOpGaJGLGXfF1tJnZHP6nYDSW9N4ksvlUmPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375517},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"caeda5236771afa499fc89d227a983c7f880bf78","scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.6.2","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.7_1775586635700_0.3970727629239308","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@bitwild/nest-puppeteer","version":"0.0.8","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.8","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"487e1c5eaa0eaf151588dafbe58f384539c884dc","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.8.tgz","fileCount":6,"integrity":"sha512-aQunfddMAzE2C6gb81O0VWQjxQ7Tb/0X1BDtHJO5YOjWjjLuCGdhQWqyseFa8wETfiBD8aJXTLiZnYK5VZkgHw==","signatures":[{"sig":"MEUCIQDR1dQBAs4KoVwQ7AHYzBLgUBhBlySx1bFut5O1soExcQIgDnxqGXFO4K+mubP2NkkYxnfHceC8Y76uBSB/YxfIH9o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":401434},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"484d9ed7ccaa2021d6067954d5c605e6b076099d","scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.12.1","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.8_1778534099116_0.35985462416281866","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@bitwild/nest-puppeteer","version":"0.0.9","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","_id":"@bitwild/nest-puppeteer@0.0.9","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"dist":{"shasum":"74ffb1c69eff9272dbf70a052ac836dfc609808b","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.9.tgz","fileCount":6,"integrity":"sha512-3qbYKxVSaQ9AyRomT2kekq69/lEKh1ebZ36mXYUj0wo91DpSxLp6rg+qWZccidWA1TRF5yIRFsHtccjI28ZCPQ==","signatures":[{"sig":"MEQCIAxUh0cU/nECRKotpy7deZ2KibFoNGeCCKkClv54tGCNAiA3HonhNmx/p7r53G1+cUCS7QHN1+In/YH8revmGTr9WA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411505},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1d6c3da52f65e053fb11bf2226a7ecac2bed9968","scripts":{"lint":"biome check src/","build":"tsup","format":"biome format --write src/","lint:fix":"biome check --write src/","format:check":"biome format src/","prepublishOnly":"npm run build"},"_npmUser":{"name":"kauandotnet","email":"contato@kauan.net"},"_npmVersion":"11.16.0","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.5.0","@swc/core":"^1.15.24","puppeteer":"^24.0.0","typescript":"^5.8.0","@types/node":"^22.0.0","@nestjs/core":"^11.0.0","@types/multer":"^2.1.0","@biomejs/biome":"^2.4.10","@nestjs/common":"^11.0.0","@nestjs/swagger":"^11.2.6","@nestjs/testing":"^11.0.0","class-validator":"^0.15.1","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@nestjs/platform-express":"^11.1.18"},"peerDependencies":{"puppeteer":">=22","@nestjs/core":">=10","@nestjs/common":">=10","@nestjs/swagger":">=7","class-validator":">=0.14","class-transformer":">=0.5"},"peerDependenciesMeta":{"@nestjs/swagger":{"optional":true},"class-validator":{"optional":true},"class-transformer":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-puppeteer_0.0.9_1783543695365_0.32027528709259534","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@bitwild/nest-puppeteer","version":"0.0.10","description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/btwld/nest-puppeteer.git"},"homepage":"https://github.com/btwld/nest-puppeteer#readme","bugs":{"url":"https://github.com/btwld/nest-puppeteer/issues"},"type":"module","sideEffects":false,"main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./core":{"import":{"types":"./dist/core.d.ts","default":"./dist/core.js"},"require":{"types":"./dist/core.d.cts","default":"./dist/core.cjs"}},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"peerDependencies":{"@nestjs/common":"^10.0.0 || ^11.0.0 || >=12.0.0-alpha.1 <13","@nestjs/core":"^10.0.0 || ^11.0.0 || >=12.0.0-alpha.1 <13","@nestjs/platform-express":"^10.0.0 || ^11.0.0 || >=12.0.0-alpha.1 <13","@nestjs/swagger":">=7 <12 || >=12.0.0-alpha.1 <13","class-transformer":">=0.5","class-validator":">=0.14","puppeteer":">=22 <26","reflect-metadata":"^0.2.2","rxjs":"^7.8.0"},"peerDependenciesMeta":{"@nestjs/platform-express":{"optional":true},"@nestjs/swagger":{"optional":true},"class-transformer":{"optional":true},"class-validator":{"optional":true}},"devDependencies":{"@arethetypeswrong/cli":"0.18.5","@biomejs/biome":"2.4.10","@changesets/cli":"2.31.1","@nestjs/common":"12.0.0-alpha.5","@nestjs/core":"12.0.0-alpha.5","@nestjs/platform-express":"12.0.0-alpha.5","@nestjs/swagger":"12.0.0-alpha.2","@nestjs/testing":"12.0.0-alpha.5","@swc/core":"1.15.24","@types/multer":"2.1.0","@types/node":"24.13.3","class-transformer":"0.5.1","class-validator":"0.15.1","publint":"0.3.22","puppeteer":"25.3.0","reflect-metadata":"0.2.2","rxjs":"7.8.2","tsup":"8.5.0","typescript":"5.9.3"},"engines":{"node":">=20"},"scripts":{"build":"tsup","lint":"biome check src/ test/ scripts/ tsup.config.ts","lint:fix":"biome check --write src/ test/ scripts/ tsup.config.ts","format":"biome format --write src/ test/ scripts/ tsup.config.ts","format:check":"biome format src/ test/ scripts/ tsup.config.ts","typecheck":"tsc --noEmit","test":"npm run build && node --test test/*.test.mjs","check":"pnpm run lint && pnpm run format:check && pnpm run typecheck && pnpm run test","verify:pack":"pnpm run build && publint --strict && attw --pack . --profile node16 && node scripts/test-packed-core.mjs","changeset":"changeset","release":"changeset publish"},"_nodeVersion":"24.18.0","_id":"@bitwild/nest-puppeteer@0.0.10","dist":{"integrity":"sha512-KwH4ItfS+A42guHGIW8sbFaqC3SACLn5RfT/dzRkPAr0qlxXhi7Gi3mq1V4HulGPbRiouu1bHDnVt/NE6iNgfA==","shasum":"135a436dfb0797c1420a568717a22cba3b5490fd","tarball":"https://registry.npmjs.org/@bitwild/nest-puppeteer/-/nest-puppeteer-0.0.10.tgz","fileCount":13,"unpackedSize":467003,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bitwild%2fnest-puppeteer@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDlIc4aGJD01UKfY7Xw7MUEQy8hkEapJVwsZgK7bGUp9AiEA7Y4qN4lgoYMmLWAHRQxx8eKKZJEphLqM/fJAL3NcQts="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e33c28be-1994-413c-a532-8cd13278c33b"}},"directories":{},"maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nest-puppeteer_0.0.10_1785546213499_0.5263092139000367"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T15:18:42.059Z","modified":"2026-08-01T01:03:34.013Z","0.0.1":"2026-04-07T15:18:42.340Z","0.0.2":"2026-04-07T15:30:49.873Z","0.0.3":"2026-04-07T16:14:21.661Z","0.0.4":"2026-04-07T16:17:15.633Z","0.0.5":"2026-04-07T16:24:26.282Z","0.0.6":"2026-04-07T16:41:10.536Z","0.0.7":"2026-04-07T18:30:35.857Z","0.0.8":"2026-05-11T21:14:59.276Z","0.0.9":"2026-07-08T20:48:15.535Z","0.0.10":"2026-08-01T01:03:33.650Z"},"license":"MIT","keywords":["browser","headless","nest","nestjs","provider","puppeteer","pdf","screenshot","scrape"],"description":"Puppeteer (Headless Chrome) provider for NestJS with Cloudflare Browser Rendering-style API","maintainers":[{"name":"leoafarias","email":"leoafarias@gmail.com"},{"name":"tnramalho","email":"thiago.nramalho@gmail.com"},{"name":"kauandotnet","email":"contato@kauan.net"}],"readme":"# @bitwild/nest-puppeteer\n\nPuppeteer provider for NestJS 10, 11, and 12 with a high-level API inspired by the [Cloudflare Browser Rendering](https://developers.cloudflare.com/browser-rendering/) REST API.\n\n## Features\n\n- **Service layer** -- `PuppeteerService` with 7 Cloudflare-aligned methods\n- **REST layer** -- Auto-generated endpoints with configurable prefix, guards, and feature selection\n- **Feature modules** -- Standalone modules for individual features (`PdfBrowserModule`, `ScreenshotBrowserModule`, etc.)\n- **DI decorators** -- `@InjectBrowser()`, `@InjectContext()`, `@InjectPage()` for direct Puppeteer access\n- **Validation** -- DTOs with class-validator, registered via `APP_PIPE`\n- **Swagger** -- OpenAPI decorators on all endpoints and DTOs\n- **Error handling** -- Cloudflare-format error responses via `APP_FILTER`\n- **Testing** -- `createMockPuppeteerProviders()` for unit tests\n\n## Installation\n\n```bash\nnpm install @bitwild/nest-puppeteer puppeteer\n```\n\nFor REST endpoints (optional):\n\n```bash\nnpm install class-validator class-transformer @nestjs/platform-express @nestjs/swagger\n```\n\n## Quick Start\n\n### Service-only (no REST endpoints)\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { PuppeteerModule } from '@bitwild/nest-puppeteer/core';\n\n@Module({\n  imports: [PuppeteerModule.forRoot()],\n})\nexport class AppModule {}\n```\n\nThen inject the service:\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport { PuppeteerService } from '@bitwild/nest-puppeteer/core';\n\n@Injectable()\nexport class ReportService {\n  constructor(private readonly puppeteer: PuppeteerService) {}\n\n  async generateInvoice(url: string): Promise<Buffer> {\n    return this.puppeteer.pdf({\n      url,\n      format: 'a4',\n      printBackground: true,\n      margin: { top: '1cm', bottom: '1cm', left: '1cm', right: '1cm' },\n    });\n  }\n\n  async getPageContent(url: string): Promise<string> {\n    return this.puppeteer.content({\n      url,\n      waitForSelector: { selector: '#main-content', visible: true },\n    });\n  }\n}\n```\n\n### REST API endpoints\n\nExpose Cloudflare-compatible HTTP endpoints:\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { PuppeteerModule } from '@bitwild/nest-puppeteer';\nimport { AuthGuard } from './auth.guard';\n\n@Module({\n  imports: [\n    PuppeteerModule.forRoot({\n      headless: true,\n      rest: {\n        prefix: 'browser-rendering',\n        features: ['content', 'screenshot', 'pdf', 'markdown', 'scrape', 'links'],\n        guards: [AuthGuard],\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nThis registers:\n\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | `/browser-rendering/content` | Fetch rendered HTML |\n| POST | `/browser-rendering/screenshot` | Capture screenshot (binary) |\n| POST | `/browser-rendering/pdf` | Generate PDF (binary) |\n| POST | `/browser-rendering/markdown` | Extract Markdown |\n| POST | `/browser-rendering/snapshot` | HTML + screenshot in one call |\n| POST | `/browser-rendering/scrape` | Scrape elements by CSS selectors |\n| POST | `/browser-rendering/links` | Extract all links |\n\n**Request example:**\n\n```bash\ncurl -X POST http://localhost:3000/browser-rendering/pdf \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"url\": \"https://example.com\", \"format\": \"a4\", \"printBackground\": true}' \\\n  --output document.pdf\n```\n\n**JSON response format** (content, markdown, scrape, links):\n\n```json\n{\n  \"success\": true,\n  \"result\": { \"html\": \"...\" }\n}\n```\n\n**Error response format:**\n\n```json\n{\n  \"success\": false,\n  \"errors\": [{ \"code\": 400, \"message\": \"Either \\\"url\\\" or \\\"html\\\" must be provided\" }]\n}\n```\n\n### Async configuration\n\nService-only applications should use the isolated `./core` entry. It does not load the optional\nREST, Swagger, validation, or Express dependencies:\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { PuppeteerModule } from '@bitwild/nest-puppeteer/core';\n\n@Module({\n  imports: [\n    PuppeteerModule.forRootAsync({\n      imports: [ConfigModule],\n      useFactory: (config: ConfigService) => ({\n        enabled: config.get('THUMBNAIL_ENABLED', false),\n        launchOptions: {\n          headless: true,\n          executablePath: config.get('CHROME_PATH'),\n        },\n      }),\n      inject: [ConfigService],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nWhen `enabled` is false, the module keeps `PuppeteerService` injectable without launching\nChromium. Calling a browser operation in that state rejects with `PuppeteerUnavailableError`.\n\nThe root entry adds REST endpoint support:\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { PuppeteerModule } from '@bitwild/nest-puppeteer';\n\n@Module({\n  imports: [\n    PuppeteerModule.forRootAsync({\n      imports: [ConfigModule],\n      useFactory: (config: ConfigService) => ({\n        launchOptions: {\n          headless: config.get('PUPPETEER_HEADLESS', true),\n          args: config.get('PUPPETEER_ARGS', '').split(',').filter(Boolean),\n        },\n      }),\n      inject: [ConfigService],\n      rest: {\n        prefix: 'api/browser',\n        features: ['pdf', 'screenshot'],\n        guards: [AuthGuard],\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n## Feature Modules\n\nPre-configured modules for individual features with their own defaults, REST endpoint, and guards.\n\n### Standalone (single-feature app)\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { PdfBrowserModule } from '@bitwild/nest-puppeteer';\n\n@Module({\n  imports: [\n    PdfBrowserModule.forRoot({\n      launchOptions: { headless: true },\n      defaults: {\n        format: 'a4',\n        printBackground: true,\n        margin: { top: '1cm', bottom: '1cm', left: '1cm', right: '1cm' },\n      },\n      prefix: 'api/pdf',  // POST /api/pdf\n      guards: [AuthGuard],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### Multi-feature (shared browser)\n\n```ts\nimport { Module } from '@nestjs/common';\nimport {\n  PuppeteerModule,\n  PdfBrowserModule,\n  ScreenshotBrowserModule,\n  ScrapeBrowserModule,\n} from '@bitwild/nest-puppeteer';\n\n@Module({\n  imports: [\n    // Shared browser\n    PuppeteerModule.forRoot({ headless: true }),\n\n    // Feature modules with individual config\n    PdfBrowserModule.register({\n      defaults: { format: 'a4', printBackground: true },\n      prefix: 'api/pdf',\n      guards: [AuthGuard],\n    }),\n    ScreenshotBrowserModule.register({\n      defaults: { fullPage: true, type: 'png' },\n      prefix: 'api/screenshot',\n      guards: [AuthGuard],\n    }),\n    ScrapeBrowserModule.register({\n      prefix: 'api/scrape',\n      guards: [AuthGuard],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n### Feature services\n\nEach feature module provides a dedicated service:\n\n| Module | Service | Method |\n|--------|---------|--------|\n| `PdfBrowserModule` | `PdfBrowserService` | `.generate(options)` |\n| `ScreenshotBrowserModule` | `ScreenshotBrowserService` | `.capture(options)` |\n| `ContentBrowserModule` | `ContentBrowserService` | `.fetch(options)` |\n| `MarkdownBrowserModule` | `MarkdownBrowserService` | `.extract(options)` |\n| `SnapshotBrowserModule` | `SnapshotBrowserService` | `.take(options)` |\n| `ScrapeBrowserModule` | `ScrapeBrowserService` | `.scrape(options)` |\n| `LinksBrowserModule` | `LinksBrowserService` | `.extract(options)` |\n\nFeature services merge module defaults with per-call options:\n\n```ts\n@Injectable()\nexport class InvoiceService {\n  constructor(private readonly pdf: PdfBrowserService) {}\n\n  async generate(url: string): Promise<Buffer> {\n    // Module defaults (format: a4, margins, etc.) applied automatically\n    return this.pdf.generate({ url });\n  }\n\n  async generateLandscape(url: string): Promise<Buffer> {\n    // Override specific defaults per call\n    return this.pdf.generate({ url, landscape: true });\n  }\n}\n```\n\n## Low-level Access\n\nInject Puppeteer primitives directly:\n\n```ts\nimport { Injectable } from '@nestjs/common';\nimport { InjectBrowser, InjectPage } from '@bitwild/nest-puppeteer';\nimport { Browser, Page } from 'puppeteer';\n\n@Injectable()\nexport class CustomService {\n  constructor(\n    @InjectBrowser() private readonly browser: Browser,\n    @InjectPage() private readonly page: Page,\n  ) {}\n\n  async doCustomWork() {\n    const page = await this.browser.newPage();\n    try {\n      await page.goto('https://example.com');\n      // ... custom puppeteer logic\n    } finally {\n      await page.close();\n    }\n  }\n}\n```\n\n### Named pages with forFeature\n\n```ts\n@Module({\n  imports: [PuppeteerModule.forFeature(['crawler', 'renderer'])],\n})\nexport class CrawlerModule {}\n\n// Then inject:\n@Injectable()\nexport class CrawlerService {\n  constructor(\n    @InjectPage('crawler') private readonly crawlerPage: Page,\n    @InjectPage('renderer') private readonly rendererPage: Page,\n  ) {}\n}\n```\n\n### Multiple browser instances\n\n```ts\n@Module({\n  imports: [\n    PuppeteerModule.forRoot({ headless: true }, 'chrome'),\n    PuppeteerModule.forRoot({ headless: true }, 'stealth'),\n  ],\n})\nexport class AppModule {}\n\n// Inject specific instances:\n@Injectable()\nexport class MyService {\n  constructor(\n    @InjectBrowser('chrome') private readonly chrome: Browser,\n    @InjectBrowser('stealth') private readonly stealth: Browser,\n  ) {}\n}\n```\n\n## PuppeteerService API\n\nAll methods accept a common set of options plus method-specific fields. Options are flat (not nested) to match the Cloudflare API.\n\n### Common options\n\n```ts\ninterface CommonBrowserOptions {\n  url?: string;                              // URL to navigate to\n  html?: string;                             // HTML to render directly\n  authenticate?: { username, password };     // HTTP Basic Auth\n  cookies?: CookieParam[];                   // Cookies to set\n  gotoOptions?: { waitUntil, timeout };      // Navigation behavior\n  setExtraHTTPHeaders?: Record<string, string>;\n  rejectResourceTypes?: ResourceType[];      // Block resource types\n  rejectRequestPattern?: string[];           // Block URL patterns (regex)\n  allowResourceTypes?: ResourceType[];       // Allow only these types\n  allowRequestPattern?: string[];            // Allow only these patterns\n  userAgent?: string;\n  waitForSelector?: { selector, timeout?, visible? };\n  waitForTimeout?: number;                   // Static delay (ms)\n  viewport?: { width, height, deviceScaleFactor };\n  addScriptTag?: { url?, content? }[];\n  addStyleTag?: { url?, content? }[];\n  setJavaScriptEnabled?: boolean;\n  emulateMediaType?: string;                 // 'screen' | 'print'\n}\n```\n\n### content(options)\n\n```ts\nconst html = await puppeteerService.content({\n  url: 'https://example.com',\n  waitForSelector: { selector: '#app', visible: true },\n});\n```\n\n### screenshot(options)\n\n```ts\nconst buffer = await puppeteerService.screenshot({\n  url: 'https://example.com',\n  fullPage: true,\n  type: 'png',\n  quality: 90,            // jpeg/webp only\n  omitBackground: true,\n  selector: '#chart',     // screenshot a specific element\n});\n```\n\n### pdf(options)\n\n```ts\nconst buffer = await puppeteerService.pdf({\n  url: 'https://example.com',\n  format: 'a4',\n  landscape: true,\n  printBackground: true,\n  scale: 0.8,\n  margin: { top: '2cm', bottom: '2cm', left: '1cm', right: '1cm' },\n  displayHeaderFooter: true,\n  headerTemplate: '<div style=\"font-size:10px\">Header</div>',\n  footerTemplate: '<div style=\"font-size:10px\">Page <span class=\"pageNumber\"></span></div>',\n});\n```\n\n### markdown(options)\n\n```ts\nconst md = await puppeteerService.markdown({\n  url: 'https://example.com/article',\n  rejectResourceTypes: ['image', 'stylesheet'],\n});\n```\n\n### snapshot(options)\n\n```ts\nconst { html, screenshot } = await puppeteerService.snapshot({\n  url: 'https://example.com',\n  fullPage: true,\n  type: 'jpeg',\n  quality: 80,\n});\n```\n\n### scrape(options)\n\n```ts\nconst results = await puppeteerService.scrape({\n  url: 'https://example.com',\n  selectors: ['h1', 'p.intro', 'a[href]'],\n});\n// results: [{ selector: 'h1', elements: [{ text, html, attributes, width, height, top, left }] }, ...]\n```\n\n### links(options)\n\n```ts\nconst urls = await puppeteerService.links({\n  url: 'https://example.com',\n  visibleLinksOnly: true,\n});\n// urls: ['https://example.com/about', 'https://example.com/contact', ...]\n```\n\n## Swagger\n\nIf `@nestjs/swagger` is installed, all endpoints and DTOs are auto-documented:\n\n```ts\nimport { NestFactory } from '@nestjs/core';\nimport { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';\n\nconst app = await NestFactory.create(AppModule);\n\nconst config = new DocumentBuilder()\n  .setTitle('Browser Rendering API')\n  .setVersion('1.0')\n  .build();\n\nSwaggerModule.setup('docs', app, SwaggerModule.createDocument(app, config));\nawait app.listen(3000);\n```\n\n## Testing\n\nUse `createMockPuppeteerProviders()` to avoid launching a real browser:\n\n```ts\nimport { Test } from '@nestjs/testing';\nimport { createMockPuppeteerProviders, PuppeteerService } from '@bitwild/nest-puppeteer';\n\ndescribe('ReportService', () => {\n  let service: ReportService;\n\n  beforeEach(async () => {\n    const module = await Test.createTestingModule({\n      providers: [\n        ReportService,\n        PuppeteerService,\n        ...createMockPuppeteerProviders({\n          browser: {\n            newPage: jest.fn().mockResolvedValue({\n              goto: jest.fn(),\n              pdf: jest.fn().mockResolvedValue(Buffer.from('pdf')),\n              content: jest.fn().mockResolvedValue('<html></html>'),\n              close: jest.fn(),\n              setViewport: jest.fn(),\n            }),\n          },\n        }),\n      ],\n    }).compile();\n\n    service = module.get(ReportService);\n  });\n});\n```\n\n## Docker\n\nRecommended launch options for containerized environments:\n\n```ts\nPuppeteerModule.forRoot({\n  headless: true,\n  args: [\n    '--no-sandbox',\n    '--disable-setuid-sandbox',\n    '--disable-dev-shm-usage',\n    '--disable-gpu',\n  ],\n})\n```\n\n## License\n\nMIT\n","readmeFilename":"","homepage":"https://github.com/btwld/nest-puppeteer#readme","repository":{"type":"git","url":"git+https://github.com/btwld/nest-puppeteer.git"},"bugs":{"url":"https://github.com/btwld/nest-puppeteer/issues"}}