Skip to content

Commit 25fb958

Browse files
committed
Refactor BrowserManager and Converter to load puppeteer-core on demand
1 parent cc1fa23 commit 25fb958

10 files changed

Lines changed: 137 additions & 162 deletions

File tree

src/browser/finder.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { debugBrowserFinder } from '../utils/debug'
33
import { isExecutable, normalizeDarwinAppPath } from '../utils/finder'
44
import type { Browser } from './browser'
55
import { chromeFinder as chrome } from './finders/chrome'
6+
import { defaultFinders } from './finders/definition'
7+
import type { FinderName } from './finders/definition'
68
import { edgeFinder as edge } from './finders/edge'
79
import { firefoxFinder as firefox } from './finders/firefox'
810

@@ -19,19 +21,10 @@ export type BrowserFinder = (
1921
opts: BrowserFinderOptions
2022
) => Promise<BrowserFinderResult>
2123

22-
export type FinderName = keyof typeof availableFindersMap
23-
24-
const availableFindersMap = { chrome, edge, firefox } as const
25-
26-
export const availableFinders = Object.keys(
27-
availableFindersMap
28-
) as readonly FinderName[]
29-
30-
export const defaultFinders = [
31-
'chrome',
32-
'edge',
33-
'firefox',
34-
] as const satisfies readonly FinderName[]
24+
const availableFindersMap = { chrome, edge, firefox } as const satisfies Record<
25+
FinderName,
26+
BrowserFinder
27+
>
3528

