@blockspoon/cert-badge-renderer 1.0.4 → 1.0.7

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 CHANGED
@@ -22,7 +22,7 @@ npm install @blockspoon/cert-badge-renderer
22
22
 
23
23
  ## 📝 사용법 예제
24
24
 
25
- ### 1. 인증서 또는 배지 HTML 생성
25
+ ### 1. 인증서 또는 배지 객체 기반으로 HTML 생성하기
26
26
 
27
27
  ```ts
28
28
  import { generateAchievementHTML } from "@blockspoon/cert-badge-renderer/browser";
@@ -34,7 +34,7 @@ const html = await generateAchievementHTML(achievement, {
34
34
  });
35
35
  ```
36
36
 
37
- ### 2. 인증서 또는 배지 PNG 이미지 생성
37
+ <!-- ### 2. 인증서 또는 배지 PNG 이미지 생성
38
38
 
39
39
  ```ts
40
40
  import { generateAchievementFile } from "@blockspoon/cert-badge-renderer/server";
@@ -49,21 +49,21 @@ const result = await generateAchievementFile(achievement, {
49
49
  // Base64 저장 예시
50
50
  const base64 = result.base64.replace(/^data:image\/png;base64,/, "");
51
51
  require("fs").writeFileSync("certificate.png", Buffer.from(base64, "base64"));
52
- ```
52
+ ``` -->
53
53
 
54
- ### 3. 디자인(JSON) 기반으로 HTML 생성하기
54
+ ### 2. 디자인 객체 기반으로 HTML 생성하기
55
55
 
56
56
  ```ts
57
57
  import { generateDesignHTML } from "@blockspoon/cert-badge-renderer/browser";
58
58
 
59
59
  // certificateDesign: https://developers.kolleges.net/docs/design_get_certificate#certificatedesign-object
60
60
  // badgeDesign: https://developers.kolleges.net/docs/design_get_badge#badgedesign-object
61
- const html = await generateDesignHTML(certificateDesign || badgeDesign);
62
-
63
- require("fs").writeFileSync("badge.html", html, "utf-8");
61
+ const html = await generateDesignHTML(certificateDesign || badgeDesign, {
62
+ size: 600, // 렌더링 크기 (px)
63
+ });
64
64
  ```
65
65
 
66
- ### 4. 디자인(JSON) 기반으로 PNG 생성하기
66
+ <!-- ### 4. 디자인(JSON) 기반으로 PNG 생성하기
67
67
 
68
68
  ```ts
69
69
  import { generateDesignFile } from "@blockspoon/cert-badge-renderer/server";
@@ -75,7 +75,7 @@ const png = await generateDesignFile(certificateDesign || badgeDesign);
75
75
  require("fs").writeFileSync("badge.png", png.buffer);
76
76
  ```
77
77
 
78
- ---
78
+ --- -->
79
79
 
80
80
  ## 🔐 API Key 사용 방식
81
81
 
@@ -1 +1,2 @@
1
1
  export { generateAchievementHTML } from "../utils/generateAchievementHTML";
2
+ export { generateDesignHTML } from "../utils/generateDesignHTML";
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateAchievementHTML = void 0;
3
+ exports.generateDesignHTML = exports.generateAchievementHTML = void 0;
4
4
  // ✅ src/browser/index.ts
5
5
  var generateAchievementHTML_1 = require("../utils/generateAchievementHTML");
6
6
  Object.defineProperty(exports, "generateAchievementHTML", { enumerable: true, get: function () { return generateAchievementHTML_1.generateAchievementHTML; } });
7
+ var generateDesignHTML_1 = require("../utils/generateDesignHTML");
8
+ Object.defineProperty(exports, "generateDesignHTML", { enumerable: true, get: function () { return generateDesignHTML_1.generateDesignHTML; } });
@@ -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 generateDesignHTML(data_1) {
53
23
  return __awaiter(this, arguments, void 0, function* (data, options = {}) {
54
24
  const { size = 600, noSpace = false } = options;
@@ -251,19 +221,19 @@ function generateDesignHTML(data_1) {
251
221
  }
252
222
  else if (element.src) {
253
223
  // 이미지를 base64로 변환
254
- const base64Image = yield convertImageToBase64(element.src);
224
+ // const base64Image = await convertImageToBase64(element.src);
255
225
  html += `<img
256
- src="${base64Image}"
257
- alt="Uploaded"
258
- style="
259
- width: 100%;
260
- height: 100%;
261
- max-width: 100%;
262
- max-height: 100%;
263
- object-fit: contain;
264
- align-self: center;
265
- "
266
- />`;
226
+ src="${element.src}"
227
+ alt="Uploaded"
228
+ style="
229
+ width: 100%;
230
+ height: 100%;
231
+ max-width: 100%;
232
+ max-height: 100%;
233
+ object-fit: contain;
234
+ align-self: center;
235
+ "
236
+ />`;
267
237
  }
268
238
  html += `</div>`;
269
239
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockspoon/cert-badge-renderer",
3
- "version": "1.0.4",
3
+ "version": "1.0.7",
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",
@@ -1,2 +1,3 @@
1
1
  // ✅ src/browser/index.ts
2
2
  export { generateAchievementHTML } from "../utils/generateAchievementHTML";
3
+ export { generateDesignHTML } from "../utils/generateDesignHTML";
@@ -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 generateDesignHTML(
50
18
  data: IAchievementDesignItem,
51
19
  options: DesignOptions = {}
@@ -283,19 +251,19 @@ export async function generateDesignHTML(
283
251
  }
284
252
  } else if (element.src) {
285
253
  // 이미지를 base64로 변환
286
- const base64Image = await convertImageToBase64(element.src);
254
+ // const base64Image = await convertImageToBase64(element.src);
287
255
  html += `<img
288
- src="${base64Image}"
289
- alt="Uploaded"
290
- style="
291
- width: 100%;
292
- height: 100%;
293
- max-width: 100%;
294
- max-height: 100%;
295
- object-fit: contain;
296
- align-self: center;
297
- "
298
- />`;
256
+ src="${element.src}"
257
+ alt="Uploaded"
258
+ style="
259
+ width: 100%;
260
+ height: 100%;
261
+ max-width: 100%;
262
+ max-height: 100%;
263
+ object-fit: contain;
264
+ align-self: center;
265
+ "
266
+ />`;
299
267
  }
300
268
  html += `</div>`;
301
269
  }