gutterpress 0.11.23-alpha.1 → 0.11.23-alpha.3

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 (82) hide show
  1. package/README.md +27 -29
  2. package/dist/{README-8ef336pp.md → README-8db7btxb.md} +13 -19
  3. package/dist/api/index.d.ts +5 -5
  4. package/dist/api/index.js +16 -22
  5. package/dist/{build-09cd1n7s.js → build-m78jcpf7.js} +9 -10
  6. package/dist/{cli-5hkmp2wy.js → cli-1h17ktsg.js} +125 -187
  7. package/dist/{cli-nr6j6300.js → cli-5jzyw06s.js} +1 -1
  8. package/dist/{cli-habkc5ng.js → cli-a35w7wzg.js} +5 -4
  9. package/dist/{cli-dd115fa8.js → cli-h4x81x97.js} +152 -124
  10. package/dist/{cli-ccp7sxz3.js → cli-n2tsxqpn.js} +1 -1
  11. package/dist/{cli-b0vyjvmt.js → cli-s6djx4ma.js} +1 -1
  12. package/dist/{cli-h17e3mtz.js → cli-t8be9yeb.js} +380 -16
  13. package/dist/{cli-dtckwda1.js → cli-xsrffqzt.js} +192 -10
  14. package/dist/{index-r7jcsk6h.js → cli-y28j019d.js} +19 -10
  15. package/dist/cli.js +12 -12
  16. package/dist/{doctor-nddspx4n.js → doctor-j71jqce3.js} +3 -3
  17. package/dist/engine/shared/gcpm-extract.d.ts +8 -0
  18. package/dist/engine/shared/print-area.d.ts +16 -4
  19. package/dist/{engine-yjzknt0g.js → engine-1r6q80tq.js} +3 -3
  20. package/dist/{engine-892swzzc.js → engine-m4y10shc.js} +1 -2
  21. package/dist/{ext-zjpen4yx.js → ext-fq2hg9va.js} +18 -33
  22. package/dist/{extension-restore-jvs60x9b.js → extension-restore-9dh7c4tp.js} +4 -4
  23. package/dist/{extension-restore-w8xt4kbq.js → extension-restore-tmxtzkm0.js} +5 -6
  24. package/dist/{gutterpress-viewer-701vf4qp.js → gutterpress-viewer-mafsby5k.js} +9 -2
  25. package/dist/{index-2jpk25en.js → index-0wee4408.js} +380 -16
  26. package/dist/index-46ycxe6r.js +18 -0
  27. package/dist/{cli-h3phdstf.js → index-5x42amh8.js} +19 -10
  28. package/dist/{index-m4hhzg3c.js → index-7pck1q9c.js} +174 -142
  29. package/dist/{index-93pqkvty.js → index-h6yk5tjx.js} +5 -4
  30. package/dist/{index-apc8w9w8.js → index-nedd07bk.js} +187 -2
  31. package/dist/{index-0w2azsk1.js → index-nvmf22rt.js} +2 -4
  32. package/dist/{index-zrhyb967.js → index-prqvz3xm.js} +510 -587
  33. package/dist/index.js +17 -23
  34. package/dist/lib/extension-manager.d.ts +24 -50
  35. package/dist/lib/extension-manifest.d.ts +1 -13
  36. package/dist/lib/extension-scaffold.d.ts +3 -3
  37. package/dist/lib/extension-specifier.d.ts +23 -6
  38. package/dist/lib/manifest.d.ts +15 -1
  39. package/dist/lib/markdown/assemble.d.ts +4 -3
  40. package/dist/lib/markdown/math.d.ts +1 -1
  41. package/dist/lib/npm-plugin-installer.d.ts +1 -1
  42. package/dist/lib/page-size.d.ts +34 -27
  43. package/dist/lib/plugin-vendor.d.ts +11 -3
  44. package/dist/lib/printsafe.d.ts +1 -0
  45. package/dist/lib/project-gitignore.d.ts +2 -2
  46. package/dist/lib/project-scaffold.d.ts +5 -7
  47. package/dist/lib/project-templates.d.ts +9 -3
  48. package/dist/lib/snippets.d.ts +2 -1
  49. package/dist/lib/style-resolver.d.ts +1 -2
  50. package/dist/manifest-8afhrk30.yaml +19 -0
  51. package/dist/manifest-d4f9q79e.yaml +23 -0
  52. package/dist/manifest-gf13sjp8.yaml +27 -0
  53. package/dist/manifest-my7mdv8j.yaml +23 -0
  54. package/dist/{manifest.schema-9aeaered.json → manifest.schema-650pe0d1.json} +17 -5
  55. package/dist/{new-xhq8wczn.js → new-s4zcaepg.js} +22 -21
  56. package/dist/{package-aenwjew3.json → package-awwkt7sa.json} +0 -1
  57. package/dist/{page-rules-nsj3aw42.css → page-rules-fj09xct5.css} +12 -40
  58. package/dist/{plugin.test.js-xgxrd8hf.tpl → plugin.test.js-gxzqqfdh.tpl} +0 -1
  59. package/dist/{plugins-9en8m9y0.js → plugins-4vaf27n9.js} +4 -4
  60. package/dist/{plugins-gf0gkjmv.js → plugins-80emnf31.js} +2 -2
  61. package/dist/{preflight-negnxg7b.js → preflight-c7w1xdn3.js} +9 -10
  62. package/dist/{preview-cep2s9cg.js → preview-mzytcwyk.js} +9 -10
  63. package/dist/{publish-xery6qc6.js → publish-fez14ad4.js} +9 -10
  64. package/dist/render.js +24 -561
  65. package/dist/schema/manifest.types.d.ts +22 -0
  66. package/dist/{source-provider-qbfknhyy.js → source-provider-98k5deda.js} +2 -2
  67. package/dist/{source-provider-2r74a7wp.js → source-provider-knmcam50.js} +2 -2
  68. package/dist/{tokens-7984461t.css → tokens-ye64p899.css} +5 -12
  69. package/dist/{validate-3d0sgf4g.js → validate-p2chr6hr.js} +9 -10
  70. package/package.json +1 -1
  71. package/dist/cli-fe43evmf.js +0 -212
  72. package/dist/index-dsvk7q6s.js +0 -229
  73. package/dist/manifest-8f10dr4f.yaml +0 -17
  74. package/dist/manifest-n1gh3qw5.yaml +0 -9
  75. package/dist/package-97gm31sg.json +0 -10
  76. package/dist/package-gag6ykwn.json +0 -10
  77. package/dist/package-nrhkwf2m.json +0 -10
  78. package/dist/package-zttkgydq.json +0 -10
  79. package/dist/theme-9c58td2d.css +0 -76
  80. package/dist/theme-h5recz6c.css +0 -61
  81. package/dist/theme-j2bagrfx.css +0 -59
  82. package/dist/theme-nn6d53zy.css +0 -71
