fluidcad 0.0.32 → 0.0.34

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 (279) hide show
  1. package/README.md +3 -2
  2. package/bin/commands/init.js +55 -0
  3. package/bin/commands/mcp.js +33 -0
  4. package/bin/commands/serve.js +77 -0
  5. package/bin/fluidcad.js +15 -107
  6. package/lib/dist/common/scene-object.d.ts +4 -1
  7. package/lib/dist/common/scene-object.js +9 -2
  8. package/lib/dist/common/solid.d.ts +4 -1
  9. package/lib/dist/common/solid.js +13 -0
  10. package/lib/dist/core/2d/tarc.d.ts +20 -2
  11. package/lib/dist/core/2d/tarc.js +24 -0
  12. package/lib/dist/core/index.d.ts +2 -1
  13. package/lib/dist/core/index.js +1 -0
  14. package/lib/dist/core/interfaces.d.ts +107 -2
  15. package/lib/dist/core/load.d.ts +2 -2
  16. package/lib/dist/core/repeat.js +62 -46
  17. package/lib/dist/core/rib.d.ts +18 -0
  18. package/lib/dist/core/rib.js +37 -0
  19. package/lib/dist/features/2d/arc.d.ts +8 -2
  20. package/lib/dist/features/2d/arc.js +94 -17
  21. package/lib/dist/features/2d/back.js +3 -2
  22. package/lib/dist/features/2d/sketch.d.ts +4 -0
  23. package/lib/dist/features/2d/sketch.js +21 -0
  24. package/lib/dist/features/2d/tarc-constrained.d.ts +2 -0
  25. package/lib/dist/features/2d/tarc-constrained.js +8 -0
  26. package/lib/dist/features/2d/tarc-radius-to-object.d.ts +16 -0
  27. package/lib/dist/features/2d/tarc-radius-to-object.js +58 -0
  28. package/lib/dist/features/2d/tarc-to-object.d.ts +18 -0
  29. package/lib/dist/features/2d/tarc-to-object.js +66 -0
  30. package/lib/dist/features/2d/tarc-to-point-tangent.d.ts +2 -0
  31. package/lib/dist/features/2d/tarc-to-point-tangent.js +3 -0
  32. package/lib/dist/features/2d/tarc-to-point.d.ts +2 -0
  33. package/lib/dist/features/2d/tarc-to-point.js +3 -0
  34. package/lib/dist/features/2d/tarc-with-tangent.d.ts +2 -0
  35. package/lib/dist/features/2d/tarc-with-tangent.js +3 -0
  36. package/lib/dist/features/2d/tarc.d.ts +2 -0
  37. package/lib/dist/features/2d/tarc.js +3 -0
  38. package/lib/dist/features/extrude-base.d.ts +9 -0
  39. package/lib/dist/features/extrude-base.js +22 -0
  40. package/lib/dist/features/extrude-to-face.js +1 -5
  41. package/lib/dist/features/extrude-two-distances.js +1 -2
  42. package/lib/dist/features/extrude.js +1 -2
  43. package/lib/dist/features/load.d.ts +6 -0
  44. package/lib/dist/features/load.js +53 -1
  45. package/lib/dist/features/mirror-feature.d.ts +3 -2
  46. package/lib/dist/features/mirror-feature.js +1 -1
  47. package/lib/dist/features/repeat-circular.d.ts +3 -3
  48. package/lib/dist/features/repeat-circular.js +8 -1
  49. package/lib/dist/features/repeat-linear.d.ts +4 -2
  50. package/lib/dist/features/repeat-linear.js +10 -1
  51. package/lib/dist/features/repeat-matrix.d.ts +3 -1
  52. package/lib/dist/features/repeat-matrix.js +7 -2
  53. package/lib/dist/features/rib.d.ts +31 -0
  54. package/lib/dist/features/rib.js +321 -0
  55. package/lib/dist/features/select.d.ts +1 -0
  56. package/lib/dist/features/select.js +81 -10
  57. package/lib/dist/features/shell.d.ts +4 -1
  58. package/lib/dist/features/shell.js +14 -3
  59. package/lib/dist/filters/edge/belongs-to-face.d.ts +12 -9
  60. package/lib/dist/filters/edge/belongs-to-face.js +64 -15
  61. package/lib/dist/filters/filter-builder-base.d.ts +25 -0
  62. package/lib/dist/filters/filter-builder-base.js +47 -0
  63. package/lib/dist/filters/filter.js +39 -14
  64. package/lib/dist/filters/from-object.d.ts +4 -0
  65. package/lib/dist/filters/from-object.js +10 -0
  66. package/lib/dist/helpers/clone-transform.d.ts +2 -1
  67. package/lib/dist/helpers/scene-helpers.d.ts +1 -1
  68. package/lib/dist/helpers/scene-helpers.js +146 -12
  69. package/lib/dist/index.d.ts +7 -1
  70. package/lib/dist/index.js +3 -3
  71. package/lib/dist/io/file-import.d.ts +5 -1
  72. package/lib/dist/io/file-import.js +29 -18
  73. package/lib/dist/math/lazy-matrix.d.ts +31 -0
  74. package/lib/dist/math/lazy-matrix.js +66 -0
  75. package/lib/dist/oc/color-transfer.d.ts +19 -8
  76. package/lib/dist/oc/color-transfer.js +70 -12
  77. package/lib/dist/oc/constraints/constraint-solver-adaptor.d.ts +5 -0
  78. package/lib/dist/oc/constraints/constraint-solver-adaptor.js +16 -0
  79. package/lib/dist/oc/constraints/constraint-solver.d.ts +4 -0
  80. package/lib/dist/oc/constraints/curve/curve-constraint-solver.d.ts +4 -0
  81. package/lib/dist/oc/constraints/curve/curve-constraint-solver.js +3 -0
  82. package/lib/dist/oc/constraints/geometric/geometric-constraint-solver.d.ts +6 -1
  83. package/lib/dist/oc/constraints/geometric/geometric-constraint-solver.js +4 -0
  84. package/lib/dist/oc/constraints/geometric/tangent-arc-from-point-tangent.d.ts +8 -0
  85. package/lib/dist/oc/constraints/geometric/tangent-arc-from-point-tangent.js +111 -0
  86. package/lib/dist/oc/constraints/geometric/tangent-arc-radius-to-object.d.ts +8 -0
  87. package/lib/dist/oc/constraints/geometric/tangent-arc-radius-to-object.js +161 -0
  88. package/lib/dist/oc/extrude-ops.d.ts +2 -1
  89. package/lib/dist/oc/extrude-ops.js +51 -2
  90. package/lib/dist/oc/mesh.d.ts +9 -4
  91. package/lib/dist/oc/mesh.js +14 -13
  92. package/lib/dist/oc/rib-ops.d.ts +35 -0
  93. package/lib/dist/oc/rib-ops.js +619 -0
  94. package/lib/dist/oc/shell-ops.d.ts +2 -1
  95. package/lib/dist/oc/shell-ops.js +5 -2
  96. package/lib/dist/oc/topology-index.d.ts +6 -0
  97. package/lib/dist/oc/topology-index.js +36 -0
  98. package/lib/dist/rendering/mesh-builder.d.ts +3 -0
  99. package/lib/dist/rendering/mesh-builder.js +8 -4
  100. package/lib/dist/rendering/render-edge.d.ts +2 -1
  101. package/lib/dist/rendering/render-edge.js +2 -2
  102. package/lib/dist/rendering/render-face.d.ts +2 -1
  103. package/lib/dist/rendering/render-face.js +2 -2
  104. package/lib/dist/rendering/render-solid.d.ts +2 -1
  105. package/lib/dist/rendering/render-solid.js +3 -5
  106. package/lib/dist/rendering/render-wire.d.ts +2 -1
  107. package/lib/dist/rendering/render-wire.js +2 -2
  108. package/lib/dist/rendering/render.d.ts +4 -0
  109. package/lib/dist/rendering/render.js +50 -2
  110. package/lib/dist/rendering/scene-compare.js +3 -0
  111. package/lib/dist/rendering/scene.d.ts +1 -0
  112. package/lib/dist/rendering/scene.js +4 -0
  113. package/lib/dist/scene-manager.d.ts +4 -2
  114. package/lib/dist/scene-manager.js +12 -4
  115. package/lib/dist/tests/features/2d/arc.test.js +64 -0
  116. package/lib/dist/tests/features/2d/back.test.js +17 -1
  117. package/lib/dist/tests/features/2d/tarc.test.js +157 -0
  118. package/lib/dist/tests/features/color-lineage.test.js +18 -0
  119. package/lib/dist/tests/features/filter-positional.test.d.ts +1 -0
  120. package/lib/dist/tests/features/filter-positional.test.js +129 -0
  121. package/lib/dist/tests/features/repeat-user-repro.test.d.ts +1 -0
  122. package/lib/dist/tests/features/repeat-user-repro.test.js +60 -0
  123. package/lib/dist/tests/features/rib.test.d.ts +1 -0
  124. package/lib/dist/tests/features/rib.test.js +598 -0
  125. package/lib/dist/tests/features/shell.test.js +36 -0
  126. package/lib/dist/tests/global-setup.js +2 -1
  127. package/lib/dist/tests/helpers/extract-blocks.d.ts +9 -0
  128. package/lib/dist/tests/helpers/extract-blocks.js +56 -0
  129. package/lib/dist/tests/llm-docs-examples.test.d.ts +1 -0
  130. package/lib/dist/tests/llm-docs-examples.test.js +62 -0
  131. package/lib/dist/tests/scene-compare.test.d.ts +1 -0
  132. package/lib/dist/tests/scene-compare.test.js +77 -0
  133. package/lib/dist/tests/setup.js +2 -1
  134. package/lib/dist/tsconfig.tsbuildinfo +1 -1
  135. package/llm-docs/.coverage-allowlist.txt +9 -0
  136. package/llm-docs/api/arc.md +48 -0
  137. package/llm-docs/api/axis.md +42 -0
  138. package/llm-docs/api/bezier.md +42 -0
  139. package/llm-docs/api/booleans.md +44 -0
  140. package/llm-docs/api/chamfer.md +40 -0
  141. package/llm-docs/api/circle.md +36 -0
  142. package/llm-docs/api/color.md +34 -0
  143. package/llm-docs/api/connect.md +41 -0
  144. package/llm-docs/api/constraint-qualifiers.md +48 -0
  145. package/llm-docs/api/copy.md +63 -0
  146. package/llm-docs/api/cursor-lines.md +50 -0
  147. package/llm-docs/api/cursor-move.md +61 -0
  148. package/llm-docs/api/cut.md +55 -0
  149. package/llm-docs/api/draft.md +36 -0
  150. package/llm-docs/api/edge-filter.md +57 -0
  151. package/llm-docs/api/ellipse.md +34 -0
  152. package/llm-docs/api/extrude.md +74 -0
  153. package/llm-docs/api/face-filter.md +61 -0
  154. package/llm-docs/api/fillet.md +51 -0
  155. package/llm-docs/api/index.json +139 -0
  156. package/llm-docs/api/line.md +42 -0
  157. package/llm-docs/api/load.md +37 -0
  158. package/llm-docs/api/local.md +38 -0
  159. package/llm-docs/api/loft.md +37 -0
  160. package/llm-docs/api/mirror.md +44 -0
  161. package/llm-docs/api/offset.md +36 -0
  162. package/llm-docs/api/part.md +40 -0
  163. package/llm-docs/api/plane.md +44 -0
  164. package/llm-docs/api/polygon.md +37 -0
  165. package/llm-docs/api/primitive-solids.md +39 -0
  166. package/llm-docs/api/project-intersect.md +48 -0
  167. package/llm-docs/api/rect.md +48 -0
  168. package/llm-docs/api/remove.md +32 -0
  169. package/llm-docs/api/repeat.md +79 -0
  170. package/llm-docs/api/revolve.md +38 -0
  171. package/llm-docs/api/rib.md +40 -0
  172. package/llm-docs/api/rotate.md +37 -0
  173. package/llm-docs/api/select.md +41 -0
  174. package/llm-docs/api/shell.md +41 -0
  175. package/llm-docs/api/sketch.md +76 -0
  176. package/llm-docs/api/slot.md +36 -0
  177. package/llm-docs/api/split-trim.md +42 -0
  178. package/llm-docs/api/sweep.md +43 -0
  179. package/llm-docs/api/tarc.md +45 -0
  180. package/llm-docs/api/tcircle.md +38 -0
  181. package/llm-docs/api/tline.md +42 -0
  182. package/llm-docs/api/translate.md +40 -0
  183. package/llm-docs/api/types/aline.md +35 -0
  184. package/llm-docs/api/types/arc-angles.md +29 -0
  185. package/llm-docs/api/types/arc-points.md +48 -0
  186. package/llm-docs/api/types/axis-like.md +38 -0
  187. package/llm-docs/api/types/axis.md +21 -0
  188. package/llm-docs/api/types/boolean-operation.md +50 -0
  189. package/llm-docs/api/types/circular-repeat-options.md +31 -0
  190. package/llm-docs/api/types/common.md +32 -0
  191. package/llm-docs/api/types/cut.md +125 -0
  192. package/llm-docs/api/types/draft.md +21 -0
  193. package/llm-docs/api/types/extrudable-geometry.md +23 -0
  194. package/llm-docs/api/types/extrude.md +194 -0
  195. package/llm-docs/api/types/geometry.md +51 -0
  196. package/llm-docs/api/types/hline.md +35 -0
  197. package/llm-docs/api/types/linear-repeat-options.md +31 -0
  198. package/llm-docs/api/types/loft.md +154 -0
  199. package/llm-docs/api/types/mirror.md +35 -0
  200. package/llm-docs/api/types/offset.md +31 -0
  201. package/llm-docs/api/types/plane-like.md +35 -0
  202. package/llm-docs/api/types/plane-transform-options.md +29 -0
  203. package/llm-docs/api/types/plane.md +21 -0
  204. package/llm-docs/api/types/point-like.md +22 -0
  205. package/llm-docs/api/types/point2dlike.md +26 -0
  206. package/llm-docs/api/types/polygon.md +46 -0
  207. package/llm-docs/api/types/rect.md +128 -0
  208. package/llm-docs/api/types/revolve.md +102 -0
  209. package/llm-docs/api/types/rib.md +133 -0
  210. package/llm-docs/api/types/scene-object.md +33 -0
  211. package/llm-docs/api/types/select.md +21 -0
  212. package/llm-docs/api/types/shell.md +54 -0
  213. package/llm-docs/api/types/slot.md +43 -0
  214. package/llm-docs/api/types/sweep.md +189 -0
  215. package/llm-docs/api/types/tangent-arc-two-objects.md +46 -0
  216. package/llm-docs/api/types/transformable.md +93 -0
  217. package/llm-docs/api/types/trim.md +27 -0
  218. package/llm-docs/api/types/two-objects-tangent-line.md +46 -0
  219. package/llm-docs/api/types/vertex.md +17 -0
  220. package/llm-docs/api/types/vline.md +35 -0
  221. package/llm-docs/concepts/coordinate-system.md +45 -0
  222. package/llm-docs/concepts/history-and-rollback.md +40 -0
  223. package/llm-docs/concepts/last-selection.md +49 -0
  224. package/llm-docs/concepts/scene-graph.md +37 -0
  225. package/llm-docs/index.json +1750 -0
  226. package/mcp/dist/client.d.ts +64 -0
  227. package/mcp/dist/client.js +248 -0
  228. package/mcp/dist/discovery.d.ts +11 -0
  229. package/mcp/dist/discovery.js +78 -0
  230. package/mcp/dist/docs-index.d.ts +81 -0
  231. package/mcp/dist/docs-index.js +261 -0
  232. package/mcp/dist/resources.d.ts +4 -0
  233. package/mcp/dist/resources.js +115 -0
  234. package/mcp/dist/server.d.ts +12 -0
  235. package/mcp/dist/server.js +489 -0
  236. package/mcp/dist/tools/coordination.d.ts +9 -0
  237. package/mcp/dist/tools/coordination.js +46 -0
  238. package/mcp/dist/tools/docs.d.ts +66 -0
  239. package/mcp/dist/tools/docs.js +122 -0
  240. package/mcp/dist/tools/engine.d.ts +56 -0
  241. package/mcp/dist/tools/engine.js +145 -0
  242. package/mcp/dist/tools/inspection.d.ts +75 -0
  243. package/mcp/dist/tools/inspection.js +121 -0
  244. package/mcp/dist/tools/screenshot.d.ts +63 -0
  245. package/mcp/dist/tools/screenshot.js +263 -0
  246. package/mcp/dist/tools/source.d.ts +84 -0
  247. package/mcp/dist/tools/source.js +434 -0
  248. package/mcp/dist/tools/workspaces.d.ts +13 -0
  249. package/mcp/dist/tools/workspaces.js +33 -0
  250. package/mcp/dist/types.d.ts +18 -0
  251. package/mcp/dist/types.js +11 -0
  252. package/package.json +19 -5
  253. package/server/dist/code-editor.d.ts +36 -0
  254. package/server/dist/code-editor.js +8 -0
  255. package/server/dist/fluidcad-server.d.ts +50 -0
  256. package/server/dist/fluidcad-server.js +153 -1
  257. package/server/dist/global-registry.d.ts +30 -0
  258. package/server/dist/global-registry.js +126 -0
  259. package/server/dist/index.js +171 -26
  260. package/server/dist/instance-file.d.ts +31 -0
  261. package/server/dist/instance-file.js +73 -0
  262. package/server/dist/lint-fluid-js.d.ts +15 -0
  263. package/server/dist/lint-fluid-js.js +271 -0
  264. package/server/dist/routes/editor.d.ts +24 -0
  265. package/server/dist/routes/editor.js +44 -0
  266. package/server/dist/routes/export.d.ts +1 -1
  267. package/server/dist/routes/export.js +45 -8
  268. package/server/dist/routes/health.d.ts +7 -0
  269. package/server/dist/routes/health.js +14 -0
  270. package/server/dist/routes/lint.d.ts +10 -0
  271. package/server/dist/routes/lint.js +28 -0
  272. package/server/dist/routes/render.d.ts +33 -0
  273. package/server/dist/routes/render.js +34 -0
  274. package/server/dist/routes/scene.d.ts +5 -0
  275. package/server/dist/routes/scene.js +48 -0
  276. package/server/dist/routes/screenshot.js +68 -1
  277. package/server/dist/ws-protocol.d.ts +56 -2
  278. package/ui/dist/assets/{index-DMw0OYCF.js → index-BdqrMDRu.js} +30 -30
  279. package/ui/dist/index.html +1 -1
