@playdrop/playdrop-cli 0.7.13 → 0.7.16

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.
Files changed (71) hide show
  1. package/config/client-meta.json +1 -1
  2. package/node_modules/@playdrop/ai-client/dist/index.js +461 -444
  3. package/node_modules/@playdrop/ai-client/package.json +1 -1
  4. package/node_modules/@playdrop/api-client/dist/client.js +903 -882
  5. package/node_modules/@playdrop/api-client/dist/core/errors.js +69 -45
  6. package/node_modules/@playdrop/api-client/dist/core/request.js +188 -159
  7. package/node_modules/@playdrop/api-client/dist/domains/admin.js +516 -491
  8. package/node_modules/@playdrop/api-client/dist/domains/ai.js +40 -14
  9. package/node_modules/@playdrop/api-client/dist/domains/apps.js +480 -462
  10. package/node_modules/@playdrop/api-client/dist/domains/asset-packs.js +439 -419
  11. package/node_modules/@playdrop/api-client/dist/domains/assets.js +696 -676
  12. package/node_modules/@playdrop/api-client/dist/domains/auth.js +346 -320
  13. package/node_modules/@playdrop/api-client/dist/domains/comments.js +124 -98
  14. package/node_modules/@playdrop/api-client/dist/domains/free-credits.js +91 -65
  15. package/node_modules/@playdrop/api-client/dist/domains/me.js +71 -45
  16. package/node_modules/@playdrop/api-client/dist/domains/payments.js +407 -386
  17. package/node_modules/@playdrop/api-client/dist/domains/player-meta.js +144 -118
  18. package/node_modules/@playdrop/api-client/dist/domains/search.js +117 -104
  19. package/node_modules/@playdrop/api-client/dist/domains/tags.js +188 -162
  20. package/node_modules/@playdrop/api-client/dist/index.js +993 -552
  21. package/node_modules/@playdrop/api-client/package.json +1 -1
  22. package/node_modules/@playdrop/boxel-three/dist/src/animations.js +84 -62
  23. package/node_modules/@playdrop/boxel-three/dist/src/builders.js +341 -308
  24. package/node_modules/@playdrop/boxel-three/dist/src/context.js +55 -29
  25. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.js +856 -858
  26. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.js +267 -261
  27. package/node_modules/@playdrop/boxel-three/dist/src/index.js +64 -15
  28. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.js +89 -63
  29. package/node_modules/@playdrop/boxel-three/dist/src/nodes.js +81 -56
  30. package/node_modules/@playdrop/boxel-three/dist/src/overlays.js +112 -86
  31. package/node_modules/@playdrop/boxel-three/dist/src/primitives.js +45 -17
  32. package/node_modules/@playdrop/boxel-three/dist/src/scene.js +160 -136
  33. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.js +582 -584
  34. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.js +123 -97
  35. package/node_modules/@playdrop/boxel-three/dist/src/textures.js +207 -182
  36. package/node_modules/@playdrop/boxel-three/dist/src/types.js +15 -1
  37. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.js +451 -425
  38. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.js +109 -84
  39. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.js +127 -106
  40. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.js +73 -51
  41. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +97 -79
  42. package/node_modules/@playdrop/boxel-three/dist/test/index.test.js +29 -7
  43. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +80 -60
  44. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.js +41 -19
  45. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.js +72 -50
  46. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.js +84 -62
  47. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +69 -47
  48. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.js +129 -109
  49. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.js +40 -18
  50. package/node_modules/@playdrop/boxel-three/package.json +1 -1
  51. package/node_modules/@playdrop/config/client-meta.json +1 -1
  52. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  53. package/node_modules/@playdrop/types/dist/api.js +289 -203
  54. package/node_modules/@playdrop/types/dist/app-capability-filters.js +112 -62
  55. package/node_modules/@playdrop/types/dist/app.js +91 -45
  56. package/node_modules/@playdrop/types/dist/asset-pack.js +37 -5
  57. package/node_modules/@playdrop/types/dist/asset-spec.js +170 -90
  58. package/node_modules/@playdrop/types/dist/asset.js +186 -108
  59. package/node_modules/@playdrop/types/dist/content-license.js +49 -15
  60. package/node_modules/@playdrop/types/dist/creator-public-image.js +60 -32
  61. package/node_modules/@playdrop/types/dist/ecs.js +102 -82
  62. package/node_modules/@playdrop/types/dist/engine-builtins.js +603 -573
  63. package/node_modules/@playdrop/types/dist/entity.js +63 -53
  64. package/node_modules/@playdrop/types/dist/graph.js +116 -80
  65. package/node_modules/@playdrop/types/dist/index.js +47 -20
  66. package/node_modules/@playdrop/types/dist/owned-assets.js +55 -33
  67. package/node_modules/@playdrop/types/dist/player-meta.js +151 -100
  68. package/node_modules/@playdrop/types/dist/realtime.js +27 -7
  69. package/node_modules/@playdrop/types/dist/version.js +182 -124
  70. package/node_modules/@playdrop/types/package.json +1 -1
  71. package/package.json +1 -1