@@ -1,13 +1,10 @@
1
1
  import {
2
2
  launchChromium
3
3
  } from "./cli-eyyggect.js";
4
- import {
5
- getAssetPath
6
- } from "./cli-fe43evmf.js";
7
4
 
8
5
  // src/engine/compiler/build.ts
9
- import { readFile } from "node:fs/promises";
10
- import { resolve } from "node:path";
6
+ import { readFile as readFile2 } from "node:fs/promises";
7
+ import { resolve as resolve2 } from "node:path";
11
8
  import { pathToFileURL } from "node:url";
12
9
 
13
10
  // src/engine/shared/gcpm-extract.ts
@@ -533,12 +530,18 @@ function parseMargin(value) {
533
530
  const d = parts[3] ?? b;
534
531
  return { top: a, right: b, bottom: c, left: d };
535
532
  }
533
+ var DEFAULT_PAGE_MARGIN_PT = 72;
536
534
  function resolvePage(model, ctx = {}) {
537
535
  const wanted = new Set(ctx.pseudos ?? []);
538
536
  const applicable = model.pageRules.filter((r) => r.name ? r.name === ctx.name : true).filter((r) => r.pseudos.every((p) => wanted.has(p))).sort((a, b) => specificity(a) - specificity(b));
539
537
  const decls = {};
540
538
  const marginBoxes = {};
541
- const margin = { top: 72, right: 72, bottom: 72, left: 72 };
539
+ const margin = {
540
+ top: DEFAULT_PAGE_MARGIN_PT,
541
+ right: DEFAULT_PAGE_MARGIN_PT,
542
+ bottom: DEFAULT_PAGE_MARGIN_PT,
543
+ left: DEFAULT_PAGE_MARGIN_PT
544
+ };
542
545
  for (const rule of applicable) {
543
546
  for (const [prop, value] of Object.entries(rule.decls)) {
544
547
  if (prop === "margin")
@@ -1126,6 +1129,185 @@ async function inspectPdf(bytes) {
1126
1129
  return { pageCount: pages.length, boxes, linkTargets, namedDests, outline };
1127
1130
  }
1128
1131
 
1132
+ // src/lib/embedded-assets.ts
1133
+ import { existsSync } from "node:fs";
1134
+ import { mkdtemp, mkdir, writeFile, readFile } from "node:fs/promises";
1135
+ import { tmpdir } from "node:os";
1136
+ import { dirname, join, resolve } from "node:path";
1137
+ import { fileURLToPath } from "node:url";
1138
+
1139
+ // src/assets/favicon.ico
1140
+ var favicon_default = "./favicon-272ga6y0.ico";
1141
+
1142
+ // src/assets/manifest.schema.json
1143
+ var manifest_schema_default = "./manifest.schema-650pe0d1.json";
1144
+
1145
+ // src/assets/preview/scripts/preview-interface.js
1146
+ var preview_interface_default = "./preview-interface-nnmrxyqm.js";
1147
+
1148
+ // src/assets/preview/scripts/preview-bridge.js
1149
+ var preview_bridge_default = "./preview-bridge-8wjcjec3.js";
1150
+
1151
+ // src/assets/preview/scripts/preview-shell.js
1152
+ var preview_shell_default = "./preview-shell-wk9k3gcd.js";
1153
+
1154
+ // profiles/CGATS21_CRPC1.icc
1155
+ var CGATS21_CRPC1_default = "./CGATS21_CRPC1-g0e3k7kr.icc";
1156
+
1157
+ // src/assets/engine/gutterpress-viewer.js
1158
+ var gutterpress_viewer_default = "./gutterpress-viewer-mafsby5k.js";
1159
+
1160
+ // src/assets/engine/gutterpress-agent.js
1161
+ var gutterpress_agent_default = "./gutterpress-agent-d29ry3ak.js";
1162
+
1163
+ // src/assets/templates/book/manifest.yaml
1164
+ var manifest_default = "./manifest-8afhrk30.yaml";
1165
+
1166
+ // src/assets/templates/book/chapter-01.md
1167
+ var chapter_01_default = "./chapter-01-gsbjt584.md";
1168
+
1169
+ // src/assets/templates/zine/manifest.yaml
1170
+ var manifest_default2 = "./manifest-d4f9q79e.yaml";
1171
+
1172
+ // src/assets/templates/zine/chapter-01.md
1173
+ var chapter_01_default2 = "./chapter-01-wgjfz4w6.md";
1174
+
1175
+ // src/assets/templates/technical/manifest.yaml
1176
+ var manifest_default3 = "./manifest-my7mdv8j.yaml";
1177
+
1178
+ // src/assets/templates/technical/chapter-01.md
1179
+ var chapter_01_default3 = "./chapter-01-6fn9pvd0.md";
1180
+
1181
+ // src/assets/templates/paper/manifest.yaml
1182
+ var manifest_default4 = "./manifest-gf13sjp8.yaml";
1183
+
1184
+ // src/assets/templates/paper/chapter-01.md
1185
+ var chapter_01_default4 = "./chapter-01-s71xrf5q.md";
1186
+
1187
+ // src/assets/extension-templates/plugin/package.json
1188
+ var package_default = "./package-9rv69pxm.json";
1189
+
1190
+ // src/assets/extension-templates/plugin/README.md
1191
+ var README_default = "./README-vsnsc1b3.md";
1192
+
1193
+ // src/assets/extension-templates/plugin/plugin.js.tpl
1194
+ var plugin_js_default = "./plugin.js-cswq7wvd.tpl";
1195
+
1196
+ // src/assets/extension-templates/plugin/styles/plugin.css
1197
+ var plugin_default = "./plugin-spbcem4j.css";
1198
+
1199
+ // src/assets/extension-templates/plugin/snippets/term-box.md
1200
+ var term_box_default = "./term-box-4y0w7y32.md";
1201
+
1202
+ // src/assets/extension-templates/plugin/test/fixture.md
1203
+ var fixture_default = "./fixture-2qnyqgb5.md";
1204
+
1205
+ // src/assets/extension-templates/plugin/test/expected.html
1206
+ var expected_default = "./expected-ycmacem8.html";
1207
+
1208
+ // src/assets/extension-templates/plugin/test/plugin.test.js.tpl
1209
+ var plugin_test_js_default = "./plugin.test.js-gxzqqfdh.tpl";
1210
+
1211
+ // src/assets/extension-templates/look/package.json
1212
+ var package_default2 = "./package-awwkt7sa.json";
1213
+
1214
+ // src/assets/extension-templates/look/README.md
1215
+ var README_default2 = "./README-8db7btxb.md";
1216
+
1217
+ // src/assets/extension-templates/look/components.yaml
1218
+ var components_default = "./components-zzqdpt3m.yaml";
1219
+
1220
+ // src/assets/extension-templates/look/snippets/callout.md
1221
+ var callout_default = "./callout-hv56m16h.md";
1222
+
1223
+ // src/assets/extension-templates/look/styles/tokens.css
1224
+ var tokens_default = "./tokens-ye64p899.css";
1225
+
1226
+ // src/assets/extension-templates/look/styles/base.css
1227
+ var base_default = "./base-ypqh9n7f.css";
1228
+
1229
+ // src/assets/extension-templates/look/styles/components.css
1230
+ var components_default2 = "./components-aam0fe2z.css";
1231
+
1232
+ // src/assets/extension-templates/look/styles/page-templates.css
1233
+ var page_templates_default = "./page-templates-tx9ryt19.css";
1234
+
1235
+ // src/assets/extension-templates/look/styles/page-rules.css
1236
+ var page_rules_default = "./page-rules-fj09xct5.css";
1237
+
1238
+ // src/assets/extension-templates/look/styles/book.css
1239
+ var book_default = "./book-ted3tzrp.css";
1240
+
1241
+ // src/lib/embedded-assets.ts
1242
+ var __libdir = dirname(fileURLToPath(import.meta.url));
1243
+ var abs = (p) => resolve(__libdir, p);
1244
+ var filePath = (v) => v;
1245
+ var EMBEDDED_ASSETS = {
1246
+ "favicon.ico": abs(favicon_default),
1247
+ "manifest.schema.json": abs(filePath(manifest_schema_default)),
1248
+ "preview/scripts/preview-interface.js": abs(filePath(preview_interface_default)),
1249
+ "preview/scripts/preview-bridge.js": abs(filePath(preview_bridge_default)),
1250
+ "preview/scripts/preview-shell.js": abs(filePath(preview_shell_default)),
1251
+ "profiles/CGATS21_CRPC1.icc": abs(filePath(CGATS21_CRPC1_default)),
1252
+ "engine/gutterpress-viewer.js": abs(filePath(gutterpress_viewer_default)),
1253
+ "engine/gutterpress-agent.js": abs(filePath(gutterpress_agent_default)),
1254
+ "templates/book/manifest.yaml": abs(filePath(manifest_default)),
1255
+ "templates/book/chapter-01.md": abs(filePath(chapter_01_default)),
1256
+ "templates/zine/manifest.yaml": abs(filePath(manifest_default2)),
1257
+ "templates/zine/chapter-01.md": abs(filePath(chapter_01_default2)),
1258
+ "templates/technical/manifest.yaml": abs(filePath(manifest_default3)),
1259
+ "templates/technical/chapter-01.md": abs(filePath(chapter_01_default3)),
1260
+ "templates/paper/manifest.yaml": abs(filePath(manifest_default4)),
1261
+ "templates/paper/chapter-01.md": abs(filePath(chapter_01_default4)),
1262
+ "extension-templates/plugin/package.json": abs(filePath(package_default)),
1263
+ "extension-templates/plugin/README.md": abs(filePath(README_default)),
1264
+ "extension-templates/plugin/plugin.js.tpl": abs(filePath(plugin_js_default)),
1265
+ "extension-templates/plugin/styles/plugin.css": abs(filePath(plugin_default)),
1266
+ "extension-templates/plugin/snippets/term-box.md": abs(filePath(term_box_default)),
1267
+ "extension-templates/plugin/test/fixture.md": abs(filePath(fixture_default)),
1268
+ "extension-templates/plugin/test/expected.html": abs(filePath(expected_default)),
1269
+ "extension-templates/plugin/test/plugin.test.js.tpl": abs(filePath(plugin_test_js_default)),
1270
+ "extension-templates/look/package.json": abs(filePath(package_default2)),
1271
+ "extension-templates/look/README.md": abs(filePath(README_default2)),
1272
+ "extension-templates/look/components.yaml": abs(filePath(components_default)),
1273
+ "extension-templates/look/snippets/callout.md": abs(filePath(callout_default)),
1274
+ "extension-templates/look/styles/tokens.css": abs(filePath(tokens_default)),
1275
+ "extension-templates/look/styles/base.css": abs(filePath(base_default)),
1276
+ "extension-templates/look/styles/components.css": abs(filePath(components_default2)),
1277
+ "extension-templates/look/styles/page-templates.css": abs(filePath(page_templates_default)),
1278
+ "extension-templates/look/styles/page-rules.css": abs(filePath(page_rules_default)),
1279
+ "extension-templates/look/styles/book.css": abs(filePath(book_default))
1280
+ };
1281
+ var extractPromise = null;
1282
+ async function extractAssets() {
1283
+ const root = await mkdtemp(join(tmpdir(), "gutterpress-assets-"));
1284
+ for (const [relPath, srcPath] of Object.entries(EMBEDDED_ASSETS)) {
1285
+ const dest = join(root, relPath);
1286
+ await mkdir(dirname(dest), { recursive: true });
1287
+ const bytes = await readFile(srcPath);
1288
+ await writeFile(dest, bytes);
1289
+ }
1290
+ return root;
1291
+ }
1292
+ var SENTINEL_ASSET = "engine/gutterpress-viewer.js";
1293
+ async function getAssetsDir() {
1294
+ if (extractPromise) {
1295
+ try {
1296
+ const root = await extractPromise;
1297
+ if (existsSync(join(root, SENTINEL_ASSET))) {
1298
+ return root;
1299
+ }
1300
+ } catch {}
1301
+ extractPromise = null;
1302
+ }
1303
+ extractPromise = extractAssets();
1304
+ return extractPromise;
1305
+ }
1306
+ async function getAssetPath(relPath) {
1307
+ const root = await getAssetsDir();
1308
+ return join(root, relPath);
1309
+ }
1310
+
1129
1311
  // src/engine/compiler/tier2.ts
1130
1312
  var DEFAULT_SLUG_PT = 18;
1131
1313
  function classify(model) {
@@ -1451,8 +1633,8 @@ function pagePseudoContexts(model) {
1451
1633
  }
1452
1634
  async function build(opts) {
1453
1635
  const log = opts.onProgress ?? (() => {});
1454
- const AGENT = await readFile(await getAssetPath("engine/gutterpress-agent.js"), "utf8");
1455
- const VIEWER = await readFile(await getAssetPath("engine/gutterpress-viewer.js"), "utf8");
1636
+ const AGENT = await readFile2(await getAssetPath("engine/gutterpress-agent.js"), "utf8");
1637
+ const VIEWER = await readFile2(await getAssetPath("engine/gutterpress-viewer.js"), "utf8");
1456
1638
  const browser = opts.browser ?? await launchChromium();
1457
1639
  const ownsBrowser = !opts.browser;
1458
1640
  const page = await browser.newPage();
@@ -1461,7 +1643,7 @@ async function build(opts) {
1461
1643
  const diagnose = (code, message, severity = "warning") => diagnostics.push({ code, severity, message });
1462
1644
  let prints = 0;
1463
1645
  try {
1464
- const url = /^(https?|file):\/\//.test(opts.input) ? opts.input : pathToFileURL(resolve(opts.input)).href;
1646
+ const url = /^(https?|file):\/\//.test(opts.input) ? opts.input : pathToFileURL(resolve2(opts.input)).href;
1465
1647
  await page.navigate(url);
1466
1648
  await page.evaluate(AGENT);
1467
1649
  await page.waitForReady();
@@ -2503,4 +2685,4 @@ ${lines.length ? lines.join(`
2503
2685
  `);
2504
2686
  }
2505
2687
 
2506
- export { lastPageMode, extract, resolvePage, MARGIN_BOX_IGNORED_PROPERTIES, build };
2688
+ export { lastPageMode, DEFAULT_PAGE_MARGIN_PT, getAssetPath, MARGIN_BOX_IGNORED_PROPERTIES, build };
@@ -2,7 +2,8 @@
2
2
  import { lstat, readFile, realpath } from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { exports as resolveExports } from "resolve.exports";
5
- var PLUGINS_DIR = "plugins";
5
+ var EXTENSIONS_DIR = "extensions";
6
+ var LEGACY_PLUGINS_DIR = "plugins";
6
7
  var VENDORED_NPM_DIR = "npm";
7
8
  var NPM_SEGMENT = /^[a-z0-9][a-z0-9._~-]*$/;
8
9
  var EXACT_VERSION = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
@@ -51,7 +52,10 @@ function encodePathPart(value) {
51
52
  return encodeURIComponent(value).replace(/[!'()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
52
53
  }
53
54
  function vendoredNpmPluginRoot(projectDir, name, version) {
54
- return path.join(projectDir, PLUGINS_DIR, VENDORED_NPM_DIR, encodePathPart(name), encodePathPart(version));
55
+ return path.join(projectDir, EXTENSIONS_DIR, VENDORED_NPM_DIR, encodePathPart(name), encodePathPart(version));
56
+ }
57
+ function vendoredNpmPluginRoots(projectDir, name, version) {
58
+ return [EXTENSIONS_DIR, LEGACY_PLUGINS_DIR].map((parent) => path.join(projectDir, parent, VENDORED_NPM_DIR, encodePathPart(name), encodePathPart(version)));
55
59
  }
56
60
  function vendoredNpmPluginPackageDir(installRoot, name) {
57
61
  return path.join(installRoot, "node_modules", ...name.split("/"));
@@ -175,15 +179,20 @@ async function resolvePackageEntry(packageDir, packageJson) {
175
179
  }
176
180
  async function resolveVendoredPluginInstallRoot(projectDir, expectedName, expectedVersion) {
177
181
  const requestedProjectRoot = path.resolve(projectDir);
178
- const requestedInstallRoot = vendoredNpmPluginRoot(requestedProjectRoot, expectedName, expectedVersion);
182
+ let requestedInstallRoot = "";
179
183
  let installInfo;
180
- try {
181
- installInfo = await lstat(requestedInstallRoot);
182
- } catch (error) {
183
- if (error.code === "ENOENT")
184
- return null;
185
- throw error;
184
+ for (const candidate of vendoredNpmPluginRoots(requestedProjectRoot, expectedName, expectedVersion)) {
185
+ requestedInstallRoot = candidate;
186
+ try {
187
+ installInfo = await lstat(requestedInstallRoot);
188
+ break;
189
+ } catch (error) {
190
+ if (error.code !== "ENOENT")
191
+ throw error;
192
+ }
186
193
  }
194
+ if (!installInfo)
195
+ return null;
187
196
  if (!installInfo.isDirectory() || installInfo.isSymbolicLink()) {
188
197
  throw new Error("Vendor install root is not a normal directory.");
189
198
  }
@@ -197,4 +206,4 @@ async function resolveVendoredPluginInstallRoot(projectDir, expectedName, expect
197
206
  return installRoot;
198
207
  }
199
208
 
200
- export { PLUGINS_DIR, VENDORED_NPM_DIR, isValidNpmPackageName, parseNpmPluginSpec, isExactNpmVersion, vendoredNpmPluginRoot, vendoredNpmPluginPackageDir, toPosixPath, assertWindowsSafeRelativePath, windowsPathKey, packageResolutionTargets, safePackageTarget, resolvePackageEntry, resolveVendoredPluginInstallRoot };
209
+ export { EXTENSIONS_DIR, LEGACY_PLUGINS_DIR, VENDORED_NPM_DIR, isValidNpmPackageName, parseNpmPluginSpec, isExactNpmVersion, vendoredNpmPluginRoot, vendoredNpmPluginRoots, vendoredNpmPluginPackageDir, assertWindowsSafeRelativePath, windowsPathKey, packageResolutionTargets, safePackageTarget, resolvePackageEntry, resolveVendoredPluginInstallRoot };
package/dist/cli.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  } from "./cli-d8xjns66.js";
9
9
  import {
10
10
  package_default
11
- } from "./cli-nr6j6300.js";
11
+ } from "./cli-5jzyw06s.js";
12
12
  import {
13
13
  EXIT_CODES
14
14
  } from "./cli-46ycxe6r.js";
@@ -20,14 +20,14 @@ import {
20
20
  import { defineCommand, parseArgs, runMain } from "citty";
21
21
  import { statSync } from "node:fs";
22
22
  var SUBCOMMANDS = {
23
- new: () => import("./new-xhq8wczn.js").then((m) => m.default),
24
- preview: () => import("./preview-cep2s9cg.js").then((m) => m.default),
25
- build: () => import("./build-09cd1n7s.js").then((m) => m.default),
26
- publish: () => import("./publish-xery6qc6.js").then((m) => m.default),
27
- validate: () => import("./validate-3d0sgf4g.js").then((m) => m.default),
28
- preflight: () => import("./preflight-negnxg7b.js").then((m) => m.default),
29
- doctor: () => import("./doctor-nddspx4n.js").then((m) => m.default),
30
- ext: () => import("./ext-zjpen4yx.js").then((m) => m.default)
23
+ new: () => import("./new-s4zcaepg.js").then((m) => m.default),
24
+ preview: () => import("./preview-mzytcwyk.js").then((m) => m.default),
25
+ build: () => import("./build-m78jcpf7.js").then((m) => m.default),
26
+ publish: () => import("./publish-fez14ad4.js").then((m) => m.default),
27
+ validate: () => import("./validate-p2chr6hr.js").then((m) => m.default),
28
+ preflight: () => import("./preflight-c7w1xdn3.js").then((m) => m.default),
29
+ doctor: () => import("./doctor-j71jqce3.js").then((m) => m.default),
30
+ ext: () => import("./ext-fq2hg9va.js").then((m) => m.default)
31
31
  };
32
32
  var VERSION = package_default.version;
33
33
  var main = defineCommand({
@@ -52,7 +52,7 @@ async function preflightRequiredInvocations(rawArgs) {
52
52
  const [command, ...commandArgs] = rawArgs;
53
53
  try {
54
54
  if (command === "new") {
55
- const { newArgs } = await import("./new-xhq8wczn.js");
55
+ const { newArgs } = await import("./new-s4zcaepg.js");
56
56
  rejectUnknownFlags(commandArgs, newArgs, "new");
57
57
  const parsed = parseArgs(commandArgs, {
58
58
  ...newArgs,
@@ -64,7 +64,7 @@ async function preflightRequiredInvocations(rawArgs) {
64
64
  return;
65
65
  }
66
66
  if (command === "preflight") {
67
- const { preflightArgs } = await import("./preflight-negnxg7b.js");
67
+ const { preflightArgs } = await import("./preflight-c7w1xdn3.js");
68
68
  rejectUnknownFlags(commandArgs, preflightArgs, "preflight");
69
69
  const parsed = parseArgs(commandArgs, {
70
70
  ...preflightArgs,
@@ -84,7 +84,7 @@ async function preflightRequiredInvocations(rawArgs) {
84
84
  }
85
85
  if (subcommand.startsWith("-"))
86
86
  return;
87
- const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-zjpen4yx.js");
87
+ const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-fq2hg9va.js");
88
88
  if (!EXT_SUBCOMMANDS.includes(subcommand)) {
89
89
  throw new UsageError(`gutterpress ext: unknown command "${subcommand}"`);
90
90
  }
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  getSystemDiagnostics
3
- } from "./cli-ccp7sxz3.js";
3
+ } from "./cli-n2tsxqpn.js";
4
4
  import"./cli-asap4t1z.js";
5
5
  import {
6
6
  log
7
- } from "./cli-b0vyjvmt.js";
7
+ } from "./cli-s6djx4ma.js";
8
8
  import {
9
9
  UsageError,
10
10
  rejectExtraPositionals,
11
11
  rejectUnknownFlags
12
12
  } from "./cli-d8xjns66.js";
13
- import"./cli-nr6j6300.js";
13
+ import"./cli-5jzyw06s.js";
14
14
  import"./cli-46ycxe6r.js";
15
15
  import"./cli-37x76zdn.js";
16
16
 
@@ -109,6 +109,14 @@ export declare function parseMargin(value: string): {
109
109
  * Later rules win; specificity follows the spec's simplified order
110
110
  * (unnamed < named, no-pseudo < pseudo).
111
111
  */
112
+ /**
113
+ * The margin a page has when no `@page` rule sets one: what `resolvePage`
114
+ * assumes, and what the assembly writes ahead of every stylesheet
115
+ * (`defaultPageMarginCss`, lib/markdown/assemble.ts) so Chromium prints with
116
+ * the same number instead of its own default of about 0.4in, which would
117
+ * make the preview and the PDF paginate differently.
118
+ */
119
+ export declare const DEFAULT_PAGE_MARGIN_PT = 72;
112
120
  export declare function resolvePage(model: GcpmModel, ctx?: {
113
121
  name?: string;
114
122
  pseudos?: string[];
@@ -55,6 +55,13 @@ export interface PrintAreaSource {
55
55
  safe?: number;
56
56
  artSafe?: number;
57
57
  gutter?: number;
58
+ /** The margins the manifest sets (pt), written as the book's `@page` margins; absent = the stylesheets'. */
59
+ margin?: {
60
+ top: number;
61
+ bottom: number;
62
+ inside: number;
63
+ outside: number;
64
+ };
58
65
  preset?: string;
59
66
  spec?: {
60
67
  label: string;
@@ -63,11 +70,16 @@ export interface PrintAreaSource {
63
70
  }
64
71
  /** A usable point value: finite and positive (a page dimension, an inset). */
65
72
  export declare function isPositivePoints(value: unknown): value is number;
73
+ /** A margin value: finite and 0 or more (a full-bleed edge has no margin). */
74
+ export declare function isNonNegativePoints(value: unknown): value is number;
75
+ /** Round to 3dp so 8.27in doesn't print as 8.270000000000001in. */
76
+ export declare const round3: (n: number) => number;
77
+ /** CSS length for a point value: inches when exact to 3dp (612 -> 8.5in), else points. */
78
+ export declare function cssLength(pt: number): string;
66
79
  /**
67
- * The `size` value written for a page — `8.5in 11in`, `595pt 842pt` — by
68
- * everything that writes one: Book settings (lib/page-size.ts) into the
69
- * book's stylesheet, and the assembly's manifest default
70
- * (lib/markdown/assemble.ts), so one size has one spelling.
80
+ * The `size` value written for a page — `8.5in 11in`, `595pt 842pt` — by the
81
+ * assembly's `@page` rule (lib/markdown/assemble.ts), the one place a size is
82
+ * written, so one size has one spelling.
71
83
  */
72
84
  export declare function formatPageSize(page: {
73
85
  width: number;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  build
3
- } from "./index-0w2azsk1.js";
4
- import"./index-apc8w9w8.js";
3
+ } from "./index-nvmf22rt.js";
4
+ import"./index-nedd07bk.js";
5
5
  import {
6
6
  BuildError
7
- } from "./index-dsvk7q6s.js";
7
+ } from "./index-46ycxe6r.js";
8
8
  import"./index-bt0qws5c.js";
9
9
  import"./index-37x76zdn.js";
10
10
 
@@ -1,9 +1,8 @@
1
1
  import {
2
2
  build
3
- } from "./cli-dtckwda1.js";
3
+ } from "./cli-xsrffqzt.js";
4
4
  import"./cli-eyyggect.js";
5
5
  import"./cli-asap4t1z.js";
6
- import"./cli-fe43evmf.js";
7
6
  import {
8
7
  BuildError
9
8
  } from "./cli-46ycxe6r.js";
@@ -2,29 +2,28 @@ import {
2
2
  importExtensionFromFile,
3
3
  importExtensionFromUrl,
4
4
  searchNpmExtensions
5
- } from "./cli-5hkmp2wy.js";
6
- import"./cli-ccp7sxz3.js";
5
+ } from "./cli-1h17ktsg.js";
6
+ import"./cli-n2tsxqpn.js";
7
7
  import"./cli-ht1bcqdd.js";
8
- import"./cli-dtckwda1.js";
8
+ import"./cli-xsrffqzt.js";
9
9
  import"./cli-2ppw6q9v.js";
10
10
  import"./cli-eyyggect.js";
11
11
  import"./cli-asap4t1z.js";
12
- import"./cli-habkc5ng.js";
12
+ import"./cli-a35w7wzg.js";
13
13
  import"./cli-v5mp7a6q.js";
14
14
  import {
15
- BUILT_IN_STYLE_SET_IDS,
16
- addBuiltInStyleSet,
17
15
  addExtension,
18
16
  checkExtensionUpdates,
19
- isPathSpecifier,
20
17
  listProjectExtensions,
21
- parseExtensionSpecifier,
22
18
  removeExtension,
23
19
  setExtensionEnabled,
24
20
  updateExtensions
25
- } from "./cli-dd115fa8.js";
26
- import"./cli-h17e3mtz.js";
27
- import"./cli-b0vyjvmt.js";
21
+ } from "./cli-h4x81x97.js";
22
+ import {
23
+ isPathSpecifier,
24
+ parseExtensionSpecifier
25
+ } from "./cli-t8be9yeb.js";
26
+ import"./cli-s6djx4ma.js";
28
27
  import {
29
28
  UsageError,
30
29
  exitForUsage,
@@ -32,12 +31,11 @@ import {
32
31
  rejectUnknownFlags,
33
32
  resolveProjectDir
34
33
  } from "./cli-d8xjns66.js";
35
- import"./cli-nr6j6300.js";
36
- import"./cli-fe43evmf.js";
34
+ import"./cli-5jzyw06s.js";
37
35
  import {
38
36
  EXIT_CODES
39
37
  } from "./cli-46ycxe6r.js";
40
- import"./cli-h3phdstf.js";
38
+ import"./cli-y28j019d.js";
41
39
  import"./cli-37x76zdn.js";
42
40
 
43
41
  // src/commands/ext.ts
@@ -58,7 +56,7 @@ var extListArgs = { dir: dirArg };
58
56
  var extAddArgs = {
59
57
  source: {
60
58
  type: "positional",
61
- description: "What to add: an npm package (name or name@version), a bundled feature (markdown-it-mark, …), a folder or plugin file path, a .zip or .css file, or an http(s) URL",
59
+ description: "What to add: an npm package (name or name@version), a bundled name (a feature like markdown-it-mark or a look like academic), a folder or plugin file path, a .zip or .css file, or an http(s) URL",
62
60
  required: true
63
61
  },
64
62
  dir: dirArg,
@@ -66,11 +64,6 @@ var extAddArgs = {
66
64
  type: "string",
67
65
  description: "Named module export to use as the plugin function (npm and path extensions only)",
68
66
  required: false
69
- },
70
- look: {
71
- type: "boolean",
72
- description: "Treat SOURCE as a built-in look id (clean-book, zine, technical-doc, academic): copy it into extensions/ and add it",
73
- required: false
74
67
  }
75
68
  };
76
69
  var extRemoveArgs = { specifier: specifierArg, dir: dirArg };
@@ -140,10 +133,10 @@ function printAdded(entry, projectDir, warnings = []) {
140
133
  if (entry.kind === "npm") {
141
134
  console.log(`Installed ${entry.use}`);
142
135
  console.log(` project: ${projectDir}`);
143
- console.log(" vendored under: plugins/npm");
136
+ console.log(" vendored under: extensions/npm");
144
137
  console.log(" manifest: exact version pinned");
145
138
  } else if (entry.kind === "bundled") {
146
- console.log(`Enabled bundled feature ${entry.use}`);
139
+ console.log(`Enabled bundled ${entry.carries.styles && !entry.carries.markdown ? "look" : "feature"} ${entry.use}`);
147
140
  console.log(` project: ${projectDir}`);
148
141
  } else {
149
142
  console.log(`Added ${entry.use} (${carriesLabel(entry)})`);
@@ -189,7 +182,7 @@ var list = defineCommand({
189
182
  var add = defineCommand({
190
183
  meta: {
191
184
  name: "add",
192
- description: "Add an extension: an npm package, a bundled feature, a folder or plugin file, a .zip/.css file, or a URL"
185
+ description: "Add an extension: an npm package, a bundled name (a feature or a look), a folder or plugin file, a .zip/.css file, or a URL"
193
186
  },
194
187
  args: extAddArgs,
195
188
  async run({ args, rawArgs }) {
@@ -208,10 +201,7 @@ var add = defineCommand({
208
201
  if (typeof args.export === "string" && !exportName) {
209
202
  throw new UsageError("gutterpress ext add: --export requires a non-empty name");
210
203
  }
211
- if (args.look && !BUILT_IN_STYLE_SET_IDS.includes(source)) {
212
- throw new UsageError(`gutterpress ext add --look: unknown built-in look "${source}" (one of: ${BUILT_IN_STYLE_SET_IDS.join(", ")})`);
213
- }
214
- if (!args.look && !isUrl && !existing) {
204
+ if (!isUrl && !existing) {
215
205
  try {
216
206
  if (path.isAbsolute(source) || isPathSpecifier(source)) {
217
207
  throw new Error(`source not found: ${candidate}`);
@@ -225,11 +215,6 @@ var add = defineCommand({
225
215
  exitForUsage(error);
226
216
  }
227
217
  try {
228
- if (args.look) {
229
- const entry2 = await addBuiltInStyleSet(projectDir, source);
230
- printAdded(entry2, projectDir);
231
- return;
232
- }
233
218
  if (isUrl) {
234
219
  const { entry: entry2, warnings } = await importExtensionFromUrl(projectDir, source);
235
220
  printAdded(entry2, projectDir, warnings.map((w) => w.message));
@@ -385,7 +370,7 @@ var update = defineCommand({
385
370
  for (const u of updated)
386
371
  console.log(`Updated ${u.name} ${u.from} -> ${u.to}`);
387
372
  console.log(` project: ${projectDir}`);
388
- console.log(" vendored under: plugins/npm (previous version removed)");
373
+ console.log(" vendored under: extensions/npm (previous version removed)");
389
374
  console.log(" manifest: exact version re-pinned");
390
375
  } catch (error) {
391
376
  failPipeline("Could not update extensions", error);
@@ -3,10 +3,10 @@ import {
3
3
  restoreForCommand,
4
4
  restoreOfflineMessage,
5
5
  restorePinnedExtensions
6
- } from "./index-m4hhzg3c.js";
7
- import"./index-2jpk25en.js";
8
- import"./index-dsvk7q6s.js";
9
- import"./index-r7jcsk6h.js";
6
+ } from "./index-7pck1q9c.js";
7
+ import"./index-0wee4408.js";
8
+ import"./index-46ycxe6r.js";
9
+ import"./index-5x42amh8.js";
10
10
  import"./index-37x76zdn.js";
11
11
  export {
12
12
  restorePinnedExtensions,
@@ -3,14 +3,13 @@ import {
3
3
  restoreForCommand,
4
4
  restoreOfflineMessage,
5
5
  restorePinnedExtensions
6
- } from "./cli-dd115fa8.js";
7
- import"./cli-h17e3mtz.js";
8
- import"./cli-b0vyjvmt.js";
6
+ } from "./cli-h4x81x97.js";
7
+ import"./cli-t8be9yeb.js";
8
+ import"./cli-s6djx4ma.js";
9
9
  import"./cli-d8xjns66.js";
10
- import"./cli-nr6j6300.js";
11
- import"./cli-fe43evmf.js";
10
+ import"./cli-5jzyw06s.js";
12
11
  import"./cli-46ycxe6r.js";
13
- import"./cli-h3phdstf.js";
12
+ import"./cli-y28j019d.js";
14
13
  import"./cli-37x76zdn.js";
15
14
  export {
16
15
  restorePinnedExtensions,
@@ -368,7 +368,8 @@
368
368
  mediaPrintBodies: () => mediaPrintBodies,
369
369
  extract: () => extract,
370
370
  PAGE_SIZES: () => PAGE_SIZES,
371
- MARGIN_BOX_NAMES: () => MARGIN_BOX_NAMES
371
+ MARGIN_BOX_NAMES: () => MARGIN_BOX_NAMES,
372
+ DEFAULT_PAGE_MARGIN_PT: () => DEFAULT_PAGE_MARGIN_PT
372
373
  });
373
374
  var MARGIN_BOX_NAMES = [
374
375
  "top-left-corner",
@@ -923,12 +924,18 @@
923
924
  const d = parts[3] ?? b;
924
925
  return { top: a, right: b, bottom: c, left: d };
925
926
  }
927
+ var DEFAULT_PAGE_MARGIN_PT = 72;
926
928
  function resolvePage(model, ctx = {}) {
927
929
  const wanted = new Set(ctx.pseudos ?? []);
928
930
  const applicable = model.pageRules.filter((r) => r.name ? r.name === ctx.name : true).filter((r) => r.pseudos.every((p) => wanted.has(p))).sort((a, b) => specificity(a) - specificity(b));
929
931
  const decls = {};
930
932
  const marginBoxes = {};
931
- const margin = { top: 72, right: 72, bottom: 72, left: 72 };
933
+ const margin = {
934
+ top: DEFAULT_PAGE_MARGIN_PT,
935
+ right: DEFAULT_PAGE_MARGIN_PT,
936
+ bottom: DEFAULT_PAGE_MARGIN_PT,
937
+ left: DEFAULT_PAGE_MARGIN_PT
938
+ };
932
939
  for (const rule of applicable) {
933
940
  for (const [prop, value] of Object.entries(rule.decls)) {
934
941
  if (prop === "margin")