@vivliostyle/cli 10.3.1 → 10.4.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.
Files changed (46) hide show
  1. package/dist/{chunk-MU7JCDMK.js → chunk-4DTPH2XX.js} +2 -2
  2. package/dist/{chunk-PYPAYBFL.js → chunk-DEJL63H2.js} +29 -22
  3. package/dist/chunk-DEJL63H2.js.map +1 -0
  4. package/dist/{chunk-OAFXM4ES.js → chunk-DK3HFVHX.js} +27 -51
  5. package/dist/chunk-DK3HFVHX.js.map +1 -0
  6. package/dist/{chunk-7GIJVX4M.js → chunk-J2YGULSR.js} +45 -7
  7. package/dist/chunk-J2YGULSR.js.map +1 -0
  8. package/dist/{chunk-ERDN47XG.js → chunk-L4PJ2SP3.js} +17 -13
  9. package/dist/chunk-L4PJ2SP3.js.map +1 -0
  10. package/dist/{chunk-LWMSAGHL.js → chunk-LE3QOQ5F.js} +11 -9
  11. package/dist/{chunk-LWMSAGHL.js.map → chunk-LE3QOQ5F.js.map} +1 -1
  12. package/dist/{chunk-C4HQHRXQ.js → chunk-P33ELNYE.js} +323 -379
  13. package/dist/chunk-P33ELNYE.js.map +1 -0
  14. package/dist/chunk-Q4EIXB5V.js +330 -0
  15. package/dist/chunk-Q4EIXB5V.js.map +1 -0
  16. package/dist/{chunk-LGOHUEEQ.js → chunk-RLV2H3QB.js} +11 -11
  17. package/dist/chunk-RLV2H3QB.js.map +1 -0
  18. package/dist/{chunk-DBK27BAR.js → chunk-VAPIKX4A.js} +300 -502
  19. package/dist/chunk-VAPIKX4A.js.map +1 -0
  20. package/dist/cli.js +2 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/build.js +10 -9
  23. package/dist/commands/build.js.map +1 -1
  24. package/dist/commands/create.js +7 -6
  25. package/dist/commands/create.js.map +1 -1
  26. package/dist/commands/init.js +7 -6
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/preview.js +9 -8
  29. package/dist/commands/preview.js.map +1 -1
  30. package/dist/config/schema.d.ts +13247 -1767
  31. package/dist/config/schema.js +7 -2
  32. package/dist/constants.d.ts +250 -0
  33. package/dist/constants.js +60 -0
  34. package/dist/constants.js.map +1 -0
  35. package/dist/index.js +13 -12
  36. package/dist/index.js.map +1 -1
  37. package/dist/vite-adapter.js +6 -5
  38. package/package.json +15 -11
  39. package/dist/chunk-7GIJVX4M.js.map +0 -1
  40. package/dist/chunk-C4HQHRXQ.js.map +0 -1
  41. package/dist/chunk-DBK27BAR.js.map +0 -1
  42. package/dist/chunk-ERDN47XG.js.map +0 -1
  43. package/dist/chunk-LGOHUEEQ.js.map +0 -1
  44. package/dist/chunk-OAFXM4ES.js.map +0 -1
  45. package/dist/chunk-PYPAYBFL.js.map +0 -1
  46. /package/dist/{chunk-MU7JCDMK.js.map → chunk-4DTPH2XX.js.map} +0 -0
