@blockspoon/cert-badge-renderer 1.0.1 → 1.0.3
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 +0 -3
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.js +6 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +8 -0
- package/dist/utils/generateAchievementHTML.js +2 -32
- package/package.json +15 -1
- package/src/browser/index.ts +2 -0
- package/src/server/index.ts +3 -0
- package/src/utils/generateAchievementHTML.ts +2 -34
- package/test/certificate_base64.png +0 -0
package/README.md
CHANGED
|
@@ -80,9 +80,6 @@ require("fs").writeFileSync("badge.png", png.buffer);
|
|
|
80
80
|
## 🔐 API Key 사용 방식
|
|
81
81
|
|
|
82
82
|
패키지 사용 시 서버 요청에는 API Key가 필요합니다.
|
|
83
|
-
이는 인증서 생성 및 검증 요청의 보안을 위한 절차이며,
|
|
84
|
-
패키지 내부의 Open API 호출 시 자동으로 토큰이 헤더에 포함됩니다.
|
|
85
|
-
|
|
86
83
|
자세한 정보는 https://developers.kolleges.net 참고 부탁드립니다.
|
|
87
84
|
|
|
88
85
|
---
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { generateAchievementHTML } from "../utils/generateAchievementHTML";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateAchievementHTML = void 0;
|
|
4
|
+
// ✅ src/browser/index.ts
|
|
5
|
+
var generateAchievementHTML_1 = require("../utils/generateAchievementHTML");
|
|
6
|
+
Object.defineProperty(exports, "generateAchievementHTML", { enumerable: true, get: function () { return generateAchievementHTML_1.generateAchievementHTML; } });
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateAchievementHTML = exports.generateAchievementFile = void 0;
|
|
4
|
+
// ✅ src/server/index.ts
|
|
5
|
+
var generateAchievementFile_1 = require("../utils/generateAchievementFile");
|
|
6
|
+
Object.defineProperty(exports, "generateAchievementFile", { enumerable: true, get: function () { return generateAchievementFile_1.generateAchievementFile; } });
|
|
7
|
+
var generateAchievementHTML_1 = require("../utils/generateAchievementHTML");
|
|
8
|
+
Object.defineProperty(exports, "generateAchievementHTML", { enumerable: true, get: function () { return generateAchievementHTML_1.generateAchievementHTML; } });
|
|
@@ -19,36 +19,6 @@ const qrcode_1 = __importDefault(require("qrcode"));
|
|
|
19
19
|
const svgTemplate_1 = require("../templates/svgTemplate");
|
|
20
20
|
const certificates_1 = __importDefault(require("../templates/certificates"));
|
|
21
21
|
const componentsDirection_1 = require("../constants/componentsDirection");
|
|
22
|
-
function convertImageToBase64(url) {
|
|
23
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
-
try {
|
|
25
|
-
// URL이 이미 baseUrl을 포함하고 있는지 확인
|
|
26
|
-
let finalUrls = [];
|
|
27
|
-
finalUrls = url.split("https://");
|
|
28
|
-
const finalUrl = "https://" + finalUrls.pop();
|
|
29
|
-
const response = yield fetch(finalUrl, {
|
|
30
|
-
credentials: "include",
|
|
31
|
-
headers: {
|
|
32
|
-
Accept: "image/*",
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
if (!response.ok) {
|
|
36
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
37
|
-
}
|
|
38
|
-
const contentType = response.headers.get("content-type");
|
|
39
|
-
if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith("image/"))) {
|
|
40
|
-
throw new Error(`Not an image! content-type: ${contentType}`);
|
|
41
|
-
}
|
|
42
|
-
const buffer = yield response.arrayBuffer();
|
|
43
|
-
const base64 = Buffer.from(buffer).toString("base64");
|
|
44
|
-
return `data:${contentType};base64,${base64}`;
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error(`이미지 변환 실패: ${url}`, error);
|
|
48
|
-
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
22
|
function generateAchievementHTML(data_1) {
|
|
53
23
|
return __awaiter(this, arguments, void 0, function* (data, options = {}) {
|
|
54
24
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
@@ -272,9 +242,9 @@ function generateAchievementHTML(data_1) {
|
|
|
272
242
|
}
|
|
273
243
|
else if (element.src) {
|
|
274
244
|
// 이미지를 base64로 변환
|
|
275
|
-
const base64Image =
|
|
245
|
+
// const base64Image = await convertImageToBase64(element.src);
|
|
276
246
|
html += `<img
|
|
277
|
-
src="${
|
|
247
|
+
src="${element.src}"
|
|
278
248
|
alt="Uploaded"
|
|
279
249
|
style="
|
|
280
250
|
width: 100%;
|
package/package.json
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blockspoon/cert-badge-renderer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Render certificate and badge designs from Kolleges achievement data into HTML, PNG, or Base64.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/browser/index.js",
|
|
10
|
+
"types": "./dist/browser/index.d.ts"
|
|
11
|
+
},
|
|
12
|
+
"./browser": {
|
|
13
|
+
"import": "./dist/browser/index.js",
|
|
14
|
+
"types": "./dist/browser/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./server": {
|
|
17
|
+
"import": "./dist/server/index.js",
|
|
18
|
+
"types": "./dist/server/index.d.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
7
21
|
"scripts": {
|
|
8
22
|
"build": "tsc",
|
|
9
23
|
"test": "node test/test.js"
|
|
@@ -14,38 +14,6 @@ import {
|
|
|
14
14
|
import Certificates from "../templates/certificates";
|
|
15
15
|
import { portraitComponents } from "../constants/componentsDirection";
|
|
16
16
|
|
|
17
|
-
async function convertImageToBase64(url: string): Promise<string> {
|
|
18
|
-
try {
|
|
19
|
-
// URL이 이미 baseUrl을 포함하고 있는지 확인
|
|
20
|
-
let finalUrls = [];
|
|
21
|
-
finalUrls = url.split("https://");
|
|
22
|
-
const finalUrl = "https://" + finalUrls.pop();
|
|
23
|
-
|
|
24
|
-
const response = await fetch(finalUrl, {
|
|
25
|
-
credentials: "include",
|
|
26
|
-
headers: {
|
|
27
|
-
Accept: "image/*",
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const contentType = response.headers.get("content-type");
|
|
36
|
-
if (!contentType?.startsWith("image/")) {
|
|
37
|
-
throw new Error(`Not an image! content-type: ${contentType}`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const buffer = await response.arrayBuffer();
|
|
41
|
-
const base64 = Buffer.from(buffer).toString("base64");
|
|
42
|
-
return `data:${contentType};base64,${base64}`;
|
|
43
|
-
} catch (error) {
|
|
44
|
-
console.error(`이미지 변환 실패: ${url}`, error);
|
|
45
|
-
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
17
|
export async function generateAchievementHTML(
|
|
50
18
|
data: CertificateData,
|
|
51
19
|
options: CertificateOptions = {}
|
|
@@ -317,9 +285,9 @@ export async function generateAchievementHTML(
|
|
|
317
285
|
}
|
|
318
286
|
} else if (element.src) {
|
|
319
287
|
// 이미지를 base64로 변환
|
|
320
|
-
const base64Image = await convertImageToBase64(element.src);
|
|
288
|
+
// const base64Image = await convertImageToBase64(element.src);
|
|
321
289
|
html += `<img
|
|
322
|
-
src="${
|
|
290
|
+
src="${element.src}"
|
|
323
291
|
alt="Uploaded"
|
|
324
292
|
style="
|
|
325
293
|
width: 100%;
|
|
Binary file
|