gutterpress 0.11.9-alpha.1 → 0.11.9-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.
- package/README.md +2 -2
- package/dist/api/index.js +2 -2
- package/dist/{audit-ydxsev28.js → audit-z6hp3dep.js} +4 -4
- package/dist/{build-xd4bjtbv.js → build-9ze0fcgq.js} +4 -4
- package/dist/{cli-h91e69hm.js → cli-d8rdk1y7.js} +1 -1
- package/dist/{cli-b4ramtgc.js → cli-edn2tver.js} +81 -32
- package/dist/{cli-cfymymkv.js → cli-ervhbr00.js} +1 -1
- package/dist/{cli-9a5eacxd.js → cli-nc752ryp.js} +1 -1
- package/dist/cli.js +14 -14
- package/dist/{doctor-b097943h.js → doctor-yk3ah4yk.js} +2 -2
- package/dist/{engine-w2m1jp4p.js → engine-qtfrfbpk.js} +1 -1
- package/dist/{engine-s6240qap.js → engine-trte2tg2.js} +2 -2
- package/dist/{ext-ft6h0qn9.js → ext-8hrf9n6f.js} +4 -4
- package/dist/{index-91k91awj.js → index-27xa2tfd.js} +80 -31
- package/dist/{index-71pn94g1.js → index-kqftehgy.js} +1 -1
- package/dist/{index-mks8j9av.js → index-t43k5rq1.js} +1 -1
- package/dist/index.js +3 -3
- package/dist/lib/publish/providers/local-folder.d.ts +6 -0
- package/dist/lib/publish/types.d.ts +1 -1
- package/dist/{lint-exc3w24c.js → lint-qxcpd3ry.js} +4 -4
- package/dist/{manifest.schema-hsn8rsgr.json → manifest.schema-61bsspsb.json} +9 -0
- package/dist/{new-6nz32v7c.js → new-3a5ng8yv.js} +4 -4
- package/dist/{preflight-5kq978aq.js → preflight-qwbkp4pq.js} +4 -4
- package/dist/{preview-8dcs83k4.js → preview-aska26g4.js} +4 -4
- package/dist/{publish-2ks819pa.js → publish-jam8mqes.js} +4 -4
- package/dist/{validate-e8qneem9.js → validate-3cwwe0d5.js} +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -237,12 +237,12 @@ plus the PDF from the second — the pdf build never overwrites `book.html`.
|
|
|
237
237
|
|
|
238
238
|
### `gutterpress publish`
|
|
239
239
|
|
|
240
|
-
Push a built PDF/HTML artifact to a publishing platform (itch.io, DriveThruRPG, Amazon KDP, Azure Static Web Apps, Shopify, Google Drive), headlessly and CI-safely. Credentials live in a 0600 user-config store (never in the project); provider env vars override it for CI. Most providers connect with a pasted API key; Google Drive connects through your browser instead (`--connect` opens the sign-in page — nothing to paste).
|
|
240
|
+
Push a built PDF/HTML artifact to a publishing platform (itch.io, DriveThruRPG, Amazon KDP, Azure Static Web Apps, Shopify, Google Drive) or copy it to a local folder (`local`, the desktop's default first destination), headlessly and CI-safely. Credentials live in a 0600 user-config store (never in the project); provider env vars override it for CI. Most providers connect with a pasted API key; Google Drive connects through your browser instead (`--connect` opens the sign-in page — nothing to paste).
|
|
241
241
|
|
|
242
242
|
```sh
|
|
243
243
|
gutterpress publish [project] [options]
|
|
244
244
|
|
|
245
|
-
--provider <id> itch | drivethrurpg | kdp | azure-swa | shopify | gdrive
|
|
245
|
+
--provider <id> local | itch | drivethrurpg | kdp | azure-swa | shopify | gdrive
|
|
246
246
|
--list List providers and connection status
|
|
247
247
|
--connect Store an API key for --provider (from --token, the provider's env var, or piped stdin) — or, for gdrive, open the browser to connect
|
|
248
248
|
--disconnect Forget the stored key for --provider
|
package/dist/api/index.js
CHANGED
|
@@ -124,12 +124,12 @@ import {
|
|
|
124
124
|
syncProject,
|
|
125
125
|
testRemoteAccess,
|
|
126
126
|
validateProjectExtensions
|
|
127
|
-
} from "../index-
|
|
127
|
+
} from "../index-27xa2tfd.js";
|
|
128
128
|
import {
|
|
129
129
|
BuildError,
|
|
130
130
|
DEFAULT_PRINT_OPTS,
|
|
131
131
|
readyProbeExpr
|
|
132
|
-
} from "../index-
|
|
132
|
+
} from "../index-t43k5rq1.js";
|
|
133
133
|
import {
|
|
134
134
|
AUTO_SNAPSHOT_MESSAGE,
|
|
135
135
|
DEFAULT_NPM_REGISTRY,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeAndReport
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-edn2tver.js";
|
|
4
4
|
import {
|
|
5
5
|
log
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-nc752ryp.js";
|
|
7
7
|
import {
|
|
8
8
|
UsageError,
|
|
9
9
|
rejectExtraPositionals,
|
|
10
10
|
rejectUnknownFlags
|
|
11
|
-
} from "./cli-
|
|
12
|
-
import"./cli-
|
|
11
|
+
} from "./cli-ervhbr00.js";
|
|
12
|
+
import"./cli-d8rdk1y7.js";
|
|
13
13
|
import"./cli-c41yr7he.js";
|
|
14
14
|
import {
|
|
15
15
|
EXIT_CODES
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runBuild,
|
|
3
3
|
splitOutPath
|
|
4
|
-
} from "./cli-
|
|
4
|
+
} from "./cli-edn2tver.js";
|
|
5
5
|
import {
|
|
6
6
|
log
|
|
7
|
-
} from "./cli-
|
|
7
|
+
} from "./cli-nc752ryp.js";
|
|
8
8
|
import {
|
|
9
9
|
UsageError,
|
|
10
10
|
parseFormat,
|
|
11
11
|
parsePdfxFlavor,
|
|
12
12
|
rejectExtraPositionals,
|
|
13
13
|
rejectUnknownFlags
|
|
14
|
-
} from "./cli-
|
|
15
|
-
import"./cli-
|
|
14
|
+
} from "./cli-ervhbr00.js";
|
|
15
|
+
import"./cli-d8rdk1y7.js";
|
|
16
16
|
import"./cli-c41yr7he.js";
|
|
17
17
|
import {
|
|
18
18
|
BuildError
|
|
@@ -1430,7 +1430,7 @@ import { fileURLToPath } from "node:url";
|
|
|
1430
1430
|
var favicon_default = "./favicon-wkbm9cjn.ico";
|
|
1431
1431
|
|
|
1432
1432
|
// src/assets/manifest.schema.json
|
|
1433
|
-
var manifest_schema_default = "./manifest.schema-
|
|
1433
|
+
var manifest_schema_default = "./manifest.schema-61bsspsb.json";
|
|
1434
1434
|
|
|
1435
1435
|
// src/assets/preview/scripts/preview-interface.js
|
|
1436
1436
|
var preview_interface_default = "./preview-interface-9rwz21yw.js";
|
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
stampCreator,
|
|
14
14
|
stripAnnotations,
|
|
15
15
|
warn
|
|
16
|
-
} from "./cli-
|
|
16
|
+
} from "./cli-nc752ryp.js";
|
|
17
17
|
import {
|
|
18
18
|
DEBOUNCE,
|
|
19
19
|
UsageError,
|
|
20
20
|
resolvePort
|
|
21
|
-
} from "./cli-
|
|
21
|
+
} from "./cli-ervhbr00.js";
|
|
22
22
|
import {
|
|
23
23
|
MARGIN_BOX_IGNORED_PROPERTIES,
|
|
24
24
|
RENDER_TIMEOUT_MS,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
getAssetsDir,
|
|
29
29
|
getBrowser,
|
|
30
30
|
prewarmBrowser
|
|
31
|
-
} from "./cli-
|
|
31
|
+
} from "./cli-d8rdk1y7.js";
|
|
32
32
|
import {
|
|
33
33
|
INSTALL_HINTS,
|
|
34
34
|
execCapture,
|
|
@@ -8193,7 +8193,7 @@ class PdfOutput {
|
|
|
8193
8193
|
const rawPdf = pdfxMode ? path8.join(stage, "raw.pdf") : path8.resolve(pdfFile);
|
|
8194
8194
|
await fsp2.mkdir(path8.dirname(path8.resolve(pdfFile)), { recursive: true });
|
|
8195
8195
|
log.info("Rendering HTML to PDF via the Gutterpress engine (native Chromium pagination)");
|
|
8196
|
-
const { buildNativePdf } = await import("./engine-
|
|
8196
|
+
const { buildNativePdf } = await import("./engine-qtfrfbpk.js");
|
|
8197
8197
|
const engineDiagnostics = await buildNativePdf(htmlFile, rawPdf, {
|
|
8198
8198
|
title: config.title,
|
|
8199
8199
|
author: config.authors.length > 0 ? config.authors.join(", ") : undefined,
|
|
@@ -12989,6 +12989,54 @@ var kdpProvider = {
|
|
|
12989
12989
|
}
|
|
12990
12990
|
};
|
|
12991
12991
|
|
|
12992
|
+
// src/lib/publish/providers/local-folder.ts
|
|
12993
|
+
import { cp as cp5, mkdir as mkdir13, stat as stat9 } from "node:fs/promises";
|
|
12994
|
+
import path22 from "node:path";
|
|
12995
|
+
var LOCAL_PUBLISH_DEFAULT_DIR = "dist";
|
|
12996
|
+
var info7 = {
|
|
12997
|
+
id: "local",
|
|
12998
|
+
label: "A folder on this computer",
|
|
12999
|
+
kind: "api",
|
|
13000
|
+
format: "pdf",
|
|
13001
|
+
formats: ["pdf", "html"],
|
|
13002
|
+
description: "Save the finished file to a folder you choose.",
|
|
13003
|
+
configFields: [
|
|
13004
|
+
{ key: "dir", label: "Folder", placeholder: LOCAL_PUBLISH_DEFAULT_DIR }
|
|
13005
|
+
],
|
|
13006
|
+
credential: { required: false, host: "" }
|
|
13007
|
+
};
|
|
13008
|
+
function localPublishDir(req) {
|
|
13009
|
+
const dir = typeof req.config.dir === "string" && req.config.dir.trim() ? req.config.dir.trim() : LOCAL_PUBLISH_DEFAULT_DIR;
|
|
13010
|
+
return path22.resolve(req.project.projectDir, dir);
|
|
13011
|
+
}
|
|
13012
|
+
var localFolderProvider = {
|
|
13013
|
+
info: info7,
|
|
13014
|
+
async authenticate() {
|
|
13015
|
+
return { ok: true };
|
|
13016
|
+
},
|
|
13017
|
+
async preflight(req) {
|
|
13018
|
+
const dir = localPublishDir(req);
|
|
13019
|
+
try {
|
|
13020
|
+
const s = await stat9(dir);
|
|
13021
|
+
if (!s.isDirectory()) {
|
|
13022
|
+
return [
|
|
13023
|
+
{ severity: "error", id: "local/not-a-folder", message: `${dir} exists but is not a folder.` }
|
|
13024
|
+
];
|
|
13025
|
+
}
|
|
13026
|
+
} catch {}
|
|
13027
|
+
return [];
|
|
13028
|
+
},
|
|
13029
|
+
async upload(req) {
|
|
13030
|
+
const dir = localPublishDir(req);
|
|
13031
|
+
await mkdir13(dir, { recursive: true });
|
|
13032
|
+
const dest = req.artifact.format === "html" ? dir : path22.join(dir, path22.basename(req.artifact.path));
|
|
13033
|
+
if (path22.resolve(dest) !== path22.resolve(req.artifact.path)) {
|
|
13034
|
+
await cp5(req.artifact.path, dest, { recursive: true });
|
|
13035
|
+
}
|
|
13036
|
+
return { kind: "published", detail: `Saved to ${dest}` };
|
|
13037
|
+
}
|
|
13038
|
+
};
|
|
13039
|
+
|
|
12992
13040
|
// src/lib/publish/providers/shopify.ts
|
|
12993
13041
|
var SHOPIFY_HOST = "shopify";
|
|
12994
13042
|
var DEFAULT_API_VERSION = "2026-04";
|
|
@@ -13003,7 +13051,7 @@ function requireValidShop(shop) {
|
|
|
13003
13051
|
}
|
|
13004
13052
|
return shop;
|
|
13005
13053
|
}
|
|
13006
|
-
var
|
|
13054
|
+
var info8 = {
|
|
13007
13055
|
id: "shopify",
|
|
13008
13056
|
label: "Shopify",
|
|
13009
13057
|
kind: "api",
|
|
@@ -13037,7 +13085,7 @@ function readConfig3(req) {
|
|
|
13037
13085
|
async function adminGraphQL(req, query, variables = {}) {
|
|
13038
13086
|
const { shop: rawShop, apiVersion } = readConfig3(req);
|
|
13039
13087
|
const shop = requireValidShop(rawShop);
|
|
13040
|
-
const resolved = await resolvePublishCredential(
|
|
13088
|
+
const resolved = await resolvePublishCredential(info8, req.deps);
|
|
13041
13089
|
if (!resolved) {
|
|
13042
13090
|
throw new Error("No Shopify access token found. Connect Shopify (or set SHOPIFY_ADMIN_TOKEN) first.");
|
|
13043
13091
|
}
|
|
@@ -13088,9 +13136,9 @@ function userErrorsToMessage(result) {
|
|
|
13088
13136
|
return errs?.length ? errs[0].message : null;
|
|
13089
13137
|
}
|
|
13090
13138
|
var shopifyProvider = {
|
|
13091
|
-
info:
|
|
13139
|
+
info: info8,
|
|
13092
13140
|
async authenticate(req) {
|
|
13093
|
-
const resolved = await resolvePublishCredential(
|
|
13141
|
+
const resolved = await resolvePublishCredential(info8, req.deps);
|
|
13094
13142
|
if (!resolved) {
|
|
13095
13143
|
return {
|
|
13096
13144
|
ok: false,
|
|
@@ -13203,6 +13251,7 @@ var shopifyProvider = {
|
|
|
13203
13251
|
|
|
13204
13252
|
// src/lib/publish/registry.ts
|
|
13205
13253
|
var PROVIDERS = {
|
|
13254
|
+
local: localFolderProvider,
|
|
13206
13255
|
itch: itchProvider,
|
|
13207
13256
|
drivethrurpg: drivethrurpgProvider,
|
|
13208
13257
|
kdp: kdpProvider,
|
|
@@ -13223,16 +13272,16 @@ function publishProviderFor(id) {
|
|
|
13223
13272
|
}
|
|
13224
13273
|
|
|
13225
13274
|
// src/lib/publish/run-publish.ts
|
|
13226
|
-
import { readdir as readdir6, stat as
|
|
13227
|
-
import
|
|
13228
|
-
function resolvePublishFormat(
|
|
13229
|
-
if (
|
|
13275
|
+
import { readdir as readdir6, stat as stat10 } from "node:fs/promises";
|
|
13276
|
+
import path23 from "node:path";
|
|
13277
|
+
function resolvePublishFormat(info9, providerConfig) {
|
|
13278
|
+
if (info9.formats && info9.formats.length > 0) {
|
|
13230
13279
|
const configured = typeof providerConfig.format === "string" ? providerConfig.format.trim() : "";
|
|
13231
|
-
if (configured &&
|
|
13280
|
+
if (configured && info9.formats.includes(configured)) {
|
|
13232
13281
|
return configured;
|
|
13233
13282
|
}
|
|
13234
13283
|
}
|
|
13235
|
-
return
|
|
13284
|
+
return info9.format;
|
|
13236
13285
|
}
|
|
13237
13286
|
async function resolvePublishRequest(options, deps) {
|
|
13238
13287
|
const provider = publishProviderFor(options.providerId);
|
|
@@ -13245,9 +13294,9 @@ async function resolvePublishRequest(options, deps) {
|
|
|
13245
13294
|
const effectiveDeps = effectiveAccount ? { ...deps, credentialAccount: effectiveAccount } : deps;
|
|
13246
13295
|
const outDir = resolveOutputDir(manifestDir, config.title);
|
|
13247
13296
|
const effectiveFormat = resolvePublishFormat(provider.info, providerConfig);
|
|
13248
|
-
const defaultArtifact = effectiveFormat === "pdf" ?
|
|
13297
|
+
const defaultArtifact = effectiveFormat === "pdf" ? path23.join(outDir, artifactName(config.title, "pdf")) : outDir;
|
|
13249
13298
|
const artifact = {
|
|
13250
|
-
path: options.artifactPath ?
|
|
13299
|
+
path: options.artifactPath ? path23.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
|
|
13251
13300
|
format: effectiveFormat
|
|
13252
13301
|
};
|
|
13253
13302
|
return {
|
|
@@ -13265,7 +13314,7 @@ var PDF_HINT = "Build the PDF first (gutterpress build, or export it from the ap
|
|
|
13265
13314
|
var HTML_HINT = "Build the website export first (gutterpress build --format html).";
|
|
13266
13315
|
async function artifactIssues(artifact) {
|
|
13267
13316
|
try {
|
|
13268
|
-
const s = await
|
|
13317
|
+
const s = await stat10(artifact.path);
|
|
13269
13318
|
if (artifact.format === "pdf" && !s.isFile()) {
|
|
13270
13319
|
return [
|
|
13271
13320
|
{
|
|
@@ -13311,7 +13360,7 @@ async function artifactIssues(artifact) {
|
|
|
13311
13360
|
var BUILD_FINGERPRINT_FILENAME = "build-fingerprint.json";
|
|
13312
13361
|
async function htmlDirIssues(dir) {
|
|
13313
13362
|
const issues = [];
|
|
13314
|
-
const isThere = async (rel) =>
|
|
13363
|
+
const isThere = async (rel) => stat10(path23.join(dir, rel)).then(() => true, () => false);
|
|
13315
13364
|
if (!await isThere(BOOK_HTML)) {
|
|
13316
13365
|
issues.push({
|
|
13317
13366
|
severity: "error",
|
|
@@ -13382,17 +13431,17 @@ function overlayStore(inner, key, candidate) {
|
|
|
13382
13431
|
}
|
|
13383
13432
|
async function connectPublishProvider(options, deps) {
|
|
13384
13433
|
const provider = publishProviderFor(options.providerId);
|
|
13385
|
-
const
|
|
13386
|
-
if (!
|
|
13387
|
-
throw new Error(`${
|
|
13434
|
+
const info9 = provider.info;
|
|
13435
|
+
if (!info9.credential.required) {
|
|
13436
|
+
throw new Error(`${info9.label} needs no API key — just publish when you're ready.`);
|
|
13388
13437
|
}
|
|
13389
|
-
if (
|
|
13390
|
-
throw new Error(`${
|
|
13438
|
+
if (info9.credential.connect === "oauth") {
|
|
13439
|
+
throw new Error(`${info9.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info9.id} --connect" or use the desktop app's Connect button.`);
|
|
13391
13440
|
}
|
|
13392
13441
|
const token = options.token.trim();
|
|
13393
13442
|
if (!token)
|
|
13394
13443
|
throw new Error("Paste an API key first.");
|
|
13395
|
-
const host =
|
|
13444
|
+
const host = info9.credential.host;
|
|
13396
13445
|
const account = (options.account ?? "").trim();
|
|
13397
13446
|
const key = publishCredentialKey(host, account);
|
|
13398
13447
|
const candidate = {
|
|
@@ -13400,12 +13449,12 @@ async function connectPublishProvider(options, deps) {
|
|
|
13400
13449
|
kind: "token",
|
|
13401
13450
|
token,
|
|
13402
13451
|
...account ? { username: account } : {},
|
|
13403
|
-
label: account ||
|
|
13452
|
+
label: account || info9.label,
|
|
13404
13453
|
createdAt: Date.now()
|
|
13405
13454
|
};
|
|
13406
13455
|
const req = await resolvePublishRequest({
|
|
13407
13456
|
projectDir: options.projectDir,
|
|
13408
|
-
providerId:
|
|
13457
|
+
providerId: info9.id,
|
|
13409
13458
|
...options.manifestPath ? { manifestPath: options.manifestPath } : {}
|
|
13410
13459
|
}, deps);
|
|
13411
13460
|
const trialDeps = {
|
|
@@ -13416,10 +13465,10 @@ async function connectPublishProvider(options, deps) {
|
|
|
13416
13465
|
};
|
|
13417
13466
|
const auth = await provider.authenticate({ ...req, deps: trialDeps });
|
|
13418
13467
|
if (!auth.ok) {
|
|
13419
|
-
throw new Error(auth.message ?? `${
|
|
13468
|
+
throw new Error(auth.message ?? `${info9.label} didn't accept that key.`);
|
|
13420
13469
|
}
|
|
13421
13470
|
await deps.tokenStore.set(key, candidate);
|
|
13422
|
-
return { connected: true, providerId:
|
|
13471
|
+
return { connected: true, providerId: info9.id };
|
|
13423
13472
|
}
|
|
13424
13473
|
async function disconnectPublishCredential(key, deps, options = {}) {
|
|
13425
13474
|
const existing = await deps.tokenStore.get(key);
|
|
@@ -13544,13 +13593,13 @@ import diff3Merge from "diff3";
|
|
|
13544
13593
|
// src/lib/remote-auth/repair.ts
|
|
13545
13594
|
import git7 from "isomorphic-git";
|
|
13546
13595
|
// src/lib/publish/selections.ts
|
|
13547
|
-
import { chmod as chmod2, mkdir as
|
|
13548
|
-
import
|
|
13596
|
+
import { chmod as chmod2, mkdir as mkdir14, readFile as readFile30, writeFile as writeFile12 } from "node:fs/promises";
|
|
13597
|
+
import path24 from "node:path";
|
|
13549
13598
|
class PublishSelectionsStore {
|
|
13550
13599
|
filePath;
|
|
13551
13600
|
queue = Promise.resolve();
|
|
13552
13601
|
constructor(filePath) {
|
|
13553
|
-
this.filePath = filePath ??
|
|
13602
|
+
this.filePath = filePath ?? path24.join(defaultConfigDir(), "publish-selections.json");
|
|
13554
13603
|
}
|
|
13555
13604
|
async read() {
|
|
13556
13605
|
try {
|
|
@@ -13567,7 +13616,7 @@ class PublishSelectionsStore {
|
|
|
13567
13616
|
return { version: 1, global: {}, projects: {} };
|
|
13568
13617
|
}
|
|
13569
13618
|
async write(data) {
|
|
13570
|
-
await
|
|
13619
|
+
await mkdir14(path24.dirname(this.filePath), { recursive: true });
|
|
13571
13620
|
await writeFile12(this.filePath, JSON.stringify(data, null, 2), {
|
|
13572
13621
|
encoding: "utf8",
|
|
13573
13622
|
mode: 384
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
// package.json
|
|
5
5
|
var package_default = {
|
|
6
6
|
name: "gutterpress",
|
|
7
|
-
version: "0.11.9-alpha.
|
|
7
|
+
version: "0.11.9-alpha.3",
|
|
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",
|
package/dist/cli.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
UsageError,
|
|
7
7
|
package_default,
|
|
8
8
|
rejectUnknownFlags
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-ervhbr00.js";
|
|
10
10
|
import {
|
|
11
11
|
EXIT_CODES
|
|
12
12
|
} from "./cli-46ycxe6r.js";
|
|
@@ -18,16 +18,16 @@ import {
|
|
|
18
18
|
import { defineCommand, parseArgs, runMain } from "citty";
|
|
19
19
|
import { statSync } from "node:fs";
|
|
20
20
|
var SUBCOMMANDS = {
|
|
21
|
-
new: () => import("./new-
|
|
22
|
-
preview: () => import("./preview-
|
|
23
|
-
build: () => import("./build-
|
|
24
|
-
publish: () => import("./publish-
|
|
25
|
-
lint: () => import("./lint-
|
|
26
|
-
validate: () => import("./validate-
|
|
27
|
-
audit: () => import("./audit-
|
|
28
|
-
preflight: () => import("./preflight-
|
|
29
|
-
doctor: () => import("./doctor-
|
|
30
|
-
ext: () => import("./ext-
|
|
21
|
+
new: () => import("./new-3a5ng8yv.js").then((m) => m.default),
|
|
22
|
+
preview: () => import("./preview-aska26g4.js").then((m) => m.default),
|
|
23
|
+
build: () => import("./build-9ze0fcgq.js").then((m) => m.default),
|
|
24
|
+
publish: () => import("./publish-jam8mqes.js").then((m) => m.default),
|
|
25
|
+
lint: () => import("./lint-qxcpd3ry.js").then((m) => m.default),
|
|
26
|
+
validate: () => import("./validate-3cwwe0d5.js").then((m) => m.default),
|
|
27
|
+
audit: () => import("./audit-z6hp3dep.js").then((m) => m.default),
|
|
28
|
+
preflight: () => import("./preflight-qwbkp4pq.js").then((m) => m.default),
|
|
29
|
+
doctor: () => import("./doctor-yk3ah4yk.js").then((m) => m.default),
|
|
30
|
+
ext: () => import("./ext-8hrf9n6f.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-
|
|
55
|
+
const { newArgs } = await import("./new-3a5ng8yv.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-
|
|
67
|
+
const { preflightArgs } = await import("./preflight-qwbkp4pq.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-
|
|
87
|
+
const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-8hrf9n6f.js");
|
|
88
88
|
if (!EXT_SUBCOMMANDS.includes(subcommand)) {
|
|
89
89
|
throw new UsageError(`gutterpress ext: unknown command "${subcommand}"`);
|
|
90
90
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getSystemDiagnostics,
|
|
3
3
|
log
|
|
4
|
-
} from "./cli-
|
|
4
|
+
} from "./cli-nc752ryp.js";
|
|
5
5
|
import {
|
|
6
6
|
UsageError,
|
|
7
7
|
rejectExtraPositionals,
|
|
8
8
|
rejectUnknownFlags
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-ervhbr00.js";
|
|
10
10
|
import"./cli-c41yr7he.js";
|
|
11
11
|
import"./cli-46ycxe6r.js";
|
|
12
12
|
import"./cli-37x76zdn.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
build
|
|
3
|
-
} from "./index-
|
|
3
|
+
} from "./index-kqftehgy.js";
|
|
4
4
|
import {
|
|
5
5
|
BuildError,
|
|
6
6
|
RENDER_TIMEOUT_MS,
|
|
7
7
|
assertMilestone,
|
|
8
8
|
connectChromium,
|
|
9
9
|
getBrowser
|
|
10
|
-
} from "./index-
|
|
10
|
+
} from "./index-t43k5rq1.js";
|
|
11
11
|
import"./index-37x76zdn.js";
|
|
12
12
|
|
|
13
13
|
// src/lib/engine.ts
|
|
@@ -10,16 +10,16 @@ import {
|
|
|
10
10
|
removeExtension,
|
|
11
11
|
searchNpmExtensions,
|
|
12
12
|
setExtensionEnabled
|
|
13
|
-
} from "./cli-
|
|
14
|
-
import"./cli-
|
|
13
|
+
} from "./cli-edn2tver.js";
|
|
14
|
+
import"./cli-nc752ryp.js";
|
|
15
15
|
import {
|
|
16
16
|
UsageError,
|
|
17
17
|
exitForUsage,
|
|
18
18
|
rejectExtraPositionals,
|
|
19
19
|
rejectUnknownFlags,
|
|
20
20
|
resolveProjectDir
|
|
21
|
-
} from "./cli-
|
|
22
|
-
import"./cli-
|
|
21
|
+
} from "./cli-ervhbr00.js";
|
|
22
|
+
import"./cli-d8rdk1y7.js";
|
|
23
23
|
import"./cli-c41yr7he.js";
|
|
24
24
|
import {
|
|
25
25
|
EXIT_CODES
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
resolveChromiumExecutable,
|
|
19
19
|
run,
|
|
20
20
|
spawnCapture
|
|
21
|
-
} from "./index-
|
|
21
|
+
} from "./index-t43k5rq1.js";
|
|
22
22
|
import {
|
|
23
23
|
PLUGINS_DIR,
|
|
24
24
|
VENDORED_NPM_DIR,
|
|
@@ -4301,7 +4301,7 @@ import git from "isomorphic-git";
|
|
|
4301
4301
|
// package.json
|
|
4302
4302
|
var package_default = {
|
|
4303
4303
|
name: "gutterpress",
|
|
4304
|
-
version: "0.11.9-alpha.
|
|
4304
|
+
version: "0.11.9-alpha.3",
|
|
4305
4305
|
description: "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
|
|
4306
4306
|
author: "itlackey",
|
|
4307
4307
|
license: "MPL-2.0",
|
|
@@ -8684,7 +8684,7 @@ class PdfOutput {
|
|
|
8684
8684
|
const rawPdf = pdfxMode ? path8.join(stage, "raw.pdf") : path8.resolve(pdfFile);
|
|
8685
8685
|
await fsp2.mkdir(path8.dirname(path8.resolve(pdfFile)), { recursive: true });
|
|
8686
8686
|
log.info("Rendering HTML to PDF via the Gutterpress engine (native Chromium pagination)");
|
|
8687
|
-
const { buildNativePdf } = await import("./engine-
|
|
8687
|
+
const { buildNativePdf } = await import("./engine-trte2tg2.js");
|
|
8688
8688
|
const engineDiagnostics = await buildNativePdf(htmlFile, rawPdf, {
|
|
8689
8689
|
title: config.title,
|
|
8690
8690
|
author: config.authors.length > 0 ? config.authors.join(", ") : undefined,
|
|
@@ -14794,8 +14794,8 @@ async function repairOnlineBackup(options) {
|
|
|
14794
14794
|
return { outcome, movedGitTo, restoredFiles };
|
|
14795
14795
|
}
|
|
14796
14796
|
// src/lib/publish/run-publish.ts
|
|
14797
|
-
import { readdir as readdir10, stat as
|
|
14798
|
-
import
|
|
14797
|
+
import { readdir as readdir10, stat as stat12 } from "node:fs/promises";
|
|
14798
|
+
import path29 from "node:path";
|
|
14799
14799
|
|
|
14800
14800
|
// src/lib/publish/command-runner.ts
|
|
14801
14801
|
var CAPTURE_LIMIT = 64 * 1024;
|
|
@@ -15800,6 +15800,54 @@ var kdpProvider = {
|
|
|
15800
15800
|
}
|
|
15801
15801
|
};
|
|
15802
15802
|
|
|
15803
|
+
// src/lib/publish/providers/local-folder.ts
|
|
15804
|
+
import { cp as cp7, mkdir as mkdir19, stat as stat11 } from "node:fs/promises";
|
|
15805
|
+
import path28 from "node:path";
|
|
15806
|
+
var LOCAL_PUBLISH_DEFAULT_DIR = "dist";
|
|
15807
|
+
var info7 = {
|
|
15808
|
+
id: "local",
|
|
15809
|
+
label: "A folder on this computer",
|
|
15810
|
+
kind: "api",
|
|
15811
|
+
format: "pdf",
|
|
15812
|
+
formats: ["pdf", "html"],
|
|
15813
|
+
description: "Save the finished file to a folder you choose.",
|
|
15814
|
+
configFields: [
|
|
15815
|
+
{ key: "dir", label: "Folder", placeholder: LOCAL_PUBLISH_DEFAULT_DIR }
|
|
15816
|
+
],
|
|
15817
|
+
credential: { required: false, host: "" }
|
|
15818
|
+
};
|
|
15819
|
+
function localPublishDir(req) {
|
|
15820
|
+
const dir = typeof req.config.dir === "string" && req.config.dir.trim() ? req.config.dir.trim() : LOCAL_PUBLISH_DEFAULT_DIR;
|
|
15821
|
+
return path28.resolve(req.project.projectDir, dir);
|
|
15822
|
+
}
|
|
15823
|
+
var localFolderProvider = {
|
|
15824
|
+
info: info7,
|
|
15825
|
+
async authenticate() {
|
|
15826
|
+
return { ok: true };
|
|
15827
|
+
},
|
|
15828
|
+
async preflight(req) {
|
|
15829
|
+
const dir = localPublishDir(req);
|
|
15830
|
+
try {
|
|
15831
|
+
const s = await stat11(dir);
|
|
15832
|
+
if (!s.isDirectory()) {
|
|
15833
|
+
return [
|
|
15834
|
+
{ severity: "error", id: "local/not-a-folder", message: `${dir} exists but is not a folder.` }
|
|
15835
|
+
];
|
|
15836
|
+
}
|
|
15837
|
+
} catch {}
|
|
15838
|
+
return [];
|
|
15839
|
+
},
|
|
15840
|
+
async upload(req) {
|
|
15841
|
+
const dir = localPublishDir(req);
|
|
15842
|
+
await mkdir19(dir, { recursive: true });
|
|
15843
|
+
const dest = req.artifact.format === "html" ? dir : path28.join(dir, path28.basename(req.artifact.path));
|
|
15844
|
+
if (path28.resolve(dest) !== path28.resolve(req.artifact.path)) {
|
|
15845
|
+
await cp7(req.artifact.path, dest, { recursive: true });
|
|
15846
|
+
}
|
|
15847
|
+
return { kind: "published", detail: `Saved to ${dest}` };
|
|
15848
|
+
}
|
|
15849
|
+
};
|
|
15850
|
+
|
|
15803
15851
|
// src/lib/publish/providers/shopify.ts
|
|
15804
15852
|
var SHOPIFY_HOST = "shopify";
|
|
15805
15853
|
var DEFAULT_API_VERSION = "2026-04";
|
|
@@ -15814,7 +15862,7 @@ function requireValidShop(shop) {
|
|
|
15814
15862
|
}
|
|
15815
15863
|
return shop;
|
|
15816
15864
|
}
|
|
15817
|
-
var
|
|
15865
|
+
var info8 = {
|
|
15818
15866
|
id: "shopify",
|
|
15819
15867
|
label: "Shopify",
|
|
15820
15868
|
kind: "api",
|
|
@@ -15848,7 +15896,7 @@ function readConfig3(req) {
|
|
|
15848
15896
|
async function adminGraphQL(req, query, variables = {}) {
|
|
15849
15897
|
const { shop: rawShop, apiVersion } = readConfig3(req);
|
|
15850
15898
|
const shop = requireValidShop(rawShop);
|
|
15851
|
-
const resolved = await resolvePublishCredential(
|
|
15899
|
+
const resolved = await resolvePublishCredential(info8, req.deps);
|
|
15852
15900
|
if (!resolved) {
|
|
15853
15901
|
throw new Error("No Shopify access token found. Connect Shopify (or set SHOPIFY_ADMIN_TOKEN) first.");
|
|
15854
15902
|
}
|
|
@@ -15899,9 +15947,9 @@ function userErrorsToMessage(result) {
|
|
|
15899
15947
|
return errs?.length ? errs[0].message : null;
|
|
15900
15948
|
}
|
|
15901
15949
|
var shopifyProvider = {
|
|
15902
|
-
info:
|
|
15950
|
+
info: info8,
|
|
15903
15951
|
async authenticate(req) {
|
|
15904
|
-
const resolved = await resolvePublishCredential(
|
|
15952
|
+
const resolved = await resolvePublishCredential(info8, req.deps);
|
|
15905
15953
|
if (!resolved) {
|
|
15906
15954
|
return {
|
|
15907
15955
|
ok: false,
|
|
@@ -16014,6 +16062,7 @@ var shopifyProvider = {
|
|
|
16014
16062
|
|
|
16015
16063
|
// src/lib/publish/registry.ts
|
|
16016
16064
|
var PROVIDERS = {
|
|
16065
|
+
local: localFolderProvider,
|
|
16017
16066
|
itch: itchProvider,
|
|
16018
16067
|
drivethrurpg: drivethrurpgProvider,
|
|
16019
16068
|
kdp: kdpProvider,
|
|
@@ -16034,14 +16083,14 @@ function publishProviderFor(id) {
|
|
|
16034
16083
|
}
|
|
16035
16084
|
|
|
16036
16085
|
// src/lib/publish/run-publish.ts
|
|
16037
|
-
function resolvePublishFormat(
|
|
16038
|
-
if (
|
|
16086
|
+
function resolvePublishFormat(info9, providerConfig) {
|
|
16087
|
+
if (info9.formats && info9.formats.length > 0) {
|
|
16039
16088
|
const configured = typeof providerConfig.format === "string" ? providerConfig.format.trim() : "";
|
|
16040
|
-
if (configured &&
|
|
16089
|
+
if (configured && info9.formats.includes(configured)) {
|
|
16041
16090
|
return configured;
|
|
16042
16091
|
}
|
|
16043
16092
|
}
|
|
16044
|
-
return
|
|
16093
|
+
return info9.format;
|
|
16045
16094
|
}
|
|
16046
16095
|
async function resolvePublishRequest(options, deps) {
|
|
16047
16096
|
const provider = publishProviderFor(options.providerId);
|
|
@@ -16054,9 +16103,9 @@ async function resolvePublishRequest(options, deps) {
|
|
|
16054
16103
|
const effectiveDeps = effectiveAccount ? { ...deps, credentialAccount: effectiveAccount } : deps;
|
|
16055
16104
|
const outDir = resolveOutputDir(manifestDir, config.title);
|
|
16056
16105
|
const effectiveFormat = resolvePublishFormat(provider.info, providerConfig);
|
|
16057
|
-
const defaultArtifact = effectiveFormat === "pdf" ?
|
|
16106
|
+
const defaultArtifact = effectiveFormat === "pdf" ? path29.join(outDir, artifactName(config.title, "pdf")) : outDir;
|
|
16058
16107
|
const artifact = {
|
|
16059
|
-
path: options.artifactPath ?
|
|
16108
|
+
path: options.artifactPath ? path29.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
|
|
16060
16109
|
format: effectiveFormat
|
|
16061
16110
|
};
|
|
16062
16111
|
return {
|
|
@@ -16074,7 +16123,7 @@ var PDF_HINT = "Build the PDF first (gutterpress build, or export it from the ap
|
|
|
16074
16123
|
var HTML_HINT = "Build the website export first (gutterpress build --format html).";
|
|
16075
16124
|
async function artifactIssues(artifact) {
|
|
16076
16125
|
try {
|
|
16077
|
-
const s = await
|
|
16126
|
+
const s = await stat12(artifact.path);
|
|
16078
16127
|
if (artifact.format === "pdf" && !s.isFile()) {
|
|
16079
16128
|
return [
|
|
16080
16129
|
{
|
|
@@ -16120,7 +16169,7 @@ async function artifactIssues(artifact) {
|
|
|
16120
16169
|
var BUILD_FINGERPRINT_FILENAME = "build-fingerprint.json";
|
|
16121
16170
|
async function htmlDirIssues(dir) {
|
|
16122
16171
|
const issues = [];
|
|
16123
|
-
const isThere = async (rel) =>
|
|
16172
|
+
const isThere = async (rel) => stat12(path29.join(dir, rel)).then(() => true, () => false);
|
|
16124
16173
|
if (!await isThere(BOOK_HTML)) {
|
|
16125
16174
|
issues.push({
|
|
16126
16175
|
severity: "error",
|
|
@@ -16190,17 +16239,17 @@ function overlayStore(inner, key, candidate) {
|
|
|
16190
16239
|
}
|
|
16191
16240
|
async function connectPublishProvider(options, deps) {
|
|
16192
16241
|
const provider = publishProviderFor(options.providerId);
|
|
16193
|
-
const
|
|
16194
|
-
if (!
|
|
16195
|
-
throw new Error(`${
|
|
16242
|
+
const info9 = provider.info;
|
|
16243
|
+
if (!info9.credential.required) {
|
|
16244
|
+
throw new Error(`${info9.label} needs no API key — just publish when you're ready.`);
|
|
16196
16245
|
}
|
|
16197
|
-
if (
|
|
16198
|
-
throw new Error(`${
|
|
16246
|
+
if (info9.credential.connect === "oauth") {
|
|
16247
|
+
throw new Error(`${info9.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info9.id} --connect" or use the desktop app's Connect button.`);
|
|
16199
16248
|
}
|
|
16200
16249
|
const token = options.token.trim();
|
|
16201
16250
|
if (!token)
|
|
16202
16251
|
throw new Error("Paste an API key first.");
|
|
16203
|
-
const host =
|
|
16252
|
+
const host = info9.credential.host;
|
|
16204
16253
|
const account = (options.account ?? "").trim();
|
|
16205
16254
|
const key = publishCredentialKey(host, account);
|
|
16206
16255
|
const candidate = {
|
|
@@ -16208,12 +16257,12 @@ async function connectPublishProvider(options, deps) {
|
|
|
16208
16257
|
kind: "token",
|
|
16209
16258
|
token,
|
|
16210
16259
|
...account ? { username: account } : {},
|
|
16211
|
-
label: account ||
|
|
16260
|
+
label: account || info9.label,
|
|
16212
16261
|
createdAt: Date.now()
|
|
16213
16262
|
};
|
|
16214
16263
|
const req = await resolvePublishRequest({
|
|
16215
16264
|
projectDir: options.projectDir,
|
|
16216
|
-
providerId:
|
|
16265
|
+
providerId: info9.id,
|
|
16217
16266
|
...options.manifestPath ? { manifestPath: options.manifestPath } : {}
|
|
16218
16267
|
}, deps);
|
|
16219
16268
|
const trialDeps = {
|
|
@@ -16224,10 +16273,10 @@ async function connectPublishProvider(options, deps) {
|
|
|
16224
16273
|
};
|
|
16225
16274
|
const auth = await provider.authenticate({ ...req, deps: trialDeps });
|
|
16226
16275
|
if (!auth.ok) {
|
|
16227
|
-
throw new Error(auth.message ?? `${
|
|
16276
|
+
throw new Error(auth.message ?? `${info9.label} didn't accept that key.`);
|
|
16228
16277
|
}
|
|
16229
16278
|
await deps.tokenStore.set(key, candidate);
|
|
16230
|
-
return { connected: true, providerId:
|
|
16279
|
+
return { connected: true, providerId: info9.id };
|
|
16231
16280
|
}
|
|
16232
16281
|
async function disconnectPublishCredential(key, deps, options = {}) {
|
|
16233
16282
|
const existing = await deps.tokenStore.get(key);
|
|
@@ -16239,13 +16288,13 @@ async function disconnectPublishCredential(key, deps, options = {}) {
|
|
|
16239
16288
|
}
|
|
16240
16289
|
}
|
|
16241
16290
|
// src/lib/publish/selections.ts
|
|
16242
|
-
import { chmod as chmod3, mkdir as
|
|
16243
|
-
import
|
|
16291
|
+
import { chmod as chmod3, mkdir as mkdir20, readFile as readFile34, writeFile as writeFile17 } from "node:fs/promises";
|
|
16292
|
+
import path30 from "node:path";
|
|
16244
16293
|
class PublishSelectionsStore {
|
|
16245
16294
|
filePath;
|
|
16246
16295
|
queue = Promise.resolve();
|
|
16247
16296
|
constructor(filePath) {
|
|
16248
|
-
this.filePath = filePath ??
|
|
16297
|
+
this.filePath = filePath ?? path30.join(defaultConfigDir(), "publish-selections.json");
|
|
16249
16298
|
}
|
|
16250
16299
|
async read() {
|
|
16251
16300
|
try {
|
|
@@ -16262,7 +16311,7 @@ class PublishSelectionsStore {
|
|
|
16262
16311
|
return { version: 1, global: {}, projects: {} };
|
|
16263
16312
|
}
|
|
16264
16313
|
async write(data) {
|
|
16265
|
-
await
|
|
16314
|
+
await mkdir20(path30.dirname(this.filePath), { recursive: true });
|
|
16266
16315
|
await writeFile17(this.filePath, JSON.stringify(data, null, 2), {
|
|
16267
16316
|
encoding: "utf8",
|
|
16268
16317
|
mode: 384
|
|
@@ -593,7 +593,7 @@ import { fileURLToPath } from "node:url";
|
|
|
593
593
|
var favicon_default = "./favicon-wkbm9cjn.ico";
|
|
594
594
|
|
|
595
595
|
// src/assets/manifest.schema.json
|
|
596
|
-
var manifest_schema_default = "./manifest.schema-
|
|
596
|
+
var manifest_schema_default = "./manifest.schema-61bsspsb.json";
|
|
597
597
|
|
|
598
598
|
// src/assets/preview/scripts/preview-interface.js
|
|
599
599
|
var preview_interface_default = "./preview-interface-9rwz21yw.js";
|
package/dist/index.js
CHANGED
|
@@ -143,15 +143,15 @@ import {
|
|
|
143
143
|
syncProject,
|
|
144
144
|
testRemoteAccess,
|
|
145
145
|
validateProjectExtensions
|
|
146
|
-
} from "./index-
|
|
146
|
+
} from "./index-27xa2tfd.js";
|
|
147
147
|
import {
|
|
148
148
|
BUILD_DIAGNOSTIC_CODES
|
|
149
|
-
} from "./index-
|
|
149
|
+
} from "./index-kqftehgy.js";
|
|
150
150
|
import {
|
|
151
151
|
BuildError,
|
|
152
152
|
DEFAULT_PRINT_OPTS,
|
|
153
153
|
readyProbeExpr
|
|
154
|
-
} from "./index-
|
|
154
|
+
} from "./index-t43k5rq1.js";
|
|
155
155
|
import {
|
|
156
156
|
AUTO_SNAPSHOT_MESSAGE,
|
|
157
157
|
DEFAULT_NPM_REGISTRY,
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PublishProvider, PublishRequest } from "../types.ts";
|
|
2
|
+
/** The folder used when `publish.local.dir` is unset — inside the book. */
|
|
3
|
+
export declare const LOCAL_PUBLISH_DEFAULT_DIR = "dist";
|
|
4
|
+
/** The absolute folder for a request: `publish.local.dir` (relative to the book) or the default. */
|
|
5
|
+
export declare function localPublishDir(req: Pick<PublishRequest, "project" | "config">): string;
|
|
6
|
+
export declare const localFolderProvider: PublishProvider;
|
|
@@ -33,7 +33,7 @@ export interface PublishConfigField {
|
|
|
33
33
|
}
|
|
34
34
|
/** Stable provider identifiers: the `--provider` values AND the manifest
|
|
35
35
|
* `publish.<id>` keys — one spelling everywhere. */
|
|
36
|
-
export type PublishProviderId = "itch" | "drivethrurpg" | "kdp" | "azure-swa" | "shopify" | "gdrive";
|
|
36
|
+
export type PublishProviderId = "local" | "itch" | "drivethrurpg" | "kdp" | "azure-swa" | "shopify" | "gdrive";
|
|
37
37
|
/**
|
|
38
38
|
* How the provider integrates:
|
|
39
39
|
* - "api" — real programmatic upload (itch.io, Azure SWA, Shopify)
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MANIFEST_FILENAMES,
|
|
3
3
|
runLint
|
|
4
|
-
} from "./cli-
|
|
4
|
+
} from "./cli-edn2tver.js";
|
|
5
5
|
import {
|
|
6
6
|
log
|
|
7
|
-
} from "./cli-
|
|
7
|
+
} from "./cli-nc752ryp.js";
|
|
8
8
|
import {
|
|
9
9
|
UsageError,
|
|
10
10
|
rejectExtraPositionals,
|
|
11
11
|
rejectUnknownFlags
|
|
12
|
-
} from "./cli-
|
|
13
|
-
import"./cli-
|
|
12
|
+
} from "./cli-ervhbr00.js";
|
|
13
|
+
import"./cli-d8rdk1y7.js";
|
|
14
14
|
import"./cli-c41yr7he.js";
|
|
15
15
|
import {
|
|
16
16
|
EXIT_CODES
|
|
@@ -424,6 +424,15 @@
|
|
|
424
424
|
"type": "object",
|
|
425
425
|
"description": "Publish provider settings, keyed by the same provider id `gutterpress publish --provider <id>` takes. Non-secret configuration only — API keys and tokens are stored in the host credential store, never in this file.",
|
|
426
426
|
"properties": {
|
|
427
|
+
"local": {
|
|
428
|
+
"type": "object",
|
|
429
|
+
"description": "A folder on this computer — where the desktop's Publish builds the book before sending it anywhere else (default: `dist` inside the book)",
|
|
430
|
+
"properties": {
|
|
431
|
+
"dir": { "type": "string", "description": "Output folder, relative to the book or absolute. Default: dist" },
|
|
432
|
+
"format": { "type": "string", "enum": ["pdf", "html"], "description": "Which build to save (default: pdf)" }
|
|
433
|
+
},
|
|
434
|
+
"additionalProperties": true
|
|
435
|
+
},
|
|
427
436
|
"itch": {
|
|
428
437
|
"type": "object",
|
|
429
438
|
"description": "itch.io publishing (uploaded with butler)",
|
|
@@ -7,16 +7,16 @@ import {
|
|
|
7
7
|
TARGET_IDS,
|
|
8
8
|
scaffoldExtension,
|
|
9
9
|
scaffoldProject
|
|
10
|
-
} from "./cli-
|
|
10
|
+
} from "./cli-edn2tver.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveGhostscript
|
|
13
|
-
} from "./cli-
|
|
13
|
+
} from "./cli-nc752ryp.js";
|
|
14
14
|
import {
|
|
15
15
|
UsageError,
|
|
16
16
|
rejectExtraPositionals,
|
|
17
17
|
rejectUnknownFlags
|
|
18
|
-
} from "./cli-
|
|
19
|
-
import"./cli-
|
|
18
|
+
} from "./cli-ervhbr00.js";
|
|
19
|
+
import"./cli-d8rdk1y7.js";
|
|
20
20
|
import {
|
|
21
21
|
isToolAvailable
|
|
22
22
|
} from "./cli-c41yr7he.js";
|
|
@@ -2,16 +2,16 @@ import {
|
|
|
2
2
|
executeValidation,
|
|
3
3
|
publishTargetFor,
|
|
4
4
|
reportMissingTools
|
|
5
|
-
} from "./cli-
|
|
5
|
+
} from "./cli-edn2tver.js";
|
|
6
6
|
import {
|
|
7
7
|
log
|
|
8
|
-
} from "./cli-
|
|
8
|
+
} from "./cli-nc752ryp.js";
|
|
9
9
|
import {
|
|
10
10
|
UsageError,
|
|
11
11
|
rejectExtraPositionals,
|
|
12
12
|
rejectUnknownFlags
|
|
13
|
-
} from "./cli-
|
|
14
|
-
import"./cli-
|
|
13
|
+
} from "./cli-ervhbr00.js";
|
|
14
|
+
import"./cli-d8rdk1y7.js";
|
|
15
15
|
import"./cli-c41yr7he.js";
|
|
16
16
|
import {
|
|
17
17
|
EXIT_CODES
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
runBuild,
|
|
7
7
|
splitOutPath,
|
|
8
8
|
startPreviewServer
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-edn2tver.js";
|
|
10
10
|
import {
|
|
11
11
|
log
|
|
12
|
-
} from "./cli-
|
|
12
|
+
} from "./cli-nc752ryp.js";
|
|
13
13
|
import {
|
|
14
14
|
UsageError,
|
|
15
15
|
parseFormat,
|
|
@@ -17,8 +17,8 @@ import {
|
|
|
17
17
|
rejectExtraPositionals,
|
|
18
18
|
rejectUnknownFlags,
|
|
19
19
|
resolvePort
|
|
20
|
-
} from "./cli-
|
|
21
|
-
import"./cli-
|
|
20
|
+
} from "./cli-ervhbr00.js";
|
|
21
|
+
import"./cli-d8rdk1y7.js";
|
|
22
22
|
import"./cli-c41yr7he.js";
|
|
23
23
|
import {
|
|
24
24
|
BuildError
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
publishProviderFor,
|
|
12
12
|
resolvePublishFormat,
|
|
13
13
|
runPublish
|
|
14
|
-
} from "./cli-
|
|
14
|
+
} from "./cli-edn2tver.js";
|
|
15
15
|
import {
|
|
16
16
|
FileTokenStore,
|
|
17
17
|
log
|
|
18
|
-
} from "./cli-
|
|
18
|
+
} from "./cli-nc752ryp.js";
|
|
19
19
|
import {
|
|
20
20
|
UsageError,
|
|
21
21
|
rejectExtraPositionals,
|
|
22
22
|
rejectUnknownFlags
|
|
23
|
-
} from "./cli-
|
|
24
|
-
import"./cli-
|
|
23
|
+
} from "./cli-ervhbr00.js";
|
|
24
|
+
import"./cli-d8rdk1y7.js";
|
|
25
25
|
import"./cli-c41yr7he.js";
|
|
26
26
|
import {
|
|
27
27
|
EXIT_CODES
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeAndReport
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-edn2tver.js";
|
|
4
4
|
import {
|
|
5
5
|
log
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-nc752ryp.js";
|
|
7
7
|
import {
|
|
8
8
|
UsageError,
|
|
9
9
|
rejectExtraPositionals,
|
|
10
10
|
rejectUnknownFlags
|
|
11
|
-
} from "./cli-
|
|
12
|
-
import"./cli-
|
|
11
|
+
} from "./cli-ervhbr00.js";
|
|
12
|
+
import"./cli-d8rdk1y7.js";
|
|
13
13
|
import"./cli-c41yr7he.js";
|
|
14
14
|
import {
|
|
15
15
|
EXIT_CODES
|
package/package.json
CHANGED