From b54fc534c2ec343a034bd9b6ca1bc9c5350c1d5e Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Mon, 17 Jun 2024 13:35:44 -0700 Subject: [PATCH] Patterning a pattern should always work (#2680) * patterning a pattern should alwayus work Signed-off-by: Jess Frazelle * add images; Signed-off-by: Jess Frazelle * std lib Signed-off-by: Jess Frazelle * bu,mp Signed-off-by: Jess Frazelle * fix tests Signed-off-by: Jess Frazelle * update lock Signed-off-by: Jess Frazelle * bump Signed-off-by: Jess Frazelle * fixes Signed-off-by: Jess Frazelle * fixes Signed-off-by: Jess Frazelle --------- Signed-off-by: Jess Frazelle --- docs/kcl/patternCircular2d.md | 8 +- docs/kcl/patternCircular3d.md | 8 +- docs/kcl/patternLinear3d.md | 8 +- docs/kcl/std.json | 6941 +++++++++++------ src-tauri/Cargo.lock | 1639 ++-- src-tauri/Cargo.toml | 2 +- src-tauri/tauri.conf.json | 11 +- src/wasm-lib/Cargo.lock | 2 +- src/wasm-lib/kcl/Cargo.toml | 2 +- src/wasm-lib/kcl/src/docs.rs | 5 +- src/wasm-lib/kcl/src/std/mod.rs | 49 +- src/wasm-lib/kcl/src/std/patterns.rs | 128 +- src/wasm-lib/tests/executor/main.rs | 50 + .../outputs/circular_pattern3d_a_pattern.png | Bin 0 -> 214180 bytes .../outputs/linear_pattern3d_a_pattern.png | Bin 0 -> 180619 bytes 15 files changed, 5970 insertions(+), 2883 deletions(-) create mode 100644 src/wasm-lib/tests/executor/outputs/circular_pattern3d_a_pattern.png create mode 100644 src/wasm-lib/tests/executor/outputs/linear_pattern3d_a_pattern.png diff --git a/docs/kcl/patternCircular2d.md b/docs/kcl/patternCircular2d.md index 530dba585..6586a619a 100644 --- a/docs/kcl/patternCircular2d.md +++ b/docs/kcl/patternCircular2d.md @@ -9,7 +9,7 @@ A circular pattern on a 2D sketch. ```js -patternCircular2d(data: CircularPattern2dData, sketch_group: SketchGroup) -> [SketchGroup] +patternCircular2d(data: CircularPattern2dData, sketch_group_set: SketchGroupSet) -> [SketchGroup] ``` ### Examples @@ -48,7 +48,7 @@ const example = extrude(1, exampleSketch) rotateDuplicates: string, } ``` -* `sketch_group`: `SketchGroup` - A sketch group is a collection of paths. (REQUIRED) +* `sketch_group_set`: `SketchGroupSet` - A sketch group or a group of sketch groups. (REQUIRED) ```js { // The plane id or face id of the sketch group. @@ -129,6 +129,7 @@ const example = extrude(1, exampleSketch) // The to point. to: [number, number], }, + type: "sketchGroup", // The paths in the sketch group. value: [{ // The from point. @@ -212,6 +213,9 @@ const example = extrude(1, exampleSketch) y: number, z: number, }, +} | +{ + type: "sketchGroups", } ``` diff --git a/docs/kcl/patternCircular3d.md b/docs/kcl/patternCircular3d.md index 6e1450bec..e6ab885ec 100644 --- a/docs/kcl/patternCircular3d.md +++ b/docs/kcl/patternCircular3d.md @@ -9,7 +9,7 @@ A circular pattern on a 3D model. ```js -patternCircular3d(data: CircularPattern3dData, extrude_group: ExtrudeGroup) -> [ExtrudeGroup] +patternCircular3d(data: CircularPattern3dData, extrude_group_set: ExtrudeGroupSet) -> [ExtrudeGroup] ``` ### Examples @@ -47,7 +47,7 @@ const example = extrude(-5, exampleSketch) rotateDuplicates: string, } ``` -* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED) +* `extrude_group_set`: `ExtrudeGroupSet` - A extrude group or a group of extrude groups. (REQUIRED) ```js { // The id of the extrusion end cap @@ -127,6 +127,7 @@ const example = extrude(-5, exampleSketch) }], // The id of the extrusion start cap startCapId: uuid, + type: "extrudeGroup", // The extrude surfaces. value: [{ // The face id for the extrude plane. @@ -176,6 +177,9 @@ const example = extrude(-5, exampleSketch) y: number, z: number, }, +} | +{ + type: "extrudeGroups", } ``` diff --git a/docs/kcl/patternLinear3d.md b/docs/kcl/patternLinear3d.md index 35bb8f67a..9482b54ac 100644 --- a/docs/kcl/patternLinear3d.md +++ b/docs/kcl/patternLinear3d.md @@ -9,7 +9,7 @@ A linear pattern on a 3D model. ```js -patternLinear3d(data: LinearPattern3dData, extrude_group: ExtrudeGroup) -> [ExtrudeGroup] +patternLinear3d(data: LinearPattern3dData, extrude_group_set: ExtrudeGroupSet) -> [ExtrudeGroup] ``` ### Examples @@ -45,7 +45,7 @@ const example = extrude(1, exampleSketch) repetitions: number, } ``` -* `extrude_group`: `ExtrudeGroup` - An extrude group is a collection of extrude surfaces. (REQUIRED) +* `extrude_group_set`: `ExtrudeGroupSet` - A extrude group or a group of extrude groups. (REQUIRED) ```js { // The id of the extrusion end cap @@ -125,6 +125,7 @@ const example = extrude(1, exampleSketch) }], // The id of the extrusion start cap startCapId: uuid, + type: "extrudeGroup", // The extrude surfaces. value: [{ // The face id for the extrude plane. @@ -174,6 +175,9 @@ const example = extrude(1, exampleSketch) y: number, z: number, }, +} | +{ + type: "extrudeGroups", } ``` diff --git a/docs/kcl/std.json b/docs/kcl/std.json index c52165e83..cb3234a09 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -44692,528 +44692,1365 @@ "required": true }, { - "name": "sketch_group", - "type": "SketchGroup", + "name": "sketch_group_set", + "type": "SketchGroupSet", "schema": { - "description": "A sketch group is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "position", - "rotation", - "start", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "entityId": { - "description": "The plane id or face id of the sketch group.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "id": { - "description": "The id of the sketch group.", - "type": "string", - "format": "uuid" - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - } - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "origin": { - "description": "Origin of the plane.", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "description": "A sketch group or a group of sketch groups.", + "oneOf": [ + { + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "value": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } + "maxItems": 2, + "minItems": 2 } } } }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "faceId", - "id", - "sketchGroupId", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } }, - "faceId": { - "description": "the face id the sketch is on", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "sketchGroupId": { - "description": "The original sketch group id of the object we are sketching on.", - "type": "string", - "format": "uuid" - }, - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", + { + "description": "A face.", "type": "object", "required": [ - "x", - "y", - "z" + "__meta", + "faceId", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" ], "properties": { - "x": { - "type": "number", - "format": "double" + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } }, - "y": { - "type": "number", - "format": "double" + "faceId": { + "description": "the face id the sketch is on", + "type": "string", + "format": "uuid" }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" }, - "y": { - "type": "number", - "format": "double" + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis (normal).", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" + "type": { + "type": "string", + "enum": [ + "face" + ] }, - "y": { - "type": "number", - "format": "double" + "value": { + "description": "The tag of the face.", + "type": "string" }, - "z": { - "type": "number", - "format": "double" + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } } } } - } - } - ] - }, - "position": { - "description": "The position of the sketch group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the sketch group base plane.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "start": { - "description": "The starting path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", "type": "object", "required": [ - "id", - "sourceRange" + "__geoMeta", + "from", + "name", + "to" ], "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "sourceRange": { - "description": "The source range.", + "from": { + "description": "The from point.", "type": "array", "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" }, "maxItems": 2, "minItems": 2 } } }, - "from": { - "description": "The from point.", + "type": { + "type": "string", + "enum": [ + "sketchGroup" + ] + }, + "value": { + "description": "The paths in the sketch group.", "type": "array", "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } }, - "name": { - "description": "The name of the path.", - "type": "string" + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } } } }, - "value": { - "description": "The paths in the sketch group.", - "type": "array", + { + "type": [ + "object", + "array" + ], "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "description": "A sketch group is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "position", + "rotation", + "start", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } + "maxItems": 2, + "minItems": 2 } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] } } }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", + "entityId": { + "description": "The plane id or face id of the sketch group.", + "type": "string", + "format": "uuid", + "nullable": true + }, + "id": { + "description": "The id of the sketch group.", + "type": "string", + "format": "uuid" + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "origin": { + "description": "Origin of the plane.", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "value": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "faceId", + "id", + "sketchGroupId", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "faceId": { + "description": "the face id the sketch is on", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "sketchGroupId": { + "description": "The original sketch group id of the object we are sketching on.", + "type": "string", + "format": "uuid" + }, + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis (normal).", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + } + } + } + ] + }, + "position": { + "description": "The position of the sketch group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the sketch group base plane.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "start": { + "description": "The starting path.", "type": "object", "required": [ "__geoMeta", - "ccw", - "center", "from", "name", - "to", - "type" + "to" ], "properties": { "__geoMeta": { @@ -45242,20 +46079,6 @@ } } }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, "from": { "description": "The from point.", "type": "array", @@ -45279,382 +46102,550 @@ }, "maxItems": 2, "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] } } }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "value": { + "description": "The paths in the sketch group.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "maxItems": 2, - "minItems": 2 + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } } } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } + ] } }, - { - "description": "A path that is horizontal.", + "xAxis": { + "description": "The x-axis of the sketch group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, "x": { - "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { "type": "number", "format": "double" } } }, - { - "description": "An angled line to.", + "yAxis": { + "description": "The y-axis of the sketch group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, "x": { - "description": "The x coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" }, "y": { - "description": "The y coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" + }, + "z": { + "type": "number", + "format": "double" } } }, - { - "description": "A base path.", + "zAxis": { + "description": "The z-axis of the sketch group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } + "x": { + "type": "number", + "format": "double" }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] + "z": { + "type": "number", + "format": "double" } } } - ] - } - }, - "xAxis": { - "description": "The x-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" } - } - }, - "yAxis": { - "description": "The y-axis of the sketch group base plane in the 3D space", - "type": "object", + }, "required": [ - "x", - "y", - "z" + "type" ], "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the sketch group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" + "type": { + "type": "string", + "enum": [ + "sketchGroups" + ] } } } - } + ] }, "required": true } @@ -46695,758 +47686,1538 @@ "required": true }, { - "name": "extrude_group", - "type": "ExtrudeGroup", + "name": "extrude_group_set", + "type": "ExtrudeGroupSet", "schema": { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "description": "A extrude group or a group of extrude groups.", + "oneOf": [ + { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeGroup" + ] + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "height": { - "description": "The height of the extrude group.", - "type": "number", - "format": "double" - }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" - }, - "position": { - "description": "The position of the extrude group.", - "type": "array", + { + "type": [ + "object", + "array" + ], "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } + "maxItems": 2, + "minItems": 2 } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] } } }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "maxItems": 2, - "minItems": 2 + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } } } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } + ] } }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" }, - "maxItems": 2, - "minItems": 2 + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } } } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } + ] } }, - { - "description": "A path that is horizontal.", + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, "x": { - "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { "type": "number", "format": "double" } } }, - { - "description": "An angled line to.", + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, "x": { - "description": "The x coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" }, "y": { - "description": "The y coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" + }, + "z": { + "type": "number", + "format": "double" } } }, - { - "description": "A base path.", + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } + "x": { + "type": "number", + "format": "double" }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] + "z": { + "type": "number", + "format": "double" } } } - ] - } - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", + }, "required": [ - "x", - "y", - "z" + "type" ], "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" + "type": { + "type": "string", + "enum": [ + "extrudeGroups" + ] } } } - } + ] }, "required": true } @@ -51238,758 +53009,1538 @@ "required": true }, { - "name": "extrude_group", - "type": "ExtrudeGroup", + "name": "extrude_group_set", + "type": "ExtrudeGroupSet", "schema": { - "description": "An extrude group is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "position", - "rotation", - "sketchGroupValues", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "description": "A extrude group or a group of extrude groups.", + "oneOf": [ + { + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + } + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } + } + } + ] + } + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "extrudeGroup" + ] + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } + } + } + ] + } + }, + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } } } } }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "height": { - "description": "The height of the extrude group.", - "type": "number", - "format": "double" - }, - "id": { - "description": "The id of the extrude group.", - "type": "string", - "format": "uuid" - }, - "position": { - "description": "The position of the extrude group.", - "type": "array", + { + "type": [ + "object", + "array" + ], "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation of the extrude group.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sketchGroupValues": { - "description": "The sketch group paths.", - "type": "array", - "items": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" + "description": "An extrude group is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "position", + "rotation", + "sketchGroupValues", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } + "maxItems": 2, + "minItems": 2 } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] } } }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "height": { + "description": "The height of the extrude group.", + "type": "number", + "format": "double" + }, + "id": { + "description": "The id of the extrude group.", + "type": "string", + "format": "uuid" + }, + "position": { + "description": "The position of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation of the extrude group.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sketchGroupValues": { + "description": "The sketch group paths.", + "type": "array", + "items": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } }, - "maxItems": 2, - "minItems": 2 + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type", + "x" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "name", + "to", + "type" + ], + "properties": { + "__geoMeta": { + "description": "Metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + } + } + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "name": { + "description": "The name of the path.", + "type": "string" + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "Base" + ] + } } } - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - } + ] } }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" - ], - "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" }, - "maxItems": 2, - "minItems": 2 + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "name", + "position", + "rotation", + "sourceRange", + "type" + ], + "properties": { + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "name": { + "description": "The name.", + "type": "string" + }, + "position": { + "description": "The position.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 3, + "minItems": 3 + }, + "rotation": { + "description": "The rotation.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 4, + "minItems": 4 + }, + "sourceRange": { + "description": "The source range.", + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + } } } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - } + ] } }, - { - "description": "A path that is horizontal.", + "xAxis": { + "description": "The x-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type", - "x" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, "x": { - "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { "type": "number", "format": "double" } } }, - { - "description": "An angled line to.", + "yAxis": { + "description": "The y-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, "x": { - "description": "The x coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" }, "y": { - "description": "The y coordinate.", "type": "number", - "format": "double", - "nullable": true + "format": "double" + }, + "z": { + "type": "number", + "format": "double" } } }, - { - "description": "A base path.", + "zAxis": { + "description": "The z-axis of the extrude group base plane in the 3D space", "type": "object", "required": [ - "__geoMeta", - "from", - "name", - "to", - "type" + "x", + "y", + "z" ], "properties": { - "__geoMeta": { - "description": "Metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - } - } + "x": { + "type": "number", + "format": "double" }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 + "y": { + "type": "number", + "format": "double" }, - "name": { - "description": "The name of the path.", - "type": "string" - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "Base" - ] + "z": { + "type": "number", + "format": "double" } } } - ] - } - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "name", - "position", - "rotation", - "sourceRange", - "type" - ], - "properties": { - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "name": { - "description": "The name.", - "type": "string" - }, - "position": { - "description": "The position.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3 - }, - "rotation": { - "description": "The rotation.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 4, - "minItems": 4 - }, - "sourceRange": { - "description": "The source range.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - } - } - } - ] - } - }, - "xAxis": { - "description": "The x-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" } - } - }, - "yAxis": { - "description": "The y-axis of the extrude group base plane in the 3D space", - "type": "object", + }, "required": [ - "x", - "y", - "z" + "type" ], "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "zAxis": { - "description": "The z-axis of the extrude group base plane in the 3D space", - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" + "type": { + "type": "string", + "enum": [ + "extrudeGroups" + ] } } } - } + ] }, "required": true } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 965e7f511..a87a694ac 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -27,24 +27,13 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - [[package]] name = "ahash" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -56,7 +45,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -121,47 +110,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -247,25 +237,24 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ - "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-channel" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d4d23bcc79e27423727b36823d86233aad06dfea531837b038394d11e9928" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.3.0", - "event-listener-strategy 0.5.1", + "event-listener-strategy", "futures-core", "pin-project-lite", ] @@ -288,9 +277,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ "async-lock", "cfg-if", @@ -307,20 +296,20 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener", + "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" -version = "2.2.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53fc6301894e04a92cb2584fedde80cb25ba8e02d9dc39d4a87d036e22f397d" +checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" dependencies = [ "async-channel", "async-io", @@ -329,7 +318,7 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.3.0", + "event-listener", "futures-lite", "rustix", "tracing", @@ -349,9 +338,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe66191c335039c7bb78f99dc7520b0cbb166b3a1cb33a03f53d8a1c6f2afda" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" dependencies = [ "async-io", "async-lock", @@ -367,9 +356,9 @@ dependencies = [ [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" @@ -430,15 +419,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -467,17 +456,11 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - [[package]] name = "bigdecimal" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9324c8014cd04590682b34f1e9448d38f0674d0f7b2dc553331016ef0e4e9ebc" +checksum = "51d712318a27c7150326677b321a5fa91b55f6d9034ffd67f20319e147d40cee" dependencies = [ "autocfg", "libm", @@ -539,36 +522,42 @@ dependencies = [ ] [[package]] -name = "blocking" -version = "1.5.1" +name = "block2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", - "fastrand", "futures-io", "futures-lite", "piper", - "tracing", ] [[package]] name = "borsh" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" dependencies = [ "borsh-derive", - "cfg_aliases 0.1.1", + "cfg_aliases 0.2.1", ] [[package]] name = "borsh-derive" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" dependencies = [ "once_cell", "proc-macro-crate 3.1.0", @@ -662,9 +651,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" [[package]] name = "byteorder" @@ -681,27 +670,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - [[package]] name = "cairo-rs" version = "0.18.5" @@ -729,9 +697,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] @@ -771,14 +739,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.95" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" [[package]] name = "cesu8" @@ -821,9 +784,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "cfg_aliases" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" @@ -840,21 +803,11 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" -version = "4.5.4" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", @@ -862,23 +815,23 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", "unicase", "unicode-width", ] [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -888,9 +841,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "cocoa" @@ -924,9 +877,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "colored" @@ -950,18 +903,32 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "tiny-keccak", +] [[package]] name = "convert_case" @@ -978,6 +945,34 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4934e6b7e8419148b6ef56950d277af8561060b56afd59e2aadf98b59fce6baa" +dependencies = [ + "cookie", + "idna 0.5.0", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1029,27 +1024,33 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-common" @@ -1100,9 +1101,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -1110,23 +1111,23 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", + "strsim", "syn 2.0.66", ] [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", @@ -1140,17 +1141,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "data-url" @@ -1191,17 +1192,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "derive-docs" version = "0.1.18" @@ -1230,15 +1220,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.66", ] [[package]] @@ -1249,7 +1239,15 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", - "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", ] [[package]] @@ -1262,6 +1260,18 @@ dependencies = [ "dirs-sys-next", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1322,6 +1332,15 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "dpi" version = "0.1.1" @@ -1339,9 +1358,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "dtoa-short" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" dependencies = [ "dtoa", ] @@ -1360,9 +1379,9 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "embed-resource" @@ -1401,9 +1420,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1411,9 +1430,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", @@ -1438,9 +1457,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1448,20 +1467,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1470,29 +1478,19 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" -dependencies = [ - "event-listener 5.3.0", + "event-listener", "pin-project-lite", ] [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fdeflate" @@ -1536,9 +1534,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1871,9 +1869,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1884,9 +1882,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gio" @@ -2087,15 +2085,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http 1.1.0", "indexmap 2.2.6", "slab", @@ -2115,9 +2113,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -2137,21 +2135,18 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - [[package]] name = "html5ever" version = "0.26.0" @@ -2211,12 +2206,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body 1.0.0", "pin-project-lite", @@ -2224,9 +2219,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -2236,9 +2231,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -2267,7 +2262,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "httparse", @@ -2286,34 +2281,35 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.28", - "rustls 0.21.11", + "hyper 0.14.29", + "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", ] [[package]] name = "hyper-rustls" -version = "0.26.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", "hyper 1.3.1", "hyper-util", - "rustls 0.22.4", + "rustls 0.23.10", "rustls-pki-types", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.0", "tower-service", + "webpki-roots 0.26.3", ] [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2362,12 +2358,140 @@ dependencies = [ "png", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.5.0" @@ -2378,6 +2502,18 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" +dependencies = [ + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -2396,7 +2532,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -2415,20 +2551,11 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", "js-sys", @@ -2461,6 +2588,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.12.1" @@ -2536,15 +2669,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.69" @@ -2556,19 +2680,18 @@ dependencies = [ [[package]] name = "json-patch" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" dependencies = [ "serde", "serde_json", "thiserror", - "treediff", ] [[package]] name = "kcl-lib" -version = "0.1.58" +version = "0.1.60" dependencies = [ "anyhow", "approx", @@ -2609,7 +2732,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "winnow 0.5.40", - "zip 2.1.1", + "zip", ] [[package]] @@ -2707,9 +2830,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libloading" @@ -2728,7 +2851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -2761,15 +2884,21 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2874,9 +3003,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -2917,9 +3046,9 @@ checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", "simd-adler32", @@ -2938,9 +3067,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.13.1" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f428b4e9db3d17e2f809dfb1ff9ddfbbf16c71790d1656d10aee320877e1392f" +checksum = "86b959f97c97044e4c96e32e1db292a7d594449546a3c6b77ae613dc3a5b5145" dependencies = [ "cocoa", "crossbeam-channel", @@ -3031,11 +3160,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -3057,9 +3185,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -3070,7 +3198,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -3112,7 +3240,7 @@ checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" dependencies = [ "base64 0.13.1", "chrono", - "getrandom 0.2.14", + "getrandom 0.2.15", "http 0.2.12", "rand 0.8.5", "reqwest 0.11.27", @@ -3145,6 +3273,106 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.5.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.5.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.5.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -3165,9 +3393,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -3186,9 +3414,9 @@ checksum = "44d11de466f4a3006fe8a5e7ec84e93b79c70cb992ae0aa0eb631ad2df8abfe2" [[package]] name = "open" -version = "5.1.2" +version = "5.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449f0ff855d85ddbf1edd5b646d65249ead3f5e422aaa86b7d2d0b049b103e32" +checksum = "b5ca541f22b1c46d4bb9801014f234758ab4297e7870b904b6a8415b980a7388" dependencies = [ "is-wsl", "libc", @@ -3220,6 +3448,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -3243,9 +3487,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" +checksum = "29d73ba8daf8fac13b0501d1abeddcfe21ba7401ada61a819144b6c2a4f32209" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3301,12 +3545,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] @@ -3325,15 +3569,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -3344,7 +3588,7 @@ checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" dependencies = [ "parse-display-derive", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -3356,40 +3600,17 @@ dependencies = [ "proc-macro2", "quote", "regex", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", "structmeta", "syn 2.0.66", ] -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -3585,9 +3806,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", "fastrand", @@ -3629,13 +3850,13 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645493cf344456ef24219d02a768cf1fb92ddf8c92161679ae3d91b91a637be3" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", "rustix", "tracing", @@ -3727,6 +3948,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3747,6 +3974,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "publicsuffix" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457" +dependencies = [ + "idna 0.3.0", + "psl-types", +] + [[package]] name = "quick-xml" version = "0.31.0" @@ -3756,6 +3993,53 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.10", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.23.10", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -3831,7 +4115,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -3860,9 +4144,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "raw-window-handle" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc3bcbdb1ddfc11e700e62968e6b4cc9c75bb466464ad28fb61c5b2c964418b" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "redox_syscall" @@ -3884,9 +4168,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ "bitflags 2.5.0", ] @@ -3897,21 +4181,21 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.3", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -3925,13 +4209,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] @@ -3954,9 +4238,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rend" @@ -3981,7 +4265,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.28", + "hyper 0.14.29", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -3991,12 +4275,12 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.11", + "rustls 0.21.12", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-rustls 0.24.1", @@ -4013,21 +4297,23 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64 0.22.1", "bytes", + "cookie", + "cookie_store", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.4", + "h2 0.4.5", "http 1.1.0", "http-body 1.0.0", "http-body-util", "hyper 1.3.1", - "hyper-rustls 0.26.0", + "hyper-rustls 0.27.2", "hyper-util", "ipnet", "js-sys", @@ -4036,16 +4322,17 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.22.4", + "quinn", + "rustls 0.23.10", "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "system-configuration", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.0", "tokio-util", "tower-service", "url", @@ -4053,7 +4340,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.1", + "webpki-roots 0.26.3", "winreg 0.52.0", ] @@ -4094,9 +4381,9 @@ dependencies = [ "async-trait", "chrono", "futures", - "getrandom 0.2.14", + "getrandom 0.2.15", "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.29", "parking_lot 0.11.2", "reqwest 0.11.27", "reqwest-middleware", @@ -4115,7 +4402,7 @@ checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683" dependencies = [ "anyhow", "async-trait", - "getrandom 0.2.14", + "getrandom 0.2.15", "matchit", "opentelemetry", "reqwest 0.11.27", @@ -4153,7 +4440,7 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -4168,7 +4455,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -4214,6 +4501,17 @@ dependencies = [ "str_indices", ] +[[package]] +name = "rust-ini" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d625ed57d8f49af6cfa514c42e1a71fadcff60eb0b1c517ff82fe41aa025b41" +dependencies = [ + "cfg-if", + "ordered-multimap", + "trim-in-place", +] + [[package]] name = "rust_decimal" version = "1.35.0" @@ -4232,9 +4530,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" @@ -4260,9 +4564,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.11" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -4272,27 +4576,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.102.3", + "rustls-webpki 0.102.4", "subtle", "zeroize", ] @@ -4331,9 +4622,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb461507cee2c2ff151784c52762cf4d9ff6a61f3e80968600ed24fa837fa54" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" @@ -4347,9 +4638,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.3" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -4358,15 +4649,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -4388,9 +4679,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.17" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55c82c700538496bdc329bb4918a81f87cc8888811bd123cf325a0f2f8d309" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" dependencies = [ "bigdecimal", "bytes", @@ -4406,9 +4697,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.17" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83263746fe5e32097f06356968a077f96089739c927a61450efa069905eec108" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", "quote", @@ -4446,11 +4737,11 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "core-foundation", "core-foundation-sys", "libc", @@ -4459,9 +4750,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -4489,9 +4780,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] @@ -4527,9 +4818,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330f01ce65a3a5fe59a60c82f3c9a024b573b8a6e875bd233fe5f934e71d54e3" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", @@ -4538,9 +4829,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "indexmap 2.2.6", "itoa 1.0.11", @@ -4580,9 +4871,9 @@ dependencies = [ [[package]] name = "serde_tokenstream" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a00ffd23fd882d096f09fcaae2a9de8329a328628e86027e049ee051dc1621f" +checksum = "8790a7c3fe883e443eaa2af6f705952bc5d6e8671a220b9335c8cae92c037e74" dependencies = [ "proc-macro2", "quote", @@ -4604,11 +4895,11 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee80b0e361bbf88fd2f6e242ccd19cfda072cb0faa6ae694ecee08199938569a" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", @@ -4622,9 +4913,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.7.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6561dc161a9224638a31d876ccdfefbc1df91d3f3a8342eddb35f055d48c7655" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", @@ -4761,9 +5052,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4771,20 +5062,22 @@ dependencies = [ [[package]] name = "softbuffer" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61d5d17f23326fe0d9b0af282f73f3af666699420fd5f42629efd9c6e7dc166f" +checksum = "2ae0d2e93c874cca74fe830bccbd1132299318932d273d2a3c77ad77476a3d7e" dependencies = [ "bytemuck", - "cfg_aliases 0.2.0", - "cocoa", + "cfg_aliases 0.2.1", "core-graphics", "foreign-types", "js-sys", "log", - "objc", - "raw-window-handle 0.6.1", - "redox_syscall 0.5.1", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle 0.6.2", + "redox_syscall 0.5.2", "wasm-bindgen", "wayland-sys", "web-sys", @@ -4858,7 +5151,7 @@ checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" dependencies = [ "new_debug_unreachable", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -4876,12 +5169,6 @@ dependencies = [ "quote", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4913,20 +5200,20 @@ dependencies = [ [[package]] name = "strum" -version = "0.25.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "rustversion", @@ -4990,6 +5277,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "synstructure" version = "0.13.1" @@ -5046,9 +5339,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.27.1" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92bcf8885e147b56d6e26751263b45876284f32ca404703f6d3b8f80d16ff4dd" +checksum = "ea538df05fbc2dcbbd740ba0cfe8607688535f4798d213cbbfa13ce494f3451f" dependencies = [ "bitflags 2.5.0", "cocoa", @@ -5071,14 +5364,14 @@ dependencies = [ "ndk-sys", "objc", "once_cell", - "parking_lot 0.12.1", - "raw-window-handle 0.6.1", + "parking_lot 0.12.3", + "raw-window-handle 0.6.2", "scopeguard", "tao-macros", "unicode-segmentation", "url", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.57.0", + "windows-core 0.57.0", "windows-version", "x11-dl", ] @@ -5102,9 +5395,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -5128,9 +5421,9 @@ dependencies = [ [[package]] name = "tauri" -version = "2.0.0-beta.17" +version = "2.0.0-beta.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fedd5490eddf117253945f0baedafded43474c971cba546a818f527d5c26266" +checksum = "5a258ecc5ac7ddade525f512c4962fd01cd0f5265e917b4572579c32c027bb31" dependencies = [ "anyhow", "bytes", @@ -5139,7 +5432,7 @@ dependencies = [ "dunce", "embed_plist", "futures-util", - "getrandom 0.2.14", + "getrandom 0.2.15", "glob", "gtk", "heck 0.5.0", @@ -5151,8 +5444,8 @@ dependencies = [ "muda", "objc", "percent-encoding", - "raw-window-handle 0.6.1", - "reqwest 0.12.4", + "raw-window-handle 0.6.2", + "reqwest 0.12.5", "serde", "serde_json", "serde_repr", @@ -5177,9 +5470,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.0-beta.13" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abcf98a9b4527567c3e5ca9723431d121e001c2145651b3fa044d22b5e025a7e" +checksum = "82b964bb6d03d97e24e12f896aab463b02a3c2ff76a60f728cc37b5548eb470e" dependencies = [ "anyhow", "cargo_toml", @@ -5199,9 +5492,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-beta.13" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b383f341efb803852b0235a2f330ca90c4c113f422dd6d646b888685b372cace" +checksum = "3529cfa977ed7c097f2a5e8da19ecffbe61982450a6c819e6165b6d0cfd3dd3a" dependencies = [ "base64 0.22.1", "brotli", @@ -5226,11 +5519,11 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.0-beta.13" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71be71718cfe48b149507157bfbad0e2ba0e98ea51658be26c7c677eb188fb0c" +checksum = "36f97dd80334f29314aa5f40b5fad10cb9feffd08e5a5324fd728613841e5d33" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 2.0.66", @@ -5240,9 +5533,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.0-beta.13" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6baaee0a083db1e04a1b7a3b0670d86a4d95dd2a54e7cbfb5547762b8ed098d9" +checksum = "7c8385fd0a4f661f5652b0d9e2d7256187d553bb174f88564d10ebcfa6a3af53" dependencies = [ "anyhow", "glob", @@ -5257,9 +5550,9 @@ dependencies = [ [[package]] name = "tauri-plugin-cli" -version = "2.0.0-beta.3" +version = "2.0.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b079f01e923f7d3bf175e8d31b18861e6580f4b57ce0fdc16fbf69f9acd158c" +checksum = "f0ca2caaa1fecce000c808e98cbfb1f3a810e3c5cef9a155ee44354c63b55fa0" dependencies = [ "clap", "log", @@ -5272,28 +5565,33 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" -version = "2.0.0-beta.3" +version = "2.0.0-beta.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1aee2af6aec05ace816d46da0b0c0bdb4fcd0c985c0f14634a50c860824435" +checksum = "3bfc538a38845f08c7a63acd9e03737b5e89c815273ed8e2a447780a4e2583f4" dependencies = [ + "dunce", "log", + "rust-ini", "serde", "serde_json", "tauri", "tauri-plugin", + "tauri-utils", "thiserror", "url", + "windows-registry", + "windows-result", ] [[package]] name = "tauri-plugin-dialog" -version = "2.0.0-beta.6" +version = "2.0.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87caf6f2b704b0d27b4c64ef1fdd1f6ef97e2f5293216e230ad1efe61de54131" +checksum = "fed4b22c59f7b04ae2a0bed8241aa715b41973c3f042c84aa67a1f4dc0174a8d" dependencies = [ "dunce", "log", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "rfd", "serde", "serde_json", @@ -5305,9 +5603,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.0.0-beta.7" +version = "2.0.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35377195c6923beda5f29482a16b492d431de964389fca9aaf81a0f7e908023f" +checksum = "3aa91955751f329e0aa431b87c199b7378b6f91ec0765d2ad9d4c64e017c3cda" dependencies = [ "anyhow", "glob", @@ -5324,14 +5622,14 @@ dependencies = [ [[package]] name = "tauri-plugin-http" -version = "2.0.0-beta.6" +version = "2.0.0-beta.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c32962a2e2141b3bc034e5c04f363635965e59435794b6bdcf97a027f0925a" +checksum = "8bf3c02f09bb81c8c4bec73991148aebaab099f6d00c04486ad8fc2c92384f22" dependencies = [ "data-url", "http 1.1.0", "regex", - "reqwest 0.12.4", + "reqwest 0.12.5", "schemars", "serde", "serde_json", @@ -5345,9 +5643,9 @@ dependencies = [ [[package]] name = "tauri-plugin-log" -version = "2.0.0-beta.4" +version = "2.0.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97718db0d981b03b7b1257c22f699ff46639220c5acb4510ac9696437afc93f8" +checksum = "28be50bb36ac6b5181a360cee0606a4364d9e0bdcdd8974c40710d7af12e60ec" dependencies = [ "android_logger", "byte-unit", @@ -5366,9 +5664,9 @@ dependencies = [ [[package]] name = "tauri-plugin-os" -version = "2.0.0-beta.3" +version = "2.0.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dc0a2037ef113d9d9db85edceab6f95f83ae111e4d989d6bc1df79c8ab4cf" +checksum = "b9ae3c8aeb113ce614cc36a43b1061fdf64381f7635d02c390052ce7579ec628" dependencies = [ "gethostname", "log", @@ -5384,9 +5682,9 @@ dependencies = [ [[package]] name = "tauri-plugin-persisted-scope" -version = "2.0.0-beta.7" +version = "2.0.0-beta.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b600c870217ec082b0f3482935a8edad347d18e8cd7d422a74bc92d035c0e394" +checksum = "e8a4bcb19c71bca76e830471d0594245dad0028ccc8c24a1a146cdc74073274f" dependencies = [ "aho-corasick", "bincode", @@ -5400,9 +5698,9 @@ dependencies = [ [[package]] name = "tauri-plugin-process" -version = "2.0.0-beta.3" +version = "2.0.0-beta.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11215c3615299090e97f37341ae4b01f518bc1d43e9c4391144c0e5e3b7d4f01" +checksum = "e63250e666101a12b206e15d9c3c1f061e2be94a1659ee13fa3fda8fceba28e5" dependencies = [ "tauri", "tauri-plugin", @@ -5410,9 +5708,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.0.0-beta.3" +version = "2.0.0-beta.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5624537650f627707f3bd9c6562efe2116c7fb043fcfc2e3d10f802d7870a1cd" +checksum = "f8675bf7ab71f571a99192d0685ae870eb7af1264bdbbb66a1d655609f6c7ebd" dependencies = [ "encoding_rs", "log", @@ -5426,21 +5724,23 @@ dependencies = [ "tauri", "tauri-plugin", "thiserror", + "tokio", ] [[package]] name = "tauri-plugin-updater" -version = "2.0.0-beta.4" +version = "2.0.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f34be6851c7e84ca99b3bddd57e033d55d8bfca1dd153d6e8d18e9f1fb95469" +checksum = "d94c93d9aaf83b0589bbec467a1f591ed1991478d5150da48b6c42cb778a88d5" dependencies = [ "base64 0.22.1", "dirs-next", "flate2", "futures-util", "http 1.1.0", + "infer", "minisign-verify", - "reqwest 0.12.4", + "reqwest 0.12.5", "semver", "serde", "serde_json", @@ -5453,20 +5753,20 @@ dependencies = [ "tokio", "url", "windows-sys 0.52.0", - "zip 0.6.6", + "zip", ] [[package]] name = "tauri-runtime" -version = "2.0.0-beta.14" +version = "2.0.0-beta.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "148b6e6aff8e63fe5d4ae1d50159d50cfc0b4309abdeca64833c887c6b5631ef" +checksum = "d7dc96172a43536236ab55b7da7b8461bf75810985e668589e2395cb476937cb" dependencies = [ "dpi", "gtk", "http 1.1.0", "jni", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "serde", "serde_json", "tauri-utils", @@ -5477,9 +5777,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.0.0-beta.14" +version = "2.0.0-beta.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "398d065c6e0fbf3c4304583759b6e153bc1e0daeb033bede6834ebe4df371fc3" +checksum = "5d4fd913b1f14a9b618c7f3ae35656d3aa759767fcb95b72006357c12b9d0b09" dependencies = [ "cocoa", "gtk", @@ -5487,7 +5787,7 @@ dependencies = [ "jni", "log", "percent-encoding", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "softbuffer", "tao", "tauri-runtime", @@ -5501,16 +5801,15 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.0.0-beta.13" +version = "2.0.0-beta.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4709765385f035338ecc330f3fba753b8ee283c659c235da9768949cdb25469" +checksum = "4f24a9c20d676a3f025331cc1c3841256ba88c9f25fb7fae709d2b3089c50d90" dependencies = [ "brotli", "cargo_metadata", "ctor", "dunce", "glob", - "heck 0.5.0", "html5ever", "infer", "json-patch", @@ -5645,6 +5944,25 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -5671,7 +5989,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", "socket2", @@ -5697,18 +6015,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.11", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", + "rustls 0.21.12", "tokio", ] @@ -5718,20 +6025,20 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.7", + "rustls 0.23.10", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-tungstenite" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "becd34a233e7e31a3dbf7c7241b38320f57393dcae8e7324b0167d21b8e320b0" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" dependencies = [ "futures-util", "log", - "rustls 0.23.7", + "rustls 0.23.10", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -5741,16 +6048,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5831,7 +6137,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.6", + "winnow 0.6.13", ] [[package]] @@ -5847,7 +6153,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -5903,7 +6208,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5986,14 +6290,14 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.13.4" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97ec55956c54569e74209ae9d29a7a79193b252d17a6ac28bcffd4c11a384ad" +checksum = "3ad8319cca93189ea9ab1b290de0595960529750b6b8b501a399ed1ec3775d60" dependencies = [ "cocoa", "core-graphics", "crossbeam-channel", - "dirs-next", + "dirs", "libappindicator", "muda", "objc", @@ -6005,13 +6309,10 @@ dependencies = [ ] [[package]] -name = "treediff" -version = "4.0.3" +name = "trim-in-place" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" -dependencies = [ - "serde_json", -] +checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" [[package]] name = "try-lock" @@ -6022,7 +6323,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ts-rs" version = "8.1.0" -source = "git+https://github.com/Aleph-Alpha/ts-rs#f898578d80d3e2a54080c1c046c45f9eaa2435c3" +source = "git+https://github.com/Aleph-Alpha/ts-rs#be0349d5fb07a8ccab713887a61e90e3bc773c7a" dependencies = [ "chrono", "thiserror", @@ -6034,7 +6335,7 @@ dependencies = [ [[package]] name = "ts-rs-macros" version = "8.1.0" -source = "git+https://github.com/Aleph-Alpha/ts-rs#f898578d80d3e2a54080c1c046c45f9eaa2435c3" +source = "git+https://github.com/Aleph-Alpha/ts-rs#be0349d5fb07a8ccab713887a61e90e3bc773c7a" dependencies = [ "proc-macro2", "quote", @@ -6055,7 +6356,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.23.7", + "rustls 0.23.10", "rustls-pki-types", "sha1", "thiserror", @@ -6158,9 +6459,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "untrusted" @@ -6170,12 +6471,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" dependencies = [ "form_urlencoded", - "idna", + "idna 1.0.0", "percent-encoding", "serde", ] @@ -6199,6 +6500,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" @@ -6206,10 +6513,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] -name = "utf8parse" -version = "0.2.1" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" @@ -6218,7 +6531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "atomic", - "getrandom 0.2.14", + "getrandom 0.2.15", "serde", "wasm-bindgen", ] @@ -6229,7 +6542,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db79c75af171630a3148bd3e6d7c4f42b6a9a014c2945bc5ed0020cbb8d9478e" dependencies = [ - "idna", + "idna 0.5.0", "once_cell", "regex", "serde", @@ -6424,9 +6737,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "105b1842da6554f91526c14a2a2172897b7f745a805d62af4ce698706be79c12" dependencies = [ "dlib", "log", @@ -6495,9 +6808,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -6512,8 +6825,8 @@ dependencies = [ "webview2-com-sys", "windows 0.56.0", "windows-core 0.56.0", - "windows-implement", - "windows-interface", + "windows-implement 0.56.0", + "windows-interface 0.56.0", ] [[package]] @@ -6556,9 +6869,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ "windows-sys 0.52.0", ] @@ -6577,7 +6890,7 @@ checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340" dependencies = [ "cocoa", "objc", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "windows-sys 0.52.0", "windows-version", ] @@ -6601,6 +6914,16 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -6616,8 +6939,20 @@ version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", "windows-result", "windows-targets 0.52.5", ] @@ -6633,6 +6968,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "windows-interface" version = "0.56.0" @@ -6645,10 +6991,31 @@ dependencies = [ ] [[package]] -name = "windows-result" -version = "0.1.1" +name = "windows-interface" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749f0da9cc72d82e600d8d2e44cadd0b9eedb9038f71a1c58556ac1c5791813b" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "windows-registry" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc134c90a0318d873ec962b13149e9c862ff0d2669082a709a4810167a3c6ee" +dependencies = [ + "windows-result", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.5", ] @@ -6878,9 +7245,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.6" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c976aaaa0e1f90dbb21e9587cdaf1d9679a1cde8875c0d6bd83ab96a208352" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" dependencies = [ "memchr", ] @@ -6906,10 +7273,22 @@ dependencies = [ ] [[package]] -name = "wry" -version = "0.39.3" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e180ac2740d6cb4d5cec0abf63eacbea90f1b7e5e3803043b13c1c84c4b7884" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wry" +version = "0.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa597526af53f310a8e6218630c5024fdde8271f229e70d7d2fc70b52b8fb1e" dependencies = [ "base64 0.22.1", "block", @@ -6933,7 +7312,7 @@ dependencies = [ "objc_id", "once_cell", "percent-encoding", - "raw-window-handle 0.6.1", + "raw-window-handle 0.6.2", "sha2", "soup3", "tao-macros", @@ -6990,12 +7369,12 @@ dependencies = [ [[package]] name = "xdg-home" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -7008,18 +7387,41 @@ dependencies = [ ] [[package]] -name = "zbus" -version = "4.1.2" +name = "yoke" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ff46f2a25abd690ed072054733e0bc3157e3d4c45f41bd183dce09c2ff8ab9" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "zbus" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23915fcb26e7a9a9dc05fd93a9870d336d6d032cd7e8cebf1c5c37666489fdd5" dependencies = [ "async-broadcast", "async-process", "async-recursion", "async-trait", - "derivative", "enumflags2", - "event-listener 5.3.0", + "event-listener", "futures-core", "futures-sink", "futures-util", @@ -7043,15 +7445,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.1.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0e3852c93dcdb49c9462afe67a2a468f7bd464150d866e861eaf06208633e0" +checksum = "02bcca0b586d2f8589da32347b4784ba424c4891ed86aa5b50d5e88f6b2c4f5d" dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "regex", - "syn 1.0.109", + "syn 2.0.66", "zvariant_utils", ] @@ -7068,18 +7469,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", @@ -7087,36 +7488,59 @@ dependencies = [ ] [[package]] -name = "zeroize" -version = "1.8.0" +name = "zerofrom" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] [[package]] -name = "zip" -version = "0.6.6" +name = "zerofrom-derive" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2", - "sha1", - "time", - "zstd", + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", ] [[package]] name = "zip" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd56a4d5921bc2f99947ac5b3abe5f510b1be7376fdc5e9fce4a23c6a93e87c" +checksum = "775a2b471036342aa69bc5a602bc889cb0a06cda00477d0c69566757d5553d39" dependencies = [ "arbitrary", "crc32fast", @@ -7127,40 +7551,11 @@ dependencies = [ "thiserror", ] -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zvariant" -version = "4.0.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b3ca6db667bfada0f1ebfc94b2b1759ba25472ee5373d4551bb892616389a" +checksum = "9aa6d31a02fbfb602bfde791de7fedeb9c2c18115b3d00f3a36e489f46ffbbc7" dependencies = [ "endi", "enumflags2", @@ -7172,24 +7567,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "4.0.2" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4b236063316163b69039f77ce3117accb41a09567fd24c168e43491e521bc" +checksum = "642bf1b6b6d527988b3e8193d20969d53700a36eac734d21ae6639db168701c8" dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.66", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" +checksum = "fc242db087efc22bd9ade7aa7809e4ba828132edc312871584a6b4391bdf8786" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.66", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 55f07a032..e5b76846a 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,7 +20,7 @@ kittycad = "0.3.5" log = "0.4.21" oauth2 = "4.4.2" serde_json = "1.0" -tauri = { version = "2.0.0-beta.15", features = [ "devtools", "unstable"] } +tauri = { version = "2.0.0-beta.22", features = [ "devtools", "unstable"] } tauri-plugin-cli = { version = "2.0.0-beta.3" } tauri-plugin-deep-link = { version = "2.0.0-beta.3" } tauri-plugin-dialog = { version = "2.0.0-beta.6" } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 75cd3655d..4eba75322 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -63,11 +63,12 @@ "subcommands": {} }, "deep-link": { - "domains": [ - { - "host": "app.zoo.dev" - } - ] + "mobile": [], + "desktop": { + "schemes": [ + "app.zoo.dev" + ] + } }, "shell": { "open": true diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index 1bd77f291..6c63514cf 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1369,7 +1369,7 @@ dependencies = [ [[package]] name = "kcl-lib" -version = "0.1.59" +version = "0.1.60" dependencies = [ "anyhow", "approx", diff --git a/src/wasm-lib/kcl/Cargo.toml b/src/wasm-lib/kcl/Cargo.toml index 0c1a94c65..3f6e2c265 100644 --- a/src/wasm-lib/kcl/Cargo.toml +++ b/src/wasm-lib/kcl/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-lib" description = "KittyCAD Language implementation and tools" -version = "0.1.59" +version = "0.1.60" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" diff --git a/src/wasm-lib/kcl/src/docs.rs b/src/wasm-lib/kcl/src/docs.rs index daa621440..de2e8d289 100644 --- a/src/wasm-lib/kcl/src/docs.rs +++ b/src/wasm-lib/kcl/src/docs.rs @@ -63,9 +63,10 @@ impl StdLibFnArg { pub fn get_autocomplete_snippet(&self, index: usize) -> Result> { if self.type_ == "SketchGroup" - || self.type_ == "ExtrudeGroup" - || self.type_ == "SketchSurface" || self.type_ == "SketchGroupSet" + || self.type_ == "ExtrudeGroup" + || self.type_ == "ExtrudeGroupSet" + || self.type_ == "SketchSurface" { return Ok(Some((index, format!("${{{}:{}}}", index, "%")))); } diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index 6b9ca6f0b..8d541911f 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -31,7 +31,8 @@ use crate::{ docs::StdLibFn, errors::{KclError, KclErrorDetails}, executor::{ - ExecutorContext, ExtrudeGroup, MemoryItem, Metadata, SketchGroup, SketchGroupSet, SketchSurface, SourceRange, + ExecutorContext, ExtrudeGroup, ExtrudeGroupSet, MemoryItem, Metadata, SketchGroup, SketchGroupSet, + SketchSurface, SourceRange, }, std::{kcl_stdlib::KclStdLibFn, sketch::SketchOnFaceTag}, }; @@ -773,6 +774,52 @@ impl Args { Ok((data, sketch_surface, tag)) } + fn get_data_and_extrude_group_set(&self) -> Result<(T, ExtrudeGroupSet), KclError> { + let first_value = self + .args + .first() + .ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!("Expected a struct as the first argument, found `{:?}`", self.args), + source_ranges: vec![self.source_range], + }) + })? + .get_json_value()?; + + let data: T = serde_json::from_value(first_value).map_err(|e| { + KclError::Type(KclErrorDetails { + message: format!("Failed to deserialize struct from JSON: {}", e), + source_ranges: vec![self.source_range], + }) + })?; + + let second_value = self.args.get(1).ok_or_else(|| { + KclError::Type(KclErrorDetails { + message: format!( + "Expected an ExtrudeGroup as the second argument, found `{:?}`", + self.args + ), + source_ranges: vec![self.source_range], + }) + })?; + + let extrude_set = if let MemoryItem::ExtrudeGroup(eg) = second_value { + ExtrudeGroupSet::ExtrudeGroup(eg.clone()) + } else if let MemoryItem::ExtrudeGroups { value } = second_value { + ExtrudeGroupSet::ExtrudeGroups(value.clone()) + } else { + return Err(KclError::Type(KclErrorDetails { + message: format!( + "Expected a ExtrudeGroup or Vector of ExtrudeGroups as the second argument, found `{:?}`", + self.args + ), + source_ranges: vec![self.source_range], + })); + }; + + Ok((data, extrude_set)) + } + fn get_data_and_extrude_group(&self) -> Result<(T, Box), KclError> { let first_value = self .args diff --git a/src/wasm-lib/kcl/src/std/patterns.rs b/src/wasm-lib/kcl/src/std/patterns.rs index 7290424fd..4e509a2b2 100644 --- a/src/wasm-lib/kcl/src/std/patterns.rs +++ b/src/wasm-lib/kcl/src/std/patterns.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::{KclError, KclErrorDetails}, - executor::{ExtrudeGroup, Geometries, Geometry, MemoryItem, SketchGroup, SketchGroupSet}, + executor::{ExtrudeGroup, ExtrudeGroupSet, Geometries, Geometry, MemoryItem, SketchGroup, SketchGroupSet}, std::{types::Uint, Args}, }; @@ -141,7 +141,7 @@ async fn inner_pattern_linear_2d( /// A linear pattern on a 3D model. pub async fn pattern_linear_3d(args: Args) -> Result { - let (data, extrude_group): (LinearPattern3dData, Box) = args.get_data_and_extrude_group()?; + let (data, extrude_group_set): (LinearPattern3dData, ExtrudeGroupSet) = args.get_data_and_extrude_group_set()?; if data.axis == [0.0, 0.0, 0.0] { return Err(KclError::Semantic(KclErrorDetails { @@ -152,7 +152,7 @@ pub async fn pattern_linear_3d(args: Args) -> Result { })); } - let extrude_groups = inner_pattern_linear_3d(data, extrude_group, args).await?; + let extrude_groups = inner_pattern_linear_3d(data, extrude_group_set, args).await?; Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }) } @@ -178,26 +178,36 @@ pub async fn pattern_linear_3d(args: Args) -> Result { }] async fn inner_pattern_linear_3d( data: LinearPattern3dData, - extrude_group: Box, + extrude_group_set: ExtrudeGroupSet, args: Args, ) -> Result>, KclError> { + let starting_extrude_groups = match extrude_group_set { + ExtrudeGroupSet::ExtrudeGroup(extrude_group) => vec![extrude_group], + ExtrudeGroupSet::ExtrudeGroups(extrude_groups) => extrude_groups, + }; + if args.ctx.is_mock { - return Ok(vec![extrude_group.clone()]); + return Ok(starting_extrude_groups); } - let geometries = pattern_linear( - LinearPattern::ThreeD(data), - Geometry::ExtrudeGroup(extrude_group), - args.clone(), - ) - .await?; + let mut extrude_groups = Vec::new(); + for extrude_group in starting_extrude_groups.iter() { + let geometries = pattern_linear( + LinearPattern::ThreeD(data.clone()), + Geometry::ExtrudeGroup(extrude_group.clone()), + args.clone(), + ) + .await?; - let Geometries::ExtrudeGroups(extrude_groups) = geometries else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a vec of extrude groups".to_string(), - source_ranges: vec![args.source_range], - })); - }; + let Geometries::ExtrudeGroups(new_extrude_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of extrude groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + extrude_groups.extend(new_extrude_groups); + } Ok(extrude_groups) } @@ -335,9 +345,9 @@ impl CircularPattern { /// A circular pattern on a 2D sketch. pub async fn pattern_circular_2d(args: Args) -> Result { - let (data, sketch_group): (CircularPattern2dData, Box) = args.get_data_and_sketch_group()?; + let (data, sketch_group_set): (CircularPattern2dData, SketchGroupSet) = args.get_data_and_sketch_group_set()?; - let sketch_groups = inner_pattern_circular_2d(data, sketch_group, args).await?; + let sketch_groups = inner_pattern_circular_2d(data, sketch_group_set, args).await?; Ok(MemoryItem::SketchGroups { value: sketch_groups }) } @@ -364,35 +374,45 @@ pub async fn pattern_circular_2d(args: Args) -> Result { }] async fn inner_pattern_circular_2d( data: CircularPattern2dData, - sketch_group: Box, + sketch_group_set: SketchGroupSet, args: Args, ) -> Result>, KclError> { + let starting_sketch_groups = match sketch_group_set { + SketchGroupSet::SketchGroup(sketch_group) => vec![sketch_group], + SketchGroupSet::SketchGroups(sketch_groups) => sketch_groups, + }; + if args.ctx.is_mock { - return Ok(vec![sketch_group]); + return Ok(starting_sketch_groups); } - let geometries = pattern_circular( - CircularPattern::TwoD(data), - Geometry::SketchGroup(sketch_group), - args.clone(), - ) - .await?; + let mut sketch_groups = Vec::new(); + for sketch_group in starting_sketch_groups.iter() { + let geometries = pattern_circular( + CircularPattern::TwoD(data.clone()), + Geometry::SketchGroup(sketch_group.clone()), + args.clone(), + ) + .await?; - let Geometries::SketchGroups(sketch_groups) = geometries else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a vec of sketch groups".to_string(), - source_ranges: vec![args.source_range], - })); - }; + let Geometries::SketchGroups(new_sketch_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of sketch groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + sketch_groups.extend(new_sketch_groups); + } Ok(sketch_groups) } /// A circular pattern on a 3D model. pub async fn pattern_circular_3d(args: Args) -> Result { - let (data, extrude_group): (CircularPattern3dData, Box) = args.get_data_and_extrude_group()?; + let (data, extrude_group_set): (CircularPattern3dData, ExtrudeGroupSet) = args.get_data_and_extrude_group_set()?; - let extrude_groups = inner_pattern_circular_3d(data, extrude_group, args).await?; + let extrude_groups = inner_pattern_circular_3d(data, extrude_group_set, args).await?; Ok(MemoryItem::ExtrudeGroups { value: extrude_groups }) } @@ -416,26 +436,36 @@ pub async fn pattern_circular_3d(args: Args) -> Result { }] async fn inner_pattern_circular_3d( data: CircularPattern3dData, - extrude_group: Box, + extrude_group_set: ExtrudeGroupSet, args: Args, ) -> Result>, KclError> { + let starting_extrude_groups = match extrude_group_set { + ExtrudeGroupSet::ExtrudeGroup(extrude_group) => vec![extrude_group], + ExtrudeGroupSet::ExtrudeGroups(extrude_groups) => extrude_groups, + }; + if args.ctx.is_mock { - return Ok(vec![extrude_group]); + return Ok(starting_extrude_groups); } - let geometries = pattern_circular( - CircularPattern::ThreeD(data), - Geometry::ExtrudeGroup(extrude_group), - args.clone(), - ) - .await?; + let mut extrude_groups = Vec::new(); + for extrude_group in starting_extrude_groups.iter() { + let geometries = pattern_circular( + CircularPattern::ThreeD(data.clone()), + Geometry::ExtrudeGroup(extrude_group.clone()), + args.clone(), + ) + .await?; - let Geometries::ExtrudeGroups(extrude_groups) = geometries else { - return Err(KclError::Semantic(KclErrorDetails { - message: "Expected a vec of extrude groups".to_string(), - source_ranges: vec![args.source_range], - })); - }; + let Geometries::ExtrudeGroups(new_extrude_groups) = geometries else { + return Err(KclError::Semantic(KclErrorDetails { + message: "Expected a vec of extrude groups".to_string(), + source_ranges: vec![args.source_range], + })); + }; + + extrude_groups.extend(new_extrude_groups); + } Ok(extrude_groups) } diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 62ec52aab..d31655309 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -1959,3 +1959,53 @@ async fn serial_test_neg_xz_plane() { let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); twenty_twenty::assert_image("tests/executor/outputs/neg_xz_plane.png", &result, 1.0); } + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_linear_pattern3d_a_pattern() { + let code = r#"const exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + |> extrude(1, %) + +const pattn1 = patternLinear3d({ + axis: [1, 0, 0], + repetitions: 6, + distance: 6 + }, exampleSketch) + +const pattn2 = patternLinear3d({ + axis: [0, 0, 1], + distance: 1, + repetitions: 6 + }, pattn1) +"#; + + let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/linear_pattern3d_a_pattern.png", &result, 1.0); +} + +#[tokio::test(flavor = "multi_thread")] +async fn serial_test_circular_pattern3d_a_pattern() { + let code = r#"const exampleSketch = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([0, 2], %) + |> line([3, 1], %) + |> line([0, -4], %) + |> close(%) + |> extrude(1, %) + +const pattn1 = patternLinear3d({ + axis: [1, 0, 0], + repetitions: 6, + distance: 6 + }, exampleSketch) + +const pattn2 = patternCircular3d({axis: [0,0, 1], center: [-20, -20, -20], repetitions: 40, arcDegrees: 360, rotateDuplicates: false}, pattn1) +"#; + + let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); + twenty_twenty::assert_image("tests/executor/outputs/circular_pattern3d_a_pattern.png", &result, 1.0); +} diff --git a/src/wasm-lib/tests/executor/outputs/circular_pattern3d_a_pattern.png b/src/wasm-lib/tests/executor/outputs/circular_pattern3d_a_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..c22cefaac6d075924432a1f59dcd2a53b1f0f910 GIT binary patch literal 214180 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 z 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 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/tests/executor/outputs/linear_pattern3d_a_pattern.png b/src/wasm-lib/tests/executor/outputs/linear_pattern3d_a_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..0087483d9075849d97a4b69faf0004b737f5132d GIT binary patch literal 180619 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

hkap`%p6{XIw6IWM)FbzAgzV?5y>jg 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 It;-kuAH_