@naulon/sdk 0.1.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/cli/check.d.ts +23 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +100 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/crawl.d.ts +30 -0
- package/dist/cli/crawl.d.ts.map +1 -0
- package/dist/cli/crawl.js +180 -0
- package/dist/cli/crawl.js.map +1 -0
- package/dist/cli/doctor.d.ts +11 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +69 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.d.ts +23 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +217 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/naulon.d.ts +3 -0
- package/dist/cli/naulon.d.ts.map +1 -0
- package/dist/cli/naulon.js +50 -0
- package/dist/cli/naulon.js.map +1 -0
- package/dist/contract/credits.d.ts +53 -0
- package/dist/contract/credits.d.ts.map +1 -0
- package/dist/contract/credits.js +56 -0
- package/dist/contract/credits.js.map +1 -0
- package/dist/contract/index.d.ts +4 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +4 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/settlement.d.ts +67 -0
- package/dist/contract/settlement.d.ts.map +1 -0
- package/dist/contract/settlement.js +52 -0
- package/dist/contract/settlement.js.map +1 -0
- package/dist/contract/wallet.d.ts +23 -0
- package/dist/contract/wallet.d.ts.map +1 -0
- package/dist/contract/wallet.js +26 -0
- package/dist/contract/wallet.js.map +1 -0
- package/dist/crawl/adapters/rss.d.ts +12 -0
- package/dist/crawl/adapters/rss.d.ts.map +1 -0
- package/dist/crawl/adapters/rss.js +119 -0
- package/dist/crawl/adapters/rss.js.map +1 -0
- package/dist/crawl/adapters/sitemap.d.ts +12 -0
- package/dist/crawl/adapters/sitemap.d.ts.map +1 -0
- package/dist/crawl/adapters/sitemap.js +103 -0
- package/dist/crawl/adapters/sitemap.js.map +1 -0
- package/dist/crawl/adapters/wordpress.d.ts +19 -0
- package/dist/crawl/adapters/wordpress.d.ts.map +1 -0
- package/dist/crawl/adapters/wordpress.js +89 -0
- package/dist/crawl/adapters/wordpress.js.map +1 -0
- package/dist/crawl/authors.d.ts +27 -0
- package/dist/crawl/authors.d.ts.map +1 -0
- package/dist/crawl/authors.js +13 -0
- package/dist/crawl/authors.js.map +1 -0
- package/dist/crawl/crawl.d.ts +35 -0
- package/dist/crawl/crawl.d.ts.map +1 -0
- package/dist/crawl/crawl.js +28 -0
- package/dist/crawl/crawl.js.map +1 -0
- package/dist/crawl/credits-file.d.ts +39 -0
- package/dist/crawl/credits-file.d.ts.map +1 -0
- package/dist/crawl/credits-file.js +52 -0
- package/dist/crawl/credits-file.js.map +1 -0
- package/dist/crawl/fetcher.d.ts +15 -0
- package/dist/crawl/fetcher.d.ts.map +1 -0
- package/dist/crawl/fetcher.js +106 -0
- package/dist/crawl/fetcher.js.map +1 -0
- package/dist/crawl/glob.d.ts +19 -0
- package/dist/crawl/glob.d.ts.map +1 -0
- package/dist/crawl/glob.js +59 -0
- package/dist/crawl/glob.js.map +1 -0
- package/dist/crawl/net.d.ts +12 -0
- package/dist/crawl/net.d.ts.map +1 -0
- package/dist/crawl/net.js +93 -0
- package/dist/crawl/net.js.map +1 -0
- package/dist/crawl/registry.d.ts +17 -0
- package/dist/crawl/registry.d.ts.map +1 -0
- package/dist/crawl/registry.js +19 -0
- package/dist/crawl/registry.js.map +1 -0
- package/dist/crawl/slug.d.ts +15 -0
- package/dist/crawl/slug.d.ts.map +1 -0
- package/dist/crawl/slug.js +42 -0
- package/dist/crawl/slug.js.map +1 -0
- package/dist/crawl/types.d.ts +96 -0
- package/dist/crawl/types.d.ts.map +1 -0
- package/dist/crawl/types.js +21 -0
- package/dist/crawl/types.js.map +1 -0
- package/dist/crawl/xml.d.ts +9 -0
- package/dist/crawl/xml.d.ts.map +1 -0
- package/dist/crawl/xml.js +44 -0
- package/dist/crawl/xml.js.map +1 -0
- package/dist/crypto/fixture.d.ts +13 -0
- package/dist/crypto/fixture.d.ts.map +1 -0
- package/dist/crypto/fixture.js +39 -0
- package/dist/crypto/fixture.js.map +1 -0
- package/dist/crypto/sign.d.ts +7 -0
- package/dist/crypto/sign.d.ts.map +1 -0
- package/dist/crypto/sign.js +15 -0
- package/dist/crypto/sign.js.map +1 -0
- package/dist/crypto/verify.d.ts +21 -0
- package/dist/crypto/verify.d.ts.map +1 -0
- package/dist/crypto/verify.js +58 -0
- package/dist/crypto/verify.js.map +1 -0
- package/dist/doctor/doctor.d.ts +27 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +149 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/express/_bridge.d.ts +32 -0
- package/dist/express/_bridge.d.ts.map +1 -0
- package/dist/express/_bridge.js +34 -0
- package/dist/express/_bridge.js.map +1 -0
- package/dist/express/credits-route.d.ts +6 -0
- package/dist/express/credits-route.d.ts.map +1 -0
- package/dist/express/credits-route.js +23 -0
- package/dist/express/credits-route.js.map +1 -0
- package/dist/express/index.d.ts +10 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +9 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/settlement-receiver.d.ts +14 -0
- package/dist/express/settlement-receiver.d.ts.map +1 -0
- package/dist/express/settlement-receiver.js +31 -0
- package/dist/express/settlement-receiver.js.map +1 -0
- package/dist/idempotency.d.ts +23 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +19 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/init/plan.d.ts +76 -0
- package/dist/init/plan.d.ts.map +1 -0
- package/dist/init/plan.js +132 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/next/credits-route.d.ts +20 -0
- package/dist/next/credits-route.d.ts.map +1 -0
- package/dist/next/credits-route.js +18 -0
- package/dist/next/credits-route.js.map +1 -0
- package/dist/next/index.d.ts +10 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +10 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/settlement-receiver.d.ts +12 -0
- package/dist/next/settlement-receiver.d.ts.map +1 -0
- package/dist/next/settlement-receiver.js +42 -0
- package/dist/next/settlement-receiver.js.map +1 -0
- package/dist/resolver/fixture.d.ts +10 -0
- package/dist/resolver/fixture.d.ts.map +1 -0
- package/dist/resolver/fixture.js +33 -0
- package/dist/resolver/fixture.js.map +1 -0
- package/dist/resolver/http.d.ts +3 -0
- package/dist/resolver/http.d.ts.map +1 -0
- package/dist/resolver/http.js +23 -0
- package/dist/resolver/http.js.map +1 -0
- package/dist/resolver/types.d.ts +11 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +2 -0
- package/dist/resolver/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { makeSignedSettlementFixture } from "../crypto/fixture.ts";
|
|
3
|
+
export interface CheckResult {
|
|
4
|
+
name: string;
|
|
5
|
+
ok: boolean;
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RunCheckOutcome {
|
|
9
|
+
checks: CheckResult[];
|
|
10
|
+
fixture?: ReturnType<typeof makeSignedSettlementFixture>;
|
|
11
|
+
allPassed: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function runCheck(opts: {
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
/** A slug expected NOT to exist — defaults injected by the CLI; explicit in tests. */
|
|
17
|
+
absentSlug: string;
|
|
18
|
+
token?: string;
|
|
19
|
+
secret?: string;
|
|
20
|
+
fetchImpl?: typeof fetch;
|
|
21
|
+
}): Promise<RunCheckOutcome>;
|
|
22
|
+
export declare function checkMain(argv: string[]): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":";AAgBA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;IACzD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC3B;AAkBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB/D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `naulon-kit check` — offline conformance for a publisher's credits endpoint.
|
|
4
|
+
*
|
|
5
|
+
* npx @naulon/sdk check <baseUrl> --slug <s> [--token <t>] [--secret <sec>]
|
|
6
|
+
*
|
|
7
|
+
* It does two things a publisher gets wrong and can verify cheaply:
|
|
8
|
+
* 1. GET <baseUrl>/credits/<slug> parses against the shared contract (creditsSchema).
|
|
9
|
+
* 2. GET <baseUrl>/credits/<random> returns 404 — the deliberate "free read" signal.
|
|
10
|
+
* (This checks the 404 *syntax*, never *policy*: the CLI can't know which slug
|
|
11
|
+
* SHOULD be free.)
|
|
12
|
+
* Settlement is never POSTed to a live receiver (a money path gets no public "pretend"
|
|
13
|
+
* mode). With --secret the CLI prints a signed fixture you feed into YOUR receiver in
|
|
14
|
+
* YOUR test harness and assert a 200 + a written payout.
|
|
15
|
+
*/
|
|
16
|
+
import { parseCredits } from "../contract/credits.js";
|
|
17
|
+
import { makeSignedSettlementFixture } from "../crypto/fixture.js";
|
|
18
|
+
export async function runCheck(opts) {
|
|
19
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
20
|
+
const base = opts.baseUrl.replace(/\/$/, "");
|
|
21
|
+
const auth = opts.token ? { authorization: `Bearer ${opts.token}` } : {};
|
|
22
|
+
const creditsUrl = (slug) => `${base}/credits/${encodeURIComponent(slug)}`;
|
|
23
|
+
const checks = [];
|
|
24
|
+
// 1. The credits endpoint returns a contract-valid body.
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetchImpl(creditsUrl(opts.slug), { headers: auth });
|
|
27
|
+
if (res.status !== 200) {
|
|
28
|
+
checks.push({ name: "credits-endpoint", ok: false, detail: `expected 200 for "${opts.slug}", got ${res.status}` });
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const body = await res.json();
|
|
32
|
+
parseCredits(body, `credits for "${opts.slug}"`); // throws on any contract violation
|
|
33
|
+
checks.push({ name: "credits-endpoint", ok: true, detail: `200 + valid ArticleCredits for "${opts.slug}"` });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
checks.push({ name: "credits-endpoint", ok: false, detail: e instanceof Error ? e.message : String(e) });
|
|
38
|
+
}
|
|
39
|
+
// 2. A nonexistent slug answers 404 — the free-read signal (syntax, not policy).
|
|
40
|
+
try {
|
|
41
|
+
const res = await fetchImpl(creditsUrl(opts.absentSlug), { headers: auth });
|
|
42
|
+
checks.push(res.status === 404
|
|
43
|
+
? { name: "free-signal-404", ok: true, detail: "nonexistent slug → 404 (free-read signal; syntax only, not policy)" }
|
|
44
|
+
: { name: "free-signal-404", ok: false, detail: `nonexistent slug should answer 404, got ${res.status}` });
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
checks.push({ name: "free-signal-404", ok: false, detail: e instanceof Error ? e.message : String(e) });
|
|
48
|
+
}
|
|
49
|
+
const outcome = { checks, allPassed: checks.every((c) => c.ok) };
|
|
50
|
+
if (opts.secret)
|
|
51
|
+
outcome.fixture = makeSignedSettlementFixture({ secret: opts.secret });
|
|
52
|
+
return outcome;
|
|
53
|
+
}
|
|
54
|
+
// ── CLI entry ────────────────────────────────────────────────────────────────
|
|
55
|
+
function parseArgs(argv) {
|
|
56
|
+
const out = {};
|
|
57
|
+
const rest = argv[0] === "check" ? argv.slice(1) : argv;
|
|
58
|
+
for (let i = 0; i < rest.length; i++) {
|
|
59
|
+
const a = rest[i];
|
|
60
|
+
if (a === "--slug")
|
|
61
|
+
out.slug = rest[++i];
|
|
62
|
+
else if (a === "--token")
|
|
63
|
+
out.token = rest[++i];
|
|
64
|
+
else if (a === "--secret")
|
|
65
|
+
out.secret = rest[++i];
|
|
66
|
+
else if (a && !a.startsWith("--") && out.baseUrl === undefined)
|
|
67
|
+
out.baseUrl = a;
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
const USAGE = "usage: naulon-kit check <baseUrl> --slug <slug> [--token <t>] [--secret <sec>]";
|
|
72
|
+
export async function checkMain(argv) {
|
|
73
|
+
const args = parseArgs(argv);
|
|
74
|
+
if (!args.baseUrl || !args.slug) {
|
|
75
|
+
console.error(USAGE);
|
|
76
|
+
return 2;
|
|
77
|
+
}
|
|
78
|
+
const out = await runCheck({
|
|
79
|
+
baseUrl: args.baseUrl,
|
|
80
|
+
slug: args.slug,
|
|
81
|
+
absentSlug: `__naulon-kit-absent-${Date.now()}__`,
|
|
82
|
+
token: args.token,
|
|
83
|
+
secret: args.secret,
|
|
84
|
+
});
|
|
85
|
+
for (const c of out.checks)
|
|
86
|
+
console.log(`${c.ok ? "PASS" : "FAIL"} ${c.name} — ${c.detail}`);
|
|
87
|
+
if (out.fixture) {
|
|
88
|
+
console.log("\nSigned settlement fixture (POST to YOUR receiver in YOUR test harness — never production):");
|
|
89
|
+
console.log(` x-naulon-timestamp: ${out.fixture.headers["x-naulon-timestamp"]}`);
|
|
90
|
+
console.log(` x-naulon-signature: ${out.fixture.headers["x-naulon-signature"]}`);
|
|
91
|
+
console.log(` body: ${out.fixture.rawBody}`);
|
|
92
|
+
}
|
|
93
|
+
console.log(out.allPassed ? "\n✓ all checks passed" : "\n✗ one or more checks failed");
|
|
94
|
+
return out.allPassed ? 0 : 1;
|
|
95
|
+
}
|
|
96
|
+
// Run only when invoked directly as the bin, not when imported (by a test or the dispatcher).
|
|
97
|
+
if (process.argv[1] && /check\.(ts|js)$/.test(process.argv[1])) {
|
|
98
|
+
void checkMain(process.argv.slice(2)).then((c) => process.exit(c));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import type { ArticleCredits } from "../contract/credits.ts";
|
|
3
|
+
import type { CrawlConfig, SourceAdapterId } from "../crawl/types.ts";
|
|
4
|
+
export interface CrawlFlags {
|
|
5
|
+
origin?: string;
|
|
6
|
+
prefixes?: string;
|
|
7
|
+
creditsPath?: string;
|
|
8
|
+
defaultWallet?: string;
|
|
9
|
+
feedUrl?: string;
|
|
10
|
+
adapter?: string;
|
|
11
|
+
allowPrivate: boolean;
|
|
12
|
+
dryRun: boolean;
|
|
13
|
+
dir: string;
|
|
14
|
+
envPath?: string;
|
|
15
|
+
help: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseCrawlFlags(argv: string[]): CrawlFlags;
|
|
18
|
+
export interface CrawlPlan {
|
|
19
|
+
origin: string;
|
|
20
|
+
articlePrefixes: string[];
|
|
21
|
+
creditsPath: string;
|
|
22
|
+
config: CrawlConfig;
|
|
23
|
+
existing: Record<string, ArticleCredits>;
|
|
24
|
+
allowPrivate: boolean;
|
|
25
|
+
forceAdapterId?: SourceAdapterId;
|
|
26
|
+
}
|
|
27
|
+
/** Resolve everything the crawl needs from flags + `.env` + the current credits file. Pure. */
|
|
28
|
+
export declare function planCrawlInputs(flags: CrawlFlags, env: Record<string, string>, existingRaw: string | null): CrawlPlan;
|
|
29
|
+
export declare function crawlMain(argv: string[]): Promise<number>;
|
|
30
|
+
//# sourceMappingURL=crawl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../../src/cli/crawl.ts"],"names":[],"mappings":";AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMtE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAaD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAY1D;AAcD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,SAAS,CAuCX;AAWD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB/D"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `naulon crawl` — draft a `credits.json` by reading your own origin (the CLI shell).
|
|
4
|
+
*
|
|
5
|
+
* naulon crawl # read origin/prefixes/credits from ./.env
|
|
6
|
+
* naulon crawl https://mysite.com --prefixes essays,posts --default-wallet 0x…
|
|
7
|
+
* naulon crawl --adapter rss --feed-url https://mysite.com/feed.xml
|
|
8
|
+
* naulon crawl --dry-run # report what it WOULD add, write nothing
|
|
9
|
+
*
|
|
10
|
+
* It probes on-origin, no-secret sources (WordPress REST / RSS / sitemap), derives the gate's
|
|
11
|
+
* credits-key slugs, and inserts NEW articles into your credits map. Two hard rules:
|
|
12
|
+
* • insert-only — it never overwrites a slug you've already curated;
|
|
13
|
+
* • money is never inferred — an article whose author maps to no wallet is REPORTED, not
|
|
14
|
+
* written. Map the author (authorWalletMap / --default-wallet), then re-crawl.
|
|
15
|
+
*
|
|
16
|
+
* All value logic lives in `../crawl/*`; this file is only flags + I/O + the printed summary.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { writeFile } from "node:fs/promises";
|
|
20
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
21
|
+
import { parseEnvFile } from "../doctor/doctor.js";
|
|
22
|
+
import { runCrawl } from "../crawl/crawl.js";
|
|
23
|
+
import { makeGuardedFetcher } from "../crawl/fetcher.js";
|
|
24
|
+
const DIM = "\x1b[2m";
|
|
25
|
+
const BOLD = "\x1b[1m";
|
|
26
|
+
const RESET = "\x1b[0m";
|
|
27
|
+
const VALUE_FLAGS = {
|
|
28
|
+
"--origin": "origin",
|
|
29
|
+
"--prefixes": "prefixes",
|
|
30
|
+
"--credits": "creditsPath",
|
|
31
|
+
"--default-wallet": "defaultWallet",
|
|
32
|
+
"--feed-url": "feedUrl",
|
|
33
|
+
"--adapter": "adapter",
|
|
34
|
+
"--dir": "dir",
|
|
35
|
+
"--env": "envPath",
|
|
36
|
+
};
|
|
37
|
+
export function parseCrawlFlags(argv) {
|
|
38
|
+
const f = { allowPrivate: false, dryRun: false, dir: process.cwd(), help: false };
|
|
39
|
+
for (let i = 0; i < argv.length; i++) {
|
|
40
|
+
const a = argv[i];
|
|
41
|
+
if (!a)
|
|
42
|
+
continue;
|
|
43
|
+
if (a === "--allow-private")
|
|
44
|
+
f.allowPrivate = true;
|
|
45
|
+
else if (a === "--dry-run" || a === "-n")
|
|
46
|
+
f.dryRun = true;
|
|
47
|
+
else if (a === "--help" || a === "-h")
|
|
48
|
+
f.help = true;
|
|
49
|
+
else if (VALUE_FLAGS[a])
|
|
50
|
+
f[VALUE_FLAGS[a]] = argv[++i];
|
|
51
|
+
else if (!a.startsWith("-") && f.origin === undefined)
|
|
52
|
+
f.origin = a; // positional origin
|
|
53
|
+
}
|
|
54
|
+
return f;
|
|
55
|
+
}
|
|
56
|
+
const ADAPTER_IDS = ["rss", "sitemap", "wordpress"];
|
|
57
|
+
function isLoopbackOrigin(origin) {
|
|
58
|
+
try {
|
|
59
|
+
const u = new URL(origin);
|
|
60
|
+
const h = u.hostname.replace(/^\[|\]$/g, "");
|
|
61
|
+
return u.protocol === "http:" && (h === "localhost" || h === "127.0.0.1" || h === "::1");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Resolve everything the crawl needs from flags + `.env` + the current credits file. Pure. */
|
|
68
|
+
export function planCrawlInputs(flags, env, existingRaw) {
|
|
69
|
+
const origin = flags.origin ?? env["ORIGIN_URL"];
|
|
70
|
+
if (!origin) {
|
|
71
|
+
throw new Error("no origin — pass one (`naulon crawl https://mysite.com`) or set ORIGIN_URL in .env");
|
|
72
|
+
}
|
|
73
|
+
const prefixesCsv = flags.prefixes ?? env["ARTICLE_PATH_PREFIXES"];
|
|
74
|
+
if (!prefixesCsv) {
|
|
75
|
+
throw new Error("no article prefixes — pass --prefixes essays,posts or set ARTICLE_PATH_PREFIXES in .env");
|
|
76
|
+
}
|
|
77
|
+
const articlePrefixes = prefixesCsv.split(",").map((p) => p.trim()).filter(Boolean);
|
|
78
|
+
const creditsPath = flags.creditsPath ?? env["CREDITS_FIXTURES"] ?? "./credits.json";
|
|
79
|
+
if (flags.adapter && !ADAPTER_IDS.includes(flags.adapter)) {
|
|
80
|
+
throw new Error(`unknown adapter '${flags.adapter}' — one of: ${ADAPTER_IDS.join(", ")}`);
|
|
81
|
+
}
|
|
82
|
+
let existing = {};
|
|
83
|
+
if (existingRaw !== null && existingRaw.trim() !== "") {
|
|
84
|
+
const parsed = JSON.parse(existingRaw);
|
|
85
|
+
if (parsed && typeof parsed === "object")
|
|
86
|
+
existing = parsed;
|
|
87
|
+
}
|
|
88
|
+
const config = {
|
|
89
|
+
includeGlobs: [],
|
|
90
|
+
excludeGlobs: [],
|
|
91
|
+
authorWalletMap: {},
|
|
92
|
+
...(flags.defaultWallet ? { defaultWallet: flags.defaultWallet } : {}),
|
|
93
|
+
...(flags.feedUrl ? { feedUrl: flags.feedUrl } : {}),
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
origin,
|
|
97
|
+
articlePrefixes,
|
|
98
|
+
creditsPath,
|
|
99
|
+
config,
|
|
100
|
+
existing,
|
|
101
|
+
allowPrivate: flags.allowPrivate || isLoopbackOrigin(origin),
|
|
102
|
+
...(flags.adapter ? { forceAdapterId: flags.adapter } : {}),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const USAGE = `usage: naulon crawl [origin] [--prefixes <csv>] [--credits <path>]
|
|
106
|
+
[--default-wallet 0x…] [--feed-url <url>] [--adapter rss|sitemap|wordpress]
|
|
107
|
+
[--dry-run] [--allow-private] [--dir <path>] [--env <path>]
|
|
108
|
+
|
|
109
|
+
Drafts a credits.json from your own origin. Reads ORIGIN_URL / ARTICLE_PATH_PREFIXES /
|
|
110
|
+
CREDITS_FIXTURES from ./.env when the flags are omitted, so \`naulon crawl\` just works
|
|
111
|
+
after \`naulon init\`. Insert-only (never overwrites a curated slug); an article whose
|
|
112
|
+
author maps to no wallet is reported, never written (money is never inferred).`;
|
|
113
|
+
export async function crawlMain(argv) {
|
|
114
|
+
const f = parseCrawlFlags(argv);
|
|
115
|
+
if (f.help) {
|
|
116
|
+
console.log(USAGE);
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
const dir = resolve(f.dir);
|
|
120
|
+
const envPath = f.envPath ? resolve(f.envPath) : join(dir, ".env");
|
|
121
|
+
const env = existsSync(envPath) ? parseEnvFile(readFileSync(envPath, "utf8")) : {};
|
|
122
|
+
let plan;
|
|
123
|
+
try {
|
|
124
|
+
// Resolve the credits path first (may be relative to the env dir), then read it if present.
|
|
125
|
+
const flags = f;
|
|
126
|
+
const creditsHint = flags.creditsPath ?? env["CREDITS_FIXTURES"] ?? "./credits.json";
|
|
127
|
+
const creditsAbs = isAbsolute(creditsHint) ? creditsHint : join(envPath ? dirname(envPath) : dir, creditsHint);
|
|
128
|
+
const existingRaw = existsSync(creditsAbs) ? readFileSync(creditsAbs, "utf8") : null;
|
|
129
|
+
plan = planCrawlInputs(flags, env, existingRaw);
|
|
130
|
+
// Stash the absolute write target on the plan-adjacent closure.
|
|
131
|
+
return await execute(plan, creditsAbs, f.dryRun);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
console.error(`✗ ${e instanceof Error ? e.message : String(e)}`);
|
|
135
|
+
return 2;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function execute(plan, creditsAbs, dryRun) {
|
|
139
|
+
const fetch = makeGuardedFetcher({ origin: plan.origin, allowPrivate: plan.allowPrivate });
|
|
140
|
+
console.log(`\n ${BOLD}naulon crawl${RESET} ${DIM}— ${plan.origin}${RESET}`);
|
|
141
|
+
const result = await runCrawl({
|
|
142
|
+
origin: plan.origin,
|
|
143
|
+
articlePrefixes: plan.articlePrefixes,
|
|
144
|
+
config: plan.config,
|
|
145
|
+
existing: plan.existing,
|
|
146
|
+
fetch,
|
|
147
|
+
...(plan.forceAdapterId ? { forceAdapterId: plan.forceAdapterId } : {}),
|
|
148
|
+
});
|
|
149
|
+
if (result.adapterId === null) {
|
|
150
|
+
console.log(` ${DIM}no source detected (tried WordPress REST, RSS, sitemap).${RESET}`);
|
|
151
|
+
console.log(` ${DIM}↳ if your feed is at a non-standard path, pass --feed-url.${RESET}\n`);
|
|
152
|
+
return 1;
|
|
153
|
+
}
|
|
154
|
+
console.log(` ${DIM}source: ${result.adapterId} · discovered ${result.discovered} · new ${result.added.length} · kept ${result.keptExisting.length} · unmapped ${result.unmapped.length}${RESET}\n`);
|
|
155
|
+
for (const slug of result.added)
|
|
156
|
+
console.log(` ✓ ${slug}`);
|
|
157
|
+
if (result.unmapped.length > 0) {
|
|
158
|
+
console.log(`\n ${BOLD}Needs a wallet${RESET} ${DIM}(not written — money is never guessed):${RESET}`);
|
|
159
|
+
for (const u of result.unmapped) {
|
|
160
|
+
console.log(` ⚠ ${u.slug} ${DIM}— author ${u.author ? `"${u.author}"` : "(none stated)"}${RESET}`);
|
|
161
|
+
}
|
|
162
|
+
console.log(` ${DIM}↳ map them in credits.json, or re-run with --default-wallet 0x…${RESET}`);
|
|
163
|
+
}
|
|
164
|
+
if (dryRun) {
|
|
165
|
+
console.log(`\n ${DIM}--dry-run: nothing written.${RESET}\n`);
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
if (result.added.length === 0) {
|
|
169
|
+
console.log(`\n ${DIM}nothing new to write — ${creditsAbs} unchanged.${RESET}\n`);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
await writeFile(creditsAbs, JSON.stringify(result.credits, null, 2) + "\n", "utf8");
|
|
173
|
+
console.log(`\n ✓ wrote ${result.added.length} new ${result.added.length === 1 ? "entry" : "entries"} to ${creditsAbs}\n`);
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
// Run only when invoked directly as the bin, not when imported (by a test or the dispatcher).
|
|
177
|
+
if (process.argv[1] && /crawl\.(ts|js)$/.test(process.argv[1])) {
|
|
178
|
+
void crawlMain(process.argv.slice(2)).then((c) => process.exit(c));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=crawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/cli/crawl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface DoctorFlags {
|
|
3
|
+
envPath: string;
|
|
4
|
+
gateUrl?: string;
|
|
5
|
+
probe: boolean;
|
|
6
|
+
help: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseDoctorFlags(argv: string[]): DoctorFlags;
|
|
9
|
+
export declare function doctorMain(argv: string[]): Promise<number>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":";AA2BA,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAU5D;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BhE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `naulon doctor` — health-check your own gate (the CLI shell around `runDoctor`).
|
|
4
|
+
*
|
|
5
|
+
* naulon doctor # reads ./.env, probes the gate if it's running
|
|
6
|
+
* naulon doctor --env path/.env # a different env file
|
|
7
|
+
* naulon doctor --url http://… # probe a gate at a specific address
|
|
8
|
+
* naulon doctor --no-probe # config-only, don't touch the network
|
|
9
|
+
*
|
|
10
|
+
* Exits non-zero if any check FAILED (warnings don't fail the run).
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
13
|
+
import { dirname, resolve } from "node:path";
|
|
14
|
+
import { runDoctor } from "../doctor/doctor.js";
|
|
15
|
+
const GREEN = "\x1b[32m";
|
|
16
|
+
const YELLOW = "\x1b[33m";
|
|
17
|
+
const RED = "\x1b[31m";
|
|
18
|
+
const DIM = "\x1b[2m";
|
|
19
|
+
const RESET = "\x1b[0m";
|
|
20
|
+
const GLYPH = {
|
|
21
|
+
pass: `${GREEN}✓${RESET}`,
|
|
22
|
+
warn: `${YELLOW}⚠${RESET}`,
|
|
23
|
+
fail: `${RED}✗${RESET}`,
|
|
24
|
+
};
|
|
25
|
+
export function parseDoctorFlags(argv) {
|
|
26
|
+
const f = { envPath: resolve(process.cwd(), ".env"), probe: true, help: false };
|
|
27
|
+
for (let i = 0; i < argv.length; i++) {
|
|
28
|
+
const a = argv[i];
|
|
29
|
+
if (a === "--help" || a === "-h")
|
|
30
|
+
f.help = true;
|
|
31
|
+
else if (a === "--no-probe")
|
|
32
|
+
f.probe = false;
|
|
33
|
+
else if (a === "--env")
|
|
34
|
+
f.envPath = resolve(argv[++i] ?? f.envPath);
|
|
35
|
+
else if (a === "--url")
|
|
36
|
+
f.gateUrl = argv[++i];
|
|
37
|
+
}
|
|
38
|
+
return f;
|
|
39
|
+
}
|
|
40
|
+
const USAGE = "usage: naulon doctor [--env <path>] [--url <gateUrl>] [--no-probe]";
|
|
41
|
+
export async function doctorMain(argv) {
|
|
42
|
+
const f = parseDoctorFlags(argv);
|
|
43
|
+
if (f.help) {
|
|
44
|
+
console.log(USAGE);
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
const outcome = await runDoctor({
|
|
48
|
+
envText: existsSync(f.envPath) ? readFileSync(f.envPath, "utf8") : null,
|
|
49
|
+
fileExists: existsSync,
|
|
50
|
+
readFile: (p) => readFileSync(p, "utf8"),
|
|
51
|
+
cwd: dirname(f.envPath),
|
|
52
|
+
fetchImpl: f.probe ? fetch : undefined,
|
|
53
|
+
gateUrl: f.gateUrl,
|
|
54
|
+
});
|
|
55
|
+
console.log(`\n ${DIM}naulon doctor — ${f.envPath}${RESET}\n`);
|
|
56
|
+
for (const c of outcome.checks)
|
|
57
|
+
console.log(` ${GLYPH[c.level]} ${c.name.padEnd(12)} ${c.detail}`);
|
|
58
|
+
const failed = outcome.checks.filter((c) => c.level === "fail").length;
|
|
59
|
+
const warned = outcome.checks.filter((c) => c.level === "warn").length;
|
|
60
|
+
console.log(outcome.ok
|
|
61
|
+
? `\n ${GREEN}healthy${RESET}${warned ? ` ${DIM}(${warned} warning${warned === 1 ? "" : "s"})${RESET}` : ""}`
|
|
62
|
+
: `\n ${RED}${failed} check${failed === 1 ? "" : "s"} failed${RESET} — fix the ✗ above`);
|
|
63
|
+
return outcome.ok ? 0 : 1;
|
|
64
|
+
}
|
|
65
|
+
// Run only when invoked directly as the bin, not when imported (by a test or the dispatcher).
|
|
66
|
+
if (process.argv[1] && /doctor\.(ts|js)$/.test(process.argv[1])) {
|
|
67
|
+
void doctorMain(process.argv.slice(2)).then((c) => process.exit(c));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAElE,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,MAAM,KAAK,GAAyC;IAClD,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;IACzB,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE;IAC1B,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE;CACxB,CAAC;AASF,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,CAAC,GAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;aAC3C,IAAI,CAAC,KAAK,YAAY;YAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;aACxC,IAAI,CAAC,KAAK,OAAO;YAAE,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;aAC/D,IAAI,CAAC,KAAK,OAAO;YAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,KAAK,GAAG,oEAAoE,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QACvE,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;QACxC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QACtC,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,mBAAmB,CAAC,CAAC,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACvE,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,EAAE;QACR,CAAC,CAAC,OAAO,KAAK,UAAU,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,WAAW,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9G,CAAC,CAAC,OAAO,GAAG,GAAG,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,oBAAoB,CAC3F,CAAC;IACF,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,8FAA8F;AAC9F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,KAAK,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface Flags {
|
|
3
|
+
yes: boolean;
|
|
4
|
+
force: boolean;
|
|
5
|
+
dir: string;
|
|
6
|
+
help: boolean;
|
|
7
|
+
originUrl?: string;
|
|
8
|
+
priceUsdc?: string;
|
|
9
|
+
citationMultiplier?: string;
|
|
10
|
+
paymentMode?: string;
|
|
11
|
+
settlementNetwork?: string;
|
|
12
|
+
tollgatePort?: string;
|
|
13
|
+
articlePrefixes?: string;
|
|
14
|
+
creditsPath?: string;
|
|
15
|
+
defaultWallet?: string;
|
|
16
|
+
starterSlug?: string;
|
|
17
|
+
starterTitle?: string;
|
|
18
|
+
starterAuthorId?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseInitFlags(argv: string[]): Flags;
|
|
21
|
+
export declare function initMain(argv: string[]): Promise<number>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";AAwBA,UAAU,KAAK;IACb,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAcpD;AA4HD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C9D"}
|