Compare commits
16 Commits
kcl-test-s
...
v0.26.0
Author | SHA1 | Date | |
---|---|---|---|
cb8fc33adb | |||
2dc8b429ff | |||
19ffa220e8 | |||
5332ddd88e | |||
11d9a2ee00 | |||
bfebc41a5c | |||
824b4c823e | |||
785002fa4e | |||
f650281855 | |||
9f6999829a | |||
a14bbaa237 | |||
0706624381 | |||
ef0ae5e06e | |||
a010743abb | |||
057ee479c3 | |||
7218efc489 |
@ -1,3 +1,3 @@
|
||||
[codespell]
|
||||
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey,atleast,ue,afterall
|
||||
skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock
|
||||
skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock,./openapi/*.json,./src/lib/machine-api.d.ts
|
||||
|
@ -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: |
|
||||
|
@ -82652,7 +82652,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -83209,7 +83208,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -86410,7 +86408,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -86967,7 +86964,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -90172,7 +90168,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -90729,7 +90724,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -114786,7 +114780,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -115343,7 +115336,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -118937,7 +118929,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -119494,7 +119485,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -122695,7 +122685,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -123252,7 +123241,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
@ -126451,7 +126439,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start"
|
||||
],
|
||||
"properties": {
|
||||
@ -127008,7 +126995,6 @@
|
||||
"required": [
|
||||
"body",
|
||||
"end",
|
||||
"nonCodeMeta",
|
||||
"start",
|
||||
"type"
|
||||
],
|
||||
|
@ -313,3 +313,45 @@ test(
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'external change of file contents are reflected in editor',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const PROJECT_DIR_NAME = 'lee-was-here'
|
||||
const {
|
||||
electronApp,
|
||||
page,
|
||||
dir: projectsDir,
|
||||
} = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
const aProjectDir = join(dir, PROJECT_DIR_NAME)
|
||||
await fsp.mkdir(aProjectDir, { recursive: true })
|
||||
},
|
||||
})
|
||||
|
||||
const u = await getUtils(page)
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
|
||||
await test.step('Open the project', async () => {
|
||||
await expect(page.getByText(PROJECT_DIR_NAME)).toBeVisible()
|
||||
await page.getByText(PROJECT_DIR_NAME).click()
|
||||
await u.waitForPageLoad()
|
||||
})
|
||||
|
||||
await u.openFilePanel()
|
||||
await u.openKclCodePanel()
|
||||
|
||||
await test.step('Write to file externally and check for changed content', async () => {
|
||||
const content = 'ha he ho ho ha blap scap be dap'
|
||||
await fsp.writeFile(
|
||||
join(projectsDir, PROJECT_DIR_NAME, 'main.kcl'),
|
||||
content
|
||||
)
|
||||
await u.editorTextMatches(content)
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
@ -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()
|
||||
}
|
||||
)
|
||||
})
|
||||
|
@ -960,4 +960,171 @@ _test.describe('Deleting items from the file pane', () => {
|
||||
'TODO - delete folder we are in, with no main.kcl',
|
||||
async () => {}
|
||||
)
|
||||
|
||||
// Copied from tests above.
|
||||
_test(
|
||||
`external deletion of project navigates back home`,
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const TEST_PROJECT_NAME = 'Test Project'
|
||||
const {
|
||||
electronApp,
|
||||
page,
|
||||
dir: projectsDirName,
|
||||
} = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
await fsp.mkdir(join(dir, TEST_PROJECT_NAME), { recursive: true })
|
||||
await fsp.mkdir(join(dir, TEST_PROJECT_NAME, 'folderToDelete'), {
|
||||
recursive: true,
|
||||
})
|
||||
await fsp.copyFile(
|
||||
executorInputPath('basic_fillet_cube_end.kcl'),
|
||||
join(dir, TEST_PROJECT_NAME, 'main.kcl')
|
||||
)
|
||||
await fsp.copyFile(
|
||||
executorInputPath('cylinder.kcl'),
|
||||
join(dir, TEST_PROJECT_NAME, 'folderToDelete', 'someFileWithin.kcl')
|
||||
)
|
||||
},
|
||||
})
|
||||
const u = await getUtils(page)
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
|
||||
// Constants and locators
|
||||
const projectCard = page.getByText(TEST_PROJECT_NAME)
|
||||
const projectMenuButton = page.getByTestId('project-sidebar-toggle')
|
||||
const folderToDelete = page.getByRole('button', {
|
||||
name: 'folderToDelete',
|
||||
})
|
||||
const fileWithinFolder = page.getByRole('listitem').filter({
|
||||
has: page.getByRole('button', { name: 'someFileWithin.kcl' }),
|
||||
})
|
||||
|
||||
await _test.step(
|
||||
'Open project and navigate into folderToDelete',
|
||||
async () => {
|
||||
await projectCard.click()
|
||||
await u.waitForPageLoad()
|
||||
await _expect(projectMenuButton).toContainText('main.kcl')
|
||||
await u.closeKclCodePanel()
|
||||
await u.openFilePanel()
|
||||
|
||||
await folderToDelete.click()
|
||||
await _expect(fileWithinFolder).toBeVisible()
|
||||
await fileWithinFolder.click()
|
||||
await _expect(projectMenuButton).toContainText('someFileWithin.kcl')
|
||||
}
|
||||
)
|
||||
|
||||
// Point of divergence. Delete the project folder and see if it goes back
|
||||
// to the home view.
|
||||
await _test.step(
|
||||
'Delete projectsDirName/<project-name> externally',
|
||||
async () => {
|
||||
await fsp.rm(join(projectsDirName, TEST_PROJECT_NAME), {
|
||||
recursive: true,
|
||||
force: true,
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
await _test.step('Check the app is back on the home view', async () => {
|
||||
const projectsDirLink = page.getByText('Loaded from')
|
||||
await _expect(projectsDirLink).toBeVisible()
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
// Similar to the above
|
||||
_test(
|
||||
`external deletion of file in sub-directory updates the file tree and recreates it on code editor typing`,
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const TEST_PROJECT_NAME = 'Test Project'
|
||||
const {
|
||||
electronApp,
|
||||
page,
|
||||
dir: projectsDirName,
|
||||
} = await setupElectron({
|
||||
testInfo,
|
||||
folderSetupFn: async (dir) => {
|
||||
await fsp.mkdir(join(dir, TEST_PROJECT_NAME), { recursive: true })
|
||||
await fsp.mkdir(join(dir, TEST_PROJECT_NAME, 'folderToDelete'), {
|
||||
recursive: true,
|
||||
})
|
||||
await fsp.copyFile(
|
||||
executorInputPath('basic_fillet_cube_end.kcl'),
|
||||
join(dir, TEST_PROJECT_NAME, 'main.kcl')
|
||||
)
|
||||
await fsp.copyFile(
|
||||
executorInputPath('cylinder.kcl'),
|
||||
join(dir, TEST_PROJECT_NAME, 'folderToDelete', 'someFileWithin.kcl')
|
||||
)
|
||||
},
|
||||
})
|
||||
const u = await getUtils(page)
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
|
||||
// Constants and locators
|
||||
const projectCard = page.getByText(TEST_PROJECT_NAME)
|
||||
const projectMenuButton = page.getByTestId('project-sidebar-toggle')
|
||||
const folderToDelete = page.getByRole('button', {
|
||||
name: 'folderToDelete',
|
||||
})
|
||||
const fileWithinFolder = page.getByRole('listitem').filter({
|
||||
has: page.getByRole('button', { name: 'someFileWithin.kcl' }),
|
||||
})
|
||||
|
||||
await _test.step(
|
||||
'Open project and navigate into folderToDelete',
|
||||
async () => {
|
||||
await projectCard.click()
|
||||
await u.waitForPageLoad()
|
||||
await _expect(projectMenuButton).toContainText('main.kcl')
|
||||
|
||||
await u.openFilePanel()
|
||||
|
||||
await folderToDelete.click()
|
||||
await _expect(fileWithinFolder).toBeVisible()
|
||||
await fileWithinFolder.click()
|
||||
await _expect(projectMenuButton).toContainText('someFileWithin.kcl')
|
||||
}
|
||||
)
|
||||
|
||||
await _test.step(
|
||||
'Delete projectsDirName/<project-name> externally',
|
||||
async () => {
|
||||
await fsp.rm(
|
||||
join(
|
||||
projectsDirName,
|
||||
TEST_PROJECT_NAME,
|
||||
'folderToDelete',
|
||||
'someFileWithin.kcl'
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
await _test.step('Check the file is gone in the file tree', async () => {
|
||||
await _expect(
|
||||
page.getByTestId('file-pane-scroll-container')
|
||||
).not.toContainText('someFileWithin.kcl')
|
||||
})
|
||||
|
||||
await _test.step(
|
||||
'Check the file is back in the file tree after typing in code editor',
|
||||
async () => {
|
||||
await u.pasteCodeInEditor('hello = 1')
|
||||
await _expect(
|
||||
page.getByTestId('file-pane-scroll-container')
|
||||
).toContainText('someFileWithin.kcl')
|
||||
}
|
||||
)
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
})
|
||||
|
@ -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: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 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'
|
||||
|
||||
@ -463,6 +471,9 @@ export async function getUtils(page: Page, test_?: typeof test) {
|
||||
return test_?.step(
|
||||
`Create and select project with text "${hasText}"`,
|
||||
async () => {
|
||||
// Without this, we get unreliable project creation. It's probably
|
||||
// due to a race between the FS being read and clicking doing something.
|
||||
await page.waitForTimeout(100)
|
||||
await page.getByTestId('home-new-file').click()
|
||||
const projectLinksPost = page.getByTestId('project-link')
|
||||
await projectLinksPost.filter({ hasText }).click()
|
||||
@ -492,6 +503,11 @@ export async function getUtils(page: Page, test_?: typeof test) {
|
||||
|
||||
createNewFile: async (name: string) => {
|
||||
return test?.step(`Create a file named ${name}`, async () => {
|
||||
// If the application is in the middle of connecting a stream
|
||||
// then creating a new file won't work in the end.
|
||||
await expect(
|
||||
page.getByRole('button', { name: 'Start Sketch' })
|
||||
).not.toBeDisabled()
|
||||
await page.getByTestId('create-file-button').click()
|
||||
await page.getByTestId('file-rename-field').fill(name)
|
||||
await page.keyboard.press('Enter')
|
||||
@ -874,8 +890,8 @@ export async function setupElectron({
|
||||
appSettings
|
||||
? { settings: appSettings }
|
||||
: {
|
||||
...TEST_SETTINGS,
|
||||
settings: {
|
||||
...TEST_SETTINGS,
|
||||
app: {
|
||||
...TEST_SETTINGS.app,
|
||||
projectDirectory: projectDirName,
|
||||
|
@ -9,7 +9,7 @@ import {
|
||||
executorInputPath,
|
||||
} from './test-utils'
|
||||
import { SaveSettingsPayload, SettingsLevel } from 'lib/settings/settingsTypes'
|
||||
import { SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import { SETTINGS_FILE_NAME, PROJECT_SETTINGS_FILE_NAME } from 'lib/constants'
|
||||
import {
|
||||
TEST_SETTINGS_KEY,
|
||||
TEST_SETTINGS_CORRUPTED,
|
||||
@ -445,6 +445,58 @@ test.describe('Testing settings', () => {
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
'project settings reload on external change',
|
||||
{ tag: '@electron' },
|
||||
async ({ browserName }, testInfo) => {
|
||||
const {
|
||||
electronApp,
|
||||
page,
|
||||
dir: projectDirName,
|
||||
} = await setupElectron({
|
||||
testInfo,
|
||||
})
|
||||
|
||||
await page.setViewportSize({ width: 1200, height: 500 })
|
||||
|
||||
const logoLink = page.getByTestId('app-logo')
|
||||
const projectDirLink = page.getByText('Loaded from')
|
||||
|
||||
await test.step('Wait for project view', async () => {
|
||||
await expect(projectDirLink).toBeVisible()
|
||||
})
|
||||
|
||||
const projectLinks = page.getByTestId('project-link')
|
||||
const oldCount = await projectLinks.count()
|
||||
await page.getByRole('button', { name: 'New project' }).click()
|
||||
await expect(projectLinks).toHaveCount(oldCount + 1)
|
||||
await projectLinks.filter({ hasText: 'project-000' }).first().click()
|
||||
|
||||
const changeColorFs = async (color: string) => {
|
||||
const tempSettingsFilePath = join(
|
||||
projectDirName,
|
||||
'project-000',
|
||||
PROJECT_SETTINGS_FILE_NAME
|
||||
)
|
||||
await fsp.writeFile(
|
||||
tempSettingsFilePath,
|
||||
`[settings.app]\nthemeColor = "${color}"`
|
||||
)
|
||||
}
|
||||
|
||||
await test.step('Check the color is first starting as we expect', async () => {
|
||||
await expect(logoLink).toHaveCSS('--primary-hue', '264.5')
|
||||
})
|
||||
|
||||
await test.step('Check color of logo changed', async () => {
|
||||
await changeColorFs('99')
|
||||
await expect(logoLink).toHaveCSS('--primary-hue', '99')
|
||||
})
|
||||
|
||||
await electronApp.close()
|
||||
}
|
||||
)
|
||||
|
||||
test(
|
||||
`Closing settings modal should go back to the original file being viewed`,
|
||||
{ tag: '@electron' },
|
||||
|
7
interface.d.ts
vendored
@ -20,10 +20,11 @@ export interface IElectronAPI {
|
||||
version: typeof process.env.version
|
||||
watchFileOn: (
|
||||
path: string,
|
||||
key: string,
|
||||
callback: (eventType: string, path: string) => void
|
||||
) => void
|
||||
watchFileOff: (path: string) => void
|
||||
readFile: (path: string) => ReturnType<fs.readFile>
|
||||
readFile: typeof fs.readFile
|
||||
watchFileOff: (path: string, key: string) => void
|
||||
writeFile: (
|
||||
path: string,
|
||||
data: string | Uint8Array
|
||||
@ -67,7 +68,7 @@ export interface IElectronAPI {
|
||||
}
|
||||
}
|
||||
kittycad: (access: string, args: any) => any
|
||||
listMachines: () => Promise<MachinesListing>
|
||||
listMachines: (machineApiIp: string) => Promise<MachinesListing>
|
||||
getMachineApiIp: () => Promise<string | null>
|
||||
onUpdateDownloadStart: (
|
||||
callback: (value: { version: string }) => void
|
||||
|
@ -36,38 +36,297 @@
|
||||
"description": "Extra machine-specific information regarding a connected machine.",
|
||||
"oneOf": [
|
||||
{
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"Moonraker": {
|
||||
"type": "object"
|
||||
"type": {
|
||||
"enum": [
|
||||
"moonraker"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"Moonraker"
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"Usb": {
|
||||
"type": "object"
|
||||
"type": {
|
||||
"enum": [
|
||||
"usb"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"Usb"
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"Bambu": {
|
||||
"type": "object"
|
||||
"current_stage": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/Stage"
|
||||
}
|
||||
],
|
||||
"description": "The current stage of the machine as defined by Bambu which can include errors, etc.",
|
||||
"nullable": true
|
||||
},
|
||||
"nozzle_diameter": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/NozzleDiameter"
|
||||
}
|
||||
],
|
||||
"description": "The nozzle diameter of the machine."
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"bambu"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"Bambu"
|
||||
"nozzle_diameter",
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
]
|
||||
},
|
||||
"FdmHardwareConfiguration": {
|
||||
"description": "Configuration for a FDM-based printer.",
|
||||
"properties": {
|
||||
"filaments": {
|
||||
"description": "The filaments the printer has access to.",
|
||||
"items": {
|
||||
"$ref": "#/components/schemas/Filament"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"nozzle_diameter": {
|
||||
"description": "Diameter of the extrusion nozzle, in mm.",
|
||||
"format": "double",
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"filaments",
|
||||
"nozzle_diameter"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"Filament": {
|
||||
"description": "Information about the filament being used in a FDM printer.",
|
||||
"properties": {
|
||||
"color": {
|
||||
"description": "The color (as hex without the `#`) of the filament, this is likely specific to the manufacturer.",
|
||||
"maxLength": 6,
|
||||
"minLength": 6,
|
||||
"nullable": true,
|
||||
"type": "string"
|
||||
},
|
||||
"material": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/FilamentMaterial"
|
||||
}
|
||||
],
|
||||
"description": "The material that the filament is made of."
|
||||
},
|
||||
"name": {
|
||||
"description": "The name of the filament, this is likely specfic to the manufacturer.",
|
||||
"nullable": true,
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"material"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"FilamentMaterial": {
|
||||
"description": "The material that the filament is made of.",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Polylactic acid based plastics",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"pla"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Pla support",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"pla_support"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "acrylonitrile butadiene styrene based plastics",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"abs"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "polyethylene terephthalate glycol based plastics",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"petg"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "unsuprisingly, nylon based",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"nylon"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "thermoplastic polyurethane based urethane material",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"tpu"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "polyvinyl alcohol based material",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"pva"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "high impact polystyrene based material",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"hips"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "composite material with stuff in other stuff, something like PLA mixed with carbon fiber, kevlar, or fiberglass",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"composite"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
]
|
||||
},
|
||||
"HardwareConfiguration": {
|
||||
"description": "The hardware configuration of a machine.",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "No configuration is possible. This isn't the same conceptually as an `Option<HardwareConfiguration>`, because this indicates we positively know there is no possible configuration changes that are possible with this method of manufcture.",
|
||||
"properties": {
|
||||
"type": {
|
||||
"enum": [
|
||||
"none"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Hardware configuration specific to FDM based printers",
|
||||
"properties": {
|
||||
"config": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/FdmHardwareConfiguration"
|
||||
}
|
||||
],
|
||||
"description": "The configuration for the FDM printer."
|
||||
},
|
||||
"type": {
|
||||
"enum": [
|
||||
"fdm"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"config",
|
||||
"type"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
@ -85,6 +344,14 @@
|
||||
"description": "Additional, per-machine information which is specific to the underlying machine type.",
|
||||
"nullable": true
|
||||
},
|
||||
"hardware_configuration": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/HardwareConfiguration"
|
||||
}
|
||||
],
|
||||
"description": "Information about how the Machine is currently configured."
|
||||
},
|
||||
"id": {
|
||||
"description": "Machine Identifier (ID) for the specific Machine.",
|
||||
"type": "string"
|
||||
@ -114,6 +381,12 @@
|
||||
"description": "Maximum part size that can be manufactured by this device. This may be some sort of theoretical upper bound, getting close to this limit seems like maybe a bad idea.\n\nThis may be `None` if the maximum size is not knowable by the Machine API.\n\nWhat \"close\" means is up to you!",
|
||||
"nullable": true
|
||||
},
|
||||
"progress": {
|
||||
"description": "Progress of the current print, if printing.",
|
||||
"format": "double",
|
||||
"nullable": true,
|
||||
"type": "number"
|
||||
},
|
||||
"state": {
|
||||
"allOf": [
|
||||
{
|
||||
@ -124,6 +397,7 @@
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"hardware_configuration",
|
||||
"id",
|
||||
"machine_type",
|
||||
"make_model",
|
||||
@ -157,57 +431,111 @@
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "If a print state can not be resolved at this time, an Unknown may be returned.",
|
||||
"enum": [
|
||||
"Unknown"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Idle, and ready for another job.",
|
||||
"enum": [
|
||||
"Idle"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Running a job -- 3D printing or CNC-ing a part.",
|
||||
"enum": [
|
||||
"Running"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Machine is currently offline or unreachable.",
|
||||
"enum": [
|
||||
"Offline"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Job is underway but halted, waiting for some action to take place.",
|
||||
"enum": [
|
||||
"Paused"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Job is finished, but waiting manual action to move back to Idle.",
|
||||
"enum": [
|
||||
"Complete"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"additionalProperties": false,
|
||||
"description": "The printer has failed and is in an unknown state that may require manual attention to resolve. The inner value is a human readable description of what specifically has failed.",
|
||||
"properties": {
|
||||
"Failed": {
|
||||
"nullable": true,
|
||||
"state": {
|
||||
"enum": [
|
||||
"unknown"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"Failed"
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Idle, and ready for another job.",
|
||||
"properties": {
|
||||
"state": {
|
||||
"enum": [
|
||||
"idle"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Running a job -- 3D printing or CNC-ing a part.",
|
||||
"properties": {
|
||||
"state": {
|
||||
"enum": [
|
||||
"running"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Machine is currently offline or unreachable.",
|
||||
"properties": {
|
||||
"state": {
|
||||
"enum": [
|
||||
"offline"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Job is underway but halted, waiting for some action to take place.",
|
||||
"properties": {
|
||||
"state": {
|
||||
"enum": [
|
||||
"paused"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "Job is finished, but waiting manual action to move back to Idle.",
|
||||
"properties": {
|
||||
"state": {
|
||||
"enum": [
|
||||
"complete"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"description": "The printer has failed and is in an unknown state that may require manual attention to resolve. The inner value is a human readable description of what specifically has failed.",
|
||||
"properties": {
|
||||
"message": {
|
||||
"description": "A human-readable message describing the failure.",
|
||||
"nullable": true,
|
||||
"type": "string"
|
||||
},
|
||||
"state": {
|
||||
"enum": [
|
||||
"failed"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"state"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
@ -219,21 +547,54 @@
|
||||
{
|
||||
"description": "Use light to cure a resin to build up layers.",
|
||||
"enum": [
|
||||
"Stereolithography"
|
||||
"stereolithography"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Fused Deposition Modeling, layers of melted plastic.",
|
||||
"enum": [
|
||||
"FusedDeposition"
|
||||
"fused_deposition"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "\"Computer numerical control\" - machine that grinds away material from a hunk of material to construct a part.",
|
||||
"enum": [
|
||||
"Cnc"
|
||||
"cnc"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"NozzleDiameter": {
|
||||
"description": "A nozzle diameter.",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "0.2mm.",
|
||||
"enum": [
|
||||
"0.2"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "0.4mm.",
|
||||
"enum": [
|
||||
"0.4"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "0.6mm.",
|
||||
"enum": [
|
||||
"0.6"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "0.8mm.",
|
||||
"enum": [
|
||||
"0.8"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
@ -284,6 +645,15 @@
|
||||
"machine_id": {
|
||||
"description": "The machine id to print to.",
|
||||
"type": "string"
|
||||
},
|
||||
"slicer_configuration": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/SlicerConfiguration"
|
||||
}
|
||||
],
|
||||
"description": "Requested design-specific slicer configurations.",
|
||||
"nullable": true
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@ -292,6 +662,283 @@
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"SlicerConfiguration": {
|
||||
"description": "The slicer configuration is a set of parameters that are passed to the slicer to control how the gcode is generated.",
|
||||
"properties": {
|
||||
"filament_idx": {
|
||||
"description": "The filament to use for the print.",
|
||||
"format": "uint",
|
||||
"minimum": 0,
|
||||
"nullable": true,
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"Stage": {
|
||||
"description": "The print stage. These come from: https://github.com/SoftFever/OrcaSlicer/blob/431978baf17961df90f0d01871b0ad1d839d7f5d/src/slic3r/GUI/DeviceManager.cpp#L78",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Nothing.",
|
||||
"enum": [
|
||||
"nothing"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Empty.",
|
||||
"enum": [
|
||||
"empty"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Auto bed leveling.",
|
||||
"enum": [
|
||||
"auto_bed_leveling"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Heatbed preheating.",
|
||||
"enum": [
|
||||
"heatbed_preheating"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Sweeping XY mech mode.",
|
||||
"enum": [
|
||||
"sweeping_xy_mech_mode"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Changing filament.",
|
||||
"enum": [
|
||||
"changing_filament"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "M400 pause.",
|
||||
"enum": [
|
||||
"m400_pause"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to filament runout.",
|
||||
"enum": [
|
||||
"paused_due_to_filament_runout"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Heating hotend.",
|
||||
"enum": [
|
||||
"heating_hotend"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Calibrating extrusion.",
|
||||
"enum": [
|
||||
"calibrating_extrusion"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Scanning bed surface.",
|
||||
"enum": [
|
||||
"scanning_bed_surface"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Inspecting first layer.",
|
||||
"enum": [
|
||||
"inspecting_first_layer"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Identifying build plate type.",
|
||||
"enum": [
|
||||
"identifying_build_plate_type"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Calibrating micro lidar.",
|
||||
"enum": [
|
||||
"calibrating_micro_lidar"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Homing toolhead.",
|
||||
"enum": [
|
||||
"homing_toolhead"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Cleaning nozzle tip.",
|
||||
"enum": [
|
||||
"cleaning_nozzle_tip"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Checking extruder temperature.",
|
||||
"enum": [
|
||||
"checking_extruder_temperature"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Printing was paused by the user.",
|
||||
"enum": [
|
||||
"printing_was_paused_by_the_user"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Pause of front cover falling.",
|
||||
"enum": [
|
||||
"pause_of_front_cover_falling"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Calibrating micro lidar.",
|
||||
"enum": [
|
||||
"calibrating_micro_lidar2"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Calibrating extrusion flow.",
|
||||
"enum": [
|
||||
"calibrating_extrusion_flow"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to nozzle temperature malfunction.",
|
||||
"enum": [
|
||||
"paused_due_to_nozzle_temperature_malfunction"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to heat bed temperature malfunction.",
|
||||
"enum": [
|
||||
"paused_due_to_heat_bed_temperature_malfunction"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Filament unloading.",
|
||||
"enum": [
|
||||
"filament_unloading"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Skip step pause.",
|
||||
"enum": [
|
||||
"skip_step_pause"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Filament loading.",
|
||||
"enum": [
|
||||
"filament_loading"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Motor noise calibration.",
|
||||
"enum": [
|
||||
"motor_noise_calibration"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to AMS lost.",
|
||||
"enum": [
|
||||
"paused_due_to_ams_lost"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to low speed of the heat break fan.",
|
||||
"enum": [
|
||||
"paused_due_to_low_speed_of_the_heat_break_fan"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused due to chamber temperature control error.",
|
||||
"enum": [
|
||||
"paused_due_to_chamber_temperature_control_error"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Cooling chamber.",
|
||||
"enum": [
|
||||
"cooling_chamber"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Paused by the Gcode inserted by the user.",
|
||||
"enum": [
|
||||
"paused_by_the_gcode_inserted_by_the_user"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Motor noise showoff.",
|
||||
"enum": [
|
||||
"motor_noise_showoff"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Nozzle filament covered detected pause.",
|
||||
"enum": [
|
||||
"nozzle_filament_covered_detected_pause"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Cutter error pause.",
|
||||
"enum": [
|
||||
"cutter_error_pause"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "First layer error pause.",
|
||||
"enum": [
|
||||
"first_layer_error_pause"
|
||||
],
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"description": "Nozzle clog pause.",
|
||||
"enum": [
|
||||
"nozzle_clog_pause"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
]
|
||||
},
|
||||
"Volume": {
|
||||
"description": "Set of three values to represent the extent of a 3-D Volume. This contains the width, depth, and height values, generally used to represent some maximum or minimum.\n\nAll measurements are in millimeters.",
|
||||
"properties": {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "zoo-modeling-app",
|
||||
"version": "0.25.6",
|
||||
"version": "0.26.0",
|
||||
"private": true,
|
||||
"productName": "Zoo Modeling App",
|
||||
"author": {
|
||||
|
@ -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
|
||||
|
@ -2,7 +2,7 @@ import type { IndexLoaderData } from 'lib/types'
|
||||
import { PATHS } from 'lib/paths'
|
||||
import { ActionButton } from './ActionButton'
|
||||
import Tooltip from './Tooltip'
|
||||
import { Dispatch, useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { Dispatch, useCallback, useRef, useState } from 'react'
|
||||
import { useNavigate, useRouteLoaderData } from 'react-router-dom'
|
||||
import { Disclosure } from '@headlessui/react'
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||
@ -13,7 +13,6 @@ import { sortProject } from 'lib/desktopFS'
|
||||
import { FILE_EXT } from 'lib/constants'
|
||||
import { CustomIcon } from './CustomIcon'
|
||||
import { codeManager, kclManager } from 'lib/singletons'
|
||||
import { useDocumentHasFocus } from 'hooks/useDocumentHasFocus'
|
||||
import { useLspContext } from './LspProvider'
|
||||
import useHotkeyWrapper from 'lib/hotkeyWrapper'
|
||||
import { useModelingContext } from 'hooks/useModelingContext'
|
||||
@ -21,6 +20,8 @@ import { DeleteConfirmationDialog } from './ProjectCard/DeleteProjectDialog'
|
||||
import { ContextMenu, ContextMenuItem } from './ContextMenu'
|
||||
import usePlatform from 'hooks/usePlatform'
|
||||
import { FileEntry } from 'lib/project'
|
||||
import { useFileSystemWatcher } from 'hooks/useFileSystemWatcher'
|
||||
import { normalizeLineEndings } from 'lib/codeEditor'
|
||||
|
||||
function getIndentationCSS(level: number) {
|
||||
return `calc(1rem * ${level + 1})`
|
||||
@ -131,6 +132,23 @@ const FileTreeItem = ({
|
||||
const isCurrentFile = fileOrDir.path === currentFile?.path
|
||||
const itemRef = useRef(null)
|
||||
|
||||
// Since every file or directory gets its own FileTreeItem, we can do this.
|
||||
// Because subtrees only render when they are opened, that means this
|
||||
// only listens when they open. Because this acts like a useEffect, when
|
||||
// the ReactNodes are destroyed, so is this listener :)
|
||||
useFileSystemWatcher(
|
||||
async (eventType, path) => {
|
||||
// Don't try to read a file that was removed.
|
||||
if (isCurrentFile && eventType !== 'unlink') {
|
||||
let code = await window.electron.readFile(path, { encoding: 'utf-8' })
|
||||
code = normalizeLineEndings(code)
|
||||
codeManager.updateCodeStateEditor(code)
|
||||
}
|
||||
fileSend({ type: 'Refresh' })
|
||||
},
|
||||
[fileOrDir.path]
|
||||
)
|
||||
|
||||
const isRenaming = fileContext.itemsBeingRenamed.includes(fileOrDir.path)
|
||||
const removeCurrentItemFromRenaming = useCallback(
|
||||
() =>
|
||||
@ -154,6 +172,13 @@ const FileTreeItem = ({
|
||||
})
|
||||
}, [fileContext.itemsBeingRenamed, fileOrDir.path, fileSend])
|
||||
|
||||
const clickDirectory = () => {
|
||||
fileSend({
|
||||
type: 'Set selected directory',
|
||||
directory: fileOrDir,
|
||||
})
|
||||
}
|
||||
|
||||
function handleKeyUp(e: React.KeyboardEvent<HTMLButtonElement>) {
|
||||
if (e.metaKey && e.key === 'Backspace') {
|
||||
// Open confirmation dialog
|
||||
@ -242,18 +267,8 @@ const FileTreeItem = ({
|
||||
}
|
||||
style={{ paddingInlineStart: getIndentationCSS(level) }}
|
||||
onClick={(e) => e.currentTarget.focus()}
|
||||
onClickCapture={(e) =>
|
||||
fileSend({
|
||||
type: 'Set selected directory',
|
||||
directory: fileOrDir,
|
||||
})
|
||||
}
|
||||
onFocusCapture={(e) =>
|
||||
fileSend({
|
||||
type: 'Set selected directory',
|
||||
directory: fileOrDir,
|
||||
})
|
||||
}
|
||||
onClickCapture={clickDirectory}
|
||||
onFocusCapture={clickDirectory}
|
||||
onKeyDown={(e) => e.key === 'Enter' && e.preventDefault()}
|
||||
onKeyUp={handleKeyUp}
|
||||
>
|
||||
@ -469,27 +484,30 @@ export const FileTreeInner = ({
|
||||
const loaderData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData
|
||||
const { send: fileSend, context: fileContext } = useFileContext()
|
||||
const { send: modelingSend } = useModelingContext()
|
||||
const documentHasFocus = useDocumentHasFocus()
|
||||
|
||||
// Refresh the file tree when the document gets focus
|
||||
useEffect(() => {
|
||||
fileSend({ type: 'Refresh' })
|
||||
}, [documentHasFocus])
|
||||
// Refresh the file tree when there are changes.
|
||||
useFileSystemWatcher(
|
||||
async (eventType, path) => {
|
||||
fileSend({ type: 'Refresh' })
|
||||
},
|
||||
[loaderData?.project?.path, fileContext.selectedDirectory.path].filter(
|
||||
(x: string | undefined) => x !== undefined
|
||||
)
|
||||
)
|
||||
|
||||
const clickDirectory = () => {
|
||||
fileSend({
|
||||
type: 'Set selected directory',
|
||||
directory: fileContext.project,
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
className="overflow-auto pb-12 absolute inset-0"
|
||||
data-testid="file-pane-scroll-container"
|
||||
>
|
||||
<ul
|
||||
className="m-0 p-0 text-sm"
|
||||
onClickCapture={(e) => {
|
||||
fileSend({
|
||||
type: 'Set selected directory',
|
||||
directory: fileContext.project,
|
||||
})
|
||||
}}
|
||||
>
|
||||
<ul className="m-0 p-0 text-sm" onClickCapture={clickDirectory}>
|
||||
{sortProject(fileContext.project?.children || []).map((fileOrDir) => (
|
||||
<FileTreeItem
|
||||
project={fileContext.project}
|
||||
|
@ -11,6 +11,7 @@ export const NetworkMachineIndicator = ({
|
||||
}) => {
|
||||
const machineCount = machineManager.machineCount()
|
||||
const reason = machineManager.noMachinesReason()
|
||||
const machines = machineManager.machines
|
||||
|
||||
return isDesktop() ? (
|
||||
<Popover className="relative">
|
||||
@ -46,20 +47,34 @@ export const NetworkMachineIndicator = ({
|
||||
</div>
|
||||
{machineCount > 0 && (
|
||||
<ul className="divide-y divide-chalkboard-20 dark:divide-chalkboard-80">
|
||||
{Object.entries(machineManager.machines).map(
|
||||
([hostname, machine]) => (
|
||||
<li key={hostname} className={'px-2 py-4 gap-1 last:mb-0 '}>
|
||||
<p className="">
|
||||
{machine.make_model.model ||
|
||||
machine.make_model.manufacturer ||
|
||||
'Unknown Machine'}
|
||||
</p>
|
||||
{machines.map((machine) => {
|
||||
return (
|
||||
<li key={machine.id} className={'px-2 py-4 gap-1 last:mb-0 '}>
|
||||
<p className="">{machine.id.toUpperCase()}</p>
|
||||
<p className="text-chalkboard-60 dark:text-chalkboard-50 text-xs">
|
||||
Hostname {hostname}
|
||||
{machine.make_model.model}
|
||||
</p>
|
||||
{machine.extra &&
|
||||
machine.extra.type === 'bambu' &&
|
||||
machine.extra.nozzle_diameter && (
|
||||
<p className="text-chalkboard-60 dark:text-chalkboard-50 text-xs">
|
||||
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>
|
||||
)
|
||||
)}
|
||||
})}
|
||||
</ul>
|
||||
)}
|
||||
</Popover.Panel>
|
||||
|
@ -221,6 +221,19 @@ export const SettingsAuthProviderBase = ({
|
||||
|
||||
useFileSystemWatcher(
|
||||
async () => {
|
||||
// If there is a projectPath but it no longer exists it means
|
||||
// it was exterally removed. If we let the code past this condition
|
||||
// execute it will recreate the directory due to code in
|
||||
// loadAndValidateSettings trying to recreate files. I do not
|
||||
// wish to change the behavior in case anything else uses it.
|
||||
// Go home.
|
||||
if (loadedProject?.project?.path) {
|
||||
if (!window.electron.exists(loadedProject?.project?.path)) {
|
||||
navigate(PATHS.HOME)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const data = await loadAndValidateSettings(loadedProject?.project?.path)
|
||||
settingsSend({
|
||||
type: 'Set all settings',
|
||||
@ -228,7 +241,9 @@ export const SettingsAuthProviderBase = ({
|
||||
doNotPersist: true,
|
||||
})
|
||||
},
|
||||
settingsPath ? [settingsPath] : []
|
||||
[settingsPath, loadedProject?.project?.path].filter(
|
||||
(x: string | undefined) => x !== undefined
|
||||
)
|
||||
)
|
||||
|
||||
// Add settings commands to the command bar
|
||||
|
@ -11,7 +11,7 @@ export const kclHighlight = styleTags({
|
||||
nil: t.null,
|
||||
'AddOp MultOp ExpOp': t.arithmeticOperator,
|
||||
BangOp: t.logicOperator,
|
||||
CompOp: t.logicOperator,
|
||||
CompOp: t.compareOperator,
|
||||
'Equals Arrow': t.definitionOperator,
|
||||
PipeOperator: t.controlOperator,
|
||||
String: t.string,
|
||||
|
@ -90,7 +90,7 @@ commaSep1NoTrailingComma<term> { term ("," term)* }
|
||||
MultOp { "/" | "*" | "\\" }
|
||||
ExpOp { "^" }
|
||||
BangOp { "!" }
|
||||
CompOp { $[<>] "="? | "!=" | "==" }
|
||||
CompOp { "==" | "!=" | "<=" | ">=" | "<" | ">" }
|
||||
Equals { "=" }
|
||||
Arrow { "=>" }
|
||||
PipeOperator { "|>" }
|
||||
|
@ -12,35 +12,51 @@ type Path = string
|
||||
// watcher.addListener(() => { ... }).
|
||||
|
||||
export const useFileSystemWatcher = (
|
||||
callback: (path: Path) => Promise<void>,
|
||||
dependencyArray: Path[]
|
||||
callback: (eventType: string, path: Path) => Promise<void>,
|
||||
paths: Path[]
|
||||
): void => {
|
||||
// Track a ref to the callback. This is how we get the callback updated
|
||||
// across the NodeJS<->Browser boundary.
|
||||
const callbackRef = useRef<{ fn: (path: Path) => Promise<void> }>({
|
||||
fn: async (_path) => {},
|
||||
})
|
||||
// Used to track this instance of useFileSystemWatcher.
|
||||
// Assign to ref so it doesn't change between renders.
|
||||
const key = useRef(Math.random().toString())
|
||||
|
||||
const [output, setOutput] = useState<
|
||||
{ eventType: string; path: string } | undefined
|
||||
>(undefined)
|
||||
|
||||
// Used to track if paths list changes.
|
||||
const [pathsTracked, setPathsTracked] = useState<Path[]>([])
|
||||
|
||||
useEffect(() => {
|
||||
callbackRef.current.fn = callback
|
||||
}, [callback])
|
||||
|
||||
// Used to track if dependencyArrray changes.
|
||||
const [dependencyArrayTracked, setDependencyArrayTracked] = useState<Path[]>(
|
||||
[]
|
||||
)
|
||||
if (!output) return
|
||||
callback(output.eventType, output.path).catch(reportRejection)
|
||||
}, [output])
|
||||
|
||||
// On component teardown obliterate all watchers.
|
||||
useEffect(() => {
|
||||
// The hook is useless on web.
|
||||
if (!isDesktop()) return
|
||||
|
||||
const cbWatcher = (eventType: string, path: string) => {
|
||||
setOutput({ eventType, path })
|
||||
}
|
||||
|
||||
for (let path of pathsTracked) {
|
||||
// Because functions don't retain refs between NodeJS-Browser I need to
|
||||
// pass an identifying key so we can later remove it.
|
||||
// A way to think of the function call is:
|
||||
// "For this path, add a new handler with this key"
|
||||
// "There can be many keys (functions) per path"
|
||||
// Again if refs were preserved, we wouldn't need to do this. Keys
|
||||
// gives us uniqueness.
|
||||
window.electron.watchFileOn(path, key.current, cbWatcher)
|
||||
}
|
||||
|
||||
return () => {
|
||||
for (let path of dependencyArray) {
|
||||
window.electron.watchFileOff(path)
|
||||
for (let path of pathsTracked) {
|
||||
window.electron.watchFileOff(path, key.current)
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
}, [pathsTracked])
|
||||
|
||||
function difference<T>(l1: T[], l2: T[]): [T[], T[]] {
|
||||
return [
|
||||
@ -49,8 +65,7 @@ export const useFileSystemWatcher = (
|
||||
]
|
||||
}
|
||||
|
||||
const hasDiff =
|
||||
difference(dependencyArray, dependencyArrayTracked)[0].length !== 0
|
||||
const hasDiff = difference(paths, pathsTracked)[0].length !== 0
|
||||
|
||||
// Removing 1 watcher at a time is only possible because in a filesystem,
|
||||
// a path is unique (there can never be two paths with the same name).
|
||||
@ -61,19 +76,8 @@ export const useFileSystemWatcher = (
|
||||
|
||||
if (!hasDiff) return
|
||||
|
||||
const [pathsRemoved, pathsRemaining] = difference(
|
||||
dependencyArrayTracked,
|
||||
dependencyArray
|
||||
)
|
||||
for (let path of pathsRemoved) {
|
||||
window.electron.watchFileOff(path)
|
||||
}
|
||||
const [pathsAdded] = difference(dependencyArray, dependencyArrayTracked)
|
||||
for (let path of pathsAdded) {
|
||||
window.electron.watchFileOn(path, (_eventType: string, path: Path) => {
|
||||
callbackRef.current.fn(path).catch(reportRejection)
|
||||
})
|
||||
}
|
||||
setDependencyArrayTracked(pathsRemaining.concat(pathsAdded))
|
||||
const [, pathsRemaining] = difference(pathsTracked, paths)
|
||||
const [pathsAdded] = difference(paths, pathsTracked)
|
||||
setPathsTracked(pathsRemaining.concat(pathsAdded))
|
||||
}, [hasDiff])
|
||||
}
|
||||
|
@ -40,9 +40,7 @@ export class KclManager {
|
||||
nonCodeMeta: {
|
||||
nonCodeNodes: {},
|
||||
start: [],
|
||||
digest: null,
|
||||
},
|
||||
digest: null,
|
||||
}
|
||||
private _execState: ExecState = emptyExecState()
|
||||
private _programMemory: ProgramMemory = ProgramMemory.empty()
|
||||
@ -208,9 +206,7 @@ export class KclManager {
|
||||
nonCodeMeta: {
|
||||
nonCodeNodes: {},
|
||||
start: [],
|
||||
digest: null,
|
||||
},
|
||||
digest: null,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,7 +172,6 @@ const sk2 = startSketchOn('XY')
|
||||
start: 114,
|
||||
type: 'TagDeclarator',
|
||||
value: 'p',
|
||||
digest: null,
|
||||
},
|
||||
id: expect.any(String),
|
||||
sourceRange: [95, 117],
|
||||
@ -223,7 +222,6 @@ const sk2 = startSketchOn('XY')
|
||||
start: 114,
|
||||
type: 'TagDeclarator',
|
||||
value: 'p',
|
||||
digest: null,
|
||||
},
|
||||
__geoMeta: {
|
||||
id: expect.any(String),
|
||||
@ -266,7 +264,6 @@ const sk2 = startSketchOn('XY')
|
||||
start: 417,
|
||||
type: 'TagDeclarator',
|
||||
value: 'o',
|
||||
digest: null,
|
||||
},
|
||||
id: expect.any(String),
|
||||
sourceRange: [399, 420],
|
||||
@ -317,7 +314,6 @@ const sk2 = startSketchOn('XY')
|
||||
start: 417,
|
||||
type: 'TagDeclarator',
|
||||
value: 'o',
|
||||
digest: null,
|
||||
},
|
||||
__geoMeta: {
|
||||
id: expect.any(String),
|
||||
|
@ -73,7 +73,6 @@ const newVar = myVar + 1`
|
||||
start: 89,
|
||||
type: 'TagDeclarator',
|
||||
value: 'myPath',
|
||||
digest: null,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -99,7 +98,6 @@ const newVar = myVar + 1`
|
||||
start: 143,
|
||||
type: 'TagDeclarator',
|
||||
value: 'rightPath',
|
||||
digest: null,
|
||||
},
|
||||
},
|
||||
])
|
||||
@ -201,7 +199,6 @@ const newVar = myVar + 1`
|
||||
start: 109,
|
||||
type: 'TagDeclarator',
|
||||
value: 'myPath',
|
||||
digest: null,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -100,15 +100,15 @@ describe('Testing findUniqueName', () => {
|
||||
it('should find a unique name', () => {
|
||||
const result = findUniqueName(
|
||||
JSON.stringify([
|
||||
{ type: 'Identifier', name: 'yo01', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo02', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo03', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo04', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo05', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo06', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo07', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo08', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo09', start: 0, end: 0, digest: null },
|
||||
{ type: 'Identifier', name: 'yo01', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo02', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo03', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo04', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo05', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo06', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo07', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo08', start: 0, end: 0 },
|
||||
{ type: 'Identifier', name: 'yo09', start: 0, end: 0 },
|
||||
] satisfies Identifier[]),
|
||||
'yo',
|
||||
2
|
||||
@ -123,8 +123,7 @@ describe('Testing addSketchTo', () => {
|
||||
body: [],
|
||||
start: 0,
|
||||
end: 0,
|
||||
nonCodeMeta: { nonCodeNodes: {}, start: [], digest: null },
|
||||
digest: null,
|
||||
nonCodeMeta: { nonCodeNodes: {}, start: [] },
|
||||
},
|
||||
'yz'
|
||||
)
|
||||
|
@ -241,7 +241,6 @@ export function mutateObjExpProp(
|
||||
value: updateWith,
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -579,7 +578,6 @@ export function createLiteral(value: string | number): Literal {
|
||||
end: 0,
|
||||
value,
|
||||
raw: `${value}`,
|
||||
digest: null,
|
||||
}
|
||||
}
|
||||
|
||||
@ -588,7 +586,7 @@ export function createTagDeclarator(value: string): TagDeclarator {
|
||||
type: 'TagDeclarator',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
value,
|
||||
}
|
||||
}
|
||||
@ -598,7 +596,7 @@ export function createIdentifier(name: string): Identifier {
|
||||
type: 'Identifier',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
name,
|
||||
}
|
||||
}
|
||||
@ -608,7 +606,6 @@ export function createPipeSubstitution(): PipeSubstitution {
|
||||
type: 'PipeSubstitution',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
}
|
||||
}
|
||||
|
||||
@ -624,12 +621,11 @@ export function createCallExpressionStdLib(
|
||||
type: 'Identifier',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
name,
|
||||
},
|
||||
optional: false,
|
||||
arguments: args,
|
||||
digest: null,
|
||||
}
|
||||
}
|
||||
|
||||
@ -645,12 +641,11 @@ export function createCallExpression(
|
||||
type: 'Identifier',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
name,
|
||||
},
|
||||
optional: false,
|
||||
arguments: args,
|
||||
digest: null,
|
||||
}
|
||||
}
|
||||
|
||||
@ -661,7 +656,7 @@ export function createArrayExpression(
|
||||
type: 'ArrayExpression',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
nonCodeMeta: nonCodeMetaEmpty(),
|
||||
elements,
|
||||
}
|
||||
@ -674,7 +669,7 @@ export function createPipeExpression(
|
||||
type: 'PipeExpression',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
body,
|
||||
nonCodeMeta: nonCodeMetaEmpty(),
|
||||
}
|
||||
@ -690,13 +685,13 @@ export function createVariableDeclaration(
|
||||
type: 'VariableDeclaration',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
declarations: [
|
||||
{
|
||||
type: 'VariableDeclarator',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
id: createIdentifier(varName),
|
||||
init,
|
||||
},
|
||||
@ -713,14 +708,14 @@ export function createObjectExpression(properties: {
|
||||
type: 'ObjectExpression',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
nonCodeMeta: nonCodeMetaEmpty(),
|
||||
properties: Object.entries(properties).map(([key, value]) => ({
|
||||
type: 'ObjectProperty',
|
||||
start: 0,
|
||||
end: 0,
|
||||
key: createIdentifier(key),
|
||||
digest: null,
|
||||
|
||||
value,
|
||||
})),
|
||||
}
|
||||
@ -734,7 +729,7 @@ export function createUnaryExpression(
|
||||
type: 'UnaryExpression',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
operator,
|
||||
argument,
|
||||
}
|
||||
@ -749,7 +744,7 @@ export function createBinaryExpression([left, operator, right]: [
|
||||
type: 'BinaryExpression',
|
||||
start: 0,
|
||||
end: 0,
|
||||
digest: null,
|
||||
|
||||
operator,
|
||||
left,
|
||||
right,
|
||||
@ -1139,5 +1134,5 @@ export async function deleteFromSelection(
|
||||
}
|
||||
|
||||
const nonCodeMetaEmpty = () => {
|
||||
return { nonCodeNodes: {}, start: [], digest: null }
|
||||
return { nonCodeNodes: {}, start: [] }
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ beforeAll(async () => {
|
||||
},
|
||||
})
|
||||
})
|
||||
}, 20_000)
|
||||
}, 30_000)
|
||||
|
||||
afterAll(() => {
|
||||
engineCommandManager.tearDown()
|
||||
|
@ -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(
|
||||
|
@ -1823,11 +1823,10 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({
|
||||
start: 0,
|
||||
end: 0,
|
||||
body: [],
|
||||
digest: null,
|
||||
|
||||
nonCodeMeta: {
|
||||
start: [],
|
||||
nonCodeNodes: [],
|
||||
digest: null,
|
||||
},
|
||||
},
|
||||
pathToNode,
|
||||
|
3
src/lib/codeEditor.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export const normalizeLineEndings = (str: string, normalized = '\n') => {
|
||||
return str.replace(/\r?\n/g, normalized)
|
||||
}
|
@ -190,10 +190,31 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig<
|
||||
options: () => {
|
||||
return Object.entries(machineManager.machines).map(
|
||||
([_, machine]) => ({
|
||||
name: `${machine.id} (${
|
||||
machine.make_model.model || machine.make_model.manufacturer
|
||||
}) via ${machineManager.machineApiIp || 'the local network'}`,
|
||||
name:
|
||||
`${machine.id} (${
|
||||
machine.make_model.model || machine.make_model.manufacturer
|
||||
}) (${machine.state.state})` +
|
||||
(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',
|
||||
value: machine as components['schemas']['MachineInfoResponse'],
|
||||
})
|
||||
)
|
||||
|
@ -258,5 +258,6 @@ export type CommandArgumentWithName<
|
||||
export type CommandArgumentOption<A> = {
|
||||
name: string
|
||||
isCurrent?: boolean
|
||||
disabled?: boolean
|
||||
value: A
|
||||
}
|
||||
|
@ -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
|
||||
|
177
src/lib/machine-api.d.ts
vendored
@ -119,18 +119,96 @@ export interface components {
|
||||
/** @description Extra machine-specific information regarding a connected machine. */
|
||||
ExtraMachineInfoResponse:
|
||||
| {
|
||||
Moonraker: Record<string, never>
|
||||
/** @enum {string} */
|
||||
type: 'moonraker'
|
||||
}
|
||||
| {
|
||||
Usb: Record<string, never>
|
||||
/** @enum {string} */
|
||||
type: 'usb'
|
||||
}
|
||||
| {
|
||||
Bambu: Record<string, never>
|
||||
/** @description The current stage of the machine as defined by Bambu which can include errors, etc. */
|
||||
current_stage?: components['schemas']['Stage'] | null
|
||||
/** @description The nozzle diameter of the machine. */
|
||||
nozzle_diameter: components['schemas']['NozzleDiameter']
|
||||
/** @enum {string} */
|
||||
type: 'bambu'
|
||||
}
|
||||
/** @description Configuration for a FDM-based printer. */
|
||||
FdmHardwareConfiguration: {
|
||||
/** @description The filaments the printer has access to. */
|
||||
filaments: components['schemas']['Filament'][]
|
||||
/**
|
||||
* Format: double
|
||||
* @description Diameter of the extrusion nozzle, in mm.
|
||||
*/
|
||||
nozzle_diameter: number
|
||||
}
|
||||
/** @description Information about the filament being used in a FDM printer. */
|
||||
Filament: {
|
||||
/** @description The color (as hex without the `#`) of the filament, this is likely specific to the manufacturer. */
|
||||
color?: string | null
|
||||
/** @description The material that the filament is made of. */
|
||||
material: components['schemas']['FilamentMaterial']
|
||||
/** @description The name of the filament, this is likely specfic to the manufacturer. */
|
||||
name?: string | null
|
||||
}
|
||||
/** @description The material that the filament is made of. */
|
||||
FilamentMaterial:
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'pla'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'pla_support'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'abs'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'petg'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'nylon'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'tpu'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'pva'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'hips'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'composite'
|
||||
}
|
||||
/** @description The hardware configuration of a machine. */
|
||||
HardwareConfiguration:
|
||||
| {
|
||||
/** @enum {string} */
|
||||
type: 'none'
|
||||
}
|
||||
| {
|
||||
/** @description The configuration for the FDM printer. */
|
||||
config: components['schemas']['FdmHardwareConfiguration']
|
||||
/** @enum {string} */
|
||||
type: 'fdm'
|
||||
}
|
||||
/** @description Information regarding a connected machine. */
|
||||
MachineInfoResponse: {
|
||||
/** @description Additional, per-machine information which is specific to the underlying machine type. */
|
||||
extra?: components['schemas']['ExtraMachineInfoResponse'] | null
|
||||
/** @description Information about how the Machine is currently configured. */
|
||||
hardware_configuration: components['schemas']['HardwareConfiguration']
|
||||
/** @description Machine Identifier (ID) for the specific Machine. */
|
||||
id: string
|
||||
/** @description Information regarding the method of manufacture. */
|
||||
@ -143,6 +221,11 @@ export interface components {
|
||||
*
|
||||
* What "close" means is up to you! */
|
||||
max_part_volume?: components['schemas']['Volume'] | null
|
||||
/**
|
||||
* Format: double
|
||||
* @description Progress of the current print, if printing.
|
||||
*/
|
||||
progress?: number | null
|
||||
/** @description Status of the printer -- be it printing, idle, or unreachable. This may dictate if a machine is capable of taking a new job. */
|
||||
state: components['schemas']['MachineState']
|
||||
}
|
||||
@ -157,17 +240,40 @@ export interface components {
|
||||
}
|
||||
/** @description Current state of the machine -- be it printing, idle or offline. This can be used to determine if a printer is in the correct state to take a new job. */
|
||||
MachineState:
|
||||
| 'Unknown'
|
||||
| 'Idle'
|
||||
| 'Running'
|
||||
| 'Offline'
|
||||
| 'Paused'
|
||||
| 'Complete'
|
||||
| {
|
||||
Failed: string | null
|
||||
/** @enum {string} */
|
||||
state: 'unknown'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
state: 'idle'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
state: 'running'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
state: 'offline'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
state: 'paused'
|
||||
}
|
||||
| {
|
||||
/** @enum {string} */
|
||||
state: 'complete'
|
||||
}
|
||||
| {
|
||||
/** @description A human-readable message describing the failure. */
|
||||
message?: string | null
|
||||
/** @enum {string} */
|
||||
state: 'failed'
|
||||
}
|
||||
/** @description Specific technique by which this Machine takes a design, and produces a real-world 3D object. */
|
||||
MachineType: 'Stereolithography' | 'FusedDeposition' | 'Cnc'
|
||||
MachineType: 'stereolithography' | 'fused_deposition' | 'cnc'
|
||||
/** @description A nozzle diameter. */
|
||||
NozzleDiameter: '0.2' | '0.4' | '0.6' | '0.8'
|
||||
/** @description The response from the `/ping` endpoint. */
|
||||
Pong: {
|
||||
/** @description The pong response. */
|
||||
@ -186,7 +292,56 @@ export interface components {
|
||||
job_name: string
|
||||
/** @description The machine id to print to. */
|
||||
machine_id: string
|
||||
/** @description Requested design-specific slicer configurations. */
|
||||
slicer_configuration?: components['schemas']['SlicerConfiguration'] | null
|
||||
}
|
||||
/** @description The slicer configuration is a set of parameters that are passed to the slicer to control how the gcode is generated. */
|
||||
SlicerConfiguration: {
|
||||
/**
|
||||
* Format: uint
|
||||
* @description The filament to use for the print.
|
||||
*/
|
||||
filament_idx?: number | null
|
||||
}
|
||||
/** @description The print stage. These come from: https://github.com/SoftFever/OrcaSlicer/blob/431978baf17961df90f0d01871b0ad1d839d7f5d/src/slic3r/GUI/DeviceManager.cpp#L78 */
|
||||
Stage:
|
||||
| 'nothing'
|
||||
| 'empty'
|
||||
| 'auto_bed_leveling'
|
||||
| 'heatbed_preheating'
|
||||
| 'sweeping_xy_mech_mode'
|
||||
| 'changing_filament'
|
||||
| 'm400_pause'
|
||||
| 'paused_due_to_filament_runout'
|
||||
| 'heating_hotend'
|
||||
| 'calibrating_extrusion'
|
||||
| 'scanning_bed_surface'
|
||||
| 'inspecting_first_layer'
|
||||
| 'identifying_build_plate_type'
|
||||
| 'calibrating_micro_lidar'
|
||||
| 'homing_toolhead'
|
||||
| 'cleaning_nozzle_tip'
|
||||
| 'checking_extruder_temperature'
|
||||
| 'printing_was_paused_by_the_user'
|
||||
| 'pause_of_front_cover_falling'
|
||||
| 'calibrating_micro_lidar2'
|
||||
| 'calibrating_extrusion_flow'
|
||||
| 'paused_due_to_nozzle_temperature_malfunction'
|
||||
| 'paused_due_to_heat_bed_temperature_malfunction'
|
||||
| 'filament_unloading'
|
||||
| 'skip_step_pause'
|
||||
| 'filament_loading'
|
||||
| 'motor_noise_calibration'
|
||||
| 'paused_due_to_ams_lost'
|
||||
| 'paused_due_to_low_speed_of_the_heat_break_fan'
|
||||
| 'paused_due_to_chamber_temperature_control_error'
|
||||
| 'cooling_chamber'
|
||||
| 'paused_by_the_gcode_inserted_by_the_user'
|
||||
| 'motor_noise_showoff'
|
||||
| 'nozzle_filament_covered_detected_pause'
|
||||
| 'cutter_error_pause'
|
||||
| 'first_layer_error_pause'
|
||||
| 'nozzle_clog_pause'
|
||||
/** @description Set of three values to represent the extent of a 3-D Volume. This contains the width, depth, and height values, generally used to represent some maximum or minimum.
|
||||
*
|
||||
* All measurements are in millimeters. */
|
||||
|
@ -85,7 +85,11 @@ export class MachineManager {
|
||||
return
|
||||
}
|
||||
|
||||
this._machines = await window.electron.listMachines()
|
||||
if (this._machineApiIp === null) {
|
||||
return
|
||||
}
|
||||
|
||||
this._machines = await window.electron.listMachines(this._machineApiIp)
|
||||
}
|
||||
|
||||
private async updateMachineApiIp(): Promise<void> {
|
||||
|
@ -14,6 +14,7 @@ import { codeManager } from 'lib/singletons'
|
||||
import { fileSystemManager } from 'lang/std/fileSystemManager'
|
||||
import { getProjectInfo } from './desktop'
|
||||
import { createSettings } from './settings/initialSettings'
|
||||
import { normalizeLineEndings } from 'lib/codeEditor'
|
||||
|
||||
// The root loader simply resolves the settings and any errors that
|
||||
// occurred during the settings load
|
||||
@ -108,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.
|
||||
@ -182,7 +185,3 @@ export const homeLoader: LoaderFunction = async (): Promise<
|
||||
}
|
||||
return {}
|
||||
}
|
||||
|
||||
const normalizeLineEndings = (str: string, normalized = '\n') => {
|
||||
return str.replace(/\r?\n/g, normalized)
|
||||
}
|
||||
|
@ -37,8 +37,6 @@ if (!process.env.NODE_ENV)
|
||||
// dotenv override when present
|
||||
dotenv.config({ path: [`.env.${NODE_ENV}.local`, `.env.${NODE_ENV}`] })
|
||||
|
||||
console.log(process.env)
|
||||
|
||||
process.env.VITE_KC_API_WS_MODELING_URL ??=
|
||||
'wss://api.zoo.dev/ws/modeling/commands'
|
||||
process.env.VITE_KC_API_BASE_URL ??= 'https://api.zoo.dev'
|
||||
@ -238,6 +236,7 @@ ipcMain.handle('find_machine_api', () => {
|
||||
const ip = service.addresses[0]
|
||||
const port = service.port
|
||||
// We want to return the ip address of the machine API.
|
||||
console.log(`Machine API found at ${ip}:${port}`)
|
||||
resolve(`${ip}:${port}`)
|
||||
}
|
||||
)
|
||||
|
@ -30,22 +30,51 @@ const isMac = os.platform() === 'darwin'
|
||||
const isWindows = os.platform() === 'win32'
|
||||
const isLinux = os.platform() === 'linux'
|
||||
|
||||
let fsWatchListeners = new Map<string, ReturnType<typeof chokidar.watch>>()
|
||||
let fsWatchListeners = new Map<
|
||||
string,
|
||||
Map<
|
||||
string,
|
||||
{
|
||||
watcher: ReturnType<typeof chokidar.watch>
|
||||
callback: (eventType: string, path: string) => void
|
||||
}
|
||||
>
|
||||
>()
|
||||
|
||||
const watchFileOn = (path: string, callback: (path: string) => void) => {
|
||||
const watcherMaybe = fsWatchListeners.get(path)
|
||||
if (watcherMaybe) return
|
||||
const watcher = chokidar.watch(path)
|
||||
const watchFileOn = (
|
||||
path: string,
|
||||
key: string,
|
||||
callback: (eventType: string, path: string) => void
|
||||
) => {
|
||||
let watchers = fsWatchListeners.get(path)
|
||||
if (!watchers) {
|
||||
watchers = new Map()
|
||||
}
|
||||
const watcher = chokidar.watch(path, { depth: 1 })
|
||||
watcher.on('all', callback)
|
||||
fsWatchListeners.set(path, watcher)
|
||||
watchers.set(key, { watcher, callback })
|
||||
fsWatchListeners.set(path, watchers)
|
||||
}
|
||||
const watchFileOff = (path: string) => {
|
||||
const watcher = fsWatchListeners.get(path)
|
||||
if (!watcher) return
|
||||
watcher.unwatch(path)
|
||||
fsWatchListeners.delete(path)
|
||||
const watchFileOff = (path: string, key: string) => {
|
||||
const watchers = fsWatchListeners.get(path)
|
||||
if (!watchers) return
|
||||
const data = watchers.get(key)
|
||||
if (!data) {
|
||||
console.warn(
|
||||
"Trying to remove a watcher, callback that doesn't exist anymore. Suspicious."
|
||||
)
|
||||
return
|
||||
}
|
||||
const { watcher, callback } = data
|
||||
watcher.off('all', callback)
|
||||
watchers.delete(key)
|
||||
if (watchers.size === 0) {
|
||||
fsWatchListeners.delete(path)
|
||||
} else {
|
||||
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)
|
||||
@ -77,11 +106,12 @@ const kittycad = (access: string, args: any) =>
|
||||
|
||||
// We could probably do this from the renderer side, but I fear CORS will
|
||||
// bite our butts.
|
||||
const listMachines = async (): Promise<MachinesListing> => {
|
||||
const machineApi = await ipcRenderer.invoke('find_machine_api')
|
||||
if (!machineApi) return []
|
||||
|
||||
return fetch(`http://${machineApi}/machines`).then((resp) => resp.json())
|
||||
const listMachines = async (
|
||||
machineApiAddr: string
|
||||
): Promise<MachinesListing> => {
|
||||
return fetch(`http://${machineApiAddr}/machines`).then((resp) => {
|
||||
return resp.json()
|
||||
})
|
||||
}
|
||||
|
||||
const getMachineApiIp = async (): Promise<String | null> =>
|
||||
|
@ -53,8 +53,11 @@ pub struct Program {
|
||||
pub start: usize,
|
||||
pub end: usize,
|
||||
pub body: Vec<BodyItem>,
|
||||
#[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")]
|
||||
pub non_code_meta: NonCodeMeta,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -837,6 +840,8 @@ pub struct NonCodeNode {
|
||||
pub end: usize,
|
||||
pub value: NonCodeValue,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -981,6 +986,8 @@ pub struct NonCodeMeta {
|
||||
pub non_code_nodes: HashMap<usize, Vec<NonCodeNode>>,
|
||||
pub start: Vec<NonCodeNode>,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1053,6 +1060,8 @@ pub struct ImportItem {
|
||||
pub start: usize,
|
||||
pub end: usize,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1105,6 +1114,8 @@ pub struct ImportStatement {
|
||||
pub path: String,
|
||||
pub raw_path: String,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1146,6 +1157,8 @@ pub struct ExpressionStatement {
|
||||
pub end: usize,
|
||||
pub expression: Expr,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1162,6 +1175,8 @@ pub struct CallExpression {
|
||||
pub arguments: Vec<Expr>,
|
||||
pub optional: bool,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1321,6 +1336,8 @@ pub struct VariableDeclaration {
|
||||
pub visibility: ItemVisibility,
|
||||
pub kind: VariableKind, // Change to enum if there are specific values
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1575,6 +1592,8 @@ pub struct VariableDeclarator {
|
||||
/// The value of the variable.
|
||||
pub init: Expr,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1606,6 +1625,8 @@ pub struct Literal {
|
||||
pub value: LiteralValue,
|
||||
pub raw: String,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1662,6 +1683,8 @@ pub struct Identifier {
|
||||
pub end: usize,
|
||||
pub name: String,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1703,6 +1726,8 @@ pub struct TagDeclarator {
|
||||
#[serde(rename = "value")]
|
||||
pub name: String,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1821,6 +1846,8 @@ pub struct PipeSubstitution {
|
||||
pub start: usize,
|
||||
pub end: usize,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1859,6 +1886,8 @@ pub struct ArrayExpression {
|
||||
#[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")]
|
||||
pub non_code_meta: NonCodeMeta,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -1934,6 +1963,8 @@ pub struct ArrayRangeExpression {
|
||||
/// Is the `end_element` included in the range?
|
||||
pub end_inclusive: bool,
|
||||
// TODO (maybe) comments on range components?
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2000,6 +2031,8 @@ pub struct ObjectExpression {
|
||||
#[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")]
|
||||
pub non_code_meta: NonCodeMeta,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2067,6 +2100,8 @@ pub struct ObjectProperty {
|
||||
pub key: Identifier,
|
||||
pub value: Expr,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2197,6 +2232,8 @@ pub struct MemberExpression {
|
||||
pub property: LiteralIdentifier,
|
||||
pub computed: bool,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2256,6 +2293,8 @@ pub struct BinaryExpression {
|
||||
pub left: BinaryPart,
|
||||
pub right: BinaryPart,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2438,6 +2477,8 @@ pub struct UnaryExpression {
|
||||
pub operator: UnaryOperator,
|
||||
pub argument: BinaryPart,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2513,8 +2554,11 @@ pub struct PipeExpression {
|
||||
// TODO: Only the first body expression can be any Value.
|
||||
// The rest will be CallExpression, and the AST type should reflect this.
|
||||
pub body: Vec<Expr>,
|
||||
#[serde(default, skip_serializing_if = "NonCodeMeta::is_empty")]
|
||||
pub non_code_meta: NonCodeMeta,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2650,6 +2694,8 @@ pub struct Parameter {
|
||||
/// Is the parameter optional?
|
||||
pub optional: bool,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2665,6 +2711,8 @@ pub struct FunctionExpression {
|
||||
#[serde(skip)]
|
||||
pub return_type: Option<FnArgType>,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
@ -2751,6 +2799,8 @@ pub struct ReturnStatement {
|
||||
pub end: usize,
|
||||
pub argument: Expr,
|
||||
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub digest: Option<Digest>,
|
||||
}
|
||||
|
||||
|
@ -65,93 +65,9 @@ impl MemberExpression {
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_result(&self, exec_state: &mut ExecState) -> Result<KclValue, KclError> {
|
||||
#[derive(Debug)]
|
||||
enum Property {
|
||||
Number(usize),
|
||||
String(String),
|
||||
}
|
||||
|
||||
impl Property {
|
||||
fn type_name(&self) -> &'static str {
|
||||
match self {
|
||||
Property::Number(_) => "number",
|
||||
Property::String(_) => "string",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let property_src: SourceRange = self.property.clone().into();
|
||||
let property_sr = vec![property_src];
|
||||
|
||||
let property: Property = match self.property.clone() {
|
||||
LiteralIdentifier::Identifier(identifier) => {
|
||||
let name = identifier.name;
|
||||
if !self.computed {
|
||||
// Treat the property as a literal
|
||||
Property::String(name.to_string())
|
||||
} else {
|
||||
// Actually evaluate memory to compute the property.
|
||||
let prop = exec_state.memory.get(&name, property_src)?;
|
||||
let KclValue::UserVal(prop) = prop else {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!(
|
||||
"{name} is not a valid property/index, you can only use a string or int (>= 0) here",
|
||||
),
|
||||
}));
|
||||
};
|
||||
match prop.value {
|
||||
JValue::Number(ref num) => {
|
||||
num
|
||||
.as_u64()
|
||||
.and_then(|x| usize::try_from(x).ok())
|
||||
.map(Property::Number)
|
||||
.ok_or_else(|| {
|
||||
KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!(
|
||||
"{name}'s value is not a valid property/index, you can only use a string or int (>= 0) here",
|
||||
),
|
||||
})
|
||||
})?
|
||||
}
|
||||
JValue::String(ref x) => Property::String(x.to_owned()),
|
||||
_ => {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!(
|
||||
"{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array",
|
||||
),
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
LiteralIdentifier::Literal(literal) => {
|
||||
let value = literal.value.clone();
|
||||
match value {
|
||||
LiteralValue::IInteger(x) => {
|
||||
if let Ok(x) = u64::try_from(x) {
|
||||
Property::Number(x.try_into().unwrap())
|
||||
} else {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!("{x} is not a valid index, indices must be whole numbers >= 0"),
|
||||
}));
|
||||
}
|
||||
}
|
||||
LiteralValue::String(s) => Property::String(s),
|
||||
_ => {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: vec![self.into()],
|
||||
message: "Only strings or ints (>= 0) can be properties/indexes".to_owned(),
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let property = Property::try_from(self.computed, self.property.clone(), exec_state, self.into())?;
|
||||
let object = match &self.object {
|
||||
// TODO: Don't use recursion here, use a loop.
|
||||
MemberObject::MemberExpression(member_expr) => member_expr.get_result(exec_state)?,
|
||||
@ -783,3 +699,105 @@ impl IfExpression {
|
||||
.map(|expr| expr.unwrap())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Property {
|
||||
Number(usize),
|
||||
String(String),
|
||||
}
|
||||
|
||||
impl Property {
|
||||
fn try_from(
|
||||
computed: bool,
|
||||
value: LiteralIdentifier,
|
||||
exec_state: &ExecState,
|
||||
sr: SourceRange,
|
||||
) -> Result<Self, KclError> {
|
||||
let property_sr = vec![sr];
|
||||
let property_src: SourceRange = value.clone().into();
|
||||
match value {
|
||||
LiteralIdentifier::Identifier(identifier) => {
|
||||
let name = identifier.name;
|
||||
if !computed {
|
||||
// Treat the property as a literal
|
||||
Ok(Property::String(name.to_string()))
|
||||
} else {
|
||||
// Actually evaluate memory to compute the property.
|
||||
let prop = exec_state.memory.get(&name, property_src)?;
|
||||
let KclValue::UserVal(prop) = prop else {
|
||||
return Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!(
|
||||
"{name} is not a valid property/index, you can only use a string or int (>= 0) here",
|
||||
),
|
||||
}));
|
||||
};
|
||||
jvalue_to_prop(&prop.value, property_sr, &name)
|
||||
}
|
||||
}
|
||||
LiteralIdentifier::Literal(literal) => {
|
||||
let value = literal.value.clone();
|
||||
match value {
|
||||
LiteralValue::IInteger(x) => {
|
||||
if let Ok(x) = u64::try_from(x) {
|
||||
Ok(Property::Number(x.try_into().unwrap()))
|
||||
} else {
|
||||
Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message: format!("{x} is not a valid index, indices must be whole numbers >= 0"),
|
||||
}))
|
||||
}
|
||||
}
|
||||
LiteralValue::String(s) => Ok(Property::String(s)),
|
||||
_ => Err(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: vec![sr],
|
||||
message: "Only strings or ints (>= 0) can be properties/indexes".to_owned(),
|
||||
})),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn jvalue_to_prop(value: &JValue, property_sr: Vec<SourceRange>, name: &str) -> Result<Property, KclError> {
|
||||
let make_err = |message: String| {
|
||||
Err::<Property, _>(KclError::Semantic(KclErrorDetails {
|
||||
source_ranges: property_sr,
|
||||
message,
|
||||
}))
|
||||
};
|
||||
const MUST_BE_POSINT: &str = "indices must be whole positive numbers";
|
||||
const TRY_INT: &str = "try using the int() function to make this a whole number";
|
||||
match value {
|
||||
JValue::Number(ref num) => {
|
||||
let maybe_uint = num.as_u64().and_then(|x| usize::try_from(x).ok());
|
||||
if let Some(uint) = maybe_uint {
|
||||
Ok(Property::Number(uint))
|
||||
} else if let Some(iint) = num.as_i64() {
|
||||
make_err(format!("'{iint}' is not a valid index, {MUST_BE_POSINT}"))
|
||||
} else if let Some(fnum) = num.as_f64() {
|
||||
if fnum < 0.0 {
|
||||
make_err(format!("'{fnum}' is not a valid index, {MUST_BE_POSINT}"))
|
||||
} else if fnum.fract() == 0.0 {
|
||||
make_err(format!("'{fnum:.1}' is stored as a fractional number but indices must be whole numbers, {TRY_INT}"))
|
||||
} else {
|
||||
make_err(format!("'{fnum}' is not a valid index, {MUST_BE_POSINT}, {TRY_INT}"))
|
||||
}
|
||||
} else {
|
||||
make_err(format!("'{num}' is not a valid index, {MUST_BE_POSINT}"))
|
||||
}
|
||||
}
|
||||
JValue::String(ref x) => Ok(Property::String(x.to_owned())),
|
||||
_ => {
|
||||
make_err(format!("{name} is not a valid property/index, you can only use a string to get the property of an object, or an int (>= 0) to get an item in an array"))
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Property {
|
||||
fn type_name(&self) -> &'static str {
|
||||
match self {
|
||||
Property::Number(_) => "number",
|
||||
Property::String(_) => "string",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -22,8 +21,6 @@ expression: actual
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -22,8 +21,6 @@ expression: actual
|
||||
"start": 2,
|
||||
"end": 3,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -22,8 +21,6 @@ expression: actual
|
||||
"start": 3,
|
||||
"end": 4,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -28,8 +27,7 @@ expression: actual
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -37,10 +35,7 @@ expression: actual
|
||||
"start": 8,
|
||||
"end": 9,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -28,8 +27,7 @@ expression: actual
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -37,10 +35,7 @@ expression: actual
|
||||
"start": 10,
|
||||
"end": 11,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -34,8 +33,7 @@ expression: actual
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -43,12 +41,9 @@ expression: actual
|
||||
"start": 10,
|
||||
"end": 11,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -56,8 +51,6 @@ expression: actual
|
||||
"start": 16,
|
||||
"end": 17,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -34,8 +33,7 @@ expression: actual
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -43,10 +41,8 @@ expression: actual
|
||||
"start": 10,
|
||||
"end": 11,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -54,10 +50,7 @@ expression: actual
|
||||
"start": 16,
|
||||
"end": 17,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -40,8 +39,7 @@ expression: actual
|
||||
"start": 7,
|
||||
"end": 8,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -49,10 +47,8 @@ expression: actual
|
||||
"start": 11,
|
||||
"end": 12,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -60,10 +56,8 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -71,10 +65,7 @@ expression: actual
|
||||
"start": 21,
|
||||
"end": 22,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -28,8 +27,7 @@ expression: actual
|
||||
"start": 8,
|
||||
"end": 9,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -37,10 +35,7 @@ expression: actual
|
||||
"start": 12,
|
||||
"end": 13,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,28 +30,23 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 8,
|
||||
"name": "distance",
|
||||
"digest": null
|
||||
"name": "distance"
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 11,
|
||||
"end": 12,
|
||||
"name": "p",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "p"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 15,
|
||||
"end": 18,
|
||||
"name": "FOS",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "FOS"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -59,10 +54,8 @@ expression: actual
|
||||
"start": 21,
|
||||
"end": 22,
|
||||
"value": 6,
|
||||
"raw": "6",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "6"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -75,18 +68,14 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 26,
|
||||
"end": 36,
|
||||
"name": "sigmaAllow",
|
||||
"digest": null
|
||||
"name": "sigmaAllow"
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 39,
|
||||
"end": 44,
|
||||
"name": "width",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "width"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -22,8 +21,6 @@ expression: actual
|
||||
"start": 7,
|
||||
"end": 8,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 15,
|
||||
"name": "boxSketch",
|
||||
"digest": null
|
||||
"name": "boxSketch"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 18,
|
||||
"end": 31,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -54,8 +52,7 @@ expression: actual
|
||||
"start": 33,
|
||||
"end": 34,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -63,15 +60,12 @@ expression: actual
|
||||
"start": 36,
|
||||
"end": 37,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -82,8 +76,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 47,
|
||||
"end": 51,
|
||||
"name": "line",
|
||||
"digest": null
|
||||
"name": "line"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -98,8 +91,7 @@ expression: actual
|
||||
"start": 53,
|
||||
"end": 54,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -107,22 +99,18 @@ expression: actual
|
||||
"start": 56,
|
||||
"end": 58,
|
||||
"value": 10,
|
||||
"raw": "10",
|
||||
"digest": null
|
||||
"raw": "10"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 61,
|
||||
"end": 62,
|
||||
"digest": null
|
||||
"end": 62
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -133,8 +121,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 71,
|
||||
"end": 84,
|
||||
"name": "tangentialArc",
|
||||
"digest": null
|
||||
"name": "tangentialArc"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -155,10 +142,8 @@ expression: actual
|
||||
"start": 87,
|
||||
"end": 88,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -166,22 +151,18 @@ expression: actual
|
||||
"start": 90,
|
||||
"end": 91,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 94,
|
||||
"end": 95,
|
||||
"digest": null
|
||||
"end": 95
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -192,8 +173,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 104,
|
||||
"end": 108,
|
||||
"name": "line",
|
||||
"digest": null
|
||||
"name": "line"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -208,8 +188,7 @@ expression: actual
|
||||
"start": 110,
|
||||
"end": 111,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
{
|
||||
"type": "UnaryExpression",
|
||||
@ -223,24 +202,19 @@ expression: actual
|
||||
"start": 114,
|
||||
"end": 116,
|
||||
"value": 15,
|
||||
"raw": "15",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "15"
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 119,
|
||||
"end": 120,
|
||||
"digest": null
|
||||
"end": 120
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -251,8 +225,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 129,
|
||||
"end": 136,
|
||||
"name": "extrude",
|
||||
"digest": null
|
||||
"name": "extrude"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -261,39 +234,22 @@ expression: actual
|
||||
"start": 137,
|
||||
"end": 139,
|
||||
"value": 10,
|
||||
"raw": "10",
|
||||
"digest": null
|
||||
"raw": "10"
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 141,
|
||||
"end": 142,
|
||||
"digest": null
|
||||
"end": 142
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 8,
|
||||
"name": "sg",
|
||||
"digest": null
|
||||
"name": "sg"
|
||||
},
|
||||
"init": {
|
||||
"type": "UnaryExpression",
|
||||
@ -34,22 +33,12 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 12,
|
||||
"end": 17,
|
||||
"name": "scale",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "scale"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 11,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "UnaryExpression",
|
||||
@ -68,30 +65,17 @@ expression: actual
|
||||
"start": 18,
|
||||
"end": 19,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 13,
|
||||
"name": "myArray",
|
||||
"digest": null
|
||||
"name": "myArray"
|
||||
},
|
||||
"init": {
|
||||
"type": "ArrayRangeExpression",
|
||||
@ -34,8 +33,7 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
"endElement": {
|
||||
"type": "Literal",
|
||||
@ -43,23 +41,13 @@ expression: actual
|
||||
"start": 20,
|
||||
"end": 22,
|
||||
"value": 10,
|
||||
"raw": "10",
|
||||
"digest": null
|
||||
"raw": "10"
|
||||
},
|
||||
"endInclusive": true,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"endInclusive": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 8,
|
||||
"end": 24,
|
||||
"name": "firstPrimeNumber",
|
||||
"digest": null
|
||||
"name": "firstPrimeNumber"
|
||||
},
|
||||
"init": {
|
||||
"type": "FunctionExpression",
|
||||
@ -44,26 +43,15 @@ expression: actual
|
||||
"start": 50,
|
||||
"end": 51,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "fn",
|
||||
"digest": null
|
||||
"kind": "fn"
|
||||
},
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
@ -79,20 +67,11 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 62,
|
||||
"end": 78,
|
||||
"name": "firstPrimeNumber",
|
||||
"digest": null
|
||||
"name": "firstPrimeNumber"
|
||||
},
|
||||
"arguments": [],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 3,
|
||||
"end": 8,
|
||||
"name": "thing",
|
||||
"digest": null
|
||||
"name": "thing"
|
||||
},
|
||||
"init": {
|
||||
"type": "FunctionExpression",
|
||||
@ -35,11 +34,9 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 12,
|
||||
"end": 17,
|
||||
"name": "param",
|
||||
"digest": null
|
||||
"name": "param"
|
||||
},
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
@ -57,26 +54,15 @@ expression: actual
|
||||
"start": 39,
|
||||
"end": 43,
|
||||
"value": true,
|
||||
"raw": "true",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "true"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "fn",
|
||||
"digest": null
|
||||
"kind": "fn"
|
||||
},
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
@ -92,8 +78,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 54,
|
||||
"end": 59,
|
||||
"name": "thing",
|
||||
"digest": null
|
||||
"name": "thing"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -102,20 +87,11 @@ expression: actual
|
||||
"start": 60,
|
||||
"end": 65,
|
||||
"value": false,
|
||||
"raw": "false",
|
||||
"digest": null
|
||||
"raw": "false"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"digest": null
|
||||
"name": "mySketch"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 17,
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -54,8 +52,7 @@ expression: actual
|
||||
"start": 32,
|
||||
"end": 33,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -63,15 +60,12 @@ expression: actual
|
||||
"start": 34,
|
||||
"end": 35,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -82,8 +76,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 49,
|
||||
"end": 55,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -98,8 +91,7 @@ expression: actual
|
||||
"start": 57,
|
||||
"end": 58,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -107,30 +99,25 @@ expression: actual
|
||||
"start": 60,
|
||||
"end": 61,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 64,
|
||||
"end": 65,
|
||||
"digest": null
|
||||
"end": 65
|
||||
},
|
||||
{
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"start": 67,
|
||||
"end": 74,
|
||||
"value": "myPath",
|
||||
"digest": null
|
||||
"value": "myPath"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -141,8 +128,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 87,
|
||||
"end": 93,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -157,8 +143,7 @@ expression: actual
|
||||
"start": 95,
|
||||
"end": 96,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -166,22 +151,18 @@ expression: actual
|
||||
"start": 98,
|
||||
"end": 99,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 102,
|
||||
"end": 103,
|
||||
"digest": null
|
||||
"end": 103
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -192,8 +173,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 116,
|
||||
"end": 122,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -208,8 +188,7 @@ expression: actual
|
||||
"start": 124,
|
||||
"end": 125,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -217,30 +196,25 @@ expression: actual
|
||||
"start": 127,
|
||||
"end": 128,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 131,
|
||||
"end": 132,
|
||||
"digest": null
|
||||
"end": 132
|
||||
},
|
||||
{
|
||||
"type": "TagDeclarator",
|
||||
"type": "TagDeclarator",
|
||||
"start": 134,
|
||||
"end": 144,
|
||||
"value": "rightPath",
|
||||
"digest": null
|
||||
"value": "rightPath"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -251,40 +225,23 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 157,
|
||||
"end": 162,
|
||||
"name": "close",
|
||||
"digest": null
|
||||
"name": "close"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 163,
|
||||
"end": 164,
|
||||
"digest": null
|
||||
"end": 164
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"digest": null
|
||||
"name": "mySketch"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 17,
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -54,8 +52,7 @@ expression: actual
|
||||
"start": 32,
|
||||
"end": 33,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -63,15 +60,12 @@ expression: actual
|
||||
"start": 34,
|
||||
"end": 35,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -82,8 +76,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 41,
|
||||
"end": 47,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -98,8 +91,7 @@ expression: actual
|
||||
"start": 49,
|
||||
"end": 50,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -107,22 +99,18 @@ expression: actual
|
||||
"start": 52,
|
||||
"end": 53,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 56,
|
||||
"end": 57,
|
||||
"digest": null
|
||||
"end": 57
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -133,40 +121,23 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 62,
|
||||
"end": 67,
|
||||
"name": "close",
|
||||
"digest": null
|
||||
"name": "close"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 68,
|
||||
"end": 69,
|
||||
"digest": null
|
||||
"end": 69
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"digest": null
|
||||
"name": "myBox"
|
||||
},
|
||||
"init": {
|
||||
"type": "CallExpression",
|
||||
@ -32,8 +31,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 14,
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -41,24 +39,14 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"digest": null
|
||||
"name": "p"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"digest": null
|
||||
"name": "myBox"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"name": "f",
|
||||
"digest": null
|
||||
"name": "f"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -48,12 +46,10 @@ expression: actual
|
||||
"start": 16,
|
||||
"end": 17,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -64,8 +60,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 22,
|
||||
"end": 23,
|
||||
"name": "g",
|
||||
"digest": null
|
||||
"name": "g"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -74,39 +69,22 @@ expression: actual
|
||||
"start": 24,
|
||||
"end": 25,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 27,
|
||||
"end": 28,
|
||||
"digest": null
|
||||
"end": 28
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myBox",
|
||||
"digest": null
|
||||
"name": "myBox"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 14,
|
||||
"end": 27,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -47,12 +45,10 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"name": "p",
|
||||
"digest": null
|
||||
"name": "p"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -63,8 +59,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 34,
|
||||
"end": 38,
|
||||
"name": "line",
|
||||
"digest": null
|
||||
"name": "line"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -79,50 +74,31 @@ expression: actual
|
||||
"start": 40,
|
||||
"end": 41,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 43,
|
||||
"end": 44,
|
||||
"name": "l",
|
||||
"digest": null
|
||||
"name": "l"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 47,
|
||||
"end": 48,
|
||||
"digest": null
|
||||
"end": 48
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 11,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,28 +59,16 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 11,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,13 +59,10 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -78,8 +72,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 21,
|
||||
"end": 25,
|
||||
"name": "from",
|
||||
"digest": null
|
||||
"name": "from"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -93,8 +86,7 @@ expression: actual
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -102,28 +94,16 @@ expression: actual
|
||||
"start": 31,
|
||||
"end": 32,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 8,
|
||||
"end": 10,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 12,
|
||||
"end": 13,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,28 +59,16 @@ expression: actual
|
||||
"start": 15,
|
||||
"end": 16,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 11,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,13 +59,10 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -78,8 +72,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 21,
|
||||
"end": 25,
|
||||
"name": "from",
|
||||
"digest": null
|
||||
"name": "from"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -93,8 +86,7 @@ expression: actual
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -102,28 +94,16 @@ expression: actual
|
||||
"start": 31,
|
||||
"end": 32,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 6,
|
||||
"name": "lineTo",
|
||||
"digest": null
|
||||
"name": "lineTo"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 11,
|
||||
"name": "to",
|
||||
"digest": null
|
||||
"name": "to"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +51,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,13 +59,10 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -78,8 +72,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 20,
|
||||
"end": 24,
|
||||
"name": "from",
|
||||
"digest": null
|
||||
"name": "from"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -93,8 +86,7 @@ expression: actual
|
||||
"start": 27,
|
||||
"end": 28,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -102,28 +94,16 @@ expression: actual
|
||||
"start": 30,
|
||||
"end": 31,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 14,
|
||||
"name": "mySketch",
|
||||
"digest": null
|
||||
"name": "mySketch"
|
||||
},
|
||||
"init": {
|
||||
"type": "CallExpression",
|
||||
@ -32,8 +31,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 17,
|
||||
"end": 30,
|
||||
"name": "startSketchAt",
|
||||
"digest": null
|
||||
"name": "startSketchAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -48,8 +46,7 @@ expression: actual
|
||||
"start": 32,
|
||||
"end": 33,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -57,27 +54,16 @@ expression: actual
|
||||
"start": 34,
|
||||
"end": 35,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 3,
|
||||
"name": "log",
|
||||
"digest": null
|
||||
"name": "log"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -30,8 +29,7 @@ expression: actual
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -39,28 +37,18 @@ expression: actual
|
||||
"start": 7,
|
||||
"end": 14,
|
||||
"value": "hello",
|
||||
"raw": "\"hello\"",
|
||||
"digest": null
|
||||
"raw": "\"hello\""
|
||||
},
|
||||
{
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 16,
|
||||
"end": 27,
|
||||
"name": "aIdentifier",
|
||||
"digest": null
|
||||
"name": "aIdentifier"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -23,8 +23,7 @@ expression: actual
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -32,18 +31,9 @@ expression: actual
|
||||
"start": 4,
|
||||
"end": 7,
|
||||
"value": "a",
|
||||
"raw": "\"a\"",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "\"a\""
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 4,
|
||||
"name": "line",
|
||||
"digest": null
|
||||
"name": "line"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -36,38 +35,26 @@ expression: actual
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 9,
|
||||
"end": 10,
|
||||
"name": "l",
|
||||
"digest": null
|
||||
"name": "l"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 13,
|
||||
"end": 14,
|
||||
"digest": null
|
||||
"end": 14
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 14,
|
||||
"name": "cylinder",
|
||||
"digest": null
|
||||
"name": "cylinder"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 17,
|
||||
"end": 30,
|
||||
"name": "startSketchOn",
|
||||
"digest": null
|
||||
"name": "startSketchOn"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -48,12 +46,10 @@ expression: actual
|
||||
"start": 31,
|
||||
"end": 35,
|
||||
"value": "XY",
|
||||
"raw": "'XY'",
|
||||
"digest": null
|
||||
"raw": "'XY'"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -64,8 +60,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 44,
|
||||
"end": 50,
|
||||
"name": "circle",
|
||||
"digest": null
|
||||
"name": "circle"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -82,8 +77,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 53,
|
||||
"end": 59,
|
||||
"name": "center",
|
||||
"digest": null
|
||||
"name": "center"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -97,8 +91,7 @@ expression: actual
|
||||
"start": 62,
|
||||
"end": 63,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -106,13 +99,10 @@ expression: actual
|
||||
"start": 65,
|
||||
"end": 66,
|
||||
"value": 0,
|
||||
"raw": "0",
|
||||
"digest": null
|
||||
"raw": "0"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -122,8 +112,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 69,
|
||||
"end": 75,
|
||||
"name": "radius",
|
||||
"digest": null
|
||||
"name": "radius"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -131,24 +120,19 @@ expression: actual
|
||||
"start": 77,
|
||||
"end": 79,
|
||||
"value": 22,
|
||||
"raw": "22",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "22"
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 83,
|
||||
"end": 84,
|
||||
"digest": null
|
||||
"end": 84
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -159,8 +143,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 93,
|
||||
"end": 100,
|
||||
"name": "extrude",
|
||||
"digest": null
|
||||
"name": "extrude"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -169,39 +152,22 @@ expression: actual
|
||||
"start": 101,
|
||||
"end": 103,
|
||||
"value": 14,
|
||||
"raw": "14",
|
||||
"digest": null
|
||||
"raw": "14"
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 105,
|
||||
"end": 106,
|
||||
"digest": null
|
||||
"end": 106
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 3,
|
||||
"end": 4,
|
||||
"name": "f",
|
||||
"digest": null
|
||||
"name": "f"
|
||||
},
|
||||
"init": {
|
||||
"type": "FunctionExpression",
|
||||
@ -35,11 +34,9 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 8,
|
||||
"end": 13,
|
||||
"name": "angle",
|
||||
"digest": null
|
||||
"name": "angle"
|
||||
},
|
||||
"optional": true,
|
||||
"digest": null
|
||||
"optional": true
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
@ -60,8 +57,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 28,
|
||||
"end": 35,
|
||||
"name": "default",
|
||||
"digest": null
|
||||
"name": "default"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -69,8 +65,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 36,
|
||||
"end": 41,
|
||||
"name": "angle",
|
||||
"digest": null
|
||||
"name": "angle"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -78,36 +73,18 @@ expression: actual
|
||||
"start": 43,
|
||||
"end": 46,
|
||||
"value": 360,
|
||||
"raw": "360",
|
||||
"digest": null
|
||||
"raw": "360"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "fn",
|
||||
"digest": null
|
||||
"kind": "fn"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"digest": null
|
||||
"name": "numbers"
|
||||
},
|
||||
"init": {
|
||||
"type": "ArrayExpression",
|
||||
@ -35,8 +34,7 @@ expression: actual
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -44,8 +42,7 @@ expression: actual
|
||||
"start": 79,
|
||||
"end": 80,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
@ -59,8 +56,7 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"2": [
|
||||
@ -72,27 +68,16 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"start": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 11,
|
||||
"name": "numbers",
|
||||
"digest": null
|
||||
"name": "numbers"
|
||||
},
|
||||
"init": {
|
||||
"type": "ArrayExpression",
|
||||
@ -35,8 +34,7 @@ expression: actual
|
||||
"start": 28,
|
||||
"end": 29,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -44,8 +42,7 @@ expression: actual
|
||||
"start": 43,
|
||||
"end": 44,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
@ -59,8 +56,7 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "A,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"3": [
|
||||
@ -72,27 +68,16 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "B,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"start": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"digest": null
|
||||
"name": "props"
|
||||
},
|
||||
"init": {
|
||||
"type": "ObjectExpression",
|
||||
@ -37,8 +36,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 26,
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"digest": null
|
||||
"name": "a"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -46,10 +44,8 @@ expression: actual
|
||||
"start": 29,
|
||||
"end": 30,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -59,8 +55,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 65,
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"digest": null
|
||||
"name": "c"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -68,10 +63,8 @@ expression: actual
|
||||
"start": 68,
|
||||
"end": 69,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
@ -85,27 +78,16 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"start": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 9,
|
||||
"name": "props",
|
||||
"digest": null
|
||||
"name": "props"
|
||||
},
|
||||
"init": {
|
||||
"type": "ObjectExpression",
|
||||
@ -37,8 +36,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 26,
|
||||
"end": 27,
|
||||
"name": "a",
|
||||
"digest": null
|
||||
"name": "a"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -46,10 +44,8 @@ expression: actual
|
||||
"start": 29,
|
||||
"end": 30,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -59,8 +55,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 65,
|
||||
"end": 66,
|
||||
"name": "c",
|
||||
"digest": null
|
||||
"name": "c"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -68,10 +63,8 @@ expression: actual
|
||||
"start": 68,
|
||||
"end": 69,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
@ -85,27 +78,16 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "b: 2,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"start": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"digest": null
|
||||
"name": "myVar"
|
||||
},
|
||||
"init": {
|
||||
"type": "CallExpression",
|
||||
@ -32,8 +31,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 14,
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"digest": null
|
||||
"name": "min"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -42,8 +40,7 @@ expression: actual
|
||||
"start": 18,
|
||||
"end": 19,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
{
|
||||
"type": "UnaryExpression",
|
||||
@ -60,8 +57,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 23,
|
||||
"end": 29,
|
||||
"name": "legLen",
|
||||
"digest": null
|
||||
"name": "legLen"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -70,8 +66,7 @@ expression: actual
|
||||
"start": 30,
|
||||
"end": 31,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -79,30 +74,18 @@ expression: actual
|
||||
"start": 33,
|
||||
"end": 34,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 7,
|
||||
"end": 16,
|
||||
"name": "sketch001",
|
||||
"digest": null
|
||||
"name": "sketch001"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -38,8 +37,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 19,
|
||||
"end": 32,
|
||||
"name": "startSketchOn",
|
||||
"digest": null
|
||||
"name": "startSketchOn"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -48,12 +46,10 @@ expression: actual
|
||||
"start": 33,
|
||||
"end": 37,
|
||||
"value": "XY",
|
||||
"raw": "'XY'",
|
||||
"digest": null
|
||||
"raw": "'XY'"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -64,20 +60,17 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 115,
|
||||
"end": 129,
|
||||
"name": "startProfileAt",
|
||||
"digest": null
|
||||
"name": "startProfileAt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 130,
|
||||
"end": 131,
|
||||
"digest": null
|
||||
"end": 131
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
@ -91,8 +84,7 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "|> arc({",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "NonCodeNode",
|
||||
@ -102,8 +94,7 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "angleEnd: 270,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "NonCodeNode",
|
||||
@ -113,8 +104,7 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "angleStart: 450,",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "NonCodeNode",
|
||||
@ -124,27 +114,16 @@ expression: actual
|
||||
"type": "blockComment",
|
||||
"value": "}, %)",
|
||||
"style": "line"
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"start": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 7,
|
||||
"end": 11,
|
||||
"name": "my14",
|
||||
"digest": null
|
||||
"name": "my14"
|
||||
},
|
||||
"init": {
|
||||
"type": "BinaryExpression",
|
||||
@ -41,8 +40,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -50,10 +48,8 @@ expression: actual
|
||||
"start": 18,
|
||||
"end": 19,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -73,8 +69,7 @@ expression: actual
|
||||
"start": 22,
|
||||
"end": 23,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -82,10 +77,8 @@ expression: actual
|
||||
"start": 26,
|
||||
"end": 27,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -93,24 +86,13 @@ expression: actual
|
||||
"start": 30,
|
||||
"end": 31,
|
||||
"value": 2,
|
||||
"raw": "2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "IfExpression",
|
||||
@ -34,8 +33,7 @@ expression: actual
|
||||
"start": 13,
|
||||
"end": 17,
|
||||
"value": true,
|
||||
"raw": "true",
|
||||
"digest": null
|
||||
"raw": "true"
|
||||
},
|
||||
"then_val": {
|
||||
"start": 32,
|
||||
@ -52,18 +50,10 @@ expression: actual
|
||||
"start": 32,
|
||||
"end": 33,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
"else_ifs": [],
|
||||
"final_else": {
|
||||
@ -81,32 +71,16 @@ expression: actual
|
||||
"start": 63,
|
||||
"end": 64,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "IfExpression",
|
||||
@ -34,8 +33,7 @@ expression: actual
|
||||
"start": 13,
|
||||
"end": 17,
|
||||
"value": true,
|
||||
"raw": "true",
|
||||
"digest": null
|
||||
"raw": "true"
|
||||
},
|
||||
"then_val": {
|
||||
"start": 32,
|
||||
@ -52,18 +50,10 @@ expression: actual
|
||||
"start": 32,
|
||||
"end": 33,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
"else_ifs": [
|
||||
{
|
||||
@ -79,8 +69,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 52,
|
||||
"end": 56,
|
||||
"name": "func",
|
||||
"digest": null
|
||||
"name": "func"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -88,12 +77,10 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 57,
|
||||
"end": 63,
|
||||
"name": "radius",
|
||||
"digest": null
|
||||
"name": "radius"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
},
|
||||
"then_val": {
|
||||
"start": 65,
|
||||
@ -110,18 +97,10 @@ expression: actual
|
||||
"start": 79,
|
||||
"end": 80,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
@ -141,32 +120,16 @@ expression: actual
|
||||
"start": 110,
|
||||
"end": 111,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "BinaryExpression",
|
||||
@ -35,8 +34,7 @@ expression: actual
|
||||
"start": 8,
|
||||
"end": 9,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -44,22 +42,12 @@ expression: actual
|
||||
"start": 13,
|
||||
"end": 14,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "BinaryExpression",
|
||||
@ -35,8 +34,7 @@ expression: actual
|
||||
"start": 8,
|
||||
"end": 9,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -44,22 +42,12 @@ expression: actual
|
||||
"start": 13,
|
||||
"end": 14,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 1,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "Literal",
|
||||
@ -29,20 +28,11 @@ expression: actual
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
---
|
||||
source: kcl/src/parser/parser_impl.rs
|
||||
assertion_line: 3718
|
||||
expression: actual
|
||||
---
|
||||
{
|
||||
@ -21,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 9,
|
||||
"name": "obj",
|
||||
"digest": null
|
||||
"name": "obj"
|
||||
},
|
||||
"init": {
|
||||
"type": "ObjectExpression",
|
||||
@ -38,8 +36,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 13,
|
||||
"end": 19,
|
||||
"name": "center",
|
||||
"digest": null
|
||||
"name": "center"
|
||||
},
|
||||
"value": {
|
||||
"type": "ArrayExpression",
|
||||
@ -53,8 +50,7 @@ expression: actual
|
||||
"start": 23,
|
||||
"end": 25,
|
||||
"value": 10,
|
||||
"raw": "10",
|
||||
"digest": null
|
||||
"raw": "10"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -62,13 +58,10 @@ expression: actual
|
||||
"start": 27,
|
||||
"end": 29,
|
||||
"value": 10,
|
||||
"raw": "10",
|
||||
"digest": null
|
||||
"raw": "10"
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ObjectProperty",
|
||||
@ -78,8 +71,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 32,
|
||||
"end": 38,
|
||||
"name": "radius",
|
||||
"digest": null
|
||||
"name": "radius"
|
||||
},
|
||||
"value": {
|
||||
"type": "Literal",
|
||||
@ -87,25 +79,14 @@ expression: actual
|
||||
"start": 40,
|
||||
"end": 41,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
}
|
||||
],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"digest": null
|
||||
"name": "myVar"
|
||||
},
|
||||
"init": {
|
||||
"type": "CallExpression",
|
||||
@ -32,8 +31,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 14,
|
||||
"end": 17,
|
||||
"name": "min",
|
||||
"digest": null
|
||||
"name": "min"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -51,8 +49,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 19,
|
||||
"end": 25,
|
||||
"name": "legLen",
|
||||
"digest": null
|
||||
"name": "legLen"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -61,8 +58,7 @@ expression: actual
|
||||
"start": 26,
|
||||
"end": 27,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -70,14 +66,11 @@ expression: actual
|
||||
"start": 29,
|
||||
"end": 30,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "Literal",
|
||||
@ -85,24 +78,14 @@ expression: actual
|
||||
"start": 33,
|
||||
"end": 34,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 11,
|
||||
"name": "myVar",
|
||||
"digest": null
|
||||
"name": "myVar"
|
||||
},
|
||||
"init": {
|
||||
"type": "PipeExpression",
|
||||
@ -41,8 +40,7 @@ expression: actual
|
||||
"start": 14,
|
||||
"end": 15,
|
||||
"value": 5,
|
||||
"raw": "5",
|
||||
"digest": null
|
||||
"raw": "5"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -50,10 +48,8 @@ expression: actual
|
||||
"start": 18,
|
||||
"end": 19,
|
||||
"value": 6,
|
||||
"raw": "6",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CallExpression",
|
||||
@ -64,8 +60,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 23,
|
||||
"end": 29,
|
||||
"name": "myFunc",
|
||||
"digest": null
|
||||
"name": "myFunc"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
@ -74,39 +69,22 @@ expression: actual
|
||||
"start": 30,
|
||||
"end": 32,
|
||||
"value": 45,
|
||||
"raw": "45",
|
||||
"digest": null
|
||||
"raw": "45"
|
||||
},
|
||||
{
|
||||
"type": "PipeSubstitution",
|
||||
"type": "PipeSubstitution",
|
||||
"start": 34,
|
||||
"end": 35,
|
||||
"digest": null
|
||||
"end": 35
|
||||
}
|
||||
],
|
||||
"optional": false,
|
||||
"digest": null
|
||||
"optional": false
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 6,
|
||||
"end": 7,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "BinaryExpression",
|
||||
@ -40,32 +39,20 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 11,
|
||||
"end": 15,
|
||||
"name": "leg2",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "leg2"
|
||||
}
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"type": "Identifier",
|
||||
"start": 18,
|
||||
"end": 27,
|
||||
"name": "thickness",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"name": "thickness"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ expression: actual
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 5,
|
||||
"name": "x",
|
||||
"digest": null
|
||||
"name": "x"
|
||||
},
|
||||
"init": {
|
||||
"type": "BinaryExpression",
|
||||
@ -35,8 +34,7 @@ expression: actual
|
||||
"start": 8,
|
||||
"end": 9,
|
||||
"value": 1,
|
||||
"raw": "1",
|
||||
"digest": null
|
||||
"raw": "1"
|
||||
},
|
||||
"right": {
|
||||
"type": "BinaryExpression",
|
||||
@ -50,8 +48,7 @@ expression: actual
|
||||
"start": 13,
|
||||
"end": 14,
|
||||
"value": 3,
|
||||
"raw": "3",
|
||||
"digest": null
|
||||
"raw": "3"
|
||||
},
|
||||
"right": {
|
||||
"type": "Literal",
|
||||
@ -59,24 +56,13 @@ expression: actual
|
||||
"start": 17,
|
||||
"end": 18,
|
||||
"value": 4,
|
||||
"raw": "4",
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
"raw": "4"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"kind": "const",
|
||||
"digest": null
|
||||
"kind": "const"
|
||||
}
|
||||
],
|
||||
"nonCodeMeta": {
|
||||
"nonCodeNodes": {},
|
||||
"start": [],
|
||||
"digest": null
|
||||
},
|
||||
"digest": null
|
||||
]
|
||||
}
|
||||
|