@nodetool-ai/game-renderer 0.8.2 → 0.8.3

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 +1 @@
1
- 2026-10-12T08:53:16.351Z
1
+ 2026-10-12T12:30:00.497Z
@@ -0,0 +1,69 @@
1
+ import type { AnyGameDocument } from "@nodetool-ai/protocol";
2
+ import type { StandaloneAsset } from "./build.js";
3
+ /** Tauri releases the generated project pins. Bump the three together. */
4
+ export declare const TAURI_VERSIONS: {
5
+ readonly tauri: "2.12.1";
6
+ readonly tauriBuild: "2.7.1";
7
+ readonly cli: "2.12.1";
8
+ };
9
+ export interface TauriAppOptions {
10
+ /** Window title and installer name. Defaults to "NodeTool Game". */
11
+ readonly name?: string;
12
+ /** Reverse-DNS bundle identifier. Defaults to `ai.nodetool.game.<name slug>`. */
13
+ readonly identifier?: string;
14
+ /** Semantic version `MAJOR.MINOR.PATCH`, within the ranges Windows installers accept. */
15
+ readonly version?: string;
16
+ readonly width?: number;
17
+ readonly height?: number;
18
+ /** PNG, JPEG or WebP bytes for the app icon. A generated icon is used when absent. */
19
+ readonly icon?: Uint8Array;
20
+ }
21
+ export interface BuildTauriGameOptions {
22
+ readonly document: AnyGameDocument;
23
+ readonly outputDir: string;
24
+ readonly resolveAsset: (sourceAssetId: string, signal?: AbortSignal) => Promise<StandaloneAsset | null>;
25
+ readonly app?: TauriAppOptions;
26
+ readonly signal?: AbortSignal;
27
+ }
28
+ export interface TauriAppMetadata {
29
+ readonly productName: string;
30
+ readonly identifier: string;
31
+ readonly version: string;
32
+ /** Cargo package and executable name. */
33
+ readonly crateName: string;
34
+ readonly width: number;
35
+ readonly height: number;
36
+ readonly sourceRevision: string;
37
+ readonly dimension: "2d" | "3d";
38
+ }
39
+ export interface TauriGameProject {
40
+ readonly outputDir: string;
41
+ readonly webDir: string;
42
+ readonly tauriDir: string;
43
+ readonly metadata: TauriAppMetadata;
44
+ }
45
+ /** Resolves and validates the names, version and window size of an exported desktop app. */
46
+ export declare function tauriAppMetadata(document: AnyGameDocument, app?: TauriAppOptions): TauriAppMetadata;
47
+ /** Every icon file the Tauri bundler and window need, keyed by path under `src-tauri/`. */
48
+ export declare function tauriIconFiles(source?: Uint8Array): Promise<Record<string, Uint8Array>>;
49
+ /** The text files of the Tauri project, keyed by path relative to the project root. */
50
+ export declare function tauriProjectFiles(metadata: TauriAppMetadata): Record<string, string>;
51
+ /** Exports a game as a Tauri desktop project: the standalone web player plus a native shell around it. */
52
+ export declare function buildTauriGameProject(options: BuildTauriGameOptions): Promise<TauriGameProject>;
53
+ export interface CompileTauriGameOptions {
54
+ readonly cargo?: string;
55
+ readonly signal?: AbortSignal;
56
+ readonly env?: NodeJS.ProcessEnv;
57
+ readonly onOutput?: (chunk: string) => void;
58
+ }
59
+ /**
60
+ * The cargo to run: the first on PATH, else rustup's. An app started from the
61
+ * macOS Finder or a Windows shortcut has no shell profile, so rustup's
62
+ * `~/.cargo/bin` is often installed but missing from PATH.
63
+ */
64
+ export declare function findCargo(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): Promise<string | null>;
65
+ /** Compiles an exported project into a release executable with `cargo build --release`. */
66
+ export declare function compileTauriGameProject(project: Pick<TauriGameProject, "tauriDir" | "metadata">, options?: CompileTauriGameOptions): Promise<{
67
+ binaryPath: string;
68
+ }>;
69
+ //# sourceMappingURL=build-tauri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-tauri.d.ts","sourceRoot":"","sources":["../src/build-tauri.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,406 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, constants, mkdir, mkdtemp, readdir, rename, rm, rmdir, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { delimiter, dirname, join, resolve } from "node:path";
5
+ import { createCanvas, loadImage } from "@napi-rs/canvas";
6
+ import { MissingRuntimePackageError } from "@nodetool-ai/protocol/missing-runtime-package";
7
+ /** Tauri releases the generated project pins. Bump the three together. */
8
+ export const TAURI_VERSIONS = { tauri: "2.12.1", tauriBuild: "2.7.1", cli: "2.12.1" };
9
+ const DEFAULT_PRODUCT_NAME = "NodeTool Game";
10
+ const DEFAULT_VERSION = "1.0.0";
11
+ const DEFAULT_WIDTH = 1280;
12
+ const DEFAULT_HEIGHT_2D = 800;
13
+ const MIN_WINDOW = { width: 480, height: 320 };
14
+ const MAX_WINDOW = 7680;
15
+ function slug(value) {
16
+ return value.normalize("NFKD").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48).replace(/-+$/, "");
17
+ }
18
+ function productName(value) {
19
+ // Installers use the name as a file name, so drop characters no platform allows there.
20
+ const cleaned = Array.from(value ?? "", (char) => {
21
+ const code = char.charCodeAt(0);
22
+ return code < 32 || code === 127 || '/\\:*?"<>|'.includes(char) ? " " : char;
23
+ }).join("").replace(/\s+/g, " ").trim().slice(0, 64).trim();
24
+ return cleaned || DEFAULT_PRODUCT_NAME;
25
+ }
26
+ function windowSize(value, fallback, minimum, label) {
27
+ if (value === undefined) {
28
+ return fallback;
29
+ }
30
+ if (!Number.isInteger(value) || value < minimum || value > MAX_WINDOW) {
31
+ throw new Error(`Window ${label} must be an integer from ${minimum} to ${MAX_WINDOW}`);
32
+ }
33
+ return value;
34
+ }
35
+ /** Resolves and validates the names, version and window size of an exported desktop app. */
36
+ export function tauriAppMetadata(document, app = {}) {
37
+ const name = productName(app.name);
38
+ const nameSlug = slug(name) || "game";
39
+ const identifier = app.identifier ?? `ai.nodetool.game.${/^[a-z]/.test(nameSlug) ? nameSlug : `game-${nameSlug}`}`;
40
+ if (!/^[A-Za-z][A-Za-z0-9-]*(\.[A-Za-z0-9-]+)+$/.test(identifier) || identifier.length > 128 || /\.app$/i.test(identifier)) {
41
+ throw new Error("App identifier must be reverse-DNS, such as com.example.mygame, and must not end in .app");
42
+ }
43
+ const version = app.version ?? DEFAULT_VERSION;
44
+ const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
45
+ // Windows MSI packages limit major and minor to 255 and patch to 65535.
46
+ if (!parts || Number(parts[1]) > 255 || Number(parts[2]) > 255 || Number(parts[3]) > 65535) {
47
+ throw new Error("App version must be MAJOR.MINOR.PATCH with major and minor at most 255 and patch at most 65535");
48
+ }
49
+ const width = windowSize(app.width, DEFAULT_WIDTH, MIN_WINDOW.width, "width");
50
+ const fallbackHeight = document.schemaVersion === 3
51
+ ? Math.min(MAX_WINDOW, Math.max(MIN_WINDOW.height, Math.round(width / document.presentation.aspectRatio)))
52
+ : DEFAULT_HEIGHT_2D;
53
+ const height = windowSize(app.height, fallbackHeight, MIN_WINDOW.height, "height");
54
+ const crateName = /^[a-z]/.test(nameSlug) ? nameSlug : `game-${nameSlug}`;
55
+ return { productName: name, identifier, version, crateName, width, height, sourceRevision: document.revision,
56
+ dimension: document.schemaVersion === 3 ? "3d" : "2d" };
57
+ }
58
+ function drawDefaultIcon(context, size) {
59
+ const radius = size * 0.22;
60
+ const gradient = context.createLinearGradient(0, 0, size, size);
61
+ gradient.addColorStop(0, "#5b8cff");
62
+ gradient.addColorStop(1, "#7a3cff");
63
+ context.fillStyle = gradient;
64
+ context.beginPath();
65
+ context.roundRect(0, 0, size, size, radius);
66
+ context.fill();
67
+ context.fillStyle = "#ffffff";
68
+ context.beginPath();
69
+ context.moveTo(size * 0.38, size * 0.28);
70
+ context.lineTo(size * 0.76, size * 0.5);
71
+ context.lineTo(size * 0.38, size * 0.72);
72
+ context.closePath();
73
+ context.fill();
74
+ }
75
+ async function renderIcons(sizes, source) {
76
+ const image = source ? await loadImage(Buffer.from(source)) : null;
77
+ if (image && (image.width < 1 || image.height < 1)) {
78
+ throw new Error("App icon image is empty");
79
+ }
80
+ const icons = new Map();
81
+ for (const size of sizes) {
82
+ const canvas = createCanvas(size, size);
83
+ const context = canvas.getContext("2d");
84
+ if (image) {
85
+ // Cover the square so a non-square icon is cropped rather than letterboxed.
86
+ const scale = Math.max(size / image.width, size / image.height);
87
+ const width = image.width * scale;
88
+ const height = image.height * scale;
89
+ context.imageSmoothingQuality = "high";
90
+ context.drawImage(image, (size - width) / 2, (size - height) / 2, width, height);
91
+ }
92
+ else {
93
+ drawDefaultIcon(context, size);
94
+ }
95
+ icons.set(size, { size, png: new Uint8Array(await canvas.encode("png")), rgba: context.getImageData(0, 0, size, size).data });
96
+ }
97
+ return icons;
98
+ }
99
+ /** Windows icon: 32-bit BMP entries for small sizes, PNG for 256. */
100
+ function encodeIco(icons) {
101
+ const images = icons.map((icon) => {
102
+ if (icon.size >= 256) {
103
+ return icon.png;
104
+ }
105
+ const { size, rgba } = icon;
106
+ const maskStride = Math.ceil(size / 32) * 4;
107
+ const bytes = new Uint8Array(40 + size * size * 4 + maskStride * size);
108
+ const view = new DataView(bytes.buffer);
109
+ view.setUint32(0, 40, true);
110
+ view.setInt32(4, size, true);
111
+ view.setInt32(8, size * 2, true);
112
+ view.setUint16(12, 1, true);
113
+ view.setUint16(14, 32, true);
114
+ view.setUint32(20, size * size * 4 + maskStride * size, true);
115
+ for (let y = 0; y < size; y += 1) {
116
+ const row = size - 1 - y;
117
+ for (let x = 0; x < size; x += 1) {
118
+ const from = (row * size + x) * 4;
119
+ const to = 40 + (y * size + x) * 4;
120
+ bytes[to] = rgba[from + 2] ?? 0;
121
+ bytes[to + 1] = rgba[from + 1] ?? 0;
122
+ bytes[to + 2] = rgba[from] ?? 0;
123
+ bytes[to + 3] = rgba[from + 3] ?? 0;
124
+ }
125
+ }
126
+ // The AND mask stays zero: the alpha channel carries transparency.
127
+ return bytes;
128
+ });
129
+ const header = new Uint8Array(6 + 16 * icons.length);
130
+ const view = new DataView(header.buffer);
131
+ view.setUint16(2, 1, true);
132
+ view.setUint16(4, icons.length, true);
133
+ let offset = header.length;
134
+ icons.forEach((icon, index) => {
135
+ const entry = 6 + index * 16;
136
+ header[entry] = icon.size >= 256 ? 0 : icon.size;
137
+ header[entry + 1] = icon.size >= 256 ? 0 : icon.size;
138
+ view.setUint16(entry + 4, 1, true);
139
+ view.setUint16(entry + 6, 32, true);
140
+ view.setUint32(entry + 8, images[index]?.length ?? 0, true);
141
+ view.setUint32(entry + 12, offset, true);
142
+ offset += images[index]?.length ?? 0;
143
+ });
144
+ return Buffer.concat([header, ...images]);
145
+ }
146
+ /** macOS icon: PNG payloads under the ic07 to ic10 element types. */
147
+ function encodeIcns(entries) {
148
+ const chunks = entries.map(([type, png]) => {
149
+ const head = Buffer.alloc(8);
150
+ head.write(type, 0, "ascii");
151
+ head.writeUInt32BE(png.length + 8, 4);
152
+ return Buffer.concat([head, png]);
153
+ });
154
+ const head = Buffer.alloc(8);
155
+ head.write("icns", 0, "ascii");
156
+ head.writeUInt32BE(8 + chunks.reduce((total, chunk) => total + chunk.length, 0), 4);
157
+ return Buffer.concat([head, ...chunks]);
158
+ }
159
+ const ICON_FILES = ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.png", "icons/icon.icns", "icons/icon.ico"];
160
+ /** Every icon file the Tauri bundler and window need, keyed by path under `src-tauri/`. */
161
+ export async function tauriIconFiles(source) {
162
+ const icons = await renderIcons([16, 32, 48, 128, 256, 512, 1024], source);
163
+ const icon = (size) => {
164
+ const rendered = icons.get(size);
165
+ if (!rendered) {
166
+ throw new Error(`Icon size ${size} was not rendered`);
167
+ }
168
+ return rendered;
169
+ };
170
+ return {
171
+ "icons/32x32.png": icon(32).png,
172
+ "icons/128x128.png": icon(128).png,
173
+ "icons/128x128@2x.png": icon(256).png,
174
+ "icons/icon.png": icon(512).png,
175
+ "icons/icon.icns": encodeIcns([["ic07", icon(128).png], ["ic08", icon(256).png], ["ic09", icon(512).png], ["ic10", icon(1024).png]]),
176
+ "icons/icon.ico": encodeIco([icon(16), icon(32), icon(48), icon(256)])
177
+ };
178
+ }
179
+ /** The text files of the Tauri project, keyed by path relative to the project root. */
180
+ export function tauriProjectFiles(metadata) {
181
+ const config = {
182
+ $schema: "https://schema.tauri.app/config/2",
183
+ productName: metadata.productName,
184
+ version: metadata.version,
185
+ identifier: metadata.identifier,
186
+ build: { frontendDist: "../dist" },
187
+ app: {
188
+ withGlobalTauri: false,
189
+ windows: [{
190
+ label: "main", title: metadata.productName, width: metadata.width, height: metadata.height,
191
+ minWidth: MIN_WINDOW.width, minHeight: MIN_WINDOW.height, center: true, resizable: true, focus: true,
192
+ // The player handles its own pointer and keyboard input, so file drops stay with the page.
193
+ dragDropEnabled: false
194
+ }],
195
+ // The player's index.html carries its own Content-Security-Policy meta tag.
196
+ security: { csp: null }
197
+ },
198
+ bundle: {
199
+ active: true,
200
+ targets: "all",
201
+ category: "Game",
202
+ shortDescription: metadata.productName,
203
+ icon: [...ICON_FILES]
204
+ }
205
+ };
206
+ const cargo = `[package]
207
+ name = ${JSON.stringify(metadata.crateName)}
208
+ version = ${JSON.stringify(metadata.version)}
209
+ description = ${JSON.stringify(`${metadata.productName}, exported from NodeTool`)}
210
+ edition = "2021"
211
+ publish = false
212
+
213
+ # Keeps the project standalone when it is unpacked inside another Cargo workspace.
214
+ [workspace]
215
+
216
+ [build-dependencies]
217
+ tauri-build = { version = "=${TAURI_VERSIONS.tauriBuild}", features = [] }
218
+
219
+ [dependencies]
220
+ tauri = { version = "=${TAURI_VERSIONS.tauri}", features = [] }
221
+
222
+ [features]
223
+ # Serve the bundled game from the app itself, so a plain \`cargo build --release\` runs standalone.
224
+ default = ["custom-protocol"]
225
+ custom-protocol = ["tauri/custom-protocol"]
226
+
227
+ [profile.release]
228
+ codegen-units = 1
229
+ lto = true
230
+ opt-level = "s"
231
+ panic = "abort"
232
+ strip = true
233
+ `;
234
+ const main = `// Hides the console window of a release build on Windows.
235
+ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
236
+
237
+ fn main() {
238
+ tauri::Builder::default()
239
+ .run(tauri::generate_context!())
240
+ .expect("error while running the game");
241
+ }
242
+ `;
243
+ const packageJson = {
244
+ name: metadata.crateName,
245
+ version: metadata.version,
246
+ private: true,
247
+ scripts: { tauri: "tauri", dev: "tauri dev", build: "tauri build" },
248
+ devDependencies: { "@tauri-apps/cli": TAURI_VERSIONS.cli }
249
+ };
250
+ const readme = `# ${metadata.productName}
251
+
252
+ A desktop build of a NodeTool ${metadata.dimension.toUpperCase()} game (revision \`${metadata.sourceRevision}\`), packaged with [Tauri](https://tauri.app) ${TAURI_VERSIONS.tauri}.
253
+
254
+ \`dist/\` holds the exported web player and its assets. \`src-tauri/\` is the native shell that opens it in a window.
255
+
256
+ ## Build
257
+
258
+ Install Rust and the Tauri system dependencies for your platform: https://v2.tauri.app/start/prerequisites/
259
+
260
+ Installers (\`.msi\`/\`.exe\` on Windows, \`.app\`/\`.dmg\` on macOS, \`.deb\`/\`.rpm\`/\`.AppImage\` on Linux):
261
+
262
+ \`\`\`sh
263
+ npm install
264
+ npm run build
265
+ \`\`\`
266
+
267
+ They are written to \`src-tauri/target/release/bundle/\`.
268
+
269
+ A single executable without an installer:
270
+
271
+ \`\`\`sh
272
+ cd src-tauri
273
+ cargo build --release
274
+ \`\`\`
275
+
276
+ It is written to \`src-tauri/target/release/${metadata.crateName}\` (\`.exe\` on Windows).
277
+
278
+ ## Change the app
279
+
280
+ The window size, title and identifier (\`${metadata.identifier}\`) are in \`src-tauri/tauri.conf.json\`. Replace the files in \`src-tauri/icons/\` to change the icon, or export again from NodeTool with a new icon.
281
+ `;
282
+ return {
283
+ "package.json": `${JSON.stringify(packageJson, null, 2)}\n`,
284
+ "README.md": readme,
285
+ ".gitignore": "node_modules/\n",
286
+ "src-tauri/Cargo.toml": cargo,
287
+ "src-tauri/build.rs": "fn main() {\n tauri_build::build()\n}\n",
288
+ "src-tauri/src/main.rs": main,
289
+ "src-tauri/tauri.conf.json": `${JSON.stringify(config, null, 2)}\n`,
290
+ "src-tauri/.gitignore": "/target/\n/gen/schemas\n"
291
+ };
292
+ }
293
+ /** Exports a game as a Tauri desktop project: the standalone web player plus a native shell around it. */
294
+ export async function buildTauriGameProject(options) {
295
+ options.signal?.throwIfAborted();
296
+ const metadata = tauriAppMetadata(options.document, options.app);
297
+ const icons = await tauriIconFiles(options.app?.icon);
298
+ const outputDir = resolve(options.outputDir);
299
+ await mkdir(dirname(outputDir), { recursive: true });
300
+ const staging = await mkdtemp(join(dirname(outputDir), ".nodetool-game-tauri-"));
301
+ try {
302
+ const webDir = join(staging, "dist");
303
+ if (options.document.schemaVersion === 3) {
304
+ const { buildStandaloneGame3D } = await import("./build3d.js");
305
+ await buildStandaloneGame3D({ document: options.document, outputDir: webDir, resolveAsset: options.resolveAsset, signal: options.signal });
306
+ }
307
+ else {
308
+ const { buildStandaloneGame } = await import("./build.js");
309
+ await buildStandaloneGame({ document: options.document, outputDir: webDir, resolveAsset: (assetId) => options.resolveAsset(assetId, options.signal) });
310
+ }
311
+ options.signal?.throwIfAborted();
312
+ const files = { ...tauriProjectFiles(metadata) };
313
+ for (const [path, bytes] of Object.entries(icons)) {
314
+ files[`src-tauri/${path}`] = bytes;
315
+ }
316
+ for (const [path, content] of Object.entries(files)) {
317
+ await mkdir(dirname(join(staging, path)), { recursive: true });
318
+ await writeFile(join(staging, path), content);
319
+ }
320
+ options.signal?.throwIfAborted();
321
+ let existing;
322
+ try {
323
+ existing = await readdir(outputDir);
324
+ }
325
+ catch (error) {
326
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") {
327
+ throw error;
328
+ }
329
+ }
330
+ if (existing && existing.length > 0) {
331
+ throw new Error(`Output directory is not empty: ${outputDir}`);
332
+ }
333
+ if (existing) {
334
+ await rmdir(outputDir);
335
+ }
336
+ await rename(staging, outputDir);
337
+ return { outputDir, webDir: join(outputDir, "dist"), tauriDir: join(outputDir, "src-tauri"), metadata };
338
+ }
339
+ catch (error) {
340
+ await rm(staging, { recursive: true, force: true });
341
+ throw error;
342
+ }
343
+ }
344
+ async function executable(path) {
345
+ try {
346
+ await access(path, constants.X_OK);
347
+ return true;
348
+ }
349
+ catch {
350
+ return false;
351
+ }
352
+ }
353
+ /**
354
+ * The cargo to run: the first on PATH, else rustup's. An app started from the
355
+ * macOS Finder or a Windows shortcut has no shell profile, so rustup's
356
+ * `~/.cargo/bin` is often installed but missing from PATH.
357
+ */
358
+ export async function findCargo(env = process.env, platform = process.platform) {
359
+ const name = platform === "win32" ? "cargo.exe" : "cargo";
360
+ const pathKey = Object.keys(env).find((key) => key.toUpperCase() === "PATH");
361
+ const directories = (pathKey ? env[pathKey] ?? "" : "").split(platform === "win32" ? ";" : delimiter).filter(Boolean);
362
+ const cargoHome = env["CARGO_HOME"] || join(env["HOME"] || env["USERPROFILE"] || homedir(), ".cargo");
363
+ for (const directory of [...directories, join(cargoHome, "bin")]) {
364
+ const candidate = join(directory, name);
365
+ if (await executable(candidate)) {
366
+ return candidate;
367
+ }
368
+ }
369
+ return null;
370
+ }
371
+ const MISSING_CARGO = "cargo was not found. Install Rust from the Package Manager, or from https://rustup.rs, to compile the desktop app.";
372
+ /** Compiles an exported project into a release executable with `cargo build --release`. */
373
+ export async function compileTauriGameProject(project, options = {}) {
374
+ const env = options.env ?? process.env;
375
+ const cargo = options.cargo ?? await findCargo(env);
376
+ if (!cargo) {
377
+ throw new MissingRuntimePackageError(MISSING_CARGO, "rust");
378
+ }
379
+ await new Promise((resolvePromise, reject) => {
380
+ const child = spawn(cargo, ["build", "--release"], { cwd: project.tauriDir, env, signal: options.signal,
381
+ stdio: ["ignore", "pipe", "pipe"] });
382
+ let tail = "";
383
+ const collect = (chunk) => {
384
+ const text = chunk.toString("utf8");
385
+ tail = (tail + text).slice(-4000);
386
+ options.onOutput?.(text);
387
+ };
388
+ child.stdout.on("data", collect);
389
+ child.stderr.on("data", collect);
390
+ child.on("error", (error) => {
391
+ reject("code" in error && error.code === "ENOENT" ? new MissingRuntimePackageError(MISSING_CARGO, "rust", { cause: error }) : error);
392
+ });
393
+ child.on("close", (code) => {
394
+ if (code === 0) {
395
+ resolvePromise();
396
+ }
397
+ else {
398
+ reject(new Error(`cargo build failed with exit code ${code}\n${tail}`));
399
+ }
400
+ });
401
+ });
402
+ const targetDir = env["CARGO_TARGET_DIR"] ? resolve(project.tauriDir, env["CARGO_TARGET_DIR"]) : join(project.tauriDir, "target");
403
+ const binaryName = process.platform === "win32" ? `${project.metadata.crateName}.exe` : project.metadata.crateName;
404
+ return { binaryPath: join(targetDir, "release", binaryName) };
405
+ }
406
+ //# sourceMappingURL=build-tauri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-tauri.js","sourceRoot":"","sources":["../src/build-tauri.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodetool-ai/game-renderer",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Native 2D and 3D rendering, capture and web export",
5
5
  "type": "module",
