gutterpress 0.11.20-alpha.5 → 0.11.20

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/api/index.js CHANGED
@@ -137,7 +137,7 @@ import {
137
137
  testRemoteAccess,
138
138
  updateExtensions,
139
139
  validateProjectExtensions
140
- } from "../index-bta8hc2q.js";
140
+ } from "../index-379qafjq.js";
141
141
  import"../index-ht1bcqdd.js";
142
142
  import {
143
143
  BuildError
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  runBuild,
3
3
  splitOutPath
4
- } from "./cli-sc5t7c74.js";
4
+ } from "./cli-stt6691c.js";
5
5
  import {
6
6
  log
7
- } from "./cli-6xym15vm.js";
7
+ } from "./cli-8gm4p42f.js";
8
8
  import {
9
9
  UsageError,
10
10
  parseFormat,
11
11
  parsePdfxFlavor,
12
12
  rejectExtraPositionals,
13
13
  rejectUnknownFlags
14
- } from "./cli-553ce1d4.js";
14
+ } from "./cli-nh16svye.js";
15
15
  import"./cli-ht1bcqdd.js";
16
16
  import"./cli-cyej3p9v.js";
17
17
  import {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  package_default
3
- } from "./cli-553ce1d4.js";
3
+ } from "./cli-nh16svye.js";
4
4
  import {
5
5
  enhancedPath,
6
6
  execCapture,
@@ -4,7 +4,7 @@ import {
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "gutterpress",
7
- version: "0.11.20-alpha.5",
7
+ version: "0.11.20",
8
8
  description: "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
9
9
  author: "itlackey",
10
10
  license: "MPL-2.0",
@@ -16,12 +16,12 @@ import {
16
16
  stripAnnotations,
17
17
  transparentPages,
18
18
  warn
19
- } from "./cli-6xym15vm.js";
19
+ } from "./cli-8gm4p42f.js";
20
20
  import {
21
21
  DEBOUNCE,
22
22
  UsageError,
23
23
  resolvePort
24
- } from "./cli-553ce1d4.js";
24
+ } from "./cli-nh16svye.js";
25
25
  import {
26
26
  blackTextToGray
27
27
  } from "./cli-ht1bcqdd.js";
@@ -11426,16 +11426,18 @@ import path18 from "node:path";
11426
11426
 
11427
11427
  // src/lib/page-size.ts
11428
11428
  import postcss5 from "postcss";
11429
- import { Scalar as Scalar2 } from "yaml";
11429
+ import { isMap as isMap2, Scalar as Scalar2 } from "yaml";
11430
11430
  function isPositivePoints(value) {
11431
11431
  return typeof value === "number" && Number.isFinite(value) && value > 0;
11432
11432
  }
11433
11433
  function writePageBounds(doc, page) {
11434
- const out = { width: page.width, height: page.height };
11435
11434
  const tolerance = page.tolerance ?? numberAt(doc, ["page", "tolerance"]);
11435
+ if (!isMap2(doc.get("page", true)))
11436
+ doc.set("page", doc.createNode({}));
11437
+ doc.setIn(["page", "width"], page.width);
11438
+ doc.setIn(["page", "height"], page.height);
11436
11439
  if (tolerance !== undefined)
11437
- out.tolerance = tolerance;
11438
- doc.set("page", doc.createNode(out));
11440
+ doc.setIn(["page", "tolerance"], tolerance);
11439
11441
  }
