twitter-snap 0.0.8 → 0.0.10
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/.eslintrc.json +3 -0
- package/README.md +46 -26
- package/dist/app/api/twitter/route.d.ts +3 -0
- package/dist/app/api/twitter/route.d.ts.map +1 -0
- package/dist/app/api/twitter/route.js +19 -0
- package/dist/app/api/twitter/route.js.map +1 -0
- package/dist/app/layout.d.ts +7 -0
- package/dist/app/layout.d.ts.map +1 -0
- package/dist/app/layout.js +11 -0
- package/dist/app/layout.js.map +1 -0
- package/dist/app/page.d.ts +2 -0
- package/dist/app/page.d.ts.map +1 -0
- package/dist/app/page.js +23 -0
- package/dist/app/page.js.map +1 -0
- package/dist/cli.js +23 -100
- package/dist/cli.js.map +1 -1
- package/dist/core/twitterSnap.d.ts +17 -38
- package/dist/core/twitterSnap.d.ts.map +1 -1
- package/dist/core/twitterSnap.js +30 -330
- package/dist/core/twitterSnap.js.map +1 -1
- package/dist/theme/normal.d.ts +4 -0
- package/dist/theme/normal.d.ts.map +1 -0
- package/dist/theme/normal.js +212 -0
- package/dist/theme/normal.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/cookies.d.ts +2 -0
- package/dist/utils/cookies.d.ts.map +1 -0
- package/dist/utils/cookies.js +15 -0
- package/dist/utils/cookies.js.map +1 -0
- package/dist/utils/fonts.d.ts +5 -0
- package/dist/utils/fonts.d.ts.map +1 -0
- package/dist/utils/fonts.js +13 -0
- package/dist/utils/fonts.js.map +1 -0
- package/next-env.d.ts +5 -0
- package/next.config.js +4 -0
- package/package.json +33 -46
- package/tsconfig.json +12 -4
- package/dist/assets/LICENSE +0 -21
- package/dist/assets/LICENSE-GRAPHICS +0 -393
- package/dist/assets/LICENSE_OFL.txt +0 -92
- package/dist/assets/NotoSansCJKjp-Bold.otf +0 -0
- package/dist/assets/NotoSansCJKjp-Regular.otf +0 -0
- package/dist/core/satori.d.ts +0 -12
- package/dist/core/satori.d.ts.map +0 -1
- package/dist/core/satori.js +0 -3
- package/dist/core/satori.js.map +0 -1
- package/dist/style/normal.d.ts +0 -4
- package/dist/style/normal.d.ts.map +0 -1
- package/dist/style/normal.js +0 -158
- package/dist/style/normal.js.map +0 -1
- package/dist/utils/example.d.ts +0 -3
- package/dist/utils/example.d.ts.map +0 -1
- package/dist/utils/example.js +0 -55
- package/dist/utils/example.js.map +0 -1
- package/init.ps1 +0 -18
package/.eslintrc.json
ADDED
package/README.md
CHANGED
|
@@ -1,26 +1,46 @@
|
|
|
1
|
-
# twitter-snap
|
|
2
|
-
|
|
3
|
-
Create beautiful Tweet images fast.
|
|
4
|
-
Fast, good design, Browser is not a dependency.
|
|
5
|
-
|
|
6
|
-
```shell
|
|
7
|
-
npx twitter-snap https://twitter.com/elonmusk/status/1518623997054918657
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-

|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
--
|
|
24
|
-
|
|
25
|
-
--
|
|
26
|
-
|
|
1
|
+
# twitter-snap
|
|
2
|
+
|
|
3
|
+
Create beautiful Tweet images fast.
|
|
4
|
+
Fast, good design, Browser is not a dependency.
|
|
5
|
+
|
|
6
|
+
```shell
|
|
7
|
+
npx twitter-snap https://twitter.com/elonmusk/status/1518623997054918657
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
## Arguments
|
|
13
|
+
|
|
14
|
+
```shell
|
|
15
|
+
Usage: twitter-snap [options] <string>
|
|
16
|
+
|
|
17
|
+
Arguments:
|
|
18
|
+
string tweet url or tweet id
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
-V, --version output the version number
|
|
22
|
+
-o, --output <path> output file path (default: "output.png")
|
|
23
|
+
-w, --width <number> image width (default: "600")
|
|
24
|
+
-h, --height <number> image height
|
|
25
|
+
-t, --theme <string> theme (default: "normal")
|
|
26
|
+
--fonts <path> font config file path .json
|
|
27
|
+
--emoji <string> emoji type (twemoji,openmoji,blobmoji,noto,fluent,fluentFlat) (default: "twemoji")
|
|
28
|
+
--cookies <path> net escape cookie file path .txt
|
|
29
|
+
--help display help for command
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Font
|
|
33
|
+
|
|
34
|
+
You can specify the font by creating a font config file.
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
[
|
|
38
|
+
{
|
|
39
|
+
"data": "./fonts/NotoSansJP-Regular.otf",
|
|
40
|
+
"name": "Noto Sans JP",
|
|
41
|
+
"weight": 400,
|
|
42
|
+
"theme": "normal",
|
|
43
|
+
"lang": "ja-JP"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/app/api/twitter/route.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,wBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,qBAezC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TwitterOpenApi } from "twitter-openapi-typescript";
|
|
2
|
+
const guest = new TwitterOpenApi().getGuestClient();
|
|
3
|
+
export async function GET(req) {
|
|
4
|
+
const { searchParams } = new URL(req.url);
|
|
5
|
+
const id = searchParams.get("id");
|
|
6
|
+
const client = await guest;
|
|
7
|
+
if (!id) {
|
|
8
|
+
return new Response("Missing id", { status: 400 });
|
|
9
|
+
}
|
|
10
|
+
const tweet = await client.getDefaultApi().getTweetResultByRestId({
|
|
11
|
+
tweetId: id,
|
|
12
|
+
});
|
|
13
|
+
return new Response(JSON.stringify(tweet), {
|
|
14
|
+
headers: {
|
|
15
|
+
"content-type": "application/json",
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../../src/app/api/twitter/route.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE,CAAC,cAAc,EAAE,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAgB;IACxC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;IAC3B,IAAI,CAAC,EAAE,EAAE;QACP,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;KACpD;IACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,sBAAsB,CAAC;QAChE,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;IACH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;QACzC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { Metadata } from "next";
|
|
3
|
+
export declare const metadata: Metadata;
|
|
4
|
+
export default function RootLayout({ children, }: {
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/app/layout.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKrC,eAAO,MAAM,QAAQ,EAAE,QAGtB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAQA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Inter } from "next/font/google";
|
|
3
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
4
|
+
export const metadata = {
|
|
5
|
+
title: "Create Next App",
|
|
6
|
+
description: "Generated by create next app",
|
|
7
|
+
};
|
|
8
|
+
export default function RootLayout({ children, }) {
|
|
9
|
+
return (_jsx("html", { lang: "en", children: _jsx("body", { className: inter.className, style: { margin: 0 }, children: children }) }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/app/layout.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,8BAA8B;CAC5C,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,GAGT;IACC,OAAO,CACL,eAAM,IAAI,EAAC,IAAI,YACb,eAAM,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YACnD,QAAQ,GACJ,GACF,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/app/page.tsx"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,UAAU,IAAI,4CA6B3B"}
|
package/dist/app/page.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import Normal from "./../theme/normal";
|
|
6
|
+
export default function Home() {
|
|
7
|
+
const toAPi = (e) => `/api/twitter?id=${e}`;
|
|
8
|
+
const toId = (e) => (isNaN(Number(e)) ? e.split("/").pop() : e);
|
|
9
|
+
const [state, setState] = useState(null);
|
|
10
|
+
const [id, setId] = useState("1518623997054918657");
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
fetch(toAPi(toId(id)))
|
|
13
|
+
.then((e) => e.json())
|
|
14
|
+
.then((e) => setState(e.data));
|
|
15
|
+
}, [id]);
|
|
16
|
+
return (_jsxs(_Fragment, { children: [_jsx("input", { value: id, onChange: (e) => setId(e.target.value) }), state && (_jsx("div", { style: {
|
|
17
|
+
width: "600px",
|
|
18
|
+
display: "flex",
|
|
19
|
+
justifyContent: "center",
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
}, children: _jsx(Normal, { data: state }) }))] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/app/page.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAc,EAAO,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAGvC,MAAM,CAAC,OAAO,UAAU,IAAI;IAC1B,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACnB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACrB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACT,OAAO,CACL,8BACE,gBAAO,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,EAC3D,KAAK,IAAI,CACR,cACE,KAAK,EAAE;oBACL,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,MAAM;oBACf,cAAc,EAAE,QAAQ;oBACxB,UAAU,EAAE,QAAQ;iBACrB,YAED,KAAC,MAAM,IAAC,IAAI,EAAE,KAAK,GAAI,GACnB,CACP,IACA,CACJ,CAAC;AACJ,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,111 +1,34 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
-
});
|
|
11
|
-
};
|
|
12
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
13
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
14
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
15
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
16
|
-
function step(op) {
|
|
17
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
18
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
19
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
20
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
21
|
-
switch (op[0]) {
|
|
22
|
-
case 0: case 1: t = op; break;
|
|
23
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
24
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
25
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
26
|
-
default:
|
|
27
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
28
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
29
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
30
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
31
|
-
if (t[2]) _.ops.pop();
|
|
32
|
-
_.trys.pop(); continue;
|
|
33
|
-
}
|
|
34
|
-
op = body.call(thisArg, _);
|
|
35
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
36
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
var twitterSnap_1 = require("./core/twitterSnap");
|
|
41
|
-
var commander_1 = require("commander");
|
|
42
|
-
var fs_1 = require("fs");
|
|
43
|
-
var path = require("path");
|
|
44
|
-
var current = path.dirname((0, fs_1.realpathSync)(__filename));
|
|
45
|
-
var version = "0.0.8";
|
|
46
|
-
var font = path.join(current, "./assets/NotoSansCJKjp-Regular.otf");
|
|
47
|
-
var boldFont = path.join(current, "./assets/NotoSansCJKjp-Bold.otf");
|
|
48
|
-
var emojiFont = path.join(current, "./assets/twemoji/{code}.svg");
|
|
49
|
-
var program = new commander_1.Command();
|
|
2
|
+
import { TwitterSnap } from "./core/twitterSnap.js";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { promises as fs } from "fs";
|
|
5
|
+
import { getClient } from "./utils/cookies.js";
|
|
6
|
+
import { getFonts } from "./utils/fonts.js";
|
|
7
|
+
const version = "0.0.10";
|
|
8
|
+
const program = new Command();
|
|
50
9
|
program.name("twitter-snap").version(version);
|
|
51
10
|
program
|
|
52
11
|
.argument("<string>", "tweet url or tweet id")
|
|
53
12
|
.option("-o, --output <path>", "output file path", "output.png")
|
|
54
13
|
.option("-w, --width <number>", "image width", "600")
|
|
55
14
|
.option("-h, --height <number>", "image height")
|
|
56
|
-
.option("-
|
|
57
|
-
.option("--
|
|
58
|
-
.option("--
|
|
59
|
-
.option("--
|
|
60
|
-
.action(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
id = isNaN(text) ? text.split("/").pop() : text;
|
|
69
|
-
_b = twitterSnap_1.TwitterSnap.bind;
|
|
70
|
-
_d = {
|
|
71
|
-
width: parseInt(width),
|
|
72
|
-
height: height ? parseInt(height) : undefined
|
|
73
|
-
};
|
|
74
|
-
_e = {
|
|
75
|
-
name: "Regular"
|
|
76
|
-
};
|
|
77
|
-
return [4 /*yield*/, fs_1.promises.readFile(font)];
|
|
78
|
-
case 1:
|
|
79
|
-
_c = [
|
|
80
|
-
(_e.data = _g.sent(),
|
|
81
|
-
_e.weight = 400,
|
|
82
|
-
_e.style = "normal",
|
|
83
|
-
_e)
|
|
84
|
-
];
|
|
85
|
-
_f = {
|
|
86
|
-
name: "Bold"
|
|
87
|
-
};
|
|
88
|
-
return [4 /*yield*/, fs_1.promises.readFile(boldFont)];
|
|
89
|
-
case 2:
|
|
90
|
-
twitterSnap = new (_b.apply(twitterSnap_1.TwitterSnap, [void 0, (_d.font = _c.concat([
|
|
91
|
-
(_f.data = _g.sent(),
|
|
92
|
-
_f.weight = 700,
|
|
93
|
-
_f.style = "normal",
|
|
94
|
-
_f)
|
|
95
|
-
]),
|
|
96
|
-
_d.emojiFont = emojiFont,
|
|
97
|
-
_d)]))();
|
|
98
|
-
return [4 /*yield*/, twitterSnap.render({ id: id, styleName: style })];
|
|
99
|
-
case 3:
|
|
100
|
-
writer = _g.sent();
|
|
101
|
-
return [4 /*yield*/, writer.save(output)];
|
|
102
|
-
case 4:
|
|
103
|
-
_g.sent();
|
|
104
|
-
process.exit(0);
|
|
105
|
-
return [2 /*return*/];
|
|
106
|
-
}
|
|
107
|
-
});
|
|
15
|
+
.option("-t, --theme <string>", "theme", "normal")
|
|
16
|
+
.option("--fonts <path>", "font config file path .json")
|
|
17
|
+
.option("--emoji <string>", "emoji type (twemoji,openmoji,blobmoji,noto,fluent,fluentFlat)", "twemoji")
|
|
18
|
+
.option("--cookies <path>", "net escape cookie file path .txt")
|
|
19
|
+
.action(async (text, { output, width, height, theme, fonts, emoji, cookies }) => {
|
|
20
|
+
const id = isNaN(text) ? text.split("/").pop() : text;
|
|
21
|
+
const twitterSnap = new TwitterSnap({
|
|
22
|
+
width: parseInt(width),
|
|
23
|
+
height: height ? parseInt(height) : undefined,
|
|
24
|
+
client: cookies && getClient(cookies),
|
|
25
|
+
fonts: fonts && getFonts(fonts),
|
|
26
|
+
emoji: emoji,
|
|
108
27
|
});
|
|
28
|
+
const res = await twitterSnap.render({ id, themeName: theme });
|
|
29
|
+
const png = Buffer.from(await res.arrayBuffer());
|
|
30
|
+
await fs.writeFile(output, png);
|
|
31
|
+
process.exit(0);
|
|
109
32
|
});
|
|
110
33
|
program.parse(process.argv);
|
|
111
34
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9C,OAAO;KACJ,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,YAAY,CAAC;KAC/D,MAAM,CAAC,sBAAsB,EAAE,aAAa,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,uBAAuB,EAAE,cAAc,CAAC;KAC/C,MAAM,CAAC,sBAAsB,EAAE,OAAO,EAAE,QAAQ,CAAC;KACjD,MAAM,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;KACvD,MAAM,CACL,kBAAkB,EAClB,+DAA+D,EAC/D,SAAS,CACV;KACA,MAAM,CAAC,kBAAkB,EAAE,kCAAkC,CAAC;KAC9D,MAAM,CACL,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IACtE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7C,MAAM,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QAC/B,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CACF,CAAC;AACJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1,54 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
export type StyleComponent = (props: {
|
|
1
|
+
import { ReactElement } from "react";
|
|
2
|
+
import { ImageResponse } from "@vercel/og";
|
|
3
|
+
import { ImageResponseOptions } from "@vercel/og/dist/types";
|
|
4
|
+
import { TwitterOpenApiClient, TweetApiUtilsData } from "twitter-openapi-typescript";
|
|
5
|
+
export type themeComponent = (props: {
|
|
7
6
|
data: TweetApiUtilsData;
|
|
8
|
-
}) =>
|
|
7
|
+
}) => ReactElement;
|
|
9
8
|
type TwitterSnapParams = {
|
|
10
9
|
width: number;
|
|
11
10
|
height?: number;
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
client?: TwitterOpenApiClient | Promise<TwitterOpenApiClient>;
|
|
12
|
+
fonts?: ImageResponseOptions["fonts"];
|
|
13
|
+
emoji?: ImageResponseOptions["emoji"];
|
|
14
14
|
};
|
|
15
15
|
type TwitterSnapRenderParams = {
|
|
16
16
|
id: string;
|
|
17
|
-
|
|
17
|
+
themeName?: string;
|
|
18
18
|
};
|
|
19
19
|
export declare class TwitterSnap {
|
|
20
20
|
width: number;
|
|
21
21
|
height: number | undefined;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
client: TwitterOpenApiClient | Promise<TwitterOpenApiClient>;
|
|
23
|
+
fonts: ImageResponseOptions["fonts"];
|
|
24
|
+
emoji: ImageResponseOptions["emoji"];
|
|
25
|
+
static themes: {
|
|
26
|
+
[key: string]: themeComponent;
|
|
25
27
|
};
|
|
26
28
|
constructor(param: TwitterSnapParams);
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
type TwitterSnapWriterParams = {
|
|
30
|
-
width: number;
|
|
31
|
-
height: number | undefined;
|
|
32
|
-
svg: string;
|
|
33
|
-
};
|
|
34
|
-
export declare class TwitterSnapWriter {
|
|
35
|
-
data: string;
|
|
36
|
-
_trasformer: Transformer | undefined;
|
|
37
|
-
constructor(param: TwitterSnapWriterParams);
|
|
38
|
-
trasformer: () => Promise<Transformer>;
|
|
39
|
-
save: (output: string) => Promise<void>;
|
|
40
|
-
svg: (output: string) => Promise<void>;
|
|
41
|
-
raw: (output: string) => Promise<void>;
|
|
42
|
-
jpeg: (output: string) => Promise<void>;
|
|
43
|
-
png: (output: string) => Promise<void>;
|
|
44
|
-
bmp: (output: string) => Promise<void>;
|
|
45
|
-
ico: (output: string) => Promise<void>;
|
|
46
|
-
tiff: (output: string) => Promise<void>;
|
|
47
|
-
webp: (output: string) => Promise<void>;
|
|
48
|
-
avif: (output: string) => Promise<void>;
|
|
49
|
-
pnm: (output: string) => Promise<void>;
|
|
50
|
-
tga: (output: string) => Promise<void>;
|
|
51
|
-
farbfeld: (output: string) => Promise<void>;
|
|
29
|
+
getClient: () => Promise<TwitterOpenApiClient>;
|
|
30
|
+
render: ({ id, themeName }: TwitterSnapRenderParams) => Promise<ImageResponse>;
|
|
52
31
|
}
|
|
53
32
|
export {};
|
|
54
33
|
//# sourceMappingURL=twitterSnap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twitterSnap.d.ts","sourceRoot":"","sources":["../../src/core/twitterSnap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"twitterSnap.d.ts","sourceRoot":"","sources":["../../src/core/twitterSnap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAEL,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,iBAAiB,CAAC;CACzB,KAAK,YAAY,CAAC;AAEnB,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,WAAW;IACtB,KAAK,EAAG,MAAM,CAAC;IACf,MAAM,EAAG,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAG,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9D,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,CAE9C;gBAEU,KAAK,EAAE,iBAAiB;IAQpC,SAAS,sCAKP;IAEF,MAAM,sBAA6B,uBAAuB,4BAaxD;CACH"}
|