tidyread 0.1.0 → 0.2.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/README.md +36 -11
- package/dist/bins.d.ts +11 -0
- package/dist/bins.js +75 -0
- package/dist/bins.js.map +1 -0
- package/dist/cli.js +13 -7
- package/dist/cli.js.map +1 -1
- package/dist/epub.js +5 -3
- package/dist/epub.js.map +1 -1
- package/dist/tunnel.js +4 -3
- package/dist/tunnel.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -15,42 +15,65 @@ process exits.
|
|
|
15
15
|
It also writes an EPUB (images embedded, e-ink stylesheet) and a Kobo-native
|
|
16
16
|
KEPUB, so you can skip Instapaper entirely and sideload.
|
|
17
17
|
|
|
18
|
+
Everything runs on your machine. No account, no server, no telemetry.
|
|
19
|
+
|
|
18
20
|
## Install
|
|
19
21
|
|
|
20
22
|
```sh
|
|
21
23
|
npm install -g tidyread
|
|
22
|
-
brew install cloudflared # short-lived tunnel for the Instapaper handoff
|
|
23
|
-
brew install kepubify # optional: Kobo-native output
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
That's the whole setup. The two helper binaries arrive on their own:
|
|
27
|
+
[cloudflared](https://github.com/cloudflare/cloudflared) installs with the
|
|
28
|
+
package, and [kepubify](https://github.com/pgaskin/kepubify) downloads once on
|
|
29
|
+
first use from its official releases. If you already have either on your PATH,
|
|
30
|
+
your copy wins.
|
|
31
|
+
|
|
32
|
+
Prefer GitHub over the npm registry:
|
|
27
33
|
|
|
28
34
|
```sh
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
npm install -g github:parzival1l/tidyread
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
or grab the tarball from the
|
|
39
|
+
[latest release](https://github.com/parzival1l/tidyread/releases) and
|
|
40
|
+
`npm install -g tidyread-<version>.tgz`.
|
|
31
41
|
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
## Use
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
# clean the article, then save it to Instapaper through your browser —
|
|
46
|
+
# tidyread never sees your credentials
|
|
47
|
+
tidyread <url>
|
|
34
48
|
|
|
35
|
-
# build files only
|
|
49
|
+
# build files only; nothing leaves the machine
|
|
36
50
|
tidyread <url> --no-send
|
|
37
51
|
|
|
38
52
|
# choose the output directory (default: ~/Kobo/inbox)
|
|
39
53
|
tidyread <url> -o ~/Desktop
|
|
54
|
+
|
|
55
|
+
# pick which browser handles the save
|
|
56
|
+
TIDYREAD_BROWSER=Safari tidyread <url>
|
|
40
57
|
```
|
|
41
58
|
|
|
42
59
|
Outputs per article: `<slug>.html`, `<slug>.epub`, `<slug>.kepub.epub`.
|
|
43
60
|
|
|
61
|
+
The default save flow opens Instapaper's save page in your browser and uses
|
|
62
|
+
the session already there. For headless automation only, `--api` uses the
|
|
63
|
+
Instapaper Simple API with `INSTAPAPER_USERNAME` and `INSTAPAPER_PASSWORD`
|
|
64
|
+
from the environment.
|
|
65
|
+
|
|
44
66
|
## How it works
|
|
45
67
|
|
|
46
68
|
1. **extract** — [defuddle](https://github.com/kepano/defuddle) finds the
|
|
47
69
|
article; @mozilla/readability catches pages defuddle can't read.
|
|
48
70
|
2. **normalise** — real image URLs recovered from lazy-load attributes and
|
|
49
71
|
srcset, links made absolute, tracking pixels dropped, bare `<pre>` wrapped
|
|
50
|
-
in `<code>`,
|
|
72
|
+
in `<code>`, active content stripped by a sanitizer allowlist.
|
|
51
73
|
3. **serve** — the cleaned HTML sits on localhost behind a 128-bit random path.
|
|
52
|
-
4. **tunnel** — `cloudflared` quick tunnel exposes it
|
|
53
|
-
|
|
74
|
+
4. **tunnel** — a `cloudflared` quick tunnel exposes it; no Cloudflare account
|
|
75
|
+
needed.
|
|
76
|
+
5. **deliver** — the tunnel URL goes to Instapaper through your browser.
|
|
54
77
|
After Instapaper fetches, the tunnel closes and the URL stops resolving.
|
|
55
78
|
6. **epub** — images downloaded and embedded, e-ink stylesheet applied,
|
|
56
79
|
kepubify converts for Kobo page numbers and reading stats.
|
|
@@ -62,6 +85,8 @@ Outputs per article: `<slug>.html`, `<slug>.epub`, `<slug>.kepub.epub`.
|
|
|
62
85
|
dies with the process.
|
|
63
86
|
- Article text is never rewritten. Attribution and the original link sit at
|
|
64
87
|
the top of every artifact.
|
|
88
|
+
- Helper binaries come only from their official sources: cloudflared from
|
|
89
|
+
Cloudflare's GitHub releases, kepubify from pgaskin's GitHub releases.
|
|
65
90
|
|
|
66
91
|
## License
|
|
67
92
|
|
package/dist/bins.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloudflared: PATH first, then the copy the `cloudflared` npm package
|
|
3
|
+
* downloads from Cloudflare's GitHub releases at install time.
|
|
4
|
+
*/
|
|
5
|
+
export declare function cloudflaredBin(): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* kepubify: PATH first, then a cached copy downloaded once from the official
|
|
8
|
+
* pgaskin/kepubify GitHub releases. Returns null when the platform has no
|
|
9
|
+
* published binary — the caller skips KEPUB output rather than failing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function kepubifyBin(): Promise<string | null>;
|
package/dist/bins.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { chmod, mkdir, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
/**
|
|
7
|
+
* External binaries tidyread depends on.
|
|
8
|
+
*
|
|
9
|
+
* A system install on PATH always wins, so power users keep control. When a
|
|
10
|
+
* binary is missing, tidyread falls back to a bundled or downloaded copy so
|
|
11
|
+
* `npm install -g tidyread` is the only step anyone has to take.
|
|
12
|
+
*/
|
|
13
|
+
const CACHE_DIR = join(homedir(), ".cache", "tidyread", "bin");
|
|
14
|
+
function onPath(name) {
|
|
15
|
+
const found = spawnSync("which", [name], { encoding: "utf8" });
|
|
16
|
+
const path = found.status === 0 ? found.stdout.trim() : "";
|
|
17
|
+
return path || null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* cloudflared: PATH first, then the copy the `cloudflared` npm package
|
|
21
|
+
* downloads from Cloudflare's GitHub releases at install time.
|
|
22
|
+
*/
|
|
23
|
+
export async function cloudflaredBin() {
|
|
24
|
+
const system = onPath("cloudflared");
|
|
25
|
+
if (system)
|
|
26
|
+
return system;
|
|
27
|
+
const pkg = await import("cloudflared");
|
|
28
|
+
if (!existsSync(pkg.bin)) {
|
|
29
|
+
process.stderr.write(" setup downloading cloudflared (one time)\n");
|
|
30
|
+
await pkg.install(pkg.bin);
|
|
31
|
+
}
|
|
32
|
+
return pkg.bin;
|
|
33
|
+
}
|
|
34
|
+
/** Asset names in pgaskin/kepubify releases, keyed by platform-arch. */
|
|
35
|
+
const KEPUBIFY_ASSETS = {
|
|
36
|
+
"darwin-arm64": "kepubify-darwin-arm64",
|
|
37
|
+
"darwin-x64": "kepubify-darwin-64bit",
|
|
38
|
+
"linux-arm64": "kepubify-linux-arm64",
|
|
39
|
+
"linux-x64": "kepubify-linux-64bit",
|
|
40
|
+
"win32-x64": "kepubify-windows-64bit.exe",
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* kepubify: PATH first, then a cached copy downloaded once from the official
|
|
44
|
+
* pgaskin/kepubify GitHub releases. Returns null when the platform has no
|
|
45
|
+
* published binary — the caller skips KEPUB output rather than failing.
|
|
46
|
+
*/
|
|
47
|
+
export async function kepubifyBin() {
|
|
48
|
+
const system = onPath("kepubify");
|
|
49
|
+
if (system)
|
|
50
|
+
return system;
|
|
51
|
+
const asset = KEPUBIFY_ASSETS[`${process.platform}-${process.arch}`];
|
|
52
|
+
if (!asset)
|
|
53
|
+
return null;
|
|
54
|
+
const cached = join(CACHE_DIR, asset);
|
|
55
|
+
if (existsSync(cached))
|
|
56
|
+
return cached;
|
|
57
|
+
const url = `https://github.com/pgaskin/kepubify/releases/latest/download/${asset}`;
|
|
58
|
+
process.stderr.write(" setup downloading kepubify (one time)\n");
|
|
59
|
+
try {
|
|
60
|
+
const res = await fetch(url, { redirect: "follow" });
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
return null;
|
|
63
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
64
|
+
await mkdir(CACHE_DIR, { recursive: true });
|
|
65
|
+
const partial = `${cached}.download`;
|
|
66
|
+
await writeFile(partial, bytes);
|
|
67
|
+
await chmod(partial, 0o755);
|
|
68
|
+
await rename(partial, cached);
|
|
69
|
+
return cached;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=bins.js.map
|
package/dist/bins.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bins.js","sourceRoot":"","sources":["../src/bins.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -32,7 +32,8 @@ program
|
|
|
32
32
|
.option("-o, --out <dir>", "output directory", DEFAULT_OUT)
|
|
33
33
|
.option("--no-epub", "skip the EPUB and KEPUB build")
|
|
34
34
|
.option("--no-send", "build files only, never open a tunnel")
|
|
35
|
-
.option("--
|
|
35
|
+
.option("--api", "save with the Instapaper Simple API using INSTAPAPER_USERNAME and " +
|
|
36
|
+
"INSTAPAPER_PASSWORD, instead of the browser")
|
|
36
37
|
.option("--keep-open", "leave the tunnel up until you press Ctrl-C")
|
|
37
38
|
.action(async (url, opts) => {
|
|
38
39
|
const outDir = resolve(opts.out);
|
|
@@ -70,15 +71,20 @@ program
|
|
|
70
71
|
});
|
|
71
72
|
try {
|
|
72
73
|
log("tunnel", publicUrl);
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
// Default: your browser's existing Instapaper session does the save.
|
|
75
|
+
// tidyread never asks for credentials.
|
|
76
|
+
if (opts.api) {
|
|
77
|
+
const creds = credentialsFromEnv();
|
|
78
|
+
if (!creds) {
|
|
79
|
+
throw new Error("--api needs INSTAPAPER_USERNAME and INSTAPAPER_PASSWORD set");
|
|
80
|
+
}
|
|
79
81
|
await addByApi(publicUrl, article.title, creds);
|
|
80
82
|
log("instapaper", `saved as "${article.title}"`);
|
|
81
83
|
}
|
|
84
|
+
else {
|
|
85
|
+
addByBrowser(publicUrl);
|
|
86
|
+
log("browser", "opened Instapaper save page — confirm it in the tab");
|
|
87
|
+
}
|
|
82
88
|
const timeout = new Promise((r) => setTimeout(() => r(null), FETCH_WAIT_MS));
|
|
83
89
|
const hit = await Promise.race([hosted.fetched, timeout]);
|
|
84
90
|
if (hit)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACrD,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,CACL,KAAK;SACF,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,MAAM,GAAG,EAAE;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CACV,+DAA+D;IAC7D,8BAA8B,CACjC;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;KAChC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC5D,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/epub.js
CHANGED
|
@@ -4,6 +4,7 @@ import { writeFile } from "node:fs/promises";
|
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import { basename, extname } from "node:path";
|
|
7
|
+
import { kepubifyBin } from "./bins.js";
|
|
7
8
|
import { readingMinutes } from "./render.js";
|
|
8
9
|
/** Typography tuned for a small, slow, greyscale screen. */
|
|
9
10
|
const STYLESHEET = `
|
|
@@ -150,11 +151,12 @@ ${body}
|
|
|
150
151
|
}
|
|
151
152
|
/** Convert to Kobo's EPUB dialect, for real page numbers and reading stats. */
|
|
152
153
|
export async function toKepub(epubPath) {
|
|
154
|
+
const bin = await kepubifyBin();
|
|
155
|
+
if (!bin)
|
|
156
|
+
return null;
|
|
153
157
|
const outPath = epubPath.replace(/\.epub$/, ".kepub.epub");
|
|
154
158
|
const ok = await new Promise((resolve) => {
|
|
155
|
-
const child = spawn(
|
|
156
|
-
stdio: "ignore",
|
|
157
|
-
});
|
|
159
|
+
const child = spawn(bin, ["-o", outPath, epubPath], { stdio: "ignore" });
|
|
158
160
|
child.once("error", () => resolve(false));
|
|
159
161
|
child.once("exit", (code) => resolve(code === 0));
|
|
160
162
|
});
|
package/dist/epub.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epub.js","sourceRoot":"","sources":["../src/epub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"epub.js","sourceRoot":"","sources":["../src/epub.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { cloudflaredBin } from "./bins.js";
|
|
2
3
|
const URL_PATTERN = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
|
|
3
4
|
const START_TIMEOUT_MS = 30_000;
|
|
4
5
|
/**
|
|
@@ -10,7 +11,8 @@ const START_TIMEOUT_MS = 30_000;
|
|
|
10
11
|
* and nothing heavier.
|
|
11
12
|
*/
|
|
12
13
|
export async function openTunnel(port) {
|
|
13
|
-
const
|
|
14
|
+
const bin = await cloudflaredBin();
|
|
15
|
+
const child = spawn(bin, [
|
|
14
16
|
"tunnel",
|
|
15
17
|
"--no-autoupdate",
|
|
16
18
|
"--url",
|
|
@@ -31,8 +33,7 @@ export async function openTunnel(port) {
|
|
|
31
33
|
child.stderr?.on("data", scan);
|
|
32
34
|
child.once("error", (err) => {
|
|
33
35
|
clearTimeout(timer);
|
|
34
|
-
reject(new Error(`could not start cloudflared: ${err.message}
|
|
35
|
-
`Install it with: brew install cloudflared`));
|
|
36
|
+
reject(new Error(`could not start cloudflared: ${err.message}`));
|
|
36
37
|
});
|
|
37
38
|
child.once("exit", (code) => {
|
|
38
39
|
clearTimeout(timer);
|
package/dist/tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAQ3C,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,MAAM,cAAc,EAAE,CAAC;IACnC,MAAM,KAAK,GAAiB,KAAK,CAC/B,GAAG,EACH;QACE,QAAQ;QACR,iBAAiB;QACjB,OAAO;QACP,oBAAoB,IAAI,EAAE;KAC3B,EACD,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACtC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACpE,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,KAAK,CAAC,KAAK;YACT,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YACpD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,IAAI,CAAC,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tidyread",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Clean an article once, hand it to Instapaper's parser pre-chewed, and build a Kobo-ready EPUB.",
|
|
5
5
|
"main": "dist/cli.js",
|
|
6
6
|
"scripts": {
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"typecheck": "tsc --noEmit",
|
|
11
11
|
"check": "npm run build && npm test",
|
|
12
12
|
"prepublishOnly": "npm run check",
|
|
13
|
-
"pack:dry-run": "npm pack --dry-run"
|
|
13
|
+
"pack:dry-run": "npm pack --dry-run",
|
|
14
|
+
"prepare": "npm run build"
|
|
14
15
|
},
|
|
15
16
|
"keywords": [
|
|
16
17
|
"instapaper",
|
|
@@ -28,6 +29,7 @@
|
|
|
28
29
|
"type": "module",
|
|
29
30
|
"dependencies": {
|
|
30
31
|
"@mozilla/readability": "^0.6.0",
|
|
32
|
+
"cloudflared": "^0.7.3",
|
|
31
33
|
"commander": "^15.0.0",
|
|
32
34
|
"defuddle": "^0.19.3",
|
|
33
35
|
"jszip": "^3.10.2",
|