11440
11442
  function numberAt(doc, keyPath) {
11441
11443
  const v = doc.getIn(keyPath);
@@ -11783,7 +11785,7 @@ function substitute(text, table) {
11783
11785
  }
11784
11786
 
11785
11787
  // src/lib/project-templates.ts
11786
- import { isMap as isMap2, isScalar as isScalar2, isSeq as isSeq3, parseDocument as parseDocument2 } from "yaml";
11788
+ import { isMap as isMap3, isScalar as isScalar2, isSeq as isSeq3, parseDocument as parseDocument2 } from "yaml";
11787
11789
  var BUILT_IN_TEMPLATE_IDS = [
11788
11790
  "book",
11789
11791
  "zine",
@@ -14091,7 +14093,7 @@ async function disconnectPublishCredential(key, deps, options = {}) {
14091
14093
  }
14092
14094
  }
14093
14095
  // src/lib/manifest-config.ts
14094
- import { isSeq as isSeq4, isMap as isMap3, YAMLSeq as YAMLSeq3, Scalar as Scalar3 } from "yaml";
14096
+ import { isSeq as isSeq4, isMap as isMap4, YAMLSeq as YAMLSeq3, Scalar as Scalar3 } from "yaml";
14095
14097
  // src/lib/host-policy.ts
14096
14098
  var AUTO_SYNC_MAX_MINUTES = 24 * 60;
14097
14099
  // src/lib/remote-auth/github-repos.ts
@@ -14297,5 +14299,5 @@ function normalizeProjectKey(projectDir) {
14297
14299
  return projectDir.replace(/[\\/]+$/, "");
14298
14300
  }
14299
14301
  // src/lib/publish/manifest-publish.ts
14300
- import { isMap as isMap4 } from "yaml";
14302
+ import { isMap as isMap5 } from "yaml";
14301
14303
  export { isPathSpecifier, parseExtensionSpecifier, PRESET_IDS, PRESETS, TARGETS, TARGET_IDS, publishTargetFor, loadManifestWithPath, BUILT_IN_STYLE_SET_IDS, listProjectExtensions, setExtensionEnabled, removeExtension, addExtension, checkExtensionUpdates, updateExtensions, addBuiltInStyleSet, reportMissingTools, executeValidation, executeAndReport, splitOutPath, runBuild, openPath, startPreviewServer, scaffoldProject, EXTENSION_KINDS, scaffoldExtension, BUILT_IN_TEMPLATE_IDS, importExtensionFromFile, importExtensionFromUrl, searchNpmExtensions, publishCredentialKey, publishConnectionStatus, listPublishAccounts, connectGoogleDrive, listPublishProviders, publishProviderFor, resolvePublishFormat, runPublish, connectPublishProvider, disconnectPublishCredential };
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  UsageError,
7
7
  package_default,
8
8
  rejectUnknownFlags
9
- } from "./cli-553ce1d4.js";
9
+ } from "./cli-nh16svye.js";
10
10
  import {
11
11
  EXIT_CODES
12
12
  } from "./cli-46ycxe6r.js";