@@ -0,0 +1,56 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ const FENCE_RE = /^(\s*)```([A-Za-z0-9_.-]*)\s*$/;
4
+ const RUNNABLE_LANGS = new Set(["fluid.js", "fluid", "fluidjs"]);
5
+ function listMarkdown(dir) {
6
+ const out = [];
7
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
8
+ if (entry.name.startsWith(".") || entry.name.startsWith("_")) {
9
+ continue;
10
+ }
11
+ const full = path.join(dir, entry.name);
12
+ if (entry.isDirectory()) {
13
+ out.push(...listMarkdown(full));
14
+ }
15
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
16
+ out.push(full);
17
+ }
18
+ }
19
+ return out;
20
+ }
21
+ function extractFromFile(file, docsRoot) {
22
+ const text = fs.readFileSync(file, "utf8");
23
+ const lines = text.split("\n");
24
+ const rel = path.relative(docsRoot, file).split(path.sep).join("/");
25
+ const blocks = [];
26
+ let i = 0;
27
+ while (i < lines.length) {
28
+ const openMatch = lines[i].match(FENCE_RE);
29
+ if (!openMatch || !RUNNABLE_LANGS.has(openMatch[2])) {
30
+ i++;
31
+ continue;
32
+ }
33
+ const startLine = i + 2;
34
+ const body = [];
35
+ i++;
36
+ while (i < lines.length) {
37
+ const closeMatch = lines[i].match(FENCE_RE);
38
+ if (closeMatch && closeMatch[2] === "") {
39
+ break;
40
+ }
41
+ body.push(lines[i]);
42
+ i++;
43
+ }
44
+ blocks.push({ file: rel, line: startLine, block: body.join("\n") });
45
+ i++;
46
+ }
47
+ return blocks;
48
+ }
49
+ export function extractFluidJsBlocks(docsRootRel) {
50
+ const docsRoot = path.resolve(docsRootRel);
51
+ const blocks = [];
52
+ for (const file of listMarkdown(docsRoot).sort()) {
53
+ blocks.push(...extractFromFile(file, docsRoot));
54
+ }
55
+ return blocks;
56
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ // Runs every fluid.js fenced block in llm-docs/**/*.md against the real
2
+ // FluidCAD runtime and asserts the scene compiles and produces ≥1 rendered
3
+ // object. Catches three classes of doc rot:
4
+ //
5
+ // 1. Syntax errors in examples (renamed args, dropped commas, etc.).
6
+ // 2. API drift — an example calls a method that no longer exists.
7
+ // 3. Geometry-empty examples — the snippet runs but yields nothing visible,
8
+ // which usually means the user-facing intent broke.
9
+ //
10
+ // The runner reuses the global OCC init from global-setup.ts and the
11
+ // startScene/render plumbing from setup.ts, so it sits on the same OCC
12
+ // initialisation the rest of the test suite uses.
13
+ import { describe, it, expect } from "vitest";
14
+ import { setupOC, render } from "./setup.js";
15
+ import { extractFluidJsBlocks } from "./helpers/extract-blocks.js";
16
+ import * as core from "../core/index.js";
17
+ import * as filters from "../filters/index.js";
18
+ import * as constraints from "../features/2d/constraints/geometry-qualifier.js";
19
+ import * as math from "../math/index.js";
20
+ import { countShapes } from "./utils.js";
21
+ function buildGlobals() {
22
+ return {
23
+ ...core,
24
+ ...filters,
25
+ ...constraints,
26
+ ...math,
27
+ };
28
+ }
29
+ // Doc examples often show the `import { foo } from "fluidcad/..."` line a
30
+ // real user would write at the top of a .fluid.js file. The runner injects
31
+ // every public export as a Function() parameter, so those imports are dead
32
+ // weight here — and `new Function` can't parse them anyway. Strip them out
33
+ // before executing.
34
+ const IMPORT_LINE_RE = /^\s*import\s[\s\S]*?from\s+['"][^'"]+['"]\s*;?\s*$/gm;
35
+ function stripImports(block) {
36
+ return block.replace(IMPORT_LINE_RE, "");
37
+ }
38
+ function runBlock(block, file, line) {
39
+ const globals = buildGlobals();
40
+ const paramNames = Object.keys(globals);
41
+ const paramValues = paramNames.map((n) => globals[n]);
42
+ const wrapped = `"use strict";\n${stripImports(block)}\n//# sourceURL=llm-docs/${file}:${line}`;
43
+ const fn = new Function(...paramNames, wrapped);
44
+ fn(...paramValues);
45
+ }
46
+ const blocks = extractFluidJsBlocks("llm-docs");
47
+ describe("llm-docs fluid.js examples", () => {
48
+ setupOC();
49
+ if (blocks.length === 0) {
50
+ it("found at least one fluid.js block", () => {
51
+ expect(blocks.length).toBeGreaterThan(0);
52
+ });
53
+ return;
54
+ }
55
+ for (const { file, line, block } of blocks) {
56
+ it(`${file}:${line} compiles and produces ≥1 rendered object`, () => {
57
+ runBlock(block, file, line);
58
+ const scene = render();
59
+ expect(countShapes(scene)).toBeGreaterThan(0);
60
+ });
61
+ }
62
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { setupOC, render } from "./setup.js";
3
+ import { getSceneManager } from "../scene-manager.js";
4
+ import { SceneCompare } from "../rendering/scene-compare.js";
5
+ import sketch from "../core/sketch.js";
6
+ import extrude from "../core/extrude.js";
7
+ import { rect } from "../core/2d/index.js";
8
+ function findByType(objects, uniqueType) {
9
+ const found = objects.find(o => o.getUniqueType() === uniqueType);
10
+ if (!found) {
11
+ throw new Error(`No object with uniqueType ${uniqueType}`);
12
+ }
13
+ return found;
14
+ }
15
+ describe("SceneCompare id preservation", () => {
16
+ setupOC();
17
+ it("inherits ids on matched objects across re-renders", () => {
18
+ sketch("xy", () => {
19
+ rect(100, 50);
20
+ });
21
+ extrude(30);
22
+ render();
23
+ const previousScene = getSceneManager().currentScene;
24
+ const previousIds = previousScene.getSceneObjects().map(o => o.id);
25
+ const newScene = getSceneManager().startScene();
26
+ sketch("xy", () => {
27
+ rect(100, 50);
28
+ });
29
+ extrude(30);
30
+ SceneCompare.compare(previousScene, newScene);
31
+ const newIds = newScene.getSceneObjects().map(o => o.id);
32
+ expect(newIds).toEqual(previousIds);
33
+ });
34
+ it("inherits ids only up to the divergence point", () => {
35
+ sketch("xy", () => {
36
+ rect(100, 50);
37
+ });
38
+ extrude(30);
39
+ render();
40
+ const previousScene = getSceneManager().currentScene;
41
+ const previousSketchId = findByType(previousScene.getSceneObjects(), "sketch").id;
42
+ const previousExtrudeId = findByType(previousScene.getSceneObjects(), "extrude-by-distance").id;
43
+ const newScene = getSceneManager().startScene();
44
+ sketch("xy", () => {
45
+ rect(100, 50);
46
+ });
47
+ extrude(50);
48
+ const staleExtrudeId = findByType(newScene.getSceneObjects(), "extrude-by-distance").id;
49
+ SceneCompare.compare(previousScene, newScene);
50
+ const newSketchId = findByType(newScene.getSceneObjects(), "sketch").id;
51
+ const newExtrudeId = findByType(newScene.getSceneObjects(), "extrude-by-distance").id;
52
+ expect(newSketchId).toBe(previousSketchId);
53
+ expect(newExtrudeId).toBe(staleExtrudeId);
54
+ expect(newExtrudeId).not.toBe(previousExtrudeId);
55
+ });
56
+ it("keeps idMap consistent after id inheritance", () => {
57
+ sketch("xy", () => {
58
+ rect(100, 50);
59
+ });
60
+ extrude(30);
61
+ render();
62
+ const previousScene = getSceneManager().currentScene;
63
+ const previousSketchId = findByType(previousScene.getSceneObjects(), "sketch").id;
64
+ const newScene = getSceneManager().startScene();
65
+ sketch("xy", () => {
66
+ rect(100, 50);
67
+ });
68
+ extrude(30);
69
+ const newSketch = findByType(newScene.getSceneObjects(), "sketch");
70
+ const staleSketchId = newSketch.id;
71
+ SceneCompare.compare(previousScene, newScene);
72
+ expect(newScene.getSceneObjectById(previousSketchId)).toBe(newSketch);
73
+ if (staleSketchId !== previousSketchId) {
74
+ expect(newScene.getSceneObjectById(staleSketchId)).toBe(null);
75
+ }
76
+ });
77
+ });
@@ -1,7 +1,8 @@
1
1
  import { beforeEach } from "vitest";
2
2
  import { getSceneManager, getCurrentScene } from "../scene-manager.js";
3
3
  import { SceneRenderer } from "../rendering/render.js";
4
- const renderer = new SceneRenderer();
4
+ import { DEFAULT_MESH_CONFIG } from "../oc/mesh.js";
5
+ const renderer = new SceneRenderer(DEFAULT_MESH_CONFIG);
5
6
  export function setupOC() {
6
7
  beforeEach(() => {
7
8
  getSceneManager().startScene();