@oh-just-another/text-wasm 0.57.0
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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/wasm-text-shaper.d.ts +177 -0
- package/dist/wasm-text-shaper.d.ts.map +1 -0
- package/dist/wasm-text-shaper.js +240 -0
- package/dist/wasm-text-shaper.js.map +1 -0
- package/package.json +53 -0
- package/wasm/text_shaper.wasm +0 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rustam Garifulin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# @oh-just-another/text-wasm
|
|
2
|
+
|
|
3
|
+
WASM-backed `TextShaper` implementation for the diagram renderer (Phase 46).
|
|
4
|
+
|
|
5
|
+
Default fallback: a synchronous geometric estimate so first paint isn't blank. Plug a real WASM module (HarfBuzz / harfbuzzjs / ICU4X / canvaskit-text) via `loadModule(...)` once it is fetched.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { WasmTextShaper } from "@oh-just-another/text-wasm";
|
|
9
|
+
|
|
10
|
+
const shaper = new WasmTextShaper();
|
|
11
|
+
await shaper.loadModule("/text-shaper.wasm"); // optional — without it, fallback is used
|
|
12
|
+
|
|
13
|
+
// pass into the editor
|
|
14
|
+
const editor = new Editor({ textShaper: shaper /* … */ });
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Expected WASM exports
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
interface WasmShaperExports {
|
|
21
|
+
memory: WebAssembly.Memory;
|
|
22
|
+
alloc(bytes: number): number;
|
|
23
|
+
free(ptr: number, bytes: number): void;
|
|
24
|
+
setFont(familyPtr: number, familyLen: number, size: number): void;
|
|
25
|
+
measure(textPtr: number, textLen: number): number; // advance width in CSS px
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Any toolchain that emits a `WebAssembly.Instance` matching this shape works (Rust + `wasm-bindgen` with `#[no_mangle]` exports, AssemblyScript, hand-crafted `.wat`, …). The kernel does not ship a bundled module — hosts pick the engine that matches their font pipeline.
|
|
30
|
+
|
|
31
|
+
See `@oh-just-another/renderer-core`'s `TextShaper` interface.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/constants.ts","../../types/dist/vec2.d.ts","../../types/dist/bounds.d.ts","../../types/dist/transform.d.ts","../../types/dist/color.d.ts","../../types/dist/ids.d.ts","../../types/dist/events.d.ts","../../types/dist/index.d.ts","../../renderer-core/dist/render-target.d.ts","../../scene/dist/style.d.ts","../../scene/dist/constants.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/types.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/generate.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/jitter.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/digits.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/errors.d.ts","../../../node_modules/.pnpm/fractional-keys@0.1.1/node_modules/fractional-keys/dist/index.d.ts","../../scene/dist/edge.d.ts","../../scene/dist/shape.d.ts","../../scene/dist/edge-curve.d.ts","../../scene/dist/annotation.d.ts","../../scene/dist/file.d.ts","../../scene/dist/layer.d.ts","../../scene/dist/viewport.d.ts","../../scene/dist/patch.d.ts","../../scene/dist/scene.d.ts","../../scene/dist/edge-geometry.d.ts","../../scene/dist/operations.d.ts","../../scene/dist/render-bounds.d.ts","../../scene/dist/text-measure.d.ts","../../scene/dist/anchors.d.ts","../../scene/dist/snap.d.ts","../../scene/dist/outline.d.ts","../../scene/dist/annotation-geometry.d.ts","../../scene/dist/spatial.d.ts","../../scene/dist/queries.d.ts","../../scene/dist/a11y.d.ts","../../scene/dist/layout.d.ts","../../scene/dist/layout-registry.d.ts","../../scene/dist/elbow-router.d.ts","../../scene/dist/elbow-link.d.ts","../../scene/dist/heading.d.ts","../../scene/dist/diff.d.ts","../../scene/dist/three-way-merge.d.ts","../../scene/dist/container.d.ts","../../scene/dist/index.d.ts","../../renderer-core/dist/shape-renderer.d.ts","../../renderer-core/dist/layers.d.ts","../../renderer-core/dist/shape-cache.d.ts","../../renderer-core/dist/layer-cache-composite.d.ts","../../renderer-core/dist/scene-renderer.d.ts","../../renderer-core/dist/edge-cache.d.ts","../../renderer-core/dist/edge-cache-bitmap.d.ts","../../renderer-core/dist/edge-renderer.d.ts","../../renderer-core/dist/grid-renderer.d.ts","../../renderer-core/dist/built-in-renderers.d.ts","../../renderer-core/dist/text-shaper.d.ts","../../renderer-core/dist/text-layout.d.ts","../../renderer-core/dist/text-editing.d.ts","../../renderer-core/dist/shape-cache-bitmap.d.ts","../../renderer-core/dist/animation-adapter.d.ts","../../renderer-core/dist/rasterizer.d.ts","../../renderer-core/dist/js-rasterizer.d.ts","../../renderer-core/dist/worker-render.d.ts","../../renderer-core/dist/tile-renderer.d.ts","../../renderer-core/dist/constants.d.ts","../../renderer-core/dist/index.d.ts","../src/wasm-text-shaper.ts","../src/index.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.19.19/node_modules/@types/node/index.d.ts"],"fileIdsList":[[133,179,180,182,199,200],[133,181,182,199,200],[182,199,200],[133,182,187,199,200,217],[133,182,183,188,193,199,200,202,214,225],[133,182,183,184,193,199,200,202],[133,182,199,200],[128,129,130,133,182,199,200],[133,182,185,199,200,226],[133,182,186,187,194,199,200,203],[133,182,187,199,200,214,222],[133,182,188,190,193,199,200,202],[133,181,182,189,199,200],[133,182,190,191,199,200],[133,182,192,193,199,200],[133,181,182,193,199,200],[133,182,193,194,195,199,200,214,225],[133,182,193,194,195,199,200,209,214,217],[133,175,182,190,193,196,199,200,202,214,225],[133,182,193,194,196,197,199,200,202,214,222,225],[133,182,196,198,199,200,214,222,225],[131,132,133,134,135,136,137,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231],[133,182,193,199,200],[133,182,199,200,201,225],[133,182,190,193,199,200,202,214],[133,182,199,200,203],[133,182,199,200,204],[133,181,182,199,200,205],[133,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231],[133,182,199,200,207],[133,182,199,200,208],[133,182,193,199,200,209,210],[133,182,199,200,209,211,226,228],[133,182,194,199,200],[133,182,193,199,200,214,215,217],[133,182,199,200,216,217],[133,182,199,200,214,215],[133,182,199,200,217],[133,182,199,200,218],[133,179,182,199,200,214,219,225],[133,182,193,199,200,220,221],[133,182,199,200,220,221],[133,182,187,199,200,202,214,222],[133,182,199,200,223],[133,182,199,200,202,224],[133,182,196,199,200,208,225],[133,182,187,199,200,226],[133,182,199,200,214,227],[133,182,199,200,201,228],[133,182,199,200,229],[133,175,182,199,200],[133,175,182,193,195,199,200,205,214,217,225,227,228,230],[133,182,199,200,214,231],[70,133,182,199,200],[70,71,72,73,74,133,182,199,200],[133,147,151,182,199,200,225],[133,147,182,199,200,214,225],[133,142,182,199,200],[133,144,147,182,199,200,222,225],[133,182,199,200,202,222],[133,182,199,200,232],[133,142,182,199,200,232],[133,144,147,182,199,200,202,225],[133,139,140,143,146,182,193,199,200,214,225],[133,147,154,182,199,200],[133,139,145,182,199,200],[133,147,168,169,182,199,200],[133,143,147,182,199,200,217,225,232],[133,168,182,199,200,232],[133,141,142,182,199,200,232],[133,147,182,199,200],[133,141,142,143,144,145,146,147,148,149,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,169,170,171,172,173,174,182,199,200],[133,147,162,182,199,200],[133,147,154,155,182,199,200],[133,145,147,155,156,182,199,200],[133,146,182,199,200],[133,139,142,147,182,199,200],[133,147,151,155,156,182,199,200],[133,151,182,199,200],[133,145,147,150,182,199,200,225],[133,139,144,147,154,182,199,200],[133,182,199,200,214],[133,142,147,168,182,199,200,230,232],[109,133,182,199,200],[104,133,182,199,200],[66,104,133,182,199,200],[66,67,104,110,111,133,182,199,200],[67,104,133,182,199,200],[67,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,133,182,199,200],[120,133,182,199,200],[66,133,182,199,200],[66,67,104,107,108,133,182,199,200],[67,133,182,199,200],[67,115,133,182,199,200],[77,133,182,199,200],[66,76,77,133,182,199,200],[66,79,84,133,182,199,200],[66,77,84,133,182,199,200],[66,84,133,182,199,200],[66,76,78,84,133,182,199,200],[66,68,75,133,182,199,200],[66,76,84,133,182,199,200],[66,77,133,182,199,200],[68,69,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,133,182,199,200],[66,75,133,182,199,200],[66,83,84,133,182,199,200],[66,77,83,84,133,182,199,200],[66,76,77,79,81,82,83,84,133,182,199,200],[66,76,77,79,80,81,82,133,182,199,200],[66,76,77,81,84,93,133,182,199,200],[66,75,76,77,79,80,81,82,83,133,182,199,200],[66,68,75,76,133,182,199,200],[59,126,133,182,199,200],[59,125,133,182,195,199,200,225],[60,133,182,199,200],[60,61,62,63,64,65,133,182,199,200]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fae68b5d789ffaee804ac1d17a87390997f4f10216908d9d1a60a4ac1c65686","signature":"d46026b3b5f3e599f8de375ad5dda84967641f323d7750c5b10bf531c47a550f"},"a9dc2e59fb40b94411bd995a0013c15385b99599a18b7141cf3eafd80c7f0f96","4015dc819b09b93f989d4df8f1f0f36cb99cb2aad8102ab8b4b27fb6020beb5f","ed06a7b359e2125c375f6bada6631fd038473dd624309b8a43a824693a6f6c89","46fa0b276ad58dc963c574f72bb9456b881f3d61bc0fe6827c24f3f02baa6038","1f0260dbafda11af88b11f1b6d662ee45517d44c8cc9a7248bd61d2d8ab1f880","502657b9a54e290098ba4f955efa476b91648b24d5310b8c6e7aa0d4cf8945ae","90755de39a18e2894ad3cced6cdf4cb670e09868b01a6f6465af558d865bf848","799b9bc7d88f13ae6e51415c1e663e685fcbe77164eb2be78b08893d9b299bf0","b8e3c1f3a85e05bcbc56fa28558cffc68ac40e4158afdc2d702ea825ce21d14d","c196961c4aa13e3bf28a7e56ac7fa0b0cbfc668eca4496292d629dd18f43296b",{"version":"bce89d3ef847715b91ffd525a157c779be8fafebe823671815f7ce96f27afcda","impliedFormat":99},{"version":"c67f9d85070618f586d632cf184b986eb604f426b90aa68ecdad1ac68ca3151c","impliedFormat":99},{"version":"c656cc6ded557aff87a6c823142852e3548c6a14f84bb48ee35c3e57b6ebc03b","impliedFormat":99},{"version":"0e34130243c29d8d826f868c4e00ff586b349627cb241b3d89f0459a6cdeff4d","impliedFormat":99},{"version":"d555c6cb465cc5cf8127adbbc496720d5200c9dfafa777bbf9dfdea74ebfe3a3","impliedFormat":99},{"version":"27a6936a863edf777150af3ebc65939fa34f51d68385f8a7f198d8ea53685a4d","impliedFormat":99},"17ee722c53770caad5479081a3db9f0df8135a8f061ea9ce57a507ca0c424cce","78bde316dcb094df77d06b893e0b965d318ac5708d09e7cf6206931263be32e6","d081374b0bf74e2748138e8b0a56458e12e2ee7bd07fb239b92c97a33bba8d70","b85f83aa4b7fb1abc375a73cb706295a146b9f22cf9fa5ec89105fcff6ea1495","fd0cd0a179e95f7d4d5f7370209f6b413006242a045137d33ca230ae015ba760","fa716666e5bedc99e38d37def5182924b9dd9e6298c2751f8cebe0fc631ef697","48280d2635c39dd226b7e5bb71d0519f355b60d4d92e9f6b5b4a427aa28412f8","8bdcd8a58fead736e81808193884907482c8d354f13a0516e9b236a07622c727","8ebfa15cb2e79b885a21ae5f92507b5b9dd9b01041143554903c163f86611849","4233c4d8ac9cb79b3b71e4923eb486f08f5f2c6508fc177192081a402bee38b3","dfa88df7638cc24634255691d0a3fb72a4910b73211da89fab8f2362730cb3b2","75ea946ee4d31489f494b0def56b2db669c3aac052713387d6edc51dc2ca86db","26ce9aa6f798212e39770c45142239f3a54fa63697ba90bae90c6d7ac7da825a","eceda86937454d399a4e4cd4a3e25835a4ac80ab930f399b20f53d8f1c772457","8b12bcaa49f76ee1ce7f77943a297078dba53abedd344da6d370012eab482c07","ebfed381c5296dbb1ebae8265ca08dbce33929fa829f6ac11f2f591beb1f4485","ae557ba7a3d28e8909ac395365eb5f8ff63bc28eb2eaace61650ed51f1bc1808","95784f449b26dbdf4aadd2f99a5c2f6c419d80f993ececa6c0c3e0159b452aa5","89c0f7c64772fcb38eda1e15b26da3e53e4101c968a0eeb14954f154aee4dac1","6e7e44d7615d2899c2dd6be4e15bbb2cd0b7f4afec2379c08db14b9eac5c9b43","a1f5b4a129cd4b8f013533f200baf74615d690c41f1ef2147bd40ef6110c4a1b","d1b901b618ec72bff0fcb657edf03d83e2bcbb2687a9cddadea48a24ab23faf2","9a02cb3cccc3eeb3fea9327c47dbda2076e21f3da7b2eb659871dc91b8572f42","1778dfd35a7d5885896c436792662c8d602ea8cf03aeed97b0381b6e82c4e980","f730ff4577c8d45cb4a587d078ee5b692613c3de57f26a27a4be74c183adc226","60bd456f1b63861f880c386ddf1b3916098bbafbf4b5a46a5e5ebc4fcb9434c4","f2c0b5b634eed4010d9396710281a7fdc7019fe47507e8bcb706a58af985548a","baeb8f9be968778478ffa26099ec4211dd28c6dea1633fd8fd1560c34fdd0269","5df76ca2d799039334a825b621129061b89022808e0943397e045bc6feec894c","9b6e1a724771bd1fb7ea1a2551ed5b13b92d87aeaba331d520716e725d7b63a5","66c6888608b17316a09ede6335f5568748a24af4090990c9cf8050ac8b318c34","e89c865ca4785f4a56fbfe95b04df807ebf6d320b174b484f3a08d54321447a7","403e6bc805dc2cdcbb3f6bb38cf78bd70d4202ebe405178fd8dc917bf84dd124","fcf3b586398c415038922a229576ddc3c9ac81f17113f4564f860b90222fc463","e6a79d0cfe8e75f37a20cb36e05795fa8116c4510a4b3cfc3fa89a427f356b3c","6aee942b8a0c7c10cd2315315b0b88b85daf969ed761cda7d1c045badba8b058","2a113e6e70cb236e8f367e088f0470fe9155b04ea16ce315606095ea7f9a06c1","b505287deeb59270e8d172f30f625adf6e8394c16e68f1caeff1d933fb6a239a","f9bdf17d1b11f604f4c3db96f3ab31d1a5d0e81f95765ba3eaf60069b6892f49","d84043e3d658e5b2fd1351c18cefeeed153fa37c5828c234c2c343e89511ce34","8bfb061a2c3561bd22bdf252a4a32e504cd1cf1af601e377d51fc006104e927d","28bc1aaad7be71d47e0e278e97f43ab7b736e4f042a3c086a239543e7d0f9b24","71441b9d36fd4591e4606665559a533274dc04ebabfa841a45362ef273f2e8ce","2b7e1ab6757e4fed93a787ff649719bc13aaf8607e12c0b3c8c3e8c190d65680","6257c11ddda8274e26d5e46fb41272edddd4a8d6a9686ddd79c86b0f5484ba8f","5f442f7b5b287323065b77d9e991937bc10f974bfd65a0f36d2ccc10bb490a6c","e2467441777ecea9f274b465d652ac217fb76872b2403a2fd049929a57a9e15d","54f06de0591cca133a51d2004cb4d3f6370315e1e1dd6618280524fe91f8a01c","9dae069538bed39f3ffbe84975f1deac55843f229314982ee15a4b8ed4d9a98d","d9579c3abb9e4ed7d64b4619f2732191a1917989e63120156adcbfaff100b001",{"version":"5115a24190740b6da8fc5f9c01c7385f2c65f5094e8985cce5eb63c06c5b9988","signature":"f139b528c39017fe629b45e8f1e858bbb9095aefd9e4a1d3935821d8e5967650"},{"version":"3a257ba8a2ac610c6358e1be76daf36f6337071e9e67ae23914dc1556cf46f95","signature":"a2752f8c93f30de9b3e22ca2bf04ce96c639c5430091fa63e028623bfcc011a8"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"73b5fa37db36eeac90c4d752e39586f1b57187400c4f5280fd05f16437287a45","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[59,126,127],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":false,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[179,1],[180,1],[181,2],[133,3],[182,4],[183,5],[184,6],[128,7],[131,8],[129,7],[130,7],[185,9],[186,10],[187,11],[188,12],[189,13],[190,14],[191,14],[192,15],[193,16],[194,17],[195,18],[134,7],[132,7],[196,19],[197,20],[198,21],[232,22],[199,23],[200,7],[201,24],[202,25],[203,26],[204,27],[205,28],[206,29],[207,30],[208,31],[209,32],[210,32],[211,33],[212,7],[213,34],[214,35],[216,36],[215,37],[217,38],[218,39],[219,40],[220,41],[221,42],[222,43],[223,44],[224,45],[225,46],[226,47],[227,48],[228,49],[229,50],[135,7],[136,7],[137,7],[176,51],[177,7],[178,7],[230,52],[231,53],[138,7],[73,7],[74,7],[71,54],[75,55],[72,54],[70,7],[57,7],[58,7],[10,7],[12,7],[11,7],[2,7],[13,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[3,7],[21,7],[22,7],[4,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[5,7],[31,7],[32,7],[33,7],[34,7],[6,7],[38,7],[35,7],[36,7],[37,7],[39,7],[7,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[8,7],[50,7],[47,7],[48,7],[49,7],[51,7],[9,7],[52,7],[53,7],[54,7],[56,7],[55,7],[1,7],[154,56],[164,57],[153,56],[174,58],[145,59],[144,60],[173,61],[167,62],[172,63],[147,64],[161,65],[146,66],[170,67],[142,68],[141,61],[171,69],[143,70],[148,71],[149,7],[152,71],[139,7],[175,72],[165,73],[156,74],[157,75],[159,76],[155,77],[158,78],[168,61],[150,79],[151,80],[160,81],[140,82],[163,73],[162,71],[166,7],[169,83],[119,7],[114,7],[124,84],[111,85],[110,86],[112,87],[113,88],[125,89],[121,90],[108,91],[106,7],[120,86],[67,91],[109,92],[118,85],[107,86],[105,88],[117,93],[116,94],[115,93],[123,91],[122,86],[95,95],[89,96],[92,97],[79,91],[69,7],[103,98],[101,99],[78,91],[85,100],[76,101],[99,102],[98,91],[80,91],[100,103],[104,104],[81,105],[97,106],[96,107],[86,108],[91,103],[83,109],[94,110],[87,103],[84,111],[77,112],[90,99],[93,91],[68,91],[88,7],[102,98],[82,91],[59,7],[127,113],[126,114],[61,7],[63,7],[65,115],[64,7],[66,116],[62,7],[60,7]],"latestChangedDtsFile":"./index.d.ts","version":"5.9.3"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-package constants — adjustable defaults for the WASM text
|
|
3
|
+
* shaper. Tuned conservatively for browsers; hosts override via
|
|
4
|
+
* `WasmTextShaper` constructor options.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Fallback advance width (CSS px) for shaper queries that arrive
|
|
8
|
+
* before the WASM module finishes loading. Sized to roughly match
|
|
9
|
+
* `0.55 * fontSize` for proportional fonts. Returned as
|
|
10
|
+
* `text.length * (fontSize * FALLBACK_ADVANCE_FACTOR)` so layout
|
|
11
|
+
* stays roughly proportional during the warm-up window.
|
|
12
|
+
*/
|
|
13
|
+
export declare const FALLBACK_ADVANCE_FACTOR = 0.55;
|
|
14
|
+
/**
|
|
15
|
+
* LRU cap for the measure cache (entries, not bytes). Each entry
|
|
16
|
+
* is a small object — a few hundred bytes — so 10k entries cost
|
|
17
|
+
* ≤ ~4 MB. Hosts hosting larger documents (think 100k labels)
|
|
18
|
+
* should raise via constructor options.
|
|
19
|
+
*/
|
|
20
|
+
export declare const MEASURE_CACHE_SIZE = 10000;
|
|
21
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,QAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-package constants — adjustable defaults for the WASM text
|
|
3
|
+
* shaper. Tuned conservatively for browsers; hosts override via
|
|
4
|
+
* `WasmTextShaper` constructor options.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Fallback advance width (CSS px) for shaper queries that arrive
|
|
8
|
+
* before the WASM module finishes loading. Sized to roughly match
|
|
9
|
+
* `0.55 * fontSize` for proportional fonts. Returned as
|
|
10
|
+
* `text.length * (fontSize * FALLBACK_ADVANCE_FACTOR)` so layout
|
|
11
|
+
* stays roughly proportional during the warm-up window.
|
|
12
|
+
*/
|
|
13
|
+
export const FALLBACK_ADVANCE_FACTOR = 0.55;
|
|
14
|
+
/**
|
|
15
|
+
* LRU cap for the measure cache (entries, not bytes). Each entry
|
|
16
|
+
* is a small object — a few hundred bytes — so 10k entries cost
|
|
17
|
+
* ≤ ~4 MB. Hosts hosting larger documents (think 100k labels)
|
|
18
|
+
* should raise via constructor options.
|
|
19
|
+
*/
|
|
20
|
+
export const MEASURE_CACHE_SIZE = 10_000;
|
|
21
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAKf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import type { ShapedGlyph, ShaperFont, TextShaper } from "@oh-just-another/renderer-core";
|
|
2
|
+
/**
|
|
3
|
+
* WASM-backed text shaper.
|
|
4
|
+
*
|
|
5
|
+
* The kernel ships an interface in `@oh-just-another/renderer-core` so
|
|
6
|
+
* hosts can swap measurement engines. This package provides the
|
|
7
|
+
* default WASM-aware implementation:
|
|
8
|
+
*
|
|
9
|
+
* • Until a WASM module is loaded via `loadModule`, calls fall
|
|
10
|
+
* back to a synchronous geometric estimate (proportional
|
|
11
|
+
* monospace-style advance). Layout stays roughly correct so
|
|
12
|
+
* the first paint isn't blank.
|
|
13
|
+
* • `loadModule(bytes | url, exports)` plugs a real shaper in.
|
|
14
|
+
* The expected `exports` shape is documented inline — any
|
|
15
|
+
* HarfBuzz / harfbuzzjs / ICU4X build that exposes a
|
|
16
|
+
* `measure(textPtr, len, fontPtr) → width` function and
|
|
17
|
+
* conventional `memory` + `alloc`/`free` can be wired up.
|
|
18
|
+
* • Cache: small LRU keyed on the (text, font) pair so repeated
|
|
19
|
+
* measurements (re-renders of the same labels) are O(1).
|
|
20
|
+
*
|
|
21
|
+
* The JS fallback in `shape()` only fills `advance` for each
|
|
22
|
+
* character so decoration positioning lines up roughly even before
|
|
23
|
+
* the WASM module loads.
|
|
24
|
+
*/
|
|
25
|
+
export interface WasmShaperExports {
|
|
26
|
+
readonly memory: WebAssembly.Memory;
|
|
27
|
+
readonly alloc: (bytes: number) => number;
|
|
28
|
+
readonly free: (ptr: number, bytes: number) => void;
|
|
29
|
+
readonly setFont: (familyPtr: number, familyLen: number, size: number, bold: number, italic: number) => void;
|
|
30
|
+
readonly measure: (textPtr: number, textLen: number) => number;
|
|
31
|
+
/**
|
|
32
|
+
* Optional — resolve a UTF-8 CSS font-family + bold/italic flags to a
|
|
33
|
+
* font id `familyBase + (bold?1:0) + (italic?2:0)` where familyBase is
|
|
34
|
+
* 0/4/8 (sans/serif/mono). Present in multi-font modules. Single-font
|
|
35
|
+
* modules omit it (host treats everything as id 0).
|
|
36
|
+
*/
|
|
37
|
+
readonly resolveFont?: (familyPtr: number, familyLen: number, bold: number, italic: number) => number;
|
|
38
|
+
/**
|
|
39
|
+
* Optional — only present when the bundled MSDF-capable module is
|
|
40
|
+
* loaded. Returns a pointer to 24 bytes (6 × f32 little-endian) with
|
|
41
|
+
* the layout `[advance, bboxXMin, bboxYMin, bboxW, bboxH, unitsPerEm]`
|
|
42
|
+
* in font units. Pointer stays valid until the next `reset()`.
|
|
43
|
+
* `fontId` selects the embedded font.
|
|
44
|
+
*/
|
|
45
|
+
readonly glyphMetrics?: (fontId: number, codePoint: number) => number;
|
|
46
|
+
/**
|
|
47
|
+
* Optional — only present when the bundled MSDF-capable module is
|
|
48
|
+
* loaded. Returns a pointer to `atlasSize * atlasSize * 3` RGB
|
|
49
|
+
* bytes containing the multi-channel signed distance field for the
|
|
50
|
+
* supplied code point. `range` is the SDF range in atlas pixels
|
|
51
|
+
* (the host's shader uses `median(r,g,b)` + `smoothstep` to
|
|
52
|
+
* antialias). Empty / missing glyphs return an all-zero buffer.
|
|
53
|
+
* `fontId` selects the embedded font.
|
|
54
|
+
*/
|
|
55
|
+
readonly rasterizeGlyphMSDF?: (fontId: number, codePoint: number, atlasSize: number, range: number) => number;
|
|
56
|
+
readonly reset?: () => void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Per-glyph metrics in font units. The host converts to pixels via
|
|
60
|
+
* `value * fontSize / unitsPerEm`. `bbox` is the glyph's tight
|
|
61
|
+
* bounding box (in font coords — y-up, origin at left of baseline);
|
|
62
|
+
* `advance` is the horizontal advance (how far the cursor moves to
|
|
63
|
+
* place the next glyph). All values are zero for missing glyphs.
|
|
64
|
+
*/
|
|
65
|
+
export interface GlyphMetrics {
|
|
66
|
+
readonly advance: number;
|
|
67
|
+
readonly bboxXMin: number;
|
|
68
|
+
readonly bboxYMin: number;
|
|
69
|
+
readonly bboxW: number;
|
|
70
|
+
readonly bboxH: number;
|
|
71
|
+
readonly unitsPerEm: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Raw MSDF tile for a single glyph. `data` is `atlasSize *
|
|
75
|
+
* atlasSize * 3` bytes in RGB order. `data` is a view into the WASM
|
|
76
|
+
* linear memory and must be copied before the next WASM call (which
|
|
77
|
+
* may grow / re-alloc the arena).
|
|
78
|
+
*/
|
|
79
|
+
export interface MsdfGlyphTile {
|
|
80
|
+
readonly atlasSize: number;
|
|
81
|
+
readonly range: number;
|
|
82
|
+
readonly data: Uint8Array;
|
|
83
|
+
}
|
|
84
|
+
export interface WasmTextShaperOptions {
|
|
85
|
+
/** Override the LRU cap. Defaults to `MEASURE_CACHE_SIZE`. */
|
|
86
|
+
readonly cacheSize?: number;
|
|
87
|
+
/** Override the fallback advance factor. */
|
|
88
|
+
readonly fallbackAdvanceFactor?: number;
|
|
89
|
+
}
|
|
90
|
+
export declare class WasmTextShaper implements TextShaper {
|
|
91
|
+
private readonly cacheSize;
|
|
92
|
+
private readonly fallbackFactor;
|
|
93
|
+
private readonly cache;
|
|
94
|
+
private wasm;
|
|
95
|
+
private currentFontKey;
|
|
96
|
+
private readonly textEncoder;
|
|
97
|
+
constructor(options?: WasmTextShaperOptions);
|
|
98
|
+
/** Returns `true` once a WASM module has been successfully loaded. */
|
|
99
|
+
get isReady(): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Load a WASM module that exposes the `WasmShaperExports` interface.
|
|
102
|
+
* Accepts either a fetched URL (resolves a Response) or a raw
|
|
103
|
+
* ArrayBuffer / TypedArray of the module bytes.
|
|
104
|
+
*
|
|
105
|
+
* Resets the cache — fallback measurements are usually very
|
|
106
|
+
* different from the real ones, so reusing them would produce a
|
|
107
|
+
* layout pop on the next paint.
|
|
108
|
+
*/
|
|
109
|
+
loadModule(source: string | URL | ArrayBuffer | Uint8Array | Response): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Load the bundled `text_shaper.wasm` shipped with this package.
|
|
112
|
+
* Equivalent to
|
|
113
|
+
*
|
|
114
|
+
* shaper.loadModule(new URL("../wasm/text_shaper.wasm",
|
|
115
|
+
* import.meta.url))
|
|
116
|
+
*
|
|
117
|
+
* In a Vite-built host the URL resolves to a hashed bundle asset;
|
|
118
|
+
* in Node, `fetch` (Node 18+) reads it from disk through the
|
|
119
|
+
* `file://` URL. SSR-only hosts can pass the bytes directly to
|
|
120
|
+
* `loadModule(...)` to skip the fetch hop.
|
|
121
|
+
*/
|
|
122
|
+
static loadBundled(): Promise<WasmTextShaper>;
|
|
123
|
+
measure(text: string, font: ShaperFont): {
|
|
124
|
+
width: number;
|
|
125
|
+
};
|
|
126
|
+
shape(text: string, font: ShaperFont): readonly ShapedGlyph[];
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a CSS font-family stack to an embedded font id (0=sans,
|
|
129
|
+
* 1=serif, 2=mono). Returns 0 when the module is single-font (no
|
|
130
|
+
* `resolveFont` export) or not yet loaded, so callers degrade to the
|
|
131
|
+
* default font transparently. The atlas keys glyphs by this id, so
|
|
132
|
+
* the same code point in two families gets two tiles.
|
|
133
|
+
*/
|
|
134
|
+
resolveFontId(family: string, bold?: boolean, italic?: boolean): number;
|
|
135
|
+
/**
|
|
136
|
+
* Pull per-glyph metrics (advance + tight bbox + UPM) from the WASM
|
|
137
|
+
* shaper for a single code point. Returns `null` if the loaded
|
|
138
|
+
* module doesn't expose `glyphMetrics` or before `loadModule()` has
|
|
139
|
+
* resolved. All values are in font units; the host scales via
|
|
140
|
+
* `fontSize / unitsPerEm` — same convention as `measure` uses
|
|
141
|
+
* internally. `fontId` selects the embedded font.
|
|
142
|
+
*
|
|
143
|
+
* The returned object is detached (plain object, not a memory
|
|
144
|
+
* view), so callers can keep it past further WASM calls.
|
|
145
|
+
*/
|
|
146
|
+
glyphMetrics(codePoint: number, fontId?: number): GlyphMetrics | null;
|
|
147
|
+
/**
|
|
148
|
+
* Rasterise a single glyph as an MSDF tile. The bundled wasm uses
|
|
149
|
+
* the `fdsm` crate (pure-Rust msdfgen-style implementation) — three
|
|
150
|
+
* channels, 3°-equivalent corner detection, sign-correction
|
|
151
|
+
* post-pass. `atlasSize` is the tile edge in pixels (typical 32 /
|
|
152
|
+
* 48 / 64); `range` is the SDF range in atlas pixels (typically
|
|
153
|
+
* `atlasSize / 8`, so the shader has ~`range`px to soften the edge
|
|
154
|
+
* with `smoothstep`).
|
|
155
|
+
*
|
|
156
|
+
* Returns `null` when the loaded module doesn't expose
|
|
157
|
+
* `rasterizeGlyphMSDF`. Returns a buffer of zeros for missing or
|
|
158
|
+
* empty (whitespace) glyphs — the host shader reads zero as "fully
|
|
159
|
+
* outside" which is the correct visual outcome.
|
|
160
|
+
*
|
|
161
|
+
* The returned `data` is a **copy** of the WASM-side buffer so the
|
|
162
|
+
* tile survives subsequent WASM calls that may grow the arena.
|
|
163
|
+
*/
|
|
164
|
+
rasterizeGlyphMSDF(codePoint: number, atlasSize: number, range: number, fontId?: number): MsdfGlyphTile | null;
|
|
165
|
+
/**
|
|
166
|
+
* Reset the WASM bump arena to zero — frees all transient
|
|
167
|
+
* allocations (font-family copies, measure inputs, MSDF tiles).
|
|
168
|
+
* Safe to call between batches; no-op if the loaded module doesn't
|
|
169
|
+
* expose `reset`. Hosts that hammer the atlas (large strings,
|
|
170
|
+
* many glyphs) should call this after each frame to avoid
|
|
171
|
+
* unbounded arena growth.
|
|
172
|
+
*/
|
|
173
|
+
resetArena(): void;
|
|
174
|
+
private measureFallback;
|
|
175
|
+
private measureViaWasm;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=wasm-text-shaper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-text-shaper.d.ts","sourceRoot":"","sources":["../src/wasm-text-shaper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { FALLBACK_ADVANCE_FACTOR, MEASURE_CACHE_SIZE } from "./constants.js";
|
|
2
|
+
export class WasmTextShaper {
|
|
3
|
+
cacheSize;
|
|
4
|
+
fallbackFactor;
|
|
5
|
+
cache = new Map();
|
|
6
|
+
wasm = null;
|
|
7
|
+
currentFontKey = null;
|
|
8
|
+
textEncoder = new TextEncoder();
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.cacheSize = options.cacheSize ?? MEASURE_CACHE_SIZE;
|
|
11
|
+
this.fallbackFactor = options.fallbackAdvanceFactor ?? FALLBACK_ADVANCE_FACTOR;
|
|
12
|
+
}
|
|
13
|
+
/** Returns `true` once a WASM module has been successfully loaded. */
|
|
14
|
+
get isReady() {
|
|
15
|
+
return this.wasm !== null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load a WASM module that exposes the `WasmShaperExports` interface.
|
|
19
|
+
* Accepts either a fetched URL (resolves a Response) or a raw
|
|
20
|
+
* ArrayBuffer / TypedArray of the module bytes.
|
|
21
|
+
*
|
|
22
|
+
* Resets the cache — fallback measurements are usually very
|
|
23
|
+
* different from the real ones, so reusing them would produce a
|
|
24
|
+
* layout pop on the next paint.
|
|
25
|
+
*/
|
|
26
|
+
async loadModule(source) {
|
|
27
|
+
const bytes = await fetchModuleBytes(source);
|
|
28
|
+
const { instance } = await WebAssembly.instantiate(bytes, {});
|
|
29
|
+
this.wasm = instance.exports;
|
|
30
|
+
this.cache.clear();
|
|
31
|
+
this.currentFontKey = null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load the bundled `text_shaper.wasm` shipped with this package.
|
|
35
|
+
* Equivalent to
|
|
36
|
+
*
|
|
37
|
+
* shaper.loadModule(new URL("../wasm/text_shaper.wasm",
|
|
38
|
+
* import.meta.url))
|
|
39
|
+
*
|
|
40
|
+
* In a Vite-built host the URL resolves to a hashed bundle asset;
|
|
41
|
+
* in Node, `fetch` (Node 18+) reads it from disk through the
|
|
42
|
+
* `file://` URL. SSR-only hosts can pass the bytes directly to
|
|
43
|
+
* `loadModule(...)` to skip the fetch hop.
|
|
44
|
+
*/
|
|
45
|
+
static async loadBundled() {
|
|
46
|
+
const shaper = new WasmTextShaper();
|
|
47
|
+
const url = new URL("../wasm/text_shaper.wasm", import.meta.url);
|
|
48
|
+
await shaper.loadModule(url);
|
|
49
|
+
return shaper;
|
|
50
|
+
}
|
|
51
|
+
measure(text, font) {
|
|
52
|
+
const cacheKey = `${fontKey(font)}|${text}`;
|
|
53
|
+
const cached = this.cache.get(cacheKey);
|
|
54
|
+
if (cached) {
|
|
55
|
+
// Promote — Map preserves insertion order, so re-set on hit.
|
|
56
|
+
this.cache.delete(cacheKey);
|
|
57
|
+
this.cache.set(cacheKey, cached);
|
|
58
|
+
return cached;
|
|
59
|
+
}
|
|
60
|
+
const result = this.wasm
|
|
61
|
+
? this.measureViaWasm(text, font, this.wasm)
|
|
62
|
+
: this.measureFallback(text, font);
|
|
63
|
+
if (this.cache.size >= this.cacheSize) {
|
|
64
|
+
// Evict oldest entry (insertion order is LRU order).
|
|
65
|
+
const oldest = this.cache.keys().next().value;
|
|
66
|
+
if (oldest !== undefined)
|
|
67
|
+
this.cache.delete(oldest);
|
|
68
|
+
}
|
|
69
|
+
this.cache.set(cacheKey, result);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
shape(text, font) {
|
|
73
|
+
// No WASM glyph-id mapping — emit one synthetic glyph per code
|
|
74
|
+
// point so callers that decorate (underline, strikeout) have
|
|
75
|
+
// positions to work with.
|
|
76
|
+
const total = this.measure(text, font);
|
|
77
|
+
const perChar = text.length === 0 ? 0 : total.width / text.length;
|
|
78
|
+
const out = [];
|
|
79
|
+
for (let i = 0; i < text.length; i++) {
|
|
80
|
+
out.push({
|
|
81
|
+
glyphId: text.charCodeAt(i),
|
|
82
|
+
advance: perChar,
|
|
83
|
+
x: i * perChar,
|
|
84
|
+
y: 0,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolve a CSS font-family stack to an embedded font id (0=sans,
|
|
91
|
+
* 1=serif, 2=mono). Returns 0 when the module is single-font (no
|
|
92
|
+
* `resolveFont` export) or not yet loaded, so callers degrade to the
|
|
93
|
+
* default font transparently. The atlas keys glyphs by this id, so
|
|
94
|
+
* the same code point in two families gets two tiles.
|
|
95
|
+
*/
|
|
96
|
+
resolveFontId(family, bold = false, italic = false) {
|
|
97
|
+
const wasm = this.wasm;
|
|
98
|
+
if (!wasm?.resolveFont)
|
|
99
|
+
return 0;
|
|
100
|
+
const bytes = this.textEncoder.encode(family);
|
|
101
|
+
const ptr = wasm.alloc(bytes.byteLength);
|
|
102
|
+
new Uint8Array(wasm.memory.buffer, ptr, bytes.byteLength).set(bytes);
|
|
103
|
+
const id = wasm.resolveFont(ptr, bytes.byteLength, bold ? 1 : 0, italic ? 1 : 0);
|
|
104
|
+
wasm.free(ptr, bytes.byteLength);
|
|
105
|
+
return id;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Pull per-glyph metrics (advance + tight bbox + UPM) from the WASM
|
|
109
|
+
* shaper for a single code point. Returns `null` if the loaded
|
|
110
|
+
* module doesn't expose `glyphMetrics` or before `loadModule()` has
|
|
111
|
+
* resolved. All values are in font units; the host scales via
|
|
112
|
+
* `fontSize / unitsPerEm` — same convention as `measure` uses
|
|
113
|
+
* internally. `fontId` selects the embedded font.
|
|
114
|
+
*
|
|
115
|
+
* The returned object is detached (plain object, not a memory
|
|
116
|
+
* view), so callers can keep it past further WASM calls.
|
|
117
|
+
*/
|
|
118
|
+
glyphMetrics(codePoint, fontId = 0) {
|
|
119
|
+
const wasm = this.wasm;
|
|
120
|
+
if (!wasm?.glyphMetrics)
|
|
121
|
+
return null;
|
|
122
|
+
const ptr = wasm.glyphMetrics(fontId, codePoint);
|
|
123
|
+
const buffer = wasm.memory.buffer;
|
|
124
|
+
// 6 contiguous little-endian f32 (24 bytes). Read via DataView, not
|
|
125
|
+
// `new Float32Array(buffer, ptr, 6)`: the WASM ABI does not
|
|
126
|
+
// guarantee `ptr` is 4-byte aligned, and a typed-array view throws
|
|
127
|
+
// `RangeError: start offset … should be a multiple of 4` on an
|
|
128
|
+
// unaligned pointer. DataView has no alignment constraint. Guard the
|
|
129
|
+
// bounds so a stray pointer returns null instead of throwing.
|
|
130
|
+
if (ptr <= 0 || ptr + 24 > buffer.byteLength)
|
|
131
|
+
return null;
|
|
132
|
+
const dv = new DataView(buffer, ptr, 24);
|
|
133
|
+
return {
|
|
134
|
+
advance: dv.getFloat32(0, true),
|
|
135
|
+
bboxXMin: dv.getFloat32(4, true),
|
|
136
|
+
bboxYMin: dv.getFloat32(8, true),
|
|
137
|
+
bboxW: dv.getFloat32(12, true),
|
|
138
|
+
bboxH: dv.getFloat32(16, true),
|
|
139
|
+
unitsPerEm: dv.getFloat32(20, true),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Rasterise a single glyph as an MSDF tile. The bundled wasm uses
|
|
144
|
+
* the `fdsm` crate (pure-Rust msdfgen-style implementation) — three
|
|
145
|
+
* channels, 3°-equivalent corner detection, sign-correction
|
|
146
|
+
* post-pass. `atlasSize` is the tile edge in pixels (typical 32 /
|
|
147
|
+
* 48 / 64); `range` is the SDF range in atlas pixels (typically
|
|
148
|
+
* `atlasSize / 8`, so the shader has ~`range`px to soften the edge
|
|
149
|
+
* with `smoothstep`).
|
|
150
|
+
*
|
|
151
|
+
* Returns `null` when the loaded module doesn't expose
|
|
152
|
+
* `rasterizeGlyphMSDF`. Returns a buffer of zeros for missing or
|
|
153
|
+
* empty (whitespace) glyphs — the host shader reads zero as "fully
|
|
154
|
+
* outside" which is the correct visual outcome.
|
|
155
|
+
*
|
|
156
|
+
* The returned `data` is a **copy** of the WASM-side buffer so the
|
|
157
|
+
* tile survives subsequent WASM calls that may grow the arena.
|
|
158
|
+
*/
|
|
159
|
+
rasterizeGlyphMSDF(codePoint, atlasSize, range, fontId = 0) {
|
|
160
|
+
const wasm = this.wasm;
|
|
161
|
+
if (!wasm?.rasterizeGlyphMSDF)
|
|
162
|
+
return null;
|
|
163
|
+
const ptr = wasm.rasterizeGlyphMSDF(fontId, codePoint, atlasSize, range);
|
|
164
|
+
const len = atlasSize * atlasSize * 3;
|
|
165
|
+
// Copy out of WASM memory into a standalone Uint8Array. `slice()`
|
|
166
|
+
// allocates fresh storage so the caller is safe even after
|
|
167
|
+
// subsequent allocs grow / move the WASM arena.
|
|
168
|
+
const view = new Uint8Array(wasm.memory.buffer, ptr, len);
|
|
169
|
+
const data = new Uint8Array(view); // copy
|
|
170
|
+
return { atlasSize, range, data };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Reset the WASM bump arena to zero — frees all transient
|
|
174
|
+
* allocations (font-family copies, measure inputs, MSDF tiles).
|
|
175
|
+
* Safe to call between batches; no-op if the loaded module doesn't
|
|
176
|
+
* expose `reset`. Hosts that hammer the atlas (large strings,
|
|
177
|
+
* many glyphs) should call this after each frame to avoid
|
|
178
|
+
* unbounded arena growth.
|
|
179
|
+
*/
|
|
180
|
+
resetArena() {
|
|
181
|
+
this.wasm?.reset?.();
|
|
182
|
+
this.currentFontKey = null;
|
|
183
|
+
}
|
|
184
|
+
measureFallback(text, font) {
|
|
185
|
+
return { width: text.length * font.size * this.fallbackFactor };
|
|
186
|
+
}
|
|
187
|
+
measureViaWasm(text, font, wasm) {
|
|
188
|
+
// Update the WASM-side font only when it changes — the setFont
|
|
189
|
+
// call is the expensive one (the host engine has to re-resolve
|
|
190
|
+
// the font on every flip).
|
|
191
|
+
const fkey = fontKey(font);
|
|
192
|
+
if (fkey !== this.currentFontKey) {
|
|
193
|
+
const familyBytes = this.textEncoder.encode(font.family);
|
|
194
|
+
const familyPtr = wasm.alloc(familyBytes.byteLength);
|
|
195
|
+
const familyView = new Uint8Array(wasm.memory.buffer, familyPtr, familyBytes.byteLength);
|
|
196
|
+
familyView.set(familyBytes);
|
|
197
|
+
// The `measure()` path has no weight/style channel (ShaperFont is
|
|
198
|
+
// family+size only) — measure the regular face. The bold/italic
|
|
199
|
+
// glyph advances reach callers via the atlas path (`glyphMetrics`
|
|
200
|
+
// with an explicit fontId), which is what the WebGL2 backend uses.
|
|
201
|
+
wasm.setFont(familyPtr, familyBytes.byteLength, font.size, 0, 0);
|
|
202
|
+
wasm.free(familyPtr, familyBytes.byteLength);
|
|
203
|
+
this.currentFontKey = fkey;
|
|
204
|
+
}
|
|
205
|
+
const textBytes = this.textEncoder.encode(text);
|
|
206
|
+
const textPtr = wasm.alloc(textBytes.byteLength);
|
|
207
|
+
const textView = new Uint8Array(wasm.memory.buffer, textPtr, textBytes.byteLength);
|
|
208
|
+
textView.set(textBytes);
|
|
209
|
+
const width = wasm.measure(textPtr, textBytes.byteLength);
|
|
210
|
+
wasm.free(textPtr, textBytes.byteLength);
|
|
211
|
+
return { width };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const fontKey = (font) => `${font.family}|${font.size}|${font.weight ?? "normal"}|${font.style ?? "normal"}`;
|
|
215
|
+
const fetchModuleBytes = async (source) => {
|
|
216
|
+
if (source instanceof ArrayBuffer)
|
|
217
|
+
return source;
|
|
218
|
+
if (source instanceof Uint8Array) {
|
|
219
|
+
return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);
|
|
220
|
+
}
|
|
221
|
+
if (source instanceof Response)
|
|
222
|
+
return source.arrayBuffer();
|
|
223
|
+
// Node's WHATWG fetch refuses `file://` URLs (not implemented as
|
|
224
|
+
// of Node 22). Detect the protocol and read straight from disk
|
|
225
|
+
// so `loadBundled()` works in tests / SSR / CLI contexts.
|
|
226
|
+
const urlStr = typeof source === "string" ? source : source.href;
|
|
227
|
+
if (urlStr.startsWith("file:")) {
|
|
228
|
+
const { readFile } = await import("node:fs/promises");
|
|
229
|
+
const { fileURLToPath } = await import("node:url");
|
|
230
|
+
const path = fileURLToPath(urlStr);
|
|
231
|
+
const buf = await readFile(path);
|
|
232
|
+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
233
|
+
}
|
|
234
|
+
const res = await fetch(source);
|
|
235
|
+
if (!res.ok) {
|
|
236
|
+
throw new Error(`WasmTextShaper.loadModule: fetch failed (${res.status})`);
|
|
237
|
+
}
|
|
238
|
+
return res.arrayBuffer();
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=wasm-text-shaper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-text-shaper.js","sourceRoot":"","sources":["../src/wasm-text-shaper.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oh-just-another/text-wasm",
|
|
3
|
+
"version": "0.57.0",
|
|
4
|
+
"description": "WASM text-shaping backend for the diagram renderer.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Rustam Garifulin <rustam@n69.in>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/oh-just-another/diagram.git",
|
|
10
|
+
"directory": "packages/text-wasm"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/oh-just-another/diagram#readme",
|
|
13
|
+
"bugs": "https://github.com/oh-just-another/diagram/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"diagram",
|
|
16
|
+
"canvas",
|
|
17
|
+
"svg",
|
|
18
|
+
"editor",
|
|
19
|
+
"graph",
|
|
20
|
+
"drawing"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"wasm",
|
|
35
|
+
"README.md",
|
|
36
|
+
"CHANGELOG.md"
|
|
37
|
+
],
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@oh-just-another/renderer-core": "0.57.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -b tsconfig.build.json",
|
|
47
|
+
"typecheck": "tsc --noEmit",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"test:watch": "vitest",
|
|
50
|
+
"lint": "eslint src tests",
|
|
51
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
Binary file
|