takumi-js 2.13.4 → 2.13.6

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.
@@ -1,4 +1,4 @@
1
- import { t as LoadBackend } from "../types-BRKMNBAj.cjs";
1
+ import { n as LoadBackend } from "../types-DfaY8MSH.cjs";
2
2
  //#region src/backend/node.d.ts
3
3
  declare const loadBackend: LoadBackend;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as LoadBackend } from "../types-BRKMNBAj.mjs";
1
+ import { n as LoadBackend } from "../types-DfaY8MSH.mjs";
2
2
  //#region src/backend/node.d.ts
3
3
  declare const loadBackend: LoadBackend;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as LoadBackend } from "../types-BRKMNBAj.cjs";
1
+ import { n as LoadBackend } from "../types-DfaY8MSH.cjs";
2
2
  //#region src/backend/wasm.d.ts
3
3
  declare const loadBackend: LoadBackend;
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as LoadBackend } from "../types-BRKMNBAj.mjs";
1
+ import { n as LoadBackend } from "../types-DfaY8MSH.mjs";
2
2
  //#region src/backend/wasm.d.ts
3
3
  declare const loadBackend: LoadBackend;
4
4
  //#endregion
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_render = require("./render-C7kRwHMk.cjs");
2
+ const require_render = require("./render-B2cdtVWB.cjs");
3
3
  exports.render = require_render.render;
4
4
  exports.renderAnimation = require_render.renderAnimation;
5
5
  exports.renderSvg = require_render.renderSvg;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as RenderOptions, c as renderAnimation, i as RenderInput, l as renderSvg, n as ImagesInput, o as RenderSvgOptions, r as RenderAnimationOptions, s as render, t as AnimationScene } from "./render-DDQRhVd1.cjs";
1
+ import { a as RenderOptions, c as renderAnimation, i as RenderInput, l as renderSvg, n as ImagesInput, o as RenderSvgOptions, r as RenderAnimationOptions, s as render, t as AnimationScene } from "./render-BIjyc8uU.cjs";
2
2
  import { AnimationOutputFormat, DitheringAlgorithm, Font, FontDetails, FontLoader, ImageSource, Keyframes, KeyframesMap, KeyframesRuleList, MeasuredNode, MeasuredTextRun, OutputFormat } from "@takumi-rs/core";
3
3
  import { AnimationRule, ContainerNode, CssInput, Declarations, FetchOptions, ImageNode, LayerRule, MediaRule, Node, NodeAttributes, NodeMetadata, ReactElementLike, RgbaImage, StyleRule, SupportsRule, TextNode } from "@takumi-rs/helpers";
4
4
  //#region src/glyph-cache.d.ts
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as RenderOptions, c as renderAnimation, i as RenderInput, l as renderSvg, n as ImagesInput, o as RenderSvgOptions, r as RenderAnimationOptions, s as render, t as AnimationScene } from "./render-9RT7wd29.mjs";
1
+ import { a as RenderOptions, c as renderAnimation, i as RenderInput, l as renderSvg, n as ImagesInput, o as RenderSvgOptions, r as RenderAnimationOptions, s as render, t as AnimationScene } from "./render-C-wS8FET.mjs";
2
2
  import { AnimationRule, ContainerNode, CssInput, Declarations, FetchOptions, ImageNode, LayerRule, MediaRule, Node, NodeAttributes, NodeMetadata, ReactElementLike, RgbaImage, StyleRule, SupportsRule, TextNode } from "@takumi-rs/helpers";
3
3
  import { AnimationOutputFormat, DitheringAlgorithm, Font, FontDetails, FontLoader, ImageSource, Keyframes, KeyframesMap, KeyframesRuleList, MeasuredNode, MeasuredTextRun, OutputFormat } from "@takumi-rs/core";