6
6
  "engines": {
@@ -19,14 +19,14 @@
19
19
  "dependencies": {
20
20
  "@jitl/quickjs-ng-wasmfile-release-sync": "0.31.0",
21
21
  "@napi-rs/canvas": "^0.1.65",
22
- "@nodetool-ai/game-runtime": "0.8.2",
23
- "@nodetool-ai/gpu": "0.8.2",
24
- "@nodetool-ai/protocol": "0.8.2",
22
+ "@nodetool-ai/game-runtime": "0.8.3",
23
+ "@nodetool-ai/gpu": "0.8.3",
24
+ "@nodetool-ai/protocol": "0.8.3",
25
25
  "esbuild": "^0.28.1",
26
26
  "three": "0.185.1",
27
27
  "typegpu": "^0.11.6",
28
28
  "zod": "^4.6.5",
29
- "@nodetool-ai/config": "0.8.2",
29
+ "@nodetool-ai/config": "0.8.3",
30
30
  "playwright": "1.60.0"
31
31
  },
32
32
  "devDependencies": {
@@ -83,6 +83,11 @@
83
83
  "types": "./dist/build3d.d.ts",
84
84
  "import": "./dist/build3d.js"
85
85
  },
86
+ "./build-tauri": {
87
+ "nodetool-dev": "./src/build-tauri.ts",
88
+ "types": "./dist/build-tauri.d.ts",
89
+ "import": "./dist/build-tauri.js"
90
+ },
86
91
  "./preparation3d": {
87
92
  "nodetool-dev": "./src/preparation3d.ts",
88
93
  "types": "./dist/preparation3d.d.ts",