@@ -18,14 +18,14 @@ import {
18
18
  import { defineCommand, parseArgs, runMain } from "citty";
19
19
  import { statSync } from "node:fs";
20
20
  var SUBCOMMANDS = {
21
- new: () => import("./new-87dqcxtn.js").then((m) => m.default),
22
- preview: () => import("./preview-7bcr5j2p.js").then((m) => m.default),
23
- build: () => import("./build-8ffhvydf.js").then((m) => m.default),
24
- publish: () => import("./publish-4qfm5ch9.js").then((m) => m.default),
25
- validate: () => import("./validate-dzht9qxk.js").then((m) => m.default),
26
- preflight: () => import("./preflight-nb4wndqf.js").then((m) => m.default),
27
- doctor: () => import("./doctor-gyes0hxt.js").then((m) => m.default),
28
- ext: () => import("./ext-x61yptd1.js").then((m) => m.default)
21
+ new: () => import("./new-jzpneexb.js").then((m) => m.default),
22
+ preview: () => import("./preview-x6wn3vdh.js").then((m) => m.default),
23
+ build: () => import("./build-t49xka15.js").then((m) => m.default),
24
+ publish: () => import("./publish-rskr6x6b.js").then((m) => m.default),
25
+ validate: () => import("./validate-88w89ye7.js").then((m) => m.default),
26
+ preflight: () => import("./preflight-c0f0s3y1.js").then((m) => m.default),
27
+ doctor: () => import("./doctor-53hq2v2n.js").then((m) => m.default),
28
+ ext: () => import("./ext-bvgfwtk7.js").then((m) => m.default)
29
29
  };
30
30
  var VERSION = package_default.version;
31
31
  var main = defineCommand({
@@ -50,7 +50,7 @@ async function preflightRequiredInvocations(rawArgs) {
50
50
  const [command, ...commandArgs] = rawArgs;
51
51
  try {
52
52
  if (command === "new") {
53
- const { newArgs } = await import("./new-87dqcxtn.js");
53
+ const { newArgs } = await import("./new-jzpneexb.js");
54
54
  rejectUnknownFlags(commandArgs, newArgs, "new");
55
55
  const parsed = parseArgs(commandArgs, {
56
56
  ...newArgs,
@@ -62,7 +62,7 @@ async function preflightRequiredInvocations(rawArgs) {
62
62
  return;
63
63
  }
64
64
  if (command === "preflight") {
65
- const { preflightArgs } = await import("./preflight-nb4wndqf.js");
65
+ const { preflightArgs } = await import("./preflight-c0f0s3y1.js");
66
66
  rejectUnknownFlags(commandArgs, preflightArgs, "preflight");
67
67
  const parsed = parseArgs(commandArgs, {
68
68
  ...preflightArgs,
@@ -82,7 +82,7 @@ async function preflightRequiredInvocations(rawArgs) {
82
82
  }
83
83
  if (subcommand.startsWith("-"))
84
84
  return;
85
- const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-x61yptd1.js");
85
+ const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-bvgfwtk7.js");
86
86
  if (!EXT_SUBCOMMANDS.includes(subcommand)) {
87
87
  throw new UsageError(`gutterpress ext: unknown command "${subcommand}"`);
88
88
  }
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  getSystemDiagnostics,
3
3
  log
4
- } from "./cli-6xym15vm.js";
4
+ } from "./cli-8gm4p42f.js";
5
5
  import {
6
6
  UsageError,
7
7
  rejectExtraPositionals,
8
8
  rejectUnknownFlags
9
- } from "./cli-553ce1d4.js";
9
+ } from "./cli-nh16svye.js";
10
10
  import"./cli-46ycxe6r.js";
11
11
  import"./cli-asap4t1z.js";
12
12
  import"./cli-37x76zdn.js";
@@ -12,15 +12,15 @@ import {
12
12
  searchNpmExtensions,
13
13
  setExtensionEnabled,
14
14
  updateExtensions
15
- } from "./cli-sc5t7c74.js";
16
- import"./cli-6xym15vm.js";
15
+ } from "./cli-stt6691c.js";
16
+ import"./cli-8gm4p42f.js";
17
17
  import {
18
18
  UsageError,
19
19
  exitForUsage,
20
20
  rejectExtraPositionals,
21
21
  rejectUnknownFlags,
22
22
  resolveProjectDir
23
- } from "./cli-553ce1d4.js";
23
+ } from "./cli-nh16svye.js";
24
24
  import"./cli-ht1bcqdd.js";
25
25
  import"./cli-cyej3p9v.js";
26
26
  import {
@@ -3825,7 +3825,7 @@ import { satisfies, validRange } from "semver";
3825
3825
  // package.json
3826
3826
  var package_default = {
3827
3827
  name: "gutterpress",
3828
- version: "0.11.20-alpha.5",
3828
+ version: "0.11.20",
3829
3829
  description: "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
3830
3830
  author: "itlackey",
3831
3831
  license: "MPL-2.0",
@@ -12423,16 +12423,29 @@ import { existsSync as existsSync13 } from "node:fs";
12423
12423
  import { mkdir as mkdir8, readFile as readFile29, writeFile as writeFile8 } from "node:fs/promises";
12424
12424
  import path19 from "node:path";
12425
12425
  import postcss5 from "postcss";
12426
- import { Scalar as Scalar2 } from "yaml";
12426
+ import { isMap as isMap2, Scalar as Scalar2 } from "yaml";
12427
12427
  function isPositivePoints(value) {
12428
12428
  return typeof value === "number" && Number.isFinite(value) && value > 0;
12429
12429
  }
12430
12430
  function writePageBounds(doc, page) {
12431
- const out = { width: page.width, height: page.height };
12432
12431
  const tolerance = page.tolerance ?? numberAt(doc, ["page", "tolerance"]);
12432
+ if (!isMap2(doc.get("page", true)))
12433
+ doc.set("page", doc.createNode({}));
12434
+ doc.setIn(["page", "width"], page.width);
12435
+ doc.setIn(["page", "height"], page.height);
12433
12436
  if (tolerance !== undefined)
12434
- out.tolerance = tolerance;
12435
- doc.set("page", doc.createNode(out));
12437
+ doc.setIn(["page", "tolerance"], tolerance);
12438
+ }
12439
+ function deletePageBounds(doc) {
12440
+ const block = doc.get("page", true);
12441
+ if (!isMap2(block)) {
12442
+ doc.delete("page");
12443
+ return;
12444
+ }
12445
+ for (const key of ["width", "height", "tolerance"])
12446
+ block.delete(key);
12447
+ if (block.items.length === 0)
12448
+ doc.delete("page");
12436
12449
  }
12437
12450
  function numberAt(doc, keyPath) {
12438
12451
  const v = doc.getIn(keyPath);
@@ -12564,7 +12577,7 @@ async function setPageSetup(projectDir, choice) {
12564
12577
  if (choice.preset === "custom")
12565
12578
  writePageBounds(doc, size);
12566
12579
  else
12567
- doc.delete("page");
12580
+ deletePageBounds(doc);
12568
12581
  if (target === newSheet && !sheets.includes(newSheet)) {
12569
12582
  ensureSeq(doc, "styles").add(new Scalar2("styles/book.css"));
12570
12583
  }
@@ -13008,7 +13021,7 @@ import { cp as cp3, mkdir as mkdir11, readFile as readFile32, readdir as readdir
13008
13021
  import { constants as FS3, existsSync as existsSync15 } from "node:fs";
13009
13022
  import { access as access3 } from "node:fs/promises";
13010
13023
  import path22 from "node:path";
13011
- import { isMap as isMap2, isScalar as isScalar2, isSeq as isSeq3, parseDocument as parseDocument2 } from "yaml";
13024
+ import { isMap as isMap3, isScalar as isScalar2, isSeq as isSeq3, parseDocument as parseDocument2 } from "yaml";
13012
13025
  var BUILT_IN_TEMPLATE_IDS = [
13013
13026
  "book",
13014
13027
  "zine",
@@ -13074,7 +13087,7 @@ function collectEscaping(nodes, getValue, escapes) {
13074
13087
  return out;
13075
13088
  }
13076
13089
  function extensionEntryPath(node) {
13077
- const use = isMap2(node) ? scalarString(node.get("use", true)) : scalarString(node);
13090
+ const use = isMap3(node) ? scalarString(node.get("use", true)) : scalarString(node);
13078
13091
  return use !== null && isPathSpecifier(use) ? use : null;
13079
13092
  }
13080
13093
  function dropEscaping(doc, seq, key, escaping) {
@@ -13086,7 +13099,7 @@ function dropEscaping(doc, seq, key, escaping) {
13086
13099
  doc.delete(key);
13087
13100
  }
13088
13101
  function rewriteEntry(node, newPath) {
13089
- if (isMap2(node))
13102
+ if (isMap3(node))
13090
13103
  node.set("use", newPath);
13091
13104
  else if (isScalar2(node))
13092
13105
  node.value = newPath;
@@ -13882,7 +13895,7 @@ async function searchNpmExtensions(query, options = {}) {
13882
13895
  return { matches, total: pages.reduce((sum, page) => sum + page.total, 0) };
13883
13896
  }
13884
13897
  // src/lib/manifest-config.ts
13885
- import { isSeq as isSeq4, isMap as isMap3, YAMLSeq as YAMLSeq3, Scalar as Scalar3 } from "yaml";
13898
+ import { isSeq as isSeq4, isMap as isMap4, YAMLSeq as YAMLSeq3, Scalar as Scalar3 } from "yaml";
13886
13899
  function hasKey(obj, key) {
13887
13900
  return Object.prototype.hasOwnProperty.call(obj, key);
13888
13901
  }
@@ -13920,7 +13933,7 @@ async function setManifestFields(projectDir, updates) {
13920
13933
  if (f === null || Array.isArray(f) && f.length === 0) {
13921
13934
  doc.deleteIn(["source", "files"]);
13922
13935
  const source = doc.get("source", true);
13923
- if (isMap3(source) && source.items.length === 0) {
13936
+ if (isMap4(source) && source.items.length === 0) {
13924
13937
  doc.delete("source");
13925
13938
  }
13926
13939
  } else {
@@ -13950,7 +13963,7 @@ async function readManifestFields(projectDir) {
13950
13963
  out.sourceFiles = filesNode.items.map((i) => scalarString(i) ?? "");
13951
13964
  } else {
13952
13965
  const sourceNode = doc.get("source", true);
13953
- if (isMap3(sourceNode) && sourceNode.has("files"))
13966
+ if (isMap4(sourceNode) && sourceNode.has("files"))
13954
13967
  out.sourceFiles = null;
13955
13968
  }
13956
13969
  return out;
@@ -17647,10 +17660,10 @@ function normalizeProjectKey(projectDir) {
17647
17660
  return projectDir.replace(/[\\/]+$/, "");
17648
17661
  }
17649
17662
  // src/lib/publish/manifest-publish.ts
17650
- import { isMap as isMap4 } from "yaml";
17663
+ import { isMap as isMap5 } from "yaml";
17651
17664
  function settingsFromDoc(doc) {
17652
17665
  const node = doc.get("publish", true);
17653
- if (!isMap4(node))
17666
+ if (!isMap5(node))
17654
17667
  return {};
17655
17668
  const json = node.toJSON();
17656
17669
  const out = {};
@@ -17675,11 +17688,11 @@ async function setPublishProviderConfig(projectDir, providerId, values) {
17675
17688
  }
17676
17689
  }
17677
17690
  const section = doc.getIn(["publish", providerId], true);
17678
- if (isMap4(section) && section.items.length === 0) {
17691
+ if (isMap5(section) && section.items.length === 0) {
17679
17692
  doc.deleteIn(["publish", providerId]);
17680
17693
  }
17681
17694
  const publish = doc.get("publish", true);
17682
- if (isMap4(publish) && publish.items.length === 0) {
17695
+ if (isMap5(publish) && publish.items.length === 0) {
17683
17696
  doc.delete("publish");
17684
17697
  }
17685
17698
  await writeManifestDoc(file, doc);
package/dist/index.js CHANGED
@@ -154,7 +154,7 @@ import {
154
154
  testRemoteAccess,
155
155
  updateExtensions,
156
156
  validateProjectExtensions
157
- } from "./index-bta8hc2q.js";
157
+ } from "./index-379qafjq.js";
158
158
  import"./index-ht1bcqdd.js";
159
159
  import {
160
160
  BUILD_DIAGNOSTIC_CODES
@@ -37,7 +37,8 @@ export declare function isPositivePoints(value: unknown): value is number;
37
37
  /**
38
38
  * Write the manifest's `page:` bounds. `tolerance` defaults to whatever the
39
39
  * block already carries, so re-sizing a book never silently resets a
40
- * hand-tuned tolerance.
40
+ * hand-tuned tolerance. The block's other keys stay as written; a `page:`
41
+ * that is not a map is replaced.
41
42
  */
42
43
  export declare function writePageBounds(doc: Document, page: CustomPageOptions): void;
43
44
  /** The size (points) a choice means: `custom` brings its own, the others are the preset's. */
@@ -59,8 +60,9 @@ export declare function readPageSetup(projectDir: string): Promise<PageSetup>;
59
60
  /**
60
61
  * Change a book's page size: the manifest's `preset:` + `page:` bounds and the
61
62
  * stylesheet's `@page` size, together. Mirrors what the wizard records —
62
- * `dtrpg` / `book` carry their own bounds (any `page:` block is removed so it
63
- * cannot shadow them), `custom` records the typed trim. Nothing is written
63
+ * `dtrpg` / `book` carry their own bounds (the `page:` block's width, height
64
+ * and tolerance are removed so they cannot shadow them; its print-area keys
65
+ * stay), `custom` records the typed trim. Nothing is written
64
66
  * unless the whole choice validates and the stylesheet parses.
65
67
  */
66
68
  export declare function setPageSetup(projectDir: string, choice: PageSizeChoice): Promise<PageSetup>;
@@ -7,15 +7,15 @@ import {
7
7
  TARGET_IDS,
8
8
  scaffoldExtension,
9
9
  scaffoldProject
10
- } from "./cli-sc5t7c74.js";
10
+ } from "./cli-stt6691c.js";
11
11
  import {
12
12
  resolveGhostscript
13
- } from "./cli-6xym15vm.js";
13
+ } from "./cli-8gm4p42f.js";
14
14
  import {
15
15
  UsageError,
16
16
  rejectExtraPositionals,
17
17
  rejectUnknownFlags
18
- } from "./cli-553ce1d4.js";
18
+ } from "./cli-nh16svye.js";
19
19
  import"./cli-ht1bcqdd.js";
20
20
  import"./cli-cyej3p9v.js";
21
21
  import {
@@ -2,15 +2,15 @@ import {
2
2
  executeValidation,
3
3
  publishTargetFor,
4
4
  reportMissingTools
5
- } from "./cli-sc5t7c74.js";
5
+ } from "./cli-stt6691c.js";
6
6
  import {
7
7
  log
8
- } from "./cli-6xym15vm.js";
8
+ } from "./cli-8gm4p42f.js";
9
9
  import {
10
10
  UsageError,
11
11
  rejectExtraPositionals,
12
12
  rejectUnknownFlags
13
- } from "./cli-553ce1d4.js";
13
+ } from "./cli-nh16svye.js";
14
14
  import"./cli-ht1bcqdd.js";
15
15
  import"./cli-cyej3p9v.js";
16
16
  import {
@@ -6,10 +6,10 @@ import {
6
6
  runBuild,
7
7
  splitOutPath,
8
8
  startPreviewServer
9
- } from "./cli-sc5t7c74.js";
9
+ } from "./cli-stt6691c.js";
10
10
  import {
11
11
  log
12
- } from "./cli-6xym15vm.js";
12
+ } from "./cli-8gm4p42f.js";
13
13
  import {
14
14
  UsageError,
15
15
  parseFormat,
@@ -17,7 +17,7 @@ import {
17
17
  rejectExtraPositionals,
18
18
  rejectUnknownFlags,
19
19
  resolvePort
20
- } from "./cli-553ce1d4.js";
20
+ } from "./cli-nh16svye.js";
21
21
  import"./cli-ht1bcqdd.js";
22
22
  import"./cli-cyej3p9v.js";
23
23
  import {
@@ -11,16 +11,16 @@ import {
11
11
  publishProviderFor,
12
12
  resolvePublishFormat,
13
13
  runPublish
14
- } from "./cli-sc5t7c74.js";
14
+ } from "./cli-stt6691c.js";
15
15
  import {
16
16
  FileTokenStore,
17
17
  log
18
- } from "./cli-6xym15vm.js";
18
+ } from "./cli-8gm4p42f.js";
19
19
  import {
20
20
  UsageError,
21
21
  rejectExtraPositionals,
22
22
  rejectUnknownFlags
23
- } from "./cli-553ce1d4.js";
23
+ } from "./cli-nh16svye.js";
24
24
  import"./cli-ht1bcqdd.js";
25
25
  import"./cli-cyej3p9v.js";
26
26
  import {
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  executeAndReport
3
- } from "./cli-sc5t7c74.js";
3
+ } from "./cli-stt6691c.js";
4
4
  import {
5
5
  log
6
- } from "./cli-6xym15vm.js";
6
+ } from "./cli-8gm4p42f.js";
7
7
  import {
8
8
  UsageError,
9
9
  rejectExtraPositionals,
10
10
  rejectUnknownFlags
11
- } from "./cli-553ce1d4.js";
11
+ } from "./cli-nh16svye.js";
12
12
  import"./cli-ht1bcqdd.js";
13
13
  import"./cli-cyej3p9v.js";
14
14
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gutterpress",
3
- "version": "0.11.20-alpha.5",
3
+ "version": "0.11.20",
4
4
  "description": "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
5
5
  "author": "itlackey",
6
6
  "license": "MPL-2.0",