@@ -0,0 +1,330 @@
1
+ import {
2
+ VivliostyleConfigSchema,
3
+ VivliostyleInlineConfig
4
+ } from "./chunk-J2YGULSR.js";
5
+ import {
6
+ DetailError,
7
+ Logger,
8
+ cwd,
9
+ parseJsonc,
10
+ pathContains,
11
+ pathEquals,
12
+ prettifySchemaError
13
+ } from "./chunk-VAPIKX4A.js";
14
+ import {
15
+ EMPTY_DATA_URI
16
+ } from "./chunk-DK3HFVHX.js";
17
+
18
+ // src/commands/cli-flags.ts
19
+ import "commander";
20
+ import * as v from "valibot";
21
+ function createParserProgram({
22
+ setupProgram,
23
+ parseArgs
24
+ }) {
25
+ return (argv) => {
26
+ const program = setupProgram();
27
+ program.parse(argv);
28
+ let options = program.opts();
29
+ options = parseArgs?.(options, program.args ?? []) || options;
30
+ options = warnDeprecatedFlags(options);
31
+ return v.parse(VivliostyleInlineConfig, options);
32
+ };
33
+ }
34
+ function setupConfigFromFlags(flags) {
35
+ if (!flags.input) {
36
+ if (flags.enableViewerStartPage) {
37
+ return {
38
+ tasks: [{ entry: [] }],
39
+ inlineOptions: {
40
+ input: { format: "webbook", entry: EMPTY_DATA_URI }
41
+ }
42
+ };
43
+ } else {
44
+ throw new Error(
45
+ "No input is set. Please set an appropriate entry or a Vivliostyle config file."
46
+ );
47
+ }
48
+ }
49
+ return {
50
+ tasks: [{ entry: [] }],
51
+ inlineOptions: { ...flags }
52
+ };
53
+ }
54
+ function warnDeprecatedFlags(options) {
55
+ const modifiedOptions = { ...options };
56
+ return modifiedOptions;
57
+ }
58
+
59
+ // src/config/load.ts
60
+ import fs from "node:fs";
61
+ import { createRequire } from "node:module";
62
+ import { pathToFileURL } from "node:url";
63
+ import upath from "upath";
64
+ import * as v2 from "valibot";
65
+ var require2 = createRequire(import.meta.url);
66
+ function locateVivliostyleConfig({
67
+ config,
68
+ cwd: cwd2 = cwd
69
+ }) {
70
+ if (config) {
71
+ return upath.resolve(cwd2, config);
72
+ }
73
+ return [".js", ".mjs", ".cjs", ".ts", ".mts", ".cts", ".json"].map((ext) => upath.join(cwd2, `vivliostyle.config${ext}`)).find((p) => fs.existsSync(p));
74
+ }
75
+ async function loadVivliostyleConfig({
76
+ config,
77
+ configData,
78
+ cwd: cwd2
79
+ }) {
80
+ if (configData) {
81
+ return v2.parse(VivliostyleConfigSchema, configData);
82
+ }
83
+ const absPath = locateVivliostyleConfig({ config, cwd: cwd2 });
84
+ if (!absPath) {
85
+ return;
86
+ }
87
+ let parsedConfig;
88
+ let jsonRaw;
89
+ try {
90
+ if (upath.extname(absPath) === ".json") {
91
+ jsonRaw = fs.readFileSync(absPath, "utf8");
92
+ parsedConfig = parseJsonc(jsonRaw);
93
+ } else {
94
+ delete require2.cache[require2.resolve(absPath)];
95
+ const url = pathToFileURL(absPath);
96
+ url.search = `version=${Date.now()}`;
97
+ parsedConfig = (await import(
98
+ /* @vite-ignore */
99
+ url.href
100
+ )).default;
101
+ jsonRaw = JSON.stringify(parsedConfig, null, 2);
102
+ }
103
+ } catch (error) {
104
+ const thrownError = error;
105
+ throw new DetailError(
106
+ `An error occurred on loading a config file: ${absPath}`,
107
+ thrownError.stack ?? thrownError.message
108
+ );
109
+ }
110
+ const result = v2.safeParse(VivliostyleConfigSchema, parsedConfig);
111
+ if (result.success) {
112
+ const { tasks, inlineOptions } = result.output;
113
+ return {
114
+ tasks,
115
+ inlineOptions: {
116
+ ...inlineOptions,
117
+ cwd: cwd2 ?? cwd,
118
+ config: absPath
119
+ }
120
+ };
121
+ } else {
122
+ const errorString = prettifySchemaError(jsonRaw, result.issues);
123
+ throw new DetailError(
124
+ `Validation of vivliostyle config failed. Please check the schema: ${config}`,
125
+ errorString
126
+ );
127
+ }
128
+ }
129
+ function warnDeprecatedConfig(config) {
130
+ if (config.tasks.some((task) => task.includeAssets)) {
131
+ Logger.logWarn(
132
+ "'includeAssets' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'copyAsset.includes' property instead."
133
+ );
134
+ }
135
+ if (config.tasks.some((task) => task.tocTitle)) {
136
+ Logger.logWarn(
137
+ "'tocTitle' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'toc.title' property instead."
138
+ );
139
+ }
140
+ if (config.tasks.some((task) => task.http)) {
141
+ Logger.logWarn(
142
+ "'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."
143
+ );
144
+ }
145
+ if (config.tasks.some((task) => task.pressReady !== void 0)) {
146
+ Logger.logWarn(
147
+ `'pressReady' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflight: "press-ready"' property instead.`
148
+ );
149
+ }
150
+ if (config.tasks.some(
151
+ (task) => task.output && [task.output].flat().some((o) => o.preflight)
152
+ )) {
153
+ Logger.logWarn(
154
+ "'preflight' property of output config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflight' property instead."
155
+ );
156
+ }
157
+ if (config.tasks.some(
158
+ (task) => task.output && [task.output].flat().some((o) => o.preflightOption)
159
+ )) {
160
+ Logger.logWarn(
161
+ "'preflightOption' property of output config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflightOption' property instead."
162
+ );
163
+ }
164
+ }
165
+
166
+ // src/processor/asset.ts
167
+ import { copy } from "fs-extra/esm";
168
+ import fs2 from "node:fs";
169
+ import picomatch from "picomatch";
170
+ import { glob } from "tinyglobby";
171
+ import upath2 from "upath";
172
+ var GlobMatcher = class {
173
+ matcherConfig;
174
+ #_matchers;
175
+ constructor(matcherConfig) {
176
+ this.matcherConfig = matcherConfig;
177
+ this.#_matchers = matcherConfig.map(
178
+ ({ patterns, ...options }) => picomatch(patterns, options)
179
+ );
180
+ }
181
+ match(test) {
182
+ return this.#_matchers.some((matcher) => matcher(test));
183
+ }
184
+ async glob(globOptions = {}) {
185
+ return new Set(
186
+ (await Promise.all(
187
+ this.matcherConfig.map(
188
+ (config) => glob({ ...config, ...globOptions })
189
+ )
190
+ )).flat()
191
+ );
192
+ }
193
+ };
194
+ function getIgnoreThemeDirectoryPatterns({
195
+ themesDir,
196
+ cwd: cwd2
197
+ }) {
198
+ return pathContains(cwd2, themesDir) ? [
199
+ `${upath2.relative(cwd2, themesDir)}/node_modules/*/example`,
200
+ `${upath2.relative(cwd2, themesDir)}/node_modules/*/*/example`
201
+ ] : [];
202
+ }
203
+ function getIgnoreAssetPatterns({
204
+ outputs,
205
+ entries,
206
+ cwd: cwd2
207
+ }) {
208
+ return [
209
+ ...outputs.flatMap(
210
+ ({ format, path: p }) => !pathContains(cwd2, p) ? [] : format === "webpub" ? upath2.join(upath2.relative(cwd2, p), "**") : upath2.relative(cwd2, p)
211
+ ),
212
+ ...entries.flatMap(({ template }) => {
213
+ return template?.type === "file" && pathContains(cwd2, template.pathname) ? upath2.relative(cwd2, template.pathname) : [];
214
+ })
215
+ ];
216
+ }
217
+ function getWebPubResourceMatcher({
218
+ outputs,
219
+ themesDir,
220
+ entries,
221
+ cwd: cwd2,
222
+ manifestPath,
223
+ copyAsset: { fileExtensions },
224
+ additionalPatterns = []
225
+ }) {
226
+ return new GlobMatcher([
227
+ {
228
+ patterns: [
229
+ `**/${upath2.relative(cwd2, manifestPath)}`,
230
+ "**/*.{html,htm,xhtml,xht}",
231
+ `**/*.{${fileExtensions.join(",")}}`,
232
+ ...additionalPatterns
233
+ ],
234
+ ignore: [
235
+ ...getIgnoreAssetPatterns({
236
+ cwd: cwd2,
237
+ outputs,
238
+ entries
239
+ }),
240
+ ...getIgnoreThemeDirectoryPatterns({
241
+ cwd: cwd2,
242
+ themesDir
243
+ }),
244
+ // Ignore node_modules in the root directory
245
+ "node_modules/**",
246
+ // only include dotfiles starting with `.vs-`
247
+ "**/.!(vs-*)/**"
248
+ ],
249
+ dot: true,
250
+ cwd: cwd2
251
+ }
252
+ ]);
253
+ }
254
+ function getAssetMatcher({
255
+ copyAsset: { fileExtensions, includes, excludes },
256
+ outputs,
257
+ themesDir,
258
+ entries,
259
+ cwd: cwd2,
260
+ ignore = []
261
+ }) {
262
+ const ignorePatterns = [
263
+ ...ignore,
264
+ ...excludes,
265
+ ...getIgnoreAssetPatterns({ outputs, entries, cwd: cwd2 })
266
+ ];
267
+ return new GlobMatcher([
268
+ // Step 1: Glob files with an extension in `fileExtension`
269
+ // Ignore files in node_modules directory, theme example files and files matched `excludes`
270
+ {
271
+ patterns: fileExtensions.map((ext) => `**/*.${ext}`),
272
+ ignore: [
273
+ "**/node_modules/**",
274
+ ...ignorePatterns,
275
+ ...getIgnoreThemeDirectoryPatterns({ themesDir, cwd: cwd2 })
276
+ ],
277
+ cwd: cwd2
278
+ },
279
+ // Step 2: Glob files matched with `includes`
280
+ // Ignore only files matched `excludes`
281
+ {
282
+ patterns: includes,
283
+ ignore: ignorePatterns,
284
+ cwd: cwd2
285
+ }
286
+ ]);
287
+ }
288
+ async function copyAssets({
289
+ entryContextDir,
290
+ workspaceDir,
291
+ copyAsset,
292
+ outputs,
293
+ themesDir,
294
+ entries
295
+ }) {
296
+ if (pathEquals(entryContextDir, workspaceDir)) {
297
+ return;
298
+ }
299
+ const relWorkspaceDir = upath2.relative(entryContextDir, workspaceDir);
300
+ const assets = await getAssetMatcher({
301
+ copyAsset,
302
+ cwd: entryContextDir,
303
+ outputs,
304
+ themesDir,
305
+ entries,
306
+ ignore: [
307
+ // don't copy workspace itself
308
+ ...relWorkspaceDir ? [upath2.join(relWorkspaceDir, "**")] : []
309
+ ]
310
+ }).glob({ followSymbolicLinks: true });
311
+ Logger.debug("assets", assets);
312
+ for (const asset of assets) {
313
+ const target = upath2.join(workspaceDir, asset);
314
+ fs2.mkdirSync(upath2.dirname(target), { recursive: true });
315
+ await copy(upath2.resolve(entryContextDir, asset), target);
316
+ }
317
+ }
318
+
319
+ export {
320
+ createParserProgram,
321
+ setupConfigFromFlags,
322
+ locateVivliostyleConfig,
323
+ loadVivliostyleConfig,
324
+ warnDeprecatedConfig,
325
+ GlobMatcher,
326
+ getWebPubResourceMatcher,
327
+ getAssetMatcher,
328
+ copyAssets
329
+ };
330
+ //# sourceMappingURL=chunk-Q4EIXB5V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/cli-flags.ts","../src/config/load.ts","../src/processor/asset.ts"],"sourcesContent":["import { Command, type OptionValues } from 'commander';\nimport * as v from 'valibot';\nimport {\n type InlineOptions,\n type OutputConfig,\n type ParsedVivliostyleConfigSchema,\n VivliostyleInlineConfig,\n} from '../config/schema.js';\nimport { EMPTY_DATA_URI } from '../constants.js';\n\nexport interface CliFlags {\n input?: string;\n config?: string;\n outputs?: Pick<OutputConfig, 'path' | 'format'>[];\n theme?: string[];\n size?: string;\n cropMarks?: boolean;\n bleed?: string;\n cropOffset?: string;\n css?: string;\n style?: string;\n userStyle?: string;\n singleDoc?: boolean;\n quick?: boolean;\n pressReady?: boolean;\n title?: string;\n author?: string;\n language?: string;\n readingProgression?: 'ltr' | 'rtl';\n timeout?: number;\n renderMode?: 'local' | 'docker';\n preflight?: 'press-ready' | 'press-ready-local';\n preflightOption?: string[];\n sandbox?: boolean;\n executableBrowser?: string;\n image?: string;\n /** @deprecated */ http?: boolean;\n viewer?: string;\n viewerParam?: string;\n browser?: string;\n proxyServer?: string;\n proxyBypass?: string;\n proxyUser?: string;\n proxyPass?: string;\n logLevel?: 'silent' | 'info' | 'verbose' | 'debug';\n ignoreHttpsErrors?: boolean;\n projectPath?: string;\n template?: string;\n}\n\nexport function createParserProgram({\n setupProgram,\n parseArgs,\n}: {\n setupProgram: () => Command;\n parseArgs?: (options: CliFlags, args: string[]) => CliFlags;\n}) {\n return (argv: string[]) => {\n const program = setupProgram();\n program.parse(argv);\n let options = program.opts<CliFlags>();\n options = parseArgs?.(options, program.args ?? []) || options;\n options = warnDeprecatedFlags(options);\n return v.parse(VivliostyleInlineConfig, options);\n };\n}\n\nexport function setupConfigFromFlags(\n flags: InlineOptions,\n): ParsedVivliostyleConfigSchema {\n if (!flags.input) {\n if (flags.enableViewerStartPage) {\n return {\n tasks: [{ entry: [] }],\n inlineOptions: {\n input: { format: 'webbook', entry: EMPTY_DATA_URI },\n },\n };\n } else {\n throw new Error(\n 'No input is set. Please set an appropriate entry or a Vivliostyle config file.',\n );\n }\n }\n return {\n tasks: [{ entry: [] }],\n inlineOptions: { ...flags },\n };\n}\n\nfunction warnDeprecatedFlags(options: OptionValues): OptionValues {\n const modifiedOptions = { ...options };\n\n // Place here warnings for deprecated flags\n // if (options.someDeprecatedFlag) {\n // Logger.logWarn(\n // \"'--some-deprecated-flag' option was deprecated and will be removed in a future release. Please use '--new-flag' instead.\",\n // );\n // }\n\n return modifiedOptions;\n}\n","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 type InlineOptions,\n type 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', '.ts', '.mts', '.cts', '.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 if (config.tasks.some((task) => task.pressReady !== undefined)) {\n Logger.logWarn(\n \"'pressReady' property of Vivliostyle config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflight: \\\"press-ready\\\"' property instead.\",\n );\n }\n\n if (\n config.tasks.some(\n (task) => task.output && [task.output].flat().some((o) => o.preflight),\n )\n ) {\n Logger.logWarn(\n \"'preflight' property of output config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflight' property instead.\",\n );\n }\n\n if (\n config.tasks.some(\n (task) =>\n task.output && [task.output].flat().some((o) => o.preflightOption),\n )\n ) {\n Logger.logWarn(\n \"'preflightOption' property of output config was deprecated and will be removed in a future release. Please use 'pdfPostprocess.preflightOption' property instead.\",\n );\n }\n}\n","import { copy } from 'fs-extra/esm';\nimport fs from 'node:fs';\nimport picomatch, { type PicomatchOptions } from 'picomatch';\nimport { glob, type GlobOptions } from 'tinyglobby';\nimport upath from 'upath';\nimport type { ResolvedTaskConfig } from '../config/resolve.js';\nimport { Logger } from '../logger.js';\nimport { pathContains, pathEquals } from '../util.js';\n\nexport class GlobMatcher {\n readonly matcherConfig: (Pick<PicomatchOptions, 'dot' | 'ignore' | 'cwd'> & {\n patterns: string[];\n })[];\n\n #_matchers: picomatch.Matcher[];\n\n constructor(matcherConfig: typeof GlobMatcher.prototype.matcherConfig) {\n this.matcherConfig = matcherConfig;\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 additionalPatterns = [],\n}: Pick<\n ResolvedTaskConfig,\n 'outputs' | 'themesDir' | 'entries' | 'copyAsset'\n> & {\n cwd: string;\n manifestPath: string;\n additionalPatterns?: string[];\n}) {\n return new GlobMatcher([\n {\n patterns: [\n `**/${upath.relative(cwd, manifestPath)}`,\n '**/*.{html,htm,xhtml,xht}',\n `**/*.{${fileExtensions.join(',')}}`,\n ...additionalPatterns,\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"],"mappings":"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","names":["v","require","cwd","fs","upath","cwd","upath","fs"]}
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  resolveViteConfig
3
- } from "./chunk-MU7JCDMK.js";
3
+ } from "./chunk-4DTPH2XX.js";
4
4
  import {
5
5
  createViteServer,
6
6
  getViewerFullUrl,
7
- loadVivliostyleConfig,
8
7
  mergeConfig,
9
8
  mergeInlineConfig,
10
- resolveTaskConfig,
9
+ resolveTaskConfig
10
+ } from "./chunk-P33ELNYE.js";
11
+ import {
12
+ loadVivliostyleConfig,
13
+ setupConfigFromFlags,
11
14
  warnDeprecatedConfig
12
- } from "./chunk-C4HQHRXQ.js";
15
+ } from "./chunk-Q4EIXB5V.js";
13
16
  import {
14
17
  Logger,
18
+ cliVersion,
15
19
  isUnicodeSupported,
16
- randomBookSymbol,
17
- setupConfigFromFlags
18
- } from "./chunk-DBK27BAR.js";
19
- import {
20
- cliVersion
21
- } from "./chunk-OAFXM4ES.js";
20
+ randomBookSymbol
21
+ } from "./chunk-VAPIKX4A.js";
22
22
  import {
23
23
  __callDispose,
24
24
  __using
@@ -84,4 +84,4 @@ ${blueBright("\u2559\u2500")} ${dim(`Preview URL: ${terminalLink(url, url, { fal
84
84
  export {
85
85
  preview
86
86
  };
87
- //# sourceMappingURL=chunk-LGOHUEEQ.js.map
87
+ //# sourceMappingURL=chunk-RLV2H3QB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/preview.ts"],"sourcesContent":["import terminalLink from 'terminal-link';\nimport type { ViteDevServer } from 'vite';\nimport { blueBright, cyan, dim } from 'yoctocolors';\nimport { setupConfigFromFlags } from '../commands/cli-flags.js';\nimport { loadVivliostyleConfig, warnDeprecatedConfig } from '../config/load.js';\nimport { mergeConfig, mergeInlineConfig } from '../config/merge.js';\nimport { resolveTaskConfig } from '../config/resolve.js';\nimport type { ParsedVivliostyleInlineConfig } from '../config/schema.js';\nimport { resolveViteConfig } from '../config/vite.js';\nimport { isUnicodeSupported, Logger, randomBookSymbol } from '../logger.js';\nimport { createViteServer, getViewerFullUrl } from '../server.js';\nimport { cliVersion } from '../util.js';\n\nexport async function preview(inlineConfig: ParsedVivliostyleInlineConfig) {\n Logger.setLogOptions(inlineConfig);\n Logger.debug('preview > inlineConfig %O', inlineConfig);\n\n let vivliostyleConfig =\n (await loadVivliostyleConfig(inlineConfig)) ??\n setupConfigFromFlags(inlineConfig);\n warnDeprecatedConfig(vivliostyleConfig);\n vivliostyleConfig = mergeInlineConfig(vivliostyleConfig, inlineConfig);\n const { tasks, inlineOptions } = vivliostyleConfig;\n Logger.debug('preview > vivliostyleConfig %O', vivliostyleConfig);\n\n // Only show preview of first entry\n let config = resolveTaskConfig(tasks[0], inlineOptions);\n Logger.debug('preview > config %O', config);\n\n let server: ViteDevServer;\n let url: string;\n {\n using _ = Logger.startLogging('Start preview');\n const viteConfig = await resolveViteConfig({\n ...config,\n mode: 'preview',\n });\n server = await createViteServer({\n config,\n viteConfig,\n inlineConfig,\n mode: 'preview',\n });\n if (server.httpServer) {\n await server.listen();\n vivliostyleConfig = mergeConfig(vivliostyleConfig, {\n temporaryFilePrefix: config.temporaryFilePrefix,\n server: server.config.server,\n });\n config = resolveTaskConfig(\n vivliostyleConfig.tasks[0],\n vivliostyleConfig.inlineOptions,\n );\n }\n url = await getViewerFullUrl(config);\n }\n\n if (server.httpServer) {\n Logger.log(`\n${cyan(`Vivliostyle CLI v${cliVersion}`)}\n${blueBright('║')} ${isUnicodeSupported ? `${randomBookSymbol} ` : ''}Up and running (press Ctrl+C to quit)\n${blueBright('╙─')} ${dim(`Preview URL: ${terminalLink(url, url, { fallback: () => url })}`)}\n`);\n }\n return server;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,kBAAkB;AAEzB,SAAS,YAAY,MAAM,WAAW;AAWtC,eAAsB,QAAQ,cAA6C;AACzE,SAAO,cAAc,YAAY;AACjC,SAAO,MAAM,6BAA6B,YAAY;AAEtD,MAAI,oBACD,MAAM,sBAAsB,YAAY,KACzC,qBAAqB,YAAY;AACnC,uBAAqB,iBAAiB;AACtC,sBAAoB,kBAAkB,mBAAmB,YAAY;AACrE,QAAM,EAAE,OAAO,cAAc,IAAI;AACjC,SAAO,MAAM,kCAAkC,iBAAiB;AAGhE,MAAI,SAAS,kBAAkB,MAAM,CAAC,GAAG,aAAa;AACtD,SAAO,MAAM,uBAAuB,MAAM;AAE1C,MAAI;AACJ,MAAI;AACJ;AACE;AAAA;AAAA,YAAMA,KAAI,uBAAO,aAAa,eAAe;AAC7C,YAAM,aAAa,MAAM,kBAAkB;AAAA,QACzC,GAAG;AAAA,QACH,MAAM;AAAA,MACR,CAAC;AACD,eAAS,MAAM,iBAAiB;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,UAAI,OAAO,YAAY;AACrB,cAAM,OAAO,OAAO;AACpB,4BAAoB,YAAY,mBAAmB;AAAA,UACjD,qBAAqB,OAAO;AAAA,UAC5B,QAAQ,OAAO,OAAO;AAAA,QACxB,CAAC;AACD,iBAAS;AAAA,UACP,kBAAkB,MAAM,CAAC;AAAA,UACzB,kBAAkB;AAAA,QACpB;AAAA,MACF;AACA,YAAM,MAAM,iBAAiB,MAAM;AAAA,aAtBnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBF;AAEA,MAAI,OAAO,YAAY;AACrB,WAAO,IAAI;AAAA,EACb,KAAK,oBAAoB,UAAU,EAAE,CAAC;AAAA,EACtC,WAAW,QAAG,CAAC,IAAI,qBAAqB,GAAG,gBAAgB,MAAM,EAAE;AAAA,EACnE,WAAW,cAAI,CAAC,IAAI,IAAI,gBAAgB,aAAa,KAAK,KAAK,EAAE,UAAU,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;AAAA,CAC3F;AAAA,EACC;AACA,SAAO;AACT;","names":["_"]}