@vivliostyle/cli 9.8.3 → 9.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-HYY2WKJZ.js → chunk-3O3N2V7D.js} +4 -4
- package/dist/{chunk-3VKIUKTD.js → chunk-6KEOMYDZ.js} +2 -2
- package/dist/{chunk-QOPM72CS.js → chunk-6UU7DEUR.js} +4 -4
- package/dist/{chunk-MDTA37GZ.js → chunk-G3GROLBN.js} +2 -2
- package/dist/{chunk-PBAUN5CU.js → chunk-OZ4XTSAH.js} +2 -2
- package/dist/{chunk-LI2REENX.js → chunk-QWX5MAON.js} +4 -4
- package/dist/{chunk-YUYXQJDY.js → chunk-UYKCTF6F.js} +26 -11
- package/dist/chunk-UYKCTF6F.js.map +1 -0
- package/dist/{chunk-PPI5DA75.js → chunk-WELNNHOB.js} +52 -32
- package/dist/chunk-WELNNHOB.js.map +1 -0
- package/dist/commands/build.js +5 -5
- package/dist/commands/init.js +3 -3
- package/dist/commands/preview.js +5 -5
- package/dist/config/schema.d.ts +2455 -1660
- package/dist/config/schema.js +5 -1
- package/dist/index.js +8 -8
- package/dist/vite-adapter.js +4 -4
- package/package.json +2 -2
- package/dist/chunk-PPI5DA75.js.map +0 -1
- package/dist/chunk-YUYXQJDY.js.map +0 -1
- /package/dist/{chunk-HYY2WKJZ.js.map → chunk-3O3N2V7D.js.map} +0 -0
- /package/dist/{chunk-3VKIUKTD.js.map → chunk-6KEOMYDZ.js.map} +0 -0
- /package/dist/{chunk-QOPM72CS.js.map → chunk-6UU7DEUR.js.map} +0 -0
- /package/dist/{chunk-MDTA37GZ.js.map → chunk-G3GROLBN.js.map} +0 -0
- /package/dist/{chunk-PBAUN5CU.js.map → chunk-OZ4XTSAH.js.map} +0 -0
- /package/dist/{chunk-LI2REENX.js.map → chunk-QWX5MAON.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/load.ts","../src/config/merge.ts","../src/config/resolve.ts","../src/processor/markdown.ts","../src/browser.ts","../src/server.ts","../src/vite/vite-plugin-dev-server.ts","../src/processor/asset.ts","../src/processor/compile.ts","../src/output/webbook.ts","../src/processor/html.tsx","../src/output/epub.ts","../src/processor/theme.ts","../src/vite/plugin-util.ts","../src/vite/vite-plugin-static-serve.ts","../src/vite/vite-plugin-viewer.ts","../src/vite/vite-plugin-browser.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport upath from 'upath';\nimport * as v from 'valibot';\nimport { Logger } from '../logger.js';\nimport {\n cwd as defaultRoot,\n DetailError,\n parseJsonc,\n prettifySchemaError,\n} from '../util.js';\nimport {\n InlineOptions,\n ParsedVivliostyleConfigSchema,\n VivliostyleConfigSchema,\n} from './schema.js';\n\nconst require = createRequire(import.meta.url);\n\nexport function locateVivliostyleConfig({\n config,\n cwd = defaultRoot,\n}: Pick<InlineOptions, 'config' | 'cwd'>) {\n if (config) {\n return upath.resolve(cwd, config);\n }\n return ['.js', '.mjs', '.cjs', '.json']\n .map((ext) => upath.join(cwd, `vivliostyle.config${ext}`))\n .find((p) => fs.existsSync(p));\n}\n\nexport async function loadVivliostyleConfig({\n config,\n configData,\n cwd,\n}: Pick<InlineOptions, 'config' | 'configData' | 'cwd'>): Promise<\n ParsedVivliostyleConfigSchema | undefined\n> {\n if (configData) {\n return v.parse(VivliostyleConfigSchema, configData);\n }\n\n const absPath = locateVivliostyleConfig({ config, cwd });\n if (!absPath) {\n return;\n }\n\n let parsedConfig: unknown;\n let jsonRaw: string | undefined;\n try {\n if (upath.extname(absPath) === '.json') {\n jsonRaw = fs.readFileSync(absPath, 'utf8');\n parsedConfig = parseJsonc(jsonRaw);\n } else {\n // Clear require cache to reload CJS config files\n delete require.cache[require.resolve(absPath)];\n const url = pathToFileURL(absPath);\n // Invalidate cache for ESM config files\n // https://github.com/nodejs/node/issues/49442\n url.search = `version=${Date.now()}`;\n parsedConfig = (await import(/* @vite-ignore */ url.href)).default;\n jsonRaw = JSON.stringify(parsedConfig, null, 2);\n }\n } catch (error) {\n const thrownError = error as Error;\n throw new DetailError(\n `An error occurred on loading a config file: ${absPath}`,\n thrownError.stack ?? thrownError.message,\n );\n }\n\n const result = v.safeParse(VivliostyleConfigSchema, parsedConfig);\n if (result.success) {\n const { tasks, inlineOptions } = result.output;\n return {\n tasks,\n inlineOptions: {\n ...inlineOptions,\n cwd: cwd ?? defaultRoot,\n config: absPath,\n },\n };\n } else {\n const errorString = prettifySchemaError(jsonRaw, result.issues);\n throw new DetailError(\n `Validation of vivliostyle config failed. Please check the schema: ${config}`,\n errorString,\n );\n }\n}\n\nexport function warnDeprecatedConfig(config: ParsedVivliostyleConfigSchema) {\n if (config.tasks.some((task) => task.includeAssets)) {\n Logger.logWarn(\n \"'includeAssets' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'copyAsset.includes' property instead.\",\n );\n }\n\n if (config.tasks.some((task) => task.tocTitle)) {\n Logger.logWarn(\n \"'tocTitle' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'toc.title' property instead.\",\n );\n }\n\n if (config.tasks.some((task) => task.http)) {\n Logger.logWarn(\n \"'http' property of Vivliostyle config was deprecated and will be removed in a future release. This option is enabled by default, and the file protocol is no longer supported.\",\n );\n }\n}\n","import {\n InlineOptions,\n ParsedBuildTask,\n ParsedVivliostyleConfigSchema,\n ParsedVivliostyleInlineConfig,\n} from './schema.js';\n\nconst pruneObject = <T extends Record<string, unknown>>(obj: T) => {\n const ret = { ...obj };\n for (const key in ret) {\n if (ret[key] === undefined || ret[key] === null) {\n delete ret[key];\n }\n }\n return ret as { [K in keyof T]: NonNullable<T[K]> };\n};\n\nexport function mergeConfig(\n base: ParsedVivliostyleConfigSchema,\n override: Partial<ParsedBuildTask>,\n): ParsedVivliostyleConfigSchema {\n return {\n tasks: base.tasks.map((task, i) => ({\n ...pruneObject(task),\n ...pruneObject(override),\n })),\n inlineOptions: base.inlineOptions,\n };\n}\n\ntype HasOnlyInlineOptionsProperties<T> =\n Exclude<keyof T, keyof InlineOptions> extends never ? T : never;\n\nexport function mergeInlineConfig(\n { tasks, inlineOptions }: ParsedVivliostyleConfigSchema,\n inlineConfig: ParsedVivliostyleInlineConfig,\n): ParsedVivliostyleConfigSchema {\n const {\n theme,\n size,\n pressReady,\n title,\n author,\n language,\n readingProgression,\n timeout,\n image,\n viewer,\n viewerParam,\n browser,\n output,\n renderMode,\n preflight,\n preflightOption,\n vite,\n viteConfigFile,\n host,\n port,\n ...overrideInlineOptions\n } = inlineConfig;\n\n return {\n tasks: tasks.map((task) => ({\n ...pruneObject(task),\n ...pruneObject({\n theme,\n size,\n pressReady,\n title,\n author,\n language,\n readingProgression,\n timeout,\n image,\n viewer,\n viewerParam,\n browser,\n vite,\n viteConfigFile,\n }),\n output: (output?.length ? output : task.output)?.map((o) => ({\n ...pruneObject(o),\n ...pruneObject({\n renderMode,\n preflight,\n preflightOption,\n }),\n })),\n server: {\n ...pruneObject(task.server ?? {}),\n ...pruneObject({ host, port }),\n },\n })),\n inlineOptions: {\n ...pruneObject(inlineOptions),\n ...pruneObject(\n overrideInlineOptions satisfies HasOnlyInlineOptionsProperties<\n typeof overrideInlineOptions\n >,\n ),\n },\n };\n}\n","import { Metadata, StringifyMarkdownOptions, VFM } from '@vivliostyle/vfm';\nimport { lookup as mime } from 'mime-types';\nimport fs from 'node:fs';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport npa from 'npm-package-arg';\nimport { Processor } from 'unified';\nimport upath from 'upath';\nimport { ResolvedConfig as ResolvedViteConfig, UserConfig } from 'vite';\nimport {\n ArticleEntryConfig,\n BrowserType,\n ContentsEntryConfig,\n CoverEntryConfig,\n EntryConfig,\n InputFormat,\n StructuredDocument,\n StructuredDocumentSection,\n ThemeConfig,\n} from '../config/schema.js';\nimport {\n cliVersion,\n CONTAINER_LOCAL_HOSTNAME,\n CONTAINER_URL,\n COVER_HTML_FILENAME,\n COVER_HTML_IMAGE_ALT,\n EPUB_OUTPUT_VERSION,\n MANIFEST_FILENAME,\n TOC_FILENAME,\n TOC_TITLE,\n} from '../const.js';\nimport { Logger } from '../logger.js';\nimport { readMarkdownMetadata } from '../processor/markdown.js';\nimport {\n cwd as defaultCwd,\n getEpubRootDir,\n isInContainer,\n isValidUri,\n pathContains,\n pathEquals,\n readJSON,\n statFileSync,\n touchTmpFile,\n} from '../util.js';\nimport { InlineOptions, ParsedBuildTask } from './schema.js';\n\nexport type ParsedTheme = UriTheme | FileTheme | PackageTheme;\n\nexport interface UriTheme {\n type: 'uri';\n name: string;\n location: string;\n}\n\nexport interface FileTheme {\n type: 'file';\n name: string;\n source: string;\n location: string;\n}\n\nexport interface PackageTheme {\n type: 'package';\n name: string;\n specifier: string;\n location: string;\n registry: boolean;\n importPath?: string | string[];\n}\n\nexport type EntrySource = FileEntrySource | UriEntrySource;\n\nexport interface FileEntrySource {\n type: 'file';\n pathname: string;\n contentType: ManuscriptMediaType;\n}\n\nexport interface UriEntrySource {\n type: 'uri';\n href: string;\n rootDir: string;\n}\n\nexport const manuscriptMediaTypes = [\n 'text/markdown',\n 'text/html',\n 'application/xhtml+xml',\n] as const;\nexport type ManuscriptMediaType = (typeof manuscriptMediaTypes)[number];\n\nexport interface ManuscriptEntry {\n contentType: ManuscriptMediaType;\n title?: string;\n themes: ParsedTheme[];\n source: EntrySource;\n template?: undefined;\n target: string;\n rel?: string | string[];\n}\n\nexport interface ContentsEntry {\n rel: 'contents';\n title?: string;\n themes: ParsedTheme[];\n source?: undefined;\n template?: EntrySource;\n target: string;\n tocTitle: string;\n sectionDepth: number;\n transform: {\n transformDocumentList:\n | ((\n nodeList: StructuredDocument[],\n ) => (propsList: { children: any }[]) => any)\n | undefined;\n transformSectionList:\n | ((\n nodeList: StructuredDocumentSection[],\n ) => (propsList: { children: any }[]) => any)\n | undefined;\n };\n pageBreakBefore?: 'left' | 'right' | 'recto' | 'verso';\n pageCounterReset?: number;\n}\n\nexport interface CoverEntry {\n rel: 'cover';\n title?: string;\n themes: ParsedTheme[];\n source?: undefined;\n template?: EntrySource;\n target: string;\n coverImageSrc: string;\n coverImageAlt: string;\n pageBreakBefore?: 'left' | 'right' | 'recto' | 'verso';\n}\n\nexport type ParsedEntry = ManuscriptEntry | ContentsEntry | CoverEntry;\n\nexport interface WebPublicationManifestConfig {\n type: 'webpub';\n manifestPath: string;\n needToGenerateManifest: boolean;\n}\n\nexport interface EpubEntryConfig {\n type: 'epub';\n epubPath: string;\n epubTmpOutputDir: string;\n}\n\nexport interface EpubOpfEntryConfig {\n type: 'epub-opf';\n epubOpfPath: string;\n}\n\nexport interface WebBookEntryConfig {\n type: 'webbook';\n webbookEntryUrl: string;\n webbookPath: string | undefined;\n}\n\nexport type ViewerInputConfig =\n | WebPublicationManifestConfig\n | EpubEntryConfig\n | EpubOpfEntryConfig\n | WebBookEntryConfig;\n\nexport interface PdfOutput {\n format: 'pdf';\n path: string;\n renderMode: 'local' | 'docker';\n preflight: 'press-ready' | 'press-ready-local' | undefined;\n preflightOption: string[];\n}\n\nexport interface WebPublicationOutput {\n format: 'webpub';\n path: string;\n}\n\nexport interface EpubOutput {\n format: 'epub';\n path: string;\n version: '3.0'; // Reserved for future updates\n}\n\nexport type OutputConfig = PdfOutput | WebPublicationOutput | EpubOutput;\n\nexport type PageSize = { format: string } | { width: string; height: string };\n\nexport type DocumentProcessorFactory = (\n options: StringifyMarkdownOptions,\n metadata: Metadata,\n) => Processor;\n\nexport const UseTemporaryServerRoot = Symbol('UseTemporaryServerRoot');\nexport type UseTemporaryServerRoot = typeof UseTemporaryServerRoot;\n\nexport type ResolvedTaskConfig = {\n serverRootDir: string | UseTemporaryServerRoot;\n entryContextDir: string;\n workspaceDir: string;\n themesDir: string;\n entries: ParsedEntry[];\n input: {\n format: InputFormat;\n entry: string;\n };\n viewerInput: ViewerInputConfig;\n outputs: OutputConfig[];\n themeIndexes: Set<ParsedTheme>;\n copyAsset: {\n includes: string[];\n excludes: string[];\n fileExtensions: string[];\n };\n exportAliases: {\n source: string;\n target: string;\n }[];\n temporaryFilePrefix: string;\n size: PageSize | undefined;\n cropMarks: boolean;\n bleed: string | undefined;\n cropOffset: string | undefined;\n css: string | undefined;\n customStyle: string | undefined;\n customUserStyle: string | undefined;\n singleDoc: boolean;\n quick: boolean;\n title: string | undefined;\n author: string | undefined;\n language: string | undefined;\n readingProgression: 'ltr' | 'rtl' | undefined;\n documentProcessorFactory: DocumentProcessorFactory;\n vfmOptions: {\n hardLineBreaks: boolean;\n disableFormatHtml: boolean;\n };\n cover:\n | {\n src: string;\n name: string;\n }\n | undefined;\n timeout: number;\n sandbox: boolean;\n browser: {\n type: BrowserType;\n executablePath: string | undefined;\n };\n proxy:\n | {\n server: string;\n bypass: string | undefined;\n username: string | undefined;\n password: string | undefined;\n }\n | undefined;\n image: string;\n viewer: string | undefined;\n viewerParam: string | undefined;\n logLevel: 'silent' | 'info' | 'verbose' | 'debug';\n ignoreHttpsErrors: boolean;\n base: string;\n server: Required<\n Pick<\n ResolvedViteConfig['server'],\n 'host' | 'port' | 'proxy' | 'allowedHosts'\n >\n >;\n static: Record<string, string[]>;\n rootUrl: string;\n viteConfig: UserConfig | undefined;\n viteConfigFile: string | boolean;\n};\n\nconst DEFAULT_ASSET_EXTENSIONS = [\n 'css',\n 'css.map',\n 'png',\n 'jpg',\n 'jpeg',\n 'svg',\n 'gif',\n 'webp',\n 'apng',\n 'ttf',\n 'otf',\n 'woff',\n 'woff2',\n];\n\nfunction isManuscriptMediaType(\n mediaType: string | false,\n): mediaType is ManuscriptMediaType {\n return !!(\n mediaType && manuscriptMediaTypes.includes(mediaType as ManuscriptMediaType)\n );\n}\n\nexport function isWebPubConfig(\n config: ResolvedTaskConfig,\n): config is ResolvedTaskConfig & {\n viewerInput: WebPublicationManifestConfig;\n} {\n return config.viewerInput.type === 'webpub';\n}\n\nexport function isWebbookConfig(\n config: ResolvedTaskConfig,\n): config is ResolvedTaskConfig & {\n viewerInput: WebBookEntryConfig;\n} {\n return config.viewerInput.type === 'webbook';\n}\n\nexport function parsePackageName(\n specifier: string,\n cwd: string,\n): npa.Result | null {\n try {\n let result = npa(specifier, cwd);\n // #373: Relative path specifiers may be assumed as shorthand of hosted git\n // (ex: foo/bar -> github:foo/bar)\n if (result.type === 'git' && result.saveSpec?.startsWith('github:')) {\n result = npa(`file:${specifier}`, cwd);\n }\n return result;\n } catch (error) {\n return null;\n }\n}\n\n// parse theme locator\nexport function parseTheme({\n theme,\n context,\n workspaceDir,\n themesDir,\n}: {\n theme: string | ThemeConfig;\n context: string;\n workspaceDir: string;\n themesDir: string;\n}): ParsedTheme {\n const { specifier, import: importPath } =\n typeof theme === 'string' ? { specifier: theme, import: undefined } : theme;\n\n // url\n if (isValidUri(specifier)) {\n return {\n type: 'uri',\n name: upath.basename(specifier),\n location: specifier,\n };\n }\n\n // bare .css file\n const stylePath = upath.resolve(context, specifier);\n if (fs.existsSync(stylePath) && stylePath.endsWith('.css')) {\n const sourceRelPath = upath.relative(context, stylePath);\n return {\n type: 'file',\n name: upath.basename(specifier),\n source: stylePath,\n location: upath.resolve(workspaceDir, sourceRelPath),\n };\n }\n\n // node_modules, local pkg\n const parsed = parsePackageName(specifier, context);\n\n if (!parsed) {\n throw new Error(`Invalid package name: ${specifier}`);\n }\n // To security reason, Vivliostyle CLI disallow other than npm registry or local file as download source\n // TODO: Add option that user can allow an unofficial registry explicitly\n if (!parsed.registry && parsed.type !== 'directory') {\n throw new Error(`This package specifier is not allowed: ${specifier}`);\n }\n let name = parsed.name;\n let resolvedSpecifier = specifier;\n if (parsed.type === 'directory' && parsed.fetchSpec) {\n const pkgJsonPath = upath.join(parsed.fetchSpec, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));\n name = packageJson.name;\n resolvedSpecifier = parsed.fetchSpec;\n }\n }\n if (!name) {\n throw new Error(`Could not determine the package name: ${specifier}`);\n }\n return {\n type: 'package',\n name,\n specifier: resolvedSpecifier,\n location: upath.join(themesDir, 'node_modules', name),\n registry: Boolean(parsed.registry),\n importPath,\n };\n}\n\nfunction parsePageSize(size: string): PageSize {\n const [width, height, ...others] = `${size}`.split(',');\n if (!width || others.length) {\n throw new Error(`Cannot parse size: ${size}`);\n } else if (width && height) {\n return {\n width,\n height,\n };\n } else {\n return {\n format: width,\n };\n }\n}\n\nfunction parseFileMetadata({\n contentType,\n sourcePath,\n workspaceDir,\n themesDir,\n}: {\n contentType: ManuscriptMediaType;\n sourcePath: string;\n workspaceDir: string;\n themesDir?: string;\n}): { title?: string; themes?: ParsedTheme[] } {\n const sourceDir = upath.dirname(sourcePath);\n let title: string | undefined;\n let themes: ParsedTheme[] | undefined;\n if (contentType === 'text/markdown') {\n const metadata = readMarkdownMetadata(sourcePath);\n title = metadata.title;\n if (metadata.vfm?.theme && themesDir) {\n themes = [metadata.vfm.theme]\n .flat()\n .filter(\n (entry) =>\n !!entry && (typeof entry === 'string' || typeof entry === 'object'),\n )\n .map((theme) =>\n parseTheme({\n theme,\n context: sourceDir,\n workspaceDir,\n themesDir,\n }),\n );\n }\n } else {\n const content = fs.readFileSync(sourcePath, 'utf8');\n title = content.match(/<title>([^<]*)<\\/title>/)?.[1] || undefined;\n }\n return { title, themes };\n}\n\nexport function parseCustomStyle({\n customStyle,\n entryContextDir,\n}: {\n customStyle: string;\n entryContextDir: string;\n}): string {\n if (isValidUri(customStyle)) {\n return customStyle;\n }\n const stylePath = upath.resolve(entryContextDir, customStyle);\n if (!pathContains(entryContextDir, stylePath)) {\n throw Error(\n `Custom style file ${customStyle} is not in ${entryContextDir}. Make sure the file is located in the context directory or a subdirectory.`,\n );\n }\n if (!fs.existsSync(stylePath)) {\n throw new Error(`Custom style file not found: ${customStyle}`);\n }\n return pathToFileURL(stylePath).href.slice(\n pathToFileURL(entryContextDir).href.replace(/\\/$/, '').length + 1,\n );\n}\n\nexport function resolveTaskConfig(\n config: ParsedBuildTask,\n options: InlineOptions,\n): ResolvedTaskConfig {\n const context = options.cwd ?? defaultCwd;\n Logger.debug('resolveTaskConfig > context %s', context);\n\n const entryContextDir = config.entryContext\n ? upath.resolve(context, config.entryContext)\n : context;\n const language = config.language;\n const readingProgression = config.readingProgression;\n const size = config.size ? parsePageSize(config.size) : undefined;\n const cropMarks = options.cropMarks ?? false;\n const bleed = options.bleed;\n const cropOffset = options.cropOffset;\n const css = options.css;\n const singleDoc = options.singleDoc ?? false;\n const quick = options.quick ?? false;\n const temporaryFilePrefix =\n config.temporaryFilePrefix ?? `.vs-${Date.now()}.`;\n\n const documentProcessorFactory = config?.documentProcessor ?? VFM;\n\n const vfmOptions = {\n ...config?.vfm,\n hardLineBreaks: config?.vfm?.hardLineBreaks ?? false,\n disableFormatHtml: config?.vfm?.disableFormatHtml ?? false,\n };\n\n const timeout = config.timeout ?? 300_000; // 5 minutes\n const sandbox = options.sandbox ?? false;\n const browser = {\n type: config.browser ?? 'chromium',\n executablePath: options.executableBrowser,\n };\n const proxyServer =\n options.proxyServer ?? process.env.HTTP_PROXY ?? undefined;\n const proxy = proxyServer\n ? {\n server: proxyServer,\n bypass: options.proxyBypass ?? process.env.NOPROXY ?? undefined,\n username: options.proxyUser,\n password: options.proxyPass,\n }\n : undefined;\n const image = config.image ?? `${CONTAINER_URL}:${cliVersion}`;\n const viewer = config.viewer ?? undefined;\n const viewerParam = config.viewerParam ?? undefined;\n const logLevel = options.logLevel ?? 'silent';\n const ignoreHttpsErrors = options.ignoreHttpsErrors ?? false;\n const base = config.base ?? '/vivliostyle';\n const staticRoutes = config.static ?? {};\n const viteConfig = config.vite;\n const viteConfigFile = config.viteConfigFile ?? true;\n\n const customStyle =\n (options.style &&\n parseCustomStyle({ customStyle: options.style, entryContextDir })) ||\n undefined;\n const customUserStyle =\n (options.userStyle &&\n parseCustomStyle({ customStyle: options.userStyle, entryContextDir })) ||\n undefined;\n\n const outputs = ((): OutputConfig[] => {\n const defaultPdfOptions: Omit<PdfOutput, 'path'> = {\n format: 'pdf',\n renderMode: options.renderMode ?? 'local',\n preflight:\n options.preflight ?? (config.pressReady ? 'press-ready' : undefined),\n preflightOption: options.preflightOption ?? [],\n };\n if (config.output) {\n return config.output.map((target): OutputConfig => {\n const outputPath = upath.resolve(context, target.path);\n const format = target.format;\n switch (format) {\n case 'pdf':\n return {\n ...defaultPdfOptions,\n ...target,\n format,\n path: outputPath,\n };\n case 'epub':\n return {\n ...target,\n format,\n path: outputPath,\n version: EPUB_OUTPUT_VERSION,\n };\n case 'webpub':\n return {\n ...target,\n format,\n path: outputPath,\n };\n default:\n return format satisfies never;\n }\n });\n }\n // Outputs a pdf file if any output configuration is not set\n const filename = config.title ? `${config.title}.pdf` : 'output.pdf';\n return [\n {\n ...defaultPdfOptions,\n path: upath.resolve(context, filename),\n },\n ];\n })();\n\n const { server, rootUrl } = (() => {\n let host = config.server?.host ?? false;\n let allowedHosts = config.server?.allowedHosts || [];\n const port = config.server?.port ?? 13000;\n if (\n outputs.some(\n (target) => target.format === 'pdf' && target.renderMode === 'docker',\n ) &&\n !isInContainer()\n ) {\n // Docker render mode requires wildcard host to allow access from the container\n host = true;\n if (\n Array.isArray(allowedHosts) &&\n !allowedHosts.includes(CONTAINER_LOCAL_HOSTNAME)\n ) {\n allowedHosts.push(CONTAINER_LOCAL_HOSTNAME);\n }\n }\n const rootHostname = !host ? 'localhost' : host === true ? '0.0.0.0' : host;\n return {\n server: {\n host,\n port,\n proxy: config.server?.proxy ?? {},\n allowedHosts,\n } satisfies ResolvedTaskConfig['server'],\n rootUrl: `http://${rootHostname}:${port}`,\n };\n })();\n\n const cover = config.cover && {\n src: upath.resolve(entryContextDir, config.cover.src),\n name: config.cover.name || COVER_HTML_IMAGE_ALT,\n };\n\n const copyAsset = {\n includes: config.copyAsset?.includes ?? config.includeAssets ?? [],\n excludes: config.copyAsset?.excludes ?? [],\n fileExtensions: [\n ...new Set([\n ...DEFAULT_ASSET_EXTENSIONS,\n ...(config.copyAsset?.includeFileExtensions ?? []),\n ]),\n ].filter(\n (ext) => !(config.copyAsset?.excludeFileExtensions ?? []).includes(ext),\n ),\n };\n\n const themeIndexes = new Set<ParsedTheme>();\n const projectConfig =\n !options.config && options.input\n ? resolveSingleInputConfig({\n config,\n input: options.input!,\n context,\n temporaryFilePrefix,\n themeIndexes,\n base,\n })\n : resolveComposedProjectConfig({\n config,\n context,\n entryContextDir,\n outputs,\n temporaryFilePrefix,\n themeIndexes,\n cover,\n });\n\n // Check overwrites\n for (const output of outputs) {\n const relPath = upath.relative(context, output.path);\n if (\n pathContains(output.path, entryContextDir) ||\n pathEquals(output.path, entryContextDir)\n ) {\n throw new Error(\n `The output path is set to \"${relPath}\", but this will overwrite the original manuscript file. Please specify a different path.`,\n );\n }\n if (\n pathContains(output.path, projectConfig.workspaceDir) ||\n pathEquals(output.path, projectConfig.workspaceDir)\n ) {\n throw new Error(\n `The output path is set to \"${relPath}\", but this will overwrite the working directory of Vivliostyle. Please specify a different path.`,\n );\n }\n }\n const { entries, workspaceDir } = projectConfig;\n const duplicatedTarget = entries.find(\n (v1, i) => entries.findLastIndex((v2) => v1.target === v2.target) !== i,\n )?.target;\n if (duplicatedTarget) {\n const sourceFile = entries.find(\n (entry) =>\n entry.target === duplicatedTarget && entry.source?.type === 'file',\n )?.source as FileEntrySource | undefined;\n throw new Error(\n `The output path \"${upath.relative(workspaceDir, duplicatedTarget)}\" will overwrite existing content.` +\n (sourceFile\n ? ` Please choose a different name for the source file: ${sourceFile.pathname}`\n : ''),\n );\n }\n\n const resolvedConfig = {\n ...projectConfig,\n entryContextDir,\n outputs,\n themeIndexes,\n copyAsset,\n temporaryFilePrefix,\n size,\n cropMarks,\n bleed,\n cropOffset,\n css,\n customStyle,\n customUserStyle,\n singleDoc,\n quick,\n language,\n readingProgression,\n documentProcessorFactory,\n vfmOptions,\n cover,\n timeout,\n sandbox,\n browser,\n proxy,\n image,\n viewer,\n viewerParam,\n logLevel,\n ignoreHttpsErrors,\n base,\n server,\n static: staticRoutes,\n rootUrl,\n viteConfig,\n viteConfigFile,\n } satisfies ResolvedTaskConfig;\n return resolvedConfig;\n}\n\ntype ProjectConfig = Pick<\n ResolvedTaskConfig,\n | 'serverRootDir'\n | 'workspaceDir'\n | 'themesDir'\n | 'entries'\n | 'input'\n | 'viewerInput'\n | 'exportAliases'\n | 'title'\n | 'author'\n>;\n\nfunction resolveSingleInputConfig({\n config,\n input,\n context,\n temporaryFilePrefix,\n themeIndexes,\n base,\n}: Pick<ResolvedTaskConfig, 'temporaryFilePrefix' | 'themeIndexes' | 'base'> & {\n config: ParsedBuildTask;\n input: NonNullable<InlineOptions['input']>;\n context: string;\n}): ProjectConfig {\n Logger.debug('entering single entry config mode');\n\n let serverRootDir: string | UseTemporaryServerRoot;\n let sourcePath: string;\n let workspaceDir: string;\n const inputFormat = input.format;\n const title = config?.title;\n const author = config?.author;\n const entries: ParsedEntry[] = [];\n const exportAliases: { source: string; target: string }[] = [];\n\n let isLocalResource = true;\n if (isValidUri(input.entry)) {\n const url = new URL(input.entry);\n if (url.protocol === 'file:') {\n sourcePath = fileURLToPath(url);\n } else {\n isLocalResource = false;\n sourcePath = input.entry;\n }\n } else {\n sourcePath = upath.resolve(context, input.entry);\n }\n if (isLocalResource) {\n // Check file exists\n statFileSync(sourcePath);\n switch (input.format) {\n case 'webbook':\n case 'markdown':\n case 'pub-manifest':\n case 'epub':\n workspaceDir = upath.dirname(sourcePath);\n break;\n case 'epub-opf': {\n const rootDir = getEpubRootDir(sourcePath);\n if (!rootDir) {\n throw new Error(\n `Could not determine the EPUB root directory for the OPF file: ${sourcePath}`,\n );\n }\n workspaceDir = rootDir;\n break;\n }\n default:\n return input.format satisfies never;\n }\n serverRootDir = workspaceDir;\n } else {\n serverRootDir = UseTemporaryServerRoot;\n workspaceDir = context;\n }\n const themesDir = upath.resolve(workspaceDir, 'themes');\n\n if (input.format === 'markdown') {\n // Single input file; create temporary file\n const contentType = 'text/markdown';\n const metadata = parseFileMetadata({\n contentType,\n sourcePath,\n workspaceDir,\n });\n const target = upath\n .resolve(\n workspaceDir,\n `${temporaryFilePrefix}${upath.basename(sourcePath)}`,\n )\n .replace(/\\.md$/, '.html');\n touchTmpFile(target);\n const themes =\n metadata.themes ??\n config.theme?.map((theme) =>\n parseTheme({\n theme,\n context,\n workspaceDir,\n themesDir,\n }),\n ) ??\n [];\n themes.forEach((t) => themeIndexes.add(t));\n entries.push({\n contentType,\n source: {\n type: 'file',\n pathname: sourcePath,\n contentType,\n },\n target,\n title: metadata.title,\n themes,\n });\n exportAliases.push({\n source: target,\n target: upath.resolve(\n upath.dirname(target),\n upath.basename(sourcePath).replace(/\\.md$/, '.html'),\n ),\n });\n }\n\n let fallbackTitle: string | undefined;\n let viewerInput: ViewerInputConfig;\n\n if (inputFormat === 'markdown') {\n // create temporary manifest file\n const manifestPath = upath.resolve(\n workspaceDir,\n `${temporaryFilePrefix}${MANIFEST_FILENAME}`,\n );\n touchTmpFile(manifestPath);\n exportAliases.push({\n source: manifestPath,\n target: upath.resolve(workspaceDir, MANIFEST_FILENAME),\n });\n fallbackTitle =\n entries.length === 1 && entries[0].title\n ? (entries[0].title as string)\n : upath.basename(sourcePath);\n viewerInput = {\n type: 'webpub',\n manifestPath,\n needToGenerateManifest: true,\n };\n } else if (inputFormat === 'webbook') {\n let webbookEntryUrl: string;\n let webbookPath: string | undefined;\n if (isValidUri(sourcePath)) {\n const url = new URL(sourcePath);\n webbookEntryUrl = url.href;\n } else {\n const rootFileUrl = pathToFileURL(workspaceDir).href;\n const urlPath = pathToFileURL(sourcePath).href.slice(rootFileUrl.length);\n webbookEntryUrl = `${base}${urlPath}`;\n webbookPath = sourcePath;\n }\n viewerInput = { type: 'webbook', webbookEntryUrl, webbookPath };\n } else if (inputFormat === 'pub-manifest') {\n viewerInput = {\n type: 'webpub',\n manifestPath: sourcePath,\n needToGenerateManifest: false,\n };\n } else if (inputFormat === 'epub-opf') {\n viewerInput = { type: 'epub-opf', epubOpfPath: sourcePath };\n } else if (inputFormat === 'epub') {\n viewerInput = {\n type: 'epub',\n epubPath: sourcePath,\n epubTmpOutputDir: upath.join(\n sourcePath,\n `../${temporaryFilePrefix}${upath.basename(sourcePath)}`,\n ),\n };\n } else {\n return inputFormat satisfies never;\n }\n\n return {\n serverRootDir,\n workspaceDir,\n themesDir,\n entries,\n input: {\n format: inputFormat,\n entry: sourcePath,\n },\n viewerInput,\n exportAliases,\n title: title || fallbackTitle,\n author,\n };\n}\n\nfunction resolveComposedProjectConfig({\n config,\n context,\n entryContextDir,\n outputs,\n temporaryFilePrefix,\n themeIndexes,\n cover,\n}: Pick<\n ResolvedTaskConfig,\n | 'entryContextDir'\n | 'outputs'\n | 'temporaryFilePrefix'\n | 'themeIndexes'\n | 'cover'\n> & { config: ParsedBuildTask; context: string }): ProjectConfig {\n Logger.debug('entering composed project config mode');\n\n const workspaceDir = upath.resolve(\n context,\n config.workspaceDir ?? '.vivliostyle',\n );\n const themesDir = upath.resolve(workspaceDir, 'themes');\n const pkgJsonPath = upath.resolve(context, 'package.json');\n const pkgJson = fs.existsSync(pkgJsonPath)\n ? readJSON(pkgJsonPath)\n : undefined;\n if (pkgJson) {\n Logger.debug('located package.json path', pkgJsonPath);\n }\n const exportAliases: { source: string; target: string }[] = [];\n\n const rootThemes =\n config.theme?.map((theme) =>\n parseTheme({\n theme,\n context,\n workspaceDir,\n themesDir,\n }),\n ) ?? [];\n rootThemes.forEach((t) => themeIndexes.add(t));\n const tocConfig = {\n tocTitle: config.toc?.title ?? config?.tocTitle ?? TOC_TITLE,\n target: upath.resolve(workspaceDir, config.toc?.htmlPath ?? TOC_FILENAME),\n sectionDepth: config.toc?.sectionDepth ?? 0,\n transform: {\n transformDocumentList: config.toc?.transformDocumentList,\n transformSectionList: config.toc?.transformSectionList,\n },\n };\n const coverHtml =\n config.cover &&\n ('htmlPath' in config.cover && !config.cover.htmlPath\n ? undefined\n : upath.resolve(\n workspaceDir,\n config.cover?.htmlPath || COVER_HTML_FILENAME,\n ));\n\n const ensureCoverImage = (src?: string) => {\n const absPath = src && upath.resolve(entryContextDir, src);\n if (absPath) {\n statFileSync(absPath, {\n errorMessage: 'Specified cover image does not exist',\n });\n }\n return absPath;\n };\n\n const projectTitle: string | undefined = config?.title ?? pkgJson?.name;\n const projectAuthor: string | undefined = config?.author ?? pkgJson?.author;\n\n const isContentsEntry = (entry: EntryConfig): entry is ContentsEntryConfig =>\n entry.rel === 'contents';\n const isCoverEntry = (entry: EntryConfig): entry is CoverEntryConfig =>\n entry.rel === 'cover';\n const isArticleEntry = (entry: EntryConfig): entry is ArticleEntryConfig =>\n !isContentsEntry(entry) && !isCoverEntry(entry);\n\n function parseEntry(entry: EntryConfig): ParsedEntry {\n const getInputInfo = (\n entryPath: string,\n ):\n | (FileEntrySource & { metadata: ReturnType<typeof parseFileMetadata> })\n | (UriEntrySource & { metadata?: undefined }) => {\n if (/^https?:/.test(entryPath)) {\n return {\n type: 'uri',\n href: entryPath,\n rootDir: upath.join(workspaceDir, new URL(entryPath).host),\n };\n } else if (entryPath.startsWith('/')) {\n return {\n type: 'uri',\n href: entryPath,\n rootDir: upath.join(workspaceDir, 'localhost'),\n };\n }\n const pathname = upath.resolve(entryContextDir, entryPath);\n statFileSync(pathname);\n const contentType = mime(pathname);\n if (!isManuscriptMediaType(contentType)) {\n throw new Error(\n `Invalid manuscript type ${contentType} detected: ${entry}`,\n );\n }\n\n return {\n type: 'file',\n pathname,\n contentType,\n metadata: parseFileMetadata({\n contentType,\n sourcePath: pathname,\n workspaceDir,\n themesDir,\n }),\n };\n };\n\n const getTargetPath = (source: EntrySource) => {\n switch (source.type) {\n case 'file':\n return upath.resolve(\n workspaceDir,\n upath\n .relative(entryContextDir, source.pathname)\n .replace(/\\.md$/, '.html'),\n );\n case 'uri': {\n const url = new URL(source.href, 'a://dummy');\n let pathname = url.pathname;\n if (!/\\.\\w+$/.test(pathname)) {\n pathname = `${pathname.replace(/\\/$/, '')}/index.html`;\n }\n return upath.join(source.rootDir, pathname);\n }\n default:\n return source satisfies never;\n }\n };\n\n if ((isContentsEntry(entry) || isCoverEntry(entry)) && entry.path) {\n const source = upath.resolve(entryContextDir, entry.path);\n try {\n statFileSync(source);\n /* v8 ignore next 10 */\n } catch (error) {\n // For backward compatibility, we allow missing files then assume that option as `output` field.\n Logger.logWarn(\n `The \"path\" option is set but the file does not exist: ${source}\\nMaybe you want to set the \"output\" field instead.`,\n );\n entry.output = entry.path;\n entry.path = undefined;\n }\n }\n\n if (isContentsEntry(entry)) {\n const inputInfo = entry.path ? getInputInfo(entry.path) : undefined;\n const { metadata, ...template } = inputInfo || {};\n let target = entry.output\n ? upath.resolve(workspaceDir, entry.output)\n : inputInfo && getTargetPath(inputInfo);\n const themes = entry.theme\n ? [entry.theme].flat().map((theme) =>\n parseTheme({\n theme,\n context,\n workspaceDir,\n themesDir,\n }),\n )\n : (metadata?.themes ?? [...rootThemes]);\n themes.forEach((t) => themeIndexes.add(t));\n target ??= tocConfig.target;\n if (\n inputInfo?.type === 'file' &&\n pathEquals(inputInfo.pathname, target)\n ) {\n const tmpPath = upath.resolve(\n upath.dirname(target),\n `${temporaryFilePrefix}${upath.basename(target)}`,\n );\n exportAliases.push({ source: tmpPath, target });\n touchTmpFile(tmpPath);\n target = tmpPath;\n }\n const parsedEntry: ContentsEntry = {\n rel: 'contents',\n ...tocConfig,\n target,\n title: entry.title ?? metadata?.title ?? projectTitle,\n themes,\n pageBreakBefore: entry.pageBreakBefore,\n pageCounterReset: entry.pageCounterReset,\n ...('type' in template && { template }),\n };\n return parsedEntry;\n }\n\n if (isCoverEntry(entry)) {\n const inputInfo = entry.path ? getInputInfo(entry.path) : undefined;\n const { metadata, ...template } = inputInfo || {};\n let target = entry.output\n ? upath.resolve(workspaceDir, entry.output)\n : inputInfo && getTargetPath(inputInfo);\n const themes = entry.theme\n ? [entry.theme].flat().map((theme) =>\n parseTheme({\n theme,\n context,\n workspaceDir,\n themesDir,\n }),\n )\n : (metadata?.themes ?? []); // Don't inherit rootThemes for cover documents\n themes.forEach((t) => themeIndexes.add(t));\n const coverImageSrc = ensureCoverImage(entry.imageSrc || cover?.src);\n if (!coverImageSrc) {\n throw new Error(\n `A CoverEntryConfig is set in the entry list but a location of cover file is not set. Please set 'cover' property in your config file.`,\n );\n }\n target ??= upath.resolve(\n workspaceDir,\n entry.path || coverHtml || COVER_HTML_FILENAME,\n );\n if (\n inputInfo?.type === 'file' &&\n pathEquals(inputInfo.pathname, target)\n ) {\n const tmpPath = upath.resolve(\n upath.dirname(target),\n `${temporaryFilePrefix}${upath.basename(target)}`,\n );\n exportAliases.push({ source: tmpPath, target });\n touchTmpFile(tmpPath);\n target = tmpPath;\n }\n const parsedEntry: CoverEntry = {\n rel: 'cover',\n target,\n title: entry.title ?? metadata?.title ?? projectTitle,\n themes,\n coverImageSrc,\n coverImageAlt: entry.imageAlt || cover?.name || COVER_HTML_IMAGE_ALT,\n pageBreakBefore: entry.pageBreakBefore,\n ...('type' in template && { template }),\n };\n return parsedEntry;\n }\n\n if (isArticleEntry(entry)) {\n const inputInfo = getInputInfo(entry.path);\n const { metadata, ...source } = inputInfo;\n const target = entry.output\n ? upath.resolve(workspaceDir, entry.output)\n : getTargetPath(inputInfo);\n const themes = entry.theme\n ? [entry.theme]\n .flat()\n .map((theme) =>\n parseTheme({ theme, context, workspaceDir, themesDir }),\n )\n : (metadata?.themes ?? [...rootThemes]);\n themes.forEach((t) => themeIndexes.add(t));\n\n const parsedEntry: ManuscriptEntry = {\n contentType:\n inputInfo.type === 'file' ? inputInfo.contentType : 'text/html',\n source,\n target,\n title: entry.title ?? metadata?.title ?? projectTitle,\n themes,\n ...(entry.rel && { rel: entry.rel }),\n };\n return parsedEntry;\n }\n\n /* v8 ignore next */\n return entry satisfies never;\n }\n\n const entries = config.entry.map(parseEntry);\n\n let fallbackProjectTitle: string | undefined;\n if (!projectTitle) {\n if (entries.length === 1 && entries[0].title) {\n fallbackProjectTitle = entries[0].title;\n } else {\n fallbackProjectTitle = upath.basename(outputs[0].path);\n }\n }\n if (!!config?.toc && !entries.find(({ rel }) => rel === 'contents')) {\n entries.unshift({\n rel: 'contents',\n ...tocConfig,\n themes: [...rootThemes],\n });\n }\n if (cover && coverHtml && !entries.find(({ rel }) => rel === 'cover')) {\n entries.unshift({\n rel: 'cover',\n target: coverHtml,\n title: projectTitle,\n themes: [], // Don't inherit rootThemes for cover documents\n coverImageSrc: ensureCoverImage(cover.src)!,\n coverImageAlt: cover.name,\n });\n }\n\n return {\n serverRootDir: context,\n workspaceDir,\n themesDir,\n entries,\n input: {\n format: 'pub-manifest',\n entry: upath.join(workspaceDir, MANIFEST_FILENAME),\n },\n viewerInput: {\n type: 'webpub',\n manifestPath: upath.join(workspaceDir, MANIFEST_FILENAME),\n needToGenerateManifest: true,\n },\n exportAliases,\n title: projectTitle || fallbackProjectTitle,\n author: projectAuthor,\n };\n}\n","import {\n Metadata,\n readMetadata,\n StringifyMarkdownOptions,\n} from '@vivliostyle/vfm';\nimport fs from 'node:fs';\nimport vfile, { VFile } from 'vfile';\nimport { DocumentProcessorFactory } from '../config/resolve.js';\n\nexport interface VSFile extends VFile {\n data: {\n title?: string;\n theme?: string;\n };\n}\n\nfunction safeReadMetadata(content: string): Metadata {\n // The input assumes VFM format, but errors during metadata extraction\n // should be suppressed to allow processing of non-VFM files as well.\n try {\n return readMetadata(content);\n } catch {\n return {};\n }\n}\n\nexport async function processMarkdown(\n documentProcessorFactory: DocumentProcessorFactory,\n filepath: string,\n options: StringifyMarkdownOptions = {},\n): Promise<VSFile> {\n const markdownString = fs.readFileSync(filepath, 'utf8');\n const processor = documentProcessorFactory(\n options,\n safeReadMetadata(markdownString),\n );\n const processed = (await processor.process(\n vfile({ path: filepath, contents: markdownString }),\n )) as VSFile;\n return processed;\n}\n\nexport function readMarkdownMetadata(filepath: string): Metadata {\n return safeReadMetadata(fs.readFileSync(filepath, 'utf8'));\n}\n","import fs from 'node:fs';\nimport type { Browser, Page } from 'playwright-core';\nimport { ResolvedTaskConfig } from './config/resolve.js';\nimport type { BrowserType } from './config/schema.js';\nimport { Logger } from './logger.js';\nimport { importNodeModule } from './node-modules.js';\nimport { isInContainer, isRunningOnWSL, registerExitHandler } from './util.js';\n\nasync function launchBrowser({\n browserType,\n proxy,\n executablePath,\n headless,\n noSandbox,\n disableDevShmUsage,\n}: {\n browserType: BrowserType;\n proxy:\n | {\n server: string;\n bypass: string | undefined;\n username: string | undefined;\n password: string | undefined;\n }\n | undefined;\n executablePath: string;\n headless: boolean;\n noSandbox?: boolean;\n disableDevShmUsage?: boolean;\n}): Promise<Browser> {\n const playwright = await importNodeModule('playwright-core');\n playwright.firefox.executablePath;\n const options =\n browserType === 'chromium'\n ? {\n executablePath,\n chromiumSandbox: !noSandbox,\n headless,\n args: [\n // #579: disable web security to allow cross-origin requests\n '--disable-web-security',\n ...(disableDevShmUsage ? ['--disable-dev-shm-usage'] : []),\n // #357: Set devicePixelRatio=1 otherwise it causes layout issues in HiDPI displays\n ...(headless ? ['--force-device-scale-factor=1'] : []),\n // #565: Add --disable-gpu option when running on WSL\n ...(isRunningOnWSL() ? ['--disable-gpu'] : []),\n // set Chromium language to English to avoid locale-dependent issues\n '--lang=en',\n ...(!headless && process.platform === 'darwin'\n ? ['', '-AppleLanguages', '(en)'] // Fix for issue #570\n : []),\n ],\n env: { ...process.env, LANG: 'en.UTF-8' },\n proxy: proxy,\n }\n : // TODO: Investigate appropriate settings on Firefox & Webkit\n { executablePath, headless };\n const browser = await playwright[browserType].launch(options);\n registerExitHandler('Closing browser', () => {\n browser.close();\n });\n return browser;\n}\n\nexport async function getExecutableBrowserPath(\n browserType: BrowserType,\n): Promise<string> {\n const playwright = await importNodeModule('playwright-core');\n return playwright[browserType].executablePath();\n}\n\nexport function getFullBrowserName(browserType: BrowserType): string {\n return {\n chromium: 'Chromium',\n firefox: 'Firefox',\n webkit: 'Webkit',\n }[browserType];\n}\n\nexport function checkBrowserAvailability(path: string): boolean {\n return fs.existsSync(path);\n}\n\nexport async function downloadBrowser(\n browserType: BrowserType,\n): Promise<string> {\n const { registry } = await importNodeModule('playwright-core/lib/server');\n const executable = registry.findExecutable(browserType);\n {\n using _ = Logger.suspendLogging(\n 'Rendering browser is not installed yet. Downloading now.',\n );\n await registry.install([executable], false);\n }\n return executable.executablePath()!;\n}\n\nexport async function launchPreview({\n mode,\n url,\n onBrowserOpen,\n onPageOpen,\n config: { browser: browserConfig, proxy, sandbox, ignoreHttpsErrors },\n}: {\n mode: 'preview' | 'build';\n url: string;\n onBrowserOpen?: (browser: Browser) => void | Promise<void>;\n onPageOpen?: (page: Page) => void | Promise<void>;\n config: Pick<\n ResolvedTaskConfig,\n 'browser' | 'proxy' | 'sandbox' | 'ignoreHttpsErrors'\n >;\n}) {\n let executableBrowser = browserConfig.executablePath;\n if (executableBrowser) {\n if (!checkBrowserAvailability(executableBrowser)) {\n throw new Error(\n `Cannot find the browser. Please check the executable browser path: ${executableBrowser}`,\n );\n }\n } else {\n executableBrowser = await getExecutableBrowserPath(browserConfig.type);\n if (!checkBrowserAvailability(executableBrowser)) {\n // The browser isn't downloaded first time starting CLI so try to download it\n await downloadBrowser(browserConfig.type);\n }\n }\n Logger.debug(`Executing browser path: ${executableBrowser}`);\n\n const browser = await launchBrowser({\n browserType: browserConfig.type,\n proxy,\n executablePath: executableBrowser,\n headless: mode === 'build',\n noSandbox: !sandbox,\n disableDevShmUsage: isInContainer(),\n });\n await onBrowserOpen?.(browser);\n\n const page = await browser.newPage({\n viewport:\n mode === 'build'\n ? // This viewport size important to detect headless environment in Vivliostyle viewer\n // https://github.com/vivliostyle/vivliostyle.js/blob/73bcf323adcad80126b0175630609451ccd09d8a/packages/core/src/vivliostyle/vgen.ts#L2489-L2500\n {\n width: 800,\n height: 600,\n }\n : null,\n ignoreHTTPSErrors: ignoreHttpsErrors,\n });\n await onPageOpen?.(page);\n\n // Prevent confirm dialog from being auto-dismissed\n page.on('dialog', () => {});\n\n await page.goto(url);\n\n return { browser, page };\n}\n","import fs from 'node:fs';\nimport { URL } from 'node:url';\nimport upath from 'upath';\nimport {\n createServer,\n InlineConfig,\n preview,\n PreviewServer,\n ResolvedConfig as ResolvedViteConfig,\n ViteDevServer,\n} from 'vite';\nimport { ResolvedTaskConfig } from './config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from './config/schema.js';\nimport { EMPTY_DATA_URI, VIEWER_ROOT_PATH } from './const.js';\nimport { Logger } from './logger.js';\nimport {\n getDefaultEpubOpfPath,\n isValidUri,\n openEpub,\n registerExitHandler,\n} from './util.js';\nimport { vsBrowserPlugin } from './vite/vite-plugin-browser.js';\nimport { vsDevServerPlugin } from './vite/vite-plugin-dev-server.js';\nimport { vsStaticServePlugin } from './vite/vite-plugin-static-serve.js';\nimport { vsViewerPlugin } from './vite/vite-plugin-viewer.js';\n\nexport type ViewerUrlOption = Pick<\n ResolvedTaskConfig,\n | 'size'\n | 'cropMarks'\n | 'bleed'\n | 'cropOffset'\n | 'css'\n | 'customStyle'\n | 'customUserStyle'\n | 'singleDoc'\n | 'quick'\n | 'viewerParam'\n | 'base'\n>;\n\nexport function getViewerParams(\n src: string | undefined,\n {\n size,\n cropMarks,\n bleed,\n cropOffset,\n css,\n customStyle,\n customUserStyle,\n singleDoc,\n quick,\n viewerParam,\n base,\n }: ViewerUrlOption,\n): string {\n const pageSizeValue =\n size && ('format' in size ? size.format : `${size.width} ${size.height}`);\n\n function escapeParam(url: string) {\n return url.replace(/&/g, '%26');\n }\n\n let viewerParams = src ? `src=${escapeParam(src)}` : '';\n viewerParams += `&bookMode=${!singleDoc}&renderAllPages=${!quick}`;\n\n if (customStyle) {\n const param = isValidUri(customStyle)\n ? customStyle\n : upath.posix.join(base, customStyle);\n viewerParams += `&style=${escapeParam(param)}`;\n }\n\n if (customUserStyle) {\n const param = isValidUri(customUserStyle)\n ? customUserStyle\n : upath.posix.join(base, customUserStyle);\n viewerParams += `&userStyle=${escapeParam(param)}`;\n }\n\n if (pageSizeValue || cropMarks || bleed || cropOffset || css) {\n let pageStyle = '@page{';\n if (pageSizeValue) {\n pageStyle += `size:${pageSizeValue};`;\n }\n if (cropMarks) {\n pageStyle += `marks:crop cross;`;\n }\n if (bleed || cropMarks) {\n pageStyle += `bleed:${bleed ?? '3mm'};`;\n }\n if (cropOffset) {\n pageStyle += `crop-offset:${cropOffset};`;\n }\n pageStyle += '}';\n\n // The pageStyle settings are put between the `/*<viewer>*/` and `/*</viewer>*/`\n // in the `&style=data:,…` viewer parameter so that they are reflected in the\n // Settings menu of the Viewer. Also the custom CSS code is appended after the\n // `/*</viewer>*/` so that it is shown in the Edit CSS box in the Settings menu.\n viewerParams += `&style=data:,/*<viewer>*/${encodeURIComponent(\n pageStyle,\n )}/*</viewer>*/${encodeURIComponent(css ?? '')}`;\n }\n\n if (viewerParam) {\n // append additional viewer parameters\n viewerParams += `&${viewerParam}`;\n }\n\n return viewerParams;\n}\n\nexport async function getSourceUrl({\n viewerInput,\n base,\n workspaceDir,\n rootUrl,\n}: Pick<\n ResolvedTaskConfig,\n 'viewerInput' | 'base' | 'workspaceDir' | 'rootUrl'\n>) {\n let input: string;\n switch (viewerInput.type) {\n case 'webpub':\n input = viewerInput.manifestPath;\n break;\n case 'webbook':\n input = viewerInput.webbookEntryUrl;\n break;\n case 'epub-opf':\n input = viewerInput.epubOpfPath;\n break;\n case 'epub': {\n if (!fs.existsSync(viewerInput.epubTmpOutputDir)) {\n await openEpub(viewerInput.epubPath, viewerInput.epubTmpOutputDir);\n }\n input = getDefaultEpubOpfPath(viewerInput.epubTmpOutputDir);\n break;\n }\n default:\n input = viewerInput satisfies never;\n }\n return (\n isValidUri(input)\n ? new URL(input)\n : new URL(\n upath.posix.join(base, upath.relative(workspaceDir, input)),\n rootUrl,\n )\n ).href;\n}\n\nexport async function getViewerFullUrl({\n viewerInput,\n base,\n workspaceDir,\n rootUrl,\n viewer,\n ...config\n}: ViewerUrlOption &\n Pick<\n ResolvedTaskConfig,\n 'viewerInput' | 'base' | 'workspaceDir' | 'rootUrl' | 'viewer'\n >) {\n const viewerUrl = viewer\n ? new URL(viewer)\n : new URL(`${VIEWER_ROOT_PATH}/index.html`, rootUrl);\n const sourceUrl = await getSourceUrl({\n viewerInput,\n base,\n workspaceDir,\n rootUrl,\n });\n const viewerParams = getViewerParams(\n sourceUrl === EMPTY_DATA_URI\n ? undefined // open Viewer start page\n : sourceUrl,\n { base, ...config },\n );\n viewerUrl.hash = '';\n return `${viewerUrl.href}#${viewerParams}`;\n}\n\nexport async function createViteServer(args: {\n config: ResolvedTaskConfig;\n viteConfig: ResolvedViteConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n mode: 'preview';\n}): Promise<ViteDevServer>;\nexport async function createViteServer(args: {\n config: ResolvedTaskConfig;\n viteConfig: ResolvedViteConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n mode: 'build';\n}): Promise<PreviewServer>;\nexport async function createViteServer({\n config,\n viteConfig,\n inlineConfig,\n mode,\n}: {\n config: ResolvedTaskConfig;\n viteConfig: ResolvedViteConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n mode: 'preview' | 'build';\n}) {\n const viteInlineConfig = {\n clearScreen: false,\n configFile: false,\n appType: 'custom',\n plugins: [\n vsDevServerPlugin({ config, inlineConfig }),\n vsViewerPlugin({ config, inlineConfig }),\n vsBrowserPlugin({ config, inlineConfig }),\n vsStaticServePlugin({ config, inlineConfig }),\n ],\n server: viteConfig.server,\n preview: viteConfig.preview,\n customLogger: viteConfig.customLogger,\n cacheDir: viteConfig.cacheDir,\n root: viteConfig.root,\n } satisfies InlineConfig;\n Logger.debug('createViteServer > viteInlineConfig %O', viteInlineConfig);\n\n if (config.serverRootDir === config.workspaceDir) {\n const { cacheDir } = viteInlineConfig;\n registerExitHandler('Removing the Vite cacheDir', () => {\n if (fs.existsSync(cacheDir)) {\n fs.rmSync(cacheDir, { recursive: true });\n }\n });\n }\n\n if (mode === 'preview') {\n return await createServer(viteInlineConfig);\n } else {\n return await preview(viteInlineConfig);\n }\n}\n","import { NextHandleFunction } from 'connect';\nimport escapeRe from 'escape-string-regexp';\nimport { pathToFileURL } from 'node:url';\nimport sirv, { RequestHandler } from 'sirv';\nimport upath from 'upath';\nimport * as vite from 'vite';\nimport { locateVivliostyleConfig } from '../config/load.js';\nimport {\n isWebPubConfig,\n ParsedEntry,\n ParsedTheme,\n ResolvedTaskConfig,\n} from '../config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from '../config/schema.js';\nimport { Logger } from '../logger.js';\nimport {\n getAssetMatcher,\n getWebPubResourceMatcher,\n GlobMatcher,\n} from '../processor/asset.js';\nimport {\n generateManifest,\n prepareThemeDirectory,\n transformManuscript,\n} from '../processor/compile.js';\nimport {\n debounce,\n getFormattedError,\n pathContains,\n pathEquals,\n} from '../util.js';\nimport { reloadConfig } from './plugin-util.js';\n\n// Ref: https://github.com/lukeed/sirv\nfunction createEntriesRouteLookup(entries: ParsedEntry[], cwd: string) {\n const extns = ['', 'html', 'htm'];\n const toAssume = (uri: string) => {\n let i = 0,\n x,\n len = uri.length - 1;\n if (uri.charCodeAt(len) === 47) {\n uri = uri.substring(0, len);\n }\n let arr = [],\n tmp = `${uri}/index`;\n for (; i < extns.length; i++) {\n x = extns[i] ? `.${extns[i]}` : '';\n if (uri) arr.push(uri + x);\n arr.push(tmp + x);\n }\n\n return arr;\n };\n const cache = entries.reduce<Record<string, ParsedEntry>>((acc, e) => {\n acc[`/${upath.relative(cwd, e.target).normalize().replace(/\\\\+/g, '/')}`] =\n e;\n return acc;\n }, {});\n return (uri: string) => {\n let i = 0,\n data,\n arr = toAssume(uri);\n for (; i < arr.length; i++) {\n if ((data = cache[arr[i]])) return [data, arr[i]] as const;\n }\n };\n}\n\nfunction getWorkspaceMatcher({\n workspaceDir,\n themesDir,\n viewerInput,\n themeIndexes,\n entries,\n outputs,\n copyAsset,\n}: ResolvedTaskConfig) {\n if (viewerInput.type === 'webpub') {\n return getWebPubResourceMatcher({\n outputs,\n themesDir,\n entries,\n cwd: workspaceDir,\n manifestPath: viewerInput.manifestPath,\n copyAsset,\n });\n }\n\n let entryFiles: string[] = [];\n switch (viewerInput.type) {\n case 'epub':\n entryFiles = [\n upath.join(\n upath.relative(workspaceDir, viewerInput.epubTmpOutputDir),\n '**',\n ),\n ];\n break;\n case 'epub-opf':\n case 'webbook':\n entryFiles = ['**'];\n break;\n default:\n entryFiles = viewerInput satisfies never;\n }\n\n return new GlobMatcher([\n {\n patterns: entryFiles,\n ignore: ['node_modules/**'],\n dot: true,\n cwd: workspaceDir,\n },\n ]);\n}\n\nexport function vsDevServerPlugin({\n config: _config,\n inlineConfig,\n}: {\n config: ResolvedTaskConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n}): vite.Plugin {\n let config = _config;\n let server: vite.ViteDevServer | undefined;\n let program:\n | {\n entriesLookup: (\n uri: string,\n ) => readonly [ParsedEntry, string] | undefined;\n urlMatchRe: RegExp;\n serveWorkspace: RequestHandler;\n serveWorkspaceMatcher: GlobMatcher;\n serveAssets: RequestHandler;\n serveAssetsMatcher: GlobMatcher;\n }\n | undefined;\n\n const transformCache: Map<\n string,\n Promise<{ content: string; etag: string } | undefined>\n > = new Map();\n let matchProjectDep: (pathname: string) => boolean;\n\n async function reload(forceUpdate = false) {\n const prevConfig = config;\n config = await reloadConfig(prevConfig, inlineConfig, server?.config);\n\n transformCache.clear();\n const needToUpdateManifest =\n forceUpdate ||\n // FIXME: More precise comparison\n JSON.stringify(prevConfig) !== JSON.stringify(config);\n if (\n isWebPubConfig(config) &&\n config.viewerInput.needToGenerateManifest &&\n needToUpdateManifest\n ) {\n await generateManifest(config);\n }\n\n await prepareThemeDirectory(config);\n\n const entriesLookup = createEntriesRouteLookup(\n config.entries,\n config.workspaceDir,\n );\n const urlMatchRe = new RegExp(\n `^${escapeRe(config.base)}(/[^?#]*)([?#].*)?$`,\n );\n const serveWorkspace = sirv(config.workspaceDir, {\n dev: true,\n etag: false,\n dotfiles: true,\n extensions: [],\n });\n const serveWorkspaceMatcher = getWorkspaceMatcher(config);\n const serveAssets = sirv(config.entryContextDir, {\n dev: true,\n etag: false,\n extensions: [],\n });\n const serveAssetsMatcher = getAssetMatcher({\n ...config,\n cwd: config.entryContextDir,\n });\n program = {\n entriesLookup,\n urlMatchRe,\n serveWorkspace,\n serveWorkspaceMatcher,\n serveAssets,\n serveAssetsMatcher,\n };\n if (needToUpdateManifest) {\n Logger.debug(\n 'dev-server > serveWorkspaceMatcher %O',\n serveWorkspaceMatcher.matcherConfig,\n );\n Logger.debug(\n 'dev-server > serveAssetsMatcher %O',\n serveAssetsMatcher.matcherConfig,\n );\n }\n\n const configPath = locateVivliostyleConfig(inlineConfig);\n const projectDeps: string[] = [];\n if (configPath) {\n projectDeps.push(configPath);\n server?.watcher.add(configPath);\n }\n if (config.viewerInput.type === 'webpub') {\n projectDeps.push(config.viewerInput.manifestPath);\n server?.watcher.add(config.viewerInput.manifestPath);\n }\n\n const flattenWatchTarget = (themes: Set<ParsedTheme>) =>\n [...themes].flatMap((theme) => {\n if (theme.type === 'file') {\n return [theme.source];\n }\n if (theme.type === 'package' && !theme.registry) {\n return [theme.specifier];\n }\n return [];\n });\n const prevThemeFiles = flattenWatchTarget(prevConfig.themeIndexes);\n const themeFiles = flattenWatchTarget(config.themeIndexes);\n server?.watcher.unwatch(\n prevThemeFiles.filter((target) => !themeFiles.includes(target)),\n );\n server?.watcher.add(themeFiles);\n projectDeps.push(...themeFiles);\n matchProjectDep = (pathname: string) =>\n projectDeps.some(\n (dep) => pathEquals(dep, pathname) || pathContains(dep, pathname),\n );\n }\n\n async function transform(entry: ParsedEntry, host: string | undefined) {\n if (!isWebPubConfig(config)) {\n return;\n }\n // Respect the host header instead of the original rootUrl configuration,\n // as the dev server may run on a different port through a server other than Vite.\n const rootUrl = host\n ? `${server?.config.server.https ? 'https' : 'http'}://${host}`\n : config.rootUrl;\n const promise = (async () => {\n try {\n const html = await transformManuscript(entry, { ...config, rootUrl });\n if (!html) {\n transformCache.delete(entry.target);\n return;\n }\n const etag = `W/\"${Date.now()}\"`;\n if (entry.source?.type === 'file') {\n server?.watcher.add(entry.source.pathname);\n }\n return { content: html, etag };\n } catch (error: any) {\n server?.config.logger.error(getFormattedError(error));\n transformCache.delete(entry.target);\n return;\n }\n })();\n transformCache.set(entry.target, promise);\n return await promise;\n }\n\n async function transformAll(host: string | undefined) {\n const tocEntries: ParsedEntry[] = [];\n for (const entry of config.entries) {\n if (entry.rel === 'contents') {\n // To transpile the table of contents, all dependent content must be transpiled in advance\n tocEntries.push(entry);\n continue;\n }\n await transform(entry, host);\n }\n for (const entry of tocEntries) {\n await transform(entry, host);\n }\n }\n\n async function invalidate(entry: ParsedEntry) {\n const cwd = pathToFileURL(config.workspaceDir);\n const target = pathToFileURL(entry.target);\n if (target.href.indexOf(cwd.href) !== 0) {\n return;\n }\n transformCache.delete(entry.target);\n config.entries\n .filter((entry) => entry.rel === 'contents')\n .forEach((entry) => {\n transformCache.delete(entry.target);\n });\n server?.ws.send({\n type: 'full-reload',\n path: target.href.slice(cwd.href.length),\n });\n }\n\n const devServerMiddleware = async function vivliostyleDevServerMiddleware(\n req,\n res,\n next,\n ) {\n if (!program) {\n return next();\n }\n const { entriesLookup, urlMatchRe } = program;\n const [_, pathname, qs] = decodeURI(req.url!).match(urlMatchRe) ?? [];\n const match = pathname && entriesLookup(pathname);\n if (!match) {\n return next();\n }\n const [entry, expected] = match;\n // Enforce using the actual path to match the full-reload event of the Vite client\n if (pathname !== expected) {\n res.statusCode = 301;\n res.setHeader('Location', `${expected}${qs || ''}`);\n return res.end();\n }\n\n Logger.debug('dev-server > request %s', pathname);\n const cachePromise = transformCache.get(entry.target);\n if (cachePromise) {\n const cached = await cachePromise;\n if (!cached) {\n return next();\n }\n if (req.headers['if-none-match'] === cached.etag) {\n res.statusCode = 304;\n return res.end();\n } else {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html;charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Etag', cached.etag);\n return res.end(cached.content);\n }\n }\n\n const { host } = req.headers;\n if (entry.rel === 'contents') {\n await transformAll(host);\n }\n const result = await transform(entry, host);\n if (!result) {\n return next();\n }\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html;charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Etag', result.etag);\n return res.end(result.content);\n } satisfies NextHandleFunction;\n\n const serveWorkspaceMiddleware =\n async function vivliostyleServeWorkspaceMiddleware(req, res, next) {\n if (!config || !program) {\n return next();\n }\n const {\n urlMatchRe,\n serveWorkspace,\n serveWorkspaceMatcher,\n serveAssets,\n serveAssetsMatcher,\n } = program;\n const [_, pathname] = decodeURI(req.url!).match(urlMatchRe) ?? [];\n if (!pathname) {\n return next();\n }\n\n const handleWorkspace = (next: () => void) => {\n if (!serveWorkspaceMatcher.match(pathname.slice(1))) {\n return next();\n }\n Logger.debug('dev-server > serveWorkspace %s', pathname);\n const url = req.url!;\n req.url = req.url!.slice(config.base.length);\n return serveWorkspace(req, res, () => {\n req.url = url;\n next();\n });\n };\n\n const handleAssets = (next: () => void) => {\n if (!serveAssetsMatcher.match(pathname.slice(1))) {\n return next();\n }\n Logger.debug('dev-server > serveAssets %s', pathname);\n const url = req.url!;\n req.url = url!.slice(config.base.length);\n return serveAssets(req, res, () => {\n req.url = url;\n next();\n });\n };\n\n handleWorkspace(() => handleAssets(next));\n } satisfies NextHandleFunction;\n\n return {\n name: 'vivliostyle:dev-server',\n enforce: 'pre',\n\n configureServer(viteServer) {\n server = viteServer;\n const requestReload = debounce(async () => {\n await reload();\n viteServer.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }, 200);\n const handleUpdate = (pathname: string) => {\n if (!matchProjectDep?.(pathname)) {\n return;\n }\n requestReload();\n };\n viteServer.watcher.on('add', handleUpdate);\n viteServer.watcher.on('change', handleUpdate);\n viteServer.watcher.on('unlink', handleUpdate);\n\n return () => {\n viteServer.middlewares.use(devServerMiddleware);\n viteServer.middlewares.use(serveWorkspaceMiddleware);\n };\n },\n configurePreviewServer(viteServer) {\n return () => {\n viteServer.middlewares.use(\n config.base,\n sirv(config.workspaceDir, { dev: true, etag: false, extensions: [] }),\n );\n };\n },\n async buildStart() {\n await reload(true);\n await transformAll(undefined);\n },\n async handleHotUpdate(ctx) {\n const entry = config?.entries.find(\n (e) =>\n (e.source?.type === 'file' && e.source.pathname === ctx.file) ||\n (!e.source && e.target === ctx.file),\n );\n if (config && entry) {\n await invalidate(entry);\n }\n },\n };\n}\n","import { copy } from 'fs-extra/esm';\nimport fs from 'node:fs';\nimport picomatch, { PicomatchOptions } from 'picomatch';\nimport { glob, GlobOptions } from 'tinyglobby';\nimport upath from 'upath';\nimport { ResolvedTaskConfig } from '../config/resolve.js';\nimport { Logger } from '../logger.js';\nimport { pathContains, pathEquals } from '../util.js';\n\nexport class GlobMatcher {\n #_matchers: picomatch.Matcher[];\n\n constructor(\n public matcherConfig: (Pick<PicomatchOptions, 'dot' | 'ignore'> & {\n patterns: string[];\n cwd: string;\n })[],\n ) {\n this.#_matchers = matcherConfig.map(({ patterns, ...options }) =>\n picomatch(patterns, options),\n );\n }\n\n match(test: string): boolean {\n return this.#_matchers.some((matcher) => matcher(test));\n }\n\n async glob(\n globOptions: Pick<GlobOptions, 'followSymbolicLinks'> = {},\n ): Promise<Set<string>> {\n return new Set(\n (\n await Promise.all(\n this.matcherConfig.map((config) =>\n glob({ ...config, ...globOptions }),\n ),\n )\n ).flat(),\n );\n }\n}\n\nfunction getIgnoreThemeDirectoryPatterns({\n themesDir,\n cwd,\n}: Pick<ResolvedTaskConfig, 'themesDir'> & {\n cwd: string;\n}): string[] {\n return pathContains(cwd, themesDir)\n ? [\n `${upath.relative(cwd, themesDir)}/node_modules/*/example`,\n `${upath.relative(cwd, themesDir)}/node_modules/*/*/example`,\n ]\n : [];\n}\n\nfunction getIgnoreAssetPatterns({\n outputs,\n entries,\n cwd,\n}: Pick<ResolvedTaskConfig, 'outputs' | 'entries'> & {\n cwd: string;\n}): string[] {\n return [\n ...outputs.flatMap(({ format, path: p }) =>\n !pathContains(cwd, p)\n ? []\n : format === 'webpub'\n ? upath.join(upath.relative(cwd, p), '**')\n : upath.relative(cwd, p),\n ),\n ...entries.flatMap(({ template }) => {\n return template?.type === 'file' && pathContains(cwd, template.pathname)\n ? upath.relative(cwd, template.pathname)\n : [];\n }),\n ];\n}\n\nexport function getWebPubResourceMatcher({\n outputs,\n themesDir,\n entries,\n cwd,\n manifestPath,\n copyAsset: { fileExtensions },\n}: Pick<\n ResolvedTaskConfig,\n 'outputs' | 'themesDir' | 'entries' | 'copyAsset'\n> & {\n cwd: string;\n manifestPath: string;\n}) {\n return new GlobMatcher([\n {\n patterns: [\n `**/${upath.relative(cwd, manifestPath)}`,\n '**/*.{html,htm,xhtml,xht}',\n `**/*.{${fileExtensions.join(',')}}`,\n ],\n ignore: [\n ...getIgnoreAssetPatterns({\n cwd,\n outputs,\n entries,\n }),\n ...getIgnoreThemeDirectoryPatterns({\n cwd,\n themesDir,\n }),\n // Ignore node_modules in the root directory\n 'node_modules/**',\n // only include dotfiles starting with `.vs-`\n '**/.!(vs-*)/**',\n ],\n dot: true,\n cwd,\n },\n ]);\n}\n\nexport function getAssetMatcher({\n copyAsset: { fileExtensions, includes, excludes },\n outputs,\n themesDir,\n entries,\n cwd,\n ignore = [],\n}: Pick<\n ResolvedTaskConfig,\n 'copyAsset' | 'outputs' | 'themesDir' | 'entries'\n> & {\n cwd: string;\n ignore?: string[];\n}) {\n const ignorePatterns = [\n ...ignore,\n ...excludes,\n ...getIgnoreAssetPatterns({ outputs, entries, cwd }),\n ];\n return new GlobMatcher([\n // Step 1: Glob files with an extension in `fileExtension`\n // Ignore files in node_modules directory, theme example files and files matched `excludes`\n {\n patterns: fileExtensions.map((ext) => `**/*.${ext}`),\n ignore: [\n '**/node_modules/**',\n ...ignorePatterns,\n ...getIgnoreThemeDirectoryPatterns({ themesDir, cwd }),\n ],\n cwd,\n },\n // Step 2: Glob files matched with `includes`\n // Ignore only files matched `excludes`\n {\n patterns: includes,\n ignore: ignorePatterns,\n cwd,\n },\n ]);\n}\n\nexport async function copyAssets({\n entryContextDir,\n workspaceDir,\n copyAsset,\n outputs,\n themesDir,\n entries,\n}: ResolvedTaskConfig): Promise<void> {\n if (pathEquals(entryContextDir, workspaceDir)) {\n return;\n }\n const relWorkspaceDir = upath.relative(entryContextDir, workspaceDir);\n const assets = await getAssetMatcher({\n copyAsset,\n cwd: entryContextDir,\n outputs,\n themesDir,\n entries,\n ignore: [\n // don't copy workspace itself\n ...(relWorkspaceDir ? [upath.join(relWorkspaceDir, '**')] : []),\n ],\n }).glob({ followSymbolicLinks: true });\n Logger.debug('assets', assets);\n for (const asset of assets) {\n const target = upath.join(workspaceDir, asset);\n fs.mkdirSync(upath.dirname(target), { recursive: true });\n await copy(upath.resolve(entryContextDir, asset), target);\n }\n}\n","import jsdom, { JSDOM } from '@vivliostyle/jsdom';\nimport { copy, move } from 'fs-extra/esm';\nimport fs from 'node:fs';\nimport upath from 'upath';\nimport serializeToXml from 'w3c-xmlserializer';\nimport MIMEType from 'whatwg-mimetype';\nimport {\n ContentsEntry,\n CoverEntry,\n ManuscriptEntry,\n ParsedEntry,\n ParsedTheme,\n ResolvedTaskConfig,\n WebPublicationManifestConfig,\n} from '../config/resolve.js';\nimport type { ArticleEntryConfig } from '../config/schema.js';\nimport { XML_DECLARATION } from '../const.js';\nimport { Logger } from '../logger.js';\nimport { writePublicationManifest } from '../output/webbook.js';\nimport {\n DetailError,\n pathContains,\n pathEquals,\n registerExitHandler,\n writeFileIfChanged,\n} from '../util.js';\nimport {\n createVirtualConsole,\n generateDefaultCoverHtml,\n generateDefaultTocHtml,\n getJsdomFromString,\n getJsdomFromUrlOrFile,\n processCoverHtml,\n processManuscriptHtml,\n processTocHtml,\n ResourceLoader,\n} from './html.js';\nimport { processMarkdown } from './markdown.js';\nimport {\n checkThemeInstallationNecessity,\n installThemeDependencies,\n} from './theme.js';\n\nfunction locateThemePath(theme: ParsedTheme, from: string): string | string[] {\n if (theme.type === 'uri') {\n return theme.location;\n }\n if (theme.type === 'file') {\n return upath.relative(from, theme.location);\n }\n if (theme.importPath) {\n return [theme.importPath].flat().map((locator) => {\n const resolvedPath = upath.resolve(theme.location, locator);\n if (\n !pathContains(theme.location, resolvedPath) ||\n !fs.existsSync(resolvedPath)\n ) {\n throw new Error(\n `Could not find a style path ${theme.importPath} for the theme: ${theme.name}.`,\n );\n }\n return upath.relative(from, resolvedPath);\n });\n } else {\n const pkgJsonPath = upath.join(theme.location, 'package.json');\n const packageJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));\n const maybeStyle =\n packageJson?.vivliostyle?.theme?.style ??\n packageJson.style ??\n packageJson.main;\n if (!maybeStyle) {\n throw new DetailError(\n `Could not find a style file for the theme: ${theme.name}.`,\n 'Please ensure this package satisfies a `vivliostyle.theme.style` property.',\n );\n }\n return upath.relative(from, upath.join(theme.location, maybeStyle));\n }\n}\n\nexport async function cleanupWorkspace({\n entryContextDir,\n workspaceDir,\n themesDir,\n entries,\n}: ResolvedTaskConfig) {\n if (\n pathEquals(workspaceDir, entryContextDir) ||\n pathContains(workspaceDir, entryContextDir) ||\n entries.some(\n (entry) =>\n entry.source?.type === 'file' &&\n pathContains(workspaceDir, entry.source.pathname),\n )\n ) {\n return;\n }\n // workspaceDir is placed on different directory; delete everything excepting theme files\n Logger.debug('cleanup workspace files', workspaceDir);\n let movedWorkspacePath: string | undefined;\n if (pathContains(workspaceDir, themesDir) && fs.existsSync(themesDir)) {\n movedWorkspacePath = upath.join(\n upath.dirname(workspaceDir),\n `.vs-${Date.now()}`,\n );\n const movedThemePath = upath.join(\n movedWorkspacePath,\n upath.relative(workspaceDir, themesDir),\n );\n fs.mkdirSync(upath.dirname(movedThemePath), { recursive: true });\n registerExitHandler(\n `Removing the moved workspace directory: ${movedWorkspacePath}`,\n () => {\n if (movedWorkspacePath && fs.existsSync(movedWorkspacePath)) {\n fs.rmSync(movedWorkspacePath, { recursive: true, force: true });\n }\n },\n );\n await move(themesDir, movedThemePath);\n }\n await fs.promises.rm(workspaceDir, { recursive: true, force: true });\n if (movedWorkspacePath) {\n await move(movedWorkspacePath, workspaceDir);\n }\n}\n\nexport async function prepareThemeDirectory({\n themesDir,\n themeIndexes,\n}: ResolvedTaskConfig) {\n // Backward compatibility: v8 to v9\n if (\n fs.existsSync(upath.join(themesDir, 'packages')) &&\n !fs.existsSync(upath.join(themesDir, 'node_modules'))\n ) {\n fs.renameSync(\n upath.join(themesDir, 'packages'),\n upath.join(themesDir, 'node_modules'),\n );\n }\n\n // install theme packages\n if (await checkThemeInstallationNecessity({ themesDir, themeIndexes })) {\n Logger.startLogging('Installing theme files');\n await installThemeDependencies({ themesDir, themeIndexes });\n }\n\n // copy theme files\n for (const theme of themeIndexes) {\n if (theme.type === 'file' && !pathEquals(theme.source, theme.location)) {\n fs.mkdirSync(upath.dirname(theme.location), { recursive: true });\n await copy(theme.source, theme.location);\n }\n }\n}\n\nexport async function transformManuscript(\n entry: ParsedEntry,\n {\n entryContextDir,\n workspaceDir,\n viewerInput: { manifestPath },\n title,\n entries,\n language,\n documentProcessorFactory,\n vfmOptions,\n rootUrl,\n }: ResolvedTaskConfig & { viewerInput: WebPublicationManifestConfig },\n): Promise<string | undefined> {\n const source =\n entry.rel === 'contents' || entry.rel === 'cover'\n ? (entry as ContentsEntry | CoverEntry).template\n : (entry as ManuscriptEntry).source;\n let content: JSDOM | undefined;\n let resourceLoader: ResourceLoader | undefined;\n let resourceUrl: string | undefined;\n\n // calculate style path\n const style = entry.themes.flatMap((theme) =>\n locateThemePath(theme, upath.dirname(entry.target)),\n );\n\n if (source?.type === 'file') {\n if (source.contentType === 'text/markdown') {\n // compile markdown\n const vfile = await processMarkdown(\n documentProcessorFactory,\n source.pathname,\n {\n ...vfmOptions,\n style,\n title: entry.title,\n language: language ?? undefined,\n },\n );\n content = getJsdomFromString({ html: String(vfile) });\n } else if (\n source.contentType === 'text/html' ||\n source.contentType === 'application/xhtml+xml'\n ) {\n content = await getJsdomFromUrlOrFile({ src: source.pathname });\n content = await processManuscriptHtml(content, {\n style,\n title: entry.title,\n contentType: source.contentType,\n language,\n });\n } else {\n if (!pathEquals(source.pathname, entry.target)) {\n await copy(source.pathname, entry.target);\n }\n }\n } else if (source?.type === 'uri') {\n resourceUrl = /^https?:/.test(source.href)\n ? source.href\n : `${rootUrl}${source.href}`;\n resourceLoader = new ResourceLoader();\n try {\n await getJsdomFromUrlOrFile({\n src: resourceUrl,\n resourceLoader,\n virtualConsole: createVirtualConsole((error) => {\n Logger.logError(`Failed to fetch resources: ${error.detail}`);\n }),\n });\n } catch (error: any) {\n throw new DetailError(\n `Failed to fetch the content from ${resourceUrl}`,\n error.stack ?? error.message,\n );\n }\n\n const contentFetcher = resourceLoader.fetcherMap.get(resourceUrl);\n if (contentFetcher) {\n const buffer = await contentFetcher;\n const contentType = contentFetcher.response?.headers['content-type'];\n if (!contentType || new MIMEType(contentType).essence !== 'text/html') {\n throw new Error(`The content is not an HTML document: ${resourceUrl}`);\n }\n content = getJsdomFromString({ html: buffer.toString('utf8') });\n content = await processManuscriptHtml(content, {\n style,\n title: entry.title,\n contentType: 'text/html',\n language,\n });\n }\n } else if (entry.rel === 'contents') {\n content = getJsdomFromString({\n html: generateDefaultTocHtml({\n language,\n title,\n }),\n });\n content = await processManuscriptHtml(content, {\n style,\n title,\n contentType: 'text/html',\n language,\n });\n } else if (entry.rel === 'cover') {\n content = getJsdomFromString({\n html: generateDefaultCoverHtml({ language, title: entry.title }),\n });\n content = await processManuscriptHtml(content, {\n style,\n title: entry.title,\n contentType: 'text/html',\n language,\n });\n }\n\n if (!content) {\n return;\n }\n\n if (entry.rel === 'contents') {\n const contentsEntry = entry as ContentsEntry;\n const manuscriptEntries = entries.filter(\n (e): e is ManuscriptEntry => 'source' in e,\n );\n content = await processTocHtml(content, {\n entries: manuscriptEntries,\n manifestPath,\n distDir: upath.dirname(contentsEntry.target),\n tocTitle: contentsEntry.tocTitle,\n sectionDepth: contentsEntry.sectionDepth,\n styleOptions: contentsEntry,\n transform: contentsEntry.transform,\n });\n }\n\n if (entry.rel === 'cover') {\n const coverEntry = entry as CoverEntry;\n content = await processCoverHtml(content, {\n imageSrc: upath.relative(\n upath.join(\n entryContextDir,\n upath.relative(workspaceDir, coverEntry.target),\n '..',\n ),\n coverEntry.coverImageSrc,\n ),\n imageAlt: coverEntry.coverImageAlt,\n styleOptions: coverEntry,\n });\n }\n\n let html;\n if (content.window.document.contentType === 'application/xhtml+xml') {\n html = `${XML_DECLARATION}\\n${serializeToXml(content.window.document)}`;\n } else {\n html = content.serialize();\n }\n const htmlBuffer = Buffer.from(html, 'utf8');\n if (\n !source ||\n (source.type === 'file' && !pathEquals(source.pathname, entry.target))\n ) {\n writeFileIfChanged(entry.target, htmlBuffer);\n }\n\n if (source?.type === 'uri' && resourceLoader && resourceUrl) {\n const { response } = resourceLoader.fetcherMap.get(resourceUrl)!;\n const contentFetcher = Promise.resolve(\n htmlBuffer,\n ) as jsdom.AbortablePromise<Buffer>;\n contentFetcher.abort = () => {};\n contentFetcher.response = response;\n resourceLoader.fetcherMap.set(resourceUrl, contentFetcher);\n\n await ResourceLoader.saveFetchedResources({\n fetcherMap: resourceLoader.fetcherMap,\n rootUrl: resourceUrl,\n outputDir: source.rootDir,\n });\n }\n\n return html;\n}\n\nexport async function generateManifest({\n entryContextDir,\n workspaceDir,\n viewerInput: { manifestPath },\n title,\n author,\n entries,\n language,\n readingProgression,\n cover,\n}: ResolvedTaskConfig & { viewerInput: WebPublicationManifestConfig }) {\n const manifestEntries: ArticleEntryConfig[] = entries.map((entry) => ({\n title:\n (entry.rel === 'contents' && (entry as ContentsEntry).tocTitle) ||\n entry.title,\n path: upath.relative(workspaceDir, entry.target),\n encodingFormat:\n !('contentType' in entry) ||\n entry.contentType === 'text/markdown' ||\n entry.contentType === 'text/html'\n ? undefined\n : entry.contentType,\n rel: entry.rel,\n }));\n writePublicationManifest(manifestPath, {\n title,\n author,\n language,\n readingProgression,\n cover: cover && {\n url: upath.relative(entryContextDir, cover.src),\n name: cover.name,\n },\n entries: manifestEntries,\n modified: new Date().toISOString(),\n });\n}\n\nexport async function compile(\n config: ResolvedTaskConfig & { viewerInput: WebPublicationManifestConfig },\n): Promise<void> {\n const tocEntries: ParsedEntry[] = [];\n for (const entry of config.entries) {\n if (entry.rel === 'contents') {\n // To transpile the table of contents, all dependent entries must be transpiled in advance\n tocEntries.push(entry);\n continue;\n }\n await transformManuscript(entry, config);\n }\n for (const entry of tocEntries) {\n await transformManuscript(entry, config);\n }\n\n // generate manifest\n if (config.viewerInput.needToGenerateManifest) {\n await generateManifest(config);\n }\n}\n","import { copy } from 'fs-extra/esm';\nimport { lookup as mime } from 'mime-types';\nimport fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { glob } from 'tinyglobby';\nimport upath from 'upath';\nimport {\n EpubOutput,\n isWebbookConfig,\n ResolvedTaskConfig,\n WebBookEntryConfig,\n WebPublicationOutput,\n} from '../config/resolve.js';\nimport { ArticleEntryConfig } from '../config/schema.js';\nimport { MANIFEST_FILENAME } from '../const.js';\nimport { Logger } from '../logger.js';\nimport {\n getAssetMatcher,\n getWebPubResourceMatcher,\n} from '../processor/asset.js';\nimport {\n createVirtualConsole,\n fetchLinkedPublicationManifest,\n getJsdomFromUrlOrFile,\n ResourceLoader,\n} from '../processor/html.js';\nimport type {\n PublicationLinks,\n PublicationManifest,\n URL as PublicationURL,\n ResourceCategorization,\n} from '../schema/publication.schema.js';\nimport {\n assertPubManifestSchema,\n DetailError,\n pathEquals,\n useTmpDirectory,\n} from '../util.js';\nimport { exportEpub } from './epub.js';\n\nfunction sortManifestResources(manifest: PublicationManifest) {\n if (!Array.isArray(manifest.resources)) {\n return;\n }\n manifest.resources = [...manifest.resources].sort((a, b) =>\n (typeof a === 'string' ? a : a.url) > (typeof b === 'string' ? b : b.url)\n ? 1\n : -1,\n );\n}\n\nexport async function prepareWebPublicationDirectory({\n outputDir,\n}: {\n outputDir: string;\n}): Promise<void> {\n if (fs.existsSync(outputDir)) {\n Logger.debug('going to remove existing webpub', outputDir);\n await fs.promises.rm(outputDir, { force: true, recursive: true });\n }\n fs.mkdirSync(outputDir, { recursive: true });\n}\n\nfunction transformPublicationManifest(\n entity: PublicationManifest,\n transformer: { url: (str: string) => string },\n): PublicationManifest {\n const { url: transformUrl } = transformer;\n const transformUrlOrPublicationLinks = (\n e: PublicationURL | PublicationLinks,\n ) => {\n if (typeof e === 'string') {\n return transformUrl(e);\n }\n const ret = { ...e };\n ret.url = transformUrl(e.url);\n return ret;\n };\n const ret = { ...entity };\n for (const [key, tr] of Object.entries({\n conformsTo: transformUrl,\n url: transformUrl,\n readingOrder: transformUrlOrPublicationLinks,\n resources: transformUrlOrPublicationLinks,\n links: transformUrlOrPublicationLinks,\n })) {\n if (key in ret) {\n ret[key] = Array.isArray(ret[key])\n ? ret[key].map(tr)\n : tr(ret[key] as string);\n }\n }\n return ret;\n}\n\nexport function decodePublicationManifest(input: PublicationManifest) {\n return transformPublicationManifest(input, {\n url: decodeURI,\n });\n}\n\nfunction encodePublicationManifest(input: PublicationManifest) {\n return transformPublicationManifest(input, {\n url: encodeURI,\n });\n}\n\n// https://www.w3.org/TR/pub-manifest/\nexport function writePublicationManifest(\n output: string,\n options: {\n title?: string;\n author?: string;\n language?: string;\n readingProgression?: 'ltr' | 'rtl';\n modified: string;\n entries: ArticleEntryConfig[];\n cover?: {\n url: string;\n name: string;\n };\n links?: (PublicationURL | PublicationLinks)[];\n resources?: (PublicationURL | PublicationLinks)[];\n },\n): PublicationManifest {\n const entries: PublicationLinks[] = options.entries.map((entry) => ({\n url: entry.path,\n ...(entry.title && { name: entry.title }),\n ...(entry.encodingFormat && { encodingFormat: entry.encodingFormat }),\n ...(entry.rel && { rel: entry.rel }),\n ...((entry.rel === 'contents' || entry.rel === 'cover') && {\n type: 'LinkedResource',\n }),\n }));\n const links: (PublicationURL | PublicationLinks)[] = [\n options.links || [],\n ].flat();\n const resources: (PublicationURL | PublicationLinks)[] = [\n options.resources || [],\n ].flat();\n\n if (options.cover) {\n const mimeType = mime(options.cover.url);\n if (mimeType) {\n resources.push({\n rel: 'cover',\n url: options.cover.url,\n name: options.cover.name,\n encodingFormat: mimeType,\n });\n } else {\n Logger.logWarn(\n `Cover image \"${options.cover}\" was set in your configuration but couldn’t detect the image metadata. Please check a valid cover file is placed.`,\n );\n }\n }\n\n const publication: PublicationManifest = {\n '@context': ['https://schema.org', 'https://www.w3.org/ns/pub-context'],\n type: 'Book',\n conformsTo: 'https://github.com/vivliostyle/vivliostyle-cli',\n ...(options.title && { name: options.title }),\n ...(options.author && { author: options.author }),\n ...(options.language && { inLanguage: options.language }),\n ...(options.readingProgression && {\n readingProgression: options.readingProgression,\n }),\n dateModified: options.modified,\n readingOrder: entries,\n resources,\n links,\n };\n\n const encodedManifest = encodePublicationManifest(publication);\n Logger.debug(\n 'writePublicationManifest path: %s content: %O',\n output,\n encodedManifest,\n );\n try {\n assertPubManifestSchema(encodedManifest);\n } catch (error) {\n const thrownError = error as Error | string;\n throw new DetailError(\n `Validation of publication manifest failed. Please check the schema: ${output}`,\n typeof thrownError === 'string'\n ? thrownError\n : (thrownError.stack ?? thrownError.message),\n );\n }\n fs.mkdirSync(upath.dirname(output), { recursive: true });\n fs.writeFileSync(output, JSON.stringify(encodedManifest, null, 2));\n return publication;\n}\n\nexport async function retrieveWebbookEntry({\n viewerInput,\n outputDir,\n}: {\n viewerInput: WebBookEntryConfig;\n outputDir: string;\n}): Promise<{\n entryHtmlFile: string;\n manifest: PublicationManifest | undefined;\n}> {\n const webbookEntryUrl = viewerInput.webbookPath\n ? pathToFileURL(viewerInput.webbookPath).href\n : viewerInput.webbookEntryUrl;\n if (/^https?:/i.test(webbookEntryUrl)) {\n Logger.logUpdate('Fetching remote contents');\n }\n const resourceLoader = new ResourceLoader();\n const dom = await getJsdomFromUrlOrFile({\n src: webbookEntryUrl,\n resourceLoader,\n });\n const entryHtml = viewerInput.webbookPath\n ? upath.basename(viewerInput.webbookPath)\n : decodeURI(dom.window.location.pathname);\n\n const { manifest, manifestUrl } =\n (await fetchLinkedPublicationManifest({\n dom,\n resourceLoader,\n baseUrl: webbookEntryUrl,\n })) || {};\n\n let pathContains: (url: string) => boolean;\n if (webbookEntryUrl.startsWith('data:')) {\n pathContains = (url) => false;\n } else {\n const rootUrl = /^https?:/i.test(webbookEntryUrl)\n ? new URL('/', webbookEntryUrl).href\n : new URL('.', webbookEntryUrl).href;\n pathContains = (url: string) =>\n !upath.relative(rootUrl, url).startsWith('..');\n }\n const retriever = new Map(resourceLoader.fetcherMap);\n\n if (manifest && manifestUrl) {\n [manifest.resources || []].flat().forEach((v) => {\n const url = typeof v === 'string' ? v : v.url;\n const fullUrl = new URL(encodeURI(url), manifestUrl).href;\n if (!pathContains(fullUrl) || retriever.has(fullUrl)) {\n return;\n }\n const fetchPromise = resourceLoader.fetch(fullUrl);\n if (fetchPromise && !retriever.has(fullUrl)) {\n retriever.set(fullUrl, fetchPromise);\n }\n });\n for (const v of [manifest.readingOrder || []].flat()) {\n const url = typeof v === 'string' ? v : v.url;\n if (\n !/\\.html?$/.test(url) &&\n !(typeof v === 'string' || v.encodingFormat === 'text/html')\n ) {\n continue;\n }\n const fullUrl = new URL(encodeURI(url), manifestUrl).href;\n if (!pathContains(fullUrl) || fullUrl === webbookEntryUrl) {\n continue;\n }\n const subpathResourceLoader = new ResourceLoader();\n await getJsdomFromUrlOrFile({\n src: fullUrl,\n resourceLoader: subpathResourceLoader,\n virtualConsole: createVirtualConsole((error) => {\n Logger.logError(`Failed to fetch webbook resources: ${error.detail}`);\n }),\n });\n subpathResourceLoader.fetcherMap.forEach(\n (v, k) => !retriever.has(k) && retriever.set(k, v),\n );\n }\n }\n\n const fetchedResources = await ResourceLoader.saveFetchedResources({\n fetcherMap: retriever,\n rootUrl: webbookEntryUrl,\n outputDir,\n /* v8 ignore next 4 */\n onError: (error) => {\n Logger.debug(error);\n Logger.logError(`Failed to fetch webbook resources: ${error}`);\n },\n });\n\n if (manifest) {\n const referencedContents = [\n ...[manifest.readingOrder || []].flat(),\n ...[manifest.resources || []].flat(),\n ].map((v) => (typeof v === 'string' ? v : v.url));\n manifest.resources = [\n ...[manifest.resources || []].flat(),\n ...fetchedResources.filter(\n ({ url }) => !referencedContents.includes(url),\n ),\n ];\n sortManifestResources(manifest);\n }\n\n Logger.debug(\n 'Saved webbook resources',\n fetchedResources.map((v) => v.url),\n );\n Logger.debug(\n 'Publication manifest from webbook',\n manifest && JSON.stringify(manifest, null, 2),\n );\n\n return {\n entryHtmlFile: upath.join(\n outputDir,\n entryHtml,\n ...(upath.extname(entryHtml) ? [] : ['index.html']),\n ),\n manifest,\n };\n}\n\nexport async function supplyWebPublicationManifestForWebbook({\n entryHtmlFile,\n outputDir,\n ...config\n}: Pick<\n ResolvedTaskConfig,\n 'language' | 'title' | 'author' | 'readingProgression'\n> & {\n entryHtmlFile: string;\n outputDir: string;\n}): Promise<PublicationManifest> {\n Logger.debug(`Generating publication manifest from HTML: ${entryHtmlFile}`);\n const dom = await getJsdomFromUrlOrFile({ src: entryHtmlFile });\n const { document } = dom.window;\n const language =\n config.language || document.documentElement.lang || undefined;\n const title = config.title || document.title || '';\n const author =\n config.author ||\n document.querySelector('meta[name=\"author\"]')?.getAttribute('content') ||\n '';\n\n const entry = upath.relative(outputDir, entryHtmlFile);\n const allFiles = await glob('**', {\n cwd: outputDir,\n });\n\n const manifest = writePublicationManifest(\n upath.join(outputDir, MANIFEST_FILENAME),\n {\n title,\n author,\n language,\n readingProgression: config.readingProgression,\n modified: new Date().toISOString(),\n entries: [{ path: entry }],\n resources: allFiles.filter((f) => f !== entry),\n },\n );\n sortManifestResources(manifest);\n const link = document.createElement('link');\n link.setAttribute('rel', 'publication');\n link.setAttribute('type', 'application/ld+json');\n link.setAttribute(\n 'href',\n upath.relative(\n upath.dirname(entryHtmlFile),\n upath.join(outputDir, MANIFEST_FILENAME),\n ),\n );\n document.head.appendChild(link);\n await fs.promises.writeFile(entryHtmlFile, dom.serialize(), 'utf8');\n\n Logger.debug(\n 'Generated publication manifest from HTML',\n JSON.stringify(manifest, null, 2),\n );\n return manifest;\n}\n\nexport async function copyWebPublicationAssets({\n exportAliases,\n outputs,\n copyAsset,\n themesDir,\n manifestPath,\n input,\n outputDir,\n entries,\n}: Pick<\n ResolvedTaskConfig,\n 'exportAliases' | 'outputs' | 'copyAsset' | 'themesDir' | 'entries'\n> & {\n input: string;\n outputDir: string;\n manifestPath: string;\n}): Promise<{ manifest: PublicationManifest; actualManifestPath: string }> {\n const relExportAliases = exportAliases\n .map(({ source, target }) => ({\n source: upath.relative(input, source),\n target: upath.relative(input, target),\n }))\n .filter(({ source }) => !source.startsWith('..'));\n const assetMatcher = getAssetMatcher({\n copyAsset,\n cwd: input,\n outputs,\n themesDir,\n entries,\n });\n const webResourceMatcher = getWebPubResourceMatcher({\n cwd: input,\n outputs,\n themesDir,\n entries,\n manifestPath,\n copyAsset,\n });\n const allFiles = new Set([\n ...(await assetMatcher.glob()),\n ...(await webResourceMatcher.glob({\n // follow symbolic links to copy local theme packages\n followSymbolicLinks: true,\n })),\n ]);\n // Exclude files that will overwrite alias targets\n for (const alias of relExportAliases) {\n allFiles.delete(alias.target);\n }\n\n Logger.debug(\n 'webbook files',\n JSON.stringify(\n [...allFiles].map((file) => {\n const alias = relExportAliases.find(({ source }) => source === file);\n return alias ? `${file} (alias: ${alias.target})` : file;\n }),\n null,\n 2,\n ),\n );\n const resources: string[] = [];\n let actualManifestPath = upath.join(\n outputDir,\n upath.relative(input, manifestPath),\n );\n for (const file of allFiles) {\n const alias = relExportAliases.find(({ source }) => source === file);\n const relTarget = alias?.target || file;\n resources.push(relTarget);\n const target = upath.join(outputDir, relTarget);\n fs.mkdirSync(upath.dirname(target), { recursive: true });\n await copy(upath.join(input, file), target);\n if (alias && pathEquals(upath.join(input, alias.source), manifestPath)) {\n actualManifestPath = target;\n }\n }\n\n Logger.debug('webbook publication.json', actualManifestPath);\n // Overwrite copied publication.json\n const manifest = decodePublicationManifest(\n JSON.parse(fs.readFileSync(actualManifestPath, 'utf8')),\n );\n for (const entry of relExportAliases) {\n const rewriteAliasPath = (e: PublicationLinks | string) => {\n if (typeof e === 'string') {\n return pathEquals(e, entry.source) ? entry.source : e;\n }\n if (pathEquals(e.url, entry.source)) {\n e.url = entry.target;\n }\n return e;\n };\n if (manifest.links) {\n manifest.links = Array.isArray(manifest.links)\n ? manifest.links.map(rewriteAliasPath)\n : rewriteAliasPath(manifest.links);\n }\n if (manifest.readingOrder) {\n manifest.readingOrder = Array.isArray(manifest.readingOrder)\n ? manifest.readingOrder.map(rewriteAliasPath)\n : rewriteAliasPath(manifest.readingOrder);\n }\n if (manifest.resources) {\n manifest.resources = Array.isArray(manifest.resources)\n ? manifest.resources.map(rewriteAliasPath)\n : rewriteAliasPath(manifest.resources);\n }\n }\n\n // List copied files to resources field\n const normalizeToUrl = (val?: ResourceCategorization) =>\n [val || []].flat().map((e) => (typeof e === 'string' ? e : e.url));\n const preDefinedResources = [\n ...normalizeToUrl(manifest.links),\n ...normalizeToUrl(manifest.readingOrder),\n ...normalizeToUrl(manifest.resources),\n ];\n manifest.resources = [\n ...[manifest.resources || []].flat(),\n ...resources.flatMap((file) => {\n if (\n preDefinedResources.includes(file) ||\n // Omit publication.json itself\n pathEquals(file, upath.relative(outputDir, actualManifestPath))\n ) {\n return [];\n }\n return file;\n }),\n ];\n sortManifestResources(manifest);\n fs.writeFileSync(\n actualManifestPath,\n JSON.stringify(encodePublicationManifest(manifest), null, 2),\n );\n return { manifest, actualManifestPath };\n}\n\nexport async function buildWebPublication({\n target,\n config,\n}: {\n target: WebPublicationOutput | EpubOutput;\n config: ResolvedTaskConfig;\n}): Promise<string> {\n let outputDir: string;\n if (target.format === 'webpub') {\n outputDir = target.path;\n await prepareWebPublicationDirectory({ outputDir });\n } else {\n [outputDir] = await useTmpDirectory();\n }\n\n let entryHtmlFile: string | undefined;\n let manifest: PublicationManifest;\n let actualManifestPath: string | undefined;\n if (config.viewerInput.type === 'webpub') {\n const ret = await copyWebPublicationAssets({\n ...config,\n input: config.workspaceDir,\n outputDir,\n manifestPath: config.viewerInput.manifestPath,\n });\n manifest = ret.manifest;\n actualManifestPath = ret.actualManifestPath;\n if (config.input.format === 'markdown') {\n const entry = [manifest.readingOrder].flat()[0];\n if (entry) {\n entryHtmlFile = upath.join(\n outputDir,\n typeof entry === 'string' ? entry : entry.url,\n );\n }\n }\n } else if (isWebbookConfig(config)) {\n const ret = await retrieveWebbookEntry({\n viewerInput: config.viewerInput,\n outputDir,\n });\n entryHtmlFile = ret.entryHtmlFile;\n manifest =\n ret.manifest ||\n (await supplyWebPublicationManifestForWebbook({\n ...config,\n entryHtmlFile: ret.entryHtmlFile,\n outputDir,\n }));\n } else {\n throw new Error('No entry specified');\n }\n\n if (target.format === 'epub') {\n await exportEpub({\n webpubDir: outputDir,\n entryHtmlFile,\n manifest,\n relManifestPath:\n actualManifestPath && upath.relative(outputDir, actualManifestPath),\n target: target.path,\n epubVersion: target.version,\n });\n }\n return target.path;\n}\n","import jsdom, {\n AbortablePromise,\n ResourceLoader as BaseResourceLoader,\n JSDOM,\n VirtualConsole,\n} from '@vivliostyle/jsdom';\nimport DOMPurify, { WindowLike } from 'dompurify';\nimport { toHtml } from 'hast-util-to-html';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport upath from 'upath';\nimport MIMEType from 'whatwg-mimetype';\nimport { ManuscriptEntry } from '../config/resolve.js';\nimport type {\n StructuredDocument,\n StructuredDocumentSection,\n} from '../config/schema.js';\nimport { Logger } from '../logger.js';\nimport { decodePublicationManifest } from '../output/webbook.js';\nimport type { PublicationManifest } from '../schema/publication.schema.js';\nimport {\n DetailError,\n assertPubManifestSchema,\n isValidUri,\n writeFileIfChanged,\n} from '../util.js';\n\nexport const createVirtualConsole = (onError: (error: DetailError) => void) => {\n const virtualConsole = new jsdom.VirtualConsole();\n /* v8 ignore start */\n virtualConsole.on('error', (message) => {\n Logger.debug('[JSDOM Console] error:', message);\n });\n virtualConsole.on('warn', (message) => {\n Logger.debug('[JSDOM Console] warn:', message);\n });\n virtualConsole.on('log', (message) => {\n Logger.debug('[JSDOM Console] log:', message);\n });\n virtualConsole.on('info', (message) => {\n Logger.debug('[JSDOM Console] info:', message);\n });\n virtualConsole.on('dir', (message) => {\n Logger.debug('[JSDOM Console] dir:', message);\n });\n virtualConsole.on('jsdomError', (error) => {\n // Most of CSS using Paged media will be failed to run CSS parser of JSDOM.\n // We just ignore it because we don't use CSS parse results.\n // https://github.com/jsdom/jsdom/blob/a39e0ec4ce9a8806692d986a7ed0cd565ec7498a/lib/jsdom/living/helpers/stylesheets.js#L33-L44\n // see also: https://github.com/jsdom/jsdom/issues/2005\n if (error.message === 'Could not parse CSS stylesheet') {\n return;\n }\n onError(\n new DetailError(\n 'Error occurred when loading content',\n error.stack ?? error.message,\n ),\n );\n });\n /* v8 ignore stop */\n return virtualConsole;\n};\n\nexport const htmlPurify = DOMPurify(\n // @ts-expect-error: jsdom.DOMWindow should have trustedTypes property\n new JSDOM('').window as WindowLike,\n);\n\nexport class ResourceLoader extends BaseResourceLoader {\n static dataUrlOrigin = 'http://localhost/' as const;\n\n fetcherMap = new Map<string, jsdom.AbortablePromise<Buffer>>();\n\n fetch(url: string, options?: jsdom.FetchOptions) {\n Logger.debug(`[JSDOM] Fetching resource: ${url}`);\n const fetcher = super.fetch(url, options);\n if (fetcher) {\n this.fetcherMap.set(url, fetcher);\n }\n return fetcher;\n }\n\n static async saveFetchedResources({\n fetcherMap,\n rootUrl,\n outputDir,\n onError,\n }: {\n fetcherMap: Map<string, jsdom.AbortablePromise<Buffer>>;\n rootUrl: string;\n outputDir: string;\n onError?: (error: Error) => void;\n }) {\n const rootHref = rootUrl.startsWith('data:')\n ? ResourceLoader.dataUrlOrigin\n : /^https?:/i.test(rootUrl)\n ? new URL('/', rootUrl).href\n : new URL('.', rootUrl).href;\n\n const normalizeToLocalPath = (urlString: string, mimeType?: string) => {\n let url = new URL(urlString);\n url.hash = '';\n if (mimeType === 'text/html' && !/\\.html?$/.test(url.pathname)) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/index.html`;\n }\n let relTarget = upath.relative(rootHref, url.href);\n return decodeURI(relTarget);\n };\n\n const fetchedResources: { url: string; encodingFormat?: string }[] = [];\n await Promise.allSettled(\n [...fetcherMap.entries()].flatMap(async ([url, fetcher]) => {\n if (!url.startsWith(rootHref)) {\n return [];\n }\n return (\n fetcher\n .then(async (buffer) => {\n let encodingFormat: string | undefined;\n try {\n const contentType = fetcher.response?.headers['content-type'];\n if (contentType) {\n encodingFormat = new MIMEType(contentType).essence;\n }\n /* v8 ignore next 3 */\n } catch (e) {\n /* NOOP */\n }\n const relTarget = normalizeToLocalPath(url, encodingFormat);\n const target = upath.join(outputDir, relTarget);\n fetchedResources.push({ url: relTarget, encodingFormat });\n writeFileIfChanged(target, buffer);\n })\n /* v8 ignore next */\n .catch(onError)\n );\n }),\n );\n return fetchedResources;\n }\n}\n\nexport async function getJsdomFromUrlOrFile({\n src,\n resourceLoader,\n virtualConsole = createVirtualConsole((error) => {\n throw error;\n }),\n}: {\n src: string;\n resourceLoader?: ResourceLoader;\n virtualConsole?: VirtualConsole;\n}) {\n const url = isValidUri(src) ? new URL(src) : pathToFileURL(src);\n let dom: JSDOM;\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n dom = await JSDOM.fromURL(src, {\n virtualConsole,\n resources: resourceLoader,\n });\n } else if (url.protocol === 'file:') {\n if (resourceLoader) {\n const file = resourceLoader._readFile(fileURLToPath(url));\n resourceLoader.fetcherMap.set(url.href, file);\n }\n dom = await JSDOM.fromFile(fileURLToPath(url), {\n virtualConsole,\n resources: resourceLoader,\n contentType:\n src.endsWith('.xhtml') || src.endsWith('.xml')\n ? 'application/xhtml+xml; charset=UTF-8'\n : 'text/html; charset=UTF-8',\n });\n } else if (url.protocol === 'data:') {\n const [head, body] = url.href.split(',', 2);\n const data = decodeURIComponent(body);\n const buffer = Buffer.from(\n data,\n /;base64$/i.test(head) ? 'base64' : 'utf8',\n );\n const dummyUrl = `${ResourceLoader.dataUrlOrigin}index.html`;\n if (resourceLoader) {\n let timeoutId: ReturnType<typeof setTimeout>;\n const promise = new Promise((resolve) => {\n timeoutId = setTimeout(resolve, 0, buffer);\n }) as AbortablePromise<Buffer>;\n promise.abort = () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n };\n resourceLoader.fetcherMap.set(dummyUrl, promise);\n }\n dom = new JSDOM(buffer.toString(), {\n virtualConsole,\n resources: resourceLoader,\n contentType: 'text/html; charset=UTF-8',\n url: dummyUrl,\n });\n } else {\n throw new Error(`Unsupported protocol: ${url.protocol}`);\n }\n return dom;\n}\n\nexport function getJsdomFromString({\n html,\n virtualConsole = createVirtualConsole((error) => {\n throw error;\n }),\n}: {\n html: string;\n virtualConsole?: VirtualConsole;\n}) {\n return new JSDOM(html, {\n virtualConsole,\n });\n}\n\nexport async function getStructuredSectionFromHtml(\n htmlPath: string,\n href?: string,\n) {\n const dom = await getJsdomFromUrlOrFile({ src: htmlPath });\n const { document } = dom.window;\n const allHeadings = [...document.querySelectorAll('h1, h2, h3, h4, h5, h6')]\n .filter((el) => {\n // Exclude headings contained by blockquote\n // TODO: Make customizable\n return !el.matches('blockquote *');\n })\n .sort((a, b) => {\n const position = a.compareDocumentPosition(b);\n return position & 2 /* DOCUMENT_POSITION_PRECEDING */\n ? 1\n : position & 4 /* DOCUMENT_POSITION_FOLLOWING */\n ? -1\n : 0;\n });\n\n function traverse(headers: Element[]): StructuredDocumentSection[] {\n if (headers.length === 0) {\n return [];\n }\n const [head, ...tail] = headers;\n const section = head.parentElement!;\n const id = head.id || section.id;\n const level = Number(head.tagName.slice(1));\n let i = tail.findIndex((s) => Number(s.tagName.slice(1)) <= level);\n i = i === -1 ? tail.length : i;\n return [\n {\n headingHtml: htmlPurify.sanitize(head.innerHTML),\n headingText: head.textContent?.trim().replace(/\\s+/g, ' ') || '',\n level,\n ...(href && id && { href: `${href}#${encodeURIComponent(id)}` }),\n ...(id && { id }),\n children: traverse(tail.slice(0, i)),\n },\n ...traverse(tail.slice(i)),\n ];\n }\n return traverse(allHeadings);\n}\n\nconst getTocHtmlStyle = ({\n pageBreakBefore,\n pageCounterReset,\n}: {\n pageBreakBefore?: 'recto' | 'verso' | 'left' | 'right';\n pageCounterReset?: number;\n}) => {\n if (!pageBreakBefore && typeof pageCounterReset !== 'number') {\n return null;\n }\n return /* css */ `\n${\n pageBreakBefore\n ? /* css */ `:root {\n break-before: ${pageBreakBefore};\n}`\n : ''\n}\n${\n // Note: `--vs-document-first-page-counter-reset` is reserved variable name in Vivliostyle base themes\n typeof pageCounterReset === 'number'\n ? /* css */ `@page :nth(1) {\n --vs-document-first-page-counter-reset: page ${Math.floor(pageCounterReset - 1)};\n counter-reset: var(--vs-document-first-page-counter-reset);\n}`\n : ''\n}\n`;\n};\n\ntype HastElement = import('hast').ElementContent | import('hast').Root;\n\nexport const defaultTocTransform = {\n transformDocumentList:\n (nodeList: StructuredDocument[]) =>\n (propsList: { children: HastElement | HastElement[] }[]): HastElement => {\n return (\n <ol>\n {nodeList\n .map((a, i) => [a, propsList[i]] as const)\n .flatMap(\n ([{ href, title, sections }, { children, ...otherProps }]) => {\n // don't display the document title if it has only one top-level H1 heading\n if (sections?.length === 1 && sections[0].level === 1) {\n return [children].flat().flatMap((e) => {\n if (e.type === 'element' && e.tagName === 'ol') {\n return e.children;\n }\n return e;\n });\n }\n return (\n <li {...otherProps}>\n <a {...{ href }}>{title}</a>\n {children}\n </li>\n );\n },\n )}\n </ol>\n );\n },\n transformSectionList:\n (nodeList: StructuredDocumentSection[]) =>\n (propsList: { children: HastElement | HastElement[] }[]): HastElement => {\n return (\n <ol>\n {nodeList\n .map((a, i) => [a, propsList[i]] as const)\n .map(\n ([{ headingHtml, href, level }, { children, ...otherProps }]) => {\n const headingContent = {\n type: 'raw',\n value: headingHtml,\n };\n return (\n <li {...otherProps} data-section-level={level}>\n {href ? (\n <a {...{ href }}>{headingContent}</a>\n ) : (\n <span>{headingContent}</span>\n )}\n {children}\n </li>\n );\n },\n )}\n </ol>\n );\n },\n};\n\nexport function generateDefaultTocHtml({\n language,\n title,\n}: {\n language?: string;\n title?: string;\n}) {\n const toc = (\n <html lang={language}>\n <head>\n <meta charset=\"utf-8\" />\n <title>{title || ''}</title>\n <style data-vv-style></style>\n </head>\n <body>\n <h1>{title || ''}</h1>\n <nav id=\"toc\" role=\"doc-toc\" />\n </body>\n </html>\n );\n return toHtml(toc);\n}\n\nexport async function generateTocListSection({\n entries,\n distDir,\n sectionDepth,\n transform = {},\n}: {\n entries: Pick<ManuscriptEntry, 'target' | 'title'>[];\n distDir: string;\n sectionDepth: number;\n transform?: Partial<typeof defaultTocTransform>;\n}): Promise<string> {\n const {\n transformDocumentList = defaultTocTransform.transformDocumentList,\n transformSectionList = defaultTocTransform.transformSectionList,\n } = transform;\n\n const structure = await Promise.all(\n entries.map(async (entry) => {\n const href = encodeURI(upath.relative(distDir, entry.target));\n const sections =\n sectionDepth >= 1\n ? await getStructuredSectionFromHtml(entry.target, href)\n : [];\n return {\n title: entry.title || upath.basename(entry.target, '.html'),\n href: encodeURI(upath.relative(distDir, entry.target)),\n sections,\n children: [], // TODO\n };\n }),\n );\n const docToc = transformDocumentList(structure)(\n structure.map((doc) => {\n function renderSectionList(\n sections: StructuredDocumentSection[],\n ): HastElement | HastElement[] {\n const nodeList = sections.flatMap((section) => {\n if (section.level > sectionDepth) {\n return [];\n }\n return section;\n });\n if (nodeList.length === 0) {\n return [];\n }\n return transformSectionList(nodeList)(\n nodeList.map((node) => ({\n children: [renderSectionList(node.children || [])].flat(),\n })),\n );\n }\n return {\n children: [renderSectionList(doc.sections || [])].flat(),\n };\n }),\n );\n\n return toHtml(docToc, { allowDangerousHtml: true });\n}\n\nexport async function processTocHtml(\n dom: JSDOM,\n {\n manifestPath,\n tocTitle,\n styleOptions = {},\n entries,\n distDir,\n sectionDepth,\n transform,\n }: Parameters<typeof generateTocListSection>[0] & {\n manifestPath: string;\n tocTitle: string;\n styleOptions?: Parameters<typeof getTocHtmlStyle>[0];\n },\n): Promise<JSDOM> {\n const { document } = dom.window;\n if (\n !document.querySelector(\n 'link[rel=\"publication\"][type=\"application/ld+json\"]',\n )\n ) {\n const l = document.createElement('link');\n l.setAttribute('rel', 'publication');\n l.setAttribute('type', 'application/ld+json');\n l.setAttribute('href', encodeURI(upath.relative(distDir, manifestPath)));\n document.head.appendChild(l);\n }\n\n const style = document.querySelector('style[data-vv-style]');\n if (style) {\n const textContent = getTocHtmlStyle(styleOptions);\n if (textContent) {\n style.textContent = textContent;\n } else {\n style.remove();\n }\n }\n\n const nav = document.querySelector('nav, [role=\"doc-toc\"]');\n if (nav && !nav.hasChildNodes()) {\n const h2 = document.createElement('h2');\n h2.textContent = tocTitle;\n nav.appendChild(h2);\n nav.innerHTML += await generateTocListSection({\n entries,\n distDir,\n sectionDepth,\n transform,\n });\n }\n return dom;\n}\n\nconst getCoverHtmlStyle = ({\n pageBreakBefore,\n}: {\n pageBreakBefore?: 'recto' | 'verso' | 'left' | 'right';\n}) => /* css */ `\n${\n pageBreakBefore\n ? `:root {\n break-before: ${pageBreakBefore};\n}`\n : ''\n}\nbody {\n margin: 0;\n}\n[role=\"doc-cover\"] {\n display: block;\n width: 100vw;\n height: 100vh;\n object-fit: contain;\n}\n@page {\n margin: 0;\n}\n`;\n\nexport function generateDefaultCoverHtml({\n language,\n title,\n}: {\n language?: string;\n title?: string;\n}) {\n const toc = (\n <html lang={language}>\n <head>\n <meta charset=\"utf-8\" />\n <title>{title || ''}</title>\n <style data-vv-style></style>\n </head>\n <body>\n <section role=\"region\" aria-label=\"Cover\">\n <img role=\"doc-cover\" />\n </section>\n </body>\n </html>\n );\n return toHtml(toc);\n}\n\nexport async function processCoverHtml(\n dom: JSDOM,\n {\n imageSrc,\n imageAlt,\n styleOptions = {},\n }: {\n imageSrc: string;\n imageAlt: string;\n styleOptions?: Parameters<typeof getCoverHtmlStyle>[0];\n },\n): Promise<JSDOM> {\n const { document } = dom.window;\n const style = document.querySelector('style[data-vv-style]');\n if (style) {\n const textContent = getCoverHtmlStyle(styleOptions);\n if (textContent) {\n style.textContent = textContent;\n } else {\n style.remove();\n }\n }\n\n const cover = document.querySelector('img[role=\"doc-cover\"]');\n if (cover && !cover.hasAttribute('src')) {\n cover.setAttribute('src', encodeURI(imageSrc));\n }\n if (cover && !cover.hasAttribute('alt')) {\n cover.setAttribute('alt', imageAlt);\n }\n return dom;\n}\n\nexport async function processManuscriptHtml(\n dom: JSDOM,\n {\n title,\n style,\n contentType,\n language,\n }: {\n title?: string;\n style?: string[];\n contentType?: 'text/html' | 'application/xhtml+xml';\n language?: string | null;\n },\n): Promise<JSDOM> {\n const { document } = dom.window;\n if (title) {\n if (!document.querySelector('title')) {\n const t = document.createElement('title');\n document.head.appendChild(t);\n }\n document.title = title;\n }\n for (const s of style ?? []) {\n const l = document.createElement('link');\n l.setAttribute('rel', 'stylesheet');\n l.setAttribute('type', 'text/css');\n l.setAttribute('href', encodeURI(s));\n document.head.appendChild(l);\n }\n if (language) {\n if (contentType === 'application/xhtml+xml') {\n if (!document.documentElement.getAttribute('xml:lang')) {\n document.documentElement.setAttribute('lang', language);\n document.documentElement.setAttribute('xml:lang', language);\n }\n } else {\n if (!document.documentElement.getAttribute('lang')) {\n document.documentElement.setAttribute('lang', language);\n }\n }\n }\n return dom;\n}\n\nexport async function fetchLinkedPublicationManifest({\n dom,\n resourceLoader,\n baseUrl,\n}: {\n dom: JSDOM;\n resourceLoader: ResourceLoader;\n baseUrl: string;\n}): Promise<{ manifest: PublicationManifest; manifestUrl: string } | null> {\n const { document } = dom.window;\n\n const linkEl = document.querySelector('link[href][rel=\"publication\"]');\n if (!linkEl) {\n return null;\n }\n const href = linkEl.getAttribute('href')!.trim();\n let manifest: PublicationManifest;\n let manifestUrl = baseUrl;\n if (href.startsWith('#')) {\n const scriptEl = document.getElementById(href.slice(1));\n if (scriptEl?.getAttribute('type') !== 'application/ld+json') {\n return null;\n }\n Logger.debug(`Found embedded publication manifest: ${href}`);\n try {\n manifest = JSON.parse(scriptEl.innerHTML);\n } catch (error) {\n const thrownError = error as Error;\n throw new DetailError(\n 'Failed to parse manifest data',\n typeof thrownError.stack,\n );\n }\n } else {\n Logger.debug(`Found linked publication manifest: ${href}`);\n const url = new URL(href, baseUrl);\n manifestUrl = url.href;\n const buffer = await resourceLoader.fetch(url.href);\n if (!buffer) {\n throw new Error(`Failed to fetch manifest JSON file: ${url.href}`);\n }\n const manifestJson = buffer.toString();\n try {\n manifest = JSON.parse(manifestJson);\n } catch (error) {\n const thrownError = error as Error;\n throw new DetailError(\n 'Failed to parse manifest data',\n typeof thrownError.stack,\n );\n }\n }\n\n try {\n assertPubManifestSchema(manifest);\n } catch (error) {\n Logger.logWarn(\n `Publication manifest validation failed. Processing continues, but some problems may occur.\\n${error}`,\n );\n }\n return {\n manifest: decodePublicationManifest(manifest),\n manifestUrl,\n };\n}\n\nexport type TocResourceTreeItem = {\n element: HTMLElement;\n label: HTMLElement;\n children?: TocResourceTreeItem[];\n};\nexport type TocResourceTreeRoot = {\n element: HTMLElement;\n heading?: HTMLElement;\n children: TocResourceTreeItem[];\n};\n\nexport function parseTocDocument(dom: JSDOM): TocResourceTreeRoot | null {\n const { document } = dom.window;\n\n const docTocEl = document.querySelectorAll('[role=\"doc-toc\"]');\n if (docTocEl.length === 0) {\n return null;\n }\n const tocRoot = docTocEl.item(0);\n\n const parseTocItem = (element: Element): TocResourceTreeItem | null => {\n if (element.tagName !== 'LI') {\n return null;\n }\n const label = element.children.item(0);\n const ol = element.children.item(1);\n if (!label || (label.tagName !== 'A' && label.tagName !== 'SPAN')) {\n return null;\n }\n if (!ol || ol.tagName !== 'OL') {\n return { element: element as HTMLElement, label: label as HTMLElement };\n }\n const children = Array.from(ol.children).reduce<\n TocResourceTreeItem[] | null\n >((acc, val) => {\n if (!acc) {\n return acc;\n }\n const res = parseTocItem(val);\n return res && [...acc, res];\n }, []);\n return (\n children && {\n element: element as HTMLElement,\n label: label as HTMLElement,\n children,\n }\n );\n };\n\n let heading: HTMLElement | undefined;\n for (let child of Array.from(tocRoot.children)) {\n if (child.tagName === 'OL') {\n const children = Array.from(child.children).reduce<\n TocResourceTreeItem[] | null\n >((acc, val) => {\n if (!acc) {\n return acc;\n }\n const res = parseTocItem(val);\n return res && [...acc, res];\n }, []);\n return children && { element: tocRoot as HTMLElement, heading, children };\n } else if (\n ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HGROUP'].includes(child.tagName)\n ) {\n heading = child as HTMLElement;\n } else {\n return null;\n }\n }\n return null;\n}\n\nexport type PageListResourceTreeItem = {\n element: HTMLElement;\n};\nexport type PageListResourceTreeRoot = {\n element: HTMLElement;\n heading?: HTMLElement;\n children: PageListResourceTreeItem[];\n};\n\nexport function parsePageListDocument(\n dom: JSDOM,\n): PageListResourceTreeRoot | null {\n const { document } = dom.window;\n\n const docPageListEl = document.querySelectorAll('[role=\"doc-pagelist\"]');\n if (docPageListEl.length === 0) {\n return null;\n }\n const pageListRoot = docPageListEl.item(0);\n\n let heading: HTMLElement | undefined;\n for (let child of Array.from(pageListRoot.children)) {\n if (child.tagName === 'OL') {\n const children = Array.from(child.children).reduce<\n PageListResourceTreeItem[] | null\n >((acc, element) => {\n return (\n acc &&\n (element.tagName === 'LI'\n ? [...acc, { element: element as HTMLElement }]\n : null)\n );\n }, []);\n return (\n children && { element: pageListRoot as HTMLElement, heading, children }\n );\n } else if (\n ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HGROUP'].includes(child.tagName)\n ) {\n heading = child as HTMLElement;\n } else {\n return null;\n }\n }\n return null;\n}\n","import type { JSDOM } from '@vivliostyle/jsdom';\nimport archiver from 'archiver';\nimport { lookup as lookupLanguage } from 'bcp-47-match';\nimport { XMLBuilder } from 'fast-xml-parser';\nimport { copy } from 'fs-extra/esm';\nimport GithubSlugger from 'github-slugger';\nimport { lookup as mime } from 'mime-types';\nimport fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport upath from 'upath';\nimport { v4 as uuid } from 'uuid';\nimport serializeToXml from 'w3c-xmlserializer';\nimport {\n EPUB_CONTAINER_XML,\n EPUB_LANDMARKS_COVER_ENTRY,\n EPUB_LANDMARKS_TITLE,\n EPUB_LANDMARKS_TOC_ENTRY,\n EPUB_NS,\n TOC_TITLE,\n XML_DECLARATION,\n} from '../const.js';\nimport { Logger } from '../logger.js';\nimport {\n PageListResourceTreeRoot,\n TocResourceTreeRoot,\n getJsdomFromUrlOrFile,\n parsePageListDocument,\n parseTocDocument,\n} from '../processor/html.js';\nimport type {\n Contributor,\n LocalizableStringObject,\n LocalizableStringOrObject,\n PublicationLinks,\n PublicationManifest,\n ResourceCategorization,\n} from '../schema/publication.schema.js';\nimport { DetailError, useTmpDirectory } from '../util.js';\n\ninterface ManifestEntry {\n href: string;\n mediaType: string;\n properties?: string;\n}\n\ninterface LandmarkEntry {\n type: string;\n href: string;\n text: string;\n}\n\ninterface SpineEntry {\n href: string;\n}\n\nconst TOC_ID = 'toc';\nconst LANDMARKS_ID = 'landmarks';\nconst PAGELIST_ID = 'page-list';\nconst COVER_IMAGE_MIMETYPES = [\n 'image/gif',\n 'image/jpeg',\n 'image/png',\n 'image/svg+xml',\n 'image/webp',\n];\n\nconst changeExtname = (filepath: string, newExt: string) => {\n let ext = upath.extname(filepath);\n return `${filepath.slice(0, -ext.length)}${newExt}`;\n};\n\nconst getRelativeHref = (target: string, baseUrl: string, rootUrl: string) => {\n const absBasePath = upath.join('/', baseUrl);\n const absRootPath = upath.join('/', rootUrl);\n const hrefUrl = new URL(encodeURI(target), pathToFileURL(absBasePath));\n if (hrefUrl.protocol !== 'file:') {\n return target;\n }\n if (/\\.html?$/.test(hrefUrl.pathname)) {\n hrefUrl.pathname = changeExtname(hrefUrl.pathname, '.xhtml');\n }\n const pathname = upath.posix.relative(\n pathToFileURL(upath.dirname(absRootPath)).pathname,\n hrefUrl.pathname,\n );\n return `${pathname}${hrefUrl.search}${hrefUrl.hash}`;\n};\n\nconst normalizeLocalizableString = (\n value: LocalizableStringOrObject | undefined,\n availableLanguages: string[],\n): string | undefined => {\n if (!value) {\n return;\n }\n const values = [value]\n .flat()\n .map((value) => (typeof value === 'string' ? { value } : value));\n const localizedValues = values.filter(\n (v): v is LocalizableStringObject & { language: string } => !!v.language,\n );\n const preferredLang = lookupLanguage(\n localizedValues.map((v) => v.language),\n availableLanguages,\n );\n if (preferredLang) {\n return localizedValues[\n localizedValues.findIndex((v) => v.language === preferredLang)\n ].value;\n }\n return values.find((v) => !v.language)?.value;\n};\n\nconst appendManifestProperty = (entry: ManifestEntry, newProperty: string) => {\n entry.properties = entry.properties\n ? Array.from(new Set([...entry.properties.split(' '), newProperty])).join(\n ' ',\n )\n : newProperty;\n};\n\nexport async function exportEpub({\n webpubDir,\n entryHtmlFile,\n manifest,\n relManifestPath,\n target,\n epubVersion,\n}: {\n webpubDir: string;\n entryHtmlFile?: string;\n manifest: PublicationManifest;\n relManifestPath?: string;\n target: string;\n epubVersion: '3.0';\n}) {\n Logger.debug('Export EPUB', {\n webpubDir,\n entryHtmlFile,\n relManifestPath,\n target,\n epubVersion,\n });\n\n const [tmpDir] = await useTmpDirectory();\n fs.mkdirSync(upath.join(tmpDir, 'META-INF'), { recursive: true });\n await copy(webpubDir, upath.join(tmpDir, 'EPUB'));\n\n const uid = `urn:uuid:${uuid()}`;\n const entryHtmlRelPath =\n entryHtmlFile &&\n upath.relative(webpubDir, upath.resolve(webpubDir, entryHtmlFile));\n\n const findPublicationLink = (\n relType: string,\n list?: ResourceCategorization,\n filter?: (e: PublicationLinks) => boolean,\n ) =>\n [list]\n .flat()\n .find(\n (e): e is PublicationLinks =>\n typeof e === 'object' && e.rel === relType && (!filter || filter(e)),\n );\n const tocResource = findPublicationLink('contents', [\n ...[manifest.readingOrder || []].flat(),\n ...[manifest.resources || []].flat(),\n ]);\n const pageListResource = findPublicationLink('pagelist', [\n ...[manifest.readingOrder || []].flat(),\n ...[manifest.resources || []].flat(),\n ]);\n // NOTE: EPUB allows one cover-image item unlike web publication\n // vivliostyle-cli takes the first cover resource.\n const pictureCoverResource = findPublicationLink(\n 'cover',\n manifest.resources,\n (e) =>\n COVER_IMAGE_MIMETYPES.includes(e.encodingFormat || mime(e.url) || ''),\n );\n const htmlCoverResource = findPublicationLink(\n 'cover',\n [\n ...[manifest.readingOrder || []].flat(),\n ...[manifest.resources || []].flat(),\n ],\n (e) => /\\.html?$/.test(e.url),\n );\n\n const manifestItem = [\n ...[manifest.links || []].flat(),\n ...[manifest.readingOrder || []].flat(),\n ...[manifest.resources || []].flat(),\n ].reduce(\n (acc, val) => {\n const { url, encodingFormat } =\n typeof val === 'string' ? ({ url: val } as PublicationLinks) : val;\n // Only accepts path-like url\n try {\n new URL(url);\n return acc;\n } catch (e) {\n /* NOOP */\n }\n if (!fs.existsSync(upath.join(tmpDir, 'EPUB', url))) {\n return acc;\n }\n const mediaType = encodingFormat || mime(url) || 'text/plain';\n acc[url] = {\n href: url,\n mediaType,\n };\n if (/\\.html?$/.test(url)) {\n acc[url].href = changeExtname(url, '.xhtml');\n acc[url].mediaType = 'application/xhtml+xml';\n }\n if (url === pictureCoverResource?.url) {\n acc[url].properties = 'cover-image';\n }\n return acc;\n },\n {} as Record<string, ManifestEntry>,\n );\n\n const htmlFiles = Object.keys(manifestItem).filter((url) =>\n /\\.html?$/.test(url),\n );\n let tocHtml = htmlFiles.find((f) => f === tocResource?.url);\n const readingOrder = [manifest.readingOrder || entryHtmlRelPath]\n .flat()\n .flatMap((v) => (v ? (typeof v === 'string' ? { url: v } : v) : []));\n if (!tocHtml) {\n Logger.logWarn(\n 'No table of contents document was found. for EPUB output, we recommend to enable `toc` option in your Vivliostyle config file to generate a table of contents document.',\n );\n tocHtml =\n htmlFiles.find((f) => f === entryHtmlRelPath) || readingOrder[0].url;\n }\n const spineItems = readingOrder.map<SpineEntry>(({ url }) => ({\n href: changeExtname(url, '.xhtml'),\n }));\n if (!(tocHtml in manifestItem)) {\n manifestItem[tocHtml] = {\n href: changeExtname(tocHtml, '.xhtml'),\n mediaType: 'application/xhtml+xml',\n };\n }\n appendManifestProperty(manifestItem[tocHtml], 'nav');\n\n const landmarks: LandmarkEntry[] = [\n {\n type: 'toc',\n href: `${manifestItem[tocHtml].href}#${TOC_ID}`,\n text: EPUB_LANDMARKS_TOC_ENTRY,\n },\n ];\n if (htmlCoverResource) {\n landmarks.push({\n type: 'cover',\n href: changeExtname(htmlCoverResource.url, '.xhtml'),\n text: EPUB_LANDMARKS_COVER_ENTRY,\n });\n }\n\n const contextDir = upath.join(tmpDir, 'EPUB');\n type XhtmlEntry = Resolved<ReturnType<typeof transpileHtmlToXhtml>>;\n const processHtml = async (target: string) => {\n let parseResult: XhtmlEntry;\n try {\n parseResult = await transpileHtmlToXhtml({\n target,\n contextDir,\n });\n } catch (error) {\n const thrownError = error as Error;\n throw new DetailError(\n `Failed to transpile document to XHTML: ${target}`,\n thrownError.stack ?? thrownError.message,\n );\n }\n if (parseResult.hasMathmlContent) {\n appendManifestProperty(manifestItem[target], 'mathml');\n }\n if (parseResult.hasRemoteResources) {\n appendManifestProperty(manifestItem[target], 'remote-resources');\n }\n if (parseResult.hasScriptedContent) {\n appendManifestProperty(manifestItem[target], 'scripted');\n }\n if (parseResult.hasSvgContent) {\n appendManifestProperty(manifestItem[target], 'svg');\n }\n return parseResult;\n };\n\n const processResult: Record<string, XhtmlEntry> = {};\n Logger.debug(`Transpiling ToC HTML to XHTML: ${tocHtml}`);\n processResult[tocHtml] = await processHtml(tocHtml);\n for (const target of htmlFiles.filter((f) => f !== tocHtml)) {\n Logger.debug(`Transpiling HTML to XHTML: ${target}`);\n processResult[target] = await processHtml(target);\n }\n\n // Process ToC document\n const { document: entryDocument } = processResult[tocHtml].dom.window;\n const docLanguages = [manifest.inLanguage]\n .flat()\n .filter((v): v is string => Boolean(v));\n if (docLanguages.length === 0) {\n docLanguages.push(entryDocument.documentElement.lang || 'en');\n }\n const docTitle =\n normalizeLocalizableString(manifest.name, docLanguages) ||\n entryDocument.title;\n if (!docTitle) {\n throw new Error('EPUB must have a title of one or more characters');\n }\n const { tocResourceTree } = await processTocDocument({\n dom: processResult[tocHtml].dom,\n target: tocHtml,\n contextDir,\n readingOrder,\n docLanguages,\n landmarks,\n });\n\n // Process PageList document\n const pageListHtml = pageListResource?.url || entryHtmlRelPath;\n if (pageListHtml && pageListHtml in processResult) {\n await processPagelistDocument({\n dom: processResult[pageListHtml].dom,\n target: pageListHtml,\n contextDir,\n });\n }\n\n if (relManifestPath) {\n await fs.promises.rm(upath.join(tmpDir, 'EPUB', relManifestPath), {\n force: true,\n recursive: true,\n });\n delete manifestItem[relManifestPath];\n }\n\n // META-INF/container.xml\n fs.writeFileSync(\n upath.join(tmpDir, 'META-INF/container.xml'),\n EPUB_CONTAINER_XML,\n 'utf8',\n );\n\n // EPUB/content.opf\n Logger.debug(`Generating content.opf`);\n fs.writeFileSync(\n upath.join(tmpDir, 'EPUB/content.opf'),\n buildEpubPackageDocument({\n epubVersion,\n uid,\n docTitle,\n docLanguages,\n manifest,\n spineItems,\n manifestItems: Object.values(manifestItem),\n }),\n 'utf8',\n );\n\n await compressEpub({ target, sourceDir: tmpDir });\n}\n\nasync function writeAsXhtml(dom: JSDOM, absPath: string) {\n const xhtml = `${XML_DECLARATION}\\n${serializeToXml(dom.window.document)}`;\n await fs.promises.writeFile(changeExtname(absPath, '.xhtml'), xhtml, 'utf8');\n}\n\nasync function transpileHtmlToXhtml({\n target,\n contextDir,\n}: {\n target: string;\n contextDir: string;\n}): Promise<{\n dom: JSDOM;\n hasMathmlContent: boolean;\n hasRemoteResources: boolean;\n hasScriptedContent: boolean;\n hasSvgContent: boolean;\n}> {\n const absPath = upath.join(contextDir, target);\n const dom = await getJsdomFromUrlOrFile({ src: absPath });\n const { document } = dom.window;\n // `xmlns` will be supplied in later serialization process\n document.documentElement.removeAttribute('xmlns');\n document.documentElement.setAttribute('xmlns:epub', EPUB_NS);\n\n document.querySelectorAll('a[href]').forEach((el) => {\n const href = decodeURI(el.getAttribute('href')!);\n el.setAttribute('href', getRelativeHref(href, target, target));\n });\n\n await writeAsXhtml(dom, absPath);\n await fs.promises.unlink(absPath);\n return {\n dom,\n // FIXME: Yes, I recognize this implementation is inadequate.\n hasMathmlContent: !!document.querySelector('math'),\n hasRemoteResources: !!document.querySelector(\n '[src^=\"http://\"], [src^=\"https://\"]',\n ),\n hasScriptedContent: !!document.querySelector('script, form'),\n hasSvgContent: !!document.querySelector('svg'),\n };\n}\n\nfunction replaceWithNavElement(dom: JSDOM, el: Element) {\n const nav = dom.window.document.createElement('nav');\n while (el.firstChild) {\n nav.appendChild(el.firstChild);\n }\n for (let i = 0; i < el.attributes.length; i++) {\n nav.attributes.setNamedItem(el.attributes[i].cloneNode() as Attr);\n }\n el.parentNode?.replaceChild(nav, el);\n return nav;\n}\n\nasync function processTocDocument({\n dom,\n target,\n contextDir,\n readingOrder,\n docLanguages,\n landmarks,\n}: {\n dom: JSDOM;\n target: string;\n contextDir: string;\n readingOrder: PublicationLinks[];\n docLanguages: string[];\n landmarks: LandmarkEntry[];\n}): Promise<{ tocResourceTree: TocResourceTreeRoot | null }> {\n const { document } = dom.window;\n\n let tocResourceTree: TocResourceTreeRoot | null = null;\n if (!document.querySelector('nav[epub:type]')) {\n tocResourceTree = parseTocDocument(dom);\n if (tocResourceTree) {\n const nav = replaceWithNavElement(dom, tocResourceTree.element);\n nav.setAttribute('id', TOC_ID);\n nav.setAttribute('epub:type', 'toc');\n } else {\n Logger.debug(`Generating toc nav element: ${target}`);\n\n const nav = document.createElement('nav');\n nav.setAttribute('id', TOC_ID);\n nav.setAttribute('role', 'doc-toc');\n nav.setAttribute('epub:type', 'toc');\n nav.setAttribute('hidden', '');\n const h2 = document.createElement('h2');\n h2.textContent = TOC_TITLE;\n nav.appendChild(h2);\n const ol = document.createElement('ol');\n tocResourceTree = {\n element: nav,\n children: [],\n };\n\n for (const content of readingOrder) {\n let name = normalizeLocalizableString(content.name, docLanguages);\n if (!name) {\n const dom = await getJsdomFromUrlOrFile({\n src: upath.join(contextDir, changeExtname(content.url, '.xhtml')),\n });\n name = dom.window.document.title;\n }\n const li = document.createElement('li');\n const a = document.createElement('a');\n a.textContent = name;\n a.href = getRelativeHref(content.url, '', target);\n li.appendChild(a);\n ol.appendChild(li);\n tocResourceTree.children.push({ element: li, label: a });\n }\n\n nav.appendChild(ol);\n document.body.appendChild(nav);\n Logger.debug('Generated toc nav element', nav.outerHTML);\n }\n\n if (landmarks.length > 0) {\n Logger.debug(`Generating landmark nav element: ${target}`);\n const nav = document.createElement('nav');\n nav.setAttribute('epub:type', 'landmarks');\n nav.setAttribute('id', LANDMARKS_ID);\n nav.setAttribute('hidden', '');\n const h2 = document.createElement('h2');\n h2.textContent = EPUB_LANDMARKS_TITLE;\n nav.appendChild(h2);\n const ol = document.createElement('ol');\n for (const { type, href, text } of landmarks) {\n const li = document.createElement('li');\n const a = document.createElement('a');\n a.setAttribute('epub:type', type);\n a.setAttribute('href', getRelativeHref(href, '', target));\n a.text = text;\n li.appendChild(a);\n ol.appendChild(li);\n }\n nav.appendChild(ol);\n document.body.appendChild(nav);\n Logger.debug('Generated landmark nav element', nav.outerHTML);\n }\n }\n\n // Remove a publication manifest linked to ToC html.\n // When converting to EPUB, HTML files are converted to XHTML files\n // and no longer conform to Web publication, so we need to\n // explicitly remove the publication manifest.\n const publicationLinkEl = document.querySelector(\n 'link[href][rel=\"publication\"]',\n );\n if (publicationLinkEl) {\n const href = publicationLinkEl.getAttribute('href')!.trim();\n if (href.startsWith('#')) {\n const scriptEl = document.getElementById(href.slice(1));\n if (scriptEl?.getAttribute('type') === 'application/ld+json') {\n scriptEl.parentNode?.removeChild(scriptEl);\n }\n }\n publicationLinkEl.parentNode?.removeChild(publicationLinkEl);\n }\n\n const absPath = upath.join(contextDir, target);\n await writeAsXhtml(dom, absPath);\n return { tocResourceTree };\n}\n\nasync function processPagelistDocument({\n dom,\n target,\n contextDir,\n}: {\n dom: JSDOM;\n target: string;\n contextDir: string;\n}): Promise<{ pageListResourceTree: PageListResourceTreeRoot | null }> {\n const pageListResourceTree = parsePageListDocument(dom);\n if (pageListResourceTree) {\n const nav = replaceWithNavElement(dom, pageListResourceTree.element);\n nav.setAttribute('id', PAGELIST_ID);\n nav.setAttribute('epub:type', 'page-list');\n }\n\n const absPath = upath.join(contextDir, target);\n await writeAsXhtml(dom, absPath);\n return { pageListResourceTree };\n}\n\nfunction buildEpubPackageDocument({\n epubVersion,\n manifest,\n uid,\n docTitle,\n docLanguages,\n spineItems,\n manifestItems,\n}: Pick<Parameters<typeof exportEpub>[0], 'epubVersion'> & {\n manifest: PublicationManifest;\n uid: string;\n docTitle: string;\n docLanguages: string[];\n spineItems: SpineEntry[];\n manifestItems: ManifestEntry[];\n}): string {\n const slugger = new GithubSlugger();\n slugger.reset();\n\n const bookIdentifier = slugger.slug('bookid');\n const normalizeDate = (value: string | number | undefined) =>\n value && `${new Date(value).toISOString().split('.')[0]}Z`;\n\n const transformToGenericTextNode = <T = {}>(value: unknown, attributes?: T) =>\n [value]\n .flat()\n .filter(Boolean)\n .map((v) => ({ ...(attributes || {}), '#text': `${value}` }));\n const transformContributor = (\n contributorMap: Record<string, Contributor | undefined>,\n ) =>\n Object.entries(contributorMap).flatMap(([type, contributor]) =>\n contributor\n ? [contributor].flat().map((entry, index) => ({\n _id: slugger.slug(`${type}-${index + 1}`),\n '#text':\n typeof entry === 'string'\n ? entry\n : normalizeLocalizableString(entry.name, docLanguages),\n }))\n : [],\n );\n\n const itemIdMap = new Map<string, string>();\n manifestItems.forEach(({ href }) => {\n itemIdMap.set(href, slugger.slug(href));\n });\n\n const builder = new XMLBuilder({\n format: true,\n ignoreAttributes: false,\n attributeNamePrefix: '_',\n });\n return builder.build({\n '?xml': {\n _version: '1.0',\n _encoding: 'UTF-8',\n },\n package: {\n _xmlns: 'http://www.idpf.org/2007/opf',\n _version: epubVersion,\n '_unique-identifier': bookIdentifier,\n '_xml:lang': docLanguages[0],\n metadata: {\n '_xmlns:dc': 'http://purl.org/dc/elements/1.1/',\n 'dc:identifier': {\n _id: bookIdentifier,\n '#text': uid,\n },\n 'dc:title': docTitle,\n 'dc:language': docLanguages,\n 'dc:creator': transformContributor({\n // TODO: Define proper order\n author: manifest.author,\n creator: manifest.creator,\n editor: manifest.editor,\n artist: manifest.artist,\n illustrator: manifest.illustrator,\n colorist: manifest.colorist,\n penciler: manifest.penciler,\n inker: manifest.inker,\n letterer: manifest.letterer,\n translator: manifest.translator,\n readBy: manifest.readBy,\n }),\n 'dc:publisher': transformContributor({\n publisher: manifest.publisher,\n }),\n 'dc:contributor': transformContributor({\n contributor: manifest.contributor,\n }),\n 'dc:date': transformToGenericTextNode(\n normalizeDate(manifest.datePublished),\n ),\n 'dc:rights': transformToGenericTextNode(\n manifest.copyrightHolder &&\n `© ${manifest.copyrightYear ? `${manifest.copyrightYear} ` : ''}${\n manifest.copyrightHolder\n }`,\n ),\n 'dc:subject': transformToGenericTextNode(\n manifest['dc:subject'] || manifest.subject,\n ),\n meta: [\n ...transformToGenericTextNode(\n normalizeDate(manifest.dateModified || Date.now()),\n {\n _property: 'dcterms:modified',\n },\n ),\n ...(() => {\n const coverImage = manifestItems.find(\n (it) => it.properties === 'cover-image',\n );\n return coverImage\n ? [{ _name: 'cover', _content: itemIdMap.get(coverImage.href) }]\n : [];\n })(),\n ],\n },\n manifest: {\n item: manifestItems.map(({ href, mediaType, properties }) => ({\n _id: itemIdMap.get(href),\n _href: encodeURI(href),\n '_media-type': mediaType,\n ...(properties ? { _properties: properties } : {}),\n })),\n },\n spine: {\n ...(manifest.readingProgression\n ? { '_page-progression-direction': manifest.readingProgression }\n : {}),\n itemref: [\n ...spineItems.map(({ href }) => ({\n _idref: itemIdMap.get(href),\n })),\n ],\n },\n },\n });\n}\n\nasync function compressEpub({\n target,\n sourceDir,\n}: {\n target: string;\n sourceDir: string;\n}): Promise<void> {\n Logger.debug(`Compressing EPUB: ${target}`);\n const output = fs.createWriteStream(target);\n const archive = archiver('zip', {\n zlib: { level: 9 }, // Compression level\n });\n return new Promise((resolve, reject) => {\n output.on('close', () => {\n Logger.debug(`Compressed EPUB: ${target}`);\n resolve();\n });\n output.on('error', reject);\n archive.on('warning', reject);\n archive.on('error', reject);\n archive.pipe(output);\n\n archive.append('application/epub+zip', {\n name: 'mimetype',\n // mimetype should not be compressed\n // https://www.w3.org/TR/epub-33/#sec-zip-container-mime\n store: true,\n });\n archive.directory(upath.join(sourceDir, 'META-INF'), 'META-INF');\n archive.directory(upath.join(sourceDir, 'EPUB'), 'EPUB');\n archive.finalize();\n });\n}\n","import Arborist from '@npmcli/arborist';\nimport fs from 'node:fs';\nimport { ResolvedTaskConfig } from '../config/resolve.js';\nimport { DetailError } from '../util.js';\n\nexport async function checkThemeInstallationNecessity({\n themesDir,\n themeIndexes,\n}: Pick<ResolvedTaskConfig, 'themesDir' | 'themeIndexes'>): Promise<boolean> {\n if (!fs.existsSync(themesDir)) {\n return [...themeIndexes].some((theme) => theme.type === 'package');\n }\n\n const commonOpt = {\n path: themesDir,\n lockfileVersion: 3,\n };\n const arb = new Arborist(commonOpt);\n const tree = await arb.loadActual();\n const pkgs = Array.from(tree.children.keys());\n return [...themeIndexes].some(\n (theme) => theme.type === 'package' && !pkgs.includes(theme.name),\n );\n}\n\nexport async function installThemeDependencies({\n themesDir,\n themeIndexes,\n}: Pick<ResolvedTaskConfig, 'themesDir' | 'themeIndexes'>): Promise<void> {\n fs.mkdirSync(themesDir, { recursive: true });\n\n try {\n const commonOpt = {\n path: themesDir,\n lockfileVersion: 3,\n };\n const tree = await new Arborist(commonOpt).buildIdealTree();\n const existing = Array.from(tree.children.keys());\n const add = [\n ...new Set(\n [...themeIndexes].flatMap((theme) =>\n theme.type === 'package' ? [theme.specifier] : [],\n ),\n ),\n ];\n const rm = existing.filter((v) => !add.includes(v));\n\n // Install dependencies\n const opt = { ...commonOpt, rm, add };\n const arb = new Arborist(opt);\n await arb.reify(opt);\n\n return;\n } catch (error) {\n const thrownError = error as Error;\n throw new DetailError(\n 'An error occurred during the installation of the theme',\n thrownError.stack ?? thrownError.message,\n );\n }\n}\n","import { ResolvedConfig as ResolvedViteConfig } from 'vite';\nimport { setupConfigFromFlags } from '../commands/cli-flags.js';\nimport { loadVivliostyleConfig } from '../config/load.js';\nimport { mergeConfig, mergeInlineConfig } from '../config/merge.js';\nimport { ResolvedTaskConfig, resolveTaskConfig } from '../config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from '../config/schema.js';\n\nconst headStartTagRe = /<head[^>]*>/i;\nexport const prependToHead = (html: string, content: string) =>\n html.replace(headStartTagRe, (match) => `${match}\\n${content}`);\n\nexport async function reloadConfig(\n prevConfig: ResolvedTaskConfig,\n inlineConfig: ParsedVivliostyleInlineConfig,\n resolvedViteConfig?: ResolvedViteConfig,\n) {\n let config =\n (await loadVivliostyleConfig(inlineConfig)) ??\n setupConfigFromFlags(inlineConfig);\n config = mergeInlineConfig(config, inlineConfig);\n config = mergeConfig(config, {\n temporaryFilePrefix: prevConfig.temporaryFilePrefix,\n server: resolvedViteConfig?.server,\n });\n const taskConfig = resolveTaskConfig(config.tasks[0], config.inlineOptions);\n return taskConfig;\n}\n","import sirv from 'sirv';\nimport upath from 'upath';\nimport * as vite from 'vite';\nimport { ResolvedTaskConfig } from '../config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from '../config/schema.js';\n\nexport function vsStaticServePlugin({\n config: _config,\n inlineConfig,\n}: {\n config: ResolvedTaskConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n}): vite.Plugin {\n let config = _config;\n\n const createMiddlewares = () => {\n if (typeof config.serverRootDir !== 'string') {\n return [];\n }\n return Object.entries(config.static).flatMap(([base, dirs]) =>\n dirs.map(\n (dir) =>\n [\n base,\n sirv(upath.resolve(config.serverRootDir, dir), {\n dev: true,\n etag: false,\n }),\n ] as const,\n ),\n );\n };\n\n return {\n name: 'vivliostyle:static-serve',\n apply: () => Boolean(inlineConfig.enableStaticServe),\n configureServer(viteServer) {\n return () => {\n createMiddlewares().forEach(([base, middleware]) => {\n viteServer.middlewares.use(base, middleware);\n });\n };\n },\n\n configurePreviewServer(viteServer) {\n return () => {\n createMiddlewares().forEach(([base, middleware]) => {\n viteServer.middlewares.use(base, middleware);\n });\n };\n },\n };\n}\n","import { NextHandleFunction } from 'connect';\nimport fs from 'node:fs';\nimport sirv from 'sirv';\nimport upath from 'upath';\nimport * as vite from 'vite';\nimport { ResolvedTaskConfig } from '../config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from '../config/schema.js';\nimport { VIEWER_ROOT_PATH, viewerRoot } from '../const.js';\nimport { prependToHead } from './plugin-util.js';\n\nconst viewerClientId = '@vivliostyle:viewer:client';\nconst viewerClientRequestPath = `/${viewerClientId}`;\nconst viewerClientContent = /* js */ `\nif (import.meta.hot) {\n import.meta.hot.on('vite:beforeFullReload', (e) => {\n location.reload();\n });\n}`;\n\nexport function vsViewerPlugin(_: {\n config: ResolvedTaskConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n}): vite.Plugin {\n const serveRootDir = upath.join(viewerRoot, 'lib');\n const serve = sirv(serveRootDir, { dev: false, etag: true });\n let cachedIndexHtml: string;\n\n const middleware = async function vivliostyleViewerMiddleware(\n req,\n res,\n next,\n ) {\n if (req.url === '/' || req.url === '/index.html') {\n cachedIndexHtml ??= prependToHead(\n fs.readFileSync(upath.join(serveRootDir, 'index.html'), 'utf-8'),\n `<script type=\"module\" src=\"${viewerClientRequestPath}\"></script>`,\n );\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html;charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache');\n return res.end(cachedIndexHtml);\n } else {\n return serve(req, res, next);\n }\n } satisfies NextHandleFunction;\n\n return {\n name: 'vivliostyle:viewer',\n config() {\n return {\n optimizeDeps: {\n exclude: ['@vivliostyle/viewer'],\n },\n } satisfies vite.UserConfig;\n },\n configureServer(viteServer) {\n viteServer.middlewares.use(VIEWER_ROOT_PATH, middleware);\n },\n configurePreviewServer(viteServer) {\n viteServer.middlewares.use(VIEWER_ROOT_PATH, serve);\n },\n load(id) {\n if (id === viewerClientRequestPath) {\n return viewerClientContent;\n }\n },\n };\n}\n","import * as vite from 'vite';\nimport { launchPreview } from '../browser.js';\nimport { ResolvedTaskConfig } from '../config/resolve.js';\nimport { ParsedVivliostyleInlineConfig } from '../config/schema.js';\nimport { getViewerFullUrl } from '../server.js';\nimport { runExitHandlers } from '../util.js';\nimport { reloadConfig } from './plugin-util.js';\n\nexport function vsBrowserPlugin({\n config: _config,\n inlineConfig,\n}: {\n config: ResolvedTaskConfig;\n inlineConfig: ParsedVivliostyleInlineConfig;\n}): vite.Plugin {\n let config = _config;\n let server: vite.ViteDevServer | undefined;\n let closeBrowser: (() => void) | undefined;\n\n async function handlePageClose() {\n await server?.close();\n runExitHandlers();\n }\n\n async function openPreviewPage() {\n const url = await getViewerFullUrl(config);\n const { page, browser } = await launchPreview({\n mode: 'preview',\n url,\n config,\n onPageOpen: async (page) => {\n // Terminate preview when the previewing page is closed\n page.on('close', handlePageClose);\n\n // Vivliostyle Viewer uses `i18nextLng` in localStorage for UI language\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n await page.addInitScript(\n `window.localStorage.setItem('i18nextLng', '${locale}');`,\n );\n },\n });\n\n // Move focus from the address bar to the page\n await page.bringToFront();\n // Focus to the URL input box if available\n await page.locator('#vivliostyle-input-url').focus({ timeout: 0 });\n\n closeBrowser = () => {\n page.off('close', handlePageClose);\n browser.close();\n };\n }\n\n return {\n name: 'vivliostyle:browser',\n apply: () => Boolean(inlineConfig.openViewer),\n configureServer(viteServer) {\n server = viteServer;\n\n const _listen = viteServer.listen;\n viteServer.listen = async (...args) => {\n const server = await _listen(...args);\n config = await reloadConfig(config, inlineConfig, server.config);\n await openPreviewPage();\n return server;\n };\n },\n closeBundle() {\n closeBrowser?.();\n },\n };\n}\n"],"mappings":"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","names":["require","cwd","fs","pathToFileURL","upath","fs","cwd","upath","fs","pathToFileURL","fs","fs","_","fs","URL","upath","pathToFileURL","upath","fs","upath","cwd","upath","fs","copy","fs","upath","serializeToXml","MIMEType","copy","mime","fs","pathToFileURL","glob","upath","fileURLToPath","pathToFileURL","upath","upath","pathToFileURL","fileURLToPath","copy","mime","fs","pathToFileURL","upath","upath","pathToFileURL","value","v","fs","copy","mime","target","dom","fs","ret","mime","upath","pathToFileURL","pathContains","v","glob","copy","fs","fs","v","upath","fs","copy","vfile","MIMEType","serializeToXml","cwd","upath","pathToFileURL","entry","next","sirv","upath","fs","sirv","upath","upath","sirv","fs","upath","fs","URL","page","server"]}
|