@ogxjs/core 0.1.0 → 0.1.1
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/dist/builder.d.ts +14 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +51 -0
- package/dist/cache.d.ts +16 -1
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +40 -9
- package/dist/css.d.ts.map +1 -1
- package/dist/font-registry.d.ts.map +1 -1
- package/dist/fonts.d.ts +4 -2
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +28 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/ogx.js +4 -4
- package/dist/presets/blog.d.ts.map +1 -1
- package/dist/presets/docs.d.ts.map +1 -1
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/minimal.d.ts.map +1 -1
- package/dist/presets/social.d.ts.map +1 -1
- package/dist/render-png.d.ts.map +1 -1
- package/dist/tailwind/index.d.ts.map +1 -1
- package/dist/tailwind/parser.d.ts.map +1 -1
- package/dist/tailwind/parser.js +18 -0
- package/dist/targets.d.ts.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/render.d.ts +0 -10
- package/dist/render.d.ts.map +0 -1
- package/dist/render.js +0 -180
package/dist/builder.d.ts
CHANGED
|
@@ -66,8 +66,21 @@ export declare const card: (tw?: TailwindUtility | TailwindUtility[], children?:
|
|
|
66
66
|
/** Create a badge/pill */
|
|
67
67
|
export declare const badge: (text: string, color?: "blue" | "green" | "purple" | "slate") => OGXElement;
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Validate a URL to prevent SSRF attacks.
|
|
70
|
+
* >- In production, blocks localhost, private IPs, and metadata endpoints.
|
|
71
|
+
* >- In development, allows localhost for local testing.
|
|
72
|
+
*
|
|
73
|
+
* @param url - URL to validate
|
|
74
|
+
* @returns true if URL is safe to use
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* validateImageUrl("https://example.com/image.png") // --> true
|
|
79
|
+
* validateImageUrl("http://localhost/image.png") // --> true in dev, false in prod
|
|
80
|
+
* validateImageUrl("http://169.254.169.254/metadata") // --> false
|
|
81
|
+
* ```
|
|
70
82
|
*/
|
|
83
|
+
export declare function validateImageUrl(url: string): boolean;
|
|
71
84
|
/** Helper to use a raw SVG string directly in img */
|
|
72
85
|
export declare function svgFromContent(svg: string): string;
|
|
73
86
|
/** Proxy/Alias for URLs */
|
package/dist/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/builder.js
CHANGED
|
@@ -233,11 +233,62 @@ export const badge = (text, color = "blue") => {
|
|
|
233
233
|
/**
|
|
234
234
|
* External Asset Helpers
|
|
235
235
|
*/
|
|
236
|
+
const BLOCKED_HOSTS = ["0.0.0.0", "169.254.169.254", "::1"];
|
|
237
|
+
const ALLOWED_PROTOCOLS = ["https:", "http:", "data:"];
|
|
238
|
+
/**
|
|
239
|
+
* Validate a URL to prevent SSRF attacks.
|
|
240
|
+
* >- In production, blocks localhost, private IPs, and metadata endpoints.
|
|
241
|
+
* >- In development, allows localhost for local testing.
|
|
242
|
+
*
|
|
243
|
+
* @param url - URL to validate
|
|
244
|
+
* @returns true if URL is safe to use
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```ts
|
|
248
|
+
* validateImageUrl("https://example.com/image.png") // --> true
|
|
249
|
+
* validateImageUrl("http://localhost/image.png") // --> true in dev, false in prod
|
|
250
|
+
* validateImageUrl("http://169.254.169.254/metadata") // --> false
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
export function validateImageUrl(url) {
|
|
254
|
+
if (url.startsWith("data:"))
|
|
255
|
+
return true;
|
|
256
|
+
try {
|
|
257
|
+
const parsed = new URL(url);
|
|
258
|
+
if (!ALLOWED_PROTOCOLS.includes(parsed.protocol))
|
|
259
|
+
return false;
|
|
260
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
261
|
+
if (isProd) {
|
|
262
|
+
// Block metadata endpoints
|
|
263
|
+
if (BLOCKED_HOSTS.includes(parsed.hostname))
|
|
264
|
+
return false;
|
|
265
|
+
// Block localhost and loopback --> localhost, 127.0.0.1
|
|
266
|
+
if (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1")
|
|
267
|
+
return false;
|
|
268
|
+
// Block .local domains --> .local
|
|
269
|
+
if (parsed.hostname.endsWith(".local"))
|
|
270
|
+
return false;
|
|
271
|
+
// Block private IPv4 ranges --> 10.x, 172.16-31.x, 192.168.x
|
|
272
|
+
if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(parsed.hostname))
|
|
273
|
+
return false;
|
|
274
|
+
// Block private IPv6 ranges --> fc00::/7, fe80::/10
|
|
275
|
+
if (/^(fc|fd|fe[89ab])[0-9a-f]{1,2}:/i.test(parsed.hostname))
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
236
284
|
/** Helper to use a raw SVG string directly in img */
|
|
237
285
|
export function svgFromContent(svg) {
|
|
238
286
|
return `data:image/svg+xml;base64,${Buffer.from(svg).toString("base64")}`;
|
|
239
287
|
}
|
|
240
288
|
/** Proxy/Alias for URLs */
|
|
241
289
|
export function imgFromUrl(url) {
|
|
290
|
+
if (!validateImageUrl(url)) {
|
|
291
|
+
throw new Error(`OGX: Invalid or unsafe URL "${url}". URLs must use http/https protocols and cannot point to private networks in production.`);
|
|
292
|
+
}
|
|
242
293
|
return url;
|
|
243
294
|
}
|
package/dist/cache.d.ts
CHANGED
|
@@ -12,7 +12,18 @@ export declare class SnapshotCache {
|
|
|
12
12
|
*/
|
|
13
13
|
setTTL(milliseconds: number): void;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Serialize config to string for hashing
|
|
16
|
+
*/
|
|
17
|
+
private serializeConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Calculate a secure hash for a configuration object using SHA-256
|
|
20
|
+
* Uses Web Crypto API -> available in Node 18+ and browsers
|
|
21
|
+
*/
|
|
22
|
+
getHashAsync(config: any): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Calculate a hash for a configuration object (sync fallback)
|
|
25
|
+
* Uses djb2 algorithm - fast but has higher collision probability
|
|
26
|
+
* @deprecated Use getHashAsync for better collision resistance
|
|
16
27
|
*/
|
|
17
28
|
getHash(config: any): string;
|
|
18
29
|
/**
|
|
@@ -27,6 +38,10 @@ export declare class SnapshotCache {
|
|
|
27
38
|
* Clear the cache
|
|
28
39
|
*/
|
|
29
40
|
clear(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get cache size (for monitoring)
|
|
43
|
+
*/
|
|
44
|
+
get size(): number;
|
|
30
45
|
}
|
|
31
46
|
export declare const snapshotCache: SnapshotCache;
|
|
32
47
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,KAAK,CAAuD;IACpE,OAAO,CAAC,GAAG,CAAa;IAExB,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC;;OAEG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBhD;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAY5B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAY7B;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAOlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACD;AAED,eAAO,MAAM,aAAa,eAA8B,CAAC"}
|
package/dist/cache.js
CHANGED
|
@@ -19,25 +19,50 @@ export class SnapshotCache {
|
|
|
19
19
|
this.ttl = milliseconds;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
22
|
+
* Serialize config to string for hashing
|
|
23
23
|
*/
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const str = JSON.stringify(config, (key, value) => {
|
|
24
|
+
serializeConfig(config) {
|
|
25
|
+
return JSON.stringify(config, (key, value) => {
|
|
27
26
|
if (typeof value === "function")
|
|
28
27
|
return undefined;
|
|
29
28
|
if (key === "debug")
|
|
30
29
|
return undefined;
|
|
31
30
|
return value;
|
|
32
31
|
});
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculate a secure hash for a configuration object using SHA-256
|
|
35
|
+
* Uses Web Crypto API -> available in Node 18+ and browsers
|
|
36
|
+
*/
|
|
37
|
+
async getHashAsync(config) {
|
|
38
|
+
const str = this.serializeConfig(config);
|
|
39
|
+
try {
|
|
40
|
+
// Use Web Crypto API for SHA-256
|
|
41
|
+
const encoder = new TextEncoder();
|
|
42
|
+
const data = encoder.encode(str);
|
|
43
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
44
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
45
|
+
return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Fallback to djb2 if crypto is not available
|
|
49
|
+
return this.getHash(config);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Calculate a hash for a configuration object (sync fallback)
|
|
54
|
+
* Uses djb2 algorithm - fast but has higher collision probability
|
|
55
|
+
* @deprecated Use getHashAsync for better collision resistance
|
|
56
|
+
*/
|
|
57
|
+
getHash(config) {
|
|
58
|
+
const str = this.serializeConfig(config);
|
|
59
|
+
// djb2 hash (32-bit) - fallback for sync usage
|
|
60
|
+
let hash = 5381;
|
|
35
61
|
for (let i = 0; i < str.length; i++) {
|
|
36
62
|
const char = str.charCodeAt(i);
|
|
37
|
-
hash = (hash << 5)
|
|
38
|
-
hash |= 0; // Convert to 32bit integer
|
|
63
|
+
hash = ((hash << 5) + hash) ^ char;
|
|
39
64
|
}
|
|
40
|
-
return `
|
|
65
|
+
return `djb2-${(hash >>> 0).toString(16)}`;
|
|
41
66
|
}
|
|
42
67
|
/**
|
|
43
68
|
* Get an item from cache
|
|
@@ -67,5 +92,11 @@ export class SnapshotCache {
|
|
|
67
92
|
clear() {
|
|
68
93
|
this.cache.clear();
|
|
69
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Get cache size (for monitoring)
|
|
97
|
+
*/
|
|
98
|
+
get size() {
|
|
99
|
+
return this.cache.size;
|
|
100
|
+
}
|
|
70
101
|
}
|
|
71
102
|
export const snapshotCache = SnapshotCache.getInstance();
|
package/dist/css.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font-registry.d.ts","sourceRoot":"","sources":["../src/font-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;GAEG;AACH,qBAAa,YAAY;
|
|
1
|
+
{"version":3,"file":"font-registry.d.ts","sourceRoot":"","sources":["../src/font-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;GAEG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,KAAK,CAAoB;IAEjC,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI;IAgB/C;;;OAGG;IACG,aAAa,CAClB,OAAO,GAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAe,GACnD,OAAO,CAAC,IAAI,CAAC;IAMhB;;;OAGG;IACG,oBAAoB,CACzB,OAAO,GAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAe,GACnD,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;IACH,QAAQ,IAAI,UAAU,EAAE;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGb;AAED,eAAO,MAAM,YAAY,cAA6B,CAAC"}
|
package/dist/fonts.d.ts
CHANGED
|
@@ -4,9 +4,11 @@ import type { FontConfig } from "./types";
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function loadFont(path: string): Promise<ArrayBuffer>;
|
|
6
6
|
/**
|
|
7
|
-
* Load a font from a URL
|
|
7
|
+
* Load a font from a URL with timeout protection
|
|
8
|
+
* @param url - Font URL to load
|
|
9
|
+
* @param timeoutMs - Timeout in milliseconds (default: 10000)
|
|
8
10
|
*/
|
|
9
|
-
export declare function loadFontFromUrl(url: string): Promise<ArrayBuffer>;
|
|
11
|
+
export declare function loadFontFromUrl(url: string, timeoutMs?: number): Promise<ArrayBuffer>;
|
|
10
12
|
/**
|
|
11
13
|
* Create a FontConfig from an ArrayBuffer
|
|
12
14
|
*/
|
package/dist/fonts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAajE;AAED
|
|
1
|
+
{"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAajE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,SAAQ,GACf,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAAO,GAC1E,UAAU,CAOZ;AAWD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,MAAM,GAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAS,GACvC,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,MAAM,GAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAS,GACvC,OAAO,CAAC,UAAU,CAAC,CAkCrB"}
|
package/dist/fonts.js
CHANGED
|
@@ -13,19 +13,39 @@ export async function loadFont(path) {
|
|
|
13
13
|
return data;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* Load a font from a URL
|
|
16
|
+
* Load a font from a URL with timeout protection
|
|
17
|
+
* @param url - Font URL to load
|
|
18
|
+
* @param timeoutMs - Timeout in milliseconds (default: 10000)
|
|
17
19
|
*/
|
|
18
|
-
export async function loadFontFromUrl(url) {
|
|
20
|
+
export async function loadFontFromUrl(url, timeoutMs = 10000) {
|
|
19
21
|
if (fontCache.has(url)) {
|
|
20
22
|
return fontCache.get(url);
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
// Validate URL to prevent SSRF
|
|
25
|
+
const { validateImageUrl } = await import("./builder");
|
|
26
|
+
if (!validateImageUrl(url)) {
|
|
27
|
+
throw new Error(`OGX: Invalid or unsafe font URL "${url}". URLs must use http/https protocols and cannot point to private networks in production.`);
|
|
28
|
+
}
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`Failed to load font from ${url}: ${response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const data = await response.arrayBuffer();
|
|
37
|
+
fontCache.set(url, data);
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error.name === "AbortError") {
|
|
42
|
+
throw new Error(`OGX: Font loading timed out after ${timeoutMs}ms for URL: ${url}`);
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
clearTimeout(timeoutId);
|
|
25
48
|
}
|
|
26
|
-
const data = await response.arrayBuffer();
|
|
27
|
-
fontCache.set(url, data);
|
|
28
|
-
return data;
|
|
29
49
|
}
|
|
30
50
|
/**
|
|
31
51
|
* Create a FontConfig from an ArrayBuffer
|
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export { absolute, badge, card, div, fluent, footer, grid, h, h1, h2, header, img, imgFromUrl, main, p, row, spacer, span, stack, svgFromContent, } from "./builder";
|
|
1
|
+
export { absolute, badge, card, div, fluent, footer, grid, h, h1, h2, header, img, imgFromUrl, main, p, row, spacer, span, stack, svgFromContent, validateImageUrl, } from "./builder";
|
|
2
|
+
export { snapshotCache } from "./cache";
|
|
3
|
+
export type { CSSProperties } from "./css";
|
|
2
4
|
export { fontRegistry } from "./font-registry";
|
|
3
5
|
export { createFont, loadFont, loadFontFromUrl, loadInterFont, loadInterFromUrl, } from "./fonts";
|
|
4
6
|
export { ogx, ogxToSVG } from "./ogx";
|
|
7
|
+
export type { BlogPresetProps, DocsPresetProps, MinimalPresetProps, SocialPresetProps, } from "./presets";
|
|
8
|
+
export { blogPreset, docsPreset, minimalPreset, presets, socialPreset, } from "./presets";
|
|
5
9
|
export { render } from "./render-png";
|
|
6
10
|
export { renderToSVG } from "./render-svg";
|
|
7
11
|
export { parseTailwind } from "./tailwind";
|
|
8
|
-
export { blogPreset, docsPreset, minimalPreset, presets, socialPreset, } from "./presets";
|
|
9
|
-
export type { BlogPresetProps, DocsPresetProps, MinimalPresetProps, SocialPresetProps, } from "./presets";
|
|
10
|
-
export { getPlatformDimensions } from "./targets";
|
|
11
12
|
export type { Platform } from "./targets";
|
|
12
|
-
export {
|
|
13
|
+
export { getPlatformDimensions } from "./targets";
|
|
14
|
+
export type { FontConfig, OGXBaseConfig, OGXChildren, OGXConfig, OGXElement, OGXElementProps, Preset, PresetName, PresetProps, RenderOptions, } from "./types";
|
|
13
15
|
export { loadAsset, toDataUri } from "./utils/assets";
|
|
14
|
-
export { calculateFittingFontSize } from "./utils/text";
|
|
15
16
|
export type { FitTextOptions } from "./utils/text";
|
|
16
|
-
export
|
|
17
|
-
export type { FontConfig, OGXBaseConfig, OGXChildren, OGXConfig, OGXElement, OGXElementProps, Preset, PresetName, PresetProps, RenderOptions, } from "./types";
|
|
17
|
+
export { calculateFittingFontSize } from "./utils/text";
|
|
18
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,EACN,IAAI,EACJ,CAAC,EACD,EAAE,EACF,EAAE,EACF,MAAM,EACN,GAAG,EACH,UAAU,EACV,IAAI,EACJ,CAAC,EACD,GAAG,EACH,MAAM,EACN,IAAI,EACJ,KAAK,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,GAAG,EACH,MAAM,EACN,MAAM,EACN,IAAI,EACJ,CAAC,EACD,EAAE,EACF,EAAE,EACF,MAAM,EACN,GAAG,EACH,UAAU,EACV,IAAI,EACJ,CAAC,EACD,GAAG,EACH,MAAM,EACN,IAAI,EACJ,KAAK,EACL,cAAc,EACd,gBAAgB,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACN,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,GAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,YAAY,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACN,UAAU,EACV,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,YAAY,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,eAAe,EACf,MAAM,EACN,UAAU,EACV,WAAW,EACX,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// @ogxjs/core - Main exports
|
|
2
2
|
// Builder - Element construction
|
|
3
|
-
export { absolute, badge, card, div, fluent, footer, grid, h, h1, h2, header, img, imgFromUrl, main, p, row, spacer, span, stack, svgFromContent, } from "./builder";
|
|
3
|
+
export { absolute, badge, card, div, fluent, footer, grid, h, h1, h2, header, img, imgFromUrl, main, p, row, spacer, span, stack, svgFromContent, validateImageUrl, } from "./builder";
|
|
4
|
+
// Utilities
|
|
5
|
+
export { snapshotCache } from "./cache";
|
|
4
6
|
// Fonts - Loading and registration
|
|
5
7
|
export { fontRegistry } from "./font-registry";
|
|
6
8
|
export { createFont, loadFont, loadFontFromUrl, loadInterFont, loadInterFromUrl, } from "./fonts";
|
|
7
9
|
// Rendering - SVG and PNG generation
|
|
8
10
|
export { ogx, ogxToSVG } from "./ogx";
|
|
11
|
+
// Presets - Ready-to-use templates
|
|
12
|
+
export { blogPreset, docsPreset, minimalPreset, presets, socialPreset, } from "./presets";
|
|
9
13
|
export { render } from "./render-png";
|
|
10
14
|
export { renderToSVG } from "./render-svg";
|
|
11
15
|
export { parseTailwind } from "./tailwind";
|
|
12
|
-
// Presets - Ready-to-use templates
|
|
13
|
-
export { blogPreset, docsPreset, minimalPreset, presets, socialPreset, } from "./presets";
|
|
14
16
|
// Platform - Target dimensions
|
|
15
17
|
export { getPlatformDimensions } from "./targets";
|
|
16
|
-
// Utilities
|
|
17
|
-
export { snapshotCache } from "./cache";
|
|
18
18
|
export { loadAsset, toDataUri } from "./utils/assets";
|
|
19
19
|
export { calculateFittingFontSize } from "./utils/text";
|
package/dist/ogx.js
CHANGED
|
@@ -14,8 +14,8 @@ export async function ogx(config) {
|
|
|
14
14
|
return acc;
|
|
15
15
|
}, {});
|
|
16
16
|
}
|
|
17
|
-
// Check cache
|
|
18
|
-
const hash = cache ? snapshotCache.
|
|
17
|
+
// Check cache -> using SHA-256 for better collision resistance
|
|
18
|
+
const hash = cache ? await snapshotCache.getHashAsync(config) : null;
|
|
19
19
|
if (hash) {
|
|
20
20
|
const cached = snapshotCache.get(hash);
|
|
21
21
|
if (cached)
|
|
@@ -61,9 +61,9 @@ export async function ogxToSVG(config) {
|
|
|
61
61
|
return acc;
|
|
62
62
|
}, {});
|
|
63
63
|
}
|
|
64
|
-
// Check cache
|
|
64
|
+
// Check cache -> using SHA-256 for better collision resistance
|
|
65
65
|
const hash = cache
|
|
66
|
-
? snapshotCache.
|
|
66
|
+
? await snapshotCache.getHashAsync({ ...config, format: "svg" })
|
|
67
67
|
: null;
|
|
68
68
|
if (hash) {
|
|
69
69
|
const cached = snapshotCache.get(hash);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blog.d.ts","sourceRoot":"","sources":["../../src/presets/blog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAe;
|
|
1
|
+
{"version":3,"file":"blog.d.ts","sourceRoot":"","sources":["../../src/presets/blog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC/B,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,4BAA4B;IAC5B,KAAK,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,CAqI9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/presets/docs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAe;
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/presets/docs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC/B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,4BAA4B;IAC5B,KAAK,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,CAuH9C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEhE,eAAO,MAAM,OAAO;;;;;CAKV,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC;AAE9C,MAAM,WAAW,WAAW;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,KAAK,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEhE,eAAO,MAAM,OAAO;;;;;CAKV,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;CAC1B;AAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAC/D,YAAY,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/presets/minimal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/presets/minimal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAClC,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,KAAK,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,UAAU,CAAC;KACrB,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,kBAAkB,CAqEpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/presets/social.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,iBAAiB;
|
|
1
|
+
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/presets/social.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IACjC,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC;CACF;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAkGlD,CAAC"}
|
package/dist/render-png.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-png.d.ts","sourceRoot":"","sources":["../src/render-png.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-png.d.ts","sourceRoot":"","sources":["../src/render-png.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,MAAM,CAC3B,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CAiBrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tailwind/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tailwind/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,GACP,MAAM,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/tailwind/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAY5C,MAAM,WAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/tailwind/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAY5C,MAAM,WAAW,aAAa;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAC5B,aAAa,CAwCf;AAyhCD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/tailwind/parser.js
CHANGED
|
@@ -991,7 +991,25 @@ function parseArbitrary(prefix, value, style, gradient) {
|
|
|
991
991
|
break;
|
|
992
992
|
}
|
|
993
993
|
}
|
|
994
|
+
/** Maximum length for arbitrary values to prevent DoS --> 100 chars */
|
|
995
|
+
const MAX_ARBITRARY_VALUE_LENGTH = 100;
|
|
996
|
+
/** Patterns that could indicate malicious input */
|
|
997
|
+
const DANGEROUS_PATTERNS = /javascript:|data:text\/html|<script|<\/script|expression\s*\(/i;
|
|
994
998
|
function parseArbitraryValue(value) {
|
|
999
|
+
// Security: Limit value length to prevent DoS --> 100 chars
|
|
1000
|
+
if (value.length > MAX_ARBITRARY_VALUE_LENGTH) {
|
|
1001
|
+
if (process.env.NODE_ENV !== "production") {
|
|
1002
|
+
console.warn(`OGX: Arbitrary value exceeds ${MAX_ARBITRARY_VALUE_LENGTH} chars, truncating: "${value.slice(0, 20)}..."`);
|
|
1003
|
+
}
|
|
1004
|
+
value = value.slice(0, MAX_ARBITRARY_VALUE_LENGTH);
|
|
1005
|
+
}
|
|
1006
|
+
// Security: Block potentially dangerous patterns
|
|
1007
|
+
if (DANGEROUS_PATTERNS.test(value)) {
|
|
1008
|
+
if (process.env.NODE_ENV !== "production") {
|
|
1009
|
+
console.warn(`OGX: Potentially dangerous arbitrary value blocked: "${value}"`);
|
|
1010
|
+
}
|
|
1011
|
+
return 0;
|
|
1012
|
+
}
|
|
995
1013
|
// If it's a CSS value with units, return as string
|
|
996
1014
|
if (/^\d+(\.\d+)?(px|rem|em|%|vw|vh)$/.test(value)) {
|
|
997
1015
|
return value;
|
package/dist/targets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB;
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC7B,sDAAsD;;;;;IAEtD,2BAA2B;;;;;IAE3B,qCAAqC;;;;;IAErC,oEAAoE;;;;;IAEpE,mCAAmC;;;;;IAEnC,gCAAgC;;;;;IAEhC,wBAAwB;;;;;CAEf,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;EAEvD"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;GAEG;AACH,MAAM,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,cAAc;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,CA2DjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ogxjs/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "High-performance Open Graph image generator with Tailwind CSS support",
|
|
5
5
|
"author": "Carlos Eduardo",
|
|
6
6
|
"repository": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"url": "https://github.com/carlosedujs/ogx.git",
|
|
9
9
|
"directory": "packages/core"
|
|
10
10
|
},
|
|
11
|
-
"homepage": "https://ogx.
|
|
11
|
+
"homepage": "https://ogx-three.vercel.app",
|
|
12
12
|
"bugs": "https://github.com/carlosedujs/ogx/issues",
|
|
13
13
|
"type": "module",
|
|
14
14
|
"main": "./dist/index.js",
|
package/dist/render.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { OGXElement, RenderOptions } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Render an OGX element to PNG image
|
|
4
|
-
*/
|
|
5
|
-
export declare function render(element: OGXElement, options?: RenderOptions): Promise<Uint8Array>;
|
|
6
|
-
/**
|
|
7
|
-
* Render an OGX element to SVG string
|
|
8
|
-
*/
|
|
9
|
-
export declare function renderToSVG(element: OGXElement, options?: RenderOptions): Promise<string>;
|
|
10
|
-
//# sourceMappingURL=render.d.ts.map
|
package/dist/render.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEX,UAAU,EACV,aAAa,EAEb,MAAM,SAAS,CAAC;AAKjB;;GAEG;AACH,wBAAsB,MAAM,CAC3B,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CA6DrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAChC,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
package/dist/render.js
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import satori from "satori";
|
|
2
|
-
import { fontRegistry } from "./font-registry";
|
|
3
|
-
import { parseTailwind } from "./tailwind";
|
|
4
|
-
import { getPlatformDimensions } from "./targets";
|
|
5
|
-
const DEFAULT_WIDTH = 1200;
|
|
6
|
-
const DEFAULT_HEIGHT = 630;
|
|
7
|
-
/**
|
|
8
|
-
* Render an OGX element to PNG image
|
|
9
|
-
*/
|
|
10
|
-
export async function render(element, options = {}) {
|
|
11
|
-
// Resolve platform dimensions
|
|
12
|
-
const platformDims = options.platform
|
|
13
|
-
? getPlatformDimensions(options.platform)
|
|
14
|
-
: null;
|
|
15
|
-
const { width = platformDims?.width ?? DEFAULT_WIDTH, height = platformDims?.height ?? DEFAULT_HEIGHT, debug = false, } = options;
|
|
16
|
-
// Resolve fonts
|
|
17
|
-
let resolvedFonts = options.fonts ?? [];
|
|
18
|
-
if (resolvedFonts.length === 0) {
|
|
19
|
-
resolvedFonts = fontRegistry.getFonts();
|
|
20
|
-
}
|
|
21
|
-
if (resolvedFonts.length === 0) {
|
|
22
|
-
const { loadInterFromUrl } = await import("./fonts");
|
|
23
|
-
resolvedFonts = [
|
|
24
|
-
await loadInterFromUrl(300),
|
|
25
|
-
await loadInterFromUrl(400),
|
|
26
|
-
await loadInterFromUrl(500),
|
|
27
|
-
await loadInterFromUrl(600),
|
|
28
|
-
await loadInterFromUrl(700),
|
|
29
|
-
];
|
|
30
|
-
}
|
|
31
|
-
const fullOptions = {
|
|
32
|
-
width,
|
|
33
|
-
height,
|
|
34
|
-
fonts: resolvedFonts,
|
|
35
|
-
debug,
|
|
36
|
-
theme: options.theme,
|
|
37
|
-
colorScheme: options.colorScheme,
|
|
38
|
-
};
|
|
39
|
-
// Transform the element tree to process tw props
|
|
40
|
-
const transformedElement = transformElement(element, debug, fullOptions);
|
|
41
|
-
// Generate SVG with Satori
|
|
42
|
-
const svg = await satori(transformedElement, {
|
|
43
|
-
width,
|
|
44
|
-
height,
|
|
45
|
-
fonts: resolvedFonts.map(fontToSatoriFont),
|
|
46
|
-
debug,
|
|
47
|
-
});
|
|
48
|
-
// Dynamic import resvg to avoid bundler resolution issues with native binaries
|
|
49
|
-
const resvgPkg = "@resvg/resvg-js";
|
|
50
|
-
const { Resvg } = await import(resvgPkg);
|
|
51
|
-
// Convert SVG to PNG with resvg
|
|
52
|
-
const resvg = new Resvg(svg, {
|
|
53
|
-
fitTo: {
|
|
54
|
-
mode: "width",
|
|
55
|
-
value: width,
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
const pngData = resvg.render();
|
|
59
|
-
return pngData.asPng();
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Render an OGX element to SVG string
|
|
63
|
-
*/
|
|
64
|
-
export async function renderToSVG(element, options = {}) {
|
|
65
|
-
// Resolve platform dimensions
|
|
66
|
-
const platformDims = options.platform
|
|
67
|
-
? getPlatformDimensions(options.platform)
|
|
68
|
-
: null;
|
|
69
|
-
const { width = platformDims?.width ?? DEFAULT_WIDTH, height = platformDims?.height ?? DEFAULT_HEIGHT, debug = false, } = options;
|
|
70
|
-
// Resolve fonts
|
|
71
|
-
let resolvedFonts = options.fonts ?? [];
|
|
72
|
-
if (resolvedFonts.length === 0) {
|
|
73
|
-
resolvedFonts = fontRegistry.getFonts();
|
|
74
|
-
}
|
|
75
|
-
if (resolvedFonts.length === 0) {
|
|
76
|
-
const { loadInterFromUrl } = await import("./fonts");
|
|
77
|
-
resolvedFonts = [
|
|
78
|
-
await loadInterFromUrl(300),
|
|
79
|
-
await loadInterFromUrl(400),
|
|
80
|
-
await loadInterFromUrl(500),
|
|
81
|
-
await loadInterFromUrl(600),
|
|
82
|
-
await loadInterFromUrl(700),
|
|
83
|
-
];
|
|
84
|
-
}
|
|
85
|
-
const fullOptions = {
|
|
86
|
-
width,
|
|
87
|
-
height,
|
|
88
|
-
fonts: resolvedFonts,
|
|
89
|
-
debug,
|
|
90
|
-
theme: options.theme,
|
|
91
|
-
colorScheme: options.colorScheme,
|
|
92
|
-
};
|
|
93
|
-
const transformedElement = transformElement(element, debug, fullOptions);
|
|
94
|
-
return await satori(transformedElement, {
|
|
95
|
-
width,
|
|
96
|
-
height,
|
|
97
|
-
fonts: resolvedFonts.map(fontToSatoriFont),
|
|
98
|
-
debug,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Transform OGX element tree to Satori-compatible format
|
|
103
|
-
* Processes `tw` props into inline styles
|
|
104
|
-
*/
|
|
105
|
-
function transformElement(element, debug, options) {
|
|
106
|
-
// Handle primitives
|
|
107
|
-
if (element === null || element === undefined) {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
if (typeof element === "string" || typeof element === "number") {
|
|
111
|
-
return element;
|
|
112
|
-
}
|
|
113
|
-
const { tw, style, children, ...restProps } = element.props;
|
|
114
|
-
// Parse Tailwind classes and merge with inline styles
|
|
115
|
-
let mergedStyle;
|
|
116
|
-
if (tw) {
|
|
117
|
-
const twStyles = parseTailwind(tw, options.theme, options.colorScheme);
|
|
118
|
-
mergedStyle = style ? { ...twStyles, ...style } : twStyles;
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
mergedStyle = style ? { ...style } : {};
|
|
122
|
-
}
|
|
123
|
-
// Default resets for Satori (only if not already set by Tailwind)
|
|
124
|
-
if (mergedStyle.margin === undefined)
|
|
125
|
-
mergedStyle.margin = 0;
|
|
126
|
-
if (mergedStyle.padding === undefined &&
|
|
127
|
-
mergedStyle.paddingTop === undefined &&
|
|
128
|
-
mergedStyle.paddingBottom === undefined &&
|
|
129
|
-
mergedStyle.paddingLeft === undefined &&
|
|
130
|
-
mergedStyle.paddingRight === undefined) {
|
|
131
|
-
mergedStyle.padding = 0;
|
|
132
|
-
}
|
|
133
|
-
// Apply default fontFamily if not specified
|
|
134
|
-
if (!mergedStyle.fontFamily) {
|
|
135
|
-
mergedStyle.fontFamily = "Inter";
|
|
136
|
-
}
|
|
137
|
-
// h1/p tags have default margins in many browsers, reset them
|
|
138
|
-
if (element.type === "h1" || element.type === "p") {
|
|
139
|
-
mergedStyle.margin = 0;
|
|
140
|
-
}
|
|
141
|
-
// Add debug border if enabled
|
|
142
|
-
if (debug) {
|
|
143
|
-
mergedStyle.border = "1px solid rgba(255, 0, 0, 0.3)";
|
|
144
|
-
}
|
|
145
|
-
// Transform children recursively
|
|
146
|
-
let transformedChildren = null;
|
|
147
|
-
if (children !== null && children !== undefined) {
|
|
148
|
-
if (Array.isArray(children)) {
|
|
149
|
-
const filtered = children.filter((c) => c !== null && c !== undefined);
|
|
150
|
-
if (filtered.length === 1) {
|
|
151
|
-
transformedChildren = transformElement(filtered[0], debug, options);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
transformedChildren = filtered.map((c) => transformElement(c, debug, options));
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
transformedChildren = transformElement(children, debug, options);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
type: element.type,
|
|
163
|
-
props: {
|
|
164
|
-
...restProps,
|
|
165
|
-
style: mergedStyle,
|
|
166
|
-
children: transformedChildren,
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Convert OGX FontConfig to Satori font format
|
|
172
|
-
*/
|
|
173
|
-
function fontToSatoriFont(font) {
|
|
174
|
-
return {
|
|
175
|
-
name: font.name,
|
|
176
|
-
data: font.data,
|
|
177
|
-
weight: font.weight ?? 400,
|
|
178
|
-
style: font.style ?? "normal",
|
|
179
|
-
};
|
|
180
|
-
}
|