formatferry 0.1.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/auth.d.ts +17 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +102 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/batch.d.ts +10 -0
- package/dist/commands/batch.d.ts.map +1 -0
- package/dist/commands/batch.js +92 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/convert.d.ts +26 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +198 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/config-store.d.ts +27 -0
- package/dist/config-store.d.ts.map +1 -0
- package/dist/config-store.js +58 -0
- package/dist/config-store.js.map +1 -0
- package/dist/entitlement.d.ts +11 -0
- package/dist/entitlement.d.ts.map +1 -0
- package/dist/entitlement.js +91 -0
- package/dist/entitlement.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -11
- package/dist/index.js.map +1 -0
- package/dist/packages/cli/src/commands/auth.d.ts +17 -0
- package/dist/packages/cli/src/commands/auth.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/auth.js +102 -0
- package/dist/packages/cli/src/commands/auth.js.map +1 -0
- package/dist/packages/cli/src/commands/batch.d.ts +10 -0
- package/dist/packages/cli/src/commands/batch.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/batch.js +92 -0
- package/dist/packages/cli/src/commands/batch.js.map +1 -0
- package/dist/packages/cli/src/commands/convert.d.ts +26 -0
- package/dist/packages/cli/src/commands/convert.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/convert.js +198 -0
- package/dist/packages/cli/src/commands/convert.js.map +1 -0
- package/dist/packages/cli/src/config-store.d.ts +27 -0
- package/dist/packages/cli/src/config-store.d.ts.map +1 -0
- package/dist/packages/cli/src/config-store.js +58 -0
- package/dist/packages/cli/src/config-store.js.map +1 -0
- package/dist/packages/cli/src/entitlement.d.ts +11 -0
- package/dist/packages/cli/src/entitlement.d.ts.map +1 -0
- package/dist/packages/cli/src/entitlement.js +91 -0
- package/dist/packages/cli/src/entitlement.js.map +1 -0
- package/dist/packages/cli/src/index.d.ts +2 -0
- package/dist/packages/cli/src/index.d.ts.map +1 -0
- package/dist/packages/cli/src/index.js +28 -0
- package/dist/packages/cli/src/index.js.map +1 -0
- package/dist/packages/cli/src/shim.d.ts +2 -0
- package/dist/packages/cli/src/shim.d.ts.map +1 -0
- package/dist/packages/cli/src/shim.js +21 -0
- package/dist/packages/cli/src/shim.js.map +1 -0
- package/dist/shim.d.ts +2 -0
- package/dist/shim.d.ts.map +1 -0
- package/dist/shim.js +21 -0
- package/dist/shim.js.map +1 -0
- package/dist/src/shared/adapters/docx-adapter.d.ts +85 -0
- package/dist/src/shared/adapters/docx-adapter.d.ts.map +1 -0
- package/dist/src/shared/adapters/docx-adapter.js +164 -0
- package/dist/src/shared/adapters/docx-adapter.js.map +1 -0
- package/dist/src/shared/adapters/pdf-adapter.d.ts +94 -0
- package/dist/src/shared/adapters/pdf-adapter.d.ts.map +1 -0
- package/dist/src/shared/adapters/pdf-adapter.js +322 -0
- package/dist/src/shared/adapters/pdf-adapter.js.map +1 -0
- package/dist/src/shared/adapters/spreadsheet-adapter.d.ts +98 -0
- package/dist/src/shared/adapters/spreadsheet-adapter.d.ts.map +1 -0
- package/dist/src/shared/adapters/spreadsheet-adapter.js +424 -0
- package/dist/src/shared/adapters/spreadsheet-adapter.js.map +1 -0
- package/dist/src/shared/atlassian-detector.d.ts +6 -0
- package/dist/src/shared/atlassian-detector.d.ts.map +1 -0
- package/dist/src/shared/atlassian-detector.js +23 -0
- package/dist/src/shared/atlassian-detector.js.map +1 -0
- package/dist/src/shared/conversion-engine.d.ts +114 -0
- package/dist/src/shared/conversion-engine.d.ts.map +1 -0
- package/dist/src/shared/conversion-engine.js +790 -0
- package/dist/src/shared/conversion-engine.js.map +1 -0
- package/dist/src/shared/entitlement-service.d.ts +42 -0
- package/dist/src/shared/entitlement-service.d.ts.map +1 -0
- package/dist/src/shared/entitlement-service.js +38 -0
- package/dist/src/shared/entitlement-service.js.map +1 -0
- package/dist/src/shared/input-sanitizer.d.ts +93 -0
- package/dist/src/shared/input-sanitizer.d.ts.map +1 -0
- package/dist/src/shared/input-sanitizer.js +527 -0
- package/dist/src/shared/input-sanitizer.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI startup license validation with caching (Design §5.5)
|
|
3
|
+
* Validates: Requirements 10.1–10.7
|
|
4
|
+
*/
|
|
5
|
+
import { readConfig, writeConfig, clearConfig } from './config-store.js';
|
|
6
|
+
import { FreeEntitlementProvider, CachedEntitlementProvider, } from '../../../src/shared/entitlement-service.js';
|
|
7
|
+
const LICENSE_SERVER_URL = 'https://formatferry.vibingfun.com';
|
|
8
|
+
const VALIDATE_ENDPOINT = `${LICENSE_SERVER_URL}/v1/licenses/validate`;
|
|
9
|
+
const STARTUP_TIMEOUT_MS = 2_000;
|
|
10
|
+
const STALE_CACHE_DAYS = 7;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the entitlement provider for the current CLI session.
|
|
13
|
+
* Called once at CLI startup before any command runs.
|
|
14
|
+
*/
|
|
15
|
+
export async function resolveEntitlement() {
|
|
16
|
+
// Req 10.7: Corrupted ConfigStore → silently discard, free tier
|
|
17
|
+
let config;
|
|
18
|
+
try {
|
|
19
|
+
config = readConfig();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return new FreeEntitlementProvider();
|
|
23
|
+
}
|
|
24
|
+
if (!config || !config.licenseKey) {
|
|
25
|
+
return new FreeEntitlementProvider();
|
|
26
|
+
}
|
|
27
|
+
const { licenseKey, lastValidated } = config;
|
|
28
|
+
// Req 10.1: Ping License Server with 2s timeout
|
|
29
|
+
let data = null;
|
|
30
|
+
let networkError = false;
|
|
31
|
+
try {
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const timer = setTimeout(() => controller.abort(), STARTUP_TIMEOUT_MS);
|
|
34
|
+
const response = await fetch(VALIDATE_ENDPOINT, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: { 'Content-Type': 'application/json' },
|
|
37
|
+
body: JSON.stringify({ key: licenseKey }),
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
});
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
data = (await response.json());
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
networkError = true;
|
|
45
|
+
}
|
|
46
|
+
if (!networkError && data !== null) {
|
|
47
|
+
// Req 10.6: Revoked → delete key, downgrade to free
|
|
48
|
+
if (data.revoked) {
|
|
49
|
+
clearConfig();
|
|
50
|
+
return new FreeEntitlementProvider();
|
|
51
|
+
}
|
|
52
|
+
if (!data.valid) {
|
|
53
|
+
return new FreeEntitlementProvider();
|
|
54
|
+
}
|
|
55
|
+
// Req 10.2 + 10.4: valid → update cache with fresh data + ISO 8601 timestamp
|
|
56
|
+
const freshState = {
|
|
57
|
+
tier: data.tier ?? 'premium',
|
|
58
|
+
features: (data.features ?? []),
|
|
59
|
+
expiresAt: data.expiresAt ?? null,
|
|
60
|
+
lastValidated: new Date().toISOString(),
|
|
61
|
+
};
|
|
62
|
+
writeConfig({
|
|
63
|
+
...config,
|
|
64
|
+
tier: freshState.tier,
|
|
65
|
+
features: freshState.features,
|
|
66
|
+
expiresAt: freshState.expiresAt,
|
|
67
|
+
lastValidated: freshState.lastValidated,
|
|
68
|
+
});
|
|
69
|
+
return new CachedEntitlementProvider(freshState);
|
|
70
|
+
}
|
|
71
|
+
// Req 10.3 + 10.5: Network error/timeout — check cache age
|
|
72
|
+
const cacheAgeMs = lastValidated
|
|
73
|
+
? Date.now() - new Date(lastValidated).getTime()
|
|
74
|
+
: Infinity;
|
|
75
|
+
const staleCacheMs = STALE_CACHE_DAYS * 24 * 60 * 60 * 1000;
|
|
76
|
+
if (cacheAgeMs < staleCacheMs) {
|
|
77
|
+
// Req 10.3: Fresh cache → use cached entitlements
|
|
78
|
+
const cachedState = {
|
|
79
|
+
tier: config.tier ?? 'free',
|
|
80
|
+
features: (config.features ?? []),
|
|
81
|
+
expiresAt: config.expiresAt ?? null,
|
|
82
|
+
lastValidated: lastValidated ?? '',
|
|
83
|
+
};
|
|
84
|
+
return new CachedEntitlementProvider(cachedState);
|
|
85
|
+
}
|
|
86
|
+
// Req 10.5: Stale cache + unreachable → warn stderr, free tier
|
|
87
|
+
process.stderr.write('Warning: Could not reach license server and cached license is older than 7 days. ' +
|
|
88
|
+
'Operating in free tier. Please reconnect to validate your license.\n');
|
|
89
|
+
return new FreeEntitlementProvider();
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=entitlement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../src/entitlement.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20984,7 +20984,7 @@ h${level}. ${trimmed}
|
|
|
20984
20984
|
case "commonmark":
|
|
20985
20985
|
service = this.commonmarkService;
|
|
20986
20986
|
break;
|
|
20987
|
-
case "
|
|
20987
|
+
case "gdocs":
|
|
20988
20988
|
service = this.customService;
|
|
20989
20989
|
options.customRules.forEach((rule) => {
|
|
20990
20990
|
service.addRule(rule.name, {
|
|
@@ -21074,9 +21074,9 @@ h${level}. ${trimmed}
|
|
|
21074
21074
|
description: "Strict CommonMark specification with indented code blocks"
|
|
21075
21075
|
},
|
|
21076
21076
|
{
|
|
21077
|
-
value: "
|
|
21077
|
+
value: "gdocs",
|
|
21078
21078
|
label: "Custom Rules",
|
|
21079
|
-
description: "
|
|
21079
|
+
description: "Optimized for Google Docs structure"
|
|
21080
21080
|
}
|
|
21081
21081
|
];
|
|
21082
21082
|
}
|
|
@@ -21957,16 +21957,17 @@ function clearConfig() {
|
|
|
21957
21957
|
}
|
|
21958
21958
|
}
|
|
21959
21959
|
|
|
21960
|
-
// ../../src/shared/entitlement-service.
|
|
21960
|
+
// ../../src/shared/entitlement-service.js
|
|
21961
21961
|
var FreeEntitlementProvider = class {
|
|
21962
21962
|
getState() {
|
|
21963
21963
|
return { tier: "free", features: [], expiresAt: null, lastValidated: "" };
|
|
21964
21964
|
}
|
|
21965
|
-
hasFeature(
|
|
21965
|
+
hasFeature() {
|
|
21966
21966
|
return false;
|
|
21967
21967
|
}
|
|
21968
21968
|
};
|
|
21969
21969
|
var CachedEntitlementProvider = class {
|
|
21970
|
+
state;
|
|
21970
21971
|
constructor(state) {
|
|
21971
21972
|
this.state = state;
|
|
21972
21973
|
}
|
|
@@ -22521,7 +22522,7 @@ var VALID_FORMATS = [
|
|
|
22521
22522
|
"discord",
|
|
22522
22523
|
"reddit",
|
|
22523
22524
|
"confluence",
|
|
22524
|
-
"
|
|
22525
|
+
"gdocs",
|
|
22525
22526
|
"rmarkdown"
|
|
22526
22527
|
];
|
|
22527
22528
|
function detectInputType(filePath) {
|
|
@@ -22557,13 +22558,13 @@ Supported formats: ${VALID_FORMATS.join(", ")}
|
|
|
22557
22558
|
process.exit(1);
|
|
22558
22559
|
}
|
|
22559
22560
|
function readStdin() {
|
|
22560
|
-
return new Promise((
|
|
22561
|
+
return new Promise((resolve2, reject) => {
|
|
22561
22562
|
let data = "";
|
|
22562
22563
|
process.stdin.setEncoding("utf8");
|
|
22563
22564
|
process.stdin.on("data", (chunk) => {
|
|
22564
22565
|
data += chunk;
|
|
22565
22566
|
});
|
|
22566
|
-
process.stdin.on("end", () =>
|
|
22567
|
+
process.stdin.on("end", () => resolve2(data));
|
|
22567
22568
|
process.stdin.on("error", reject);
|
|
22568
22569
|
});
|
|
22569
22570
|
}
|
|
@@ -23101,15 +23102,34 @@ function handleLogout() {
|
|
|
23101
23102
|
}
|
|
23102
23103
|
|
|
23103
23104
|
// src/index.ts
|
|
23104
|
-
|
|
23105
|
-
|
|
23105
|
+
import { readFileSync as readFileSync4 } from "fs";
|
|
23106
|
+
import { resolve, dirname as dirname3 } from "path";
|
|
23107
|
+
import { fileURLToPath } from "url";
|
|
23108
|
+
var getVersion = () => {
|
|
23109
|
+
if ("1.0.0") {
|
|
23110
|
+
return "1.0.0";
|
|
23111
|
+
}
|
|
23112
|
+
try {
|
|
23113
|
+
const __dirname = dirname3(fileURLToPath(import.meta.url));
|
|
23114
|
+
const packageJson = JSON.parse(
|
|
23115
|
+
readFileSync4(resolve(__dirname, "..", "package.json"), "utf-8")
|
|
23116
|
+
);
|
|
23117
|
+
return packageJson.version || "0.0.0";
|
|
23118
|
+
} catch {
|
|
23119
|
+
return "0.0.0";
|
|
23120
|
+
}
|
|
23121
|
+
};
|
|
23122
|
+
var VERSION = getVersion();
|
|
23123
|
+
program.name("formatferry").version(VERSION).description("Convert HTML, DOCX, PDF, XLSX, CSV to Markdown").option("-i, --input <path>", "Input file path").option("-o, --output <path>", "Output file path").option("-f, --format <format>", "Markdown format (github, commonmark, slack, discord, reddit, confluence, gdocs, rmarkdown)", "github").option("--url <url>", "Fetch article from URL").option("--batch <glob>", "Batch convert files (Premium)").option("--output-dir <dir>", "Output directory for batch").option("--toonify", "Compress output to TOON format (Premium)").option("--offline", "Skip entitlement check (use cached or free tier)").option("--timeout <ms>", "License server timeout in milliseconds (default: 2000)", "2000").action(async (options) => {
|
|
23106
23124
|
if (options.batch) {
|
|
23107
23125
|
await batchCommand(options);
|
|
23108
23126
|
} else {
|
|
23109
23127
|
await convertCommand(options);
|
|
23110
23128
|
}
|
|
23111
23129
|
});
|
|
23112
|
-
program.command("auth").description("Manage license key and API key authentication").option("--license-key <key>", "Activate a license key").option("--api-key <key>", "Activate an API key").option("--status", "Show current license status").option("--logout", "Remove stored license key").action(
|
|
23130
|
+
program.command("auth").description("Manage license key and API key authentication").option("--license-key <key>", "Activate a license key").option("--api-key <key>", "Activate an API key").option("--status", "Show current license status").option("--logout", "Remove stored license key").action(async (options) => {
|
|
23131
|
+
await authCommand(options);
|
|
23132
|
+
});
|
|
23113
23133
|
program.parse();
|
|
23114
23134
|
/*! Bundled license information:
|
|
23115
23135
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,WAAW,CAAC;AACnB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,kDAAkD;AAClD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,uBAAuB,EAAE,kEAAkE,EAAE,QAAQ,CAAC;KAC7G,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;KAC/C,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;KACzD,MAAM,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;KAC1D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,UAAU,EAAE,6BAA6B,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,2BAA2B,CAAC;KAC/C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI auth command — license key management.
|
|
3
|
+
*
|
|
4
|
+
* Sub-commands (via options):
|
|
5
|
+
* formatferry auth --license-key <KEY> Validate + store license key (Req 9.1, 9.3, 9.4)
|
|
6
|
+
* formatferry auth --status Show current tier/expiry/features (Req 9.6)
|
|
7
|
+
* formatferry auth --logout Remove stored license key (Req 9.7)
|
|
8
|
+
*
|
|
9
|
+
* License Server: POST https://formatferry.vibingfun.com/v1/licenses/validate
|
|
10
|
+
*/
|
|
11
|
+
export interface AuthOptions {
|
|
12
|
+
licenseKey?: string;
|
|
13
|
+
status?: boolean;
|
|
14
|
+
logout?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function authCommand(options: AuthOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI auth command — license key management.
|
|
3
|
+
*
|
|
4
|
+
* Sub-commands (via options):
|
|
5
|
+
* formatferry auth --license-key <KEY> Validate + store license key (Req 9.1, 9.3, 9.4)
|
|
6
|
+
* formatferry auth --status Show current tier/expiry/features (Req 9.6)
|
|
7
|
+
* formatferry auth --logout Remove stored license key (Req 9.7)
|
|
8
|
+
*
|
|
9
|
+
* License Server: POST https://formatferry.vibingfun.com/v1/licenses/validate
|
|
10
|
+
*/
|
|
11
|
+
import { readConfig, writeConfig, clearConfig } from '../config-store.js';
|
|
12
|
+
const LICENSE_SERVER_URL = 'https://formatferry.vibingfun.com';
|
|
13
|
+
const VALIDATE_ENDPOINT = `${LICENSE_SERVER_URL}/v1/licenses/validate`;
|
|
14
|
+
const TIMEOUT_MS = 10_000;
|
|
15
|
+
export async function authCommand(options) {
|
|
16
|
+
if (options.licenseKey) {
|
|
17
|
+
await handleLicenseKey(options.licenseKey);
|
|
18
|
+
}
|
|
19
|
+
else if (options.status) {
|
|
20
|
+
handleStatus();
|
|
21
|
+
}
|
|
22
|
+
else if (options.logout) {
|
|
23
|
+
handleLogout();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
handleStatus();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// ─── --license-key ────────────────────────────────────────────────────────────
|
|
30
|
+
async function handleLicenseKey(key) {
|
|
31
|
+
let data;
|
|
32
|
+
try {
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
35
|
+
const response = await fetch(VALIDATE_ENDPOINT, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: { 'Content-Type': 'application/json' },
|
|
38
|
+
body: JSON.stringify({ key }),
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
});
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
data = (await response.json());
|
|
43
|
+
if (!response.ok && !data.valid) {
|
|
44
|
+
process.stderr.write(`Error: Invalid license key. Please check your key and try again.\n`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
+
process.stderr.write(`Error: Could not reach license server — ${msg}\n`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
if (data.revoked) {
|
|
54
|
+
process.stderr.write(`Error: This license key has been revoked.\n`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
if (!data.valid) {
|
|
58
|
+
process.stderr.write(`Error: Invalid license key. Please check your key and try again.\n`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
writeConfig({
|
|
62
|
+
licenseKey: key,
|
|
63
|
+
tier: data.tier ?? 'premium',
|
|
64
|
+
features: data.features ?? [],
|
|
65
|
+
expiresAt: data.expiresAt ?? null,
|
|
66
|
+
lastValidated: new Date().toISOString(),
|
|
67
|
+
});
|
|
68
|
+
const features = data.features ?? [];
|
|
69
|
+
process.stdout.write(`License activated successfully!\n`);
|
|
70
|
+
process.stdout.write(`Tier: ${data.tier ?? 'premium'}\n`);
|
|
71
|
+
if (data.expiresAt) {
|
|
72
|
+
process.stdout.write(`Expires: ${data.expiresAt}\n`);
|
|
73
|
+
}
|
|
74
|
+
if (features.length > 0) {
|
|
75
|
+
process.stdout.write(`Unlocked features: ${features.join(', ')}\n`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// ─── --status ─────────────────────────────────────────────────────────────────
|
|
79
|
+
function handleStatus() {
|
|
80
|
+
const config = readConfig();
|
|
81
|
+
if (!config || !config.licenseKey) {
|
|
82
|
+
process.stdout.write(`Tier: free\n`);
|
|
83
|
+
process.stdout.write(`No license key configured.\n`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const tier = config.tier ?? 'free';
|
|
87
|
+
const features = config.features ?? [];
|
|
88
|
+
const expiresAt = config.expiresAt ?? null;
|
|
89
|
+
process.stdout.write(`Tier: ${tier}\n`);
|
|
90
|
+
if (expiresAt) {
|
|
91
|
+
process.stdout.write(`Expires: ${expiresAt}\n`);
|
|
92
|
+
}
|
|
93
|
+
if (features.length > 0) {
|
|
94
|
+
process.stdout.write(`Features: ${features.join(', ')}\n`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ─── --logout ─────────────────────────────────────────────────────────────────
|
|
98
|
+
function handleLogout() {
|
|
99
|
+
clearConfig();
|
|
100
|
+
process.stdout.write(`Logged out. License key removed.\n`);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AAC/D,MAAM,iBAAiB,GAAG,GAAG,kBAAkB,uBAAuB,CAAC;AACvE,MAAM,UAAU,GAAG,MAAM,CAAC;AAgB1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,YAAY,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,YAAY,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,IAA+B,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;YAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;QAE5D,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,GAAG,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,WAAW,CAAC;QACV,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;QAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,SAAS,IAAI,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY;IACnB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAE3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY;IACnB,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface BatchOptions {
|
|
2
|
+
batch?: string;
|
|
3
|
+
outputDir?: string;
|
|
4
|
+
format?: string;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** Derive the output .md path. Req 8.2 (same dir) / Req 8.3 (outputDir) */
|
|
8
|
+
export declare function getOutputPath(filePath: string, outputDir?: string): string;
|
|
9
|
+
export declare function batchCommand(options: BatchOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../../../../src/commands/batch.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1E;AAkCD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCvE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI batch command
|
|
3
|
+
*
|
|
4
|
+
* Batch-converts files matching a glob pattern to Markdown.
|
|
5
|
+
* Supports --output-dir for writing all outputs to a single directory.
|
|
6
|
+
* Gated behind the 'batch' Premium entitlement.
|
|
7
|
+
*
|
|
8
|
+
* Requirements: 8.1, 8.2, 8.3, 8.4, 8.5, 8.6
|
|
9
|
+
*/
|
|
10
|
+
import fg from 'fast-glob';
|
|
11
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
12
|
+
import { extname, basename, dirname, join } from 'path';
|
|
13
|
+
import { resolveEntitlement } from '../entitlement.js';
|
|
14
|
+
import { ConversionEngine } from '../../../../src/shared/conversion-engine.js';
|
|
15
|
+
import { sanitizeHTML } from '../../../../src/shared/input-sanitizer.js';
|
|
16
|
+
import { docxAdapter } from '../../../../src/shared/adapters/docx-adapter.js';
|
|
17
|
+
import { pdfAdapter } from '../../../../src/shared/adapters/pdf-adapter.js';
|
|
18
|
+
import { spreadsheetAdapter } from '../../../../src/shared/adapters/spreadsheet-adapter.js';
|
|
19
|
+
const SUPPORTED_EXTENSIONS = new Set(['.html', '.htm', '.docx', '.pdf', '.xlsx', '.csv']);
|
|
20
|
+
/** Derive the output .md path. Req 8.2 (same dir) / Req 8.3 (outputDir) */
|
|
21
|
+
export function getOutputPath(filePath, outputDir) {
|
|
22
|
+
const ext = extname(filePath);
|
|
23
|
+
const stem = basename(filePath, ext);
|
|
24
|
+
if (outputDir)
|
|
25
|
+
return join(outputDir, `${stem}.md`);
|
|
26
|
+
return join(dirname(filePath), `${stem}.md`);
|
|
27
|
+
}
|
|
28
|
+
async function convertFile(filePath, format) {
|
|
29
|
+
const ext = extname(filePath).toLowerCase();
|
|
30
|
+
if (!SUPPORTED_EXTENSIONS.has(ext))
|
|
31
|
+
throw new Error(`Unsupported file type: ${ext}`);
|
|
32
|
+
const buffer = readFileSync(filePath);
|
|
33
|
+
const engine = new ConversionEngine();
|
|
34
|
+
if (ext === '.html' || ext === '.htm') {
|
|
35
|
+
const result = await engine.convert(sanitizeHTML(buffer.toString('utf8')), {
|
|
36
|
+
format, preserveTables: true, preserveLists: true, customRules: [],
|
|
37
|
+
});
|
|
38
|
+
return result.markdown;
|
|
39
|
+
}
|
|
40
|
+
const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
41
|
+
if (ext === '.docx') {
|
|
42
|
+
const r = await docxAdapter.parseToHtml(arrayBuffer);
|
|
43
|
+
const c = await engine.convert(sanitizeHTML(r.html), { format, preserveTables: true, preserveLists: true, customRules: [] });
|
|
44
|
+
return c.markdown;
|
|
45
|
+
}
|
|
46
|
+
if (ext === '.pdf') {
|
|
47
|
+
const r = await pdfAdapter.parseToText(arrayBuffer);
|
|
48
|
+
const c = await engine.convert(sanitizeHTML(r.html), { format, preserveTables: true, preserveLists: true, customRules: [] });
|
|
49
|
+
return c.markdown;
|
|
50
|
+
}
|
|
51
|
+
// .xlsx / .csv
|
|
52
|
+
const r = await spreadsheetAdapter.parseToHtml(arrayBuffer, ext.slice(1), 0);
|
|
53
|
+
const c = await engine.convert(sanitizeHTML(r.html), { format, preserveTables: true, preserveLists: true, customRules: [] });
|
|
54
|
+
return c.markdown;
|
|
55
|
+
}
|
|
56
|
+
export async function batchCommand(options) {
|
|
57
|
+
// Req 8.4: entitlement check
|
|
58
|
+
const provider = await resolveEntitlement();
|
|
59
|
+
if (!provider.hasFeature('batch')) {
|
|
60
|
+
process.stderr.write('Error: Batch processing requires a Premium license.\n' +
|
|
61
|
+
'Run `formatferry auth --license-key <KEY>` to activate your license.\n');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
const glob = options.batch;
|
|
65
|
+
if (!glob) {
|
|
66
|
+
process.stderr.write('Error: --batch <glob> is required\n');
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
const files = await fg(glob, { absolute: true });
|
|
70
|
+
if (files.length === 0) {
|
|
71
|
+
process.stderr.write(`No files matched: ${glob}\n`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const format = options.format ?? 'github';
|
|
75
|
+
if (options.outputDir)
|
|
76
|
+
mkdirSync(options.outputDir, { recursive: true });
|
|
77
|
+
let successful = 0, failed = 0;
|
|
78
|
+
for (const filePath of files) {
|
|
79
|
+
try {
|
|
80
|
+
const markdown = await convertFile(filePath, format);
|
|
81
|
+
writeFileSync(getOutputPath(filePath, options.outputDir), markdown, 'utf8');
|
|
82
|
+
successful++;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
process.stderr.write(`Error processing ${filePath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
86
|
+
failed++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Req 8.5: summary
|
|
90
|
+
process.stderr.write(`\nBatch complete: ${successful} succeeded, ${failed} failed, ${files.length} total\n`);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../../../src/commands/batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type MarkdownFormat } from '../../../../src/shared/conversion-engine.js';
|
|
2
|
+
/** Supported input file types */
|
|
3
|
+
type InputType = 'html' | 'docx' | 'pdf' | 'xlsx' | 'csv';
|
|
4
|
+
/**
|
|
5
|
+
* Detect input type from file extension.
|
|
6
|
+
* Writes error to stderr and exits with code 1 on unsupported extension.
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectInputType(filePath: string): InputType;
|
|
9
|
+
/**
|
|
10
|
+
* Validate the --format flag value.
|
|
11
|
+
* Writes error to stderr and exits with code 1 on unknown format.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateFormat(format: string): MarkdownFormat;
|
|
14
|
+
/** Options passed by Commander to the convert action */
|
|
15
|
+
export interface ConvertOptions {
|
|
16
|
+
input?: string;
|
|
17
|
+
output?: string;
|
|
18
|
+
format?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Main convert command action.
|
|
22
|
+
* Called by Commander when the user runs `formatferry [options]`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function convertCommand(options: ConvertOptions): Promise<void>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../../../src/commands/convert.ts"],"names":[],"mappings":"AAUA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAQtF,iCAAiC;AACjC,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAW1D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAkB3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAQ7D;AA8FD,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE3E"}
|