twitter-snap 0.0.9 → 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 -3
- package/README.md +46 -46
- 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 -1
- 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.config.js +4 -4
- package/package.json +4 -3
- package/tsconfig.json +24 -39
- 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/.eslintrc.json
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "next/core-web-vitals"
|
|
3
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": "next/core-web-vitals"
|
|
3
|
+
}
|
package/README.md
CHANGED
|
@@ -1,46 +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
|
-
## 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
|
-
```
|
|
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"}
|