3629
export const findBrowser = async (
3730
finders: readonly FinderName[] = defaultFinders,

src/browser/finders/definition.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const availableFinders = ['chrome', 'edge', 'firefox'] as const
2+
3+
export type FinderName = (typeof availableFinders)[number]
4+
5+
export const defaultFinders = [
6+
...availableFinders,
7+
] as const satisfies readonly FinderName[]

src/browser/manager.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import { debugBrowser } from '../utils/debug'
33
import { createMemoizedPromiseContext } from '../utils/memoized-promise'
44
import type { Browser, BrowserProtocol } from './browser'
55
import { ChromeCdpBrowser } from './browsers/chrome-cdp'
6-
import { defaultFinders, findBrowser } from './finder'
7-
import type { BrowserFinderResult, FinderName } from './finder'
6+
import { findBrowser } from './finder'
7+
import type { BrowserFinderResult } from './finder'
8+
import { defaultFinders } from './finders/definition'
9+
import type { FinderName } from './finders/definition'
810

911
export interface BrowserManagerConfig {
1012
/** Browser finders */

src/config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import path from 'node:path'
33
import chalk from 'chalk'
44
import { cosmiconfig, cosmiconfigSync } from 'cosmiconfig'
55
import { osLocale } from 'os-locale'
6-
import { availableFinders } from './browser/finder'
7-
import type { FinderName } from './browser/finder'
6+
import { availableFinders } from './browser/finders/definition'
7+
import type { FinderName } from './browser/finders/definition'
88
import type { BrowserManagerConfig } from './browser/manager'
99
import { info, warn, error as cliError } from './cli'
1010
import { ConvertType, type ConverterOption } from './converter'
@@ -135,7 +135,7 @@ export class MarpCLIConfig {
135135
browserManagerOption() {
136136
const finders = (() => {
137137
const isAvailableFinder = (f: string): f is FinderName =>
138-
(availableFinders as string[]).includes(f)
138+
availableFinders.includes(f as FinderName)
139139

140140
const browser = this.args.browser ?? this.conf.browser ?? 'auto'
141141

src/converter.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ export const mimeTypes = {
6262
export interface ConverterOption {
6363
allowLocalFiles: boolean
6464
baseUrl?: string
65-
browserManager: BrowserManager
6665
engine: Engine
66+
getBrowserManager: () => BrowserManager | Promise<BrowserManager>
6767
globalDirectives: { theme?: string } & Partial<TemplateMeta>
6868
html?: MarpOptions['html']
6969
imageScale?: number
@@ -130,7 +130,8 @@ export class Converter {
130130
}
131131

132132
get browser(): Promise<Browser> {
133-
return this.options.browserManager.browserForConversion()
133+
return (async () =>
134+
(await this.options.getBrowserManager()).browserForConversion())()
134135
}
135136

136137
get template(): Template {

src/marp-cli.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import chalk from 'chalk'
2-
import { availableFinders } from './browser/finder'
3-
import { BrowserManager } from './browser/manager'
2+
import { availableFinders } from './browser/finders/definition'
3+
import type { FinderName } from './browser/finders/definition'
4+
import type { BrowserManager } from './browser/manager'
45
import * as cli from './cli'
56
import { DEFAULT_PARALLEL, fromArguments } from './config'
67
import { Converter, ConvertedCallback, ConvertType } from './converter'
@@ -65,7 +66,7 @@ const coerceBrowser = (browser: string | false) => {
6566

6667
const normalize = (str: string) => str.toLowerCase().trim()
6768
const isAvailable = (finder: string) =>
68-
(availableFinders as string[]).includes(normalize(finder))
69+
availableFinders.includes(normalize(finder) as FinderName)
6970

7071
const normalized = normalize(browser)
7172
if (normalized === '' || normalized === 'auto') return 'auto'
@@ -423,13 +424,20 @@ export const marpCli = async (
423424
const config = await fromArguments(args)
424425
if (args.version) return await version(config)
425426

426-
// Initialize browser manager
427-
browserManager = new BrowserManager(config.browserManagerOption())
427+
// Initialize browser manager (import is delayed for better performance when not using browser)
428+
const browserManagerOption = config.browserManagerOption()
429+
const getBrowserManager = async () => {
430+
if (!browserManager) {
431+
const { BrowserManager } = await import('./browser/manager')
432+
browserManager = new BrowserManager(browserManagerOption)
433+
}
434+
return browserManager
435+
}
428436

429437
// Initialize converter
430438
const converter = new Converter({
431439
...(await config.converterOption()),
432-
browserManager,
440+
getBrowserManager,
433441
})
434442
const cvtOpts = converter.options
435443

@@ -533,7 +541,9 @@ export const marpCli = async (
533541
)
534542

535543
// Preview window
536-
const preview = new Preview({ browserManager: browserManager! })
544+
const preview = new Preview({
545+
browserManager: await getBrowserManager(),
546+
})
537547
preview.on('exit', () => res(0))
538548
preview.on('opening', (location: string) => {
539549
const loc = location.substring(0, 50)

test/browser/finder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import path from 'node:path'
22
import { ChromeBrowser } from '../../src/browser/browsers/chrome'
33
import { ChromeCdpBrowser } from '../../src/browser/browsers/chrome-cdp'
44
import { FirefoxBrowser } from '../../src/browser/browsers/firefox'
5-
import { defaultFinders, findBrowser } from '../../src/browser/finder'
5+
import { findBrowser } from '../../src/browser/finder'
6+
import { defaultFinders } from '../../src/browser/finders/definition'
67
import { CLIError } from '../../src/error'
78

89
afterEach(() => {

test/converter.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ describe('Converter', () => {
6565

6666
const instance = (opts: Partial<ConverterOption> = {}) =>
6767
new Converter({
68-
browserManager,
68+
getBrowserManager: () => browserManager,
6969
themeSet,
7070
allowLocalFiles: false,
7171
engine: Marp,
@@ -85,7 +85,7 @@ describe('Converter', () => {
8585
await using browserManager = new BrowserManager({ timeout: 12345 })
8686

8787
const options = {
88-
browserManager,
88+
getBrowserManager: () => browserManager,
8989
themeSet,
9090
allowLocalFiles: true,
9191
engine: Marp,
@@ -923,7 +923,7 @@ describe('Converter', () => {
923923

924924
await expect(
925925
pdfInstance({
926-
browserManager,
926+
getBrowserManager: () => browserManager,
927927
output: 'test.pdf',
928928
}).convertFile(new File(onePath))
929929
).rejects.toThrow(TimeoutError)
@@ -944,7 +944,7 @@ describe('Converter', () => {
944944
})
945945

946946
await pdfInstance({
947-
browserManager,
947+
getBrowserManager: () => browserManager,
948948
output: 'test.pdf',
949949
}).convertFile(new File(onePath))
950950

@@ -1229,7 +1229,7 @@ describe('Converter', () => {
12291229
})
12301230

12311231
await instance({
1232-
browserManager,
1232+
getBrowserManager: () => browserManager,
12331233
output: 'a.png',
12341234
type: ConvertType.png,
12351235
imageScale: 0.5,
@@ -1271,7 +1271,7 @@ describe('Converter', () => {
12711271
)
12721272

12731273
await instance({
1274-
browserManager,
1274+
getBrowserManager: () => browserManager,
12751275
output: 'a.png',
12761276
type: ConvertType.png,
12771277
imageScale: 0.5,
@@ -1312,7 +1312,7 @@ describe('Converter', () => {
13121312

13131313
await expect(
13141314
instance({
1315-
browserManager,
1315+
getBrowserManager: () => browserManager,
13161316
output: 'a.png',
13171317
type: ConvertType.png,
13181318
imageScale: 0.5,
@@ -1405,7 +1405,7 @@ describe('Converter', () => {
14051405
})
14061406

14071407
await instance({
1408-
browserManager,
1408+
getBrowserManager: () => browserManager,
14091409
output: 'b.jpg',
14101410
type: ConvertType.jpeg,
14111411
imageScale: 0.25,
@@ -1424,7 +1424,7 @@ describe('Converter', () => {
14241424
writeFileSpy.mockClear()
14251425

14261426
await instance({
1427-
browserManager,
1427+
getBrowserManager: () => browserManager,
14281428
output: 'b.jpg',
14291429
type: ConvertType.jpeg,
14301430
imageScale: 0.25,
@@ -1449,7 +1449,7 @@ describe('Converter', () => {
14491449
})
14501450

14511451
await instance({
1452-
browserManager,
1452+
getBrowserManager: () => browserManager,
14531453
output: 'b.jpg',
14541454
type: ConvertType.jpeg,
14551455
imageScale: 0.25,
@@ -1468,7 +1468,7 @@ describe('Converter', () => {
14681468
writeFileSpy.mockClear()
14691469

14701470
await instance({
1471-
browserManager,
1471+
getBrowserManager: () => browserManager,
14721472
output: 'b.jpg',
14731473
type: ConvertType.jpeg,
14741474
imageScale: 0.25,

0 commit comments

Comments
 (0)