4
4
  //#region src/glyph-cache.d.ts
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { i as setGlyphCacheMaxBytes, n as renderAnimation, r as renderSvg, t as render } from "./render-BPTOJWUk.mjs";
1
+ import { i as setGlyphCacheMaxBytes, n as renderAnimation, r as renderSvg, t as render } from "./render-B1HYpcq6.mjs";
2
2
  export { render, renderAnimation, renderSvg, setGlyphCacheMaxBytes };
@@ -29,27 +29,30 @@ function applyGlyphCacheMaxBytes(backend) {
29
29
  if (maxBytes !== void 0) backend.setGlyphCacheMaxBytes(maxBytes);
30
30
  }
31
31
  //#endregion
32
- //#region src/import.ts
33
- let importPromise = null;
34
- /**
35
- * Resolves the rendering backend once and caches it. With no `module`, the
36
- * `#backend` import conditions pick it (napi on Node/Bun, WASM elsewhere). An
37
- * explicit `module` is a WASM binary, so it forces WASM — the escape hatch for a
38
- * Node target that can't load the native addon. A failed load clears the cache.
39
- */
40
- function getImports(module) {
41
- importPromise ??= (module === void 0 ? loadBackend() : import("./wasm-init-DzwbPAKW.mjs").then((n) => n.n).then(({ initWasm }) => initWasm(module))).then((backend) => {
42
- applyGlyphCacheMaxBytes(backend);
43
- return backend;
44
- }).catch((error) => {
45
- importPromise = null;
46
- throw error;
47
- });
48
- return importPromise;
49
- }
32
+ //#region src/backend/renderer.ts
33
+ var RendererProvider = class {
34
+ load;
35
+ backend;
36
+ renderer;
37
+ constructor(load) {
38
+ this.load = load;
39
+ }
40
+ async get(module) {
41
+ this.backend ??= this.load(module).catch((error) => {
42
+ this.backend = void 0;
43
+ throw error;
44
+ });
45
+ const backend = await this.backend;
46
+ return this.renderer ??= new backend.Renderer();
47
+ }
48
+ };
49
+ const defaultRenderer = new RendererProvider(async (module) => {
50
+ const backend = await (module === void 0 ? loadBackend() : import("./wasm-init-DzwbPAKW.mjs").then((n) => n.n).then(({ initWasm }) => initWasm(module)));
51
+ applyGlyphCacheMaxBytes(backend);
52
+ return backend;
53
+ });
50
54
  //#endregion
51
55
  //#region src/render.ts
