Compare commits
	
		
			26 Commits
		
	
	
		
			achalmers/
			...
			mike/engin
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5bea90ad9a | |||
| d23ddc19eb | |||
| 4bd7e02271 | |||
| 26042790b6 | |||
| af74f3bb05 | |||
| 0bdedf5854 | |||
| d2c6b5cf3a | |||
| c42967d0e7 | |||
| cb8fc33adb | |||
| 2dc8b429ff | |||
| 19ffa220e8 | |||
| 5332ddd88e | |||
| 11d9a2ee00 | |||
| bfebc41a5c | |||
| 824b4c823e | |||
| e65358f635 | |||
| 0a1201e680 | |||
| 9db013e672 | |||
| 0196d72a2d | |||
| e6af4078bd | |||
| 2b233dc705 | |||
| b11e8af9c7 | |||
| c017847d7b | |||
| 9635eea8c1 | |||
| 5a2df642b1 | |||
| 621e41080e | 
							
								
								
									
										
											BIN
										
									
								
								..env.development.local.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -1,3 +1,4 @@ | ||||
| src/wasm-lib/* | ||||
| src/lib/engine-utils/engine.js | ||||
| *.typegen.ts | ||||
| packages/codemirror-lsp-client/dist/* | ||||
|  | ||||
| @ -211,7 +211,7 @@ jobs: | ||||
|             out/*-x86_64-linux.* | ||||
|  | ||||
|       - uses: actions/upload-artifact@v3 | ||||
|         if: ${{ env.CUT_RELEASE_PR == 'true' }} | ||||
|         if: ${{ env.BUILD_RELEASE == 'true' }} | ||||
|         with: | ||||
|           name: out-yml | ||||
|           path: | | ||||
|  | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -66,3 +66,7 @@ venv | ||||
|  | ||||
| # electron | ||||
| out/ | ||||
|  | ||||
| # engine wasm utils | ||||
| src/lib/engine-utils/engine.wasm | ||||
| src/lib/engine-utils/engine.js | ||||
|  | ||||
							
								
								
									
										14077
									
								
								docs/kcl/std.json
									
									
									
									
									
								
							
							
						
						| @ -1,24 +0,0 @@ | ||||
| --- | ||||
| title: "ArrayExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `elements` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "ArrayRangeExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `startElement` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `endElement` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `endInclusive` |`boolean`| Is the `end_element` included in the range? | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "BinaryExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)|  | No | | ||||
| | `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -8,82 +8,150 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
| **This schema accepts any of the following:** | ||||
|  | ||||
| **This schema accepts exactly one of the following:** | ||||
|  | ||||
|  | ||||
| [`Literal`](/docs/kcl/types/Literal) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `Literal`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)|  | No | | ||||
| | `raw` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`Identifier`](/docs/kcl/types/Identifier) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `name` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`BinaryExpression`](/docs/kcl/types/BinaryExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `BinaryExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)|  | No | | ||||
| | `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`CallExpression`](/docs/kcl/types/CallExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `CallExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `callee` |[`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `optional` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`UnaryExpression`](/docs/kcl/types/UnaryExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `UnaryExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)|  | No | | ||||
| | `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`MemberExpression`](/docs/kcl/types/MemberExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `MemberExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)|  | No | | ||||
| | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)|  | No | | ||||
| | `computed` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`IfExpression`](/docs/kcl/types/IfExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `IfExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `cond` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `then_val` |[`Program`](/docs/kcl/types/Program)|  | No | | ||||
| | `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`|  | No | | ||||
| | `final_else` |[`Program`](/docs/kcl/types/Program)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| @ -91,4 +159,3 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -8,49 +8,86 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
| **This schema accepts any of the following:** | ||||
|  | ||||
| **This schema accepts exactly one of the following:** | ||||
|  | ||||
|  | ||||
| [`ImportStatement`](/docs/kcl/types/ImportStatement) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ImportStatement`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `items` |`[` [`ImportItem`](/docs/kcl/types/ImportItem) `]`|  | No | | ||||
| | `path` |`string`|  | No | | ||||
| | `raw_path` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`ExpressionStatement`](/docs/kcl/types/ExpressionStatement) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ExpressionStatement`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `expression` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`VariableDeclaration`](/docs/kcl/types/VariableDeclaration) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `VariableDeclaration`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `declarations` |`[` [`VariableDeclarator`](/docs/kcl/types/VariableDeclarator) `]`|  | No | | ||||
| | `visibility` |[`ItemVisibility`](/docs/kcl/types/ItemVisibility)|  | No | | ||||
| | `kind` |[`VariableKind`](/docs/kcl/types/VariableKind)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`ReturnStatement`](/docs/kcl/types/ReturnStatement) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ReturnStatement`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `argument` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| @ -58,4 +95,3 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "CallExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `callee` |[`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `optional` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -9,185 +9,306 @@ An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
|  | ||||
|  | ||||
| **This schema accepts any of the following:** | ||||
|  | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
| **This schema accepts exactly one of the following:** | ||||
|  | ||||
| [`Literal`](/docs/kcl/types/Literal) | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `Literal`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `raw` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`Identifier`](/docs/kcl/types/Identifier) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `name` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`TagDeclarator`](/docs/kcl/types#tag-declaration) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`TagDeclarator`](/docs/kcl/types#tag-declaration)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `value` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`BinaryExpression`](/docs/kcl/types/BinaryExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `BinaryExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`BinaryOperator`](/docs/kcl/types/BinaryOperator)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `left` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `right` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`FunctionExpression`](/docs/kcl/types/FunctionExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`FunctionExpression`](/docs/kcl/types/FunctionExpression)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `params` |`[` [`Parameter`](/docs/kcl/types/Parameter) `]`|  | No | | ||||
| | `body` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`CallExpression`](/docs/kcl/types/CallExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `CallExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `callee` |[`Identifier`](/docs/kcl/types/Identifier)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `arguments` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `optional` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`PipeExpression`](/docs/kcl/types/PipeExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `PipeExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `body` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`PipeSubstitution`](/docs/kcl/types/PipeSubstitution) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `PipeSubstitution`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`ArrayExpression`](/docs/kcl/types/ArrayExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ArrayExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `elements` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`ArrayRangeExpression`](/docs/kcl/types/ArrayRangeExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ArrayRangeExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `startElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `endElement` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `endInclusive` |`boolean`| Is the `end_element` included in the range? | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`ObjectExpression`](/docs/kcl/types/ObjectExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `ObjectExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `properties` |`[` [`ObjectProperty`](/docs/kcl/types/ObjectProperty) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`MemberExpression`](/docs/kcl/types/MemberExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `MemberExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `computed` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`UnaryExpression`](/docs/kcl/types/UnaryExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `UnaryExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
| [`IfExpression`](/docs/kcl/types/IfExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `IfExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `cond` |[`Expr`](/docs/kcl/types/Expr)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `then_val` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`|  | No | | ||||
| | `final_else` |[`Program`](/docs/kcl/types/Program)| An expression can be evaluated to yield a single KCL value. | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| An expression can be evaluated to yield a single KCL value. | ||||
| KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). | ||||
|  | ||||
| [`KclNone`](/docs/kcl/types/KclNone) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `None`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| @ -195,4 +316,3 @@ An expression can be evaluated to yield a single KCL value. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,23 +0,0 @@ | ||||
| --- | ||||
| title: "ExpressionStatement" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `expression` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,26 +0,0 @@ | ||||
| --- | ||||
| title: "IfExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `cond` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `then_val` |[`Program`](/docs/kcl/types/Program)|  | No | | ||||
| | `else_ifs` |`[` [`ElseIf`](/docs/kcl/types/ElseIf) `]`|  | No | | ||||
| | `final_else` |[`Program`](/docs/kcl/types/Program)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "ImportStatement" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `items` |`[` [`ImportItem`](/docs/kcl/types/ImportItem) `]`|  | No | | ||||
| | `path` |`string`|  | No | | ||||
| | `raw_path` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,22 +0,0 @@ | ||||
| --- | ||||
| title: "KclNone" | ||||
| excerpt: "KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application)." | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
| KCL value for an optional parameter which was not given an argument. (remember, parameters are in the function declaration, arguments are in the function call/application). | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,24 +0,0 @@ | ||||
| --- | ||||
| title: "Literal" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)|  | No | | ||||
| | `raw` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -8,27 +8,45 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
| **This schema accepts any of the following:** | ||||
|  | ||||
| **This schema accepts exactly one of the following:** | ||||
|  | ||||
|  | ||||
| [`Identifier`](/docs/kcl/types/Identifier) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `name` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`Literal`](/docs/kcl/types/Literal) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `Literal`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `value` |[`LiteralValue`](/docs/kcl/types/LiteralValue)|  | No | | ||||
| | `raw` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| @ -36,4 +54,3 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "MemberExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)|  | No | | ||||
| | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)|  | No | | ||||
| | `computed` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -8,27 +8,46 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
| **This schema accepts any of the following:** | ||||
|  | ||||
| **This schema accepts exactly one of the following:** | ||||
|  | ||||
|  | ||||
| [`MemberExpression`](/docs/kcl/types/MemberExpression) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: `MemberExpression`|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `object` |[`MemberObject`](/docs/kcl/types/MemberObject)|  | No | | ||||
| | `property` |[`LiteralIdentifier`](/docs/kcl/types/LiteralIdentifier)|  | No | | ||||
| | `computed` |`boolean`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
|  | ||||
| [`Identifier`](/docs/kcl/types/Identifier) | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `type` |enum: [`Identifier`](/docs/kcl/types/Identifier)|  | No | | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `name` |`string`|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| ---- | ||||
| @ -36,4 +55,3 @@ layout: manual | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,24 +0,0 @@ | ||||
| --- | ||||
| title: "ObjectExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `properties` |`[` [`ObjectProperty`](/docs/kcl/types/ObjectProperty) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,24 +0,0 @@ | ||||
| --- | ||||
| title: "PipeExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `body` |`[` [`Expr`](/docs/kcl/types/Expr) `]`|  | No | | ||||
| | `nonCodeMeta` |[`NonCodeMeta`](/docs/kcl/types/NonCodeMeta)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,22 +0,0 @@ | ||||
| --- | ||||
| title: "PipeSubstitution" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,23 +0,0 @@ | ||||
| --- | ||||
| title: "ReturnStatement" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `argument` |[`Expr`](/docs/kcl/types/Expr)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,24 +0,0 @@ | ||||
| --- | ||||
| title: "UnaryExpression" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `operator` |[`UnaryOperator`](/docs/kcl/types/UnaryOperator)|  | No | | ||||
| | `argument` |[`BinaryPart`](/docs/kcl/types/BinaryPart)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -1,25 +0,0 @@ | ||||
| --- | ||||
| title: "VariableDeclaration" | ||||
| excerpt: "" | ||||
| layout: manual | ||||
| --- | ||||
|  | ||||
|  | ||||
| **Type:** `object` | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Properties | ||||
|  | ||||
| | Property | Type | Description | Required | | ||||
| |----------|------|-------------|----------| | ||||
| | `start` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `end` |[`EnvironmentRef`](/docs/kcl/types/EnvironmentRef)|  | No | | ||||
| | `declarations` |`[` [`VariableDeclarator`](/docs/kcl/types/VariableDeclarator) `]`|  | No | | ||||
| | `visibility` |[`ItemVisibility`](/docs/kcl/types/ItemVisibility)|  | No | | ||||
| | `kind` |[`VariableKind`](/docs/kcl/types/VariableKind)|  | No | | ||||
| | `digest` |`[, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`, `integer`]`|  | No | | ||||
|  | ||||
|  | ||||
| @ -104,7 +104,7 @@ test( | ||||
|             }, | ||||
|             { timeout: 15_000 } | ||||
|           ) | ||||
|           .toBe(431341) | ||||
|           .toBeGreaterThan(300_000) | ||||
|  | ||||
|         // clean up output.gltf | ||||
|         await fsp.rm('output.gltf') | ||||
| @ -179,7 +179,7 @@ test( | ||||
|             }, | ||||
|             { timeout: 15_000 } | ||||
|           ) | ||||
|           .toBe(102040) | ||||
|           .toBeGreaterThan(100_000) | ||||
|  | ||||
|         // clean up output.gltf | ||||
|         await fsp.rm('output.gltf') | ||||
|  | ||||
| @ -1,6 +1,16 @@ | ||||
| import { test, expect } from '@playwright/test' | ||||
| import fsp from 'fs/promises' | ||||
| import { uuidv4 } from 'lib/utils' | ||||
| import { getUtils, setup, tearDown } from './test-utils' | ||||
| import { | ||||
|   darkModeBgColor, | ||||
|   darkModePlaneColorXZ, | ||||
|   executorInputPath, | ||||
|   getUtils, | ||||
|   setup, | ||||
|   setupElectron, | ||||
|   tearDown, | ||||
| } from './test-utils' | ||||
| import { join } from 'path' | ||||
|  | ||||
| test.beforeEach(async ({ context, page }, testInfo) => { | ||||
|   await setup(context, page, testInfo) | ||||
| @ -974,4 +984,84 @@ test.describe('Editor tests', () => { | ||||
|     |> close(%) | ||||
|     |> extrude(5, %)`) | ||||
|   }) | ||||
|  | ||||
|   test( | ||||
|     `Can use the import stdlib function on a local OBJ file`, | ||||
|     { tag: '@electron' }, | ||||
|     async ({ browserName }, testInfo) => { | ||||
|       const { electronApp, page } = await setupElectron({ | ||||
|         testInfo, | ||||
|         folderSetupFn: async (dir) => { | ||||
|           const bracketDir = join(dir, 'cube') | ||||
|           await fsp.mkdir(bracketDir, { recursive: true }) | ||||
|           await fsp.copyFile( | ||||
|             executorInputPath('cube.obj'), | ||||
|             join(bracketDir, 'cube.obj') | ||||
|           ) | ||||
|           await fsp.writeFile(join(bracketDir, 'main.kcl'), '') | ||||
|         }, | ||||
|       }) | ||||
|       const viewportSize = { width: 1200, height: 500 } | ||||
|       await page.setViewportSize(viewportSize) | ||||
|  | ||||
|       // Locators and constants | ||||
|       const u = await getUtils(page) | ||||
|       const projectLink = page.getByRole('link', { name: 'cube' }) | ||||
|       const gizmo = page.locator('[aria-label*=gizmo]') | ||||
|       const resetCameraButton = page.getByRole('button', { name: 'Reset view' }) | ||||
|       const locationToHavColor = async ( | ||||
|         position: { x: number; y: number }, | ||||
|         color: [number, number, number] | ||||
|       ) => { | ||||
|         return u.getGreatestPixDiff(position, color) | ||||
|       } | ||||
|       const notTheOrigin = { | ||||
|         x: viewportSize.width * 0.55, | ||||
|         y: viewportSize.height * 0.3, | ||||
|       } | ||||
|       const origin = { x: viewportSize.width / 2, y: viewportSize.height / 2 } | ||||
|       const errorIndicators = page.locator('.cm-lint-marker-error') | ||||
|  | ||||
|       await test.step(`Open the empty file, see the default planes`, async () => { | ||||
|         await projectLink.click() | ||||
|         await u.waitForPageLoad() | ||||
|         await expect | ||||
|           .poll( | ||||
|             async () => locationToHavColor(notTheOrigin, darkModePlaneColorXZ), | ||||
|             { | ||||
|               timeout: 5000, | ||||
|               message: 'XZ plane color is visible', | ||||
|             } | ||||
|           ) | ||||
|           .toBeLessThan(15) | ||||
|       }) | ||||
|       await test.step(`Write the import function line`, async () => { | ||||
|         await u.codeLocator.fill(`import('cube.obj')`) | ||||
|         await page.waitForTimeout(800) | ||||
|       }) | ||||
|       await test.step(`Reset the camera before checking`, async () => { | ||||
|         await u.doAndWaitForCmd(async () => { | ||||
|           await gizmo.click({ button: 'right' }) | ||||
|           await resetCameraButton.click() | ||||
|         }, 'zoom_to_fit') | ||||
|       }) | ||||
|       await test.step(`Verify that we see the imported geometry and no errors`, async () => { | ||||
|         await expect(errorIndicators).toHaveCount(0) | ||||
|         await expect | ||||
|           .poll(async () => locationToHavColor(origin, darkModePlaneColorXZ), { | ||||
|             timeout: 3000, | ||||
|             message: 'Plane color should not be visible', | ||||
|           }) | ||||
|           .toBeGreaterThan(15) | ||||
|         await expect | ||||
|           .poll(async () => locationToHavColor(origin, darkModeBgColor), { | ||||
|             timeout: 3000, | ||||
|             message: 'Background color should not be visible', | ||||
|           }) | ||||
|           .toBeGreaterThan(15) | ||||
|       }) | ||||
|  | ||||
|       await electronApp.close() | ||||
|     } | ||||
|   ) | ||||
| }) | ||||
|  | ||||
| @ -136,6 +136,9 @@ test.describe('when using the file tree to', () => { | ||||
|       ) | ||||
|       await pasteCodeInEditor(kclCube) | ||||
|  | ||||
|       // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. | ||||
|       await tronApp.page.waitForTimeout(2000) | ||||
|  | ||||
|       await renameFile(fromFile, toFile) | ||||
|       await tronApp.page.reload() | ||||
|  | ||||
| @ -222,9 +225,11 @@ test.describe('when using the file tree to', () => { | ||||
|       ) | ||||
|       await pasteCodeInEditor(kclCube) | ||||
|  | ||||
|       // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. | ||||
|       await tronApp.page.waitForTimeout(2000) | ||||
|  | ||||
|       const kcl1 = 'main.kcl' | ||||
|       const kcl2 = '2.kcl' | ||||
|  | ||||
|       await createNewFileAndSelect(kcl2) | ||||
|       const kclCylinder = await fsp.readFile( | ||||
|         'src/wasm-lib/tests/executor/inputs/cylinder.kcl', | ||||
| @ -232,6 +237,9 @@ test.describe('when using the file tree to', () => { | ||||
|       ) | ||||
|       await pasteCodeInEditor(kclCylinder) | ||||
|  | ||||
|       // TODO: We have a timeout of 1s between edits to write to disk. If you reload the page too quickly it won't write to disk. | ||||
|       await tronApp.page.waitForTimeout(2000) | ||||
|  | ||||
|       await renameFile(kcl2, kcl1) | ||||
|  | ||||
|       await test.step(`Postcondition: ${kcl1} still has the original content`, async () => { | ||||
|  | ||||
| @ -255,7 +255,7 @@ test.describe('Can export from electron app', () => { | ||||
|               }, | ||||
|               { timeout: 15_000 } | ||||
|             ) | ||||
|             .toBe(431341) | ||||
|             .toBeGreaterThan(300_000) | ||||
|  | ||||
|           // clean up output.gltf | ||||
|           await fsp.rm('output.gltf') | ||||
| @ -851,7 +851,7 @@ test( | ||||
|   } | ||||
| ) | ||||
|  | ||||
| test( | ||||
| test.fixme( | ||||
|   'When the project folder is empty, user can create new project and open it.', | ||||
|   { tag: '@electron' }, | ||||
|   async ({ browserName }, testInfo) => { | ||||
| @ -861,6 +861,12 @@ test( | ||||
|  | ||||
|     page.on('console', console.log) | ||||
|  | ||||
|     // Locators and constants | ||||
|     const gizmo = page.locator('[aria-label*=gizmo]') | ||||
|     const resetCameraButton = page.getByRole('button', { name: 'Reset view' }) | ||||
|     const pointOnModel = { x: 660, y: 250 } | ||||
|     const expectedStartCamZPosition = 15633.47 | ||||
|  | ||||
|     // expect to see text "No Projects found" | ||||
|     await expect(page.getByText('No Projects found')).toBeVisible() | ||||
|  | ||||
| @ -873,16 +879,7 @@ test( | ||||
|  | ||||
|     await page.getByText('project-000').click() | ||||
|  | ||||
|     await expect(page.getByTestId('loading')).toBeAttached() | ||||
|     await expect(page.getByTestId('loading')).not.toBeAttached({ | ||||
|       timeout: 20_000, | ||||
|     }) | ||||
|  | ||||
|     await expect( | ||||
|       page.getByRole('button', { name: 'Start Sketch' }) | ||||
|     ).toBeEnabled({ | ||||
|       timeout: 20_000, | ||||
|     }) | ||||
|     await u.waitForPageLoad() | ||||
|  | ||||
|     await page.locator('.cm-content').fill(`sketch001 = startSketchOn('XZ') | ||||
|   |> startProfileAt([-87.4, 282.92], %) | ||||
| @ -892,8 +889,28 @@ test( | ||||
|   |> lineTo([profileStartX(%), profileStartY(%)], %) | ||||
|   |> close(%) | ||||
| extrude001 = extrude(200, sketch001)`) | ||||
|     await page.waitForTimeout(800) | ||||
|  | ||||
|     const pointOnModel = { x: 660, y: 250 } | ||||
|     async function getCameraZValue() { | ||||
|       return page | ||||
|         .getByTestId('cam-z-position') | ||||
|         .inputValue() | ||||
|         .then((value) => parseFloat(value)) | ||||
|     } | ||||
|  | ||||
|     await test.step(`Reset camera`, async () => { | ||||
|       await u.openDebugPanel() | ||||
|       await u.clearCommandLogs() | ||||
|       await u.doAndWaitForCmd(async () => { | ||||
|         await gizmo.click({ button: 'right' }) | ||||
|         await resetCameraButton.click() | ||||
|       }, 'zoom_to_fit') | ||||
|       await expect | ||||
|         .poll(getCameraZValue, { | ||||
|           message: 'Camera Z should be at expected position after reset', | ||||
|         }) | ||||
|         .toEqual(expectedStartCamZPosition) | ||||
|     }) | ||||
|  | ||||
|     // gray at this pixel means the stream has loaded in the most | ||||
|     // user way we can verify it (pixel color) | ||||
| @ -901,7 +918,7 @@ extrude001 = extrude(200, sketch001)`) | ||||
|       .poll(() => u.getGreatestPixDiff(pointOnModel, [143, 143, 143]), { | ||||
|         timeout: 10_000, | ||||
|       }) | ||||
|       .toBeLessThan(15) | ||||
|       .toBeLessThan(30) | ||||
|  | ||||
|     await expect(async () => { | ||||
|       await page.mouse.move(0, 0, { steps: 5 }) | ||||
|  | ||||
| @ -471,7 +471,7 @@ test( | ||||
|  | ||||
|     await page.mouse.move(startXPx + PUR * 30, 500 - PUR * 20, { steps: 10 }) | ||||
|  | ||||
|     await page.waitForTimeout(300) | ||||
|     await page.waitForTimeout(1000) | ||||
|  | ||||
|     await expect(page).toHaveScreenshot({ | ||||
|       maxDiffPixels: 100, | ||||
| @ -528,6 +528,7 @@ test( | ||||
|     // Draw the rectangle | ||||
|     await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 30) | ||||
|     await page.mouse.move(startXPx + PUR * 10, 500 - PUR * 10, { steps: 5 }) | ||||
|     await page.waitForTimeout(800) | ||||
|  | ||||
|     // Ensure the draft rectangle looks the same as it usually does | ||||
|     await expect(page).toHaveScreenshot({ | ||||
| @ -895,7 +896,7 @@ test( | ||||
|     // Wait for the second extrusion to appear | ||||
|     // TODO: Find a way to truly know that the objects have finished | ||||
|     // rendering, because an execution-done message is not sufficient. | ||||
|     await page.waitForTimeout(1000) | ||||
|     await page.waitForTimeout(2000) | ||||
|  | ||||
|     await expect(page).toHaveScreenshot({ | ||||
|       maxDiffPixels: 100, | ||||
| @ -939,7 +940,7 @@ test( | ||||
|     // Wait for the second extrusion to appear | ||||
|     // TODO: Find a way to truly know that the objects have finished | ||||
|     // rendering, because an execution-done message is not sufficient. | ||||
|     await page.waitForTimeout(1000) | ||||
|     await page.waitForTimeout(2000) | ||||
|  | ||||
|     await expect(page).toHaveScreenshot({ | ||||
|       maxDiffPixels: 100, | ||||
|  | ||||
| Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB | 
| Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB | 
| Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 46 KiB | 
| Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 62 KiB | 
| Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB | 
| Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB | 
| Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB | 
| @ -47,6 +47,14 @@ export const commonPoints = { | ||||
|   num2: 14.44, | ||||
| } | ||||
|  | ||||
| /** A semi-reliable color to check the default XZ plane on | ||||
|  * in dark mode in the default camera position | ||||
|  */ | ||||
| export const darkModePlaneColorXZ: [number, number, number] = [50, 50, 99] | ||||
|  | ||||
| /** A semi-reliable color to check the default dark mode bg color against */ | ||||
| export const darkModeBgColor: [number, number, number] = [27, 27, 27] | ||||
|  | ||||
| export const editorSelector = '[role="textbox"][data-language="kcl"]' | ||||
| type PaneId = 'variables' | 'code' | 'files' | 'logs' | ||||
|  | ||||
| @ -882,8 +890,8 @@ export async function setupElectron({ | ||||
|       appSettings | ||||
|         ? { settings: appSettings } | ||||
|         : { | ||||
|             ...TEST_SETTINGS, | ||||
|             settings: { | ||||
|               ...TEST_SETTINGS, | ||||
|               app: { | ||||
|                 ...TEST_SETTINGS.app, | ||||
|                 projectDirectory: projectDirName, | ||||
|  | ||||
							
								
								
									
										2
									
								
								interface.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -23,8 +23,8 @@ export interface IElectronAPI { | ||||
|     key: string, | ||||
|     callback: (eventType: string, path: string) => void | ||||
|   ) => void | ||||
|   readFile: typeof fs.readFile | ||||
|   watchFileOff: (path: string, key: string) => void | ||||
|   readFile: (path: string) => ReturnType<fs.readFile> | ||||
|   writeFile: ( | ||||
|     path: string, | ||||
|     data: string | Uint8Array | ||||
|  | ||||
| @ -70,7 +70,7 @@ echo "" | ||||
| echo "Suggested changelog:" | ||||
| echo "\`\`\`" | ||||
| echo "## What's Changed" | ||||
| git log $(git describe --tags --abbrev=0)..HEAD --oneline --pretty=format:%s | grep -v Bump | grep -v 'Cut release v' | awk '{print "* "toupper(substr($0,0,1))substr($0,2)}' | ||||
| git log $(git describe --tags --match="v[0-9]*" --abbrev=0)..HEAD --oneline --pretty=format:%s | grep -v Bump | grep -v 'Cut release v' | awk '{print "* "toupper(substr($0,0,1))substr($0,2)}' | ||||
| echo "" | ||||
| echo "**Full Changelog**: https://github.com/KittyCAD/modeling-app/compare/${latest_tag}...${new_version}" | ||||
| echo "\`\`\`" | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "zoo-modeling-app", | ||||
|   "version": "0.25.6", | ||||
|   "version": "0.26.0", | ||||
|   "private": true, | ||||
|   "productName": "Zoo Modeling App", | ||||
|   "author": { | ||||
|  | ||||
| @ -64,6 +64,27 @@ export type ReactCameraProperties = | ||||
|  | ||||
| const lastCmdDelay = 50 | ||||
|  | ||||
| class CameraRateLimiter { | ||||
|   lastSend?: Date = undefined | ||||
|   rateLimitMs: number = 16 //60 FPS | ||||
|  | ||||
|   send = (f: () => void) => { | ||||
|     let now = new Date() | ||||
|  | ||||
|     if ( | ||||
|       this.lastSend === undefined || | ||||
|       now.getTime() - this.lastSend.getTime() > this.rateLimitMs | ||||
|     ) { | ||||
|       f() | ||||
|       this.lastSend = now | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   reset = () => { | ||||
|     this.lastSend = undefined | ||||
|   } | ||||
| } | ||||
|  | ||||
| export class CameraControls { | ||||
|   engineCommandManager: EngineCommandManager | ||||
|   syncDirection: 'clientToEngine' | 'engineToClient' = 'engineToClient' | ||||
| @ -77,9 +98,8 @@ export class CameraControls { | ||||
|   enableRotate = true | ||||
|   enablePan = true | ||||
|   enableZoom = true | ||||
|   zoomDataFromLastFrame?: number = undefined | ||||
|   // holds coordinates, and interaction | ||||
|   moveDataFromLastFrame?: [number, number, string] = undefined | ||||
|   moveSender: CameraRateLimiter = new CameraRateLimiter() | ||||
|   zoomSender: CameraRateLimiter = new CameraRateLimiter() | ||||
|   lastPerspectiveFov: number = 45 | ||||
|   pendingZoom: number | null = null | ||||
|   pendingRotation: Vector2 | null = null | ||||
| @ -171,6 +191,36 @@ export class CameraControls { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   doMove = (interaction: any, coordinates: any) => { | ||||
|     // eslint-disable-next-line @typescript-eslint/no-floating-promises | ||||
|     this.engineCommandManager.sendSceneCommand({ | ||||
|       type: 'modeling_cmd_req', | ||||
|       cmd: { | ||||
|         type: 'camera_drag_move', | ||||
|         interaction: interaction, | ||||
|         window: { | ||||
|           x: coordinates[0], | ||||
|           y: coordinates[1], | ||||
|         }, | ||||
|       }, | ||||
|       cmd_id: uuidv4(), | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   doZoom = (zoom: number) => { | ||||
|     this.handleStart() | ||||
|     // eslint-disable-next-line @typescript-eslint/no-floating-promises | ||||
|     this.engineCommandManager.sendSceneCommand({ | ||||
|       type: 'modeling_cmd_req', | ||||
|       cmd: { | ||||
|         type: 'default_camera_zoom', | ||||
|         magnitude: (-1 * zoom) / window.devicePixelRatio, | ||||
|       }, | ||||
|       cmd_id: uuidv4(), | ||||
|     }) | ||||
|     this.handleEnd() | ||||
|   } | ||||
|  | ||||
|   constructor( | ||||
|     isOrtho = false, | ||||
|     domElement: HTMLCanvasElement, | ||||
| @ -258,49 +308,6 @@ export class CameraControls { | ||||
|       this.onCameraChange() | ||||
|     } | ||||
|  | ||||
|     // Our stream is never more than 60fps. | ||||
|     // We can get away with capping our "virtual fps" to 60 then. | ||||
|     const FPS_VIRTUAL = 60 | ||||
|  | ||||
|     const doZoom = () => { | ||||
|       if (this.zoomDataFromLastFrame !== undefined) { | ||||
|         this.handleStart() | ||||
|         // eslint-disable-next-line @typescript-eslint/no-floating-promises | ||||
|         this.engineCommandManager.sendSceneCommand({ | ||||
|           type: 'modeling_cmd_req', | ||||
|           cmd: { | ||||
|             type: 'default_camera_zoom', | ||||
|             magnitude: | ||||
|               (-1 * this.zoomDataFromLastFrame) / window.devicePixelRatio, | ||||
|           }, | ||||
|           cmd_id: uuidv4(), | ||||
|         }) | ||||
|         this.handleEnd() | ||||
|       } | ||||
|       this.zoomDataFromLastFrame = undefined | ||||
|     } | ||||
|     setInterval(doZoom, 1000 / FPS_VIRTUAL) | ||||
|  | ||||
|     const doMove = () => { | ||||
|       if (this.moveDataFromLastFrame !== undefined) { | ||||
|         // eslint-disable-next-line @typescript-eslint/no-floating-promises | ||||
|         this.engineCommandManager.sendSceneCommand({ | ||||
|           type: 'modeling_cmd_req', | ||||
|           cmd: { | ||||
|             type: 'camera_drag_move', | ||||
|             interaction: this.moveDataFromLastFrame[2] as any, | ||||
|             window: { | ||||
|               x: this.moveDataFromLastFrame[0], | ||||
|               y: this.moveDataFromLastFrame[1], | ||||
|             }, | ||||
|           }, | ||||
|           cmd_id: uuidv4(), | ||||
|         }) | ||||
|       } | ||||
|       this.moveDataFromLastFrame = undefined | ||||
|     } | ||||
|     setInterval(doMove, 1000 / FPS_VIRTUAL) | ||||
|  | ||||
|     setTimeout(() => { | ||||
|       this.engineCommandManager.subscribeTo({ | ||||
|         event: 'camera_drag_end', | ||||
| @ -386,7 +393,9 @@ export class CameraControls { | ||||
|       if (interaction === 'none') return | ||||
|  | ||||
|       if (this.syncDirection === 'engineToClient') { | ||||
|         this.moveDataFromLastFrame = [event.clientX, event.clientY, interaction] | ||||
|         this.moveSender.send(() => { | ||||
|           this.doMove(interaction, [event.clientX, event.clientY]) | ||||
|         }) | ||||
|         return | ||||
|       } | ||||
|  | ||||
| @ -459,7 +468,9 @@ export class CameraControls { | ||||
|  | ||||
|     if (this.syncDirection === 'engineToClient') { | ||||
|       if (interaction === 'zoom') { | ||||
|         this.zoomDataFromLastFrame = event.deltaY | ||||
|         this.zoomSender.send(() => { | ||||
|           this.doZoom(event.deltaY) | ||||
|         }) | ||||
|       } else { | ||||
|         // This case will get handled when we add pan and rotate using Apple trackpad. | ||||
|         console.error( | ||||
|  | ||||
| @ -135,7 +135,9 @@ function CommandArgOptionInput({ | ||||
|           <Combobox.Input | ||||
|             id="option-input" | ||||
|             ref={inputRef} | ||||
|             onChange={(event) => setQuery(event.target.value)} | ||||
|             onChange={(event) => | ||||
|               !event.target.disabled && setQuery(event.target.value) | ||||
|             } | ||||
|             className="flex-grow px-2 py-1 border-b border-b-chalkboard-100 dark:border-b-chalkboard-80 !bg-transparent focus:outline-none" | ||||
|             onKeyDown={(event) => { | ||||
|               if (event.metaKey && event.key === 'k') | ||||
| @ -175,9 +177,18 @@ function CommandArgOptionInput({ | ||||
|             <Combobox.Option | ||||
|               key={option.name} | ||||
|               value={option} | ||||
|               disabled={option.disabled} | ||||
|               className="flex items-center gap-2 px-4 py-1 first:mt-2 last:mb-2 ui-active:bg-primary/10 dark:ui-active:bg-chalkboard-90" | ||||
|             > | ||||
|               <p className="flex-grow">{option.name} </p> | ||||
|               <p | ||||
|                 className={`flex-grow ${ | ||||
|                   (option.disabled && | ||||
|                     'text-chalkboard-70 dark:text-chalkboard-50 cursor-not-allowed') || | ||||
|                   '' | ||||
|                 }`} | ||||
|               > | ||||
|                 {option.name} | ||||
|               </p> | ||||
|               {option.value === currentOption?.value && ( | ||||
|                 <small className="text-chalkboard-70 dark:text-chalkboard-50"> | ||||
|                   current | ||||
|  | ||||
| @ -140,7 +140,7 @@ const FileTreeItem = ({ | ||||
|     async (eventType, path) => { | ||||
|       // Don't try to read a file that was removed. | ||||
|       if (isCurrentFile && eventType !== 'unlink') { | ||||
|         let code = await window.electron.readFile(path) | ||||
|         let code = await window.electron.readFile(path, { encoding: 'utf-8' }) | ||||
|         code = normalizeLineEndings(code) | ||||
|         codeManager.updateCodeStateEditor(code) | ||||
|       } | ||||
| @ -488,6 +488,12 @@ export const FileTreeInner = ({ | ||||
|   // Refresh the file tree when there are changes. | ||||
|   useFileSystemWatcher( | ||||
|     async (eventType, path) => { | ||||
|       // Our other watcher races with this watcher on the current file changes, | ||||
|       // so we need to stop this one from reacting at all, otherwise Bad Things | ||||
|       // Happen™. | ||||
|       const isCurrentFile = loaderData.file?.path === path | ||||
|       const hasChanged = eventType === 'change' | ||||
|       if (isCurrentFile && hasChanged) return | ||||
|       fileSend({ type: 'Refresh' }) | ||||
|     }, | ||||
|     [loaderData?.project?.path, fileContext.selectedDirectory.path].filter( | ||||
|  | ||||
| @ -69,7 +69,7 @@ import { exportFromEngine } from 'lib/exportFromEngine' | ||||
| import { Models } from '@kittycad/lib/dist/types/src' | ||||
| import toast from 'react-hot-toast' | ||||
| import { EditorSelection, Transaction } from '@codemirror/state' | ||||
| import { useNavigate, useSearchParams } from 'react-router-dom' | ||||
| import { useLoaderData, useNavigate, useSearchParams } from 'react-router-dom' | ||||
| import { letEngineAnimateAndSyncCamAfter } from 'clientSideScene/CameraControls' | ||||
| import { getVarNameModal } from 'hooks/useToolbarGuards' | ||||
| import { err, reportRejection, trap } from 'lib/trap' | ||||
| @ -84,6 +84,7 @@ import { | ||||
| import { submitAndAwaitTextToKcl } from 'lib/textToCad' | ||||
| import { useFileContext } from 'hooks/useFileContext' | ||||
| import { uuidv4 } from 'lib/utils' | ||||
| import { IndexLoaderData } from 'lib/types' | ||||
|  | ||||
| type MachineContext<T extends AnyStateMachine> = { | ||||
|   state: StateFrom<T> | ||||
| @ -116,6 +117,7 @@ export const ModelingMachineProvider = ({ | ||||
|   } = useSettingsAuthContext() | ||||
|   const navigate = useNavigate() | ||||
|   const { context, send: fileMachineSend } = useFileContext() | ||||
|   const { file } = useLoaderData() as IndexLoaderData | ||||
|   const token = auth?.context?.token | ||||
|   const streamRef = useRef<HTMLDivElement>(null) | ||||
|   const persistedContext = useMemo(() => getPersistedContext(), []) | ||||
| @ -409,12 +411,15 @@ export const ModelingMachineProvider = ({ | ||||
|         Make: ({ event }) => { | ||||
|           if (event.type !== 'Make') return | ||||
|           // Check if we already have an export intent. | ||||
|           if (engineCommandManager.exportIntent) { | ||||
|           if (engineCommandManager.exportInfo) { | ||||
|             toast.error('Already exporting') | ||||
|             return | ||||
|           } | ||||
|           // Set the export intent. | ||||
|           engineCommandManager.exportIntent = ExportIntent.Make | ||||
|           engineCommandManager.exportInfo = { | ||||
|             intent: ExportIntent.Make, | ||||
|             name: file?.name || '', | ||||
|           } | ||||
|  | ||||
|           // Set the current machine. | ||||
|           machineManager.currentMachine = event.data.machine | ||||
| @ -443,12 +448,16 @@ export const ModelingMachineProvider = ({ | ||||
|         }, | ||||
|         'Engine export': ({ event }) => { | ||||
|           if (event.type !== 'Export') return | ||||
|           if (engineCommandManager.exportIntent) { | ||||
|           if (engineCommandManager.exportInfo) { | ||||
|             toast.error('Already exporting') | ||||
|             return | ||||
|           } | ||||
|           // Set the export intent. | ||||
|           engineCommandManager.exportIntent = ExportIntent.Save | ||||
|           engineCommandManager.exportInfo = { | ||||
|             intent: ExportIntent.Save, | ||||
|             // This never gets used its only for make. | ||||
|             name: '', | ||||
|           } | ||||
|  | ||||
|           const format = { | ||||
|             ...event.data, | ||||
|  | ||||
| @ -12,7 +12,6 @@ export const NetworkMachineIndicator = ({ | ||||
|   const machineCount = machineManager.machineCount() | ||||
|   const reason = machineManager.noMachinesReason() | ||||
|   const machines = machineManager.machines | ||||
|   console.log('react machines', machines) | ||||
|  | ||||
|   return isDesktop() ? ( | ||||
|     <Popover className="relative"> | ||||
| @ -55,12 +54,6 @@ export const NetworkMachineIndicator = ({ | ||||
|                   <p className="text-chalkboard-60 dark:text-chalkboard-50 text-xs"> | ||||
|                     {machine.make_model.model} | ||||
|                   </p> | ||||
|                   <p className="text-chalkboard-60 dark:text-chalkboard-50 text-xs"> | ||||
|                     {machine.state.state.toUpperCase()} | ||||
|                     {machine.state.state === 'failed' && machine.state.message | ||||
|                       ? ': ' + machine.state.message | ||||
|                       : ''} | ||||
|                   </p> | ||||
|                   {machine.extra && | ||||
|                     machine.extra.type === 'bambu' && | ||||
|                     machine.extra.nozzle_diameter && ( | ||||
| @ -68,6 +61,17 @@ export const NetworkMachineIndicator = ({ | ||||
|                         Nozzle Diameter: {machine.extra.nozzle_diameter} | ||||
|                       </p> | ||||
|                     )} | ||||
|                   <p className="text-chalkboard-60 dark:text-chalkboard-50 text-xs"> | ||||
|                     {`Status: ${machine.state.state | ||||
|                       .charAt(0) | ||||
|                       .toUpperCase()}${machine.state.state.slice(1)}`} | ||||
|                     {machine.state.state === 'failed' && machine.state.message | ||||
|                       ? ` (${machine.state.message})` | ||||
|                       : ''} | ||||
|                     {machine.state.state === 'running' && machine.progress | ||||
|                       ? ` (${Math.round(machine.progress)}%)` | ||||
|                       : ''} | ||||
|                   </p> | ||||
|                 </li> | ||||
|               ) | ||||
|             })} | ||||
|  | ||||
| @ -18,6 +18,7 @@ export default class CodeManager { | ||||
|   #updateState: (arg: string) => void = () => {} | ||||
|   private _currentFilePath: string | null = null | ||||
|   private _hotkeys: { [key: string]: () => void } = {} | ||||
|   private timeoutWriter: ReturnType<typeof setTimeout> | undefined = undefined | ||||
|  | ||||
|   constructor() { | ||||
|     if (isDesktop()) { | ||||
| @ -115,7 +116,11 @@ export default class CodeManager { | ||||
|  | ||||
|   async writeToFile() { | ||||
|     if (isDesktop()) { | ||||
|       setTimeout(() => { | ||||
|       // Only write our buffer contents to file once per second. Any faster | ||||
|       // and file-system watchers which read, will receive empty data during | ||||
|       // writes. | ||||
|       clearTimeout(this.timeoutWriter) | ||||
|       this.timeoutWriter = setTimeout(() => { | ||||
|         // Wait one event loop to give a chance for params to be set | ||||
|         // Save the file to disk | ||||
|         this._currentFilePath && | ||||
| @ -126,7 +131,7 @@ export default class CodeManager { | ||||
|               console.error('error saving file', err) | ||||
|               toast.error('Error saving file, please check file permissions') | ||||
|             }) | ||||
|       }) | ||||
|       }, 1000) | ||||
|     } else { | ||||
|       safeLSSetItem(PERSIST_CODE_KEY, this.code) | ||||
|     } | ||||
|  | ||||
| @ -41,7 +41,7 @@ beforeAll(async () => { | ||||
|       }, | ||||
|     }) | ||||
|   }) | ||||
| }, 20_000) | ||||
| }, 30_000) | ||||
|  | ||||
| afterAll(() => { | ||||
|   engineCommandManager.tearDown() | ||||
|  | ||||
| @ -50,6 +50,11 @@ export enum ExportIntent { | ||||
|   Make = 'make', | ||||
| } | ||||
|  | ||||
| export interface ExportInfo { | ||||
|   intent: ExportIntent | ||||
|   name: string | ||||
| } | ||||
|  | ||||
| type ClientMetrics = Models['ClientMetrics_type'] | ||||
|  | ||||
| interface WebRTCClientMetrics extends ClientMetrics { | ||||
| @ -1354,7 +1359,7 @@ export class EngineCommandManager extends EventTarget { | ||||
|    * export in progress. Otherwise it is an enum value of the intent. | ||||
|    * Another export cannot be started if one is already in progress. | ||||
|    */ | ||||
|   private _exportIntent: ExportIntent | null = null | ||||
|   private _exportInfo: ExportInfo | null = null | ||||
|   _commandLogCallBack: (command: CommandLog[]) => void = () => {} | ||||
|  | ||||
|   subscriptions: { | ||||
| @ -1410,12 +1415,12 @@ export class EngineCommandManager extends EventTarget { | ||||
|     (() => {}) as any | ||||
|   kclManager: null | KclManager = null | ||||
|  | ||||
|   set exportIntent(intent: ExportIntent | null) { | ||||
|     this._exportIntent = intent | ||||
|   set exportInfo(info: ExportInfo | null) { | ||||
|     this._exportInfo = info | ||||
|   } | ||||
|  | ||||
|   get exportIntent() { | ||||
|     return this._exportIntent | ||||
|   get exportInfo() { | ||||
|     return this._exportInfo | ||||
|   } | ||||
|  | ||||
|   start({ | ||||
| @ -1607,7 +1612,7 @@ export class EngineCommandManager extends EventTarget { | ||||
|           // because in all other cases we send JSON strings. But in the case of | ||||
|           // export we send a binary blob. | ||||
|           // Pass this to our export function. | ||||
|           if (this.exportIntent === null || this.pendingExport === undefined) { | ||||
|           if (this.exportInfo === null || this.pendingExport === undefined) { | ||||
|             toast.error( | ||||
|               'Export intent was not set, but export data was received' | ||||
|             ) | ||||
| @ -1617,7 +1622,7 @@ export class EngineCommandManager extends EventTarget { | ||||
|             return | ||||
|           } | ||||
|  | ||||
|           switch (this.exportIntent) { | ||||
|           switch (this.exportInfo.intent) { | ||||
|             case ExportIntent.Save: { | ||||
|               exportSave(event.data, this.pendingExport.toastId).then(() => { | ||||
|                 this.pendingExport?.resolve(null) | ||||
| @ -1625,21 +1630,22 @@ export class EngineCommandManager extends EventTarget { | ||||
|               break | ||||
|             } | ||||
|             case ExportIntent.Make: { | ||||
|               exportMake(event.data, this.pendingExport.toastId).then( | ||||
|                 (result) => { | ||||
|                   if (result) { | ||||
|                     this.pendingExport?.resolve(null) | ||||
|                   } else { | ||||
|                     this.pendingExport?.reject('Failed to make export') | ||||
|                   } | ||||
|                 }, | ||||
|                 this.pendingExport?.reject | ||||
|               ) | ||||
|               exportMake( | ||||
|                 event.data, | ||||
|                 this.exportInfo.name, | ||||
|                 this.pendingExport.toastId | ||||
|               ).then((result) => { | ||||
|                 if (result) { | ||||
|                   this.pendingExport?.resolve(null) | ||||
|                 } else { | ||||
|                   this.pendingExport?.reject('Failed to make export') | ||||
|                 } | ||||
|               }, this.pendingExport?.reject) | ||||
|               break | ||||
|             } | ||||
|           } | ||||
|           // Set the export intent back to null. | ||||
|           this.exportIntent = null | ||||
|           this.exportInfo = null | ||||
|           return | ||||
|         } | ||||
|  | ||||
| @ -1953,15 +1959,15 @@ export class EngineCommandManager extends EventTarget { | ||||
|       return Promise.resolve(null) | ||||
|     } else if (cmd.type === 'export') { | ||||
|       const promise = new Promise<null>((resolve, reject) => { | ||||
|         if (this.exportIntent === null) { | ||||
|           if (this.exportIntent === null) { | ||||
|         if (this.exportInfo === null) { | ||||
|           if (this.exportInfo === null) { | ||||
|             toast.error('Export intent was not set, but export is being sent') | ||||
|             console.error('Export intent was not set, but export is being sent') | ||||
|             return | ||||
|           } | ||||
|         } | ||||
|         const toastId = toast.loading( | ||||
|           this.exportIntent === ExportIntent.Save | ||||
|           this.exportInfo.intent === ExportIntent.Save | ||||
|             ? EXPORT_TOAST_MESSAGES.START | ||||
|             : MAKE_TOAST_MESSAGES.START | ||||
|         ) | ||||
| @ -1975,7 +1981,7 @@ export class EngineCommandManager extends EventTarget { | ||||
|             resolve(passThrough) | ||||
|           }, | ||||
|           reject: (reason: string) => { | ||||
|             this.exportIntent = null | ||||
|             this.exportInfo = null | ||||
|             reject(reason) | ||||
|           }, | ||||
|           commandId: command.cmd_id, | ||||
|  | ||||
| @ -18,7 +18,7 @@ class FileSystemManager { | ||||
|     return Promise.resolve(window.electron.path.join(dir, path)) | ||||
|   } | ||||
|  | ||||
|   async readFile(path: string): Promise<Uint8Array | void> { | ||||
|   async readFile(path: string): Promise<Uint8Array> { | ||||
|     // Using local file system only works from desktop. | ||||
|     if (!isDesktop()) { | ||||
|       return Promise.reject( | ||||
|  | ||||
| @ -110,6 +110,7 @@ const initialise = async () => { | ||||
|     const fullUrl = wasmUrl() | ||||
|     const input = await fetch(fullUrl) | ||||
|     const buffer = await input.arrayBuffer() | ||||
|  | ||||
|     return await init(buffer) | ||||
|   } catch (e) { | ||||
|     console.log('Error initialising WASM', e) | ||||
|  | ||||
| @ -194,10 +194,24 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< | ||||
|                 `${machine.id} (${ | ||||
|                   machine.make_model.model || machine.make_model.manufacturer | ||||
|                 }) (${machine.state.state})` + | ||||
|                 (machine.extra && | ||||
|                 machine.extra.type === 'bambu' && | ||||
|                 machine.extra.nozzle_diameter | ||||
|                   ? ` - Nozzle Diameter: ${machine.extra.nozzle_diameter}` | ||||
|                 (machine.hardware_configuration && | ||||
|                 machine.hardware_configuration.type !== 'none' && | ||||
|                 machine.hardware_configuration.config.nozzle_diameter | ||||
|                   ? ` - Nozzle Diameter: ${machine.hardware_configuration.config.nozzle_diameter}` | ||||
|                   : '') + | ||||
|                 (machine.hardware_configuration && | ||||
|                 machine.hardware_configuration.type !== 'none' && | ||||
|                 machine.hardware_configuration.config.filaments && | ||||
|                 machine.hardware_configuration.config.filaments[0] | ||||
|                   ? ` - ${ | ||||
|                       machine.hardware_configuration.config.filaments[0].name | ||||
|                     } #${ | ||||
|                       machine.hardware_configuration.config && | ||||
|                       machine.hardware_configuration.config.filaments[0].color?.slice( | ||||
|                         0, | ||||
|                         6 | ||||
|                       ) | ||||
|                     }` | ||||
|                   : ''), | ||||
|               isCurrent: false, | ||||
|               disabled: machine.state.state !== 'idle', | ||||
|  | ||||
| @ -258,5 +258,6 @@ export type CommandArgumentWithName< | ||||
| export type CommandArgumentOption<A> = { | ||||
|   name: string | ||||
|   isCurrent?: boolean | ||||
|   disabled?: boolean | ||||
|   value: A | ||||
| } | ||||
|  | ||||
| @ -92,6 +92,7 @@ export const MAKE_TOAST_MESSAGES = { | ||||
|   NO_MACHINE_API_IP: 'No machine api ip available', | ||||
|   NO_CURRENT_MACHINE: 'No current machine available', | ||||
|   NO_MACHINE_ID: 'No machine id available', | ||||
|   NO_NAME: 'No name provided', | ||||
|   ERROR_STARTING_PRINT: 'Error while starting print', | ||||
|   SUCCESS: 'Started print successfully', | ||||
| } | ||||
|  | ||||
| @ -448,7 +448,9 @@ export const readProjectSettingsFile = async ( | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   const configToml = await window.electron.readFile(settingsPath) | ||||
|   const configToml = await window.electron.readFile(settingsPath, { | ||||
|     encoding: 'utf-8', | ||||
|   }) | ||||
|   const configObj = parseProjectSettings(configToml) | ||||
|   if (err(configObj)) { | ||||
|     return Promise.reject(configObj) | ||||
| @ -467,7 +469,9 @@ export const readAppSettingsFile = async () => { | ||||
|  | ||||
|   // The file exists, read it and parse it. | ||||
|   if (window.electron.exists(settingsPath)) { | ||||
|     const configToml = await window.electron.readFile(settingsPath) | ||||
|     const configToml = await window.electron.readFile(settingsPath, { | ||||
|       encoding: 'utf-8', | ||||
|     }) | ||||
|     const parsedAppConfig = parseAppSettings(configToml) | ||||
|     if (err(parsedAppConfig)) { | ||||
|       return Promise.reject(parsedAppConfig) | ||||
| @ -527,7 +531,9 @@ export const readTokenFile = async () => { | ||||
|   let settingsPath = await getTokenFilePath() | ||||
|  | ||||
|   if (window.electron.exists(settingsPath)) { | ||||
|     const token: string = await window.electron.readFile(settingsPath) | ||||
|     const token: string = await window.electron.readFile(settingsPath, { | ||||
|       encoding: 'utf-8', | ||||
|     }) | ||||
|     if (!token) return '' | ||||
|  | ||||
|     return token | ||||
|  | ||||
							
								
								
									
										31
									
								
								src/lib/engineUtils.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,31 @@ | ||||
| import EngineUtils from '@engine-utils' | ||||
|  | ||||
| type KCEngineUtilsEvaluatePath = { | ||||
|   (sketch: string, t: number): string | ||||
| } | ||||
| let kcEngineUtilsEvaluatePath: KCEngineUtilsEvaluatePath | ||||
|  | ||||
| export async function init() { | ||||
|   return await new Promise((resolve, reject) => { | ||||
|     try { | ||||
|       EngineUtils().then((module) => { | ||||
|         kcEngineUtilsEvaluatePath = module.cwrap( | ||||
|           'kcEngineUtilsEvaluatePath', | ||||
|           'string', | ||||
|           ['string', 'number'] | ||||
|         ) | ||||
|         resolve(true) | ||||
|       }) | ||||
|     } catch (e) { | ||||
|       reject(e) | ||||
|     } | ||||
|   }) | ||||
| } | ||||
|  | ||||
| export async function getTruePathEndPos(sketch: string) { | ||||
|   if (!kcEngineUtilsEvaluatePath) { | ||||
|     await init() | ||||
|   } | ||||
|  | ||||
|   return kcEngineUtilsEvaluatePath(sketch, 1.0) | ||||
| } | ||||
| @ -8,8 +8,15 @@ import { MAKE_TOAST_MESSAGES } from './constants' | ||||
| // Make files locally from an export call. | ||||
| export async function exportMake( | ||||
|   data: ArrayBuffer, | ||||
|   name: string, | ||||
|   toastId: string | ||||
| ): Promise<Response | null> { | ||||
|   if (name === '') { | ||||
|     console.error(MAKE_TOAST_MESSAGES.NO_NAME) | ||||
|     toast.error(MAKE_TOAST_MESSAGES.NO_NAME, { id: toastId }) | ||||
|     return null | ||||
|   } | ||||
|  | ||||
|   if (machineManager.machineCount() === 0) { | ||||
|     console.error(MAKE_TOAST_MESSAGES.NO_MACHINES) | ||||
|     toast.error(MAKE_TOAST_MESSAGES.NO_MACHINES, { id: toastId }) | ||||
| @ -39,7 +46,7 @@ export async function exportMake( | ||||
|  | ||||
|   const params: components['schemas']['PrintParameters'] = { | ||||
|     machine_id: machineId, | ||||
|     job_name: 'Exported Job', // TODO: make this the project name. | ||||
|     job_name: name, | ||||
|   } | ||||
|   try { | ||||
|     console.log('params', params) | ||||
|  | ||||
| @ -109,7 +109,9 @@ export const fileLoader: LoaderFunction = async ( | ||||
|         ) | ||||
|       } | ||||
|  | ||||
|       code = await window.electron.readFile(currentFilePath) | ||||
|       code = await window.electron.readFile(currentFilePath, { | ||||
|         encoding: 'utf-8', | ||||
|       }) | ||||
|       code = normalizeLineEndings(code) | ||||
|  | ||||
|       // Update both the state and the editor's code. | ||||
|  | ||||
| @ -74,7 +74,7 @@ const watchFileOff = (path: string, key: string) => { | ||||
|     fsWatchListeners.set(path, watchers) | ||||
|   } | ||||
| } | ||||
| const readFile = (path: string) => fs.readFile(path, 'utf-8') | ||||
| const readFile = fs.readFile | ||||
| // It seems like from the node source code this does not actually block but also | ||||
| // don't trust me on that (jess). | ||||
| const exists = (path: string) => fsSync.existsSync(path) | ||||
|  | ||||
							
								
								
									
										12
									
								
								src/wasm-lib/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						| @ -121,9 +121,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "anyhow" | ||||
| version = "1.0.89" | ||||
| version = "1.0.91" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" | ||||
| checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" | ||||
| dependencies = [ | ||||
|  "backtrace", | ||||
| ] | ||||
| @ -1684,9 +1684,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "kittycad-modeling-cmds" | ||||
| version = "0.2.68" | ||||
| version = "0.2.70" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7e3aedfcc1d8ea9995ec3eb78a6743c585c9380475c48701797f107489b696aa" | ||||
| checksum = "b135696d07a4fab928e5abace4dd05f4976eafab5d73e5747a85dc5a684b936c" | ||||
| dependencies = [ | ||||
|  "anyhow", | ||||
|  "chrono", | ||||
| @ -3005,9 +3005,9 @@ dependencies = [ | ||||
|  | ||||
| [[package]] | ||||
| name = "serde_json" | ||||
| version = "1.0.128" | ||||
| version = "1.0.132" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" | ||||
| checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" | ||||
| dependencies = [ | ||||
|  "indexmap 2.6.0", | ||||
|  "itoa", | ||||
|  | ||||
| @ -72,7 +72,7 @@ members = [ | ||||
| [workspace.dependencies] | ||||
| http = "1" | ||||
| kittycad = { version = "0.3.23", default-features = false, features = ["js", "requests"] } | ||||
| kittycad-modeling-cmds = { version = "0.2.68", features = ["websocket"] } | ||||
| kittycad-modeling-cmds = { version = "0.2.70", features = ["websocket"] } | ||||
|  | ||||
| [[test]] | ||||
| name = "executor" | ||||
|  | ||||
| @ -12,7 +12,7 @@ fn basic() { | ||||
|     let expected = Program { | ||||
|         start: 0, | ||||
|         end: 11, | ||||
|         body: vec![BodyItem::VariableDeclaration(VariableDeclaration { | ||||
|         body: vec![BodyItem::VariableDeclaration(Box::new(VariableDeclaration { | ||||
|             start: 0, | ||||
|             end: 11, | ||||
|             declarations: vec![VariableDeclarator { | ||||
| @ -36,7 +36,7 @@ fn basic() { | ||||
|             visibility: ItemVisibility::Default, | ||||
|             kind: VariableKind::Const, | ||||
|             digest: None, | ||||
|         })], | ||||
|         }))], | ||||
|         non_code_meta: NonCodeMeta::default(), | ||||
|         digest: None, | ||||
|     }; | ||||
|  | ||||
| @ -68,7 +68,7 @@ tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] | ||||
| tower-lsp = { version = "0.20.0", features = ["proposed"] } | ||||
|  | ||||
| [features] | ||||
| default = ["engine"] | ||||
| default = ["engine"]  # add wasm-engine-utils here when we're ready | ||||
| cli = ["dep:clap"] | ||||
| # For the lsp server, when run with stdout for rpc we want to disable println. | ||||
| # This is used for editor extensions that use the lsp server. | ||||
| @ -77,6 +77,10 @@ engine = [] | ||||
| pyo3 = ["dep:pyo3"] | ||||
| # Helper functions also used in benchmarks. | ||||
| lsp-test-util = [] | ||||
| #if enabled, kcl will link directly against a wasm build of the engine utils lib to save latency | ||||
| wasm-engine-utils = [] | ||||
| #if enabled, kcl will link directly against a native build of the engine utils lib to save latency (not yet functional) | ||||
| native-engine-utils = [] | ||||
|  | ||||
| tabled = ["dep:tabled"] | ||||
|  | ||||
|  | ||||
| @ -450,11 +450,11 @@ pub(crate) use impl_value_meta; | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] | ||||
| #[databake(path = kcl_lib::ast::types)] | ||||
| #[ts(export)] | ||||
| #[serde(untagged)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum BodyItem { | ||||
|     ImportStatement(Box<ImportStatement>), | ||||
|     ExpressionStatement(ExpressionStatement), | ||||
|     VariableDeclaration(VariableDeclaration), | ||||
|     VariableDeclaration(Box<VariableDeclaration>), | ||||
|     ReturnStatement(ReturnStatement), | ||||
| } | ||||
|  | ||||
| @ -494,7 +494,7 @@ impl From<&BodyItem> for SourceRange { | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] | ||||
| #[databake(path = kcl_lib::ast::types)] | ||||
| #[ts(export)] | ||||
| #[serde(untagged)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum Expr { | ||||
|     Literal(Box<Literal>), | ||||
|     Identifier(Box<Identifier>), | ||||
| @ -713,7 +713,7 @@ impl From<&Expr> for SourceRange { | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] | ||||
| #[databake(path = kcl_lib::ast::types)] | ||||
| #[ts(export)] | ||||
| #[serde(untagged)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum BinaryPart { | ||||
|     Literal(Box<Literal>), | ||||
|     Identifier(Box<Identifier>), | ||||
| @ -2140,7 +2140,7 @@ impl ObjectProperty { | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] | ||||
| #[databake(path = kcl_lib::ast::types)] | ||||
| #[ts(export)] | ||||
| #[serde(untagged)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum MemberObject { | ||||
|     MemberExpression(Box<MemberExpression>), | ||||
|     Identifier(Box<Identifier>), | ||||
| @ -2187,7 +2187,7 @@ impl From<&MemberObject> for SourceRange { | ||||
| #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, Bake)] | ||||
| #[databake(path = kcl_lib::ast::types)] | ||||
| #[ts(export)] | ||||
| #[serde(untagged)] | ||||
| #[serde(tag = "type")] | ||||
| pub enum LiteralIdentifier { | ||||
|     Identifier(Box<Identifier>), | ||||
|     Literal(Box<Literal>), | ||||
| @ -2719,7 +2719,7 @@ pub struct FunctionExpression { | ||||
| impl_value_meta!(FunctionExpression); | ||||
|  | ||||
| #[derive(Debug, PartialEq, Clone)] | ||||
| pub struct RequiredParamAfterOptionalParam(pub Parameter); | ||||
| pub struct RequiredParamAfterOptionalParam(pub Box<Parameter>); | ||||
|  | ||||
| impl std::fmt::Display for RequiredParamAfterOptionalParam { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||
| @ -2751,7 +2751,7 @@ impl FunctionExpression { | ||||
|             if param.optional { | ||||
|                 found_optional = true; | ||||
|             } else if found_optional { | ||||
|                 return Err(RequiredParamAfterOptionalParam(param.clone())); | ||||
|                 return Err(RequiredParamAfterOptionalParam(Box::new(param.clone()))); | ||||
|             } | ||||
|         } | ||||
|         let boundary = self.params.partition_point(|param| !param.optional); | ||||
|  | ||||
| @ -551,13 +551,13 @@ impl ArrayRangeExpression { | ||||
|             .execute_expr(&self.start_element, exec_state, &metadata, StatementKind::Expression) | ||||
|             .await? | ||||
|             .get_json_value()?; | ||||
|         let start = parse_json_number_as_u64(&start, (&*self.start_element).into())?; | ||||
|         let start = parse_json_number_as_i64(&start, (&*self.start_element).into())?; | ||||
|         let metadata = Metadata::from(&*self.end_element); | ||||
|         let end = ctx | ||||
|             .execute_expr(&self.end_element, exec_state, &metadata, StatementKind::Expression) | ||||
|             .await? | ||||
|             .get_json_value()?; | ||||
|         let end = parse_json_number_as_u64(&end, (&*self.end_element).into())?; | ||||
|         let end = parse_json_number_as_i64(&end, (&*self.end_element).into())?; | ||||
|  | ||||
|         if end < start { | ||||
|             return Err(KclError::Semantic(KclErrorDetails { | ||||
| @ -603,9 +603,9 @@ impl ObjectExpression { | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn parse_json_number_as_u64(j: &serde_json::Value, source_range: SourceRange) -> Result<u64, KclError> { | ||||
| fn parse_json_number_as_i64(j: &serde_json::Value, source_range: SourceRange) -> Result<i64, KclError> { | ||||
|     if let serde_json::Value::Number(n) = &j { | ||||
|         n.as_u64().ok_or_else(|| { | ||||
|         n.as_i64().ok_or_else(|| { | ||||
|             KclError::Syntax(KclErrorDetails { | ||||
|                 source_ranges: vec![source_range], | ||||
|                 message: format!("Invalid integer: {}", j), | ||||
|  | ||||
							
								
								
									
										57
									
								
								src/wasm-lib/kcl/src/engine/engine_utils.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,57 @@ | ||||
| //! Functions for calling into the engine-utils library (a set of C++ utilities containing various logic for client-side CAD processing) | ||||
| //! Note that this binary may not be available to all builds of kcl, so fallbacks that call the engine API should be implemented | ||||
|  | ||||
| use crate::{ | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     std::Args, | ||||
| }; | ||||
| use anyhow::Result; | ||||
| use std::ffi::{CString, CStr}; | ||||
| use kittycad_modeling_cmds::{length_unit::LengthUnit, shared::Point3d}; | ||||
|  | ||||
| mod cpp { | ||||
|     use std::os::raw::c_char; | ||||
|  | ||||
|     extern "C" { | ||||
|         pub fn kcEngineUtilsEvaluatePath(sketch: *const c_char, t: f64) -> *const c_char; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| pub fn is_available() -> bool { | ||||
|     true | ||||
| } | ||||
|  | ||||
| pub async fn get_true_path_end_pos(sketch: String, args: &Args) -> Result<Point3d<LengthUnit>, KclError> { | ||||
|     let c_string = CString::new(sketch).map_err(|e| { | ||||
|         KclError::Internal(KclErrorDetails { | ||||
|             message: format!("{:?}", e), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         }) | ||||
|     })?; | ||||
|     let arg = c_string.into_raw(); | ||||
|     let result_string: String; | ||||
|  | ||||
|     unsafe { | ||||
|         let result = cpp::kcEngineUtilsEvaluatePath(arg, 1.0); | ||||
|         let result_cstr = CStr::from_ptr(result); | ||||
|         let str_slice: &str = result_cstr.to_str().map_err(|e| { | ||||
|             KclError::Internal(KclErrorDetails { | ||||
|                 message: format!("{:?}", e), | ||||
|                 source_ranges: vec![args.source_range], | ||||
|             }) | ||||
|         })?; | ||||
|         let str_buf: String = str_slice.to_owned();     | ||||
|         result_string = str_buf.clone(); | ||||
|         let _ = CString::from_raw(arg); | ||||
|     } | ||||
|  | ||||
|     let point: Point3d<f64> = serde_json::from_str(&result_string).map_err(|e| { | ||||
|         KclError::Type(KclErrorDetails { | ||||
|             message: format!("Failed to path position from json: {}", e), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         }) | ||||
|     })?; | ||||
|      | ||||
|     Ok(Point3d::<f64>::from(point).map(LengthUnit)) | ||||
| } | ||||
							
								
								
									
										35
									
								
								src/wasm-lib/kcl/src/engine/engine_utils_api.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,35 @@ | ||||
| //! Functions for calling into the engine-utils library (a set of C++ utilities containing various logic for client-side CAD processing) | ||||
| //! Note that this binary may not be available to all builds of kcl, so fallbacks that call the engine API should be implemented | ||||
|  | ||||
| use crate::{ | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     std::Args, | ||||
| }; | ||||
| use crate::engine::kcmc::{each_cmd as mcmd, ModelingCmd}; | ||||
| use anyhow::Result; | ||||
| use kittycad_modeling_cmds::{length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Point3d, websocket::OkWebSocketResponseData}; | ||||
|  | ||||
| pub fn is_available() -> bool { | ||||
|     true | ||||
| } | ||||
|  | ||||
| pub async fn get_true_path_end_pos(sketch: String, args: &Args) -> Result<Point3d<LengthUnit>, KclError> { | ||||
|     let id = uuid::Uuid::new_v4(); | ||||
|      | ||||
|     let resp = args.send_modeling_cmd(id, ModelingCmd::from(mcmd::EngineUtilEvaluatePath { | ||||
|         path_json: sketch, | ||||
|         t: 1.0, | ||||
|     })).await?; | ||||
|  | ||||
|     let OkWebSocketResponseData::Modeling { | ||||
|         modeling_response: OkModelingCmdResponse::EngineUtilEvaluatePath(point), | ||||
|     } = &resp  | ||||
|     else { | ||||
|         return Err(KclError::Engine(KclErrorDetails { | ||||
|             message: format!("mcmd::EngineUtilEvaluatePath response was not as expected: {:?}", resp), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         })); | ||||
|     }; | ||||
|  | ||||
|     Ok(point.pos) | ||||
| } | ||||
							
								
								
									
										56
									
								
								src/wasm-lib/kcl/src/engine/engine_utils_wasm.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,56 @@ | ||||
| //! Functions for calling into the engine-utils library (a set of C++ utilities containing various logic for client-side CAD processing) | ||||
| //! Note that this binary may not be available to all builds of kcl, so fallbacks that call the engine API should be implemented | ||||
|  | ||||
| use crate::{ | ||||
|     errors::{KclError, KclErrorDetails}, | ||||
|     std::Args, | ||||
| }; | ||||
| use anyhow::Result; | ||||
| use kittycad_modeling_cmds::{length_unit::LengthUnit, shared::Point3d}; | ||||
| mod cpp { | ||||
|     use wasm_bindgen::prelude::wasm_bindgen; | ||||
|  | ||||
|     #[wasm_bindgen(module = "/../../lib/engineUtils.ts")] | ||||
|     extern "C" { | ||||
|         #[wasm_bindgen(js_name = getTruePathEndPos, catch)] | ||||
|         pub fn get_true_path_end_pos(sketch: String) -> Result<js_sys::Promise, js_sys::Error>; | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn is_available() -> bool { | ||||
|     true | ||||
| } | ||||
|  | ||||
| async fn call_cpp<F>(args: &Args, f: F) -> Result<String, KclError> | ||||
| where | ||||
|     F: FnOnce() -> Result<js_sys::Promise, js_sys::Error>, | ||||
| { | ||||
|     let promise = f().map_err(|e| { | ||||
|         KclError::Internal(KclErrorDetails { | ||||
|             message: format!("{:?}", e), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         }) | ||||
|     })?; | ||||
|  | ||||
|     let result = crate::wasm::JsFuture::from(promise).await.map_err(|e| { | ||||
|         KclError::Internal(KclErrorDetails { | ||||
|             message: format!("{:?}", e), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         }) | ||||
|     })?; | ||||
|  | ||||
|     Ok(result.as_string().unwrap_or_default()) | ||||
| } | ||||
|  | ||||
| pub async fn get_true_path_end_pos(sketch: String, args: &Args) -> Result<Point3d<LengthUnit>, KclError> { | ||||
|     let result_str = call_cpp(args, || cpp::get_true_path_end_pos(sketch.into())).await?; | ||||
|  | ||||
|     let point: Point3d<f64> = serde_json::from_str(&result_str).map_err(|e| { | ||||
|         KclError::Type(KclErrorDetails { | ||||
|             message: format!("Failed to path position from json: {}", e), | ||||
|             source_ranges: vec![args.source_range], | ||||
|         }) | ||||
|     })?; | ||||
|  | ||||
|     Ok(Point3d::<f64>::from(point).map(LengthUnit)) | ||||
| } | ||||
| @ -8,6 +8,17 @@ pub mod conn_mock; | ||||
| #[cfg(feature = "engine")] | ||||
| pub mod conn_wasm; | ||||
|  | ||||
| #[cfg(not(target_arch = "wasm32"))] | ||||
| #[cfg(feature = "native-engine-utils")] | ||||
| pub mod engine_utils; | ||||
| #[cfg(target_arch = "wasm32")] | ||||
| #[cfg(feature = "wasm-engine-utils")] | ||||
| pub mod engine_utils_wasm; | ||||
|  | ||||
| #[cfg(feature = "engine")] | ||||
| #[cfg(any(not(target_arch = "wasm32"), all(not(feature = "native-engine-utils"), not(feature = "wasm-engine-utils"))))] | ||||
| pub mod engine_utils_api; | ||||
|  | ||||
| use std::{ | ||||
|     collections::HashMap, | ||||
|     sync::{Arc, Mutex}, | ||||
|  | ||||
| @ -1601,6 +1601,19 @@ pub enum Path { | ||||
|         #[serde(flatten)] | ||||
|         base: BasePath, | ||||
|     }, | ||||
|     /// An arc (only used for engine-utils arg serialization for now) | ||||
|     Arc { | ||||
|         #[serde(flatten)] | ||||
|         base: BasePath, | ||||
|         /// angle range | ||||
|         #[ts(type = "[number, number]")] | ||||
|         angle_range: [f64; 2], | ||||
|         /// center | ||||
|         #[ts(type = "[number, number]")] | ||||
|         center: [f64; 2], | ||||
|         /// the arc's radius | ||||
|         radius: f64, | ||||
|     }, | ||||
|     /// A arc that is tangential to the last path segment that goes to a point | ||||
|     TangentialArcTo { | ||||
|         #[serde(flatten)] | ||||
| @ -1620,6 +1633,10 @@ pub enum Path { | ||||
|         center: [f64; 2], | ||||
|         /// arc's direction | ||||
|         ccw: bool, | ||||
|         /// the arc's radius | ||||
|         radius: f64, | ||||
|         /// the arc's angle offset | ||||
|         offset: f64, | ||||
|     }, | ||||
|     // TODO: consolidate segment enums, remove Circle. https://github.com/KittyCAD/modeling-app/issues/3940 | ||||
|     /// a complete arc | ||||
| @ -1668,6 +1685,7 @@ impl Path { | ||||
|             Path::TangentialArcTo { base, .. } => base.geo_meta.id, | ||||
|             Path::TangentialArc { base, .. } => base.geo_meta.id, | ||||
|             Path::Circle { base, .. } => base.geo_meta.id, | ||||
|             Path::Arc { base, .. } => base.geo_meta.id, | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -1680,6 +1698,7 @@ impl Path { | ||||
|             Path::TangentialArcTo { base, .. } => base.tag.clone(), | ||||
|             Path::TangentialArc { base, .. } => base.tag.clone(), | ||||
|             Path::Circle { base, .. } => base.tag.clone(), | ||||
|             Path::Arc { base, .. } => base.tag.clone(), | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -1692,6 +1711,7 @@ impl Path { | ||||
|             Path::TangentialArcTo { base, .. } => base, | ||||
|             Path::TangentialArc { base, .. } => base, | ||||
|             Path::Circle { base, .. } => base, | ||||
|             Path::Arc { base, .. } => base, | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -1704,6 +1724,7 @@ impl Path { | ||||
|             Path::TangentialArcTo { base, .. } => Some(base), | ||||
|             Path::TangentialArc { base, .. } => Some(base), | ||||
|             Path::Circle { base, .. } => Some(base), | ||||
|             Path::Arc { base, .. } => Some(base), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1342,7 +1342,7 @@ fn declaration_keyword(i: TokenSlice) -> PResult<(VariableKind, Token)> { | ||||
| } | ||||
|  | ||||
| /// Parse a variable/constant declaration. | ||||
| fn declaration(i: TokenSlice) -> PResult<VariableDeclaration> { | ||||
| fn declaration(i: TokenSlice) -> PResult<Box<VariableDeclaration>> { | ||||
|     let (visibility, visibility_token) = opt(terminated(item_visibility, whitespace)) | ||||
|         .parse_next(i)? | ||||
|         .map_or((ItemVisibility::Default, None), |pair| (pair.0, Some(pair.1))); | ||||
| @ -1404,7 +1404,7 @@ fn declaration(i: TokenSlice) -> PResult<VariableDeclaration> { | ||||
|     .map_err(|e| e.cut())?; | ||||
|  | ||||
|     let end = val.end(); | ||||
|     Ok(VariableDeclaration { | ||||
|     Ok(Box::new(VariableDeclaration { | ||||
|         start, | ||||
|         end, | ||||
|         declarations: vec![VariableDeclarator { | ||||
| @ -1417,7 +1417,7 @@ fn declaration(i: TokenSlice) -> PResult<VariableDeclaration> { | ||||
|         visibility, | ||||
|         kind, | ||||
|         digest: None, | ||||
|     }) | ||||
|     })) | ||||
| } | ||||
|  | ||||
| impl TryFrom<Token> for Identifier { | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 5, | ||||
|   "operator": "+", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,6 +16,7 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 4, | ||||
|     "end": 5, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 3, | ||||
|   "operator": "+", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,6 +16,7 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 2, | ||||
|     "end": 3, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 4, | ||||
|   "operator": "-", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,6 +16,7 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 3, | ||||
|     "end": 4, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 9, | ||||
|   "operator": "+", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,11 +16,13 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 4, | ||||
|     "end": 9, | ||||
|     "operator": "*", | ||||
|     "left": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 4, | ||||
|       "end": 5, | ||||
| @ -27,6 +30,7 @@ expression: actual | ||||
|       "raw": "2" | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 8, | ||||
|       "end": 9, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 11, | ||||
|   "operator": "*", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,11 +16,13 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 6, | ||||
|     "end": 11, | ||||
|     "operator": "+", | ||||
|     "left": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 6, | ||||
|       "end": 7, | ||||
| @ -27,6 +30,7 @@ expression: actual | ||||
|       "raw": "2" | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 10, | ||||
|       "end": 11, | ||||
|  | ||||
| @ -8,11 +8,13 @@ expression: actual | ||||
|   "end": 17, | ||||
|   "operator": "/", | ||||
|   "left": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 0, | ||||
|     "end": 11, | ||||
|     "operator": "*", | ||||
|     "left": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 0, | ||||
|       "end": 1, | ||||
| @ -20,11 +22,13 @@ expression: actual | ||||
|       "raw": "1" | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "BinaryExpression", | ||||
|       "type": "BinaryExpression", | ||||
|       "start": 6, | ||||
|       "end": 11, | ||||
|       "operator": "+", | ||||
|       "left": { | ||||
|         "type": "Literal", | ||||
|         "type": "Literal", | ||||
|         "start": 6, | ||||
|         "end": 7, | ||||
| @ -32,6 +36,7 @@ expression: actual | ||||
|         "raw": "2" | ||||
|       }, | ||||
|       "right": { | ||||
|         "type": "Literal", | ||||
|         "type": "Literal", | ||||
|         "start": 10, | ||||
|         "end": 11, | ||||
| @ -41,6 +46,7 @@ expression: actual | ||||
|     } | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 16, | ||||
|     "end": 17, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 17, | ||||
|   "operator": "+", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,16 +16,19 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 6, | ||||
|     "end": 17, | ||||
|     "operator": "/", | ||||
|     "left": { | ||||
|       "type": "BinaryExpression", | ||||
|       "type": "BinaryExpression", | ||||
|       "start": 6, | ||||
|       "end": 11, | ||||
|       "operator": "+", | ||||
|       "left": { | ||||
|         "type": "Literal", | ||||
|         "type": "Literal", | ||||
|         "start": 6, | ||||
|         "end": 7, | ||||
| @ -32,6 +36,7 @@ expression: actual | ||||
|         "raw": "2" | ||||
|       }, | ||||
|       "right": { | ||||
|         "type": "Literal", | ||||
|         "type": "Literal", | ||||
|         "start": 10, | ||||
|         "end": 11, | ||||
| @ -40,6 +45,7 @@ expression: actual | ||||
|       } | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 16, | ||||
|       "end": 17, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 22, | ||||
|   "operator": "*", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,21 +16,25 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 7, | ||||
|     "end": 22, | ||||
|     "operator": "+", | ||||
|     "left": { | ||||
|       "type": "BinaryExpression", | ||||
|       "type": "BinaryExpression", | ||||
|       "start": 7, | ||||
|       "end": 18, | ||||
|       "operator": "/", | ||||
|       "left": { | ||||
|         "type": "BinaryExpression", | ||||
|         "type": "BinaryExpression", | ||||
|         "start": 7, | ||||
|         "end": 12, | ||||
|         "operator": "+", | ||||
|         "left": { | ||||
|           "type": "Literal", | ||||
|           "type": "Literal", | ||||
|           "start": 7, | ||||
|           "end": 8, | ||||
| @ -37,6 +42,7 @@ expression: actual | ||||
|           "raw": "2" | ||||
|         }, | ||||
|         "right": { | ||||
|           "type": "Literal", | ||||
|           "type": "Literal", | ||||
|           "start": 11, | ||||
|           "end": 12, | ||||
| @ -45,6 +51,7 @@ expression: actual | ||||
|         } | ||||
|       }, | ||||
|       "right": { | ||||
|         "type": "Literal", | ||||
|         "type": "Literal", | ||||
|         "start": 17, | ||||
|         "end": 18, | ||||
| @ -53,6 +60,7 @@ expression: actual | ||||
|       } | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 21, | ||||
|       "end": 22, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 13, | ||||
|   "operator": "*", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,11 +16,13 @@ expression: actual | ||||
|     "raw": "1" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 8, | ||||
|     "end": 13, | ||||
|     "operator": "+", | ||||
|     "left": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 8, | ||||
|       "end": 9, | ||||
| @ -27,6 +30,7 @@ expression: actual | ||||
|       "raw": "2" | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 12, | ||||
|       "end": 13, | ||||
|  | ||||
| @ -8,27 +8,32 @@ expression: actual | ||||
|   "end": 44, | ||||
|   "operator": "/", | ||||
|   "left": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 0, | ||||
|     "end": 22, | ||||
|     "operator": "*", | ||||
|     "left": { | ||||
|       "type": "BinaryExpression", | ||||
|       "type": "BinaryExpression", | ||||
|       "start": 0, | ||||
|       "end": 18, | ||||
|       "operator": "*", | ||||
|       "left": { | ||||
|         "type": "BinaryExpression", | ||||
|         "type": "BinaryExpression", | ||||
|         "start": 0, | ||||
|         "end": 12, | ||||
|         "operator": "*", | ||||
|         "left": { | ||||
|           "type": "Identifier", | ||||
|           "type": "Identifier", | ||||
|           "start": 0, | ||||
|           "end": 8, | ||||
|           "name": "distance" | ||||
|         }, | ||||
|         "right": { | ||||
|           "type": "Identifier", | ||||
|           "type": "Identifier", | ||||
|           "start": 11, | ||||
|           "end": 12, | ||||
| @ -36,6 +41,7 @@ expression: actual | ||||
|         } | ||||
|       }, | ||||
|       "right": { | ||||
|         "type": "Identifier", | ||||
|         "type": "Identifier", | ||||
|         "start": 15, | ||||
|         "end": 18, | ||||
| @ -43,6 +49,7 @@ expression: actual | ||||
|       } | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Literal", | ||||
|       "type": "Literal", | ||||
|       "start": 21, | ||||
|       "end": 22, | ||||
| @ -51,17 +58,20 @@ expression: actual | ||||
|     } | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "BinaryExpression", | ||||
|     "type": "BinaryExpression", | ||||
|     "start": 26, | ||||
|     "end": 44, | ||||
|     "operator": "*", | ||||
|     "left": { | ||||
|       "type": "Identifier", | ||||
|       "type": "Identifier", | ||||
|       "start": 26, | ||||
|       "end": 36, | ||||
|       "name": "sigmaAllow" | ||||
|     }, | ||||
|     "right": { | ||||
|       "type": "Identifier", | ||||
|       "type": "Identifier", | ||||
|       "start": 39, | ||||
|       "end": 44, | ||||
|  | ||||
| @ -8,6 +8,7 @@ expression: actual | ||||
|   "end": 8, | ||||
|   "operator": "+", | ||||
|   "left": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 0, | ||||
|     "end": 1, | ||||
| @ -15,6 +16,7 @@ expression: actual | ||||
|     "raw": "2" | ||||
|   }, | ||||
|   "right": { | ||||
|     "type": "Literal", | ||||
|     "type": "Literal", | ||||
|     "start": 7, | ||||
|     "end": 8, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 144, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 143, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "boxSketch" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "PipeExpression", | ||||
|             "type": "PipeExpression", | ||||
|             "start": 18, | ||||
|             "end": 143, | ||||
|             "body": [ | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 18, | ||||
|                 "end": 39, | ||||
| @ -38,11 +41,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 32, | ||||
|                     "end": 38, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 33, | ||||
|                         "end": 34, | ||||
| @ -50,6 +55,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 36, | ||||
|                         "end": 37, | ||||
| @ -62,6 +68,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 47, | ||||
|                 "end": 63, | ||||
| @ -73,11 +80,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 52, | ||||
|                     "end": 59, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 53, | ||||
|                         "end": 54, | ||||
| @ -85,6 +94,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 56, | ||||
|                         "end": 58, | ||||
| @ -94,6 +104,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 61, | ||||
|                     "end": 62 | ||||
| @ -102,6 +113,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 71, | ||||
|                 "end": 96, | ||||
| @ -113,16 +125,19 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 85, | ||||
|                     "end": 92, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "UnaryExpression", | ||||
|                         "type": "UnaryExpression", | ||||
|                         "start": 86, | ||||
|                         "end": 88, | ||||
|                         "operator": "-", | ||||
|                         "argument": { | ||||
|                           "type": "Literal", | ||||
|                           "type": "Literal", | ||||
|                           "start": 87, | ||||
|                           "end": 88, | ||||
| @ -131,6 +146,7 @@ expression: actual | ||||
|                         } | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 90, | ||||
|                         "end": 91, | ||||
| @ -140,6 +156,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 94, | ||||
|                     "end": 95 | ||||
| @ -148,6 +165,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 104, | ||||
|                 "end": 121, | ||||
| @ -159,11 +177,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 109, | ||||
|                     "end": 117, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 110, | ||||
|                         "end": 111, | ||||
| @ -171,11 +191,13 @@ expression: actual | ||||
|                         "raw": "5" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "UnaryExpression", | ||||
|                         "type": "UnaryExpression", | ||||
|                         "start": 113, | ||||
|                         "end": 116, | ||||
|                         "operator": "-", | ||||
|                         "argument": { | ||||
|                           "type": "Literal", | ||||
|                           "type": "Literal", | ||||
|                           "start": 114, | ||||
|                           "end": 116, | ||||
| @ -186,6 +208,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 119, | ||||
|                     "end": 120 | ||||
| @ -194,6 +217,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 129, | ||||
|                 "end": 143, | ||||
| @ -205,6 +229,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "start": 137, | ||||
|                     "end": 139, | ||||
| @ -212,6 +237,7 @@ expression: actual | ||||
|                     "raw": "10" | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 141, | ||||
|                     "end": 142 | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 17, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 17, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "sg" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "UnaryExpression", | ||||
|             "type": "UnaryExpression", | ||||
|             "start": 11, | ||||
|             "end": 17, | ||||
|             "operator": "-", | ||||
|             "argument": { | ||||
|               "type": "Identifier", | ||||
|               "type": "Identifier", | ||||
|               "start": 12, | ||||
|               "end": 17, | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 23, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 23, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 23, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 22, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 13, | ||||
|                   "end": 20, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 14, | ||||
|                       "end": 15, | ||||
| @ -49,11 +54,13 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "UnaryExpression", | ||||
|                       "type": "UnaryExpression", | ||||
|                       "start": 17, | ||||
|                       "end": 19, | ||||
|                       "operator": "-", | ||||
|                       "argument": { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 18, | ||||
|                         "end": 19, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 23, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 23, | ||||
| @ -22,10 +23,12 @@ expression: actual | ||||
|             "name": "myArray" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "ArrayRangeExpression", | ||||
|             "type": "ArrayRangeExpression", | ||||
|             "start": 16, | ||||
|             "end": 23, | ||||
|             "startElement": { | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "start": 17, | ||||
|               "end": 18, | ||||
| @ -33,6 +36,7 @@ expression: actual | ||||
|               "raw": "0" | ||||
|             }, | ||||
|             "endElement": { | ||||
|               "type": "Literal", | ||||
|               "type": "Literal", | ||||
|               "start": 20, | ||||
|               "end": 22, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 80, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 5, | ||||
|       "end": 57, | ||||
| @ -22,6 +23,7 @@ expression: actual | ||||
|             "name": "firstPrimeNumber" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "FunctionExpression", | ||||
|             "type": "FunctionExpression", | ||||
|             "start": 27, | ||||
|             "end": 57, | ||||
| @ -31,10 +33,12 @@ expression: actual | ||||
|               "end": 57, | ||||
|               "body": [ | ||||
|                 { | ||||
|                   "type": "ReturnStatement", | ||||
|                   "type": "ReturnStatement", | ||||
|                   "start": 43, | ||||
|                   "end": 51, | ||||
|                   "argument": { | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "start": 50, | ||||
|                     "end": 51, | ||||
| @ -50,10 +54,12 @@ expression: actual | ||||
|       "kind": "fn" | ||||
|     }, | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 62, | ||||
|       "end": 80, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 62, | ||||
|         "end": 80, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 66, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 49, | ||||
| @ -22,6 +23,7 @@ expression: actual | ||||
|             "name": "thing" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "FunctionExpression", | ||||
|             "type": "FunctionExpression", | ||||
|             "start": 11, | ||||
|             "end": 49, | ||||
| @ -42,10 +44,12 @@ expression: actual | ||||
|               "end": 49, | ||||
|               "body": [ | ||||
|                 { | ||||
|                   "type": "ReturnStatement", | ||||
|                   "type": "ReturnStatement", | ||||
|                   "start": 32, | ||||
|                   "end": 43, | ||||
|                   "argument": { | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "start": 39, | ||||
|                     "end": 43, | ||||
| @ -61,10 +65,12 @@ expression: actual | ||||
|       "kind": "fn" | ||||
|     }, | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 54, | ||||
|       "end": 66, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 54, | ||||
|         "end": 66, | ||||
| @ -76,6 +82,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "Literal", | ||||
|             "type": "Literal", | ||||
|             "start": 60, | ||||
|             "end": 65, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 165, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 165, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "mySketch" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "PipeExpression", | ||||
|             "type": "PipeExpression", | ||||
|             "start": 17, | ||||
|             "end": 165, | ||||
|             "body": [ | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 17, | ||||
|                 "end": 37, | ||||
| @ -38,11 +41,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 31, | ||||
|                     "end": 36, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 32, | ||||
|                         "end": 33, | ||||
| @ -50,6 +55,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 34, | ||||
|                         "end": 35, | ||||
| @ -62,6 +68,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 49, | ||||
|                 "end": 75, | ||||
| @ -73,11 +80,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 56, | ||||
|                     "end": 62, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 57, | ||||
|                         "end": 58, | ||||
| @ -85,6 +94,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 60, | ||||
|                         "end": 61, | ||||
| @ -94,11 +104,13 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 64, | ||||
|                     "end": 65 | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "TagDeclarator", | ||||
|                     "type": "TagDeclarator", | ||||
|                     "start": 67, | ||||
|                     "end": 74, | ||||
| @ -108,6 +120,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 87, | ||||
|                 "end": 104, | ||||
| @ -119,11 +132,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 94, | ||||
|                     "end": 100, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 95, | ||||
|                         "end": 96, | ||||
| @ -131,6 +146,7 @@ expression: actual | ||||
|                         "raw": "1" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 98, | ||||
|                         "end": 99, | ||||
| @ -140,6 +156,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 102, | ||||
|                     "end": 103 | ||||
| @ -148,6 +165,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 116, | ||||
|                 "end": 145, | ||||
| @ -159,11 +177,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 123, | ||||
|                     "end": 129, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 124, | ||||
|                         "end": 125, | ||||
| @ -171,6 +191,7 @@ expression: actual | ||||
|                         "raw": "1" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 127, | ||||
|                         "end": 128, | ||||
| @ -180,11 +201,13 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 131, | ||||
|                     "end": 132 | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "TagDeclarator", | ||||
|                     "type": "TagDeclarator", | ||||
|                     "start": 134, | ||||
|                     "end": 144, | ||||
| @ -194,6 +217,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 157, | ||||
|                 "end": 165, | ||||
| @ -205,6 +229,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 163, | ||||
|                     "end": 164 | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 70, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 70, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "mySketch" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "PipeExpression", | ||||
|             "type": "PipeExpression", | ||||
|             "start": 17, | ||||
|             "end": 70, | ||||
|             "body": [ | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 17, | ||||
|                 "end": 37, | ||||
| @ -38,11 +41,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 31, | ||||
|                     "end": 36, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 32, | ||||
|                         "end": 33, | ||||
| @ -50,6 +55,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 34, | ||||
|                         "end": 35, | ||||
| @ -62,6 +68,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 41, | ||||
|                 "end": 58, | ||||
| @ -73,11 +80,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 48, | ||||
|                     "end": 54, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 49, | ||||
|                         "end": 50, | ||||
| @ -85,6 +94,7 @@ expression: actual | ||||
|                         "raw": "1" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 52, | ||||
|                         "end": 53, | ||||
| @ -94,6 +104,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 56, | ||||
|                     "end": 57 | ||||
| @ -102,6 +113,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 62, | ||||
|                 "end": 70, | ||||
| @ -113,6 +125,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 68, | ||||
|                     "end": 69 | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 30, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 30, | ||||
| @ -22,6 +23,7 @@ expression: actual | ||||
|             "name": "myBox" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "CallExpression", | ||||
|             "type": "CallExpression", | ||||
|             "start": 14, | ||||
|             "end": 30, | ||||
| @ -33,6 +35,7 @@ expression: actual | ||||
|             }, | ||||
|             "arguments": [ | ||||
|               { | ||||
|                 "type": "Identifier", | ||||
|                 "type": "Identifier", | ||||
|                 "start": 28, | ||||
|                 "end": 29, | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 29, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 29, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "myBox" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "PipeExpression", | ||||
|             "type": "PipeExpression", | ||||
|             "start": 14, | ||||
|             "end": 29, | ||||
|             "body": [ | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 14, | ||||
|                 "end": 18, | ||||
| @ -38,6 +41,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "start": 16, | ||||
|                     "end": 17, | ||||
| @ -48,6 +52,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 22, | ||||
|                 "end": 29, | ||||
| @ -59,6 +64,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "Literal", | ||||
|                     "type": "Literal", | ||||
|                     "start": 24, | ||||
|                     "end": 25, | ||||
| @ -66,6 +72,7 @@ expression: actual | ||||
|                     "raw": "2" | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 27, | ||||
|                     "end": 28 | ||||
|  | ||||
| @ -7,6 +7,7 @@ expression: actual | ||||
|   "end": 49, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "VariableDeclaration", | ||||
|       "type": "VariableDeclaration", | ||||
|       "start": 0, | ||||
|       "end": 49, | ||||
| @ -22,11 +23,13 @@ expression: actual | ||||
|             "name": "myBox" | ||||
|           }, | ||||
|           "init": { | ||||
|             "type": "PipeExpression", | ||||
|             "type": "PipeExpression", | ||||
|             "start": 14, | ||||
|             "end": 49, | ||||
|             "body": [ | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 14, | ||||
|                 "end": 30, | ||||
| @ -38,6 +41,7 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "Identifier", | ||||
|                     "type": "Identifier", | ||||
|                     "start": 28, | ||||
|                     "end": 29, | ||||
| @ -47,6 +51,7 @@ expression: actual | ||||
|                 "optional": false | ||||
|               }, | ||||
|               { | ||||
|                 "type": "CallExpression", | ||||
|                 "type": "CallExpression", | ||||
|                 "start": 34, | ||||
|                 "end": 49, | ||||
| @ -58,11 +63,13 @@ expression: actual | ||||
|                 }, | ||||
|                 "arguments": [ | ||||
|                   { | ||||
|                     "type": "ArrayExpression", | ||||
|                     "type": "ArrayExpression", | ||||
|                     "start": 39, | ||||
|                     "end": 45, | ||||
|                     "elements": [ | ||||
|                       { | ||||
|                         "type": "Literal", | ||||
|                         "type": "Literal", | ||||
|                         "start": 40, | ||||
|                         "end": 41, | ||||
| @ -70,6 +77,7 @@ expression: actual | ||||
|                         "raw": "0" | ||||
|                       }, | ||||
|                       { | ||||
|                         "type": "Identifier", | ||||
|                         "type": "Identifier", | ||||
|                         "start": 43, | ||||
|                         "end": 44, | ||||
| @ -78,6 +86,7 @@ expression: actual | ||||
|                     ] | ||||
|                   }, | ||||
|                   { | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "type": "PipeSubstitution", | ||||
|                     "start": 47, | ||||
|                     "end": 48 | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 22, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 22, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 22, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 21, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 13, | ||||
|                   "end": 19, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 14, | ||||
|                       "end": 15, | ||||
| @ -49,6 +54,7 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 17, | ||||
|                       "end": 18, | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 36, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 36, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 36, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 35, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 13, | ||||
|                   "end": 19, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 14, | ||||
|                       "end": 15, | ||||
| @ -49,6 +54,7 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 17, | ||||
|                       "end": 18, | ||||
| @ -69,11 +75,13 @@ expression: actual | ||||
|                   "name": "from" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 27, | ||||
|                   "end": 33, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 28, | ||||
|                       "end": 29, | ||||
| @ -81,6 +89,7 @@ expression: actual | ||||
|                       "raw": "3" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 31, | ||||
|                       "end": 32, | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 19, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 19, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 19, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 18, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 11, | ||||
|                   "end": 17, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 12, | ||||
|                       "end": 13, | ||||
| @ -49,6 +54,7 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 15, | ||||
|                       "end": 16, | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 35, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 35, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 35, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 34, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 13, | ||||
|                   "end": 19, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 14, | ||||
|                       "end": 15, | ||||
| @ -49,6 +54,7 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 17, | ||||
|                       "end": 18, | ||||
| @ -69,11 +75,13 @@ expression: actual | ||||
|                   "name": "from" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 27, | ||||
|                   "end": 33, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 28, | ||||
|                       "end": 29, | ||||
| @ -81,6 +89,7 @@ expression: actual | ||||
|                       "raw": "3" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 31, | ||||
|                       "end": 32, | ||||
|  | ||||
| @ -7,10 +7,12 @@ expression: actual | ||||
|   "end": 35, | ||||
|   "body": [ | ||||
|     { | ||||
|       "type": "ExpressionStatement", | ||||
|       "type": "ExpressionStatement", | ||||
|       "start": 0, | ||||
|       "end": 35, | ||||
|       "expression": { | ||||
|         "type": "CallExpression", | ||||
|         "type": "CallExpression", | ||||
|         "start": 0, | ||||
|         "end": 35, | ||||
| @ -22,6 +24,7 @@ expression: actual | ||||
|         }, | ||||
|         "arguments": [ | ||||
|           { | ||||
|             "type": "ObjectExpression", | ||||
|             "type": "ObjectExpression", | ||||
|             "start": 7, | ||||
|             "end": 34, | ||||
| @ -37,11 +40,13 @@ expression: actual | ||||
|                   "name": "to" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 13, | ||||
|                   "end": 19, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 14, | ||||
|                       "end": 15, | ||||
| @ -49,6 +54,7 @@ expression: actual | ||||
|                       "raw": "0" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 17, | ||||
|                       "end": 18, | ||||
| @ -69,11 +75,13 @@ expression: actual | ||||
|                   "name": "from" | ||||
|                 }, | ||||
|                 "value": { | ||||
|                   "type": "ArrayExpression", | ||||
|                   "type": "ArrayExpression", | ||||
|                   "start": 26, | ||||
|                   "end": 32, | ||||
|                   "elements": [ | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 27, | ||||
|                       "end": 28, | ||||
| @ -81,6 +89,7 @@ expression: actual | ||||
|                       "raw": "3" | ||||
|                     }, | ||||
|                     { | ||||
|                       "type": "Literal", | ||||
|                       "type": "Literal", | ||||
|                       "start": 30, | ||||
|                       "end": 31, | ||||
|  | ||||