@@ -1,86 +1,104 @@
1
1
  "use strict";
2
- import test from 'node:test';
3
- import assert from 'node:assert/strict';
4
- import * as THREE from 'three';
5
- import path from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import { readFile } from 'node:fs/promises';
8
- import { parseBoxel } from '@playdrop/boxel-core';
9
- import { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter.js';
10
- import { createBoxelSceneGraph, exportModelToGLB } from '../src/exporters/glb.js';
11
- const HERE = path.dirname(fileURLToPath(import.meta.url));
12
- const fixture = (...segments) => path.resolve(HERE, './fixtures', ...segments);
13
- if (typeof globalThis.FileReader === 'undefined') {
14
- class NodeFileReader {
15
- constructor() {
16
- this.onload = null;
17
- this.onloadend = null;
18
- this.onerror = null;
19
- this.onabort = null;
20
- this.result = null;
21
- }
22
- readAsDataURL(blob) {
23
- blob.arrayBuffer()
24
- .then(buffer => {
25
- const mime = blob.type || 'application/octet-stream';
26
- const base64 = Buffer.from(buffer).toString('base64');
27
- this.result = `data:${mime};base64,${base64}`;
28
- const event = { target: { result: this.result } };
29
- this.onload?.(event);
30
- this.onloadend?.(event);
31
- })
32
- .catch(error => {
33
- this.onerror?.(error);
34
- this.onloadend?.({ target: { result: null } });
35
- });
36
- }
37
- readAsArrayBuffer(blob) {
38
- blob.arrayBuffer()
39
- .then(buffer => {
40
- this.result = buffer;
41
- const event = { target: { result: this.result } };
42
- this.onload?.(event);
43
- this.onloadend?.(event);
44
- })
45
- .catch(error => {
46
- this.onerror?.(error);
47
- this.onloadend?.({ target: { result: null } });
48
- });
49
- }
50
- abort() {
51
- this.onabort?.(new Error('filereader_abort_not_supported'));
52
- }
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var import_node_test = __toESM(require("node:test"));
25
+ var import_strict = __toESM(require("node:assert/strict"));
26
+ var THREE = __toESM(require("three"));
27
+ var import_node_path = __toESM(require("node:path"));
28
+ var import_node_url = require("node:url");
29
+ var import_promises = require("node:fs/promises");
30
+ var import_boxel_core = require("@playdrop/boxel-core");
31
+ var import_GLTFExporter = require("three/examples/jsm/exporters/GLTFExporter.js");
32
+ var import_glb = require("../src/exporters/glb.js");
33
+ const import_meta = {};
34
+ const HERE = import_node_path.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
35
+ const fixture = (...segments) => import_node_path.default.resolve(HERE, "./fixtures", ...segments);
36
+ if (typeof globalThis.FileReader === "undefined") {
37
+ class NodeFileReader {
38
+ constructor() {
39
+ this.onload = null;
40
+ this.onloadend = null;
41
+ this.onerror = null;
42
+ this.onabort = null;
43
+ this.result = null;
53
44
  }
54
- globalThis.FileReader = NodeFileReader;
45
+ readAsDataURL(blob) {
46
+ blob.arrayBuffer().then((buffer) => {
47
+ const mime = blob.type || "application/octet-stream";
48
+ const base64 = Buffer.from(buffer).toString("base64");
49
+ this.result = `data:${mime};base64,${base64}`;
50
+ const event = { target: { result: this.result } };
51
+ this.onload?.(event);
52
+ this.onloadend?.(event);
53
+ }).catch((error) => {
54
+ this.onerror?.(error);
55
+ this.onloadend?.({ target: { result: null } });
56
+ });
57
+ }
58
+ readAsArrayBuffer(blob) {
59
+ blob.arrayBuffer().then((buffer) => {
60
+ this.result = buffer;
61
+ const event = { target: { result: this.result } };
62
+ this.onload?.(event);
63
+ this.onloadend?.(event);
64
+ }).catch((error) => {
65
+ this.onerror?.(error);
66
+ this.onloadend?.({ target: { result: null } });
67
+ });
68
+ }
69
+ abort() {
70
+ this.onabort?.(new Error("filereader_abort_not_supported"));
71
+ }
72
+ }
73
+ globalThis.FileReader = NodeFileReader;
55
74
  }
56
75
  async function loadEntity(relativePath) {
57
- const raw = await readFile(fixture(relativePath), 'utf-8');
58
- return parseBoxel(JSON.parse(raw));
76
+ const raw = await (0, import_promises.readFile)(fixture(relativePath), "utf-8");
77
+ return (0, import_boxel_core.parseBoxel)(JSON.parse(raw));
59
78
  }
60
- test('createBoxelSceneGraph skinned mode exposes skinned mesh and bones', async () => {
61
- const entity = await loadEntity('entity-connect.json');
62
- const graph = createBoxelSceneGraph({ THREE, model: entity, mode: 'skinned' });
63
- try {
64
- assert.ok(graph.root instanceof THREE.Object3D, 'root should be Object3D');
65
- const skinnedMesh = graph.root.children.find(child => child instanceof THREE.SkinnedMesh);
66
- assert.ok(skinnedMesh, 'skinned mesh missing from scene graph');
67
- const boneIds = Array.from(graph.nodeLookup.keys());
68
- assert.ok(boneIds.length > 0, 'expected bones in lookup');
69
- assert.ok(boneIds.some(id => id.toLowerCase().includes('chest')), 'expected Chest bone in lookup');
70
- assert.ok(graph.animations.every(entry => entry.clip instanceof THREE.AnimationClip), 'clips missing');
71
- }
72
- finally {
73
- graph.dispose();
74
- }
79
+ (0, import_node_test.default)("createBoxelSceneGraph skinned mode exposes skinned mesh and bones", async () => {
80
+ const entity = await loadEntity("entity-connect.json");
81
+ const graph = (0, import_glb.createBoxelSceneGraph)({ THREE, model: entity, mode: "skinned" });
82
+ try {
83
+ import_strict.default.ok(graph.root instanceof THREE.Object3D, "root should be Object3D");
84
+ const skinnedMesh = graph.root.children.find((child) => child instanceof THREE.SkinnedMesh);
85
+ import_strict.default.ok(skinnedMesh, "skinned mesh missing from scene graph");
86
+ const boneIds = Array.from(graph.nodeLookup.keys());
87
+ import_strict.default.ok(boneIds.length > 0, "expected bones in lookup");
88
+ import_strict.default.ok(boneIds.some((id) => id.toLowerCase().includes("chest")), "expected Chest bone in lookup");
89
+ import_strict.default.ok(graph.animations.every((entry) => entry.clip instanceof THREE.AnimationClip), "clips missing");
90
+ } finally {
91
+ graph.dispose();
92
+ }
75
93
  });
76
- test('exportModelToGLB supports skinned mode', async () => {
77
- const entity = await loadEntity('entity-connect.json');
78
- const blob = await exportModelToGLB({
79
- THREE,
80
- GLTFExporterCtor: GLTFExporter,
81
- model: entity,
82
- mode: 'skinned',
83
- });
84
- const buffer = Buffer.from(await blob.arrayBuffer());
85
- assert.ok(buffer.length > 0, 'skinned export should produce non-empty binary');
94
+ (0, import_node_test.default)("exportModelToGLB supports skinned mode", async () => {
95
+ const entity = await loadEntity("entity-connect.json");
96
+ const blob = await (0, import_glb.exportModelToGLB)({
97
+ THREE,
98
+ GLTFExporterCtor: import_GLTFExporter.GLTFExporter,
99
+ model: entity,
100
+ mode: "skinned"
101
+ });
102
+ const buffer = Buffer.from(await blob.arrayBuffer());
103
+ import_strict.default.ok(buffer.length > 0, "skinned export should produce non-empty binary");
86
104
  });
@@ -1,8 +1,30 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { createBoxelScene, createBoxelNodeScene, attachBoxelOverlays, } from '../src/index.js';
4
- test('boxel-three exposes renderer entry points', () => {
5
- assert.equal(typeof createBoxelScene, 'function');
6
- assert.equal(typeof createBoxelNodeScene, 'function');
7
- assert.equal(typeof attachBoxelOverlays, 'function');
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from === "object" || typeof from === "function") {
9
+ for (let key of __getOwnPropNames(from))
10
+ if (!__hasOwnProp.call(to, key) && key !== except)
11
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
+ }
13
+ return to;
14
+ };
15
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
+ // If the importer is in node compatibility mode or this is not an ESM
17
+ // file that has been converted to a CommonJS file using a Babel-
18
+ // compatible transform (i.e. "__esModule" has not been set), then set
19
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
+ mod
22
+ ));
23
+ var import_node_test = __toESM(require("node:test"));
24
+ var import_strict = __toESM(require("node:assert/strict"));
25
+ var import_src = require("../src/index.js");
26
+ (0, import_node_test.default)("boxel-three exposes renderer entry points", () => {
27
+ import_strict.default.equal(typeof import_src.createBoxelScene, "function");
28
+ import_strict.default.equal(typeof import_src.createBoxelNodeScene, "function");
29
+ import_strict.default.equal(typeof import_src.attachBoxelOverlays, "function");
8
30
  });
@@ -1,68 +1,88 @@
1
1
  "use strict";
2
- import test from 'node:test';
3
- import assert from 'node:assert/strict';
4
- import * as THREE from 'three';
5
- import path from 'node:path';
6
- import { fileURLToPath } from 'node:url';
7
- import { readFile } from 'node:fs/promises';
8
- import { parseBoxel } from '@playdrop/boxel-core';
9
- import { instantiateEntityObject3D, } from '../src/instantiate.js';
10
- const HERE = path.dirname(fileURLToPath(import.meta.url));
11
- const fixture = (...segments) => path.resolve(HERE, './fixtures', ...segments);
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var import_node_test = __toESM(require("node:test"));
25
+ var import_strict = __toESM(require("node:assert/strict"));
26
+ var THREE = __toESM(require("three"));
27
+ var import_node_path = __toESM(require("node:path"));
28
+ var import_node_url = require("node:url");
29
+ var import_promises = require("node:fs/promises");
30
+ var import_boxel_core = require("@playdrop/boxel-core");
31
+ var import_instantiate = require("../src/instantiate.js");
32
+ const import_meta = {};
33
+ const HERE = import_node_path.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
34
+ const fixture = (...segments) => import_node_path.default.resolve(HERE, "./fixtures", ...segments);
12
35
  async function loadEntity(relativePath) {
13
- const raw = await readFile(fixture(relativePath), 'utf-8');
14
- return parseBoxel(JSON.parse(raw));
36
+ const raw = await (0, import_promises.readFile)(fixture(relativePath), "utf-8");
37
+ return (0, import_boxel_core.parseBoxel)(JSON.parse(raw));
15
38
  }
16
39
  function dispose(result) {
17
- result.dispose();
40
+ result.dispose();
18
41
  }
19
- test('instantiateEntityObject3D hierarchy mode exposes group and node helpers', async () => {
20
- const entity = await loadEntity('entity-connect.json');
21
- const result = instantiateEntityObject3D({ THREE, entity, mode: 'hierarchy' });
22
- try {
23
- assert.equal(result.mode, 'hierarchy');
24
- assert.ok(result.object instanceof THREE.Group, 'hierarchy returns group');
25
- assert.ok(result.scene.root === result.object, 'group matches scene root');
26
- assert.ok(typeof result.findNode === 'function', 'findNode helper available');
27
- assert.ok(result.findNode(entity.geometry.root.id), 'root node resolves');
28
- let counted = 0;
29
- result.forEachNode(() => {
30
- counted += 1;
31
- });
32
- assert.equal(counted > 0, true, 'forEachNode iterates nodes');
33
- assert.ok(Array.isArray(result.clips), 'clips array present');
34
- }
35
- finally {
36
- dispose(result);
37
- }
42
+ (0, import_node_test.default)("instantiateEntityObject3D hierarchy mode exposes group and node helpers", async () => {
43
+ const entity = await loadEntity("entity-connect.json");
44
+ const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "hierarchy" });
45
+ try {
46
+ import_strict.default.equal(result.mode, "hierarchy");
47
+ import_strict.default.ok(result.object instanceof THREE.Group, "hierarchy returns group");
48
+ import_strict.default.ok(result.scene.root === result.object, "group matches scene root");
49
+ import_strict.default.ok(typeof result.findNode === "function", "findNode helper available");
50
+ import_strict.default.ok(result.findNode(entity.geometry.root.id), "root node resolves");
51
+ let counted = 0;
52
+ result.forEachNode(() => {
53
+ counted += 1;
54
+ });
55
+ import_strict.default.equal(counted > 0, true, "forEachNode iterates nodes");
56
+ import_strict.default.ok(Array.isArray(result.clips), "clips array present");
57
+ } finally {
58
+ dispose(result);
59
+ }
38
60
  });
39
- test('instantiateEntityObject3D merged mode returns a reusable group', async () => {
40
- const entity = await loadEntity('entity-connect.json');
41
- const result = instantiateEntityObject3D({ THREE, entity, mode: 'merged' });
42
- try {
43
- assert.equal(result.mode, 'merged');
44
- assert.ok(result.object instanceof THREE.Object3D, 'merged returns object3D');
45
- }
46
- finally {
47
- dispose(result);
48
- }
61
+ (0, import_node_test.default)("instantiateEntityObject3D merged mode returns a reusable group", async () => {
62
+ const entity = await loadEntity("entity-connect.json");
63
+ const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "merged" });
64
+ try {
65
+ import_strict.default.equal(result.mode, "merged");
66
+ import_strict.default.ok(result.object instanceof THREE.Object3D, "merged returns object3D");
67
+ } finally {
68
+ dispose(result);
69
+ }
49
70
  });
50
- test('instantiateEntityObject3D skinned mode returns skinned mesh and bone helpers', async () => {
51
- const entity = await loadEntity('entity-connect.json');
52
- const result = instantiateEntityObject3D({ THREE, entity, mode: 'skinned' });
53
- try {
54
- assert.equal(result.mode, 'skinned');
55
- assert.ok(result.object instanceof THREE.SkinnedMesh, 'skinned returns SkinnedMesh');
56
- assert.ok(result.skeleton instanceof THREE.Skeleton, 'skeleton available');
57
- assert.ok(result.findBone(entity.geometry.root.id), 'findBone resolves root');
58
- let boneCount = 0;
59
- result.forEachBone(() => {
60
- boneCount += 1;
61
- });
62
- assert.equal(boneCount > 0, true, 'forEachBone iterates bones');
63
- assert.ok(Array.isArray(result.clips), 'clips array present');
64
- }
65
- finally {
66
- dispose(result);
67
- }
71
+ (0, import_node_test.default)("instantiateEntityObject3D skinned mode returns skinned mesh and bone helpers", async () => {
72
+ const entity = await loadEntity("entity-connect.json");
73
+ const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "skinned" });
74
+ try {
75
+ import_strict.default.equal(result.mode, "skinned");
76
+ import_strict.default.ok(result.object instanceof THREE.SkinnedMesh, "skinned returns SkinnedMesh");
77
+ import_strict.default.ok(result.skeleton instanceof THREE.Skeleton, "skeleton available");
78
+ import_strict.default.ok(result.findBone(entity.geometry.root.id), "findBone resolves root");
79
+ let boneCount = 0;
80
+ result.forEachBone(() => {
81
+ boneCount += 1;
82
+ });
83
+ import_strict.default.equal(boneCount > 0, true, "forEachBone iterates bones");
84
+ import_strict.default.ok(Array.isArray(result.clips), "clips array present");
85
+ } finally {
86
+ dispose(result);
87
+ }
68
88
  });
@@ -1,20 +1,42 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import * as THREE from 'three';
4
- import { attachBoxelOverlays } from '../src/index.js';
5
- test('attachBoxelOverlays adds helpers and disposes cleanly', () => {
6
- const THREERef = THREE;
7
- const target = new THREERef.Object3D();
8
- target.userData.size = [1, 2, 3];
9
- target.userData.sockets = [
10
- [0.5, 1, 0],
11
- [-0.5, 0, 0],
12
- ];
13
- const handles = attachBoxelOverlays({ THREE: THREERef, target }, { origin: true, bounds: true, sockets: true, color: 0xff00ff, opacity: 0.5 });
14
- assert.ok(handles.origin, 'origin helper not attached');
15
- assert.ok(handles.bounds && handles.bounds.length === 1, 'bounds helper missing');
16
- assert.ok(handles.sockets && handles.sockets.length === 2, 'socket helpers missing');
17
- assert.strictEqual(target.children.includes(handles.origin), true);
18
- handles.dispose();
19
- assert.strictEqual(target.children.length, 0, 'helpers should be removed after dispose');
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from === "object" || typeof from === "function") {
9
+ for (let key of __getOwnPropNames(from))
10
+ if (!__hasOwnProp.call(to, key) && key !== except)
11
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
+ }
13
+ return to;
14
+ };
15
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
+ // If the importer is in node compatibility mode or this is not an ESM
17
+ // file that has been converted to a CommonJS file using a Babel-
18
+ // compatible transform (i.e. "__esModule" has not been set), then set
19
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
+ mod
22
+ ));
23
+ var import_node_test = __toESM(require("node:test"));
24
+ var import_strict = __toESM(require("node:assert/strict"));
25
+ var THREE = __toESM(require("three"));
26
+ var import_src = require("../src/index.js");
27
+ (0, import_node_test.default)("attachBoxelOverlays adds helpers and disposes cleanly", () => {
28
+ const THREERef = THREE;
29
+ const target = new THREERef.Object3D();
30
+ target.userData.size = [1, 2, 3];
31
+ target.userData.sockets = [
32
+ [0.5, 1, 0],
33
+ [-0.5, 0, 0]
34
+ ];
35
+ const handles = (0, import_src.attachBoxelOverlays)({ THREE: THREERef, target }, { origin: true, bounds: true, sockets: true, color: 16711935, opacity: 0.5 });
36
+ import_strict.default.ok(handles.origin, "origin helper not attached");
37
+ import_strict.default.ok(handles.bounds && handles.bounds.length === 1, "bounds helper missing");
38
+ import_strict.default.ok(handles.sockets && handles.sockets.length === 2, "socket helpers missing");
39
+ import_strict.default.strictEqual(target.children.includes(handles.origin), true);
40
+ handles.dispose();
41
+ import_strict.default.strictEqual(target.children.length, 0, "helpers should be removed after dispose");
20
42
  });
@@ -1,51 +1,73 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import * as THREE from 'three';
4
- import { createBoxelScene, createBoxelNodeScene } from '../src/index.js';
5
- test('createBoxelScene respects node filters and exposes reusable clips', () => {
6
- const entity = {
7
- id: 'filter-test',
8
- geometry: {
9
- id: 'geom',
10
- root: {
11
- id: 'Root',
12
- position: [0, 0, 0],
13
- children: [
14
- {
15
- id: 'Arm',
16
- position: [2, 0, 0],
17
- mesh: 'arm',
18
- children: [],
19
- },
20
- {
21
- id: 'Leg',
22
- position: [-2, 0, 0],
23
- mesh: 'leg',
24
- children: [],
25
- },
26
- ],
27
- },
28
- },
29
- primitives: [
30
- { id: 'arm', kind: 'plain_box', size: [1, 1, 1], material: 'mat' },
31
- { id: 'leg', kind: 'plain_box', size: [1, 1, 1], material: 'mat' },
32
- ],
33
- materials: [{ id: 'mat', baseColor: [255, 100, 100] }],
34
- textures: [],
35
- patterns: [],
36
- animations: [],
37
- };
38
- const full = createBoxelScene({ THREE, entity });
39
- assert.ok(full.nodes.has('Arm'));
40
- assert.ok(full.nodes.has('Leg'));
41
- const filtered = createBoxelScene({ THREE, entity }, { nodes: 'Arm' });
42
- assert.strictEqual(filtered.root.children.length, 1, 'filtered scene should include one limb');
43
- assert.ok(filtered.nodes.has('Arm'));
44
- assert.ok(!filtered.nodes.has('Leg'));
45
- const nodeScene = createBoxelNodeScene({ THREE, entity }, 'Leg');
46
- assert.strictEqual(nodeScene.nodes.size, 1, 'node scene should only contain requested limb');
47
- assert.ok(nodeScene.nodes.has('Leg'));
48
- full.dispose();
49
- filtered.dispose();
50
- nodeScene.dispose();
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from === "object" || typeof from === "function") {
9
+ for (let key of __getOwnPropNames(from))
10
+ if (!__hasOwnProp.call(to, key) && key !== except)
11
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
+ }
13
+ return to;
14
+ };
15
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
+ // If the importer is in node compatibility mode or this is not an ESM
17
+ // file that has been converted to a CommonJS file using a Babel-
18
+ // compatible transform (i.e. "__esModule" has not been set), then set
19
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
+ mod
22
+ ));
23
+ var import_node_test = __toESM(require("node:test"));
24
+ var import_strict = __toESM(require("node:assert/strict"));
25
+ var THREE = __toESM(require("three"));
26
+ var import_src = require("../src/index.js");
27
+ (0, import_node_test.default)("createBoxelScene respects node filters and exposes reusable clips", () => {
28
+ const entity = {
29
+ id: "filter-test",
30
+ geometry: {
31
+ id: "geom",
32
+ root: {
33
+ id: "Root",
34
+ position: [0, 0, 0],
35
+ children: [
36
+ {
37
+ id: "Arm",
38
+ position: [2, 0, 0],
39
+ mesh: "arm",
40
+ children: []
41
+ },
42
+ {
43
+ id: "Leg",
44
+ position: [-2, 0, 0],
45
+ mesh: "leg",
46
+ children: []
47
+ }
48
+ ]
49
+ }
50
+ },
51
+ primitives: [
52
+ { id: "arm", kind: "plain_box", size: [1, 1, 1], material: "mat" },
53
+ { id: "leg", kind: "plain_box", size: [1, 1, 1], material: "mat" }
54
+ ],
55
+ materials: [{ id: "mat", baseColor: [255, 100, 100] }],
56
+ textures: [],
57
+ patterns: [],
58
+ animations: []
59
+ };
60
+ const full = (0, import_src.createBoxelScene)({ THREE, entity });
61
+ import_strict.default.ok(full.nodes.has("Arm"));
62
+ import_strict.default.ok(full.nodes.has("Leg"));
63
+ const filtered = (0, import_src.createBoxelScene)({ THREE, entity }, { nodes: "Arm" });
64
+ import_strict.default.strictEqual(filtered.root.children.length, 1, "filtered scene should include one limb");
65
+ import_strict.default.ok(filtered.nodes.has("Arm"));
66
+ import_strict.default.ok(!filtered.nodes.has("Leg"));
67
+ const nodeScene = (0, import_src.createBoxelNodeScene)({ THREE, entity }, "Leg");
68
+ import_strict.default.strictEqual(nodeScene.nodes.size, 1, "node scene should only contain requested limb");
69
+ import_strict.default.ok(nodeScene.nodes.has("Leg"));
70
+ full.dispose();
71
+ filtered.dispose();
72
+ nodeScene.dispose();
51
73
  });