52
- let globalRenderer;
53
56
  function isTakumiNode(element) {
54
57
  if (typeof element !== "object" || element === null || !("type" in element)) return false;
55
58
  return element.type === "container" || element.type === "text" || element.type === "image";
@@ -62,11 +65,10 @@ async function transformElement(element, options) {
62
65
  if (typeof element === "string") return fromHtml(element);
63
66
  return fromJsx(element, options?.jsx);
64
67
  }
65
- /** Resolves the renderer to use: a caller-supplied one, or the shared global. */
68
+ /** Resolves a caller-supplied renderer or the default provider. */
66
69
  async function resolveRenderer(options) {
67
70
  if (options && "renderer" in options && options.renderer) return options.renderer;
68
- const imports = await getImports(options?.module);
69
- return globalRenderer ??= new imports.Renderer();
71
+ return defaultRenderer.get(options?.module);
70
72
  }
71
73
  /** Transforms an input into a node tree and extracts its emojis. */
72
74
  async function resolveContent(element, options) {
@@ -29,27 +29,30 @@ function applyGlyphCacheMaxBytes(backend) {
29
29
  if (maxBytes !== void 0) backend.setGlyphCacheMaxBytes(maxBytes);
30
30
  }
31
31
  //#endregion
32
- //#region src/import.ts
33
- let importPromise = null;
34
- /**
35
- * Resolves the rendering backend once and caches it. With no `module`, the
36
- * `#backend` import conditions pick it (napi on Node/Bun, WASM elsewhere). An
37
- * explicit `module` is a WASM binary, so it forces WASM — the escape hatch for a
38
- * Node target that can't load the native addon. A failed load clears the cache.
39
- */
40
- function getImports(module) {
41
- importPromise ??= (module === void 0 ? (0, _backend.loadBackend)() : Promise.resolve().then(() => require("./wasm-init-Dl-su2Ub.cjs")).then((n) => n.wasm_init_exports).then(({ initWasm }) => initWasm(module))).then((backend) => {
42
- applyGlyphCacheMaxBytes(backend);
43
- return backend;
44
- }).catch((error) => {
45
- importPromise = null;
46
- throw error;
47
- });
48
- return importPromise;
49
- }
32
+ //#region src/backend/renderer.ts
33
+ var RendererProvider = class {
34
+ load;
35
+ backend;
36
+ renderer;
37
+ constructor(load) {
38
+ this.load = load;
39
+ }
40
+ async get(module) {
41
+ this.backend ??= this.load(module).catch((error) => {
42
+ this.backend = void 0;
43
+ throw error;
44
+ });
45
+ const backend = await this.backend;
46
+ return this.renderer ??= new backend.Renderer();
47
+ }
48
+ };
49
+ const defaultRenderer = new RendererProvider(async (module) => {
50
+ const backend = await (module === void 0 ? (0, _backend.loadBackend)() : Promise.resolve().then(() => require("./wasm-init-Dl-su2Ub.cjs")).then((n) => n.wasm_init_exports).then(({ initWasm }) => initWasm(module)));
51
+ applyGlyphCacheMaxBytes(backend);
52
+ return backend;
53
+ });
50
54
  //#endregion
51
55
  //#region src/render.ts
52
- let globalRenderer;
53
56
  function isTakumiNode(element) {
54
57
  if (typeof element !== "object" || element === null || !("type" in element)) return false;
55
58
  return element.type === "container" || element.type === "text" || element.type === "image";
@@ -62,11 +65,10 @@ async function transformElement(element, options) {
62
65
  if (typeof element === "string") return (0, _takumi_rs_helpers_html.fromHtml)(element);
63
66
  return (0, _takumi_rs_helpers_jsx.fromJsx)(element, options?.jsx);
64
67
  }
65
- /** Resolves the renderer to use: a caller-supplied one, or the shared global. */
68
+ /** Resolves a caller-supplied renderer or the default provider. */
66
69
  async function resolveRenderer(options) {
67
70
  if (options && "renderer" in options && options.renderer) return options.renderer;
68
- const imports = await getImports(options?.module);
69
- return globalRenderer ??= new imports.Renderer();
71
+ return defaultRenderer.get(options?.module);
70
72
  }
71
73
  /** Transforms an input into a node tree and extracts its emojis. */
72
74
  async function resolveContent(element, options) {
@@ -1,11 +1,14 @@
1
+ import { t as Backend } from "./types-DfaY8MSH.cjs";
2
+ import * as napi from "@takumi-rs/core";
3
+ import * as wasm from "@takumi-rs/wasm";
1
4
  import { EmojiType } from "@takumi-rs/helpers/emoji";
2
5
  import { CssInput, FetchOptions, ImageFetchCache, Node, ReactElementLike } from "@takumi-rs/helpers";
3
6
  import { FromJsxOptions } from "@takumi-rs/helpers/jsx";
4
- import * as napi from "@takumi-rs/core";
5
- import * as wasm from "@takumi-rs/wasm";
6
7
  import { ReactNode } from "react";
8
+ //#region src/backend/renderer.d.ts
9
+ type Renderer = InstanceType<Backend["Renderer"]>;
10
+ //#endregion
7
11
  //#region src/render.d.ts
8
- type Renderer = napi.Renderer | wasm.Renderer;
9
12
  type ImageLoader = napi.ImageLoader | wasm.ImageLoader;
10
13
  /**
11
14
  * Images for a render: pre-fetched entries, or a group that also controls how remote images
@@ -1,11 +1,14 @@
1
- import * as napi from "@takumi-rs/core";
2
- import * as wasm from "@takumi-rs/wasm";
1
+ import { t as Backend } from "./types-DfaY8MSH.mjs";
3
2
  import { EmojiType } from "@takumi-rs/helpers/emoji";
4
3
  import { CssInput, FetchOptions, ImageFetchCache, Node, ReactElementLike } from "@takumi-rs/helpers";
5
4
  import { FromJsxOptions } from "@takumi-rs/helpers/jsx";
5
+ import * as napi from "@takumi-rs/core";
6
+ import * as wasm from "@takumi-rs/wasm";
6
7
  import { ReactNode } from "react";
8
+ //#region src/backend/renderer.d.ts
9
+ type Renderer = InstanceType<Backend["Renderer"]>;
10
+ //#endregion
7
11
  //#region src/render.d.ts
8
- type Renderer = napi.Renderer | wasm.Renderer;
9
12
  type ImageLoader = napi.ImageLoader | wasm.ImageLoader;
10
13
  /**
11
14
  * Images for a render: pre-fetched entries, or a group that also controls how remote images
package/dist/response.cjs CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_render = require("./render-C7kRwHMk.cjs");
5
+ const require_render = require("./render-B2cdtVWB.cjs");
6
6
  //#region src/response/index.ts
7
7
  const contentTypeMap = {
8
8
  png: "image/png",
@@ -1,4 +1,4 @@
1
- import { a as RenderOptions, i as RenderInput } from "./render-DDQRhVd1.cjs";
1
+ import { a as RenderOptions, i as RenderInput } from "./render-BIjyc8uU.cjs";
2
2
  //#region src/response/index.d.ts
3
3
  type ImageResponseResult = Response & {
4
4
  readonly ready: Promise<void>;
@@ -1,4 +1,4 @@
1
- import { a as RenderOptions, i as RenderInput } from "./render-9RT7wd29.mjs";
1
+ import { a as RenderOptions, i as RenderInput } from "./render-C-wS8FET.mjs";
2
2
  //#region src/response/index.d.ts
3
3
  type ImageResponseResult = Response & {
4
4
  readonly ready: Promise<void>;
package/dist/response.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as render } from "./render-BPTOJWUk.mjs";
1
+ import { t as render } from "./render-B1HYpcq6.mjs";
2
2
  //#region src/response/index.ts
3
3
  const contentTypeMap = {
4
4
  png: "image/png",
@@ -13,4 +13,4 @@ type BackendModule = wasm.InitInput | {
13
13
  }>);
14
14
  type LoadBackend = (module?: BackendModule) => Promise<Backend>;
15
15
  //#endregion
16
- export { LoadBackend as t };
16
+ export { LoadBackend as n, Backend as t };
@@ -13,4 +13,4 @@ type BackendModule = wasm.InitInput | {
13
13
  }>);
14
14
  type LoadBackend = (module?: BackendModule) => Promise<Backend>;
15
15
  //#endregion
16
- export { LoadBackend as t };
16
+ export { LoadBackend as n, Backend as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "takumi-js",
3
- "version": "2.13.4",
3
+ "version": "2.13.6",
4
4
  "description": "Render OG images from JSX, HTML, and CSS. No headless browser.",
5
5
  "keywords": [
6
6
  "animated-webp",
@@ -238,9 +238,9 @@
238
238
  "publish-lint": "attw --pack . && publint --strict ."
239
239
  },
240
240
  "dependencies": {
241
- "@takumi-rs/core": "2.13.4",
242
- "@takumi-rs/helpers": "2.13.4",
243
- "@takumi-rs/wasm": "2.13.4"
241
+ "@takumi-rs/core": "2.13.6",
242
+ "@takumi-rs/helpers": "2.13.6",
243
+ "@takumi-rs/wasm": "2.13.6"
244
244
  },
245
245
  "devDependencies": {
246
246
  "@types/bun": "^1.4.0",
@@ -250,6 +250,6 @@
250
250
  "unrun": "^0.3.1"
251
251
  },
252
252
  "engines": {
253
- "node": ">=18"
253
+ "node": ">=20.19"
254
254
  }
255
255
  }