@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 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
- * External Asset Helpers
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 */
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
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
- * Calculate a hash for a configuration object
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
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAa;IACxB,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,MAAM,EAAE,GAAG,GAAG,MAAM;IAkB5B;;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;CAGd;AAED,eAAO,MAAM,aAAa,eAA8B,CAAC"}
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
- * Calculate a hash for a configuration object
22
+ * Serialize config to string for hashing
23
23
  */
24
- getHash(config) {
25
- // Stringify config
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
- // Basic hash for browser/fallback
34
- let hash = 0;
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) - hash + char;
38
- hash |= 0; // Convert to 32bit integer
63
+ hash = ((hash << 5) + hash) ^ char;
39
64
  }
40
- return `hash-${hash}`;
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":"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"}
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;IACvB,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,CACjB,OAAO,GAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAe,GACpD,OAAO,CAAC,IAAI,CAAC;IAMhB;;;OAGG;IACG,oBAAoB,CACxB,OAAO,GAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAe,GACpD,OAAO,CAAC,IAAI,CAAC;IAMhB;;OAEG;IACH,QAAQ,IAAI,UAAU,EAAE;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,YAAY,cAA6B,CAAC"}
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
  */
@@ -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;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAYvE;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"}
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
- const response = await fetch(url);
23
- if (!response.ok) {
24
- throw new Error(`Failed to load font from ${url}: ${response.statusText}`);
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 { snapshotCache } from "./cache";
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 type { CSSProperties } from "./css";
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
@@ -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,GACd,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACN,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,gBAAgB,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EACN,UAAU,EACV,UAAU,EACV,aAAa,EACb,OAAO,EACP,YAAY,GACZ,MAAM,WAAW,CAAC;AACnB,YAAY,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,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"}
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.getHash(config) : null;
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.getHash({ ...config, format: "svg" })
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;IAC9B,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;QACN,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,CAqI9C,CAAC"}
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;IAC9B,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;QACN,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,eAAe,CAuH9C,CAAC"}
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;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAC/D,YAAY,EACV,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,CAAC"}
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;IACjC,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;QACN,OAAO,CAAC,EAAE,UAAU,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,kBAAkB,CAqEpD,CAAC"}
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;IAChC,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;QACN,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAkGlD,CAAC"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-png.d.ts","sourceRoot":"","sources":["../src/render-png.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGzD;;;GAGG;AACH,wBAAsB,MAAM,CAC3B,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,aAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CAiBrB"}
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,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,aAAa,EACb,OAAO,GACR,MAAM,UAAU,CAAC"}
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;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAC7B,aAAa,CAwCf;AA8/BD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
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"}
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B,sDAAsD;;;;;IAEtD,2BAA2B;;;;;IAE3B,qCAAqC;;;;;IAErC,oEAAoE;;;;;IAEpE,mCAAmC;;;;;IAEnC,gCAAgC;;;;;IAEhC,wBAAwB;;;;;CAEhB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;EAEvD"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -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;IAC7B,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;CACrB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CA2DjB"}
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.0",
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.dev",
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
@@ -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
- }