Compare commits
309 Commits
nested_dir
...
pierremtb/
Author | SHA1 | Date | |
---|---|---|---|
3ae4b045ad | |||
cd672d52f6 | |||
30c4f79285 | |||
c3c8b727bd | |||
65168eb139 | |||
6a9870b6f3 | |||
78f885c3d1 | |||
a40ba06641 | |||
597f4a1d54 | |||
c035398ad7 | |||
1387c2fbcb | |||
c814c90a9e | |||
a9f95f7574 | |||
64832f9046 | |||
b2b7ac5bf8 | |||
172e01529c | |||
5a4a32c044 | |||
b955184191 | |||
d7914219da | |||
ead4c1286b | |||
34494f3bba | |||
a0fe33260e | |||
8955b5fcd3 | |||
df6256266c | |||
5708b8c64b | |||
5b8284e737 | |||
dd9b0ec5f0 | |||
c467568ee4 | |||
e5d082f441 | |||
d4d3e179b1 | |||
cb976ec31b | |||
cc9eb65456 | |||
298583181b | |||
a589f56e73 | |||
4f4c44e7c7 | |||
1b75020686 | |||
e668cb55f9 | |||
9942a65612 | |||
fba62dab98 | |||
187925ff21 | |||
4c1564e2b0 | |||
50ac0244fd | |||
a85a534d6b | |||
6ddbb7a31d | |||
051bb0589e | |||
7f9851ae28 | |||
8d7858978f | |||
fbcbb341e2 | |||
4a080d1583 | |||
85c721fb49 | |||
27af2d08a3 | |||
fb8b975b5e | |||
62d8d45a58 | |||
ae3440df0a | |||
af658c909d | |||
7ec11d23c8 | |||
30000a1eac | |||
cb3b45747c | |||
74d73ece7b | |||
fe66310f2d | |||
fefb6cfe87 | |||
0f8375cbb4 | |||
107adc77b3 | |||
4356885aa2 | |||
6a2027cd51 | |||
f49cf8281c | |||
7de27c648f | |||
344fb6f84d | |||
df808b3e58 | |||
e1ab6bbc48 | |||
0a1f35b89a | |||
78278d6889 | |||
6f1a539e83 | |||
0ad619e1d2 | |||
8d876a806e | |||
c7f0a6c2a0 | |||
e4941cb524 | |||
1b687a82a6 | |||
1bb882acf8 | |||
478bf34f2b | |||
dbc87292e4 | |||
bb3a74076f | |||
0cd6031aae | |||
1e1bdbd6e7 | |||
631b63b1b6 | |||
eabcf86436 | |||
7ce0ef770a | |||
599ab33e40 | |||
c584d942d4 | |||
35b8872678 | |||
2f245fe445 | |||
4b95980e9e | |||
53d6613d0d | |||
416d0b37a2 | |||
5f2a10ec7e | |||
24edb66b3c | |||
903ba33c46 | |||
c5bf6ad42d | |||
eeaa71142a | |||
0d1fc1b513 | |||
d510e58ebc | |||
23a01e86e6 | |||
9dd6e3e852 | |||
9eaacc2a51 | |||
de6e0f6b18 | |||
d02a9f59ae | |||
92f930dfc0 | |||
e651e0c2cf | |||
6358eed7e4 | |||
fe581ff1d2 | |||
b301fbba22 | |||
0c702e4bab | |||
25b9a34640 | |||
b2152a5684 | |||
832bf77c92 | |||
acb43fc82c | |||
7486d25cf1 | |||
1a4a030671 | |||
3049d939e1 | |||
ad9822e8ac | |||
aae34cf1e5 | |||
d6278cf075 | |||
4159cc0047 | |||
3936017f10 | |||
2b0ced179a | |||
c2f6ce065d | |||
b3bdc35da2 | |||
8fe4f67a29 | |||
c6b1d11700 | |||
2ef84382a6 | |||
939c2c77b0 | |||
31ec0184a1 | |||
62c4546658 | |||
383b38c2d2 | |||
e0025f7fad | |||
2a13888c54 | |||
1443f3ab39 | |||
bf87c23ea8 | |||
5d23b0e487 | |||
df6c81b0b4 | |||
5f1f579d4b | |||
9a549ff379 | |||
851ea28bd3 | |||
ff15c7b9db | |||
f304577d5d | |||
b03b0d3b53 | |||
dd4d0f6d98 | |||
1cd742df5d | |||
6460ed8ea8 | |||
5c51b27f29 | |||
77690b4419 | |||
6996670020 | |||
1fd4e93091 | |||
a1ac029333 | |||
29cf16d744 | |||
9b3afccf53 | |||
231ca0fa35 | |||
4608c02442 | |||
de6184c622 | |||
0bce7d3c1c | |||
c43ec280f2 | |||
8e6483a47b | |||
e116bbaae8 | |||
18b458fbca | |||
4d1524f03b | |||
11d8179368 | |||
3c23cada8e | |||
81782b04ec | |||
9ade6676b7 | |||
86e5c37678 | |||
8c36d742e5 | |||
f6a3a3d0cd | |||
b5f81cb84a | |||
4bb17c192f | |||
51ce55e782 | |||
427d55d13e | |||
4575b32dbc | |||
9136fb0d1b | |||
33d5a9cdc1 | |||
c25dfabc94 | |||
4502ad62b2 | |||
5235a731ba | |||
5ceb92d117 | |||
ff92c73ac4 | |||
bbb6fffbcc | |||
37fca0d1df | |||
e3694e4781 | |||
f97bdaf8b7 | |||
3f3693e12d | |||
73660d1db8 | |||
c373f33507 | |||
2dc76a71cc | |||
ce42966f2b | |||
b47b9c9613 | |||
2af2144f89 | |||
bd37c488ee | |||
a3551e4b2f | |||
d3979edb41 | |||
095a7a575b | |||
b5c8ca05a5 | |||
33f7badf41 | |||
569935c21f | |||
7680605085 | |||
2bb6c74f42 | |||
faf4d42b6a | |||
8dd2a86191 | |||
13c4de77c3 | |||
e29ee9d1ca | |||
b7437e949a | |||
08781ff010 | |||
eb79b1f746 | |||
8df81b2753 | |||
e75a604c64 | |||
0624e42822 | |||
1c07e8af5b | |||
5fccaad0e7 | |||
a506f7f698 | |||
1bb96cd878 | |||
b63b0e538a | |||
5118198cec | |||
1611244b94 | |||
227ad31fc2 | |||
80e3dc9095 | |||
46b6707e3a | |||
0eebb76bfd | |||
464372e7ed | |||
75dff9f775 | |||
5f6d810fbb | |||
55e1ec7dad | |||
b123dacc41 | |||
87e3588ceb | |||
c4d2e33a99 | |||
2ac05508bc | |||
5c6d4fbf5a | |||
aaff027830 | |||
355a450c09 | |||
21f4fcb041 | |||
37aea72a88 | |||
783b6ed76c | |||
9dfb67cf61 | |||
889c72ec60 | |||
067e193780 | |||
77730196ae | |||
dba0173cc3 | |||
8f4327ab6b | |||
cc2769e907 | |||
91b6db0ba5 | |||
8bae76000c | |||
f502e445cc | |||
083bfe6ec2 | |||
2c1a5ff5c4 | |||
0c2785df67 | |||
fa9d5a0104 | |||
678433d2b3 | |||
30bd307931 | |||
08dfaba7f7 | |||
eb2327827b | |||
1f53dd1357 | |||
034366e65e | |||
cd537cd9c2 | |||
22f92942f6 | |||
4eee50d79e | |||
125b2c44d4 | |||
db9e35d686 | |||
d0958220fe | |||
fa4b3cfd1b | |||
8972f8f109 | |||
85ccc6900c | |||
4e2deca5d8 | |||
04a2c184d7 | |||
2c7701e2d4 | |||
ae569b61db | |||
0a0e6abd3f | |||
9c7aee32bd | |||
ed979d807b | |||
f5c244dbb1 | |||
0ea1e9a6da | |||
a36530d6df | |||
825d34718a | |||
d90d445d84 | |||
5976a0cba6 | |||
b50f2f5a2a | |||
f877b52898 | |||
4a585db637 | |||
4d404bf137 | |||
e644b7e1fc | |||
aff1684064 | |||
d9afc50f91 | |||
eb7b4ccda6 | |||
bbf4f1d251 | |||
3cc7859ca5 | |||
ab63345c57 | |||
3df02e02fa | |||
35f5c62633 | |||
0f0fc39d07 | |||
a13b6b2b70 | |||
4212b95232 | |||
38a73a603b | |||
c48d9fd4d7 | |||
0753987b5a | |||
815ff7dc2b | |||
46684d420d | |||
eca09984a3 | |||
ce63c6423e | |||
09699afe82 | |||
36c8ad439d | |||
5dc77ceed5 | |||
c7baa26b2d | |||
4d0454abcd |
@ -3,17 +3,17 @@
|
|||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
DEV=true
|
DEV=true
|
||||||
|
|
||||||
|
# App
|
||||||
VITE_KC_API_WS_MODELING_URL=wss://api.dev.zoo.dev/ws/modeling/commands
|
VITE_KC_API_WS_MODELING_URL=wss://api.dev.zoo.dev/ws/modeling/commands
|
||||||
VITE_KC_API_BASE_URL=https://api.dev.zoo.dev
|
VITE_KITTYCAD_API_BASE_URL=https://api.dev.zoo.dev
|
||||||
VITE_KC_SITE_BASE_URL=https://dev.zoo.dev
|
VITE_KC_SITE_BASE_URL=https://dev.zoo.dev
|
||||||
VITE_KC_SITE_APP_URL=https://app.dev.zoo.dev
|
VITE_KC_SITE_APP_URL=https://app.dev.zoo.dev
|
||||||
VITE_KC_SKIP_AUTH=false
|
|
||||||
VITE_KC_CONNECTION_TIMEOUT_MS=5000
|
VITE_KC_CONNECTION_TIMEOUT_MS=5000
|
||||||
#VITE_KC_DEV_TOKEN="optional token to skip auth in the app"
|
#VITE_WASM_URL="optional override of Wasm URL if not on default port 3000"
|
||||||
#token="required token for playwright. TODO: clean up env vars in #3973"
|
#VITE_KITTYCAD_API_TOKEN="required for testing, optional to skip auth in the app"
|
||||||
|
FAIL_ON_CONSOLE_ERRORS=true
|
||||||
|
|
||||||
|
# KCL
|
||||||
RUST_BACKTRACE=1
|
RUST_BACKTRACE=1
|
||||||
PYO3_PYTHON=/usr/local/bin/python3
|
PYO3_PYTHON=/usr/local/bin/python3
|
||||||
#KITTYCAD_API_TOKEN="required token for engine testing"
|
#KITTYCAD_API_TOKEN=$VITE_KITTYCAD_API_TOKEN
|
||||||
|
|
||||||
FAIL_ON_CONSOLE_ERRORS=true
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# App
|
||||||
VITE_KC_API_WS_MODELING_URL=wss://api.zoo.dev/ws/modeling/commands
|
VITE_KC_API_WS_MODELING_URL=wss://api.zoo.dev/ws/modeling/commands
|
||||||
VITE_KC_API_BASE_URL=https://api.zoo.dev
|
VITE_KITTYCAD_API_BASE_URL=https://api.zoo.dev
|
||||||
VITE_KC_SITE_BASE_URL=https://zoo.dev
|
VITE_KC_SITE_BASE_URL=https://zoo.dev
|
||||||
VITE_KC_SITE_APP_URL=https://app.zoo.dev
|
VITE_KC_SITE_APP_URL=https://app.zoo.dev
|
||||||
VITE_KC_SKIP_AUTH=false
|
|
||||||
VITE_KC_CONNECTION_TIMEOUT_MS=15000
|
VITE_KC_CONNECTION_TIMEOUT_MS=15000
|
||||||
|
3
.github/CODEOWNERS
vendored
Normal file
3
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
* @KittyCAD/frontend
|
||||||
|
/src/ @KittyCAD/frontend
|
||||||
|
/rust/ @KittyCAD/kcl
|
41
.github/ISSUE_TEMPLATE/release.md
vendored
Normal file
41
.github/ISSUE_TEMPLATE/release.md
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
name: Release
|
||||||
|
about: Create a new release for the Zoo Design Studio
|
||||||
|
title: "Cut release v1.?.?"
|
||||||
|
labels: [meta/release]
|
||||||
|
---
|
||||||
|
|
||||||
|
> Instructions: https://github.com/KittyCAD/modeling-app/blob/main/CONTRIBUTING.md#shipping-releases
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Manual Checklist
|
||||||
|
|
||||||
|
Release builds URL: ???
|
||||||
|
|
||||||
|
## Windows via ???
|
||||||
|
|
||||||
|
* [ ] Download the release build for this platform
|
||||||
|
* [ ] Confirm the application opens (dismiss the updater)
|
||||||
|
* [ ] Create a project with a basic Text-to-CAD prompt
|
||||||
|
* [ ] Confirm the result is viewable in an engine stream
|
||||||
|
* [ ] Use 'Check for updates' to bring back the updater toast
|
||||||
|
* [ ] Confirm the app can update to the previous release
|
||||||
|
|
||||||
|
## macOS via ???
|
||||||
|
|
||||||
|
* [ ] Download the release build for this platform
|
||||||
|
* [ ] Confirm the application opens (dismiss the updater)
|
||||||
|
* [ ] Create a project with a basic Text-to-CAD prompt
|
||||||
|
* [ ] Confirm the result is viewable in an engine stream
|
||||||
|
* [ ] Use 'Check for updates' to bring back the updater toast
|
||||||
|
* [ ] Confirm the app can update to the previous release
|
||||||
|
|
||||||
|
## Linux via ???
|
||||||
|
|
||||||
|
* [ ] Download the release build for this platform
|
||||||
|
* [ ] Confirm the application opens (dismiss the updater)
|
||||||
|
* [ ] Create a project with a basic Text-to-CAD prompt
|
||||||
|
* [ ] Confirm the result is viewable in an engine stream
|
||||||
|
* [ ] Use 'Check for updates' to bring back the updater toast
|
||||||
|
* [ ] Confirm the app can update to the previous release
|
12
.github/ci-cd-scripts/playwright-electron.sh
vendored
12
.github/ci-cd-scripts/playwright-electron.sh
vendored
@ -7,11 +7,11 @@ if [[ ! -f "test-results/.last-run.json" ]]; then
|
|||||||
# If no last run artifact, than run Playwright normally
|
# If no last run artifact, than run Playwright normally
|
||||||
echo "run playwright normally"
|
echo "run playwright normally"
|
||||||
if [[ "$3" == *ubuntu* ]]; then
|
if [[ "$3" == *ubuntu* ]]; then
|
||||||
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:playwright:electron -- --shard=$1/$2 || true
|
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e:desktop -- --shard=$1/$2 || true
|
||||||
elif [[ "$3" == *windows* ]]; then
|
elif [[ "$3" == *windows* ]]; then
|
||||||
npm run test:playwright:electron -- --grep=@windows --shard=$1/$2 || true
|
npm run test:e2e:desktop -- --grep=@windows --shard=$1/$2 || true
|
||||||
elif [[ "$3" == *macos* ]]; then
|
elif [[ "$3" == *macos* ]]; then
|
||||||
npm run test:playwright:electron -- --grep=@macos --shard=$1/$2 || true
|
npm run test:e2e:desktop -- --grep=@macos --shard=$1/$2 || true
|
||||||
else
|
else
|
||||||
echo "Do not run Playwright. Unable to detect os runtime."
|
echo "Do not run Playwright. Unable to detect os runtime."
|
||||||
exit 1
|
exit 1
|
||||||
@ -31,11 +31,11 @@ while [[ $retry -le $max_retries ]]; do
|
|||||||
echo "retried=true" >>$GITHUB_OUTPUT
|
echo "retried=true" >>$GITHUB_OUTPUT
|
||||||
echo "run playwright with last failed tests and retry $retry"
|
echo "run playwright with last failed tests and retry $retry"
|
||||||
if [[ "$3" == *ubuntu* ]]; then
|
if [[ "$3" == *ubuntu* ]]; then
|
||||||
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:playwright:electron -- --last-failed || true
|
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e:desktop -- --last-failed || true
|
||||||
elif [[ "$3" == *windows* ]]; then
|
elif [[ "$3" == *windows* ]]; then
|
||||||
npm run test:playwright:electron -- --grep=@windows --last-failed || true
|
npm run test:e2e:desktop -- --grep=@windows --last-failed || true
|
||||||
elif [[ "$3" == *macos* ]]; then
|
elif [[ "$3" == *macos* ]]; then
|
||||||
npm run test:playwright:electron -- --grep=@macos --last-failed || true
|
npm run test:e2e:desktop -- --grep=@macos --last-failed || true
|
||||||
else
|
else
|
||||||
echo "Do not run playwright. Unable to detect os runtime."
|
echo "Do not run playwright. Unable to detect os runtime."
|
||||||
exit 1
|
exit 1
|
||||||
|
853
.github/dependabot.yml
vendored
853
.github/dependabot.yml
vendored
File diff suppressed because it is too large
Load Diff
75
.github/workflows/build-apps.yml
vendored
75
.github/workflows/build-apps.yml
vendored
@ -10,7 +10,7 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
IS_RELEASE: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'v') }}
|
IS_RELEASE: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'v') }}
|
||||||
IS_NIGHTLY: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
IS_STAGING: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@ -43,7 +43,7 @@ jobs:
|
|||||||
- name: Download Wasm Cache
|
- name: Download Wasm Cache
|
||||||
id: download-wasm
|
id: download-wasm
|
||||||
if: ${{ github.event_name == 'pull_request' && steps.filter.outputs.rust == 'false' }}
|
if: ${{ github.event_name == 'pull_request' && steps.filter.outputs.rust == 'false' }}
|
||||||
uses: dawidd6/action-download-artifact@v7
|
uses: dawidd6/action-download-artifact@v11
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||||
@ -91,14 +91,14 @@ jobs:
|
|||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
run: "npm run build:wasm"
|
run: "npm run build:wasm"
|
||||||
|
|
||||||
- name: Set nightly version, product name, release notes, and icons
|
- name: Set staging version, product name, release notes, and icons
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_STAGING == 'true' }}
|
||||||
run: |
|
run: |
|
||||||
COMMIT=$(git rev-parse --short HEAD)
|
COMMIT=$(git rev-parse --short HEAD)
|
||||||
DATE=$(date +'%-y.%-m.%-d')
|
DATE=$(date +'%-y.%-m.%-d')
|
||||||
export VERSION=$DATE-main.$COMMIT
|
export VERSION=$DATE-main.$COMMIT
|
||||||
npm run files:set-version
|
npm run files:set-version
|
||||||
npm run files:flip-to-nightly
|
npm run files:flip-to-staging
|
||||||
|
|
||||||
- name: Set release version
|
- name: Set release version
|
||||||
if: ${{ env.IS_RELEASE == 'true' }}
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
@ -130,13 +130,14 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: macos-14
|
- os: namespace-profile-macos-6-cores
|
||||||
platform: mac
|
platform: macos
|
||||||
- os: windows-2022
|
- os: namespace-profile-windows-4-cores
|
||||||
platform: win
|
platform: windows
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
platform: linux
|
platform: linux
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
name: build-apps (${{ matrix.platform }})
|
||||||
env:
|
env:
|
||||||
VERSION_NO_V: ${{ needs.prepare-files.outputs.version }}
|
VERSION_NO_V: ${{ needs.prepare-files.outputs.version }}
|
||||||
steps:
|
steps:
|
||||||
@ -166,14 +167,14 @@ jobs:
|
|||||||
- run: npm install
|
- run: npm install
|
||||||
|
|
||||||
- name: Prepare certificate and variables (Windows only)
|
- name: Prepare certificate and variables (Windows only)
|
||||||
if: ${{ (env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true') && matrix.os == 'windows-2022' }}
|
if: ${{ (env.IS_RELEASE == 'true' || env.IS_STAGING == 'true') && matrix.platform == 'windows' }}
|
||||||
run: |
|
run: |
|
||||||
echo "${{secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12
|
echo "${{secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /c/Certificate_pkcs12.p12
|
||||||
cat /d/Certificate_pkcs12.p12
|
cat /c/Certificate_pkcs12.p12
|
||||||
echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"
|
echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"
|
||||||
echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV"
|
echo "SM_HOST=${{ secrets.SM_HOST }}" >> "$GITHUB_ENV"
|
||||||
echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV"
|
echo "SM_API_KEY=${{ secrets.SM_API_KEY }}" >> "$GITHUB_ENV"
|
||||||
echo "SM_CLIENT_CERT_FILE=D:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV"
|
echo "SM_CLIENT_CERT_FILE=C:\\Certificate_pkcs12.p12" >> "$GITHUB_ENV"
|
||||||
echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV"
|
echo "SM_CLIENT_CERT_PASSWORD=${{ secrets.SM_CLIENT_CERT_PASSWORD }}" >> "$GITHUB_ENV"
|
||||||
echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH
|
echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH
|
||||||
echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH
|
echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH
|
||||||
@ -181,7 +182,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Setup certicate with SSM KSP (Windows only)
|
- name: Setup certicate with SSM KSP (Windows only)
|
||||||
if: ${{ (env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true') && matrix.os == 'windows-2022' }}
|
if: ${{ (env.IS_RELEASE == 'true' || env.IS_STAGING == 'true') && matrix.platform == 'windows' }}
|
||||||
run: |
|
run: |
|
||||||
curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o smtools-windows-x64.msi
|
curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/smtools-windows-x64.msi/download -H "x-api-key:%SM_API_KEY%" -o smtools-windows-x64.msi
|
||||||
msiexec /i smtools-windows-x64.msi /quiet /qn
|
msiexec /i smtools-windows-x64.msi /quiet /qn
|
||||||
@ -191,7 +192,7 @@ jobs:
|
|||||||
smksp_cert_sync.exe
|
smksp_cert_sync.exe
|
||||||
smctl windows certsync
|
smctl windows certsync
|
||||||
# This last line `smctl windows certsync` was added after windows codesign failures started happening
|
# This last line `smctl windows certsync` was added after windows codesign failures started happening
|
||||||
# with nightly-v25.4.10. It looks like `smksp_cert_sync.exe` used to do the sync to the local cert store,
|
# with staging-v25.4.10. It looks like `smksp_cert_sync.exe` used to do the sync to the local cert store,
|
||||||
# but stopped doing it overnight. This extra call that I randomly got from this azure-related doc page
|
# but stopped doing it overnight. This extra call that I randomly got from this azure-related doc page
|
||||||
# https://docs.digicert.com/en/digicert-keylocker/code-signing/sign-with-third-party-signing-tools/windows-applications/sign-azure-apps-with-signtool-using-ksp-library.html#sync-certificates--windows-only--618365
|
# https://docs.digicert.com/en/digicert-keylocker/code-signing/sign-with-third-party-signing-tools/windows-applications/sign-azure-apps-with-signtool-using-ksp-library.html#sync-certificates--windows-only--618365
|
||||||
# seems to be doing that extra sync that we need for scripts/sign-win.js to work.
|
# seems to be doing that extra sync that we need for scripts/sign-win.js to work.
|
||||||
@ -199,13 +200,13 @@ jobs:
|
|||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Build the app (debug)
|
- name: Build the app (debug)
|
||||||
if: ${{ env.IS_RELEASE == 'false' && env.IS_NIGHTLY == 'false' }}
|
if: ${{ env.IS_RELEASE == 'false' && env.IS_STAGING == 'false' }}
|
||||||
# electron-builder doesn't have a concept of release vs debug,
|
# electron-builder doesn't have a concept of release vs debug,
|
||||||
# this is just not doing any codesign or release yml generation, and points to dev infra
|
# this is just not doing any codesign or release yml generation, and points to dev infra
|
||||||
run: npm run tronb:package:dev
|
run: npm run tronb:package:dev
|
||||||
|
|
||||||
- name: Build the app (release)
|
- name: Build the app (release)
|
||||||
if: ${{ env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_RELEASE == 'true' || env.IS_STAGING == 'true' }}
|
||||||
env:
|
env:
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
@ -215,7 +216,7 @@ jobs:
|
|||||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||||
CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
||||||
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
|
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
|
||||||
run: npm run tronb:package:prod
|
run: npm run tronb:package:${{ env.IS_STAGING == 'true' && 'dev' || 'prod' }}
|
||||||
|
|
||||||
- name: List artifacts in out/
|
- name: List artifacts in out/
|
||||||
run: ls -R out
|
run: ls -R out
|
||||||
@ -239,20 +240,20 @@ jobs:
|
|||||||
out/*-x86_64-linux.*
|
out/*-x86_64-linux.*
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: ${{ env.IS_RELEASE == 'true' || env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_RELEASE == 'true' || env.IS_STAGING == 'true' }}
|
||||||
with:
|
with:
|
||||||
name: out-yml-${{ matrix.platform }}
|
name: out-yml-${{ matrix.platform }}
|
||||||
path: |
|
path: |
|
||||||
out/latest*.yml
|
out/latest*.yml
|
||||||
|
|
||||||
# TODO: add the 'Build for Mac TestFlight (nightly)' stage back
|
# TODO: add the 'Build for Mac TestFlight' stage back
|
||||||
|
|
||||||
|
|
||||||
upload-apps-release:
|
upload-apps-release:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
# Equivalent to IS_RELEASE || IS_NIGHTLY (but we can't access those env vars here)
|
# Equivalent to IS_RELEASE || IS_STAGING (but we can't access those env vars here)
|
||||||
if: ${{ (github.ref_type == 'tag' && startsWith(github.ref_name, 'v')) || (github.event_name == 'push' && github.ref == 'refs/heads/main') }}
|
if: ${{ (github.ref_type == 'tag' && startsWith(github.ref_name, 'v')) || (github.event_name == 'push' && github.ref == 'refs/heads/main') }}
|
||||||
env:
|
env:
|
||||||
VERSION_NO_V: ${{ needs.prepare-files.outputs.version }}
|
VERSION_NO_V: ${{ needs.prepare-files.outputs.version }}
|
||||||
@ -263,32 +264,32 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-arm64-win
|
name: out-arm64-windows
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-x64-win
|
name: out-x64-windows
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-yml-win
|
name: out-yml-windows
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-arm64-mac
|
name: out-arm64-macos
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-x64-mac
|
name: out-x64-macos
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-yml-mac
|
name: out-yml-macos
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
@ -310,8 +311,8 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
NOTES: ${{ needs.prepare-files.outputs.notes }}
|
NOTES: ${{ needs.prepare-files.outputs.notes }}
|
||||||
PUB_DATE: ${{ github.event.repository.updated_at }}
|
PUB_DATE: ${{ github.event.repository.updated_at }}
|
||||||
WEBSITE_DIR: ${{ env.IS_NIGHTLY == 'true' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }}
|
WEBSITE_DIR: ${{ env.IS_STAGING == 'true' && 'dl.zoo.dev/releases/modeling-app/staging' || 'dl.zoo.dev/releases/modeling-app' }}
|
||||||
URL_CODED_NAME: ${{ env.IS_NIGHTLY == 'true' && 'Zoo%20Design%20Studio%20%28Nightly%29' || 'Zoo%20Design%20Studio' }}
|
URL_CODED_NAME: ${{ env.IS_STAGING == 'true' && 'Zoo%20Design%20Studio%20%28Staging%29' || 'Zoo%20Design%20Studio' }}
|
||||||
run: |
|
run: |
|
||||||
RELEASE_DIR=https://${WEBSITE_DIR}
|
RELEASE_DIR=https://${WEBSITE_DIR}
|
||||||
jq --null-input \
|
jq --null-input \
|
||||||
@ -360,26 +361,26 @@ jobs:
|
|||||||
run: "ls -R out"
|
run: "ls -R out"
|
||||||
|
|
||||||
- name: Authenticate to Google Cloud
|
- name: Authenticate to Google Cloud
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_STAGING == 'true' }}
|
||||||
uses: 'google-github-actions/auth@v2.1.8'
|
uses: 'google-github-actions/auth@v2.1.10'
|
||||||
with:
|
with:
|
||||||
credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}'
|
credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}'
|
||||||
|
|
||||||
- name: Set up Google Cloud SDK
|
- name: Set up Google Cloud SDK
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_STAGING == 'true' }}
|
||||||
uses: google-github-actions/setup-gcloud@v2.1.4
|
uses: google-github-actions/setup-gcloud@v2.1.4
|
||||||
with:
|
with:
|
||||||
project_id: ${{ env.GOOGLE_CLOUD_PROJECT_ID }}
|
project_id: ${{ env.GOOGLE_CLOUD_PROJECT_ID }}
|
||||||
|
|
||||||
- name: Upload nightly files to public bucket
|
- name: Upload staging files to public bucket
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_STAGING == 'true' }}
|
||||||
uses: google-github-actions/upload-cloud-storage@v2.2.2
|
uses: google-github-actions/upload-cloud-storage@v2.2.2
|
||||||
with:
|
with:
|
||||||
path: out
|
path: out
|
||||||
glob: '*'
|
glob: '*'
|
||||||
parent: false
|
parent: false
|
||||||
destination: 'dl.kittycad.io/releases/modeling-app/nightly'
|
destination: 'dl.kittycad.io/releases/modeling-app/staging'
|
||||||
|
|
||||||
- name: Invalidate bucket cache on latest*.yml and last_download.json files
|
- name: Invalidate bucket cache on latest*.yml and last_download.json files
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_STAGING == 'true' }}
|
||||||
run: npm run files:invalidate-bucket:nightly
|
run: npm run files:invalidate-bucket:staging
|
||||||
|
6
.github/workflows/cargo-fmt.yml
vendored
6
.github/workflows/cargo-fmt.yml
vendored
@ -31,15 +31,15 @@ jobs:
|
|||||||
- name: Use correct Rust toolchain
|
- name: Use correct Rust toolchain
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
cp .github/workflows/nightly-rust-toolchain.toml rust-toolchain.toml
|
||||||
- name: Install rust
|
- name: Install rust
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
with:
|
with:
|
||||||
cache-workspaces: rust
|
cache-workspaces: rust
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
|
|
||||||
- name: Run cargo fmt
|
- name: Run nightly cargo fmt
|
||||||
run: |
|
run: |
|
||||||
cd rust
|
cd rust
|
||||||
cargo fmt -- --check
|
cargo +nightly fmt -- --check
|
||||||
shell: bash
|
shell: bash
|
||||||
|
22
.github/workflows/cargo-test.yml
vendored
22
.github/workflows/cargo-test.yml
vendored
@ -1,16 +1,22 @@
|
|||||||
|
name: cargo test
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 * * * * # hourly
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
name: cargo test
|
|
||||||
jobs:
|
jobs:
|
||||||
build-test-artifacts:
|
build-test-artifacts:
|
||||||
name: Build test artifacts
|
name: Build test artifacts
|
||||||
@ -19,8 +25,8 @@ jobs:
|
|||||||
- runner=8cpu-linux-x64
|
- runner=8cpu-linux-x64
|
||||||
- extras=s3-cache
|
- extras=s3-cache
|
||||||
steps:
|
steps:
|
||||||
- uses: runs-on/action@v1
|
- uses: runs-on/action@v2
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v2
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
@ -143,8 +149,8 @@ jobs:
|
|||||||
partitionIndex: [1, 2, 3, 4, 5, 6]
|
partitionIndex: [1, 2, 3, 4, 5, 6]
|
||||||
partitionTotal: [6]
|
partitionTotal: [6]
|
||||||
steps:
|
steps:
|
||||||
- uses: runs-on/action@v1
|
- uses: runs-on/action@v2
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v2
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
@ -193,7 +199,7 @@ jobs:
|
|||||||
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
||||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
CI_SUITE: unit:kcl
|
CI_SUITE: e2e:kcl
|
||||||
run-internal-kcl-samples:
|
run-internal-kcl-samples:
|
||||||
name: cargo test (internal-kcl-samples)
|
name: cargo test (internal-kcl-samples)
|
||||||
runs-on:
|
runs-on:
|
||||||
@ -201,8 +207,8 @@ jobs:
|
|||||||
- runner=32cpu-linux-x64
|
- runner=32cpu-linux-x64
|
||||||
- extras=s3-cache
|
- extras=s3-cache
|
||||||
steps:
|
steps:
|
||||||
- uses: runs-on/action@v1
|
- uses: runs-on/action@v2
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v2
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
|
173
.github/workflows/e2e-tests.yml
vendored
173
.github/workflows/e2e-tests.yml
vendored
@ -1,4 +1,5 @@
|
|||||||
name: E2E Tests
|
name: E2E Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@ -19,9 +20,11 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
prepare-wasm:
|
prepare-wasm:
|
||||||
|
|
||||||
# separate job on Ubuntu to build or fetch the wasm blob once on the fastest runner
|
# separate job on Ubuntu to build or fetch the wasm blob once on the fastest runner
|
||||||
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- id: filter
|
- id: filter
|
||||||
@ -43,7 +46,7 @@ jobs:
|
|||||||
- name: Download Wasm cache
|
- name: Download Wasm cache
|
||||||
id: download-wasm
|
id: download-wasm
|
||||||
if: ${{ github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' }}
|
if: ${{ github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' }}
|
||||||
uses: dawidd6/action-download-artifact@v7
|
uses: dawidd6/action-download-artifact@v11
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||||
@ -92,18 +95,22 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: npm run build:wasm
|
run: npm run build:wasm
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- name: Upload compiled wasm artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: prepared-wasm
|
name: prepared-wasm
|
||||||
path: |
|
path: |
|
||||||
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
|
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
|
||||||
|
|
||||||
snapshots:
|
snapshots:
|
||||||
name: playwright:snapshots:ubuntu
|
|
||||||
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
|
||||||
needs: [prepare-wasm]
|
needs: [prepare-wasm]
|
||||||
|
|
||||||
|
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
||||||
|
name: e2e:snapshots
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
|
||||||
|
- uses: actions/create-github-app-token@v2
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
@ -130,10 +137,9 @@ jobs:
|
|||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
id: deps-install
|
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Cache browsers
|
- name: Download browser cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
@ -143,7 +149,7 @@ jobs:
|
|||||||
- name: Install browsers
|
- name: Install browsers
|
||||||
run: npm run playwright install --with-deps
|
run: npm run playwright install --with-deps
|
||||||
|
|
||||||
- name: Test snapshots
|
- name: npm run test:snapshots
|
||||||
uses: nick-fields/retry@v3.0.2
|
uses: nick-fields/retry@v3.0.2
|
||||||
with:
|
with:
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -151,37 +157,38 @@ jobs:
|
|||||||
timeout_minutes: 5
|
timeout_minutes: 5
|
||||||
max_attempts: 5
|
max_attempts: 5
|
||||||
env:
|
env:
|
||||||
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
||||||
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
||||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
CI_SUITE: snapshots
|
CI_SUITE: e2e:snapshots
|
||||||
TARGET: web
|
TARGET: web
|
||||||
|
|
||||||
- name: Update snapshots
|
- name: Update snapshots
|
||||||
if: always()
|
if: always()
|
||||||
run: npm run test:snapshots -- --last-failed --update-snapshots
|
run: npm run test:snapshots -- --last-failed --update-snapshots
|
||||||
env:
|
env:
|
||||||
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
||||||
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
||||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
CI_SUITE: snapshots
|
CI_SUITE: e2e:snapshots
|
||||||
TARGET: web
|
TARGET: web
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- name: Upload playwright report
|
||||||
if: ${{ !cancelled() && (success() || failure()) }}
|
uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ !cancelled() }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report-ubuntu-snapshot-${{ github.sha }}
|
name: playwright-report-snapshot-${{ github.sha }}
|
||||||
path: playwright-report/
|
path: playwright-report/
|
||||||
include-hidden-files: true
|
include-hidden-files: true
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|
||||||
- name: Check diff
|
- name: Check diff
|
||||||
if: ${{ github.ref != 'refs/heads/main' }}
|
if: ${{ always() && github.ref != 'refs/heads/main' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
id: git-check
|
id: git-check
|
||||||
run: |
|
run: |
|
||||||
@ -192,7 +199,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Commit changes
|
- name: Commit changes
|
||||||
if: ${{ steps.git-check.outputs.modified == 'true' }}
|
if: ${{ always() && steps.git-check.outputs.modified == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
|
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
|
||||||
@ -206,16 +213,101 @@ jobs:
|
|||||||
git push
|
git push
|
||||||
git push origin ${{ github.head_ref }}
|
git push origin ${{ github.head_ref }}
|
||||||
|
|
||||||
electron:
|
web:
|
||||||
needs: [prepare-wasm]
|
needs: [prepare-wasm]
|
||||||
timeout-minutes: 60
|
|
||||||
env:
|
strategy:
|
||||||
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}
|
fail-fast: false
|
||||||
name: playwright:electron:${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} (shard ${{ matrix.shardIndex }})
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
||||||
|
- os: namespace-profile-macos-8-cores
|
||||||
|
- os: namespace-profile-windows-8-cores
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
name: e2e:web (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }})
|
||||||
|
env:
|
||||||
|
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- uses: actions/create-github-app-token@v2
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
|
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }}
|
||||||
|
owner: ${{ github.repository_owner }}
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
name: prepared-wasm
|
||||||
|
|
||||||
|
- name: Copy prepared Wasm
|
||||||
|
run: |
|
||||||
|
ls -R prepared-wasm
|
||||||
|
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
|
||||||
|
mkdir rust/kcl-wasm-lib/pkg
|
||||||
|
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Download browser cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cache/ms-playwright/
|
||||||
|
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
||||||
|
|
||||||
|
- name: Install browsers
|
||||||
|
run: npm run playwright install --with-deps
|
||||||
|
|
||||||
|
- name: Start Vector
|
||||||
|
if: ${{ !contains(matrix.os, 'windows') }}
|
||||||
|
run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh
|
||||||
|
env:
|
||||||
|
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }}
|
||||||
|
OS_NAME: ${{ env.OS_NAME }}
|
||||||
|
|
||||||
|
- name: npm run test:e2e:web
|
||||||
|
uses: nick-fields/retry@v3.0.2
|
||||||
|
with:
|
||||||
|
shell: bash
|
||||||
|
command: npm run test:e2e:web
|
||||||
|
timeout_minutes: 5
|
||||||
|
max_attempts: 5
|
||||||
|
env:
|
||||||
|
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
|
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
||||||
|
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
||||||
|
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
|
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
|
CI_SUITE: e2e:web
|
||||||
|
TARGET: web
|
||||||
|
|
||||||
|
- name: Upload playwright report
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ !cancelled() && (success() || failure()) }}
|
||||||
|
with:
|
||||||
|
name: playwright-report-web-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
|
path: playwright-report/
|
||||||
|
include-hidden-files: true
|
||||||
|
retention-days: 30
|
||||||
|
overwrite: true
|
||||||
|
|
||||||
|
desktop:
|
||||||
|
needs: [prepare-wasm]
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# TODO: enable namespace-profile-windows-latest once available
|
|
||||||
include:
|
include:
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
||||||
shardIndex: 1
|
shardIndex: 1
|
||||||
@ -247,20 +339,24 @@ jobs:
|
|||||||
- os: namespace-profile-macos-8-cores
|
- os: namespace-profile-macos-8-cores
|
||||||
shardIndex: 2
|
shardIndex: 2
|
||||||
shardTotal: 2
|
shardTotal: 2
|
||||||
- os: windows-latest-8-cores
|
- os: namespace-profile-windows-8-cores
|
||||||
shardIndex: 1
|
shardIndex: 1
|
||||||
shardTotal: 2
|
shardTotal: 2
|
||||||
- os: windows-latest-8-cores
|
- os: namespace-profile-windows-8-cores
|
||||||
shardIndex: 2
|
shardIndex: 2
|
||||||
shardTotal: 2
|
shardTotal: 2
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
name: e2e:desktop (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}, shard ${{ matrix.shardIndex }})
|
||||||
|
env:
|
||||||
|
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
name: prepared-wasm
|
name: prepared-wasm
|
||||||
|
|
||||||
- name: Copy prepared wasm
|
- name: Copy prepared Wasm
|
||||||
run: |
|
run: |
|
||||||
ls -R prepared-wasm
|
ls -R prepared-wasm
|
||||||
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
|
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
|
||||||
@ -276,19 +372,16 @@ jobs:
|
|||||||
id: deps-install
|
id: deps-install
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Cache Playwright Browsers
|
- name: Download browser cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/ms-playwright/
|
~/.cache/ms-playwright/
|
||||||
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install browsers
|
||||||
run: npm run playwright install --with-deps
|
run: npm run playwright install --with-deps
|
||||||
|
|
||||||
- name: Build web
|
|
||||||
run: npm run tronb:vite:dev
|
|
||||||
|
|
||||||
- name: Start Vector
|
- name: Start Vector
|
||||||
if: ${{ !contains(matrix.os, 'windows') }}
|
if: ${{ !contains(matrix.os, 'windows') }}
|
||||||
run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh
|
run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh
|
||||||
@ -296,6 +389,9 @@ jobs:
|
|||||||
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }}
|
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }}
|
||||||
OS_NAME: ${{ env.OS_NAME }}
|
OS_NAME: ${{ env.OS_NAME }}
|
||||||
|
|
||||||
|
- name: Build app
|
||||||
|
run: npm run tronb:vite:dev
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
if: ${{ !cancelled() && (success() || failure()) }}
|
if: ${{ !cancelled() && (success() || failure()) }}
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@ -303,7 +399,7 @@ jobs:
|
|||||||
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
path: test-results/
|
path: test-results/
|
||||||
|
|
||||||
- name: Run playwright/electron flow (with retries)
|
- name: npm run test:e2e:desktop
|
||||||
id: retry
|
id: retry
|
||||||
if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }}
|
if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }}
|
||||||
uses: nick-fields/retry@v3.0.2
|
uses: nick-fields/retry@v3.0.2
|
||||||
@ -314,26 +410,29 @@ jobs:
|
|||||||
max_attempts: 9
|
max_attempts: 9
|
||||||
env:
|
env:
|
||||||
FAIL_ON_CONSOLE_ERRORS: true
|
FAIL_ON_CONSOLE_ERRORS: true
|
||||||
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
TAB_API_URL: ${{ secrets.TAB_API_URL }}
|
||||||
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
TAB_API_KEY: ${{ secrets.TAB_API_KEY }}
|
||||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
CI_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
|
CI_SUITE: e2e:desktop
|
||||||
TARGET: desktop
|
TARGET: desktop
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- name: Upload test report
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
name: test-results-desktop-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
path: test-results/
|
path: test-results/
|
||||||
include-hidden-files: true
|
include-hidden-files: true
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- name: Upload playwright report
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: playwright-report-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
name: playwright-report-desktop-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
path: playwright-report/
|
path: playwright-report/
|
||||||
include-hidden-files: true
|
include-hidden-files: true
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
2
.github/workflows/generate-website-docs.yml
vendored
2
.github/workflows/generate-website-docs.yml
vendored
@ -20,7 +20,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v2
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
# required
|
# required
|
||||||
|
2
.github/workflows/kcl-language-server.yml
vendored
2
.github/workflows/kcl-language-server.yml
vendored
@ -328,7 +328,7 @@ jobs:
|
|||||||
mkdir -p releases/language-server/${{ env.TAG }}
|
mkdir -p releases/language-server/${{ env.TAG }}
|
||||||
cp -r build/* releases/language-server/${{ env.TAG }}
|
cp -r build/* releases/language-server/${{ env.TAG }}
|
||||||
- name: "Authenticate to Google Cloud"
|
- name: "Authenticate to Google Cloud"
|
||||||
uses: "google-github-actions/auth@v2.1.8"
|
uses: "google-github-actions/auth@v2.1.10"
|
||||||
with:
|
with:
|
||||||
credentials_json: "${{ secrets.GOOGLE_CLOUD_DL_SA }}"
|
credentials_json: "${{ secrets.GOOGLE_CLOUD_DL_SA }}"
|
||||||
- name: Set up Cloud SDK
|
- name: Set up Cloud SDK
|
||||||
|
6
.github/workflows/kcl-python-bindings.yml
vendored
6
.github/workflows/kcl-python-bindings.yml
vendored
@ -113,7 +113,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install uv
|
- name: Install uv
|
||||||
uses: astral-sh/setup-uv@v5
|
uses: astral-sh/setup-uv@v6
|
||||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
- uses: taiki-e/install-action@just
|
- uses: taiki-e/install-action@just
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
@ -130,7 +130,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install the latest version of uv
|
- name: Install the latest version of uv
|
||||||
uses: astral-sh/setup-uv@v5
|
uses: astral-sh/setup-uv@v6
|
||||||
- name: Install codespell
|
- name: Install codespell
|
||||||
run: |
|
run: |
|
||||||
uv venv .venv
|
uv venv .venv
|
||||||
@ -161,7 +161,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: rust/kcl-python-bindings
|
path: rust/kcl-python-bindings
|
||||||
- name: Install the latest version of uv
|
- name: Install the latest version of uv
|
||||||
uses: astral-sh/setup-uv@v5
|
uses: astral-sh/setup-uv@v6
|
||||||
- name: do uv things
|
- name: do uv things
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-python-bindings
|
cd rust/kcl-python-bindings
|
||||||
|
3
.github/workflows/nightly-rust-toolchain.toml
vendored
Normal file
3
.github/workflows/nightly-rust-toolchain.toml
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[toolchain]
|
||||||
|
channel = "nightly"
|
||||||
|
components = ["rustfmt"]
|
14
.github/workflows/publish-apps-release.yml
vendored
14
.github/workflows/publish-apps-release.yml
vendored
@ -31,42 +31,42 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-arm64-win
|
name: out-arm64-windows
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-x64-win
|
name: out-x64-windows
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-yml-win
|
name: out-yml-windows
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-arm64-mac
|
name: out-arm64-macos
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-x64-mac
|
name: out-x64-macos
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: out-yml-mac
|
name: out-yml-macos
|
||||||
path: out
|
path: out
|
||||||
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
run-id: ${{ steps.tag_workflow_id.outputs.id }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@ -108,7 +108,7 @@ jobs:
|
|||||||
run: npm run files:set-notes
|
run: npm run files:set-notes
|
||||||
|
|
||||||
- name: Authenticate to Google Cloud
|
- name: Authenticate to Google Cloud
|
||||||
uses: 'google-github-actions/auth@v2.1.8'
|
uses: 'google-github-actions/auth@v2.1.10'
|
||||||
with:
|
with:
|
||||||
credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}'
|
credentials_json: '${{ secrets.GOOGLE_CLOUD_DL_SA }}'
|
||||||
|
|
||||||
|
30
.github/workflows/static-analysis.yml
vendored
30
.github/workflows/static-analysis.yml
vendored
@ -120,6 +120,36 @@ jobs:
|
|||||||
|
|
||||||
- run: npm run circular-deps:diff
|
- run: npm run circular-deps:diff
|
||||||
|
|
||||||
|
npm-url-checker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: npm-build-wasm
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: 'npm'
|
||||||
|
- run: npm install
|
||||||
|
|
||||||
|
- name: Download all artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
|
||||||
|
- name: Copy prepared wasm
|
||||||
|
run: |
|
||||||
|
ls -R prepared-wasm
|
||||||
|
cp prepared-wasm/kcl_wasm_lib_bg.wasm public
|
||||||
|
mkdir rust/kcl-wasm-lib/pkg
|
||||||
|
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
||||||
|
|
||||||
|
- name: Copy prepared ts-rs bindings
|
||||||
|
run: |
|
||||||
|
ls -R prepared-ts-rs-bindings
|
||||||
|
mkdir rust/kcl-lib/bindings
|
||||||
|
cp -r prepared-ts-rs-bindings/* rust/kcl-lib/bindings/
|
||||||
|
|
||||||
|
- run: npm run url-checker:diff
|
||||||
|
|
||||||
python-codespell:
|
python-codespell:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
|
2
.github/workflows/unit-tests.yml
vendored
2
.github/workflows/unit-tests.yml
vendored
@ -62,7 +62,7 @@ jobs:
|
|||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
run: xvfb-run -a npm run test:unit
|
run: xvfb-run -a npm run test:unit
|
||||||
env:
|
env:
|
||||||
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
VITE_KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
|
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -87,4 +87,4 @@ venv
|
|||||||
|
|
||||||
.vscode-test
|
.vscode-test
|
||||||
.biome/
|
.biome/
|
||||||
.million
|
.million
|
252
CONTRIBUTING.md
252
CONTRIBUTING.md
@ -1,6 +1,6 @@
|
|||||||
# Contributor Guide
|
# Contributor Guide
|
||||||
|
|
||||||
## Running a development build
|
## Installing dependencies
|
||||||
|
|
||||||
Install a node version manager such as [fnm](https://github.com/Schniz/fnm?tab=readme-ov-#installation).
|
Install a node version manager such as [fnm](https://github.com/Schniz/fnm?tab=readme-ov-#installation).
|
||||||
|
|
||||||
@ -31,7 +31,9 @@ npm run install:rust:windows
|
|||||||
npm run install:wasm-pack:cargo
|
npm run install:wasm-pack:cargo
|
||||||
```
|
```
|
||||||
|
|
||||||
Then to build the WASM layer, run:
|
## Building the app
|
||||||
|
|
||||||
|
To build the WASM layer, run:
|
||||||
|
|
||||||
```
|
```
|
||||||
# macOS/Linux
|
# macOS/Linux
|
||||||
@ -63,7 +65,7 @@ If you're not a Zoo employee you won't be able to access the dev environment, yo
|
|||||||
|
|
||||||
### Development environment variables
|
### Development environment variables
|
||||||
|
|
||||||
The Copilot LSP plugin in the editor requires a Zoo API token to run. In production, we authenticate this with a token via cookie in the browser and device auth token in the desktop environment, but this token is inaccessible in the dev browser version because the cookie is considered "cross-site" (from `localhost` to `zoo.dev`). There is an optional environment variable called `VITE_KC_DEV_TOKEN` that you can populate with a dev token in a `.env.development.local` file to not check it into Git, which will use that token instead of other methods for the LSP service.
|
The Copilot LSP plugin in the editor requires a Zoo API token to run. In production, we authenticate this with a token via cookie in the browser and device auth token in the desktop environment, but this token is inaccessible in the dev browser version because the cookie is considered "cross-site" (from `localhost` to `zoo.dev`). There is an optional environment variable called `VITE_KITTYCAD_API_TOKEN` that you can populate with a dev token in a `.env.development.local` file to not check it into Git, which will use that token instead of other methods for the LSP service.
|
||||||
|
|
||||||
### Developing in Chrome
|
### Developing in Chrome
|
||||||
|
|
||||||
@ -74,7 +76,7 @@ enable third-party cookies. You can enable third-party cookies by clicking on
|
|||||||
the eye with a slash through it in the URL bar, and clicking on "Enable
|
the eye with a slash through it in the URL bar, and clicking on "Enable
|
||||||
Third-Party Cookies".
|
Third-Party Cookies".
|
||||||
|
|
||||||
## Desktop
|
### Developing with Electron
|
||||||
|
|
||||||
To spin up the desktop app, `npm install` and `npm run build:wasm` need to have been done before hand then:
|
To spin up the desktop app, `npm install` and `npm run build:wasm` need to have been done before hand then:
|
||||||
|
|
||||||
@ -88,120 +90,17 @@ Devtools can be opened with the usual Command-Option-I (macOS) or Ctrl-Shift-I (
|
|||||||
|
|
||||||
To package the app for your platform with electron-builder, run `npm run tronb:package:dev` (or `npm run tronb:package:prod` to point to the .env.production variables).
|
To package the app for your platform with electron-builder, run `npm run tronb:package:dev` (or `npm run tronb:package:prod` to point to the .env.production variables).
|
||||||
|
|
||||||
## Checking out commits / Bisecting
|
## Running tests
|
||||||
|
|
||||||
Which commands from setup are one off vs. need to be run every time?
|
|
||||||
|
|
||||||
The following will need to be run when checking out a new commit and guarantees the build is not stale:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install
|
|
||||||
npm run build:wasm
|
|
||||||
npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
## Before submitting a PR
|
|
||||||
|
|
||||||
Before you submit a contribution PR to this repo, please ensure that:
|
|
||||||
|
|
||||||
- There is a corresponding issue for the changes you want to make, so that discussion of approach can be had before work begins.
|
|
||||||
- You have separated out refactoring commits from feature commits as much as possible
|
|
||||||
- You have run all of the following commands locally:
|
|
||||||
- `npm run fmt`
|
|
||||||
- `npm run tsc`
|
|
||||||
- `npm run test`
|
|
||||||
- Here they are all together: `npm run fmt && npm run tsc && npm run test`
|
|
||||||
|
|
||||||
## Release a new version
|
|
||||||
|
|
||||||
#### 1. Create a 'Cut release $VERSION' issue
|
|
||||||
|
|
||||||
It will be used to document changelog discussions and release testing.
|
|
||||||
|
|
||||||
https://github.com/KittyCAD/modeling-app/issues/new
|
|
||||||
|
|
||||||
#### 2. Push a new tag
|
|
||||||
|
|
||||||
Create a new tag and push it to the repo. The `semantic-release.sh` script will automatically bump the minor part, which we use the most. For instance going from `v0.27.0` to `v0.28.0`.
|
|
||||||
|
|
||||||
```
|
|
||||||
VERSION=$(./scripts/semantic-release.sh)
|
|
||||||
git tag $VERSION
|
|
||||||
git push origin --tags
|
|
||||||
```
|
|
||||||
|
|
||||||
This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files.
|
|
||||||
|
|
||||||
The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush)).
|
|
||||||
|
|
||||||
#### 3. Manually test artifacts
|
|
||||||
|
|
||||||
##### Release builds
|
|
||||||
|
|
||||||
The release builds can be found under the `out-{arch}-{platform}` zip files, at the very bottom of the `build-apps` summary page for the workflow (triggered by the tag in 2.).
|
|
||||||
|
|
||||||
Manually test against this [list](https://github.com/KittyCAD/modeling-app/issues/3588) across Windows, MacOS, Linux and posting results as comments in the issue.
|
|
||||||
|
|
||||||
A prompt should show up asking for a downgrade to the last release version. Running through that at the end of testing
|
|
||||||
and making sure the current release candidate has the ability to be updated to what electron-updater points to is critical,
|
|
||||||
but what is actually being downloaded and installed isn't.
|
|
||||||
If the prompt doesn't show up, start the app in command line to grab the electron-updater logs. This is likely an issue with the current build that needs addressing.
|
|
||||||
|
|
||||||
```
|
|
||||||
# Windows (PowerShell)
|
|
||||||
& 'C:\Program Files\Zoo Design Studio\Zoo Design Studio.exe'
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
/Applications/Zoo\ Modeling\ App.app/Contents/MacOS/Zoo\ Modeling\ App
|
|
||||||
|
|
||||||
# Linux
|
|
||||||
./Zoo Design Studio-{version}-{arch}-linux.AppImage
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 4. Publish the release
|
|
||||||
|
|
||||||
Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the _Release title_ field as well.
|
|
||||||
|
|
||||||
Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_.
|
|
||||||
|
|
||||||
A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent.
|
|
||||||
|
|
||||||
#### 5. Close the issue
|
|
||||||
|
|
||||||
If everything is well and the release is out to the public, the issue tracking the release shall be closed.
|
|
||||||
|
|
||||||
## Fuzzing the parser
|
|
||||||
|
|
||||||
Make sure you install cargo fuzz:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cargo install cargo-fuzz
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cd rust/kcl-lib
|
|
||||||
|
|
||||||
# list the fuzz targets
|
|
||||||
$ cargo fuzz list
|
|
||||||
|
|
||||||
# run the parser fuzzer
|
|
||||||
$ cargo +nightly fuzz run parser
|
|
||||||
```
|
|
||||||
|
|
||||||
For more information on fuzzing you can check out
|
|
||||||
[this guide](https://rust-fuzz.github.io/book/cargo-fuzz.html).
|
|
||||||
|
|
||||||
## Tests
|
|
||||||
|
|
||||||
### Playwright tests
|
### Playwright tests
|
||||||
|
|
||||||
Prepare these system dependencies:
|
Prepare these system dependencies:
|
||||||
|
|
||||||
- Set $token from https://zoo.dev/account/api-tokens
|
- Set `$VITE_KITTYCAD_API_TOKEN` from https://zoo.dev/account/api-tokens
|
||||||
|
|
||||||
#### Snapshot tests (Google Chrome on Ubuntu only)
|
#### Snapshot tests (Google Chrome on Ubuntu only)
|
||||||
|
|
||||||
Only Ubunu and Google Chrome is supported for the set of tests evaluating screenshot snapshots.
|
Only Ubuntu and Google Chrome is supported for the set of tests evaluating screenshot snapshots.
|
||||||
If you don't run Ubuntu locally or in a VM, you may use a GitHub Codespace.
|
If you don't run Ubuntu locally or in a VM, you may use a GitHub Codespace.
|
||||||
```
|
```
|
||||||
npm run playwright -- install chrome
|
npm run playwright -- install chrome
|
||||||
@ -209,14 +108,21 @@ npm run test:snapshots
|
|||||||
```
|
```
|
||||||
You may use `-- --update-snapshots` as needed.
|
You may use `-- --update-snapshots` as needed.
|
||||||
|
|
||||||
#### Electron flow tests (Chromium on Ubuntu, macOS, Windows)
|
#### Desktop tests (Electron on all platforms)
|
||||||
|
|
||||||
```
|
```
|
||||||
npm run playwright -- install chromium
|
npm run playwright -- install chromium
|
||||||
npm run test:playwright:electron:local
|
npm run test:e2e:desktop:local
|
||||||
```
|
```
|
||||||
|
|
||||||
You may use `-- -g "my test"` to match specific test titles, or `-- path/to/file.spec.ts` for a test file.
|
You may use `-- -g "my test"` to match specific test titles, or `-- path/to/file.spec.ts` for a test file.
|
||||||
|
|
||||||
|
#### Web tests (Google Chrome on all platforms)
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run test:e2e:web
|
||||||
|
```
|
||||||
|
|
||||||
#### Debugger
|
#### Debugger
|
||||||
|
|
||||||
However, if you want a debugger I recommend using VSCode and the `playwright` extension, as the above command is a cruder debugger that steps into every function call which is annoying.
|
However, if you want a debugger I recommend using VSCode and the `playwright` extension, as the above command is a cruder debugger that steps into every function call which is annoying.
|
||||||
@ -302,8 +208,130 @@ then run tests that target the KCL language:
|
|||||||
npm run test:rust
|
npm run test:rust
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Fuzzing the parser
|
||||||
|
|
||||||
|
Make sure you install cargo fuzz:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cargo install cargo-fuzz
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd rust/kcl-lib
|
||||||
|
|
||||||
|
# list the fuzz targets
|
||||||
|
$ cargo fuzz list
|
||||||
|
|
||||||
|
# run the parser fuzzer
|
||||||
|
$ cargo +nightly fuzz run parser
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information on fuzzing you can check out
|
||||||
|
[this guide](https://rust-fuzz.github.io/book/cargo-fuzz.html).
|
||||||
|
|
||||||
### Logging
|
### Logging
|
||||||
|
|
||||||
To display logging (to the terminal or console) set `ZOO_LOG=1`. This will log some warnings and simple performance metrics. To view these in test runs, use `-- --nocapture`.
|
To display logging (to the terminal or console) set `ZOO_LOG=1`. This will log some warnings and simple performance metrics. To view these in test runs, use `-- --nocapture`.
|
||||||
|
|
||||||
To enable memory metrics, build with `--features dhat-heap`.
|
To enable memory metrics, build with `--features dhat-heap`.
|
||||||
|
|
||||||
|
## Running scripts
|
||||||
|
|
||||||
|
There are multiple scripts under the folder path `./scripts` which can be used in various settings.
|
||||||
|
|
||||||
|
### Pattern for a static file, npm run commands, and CI-CD checks
|
||||||
|
|
||||||
|
If you want to implement a static checker follow this pattern. Two static checkers we have are circular dependency checks in our typescript code and url checker to see if any hard coded URL is the typescript application 404s. We have a set of known files in `./scripts/known/*.txt` which is the baseline.
|
||||||
|
|
||||||
|
If you improve the baseline, run the overwrite command and commit the new smaller baseline. Try not to make the baseline bigger, the CI CD will complain.
|
||||||
|
These baselines are to hold us to higher standards and help implement automated testing against the repository
|
||||||
|
|
||||||
|
#### Output result to stdout
|
||||||
|
- `npm run circular-deps`
|
||||||
|
- `npm run url-checker`
|
||||||
|
|
||||||
|
- create a `<name>.sh` file that will run the static checker then output the result to `stdout`
|
||||||
|
|
||||||
|
#### Overwrite result to known .txt file on disk
|
||||||
|
|
||||||
|
If the application needs to overwrite the known file on disk use this pattern. This known .txt file will be source controlled as the baseline
|
||||||
|
|
||||||
|
- `npm run circular-deps:overwrite`
|
||||||
|
- `npm run url-checker:overwrite`
|
||||||
|
|
||||||
|
#### Diff baseline and current
|
||||||
|
|
||||||
|
These commands will write a /tmp/ file on disk and compare it to the known file in the repository. This command will also be used in the CI CD pipeline for automated checks
|
||||||
|
|
||||||
|
- create a `diff-<name>.sh` file that is the script to diff your tmp file to the baseline
|
||||||
|
e.g. `diff-url-checker.sh`
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
npm run url-checker > /tmp/urls.txt
|
||||||
|
diff --ignore-blank-lines -w /tmp/urls.txt ./scripts/known/urls.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
- `npm run circular-deps:diff`
|
||||||
|
- `npm run url-checker:diff`
|
||||||
|
|
||||||
|
## Proposing changes
|
||||||
|
|
||||||
|
Before you submit a contribution PR to this repo, please ensure that:
|
||||||
|
|
||||||
|
- There is a corresponding issue for the changes you want to make, so that discussion of approach can be had before work begins.
|
||||||
|
- You have separated out refactoring commits from feature commits as much as possible
|
||||||
|
- You have run all of the following commands locally:
|
||||||
|
- `npm run fmt`
|
||||||
|
- `npm run tsc`
|
||||||
|
- `npm run test`
|
||||||
|
- Here they are all together: `npm run fmt && npm run tsc && npm run test`
|
||||||
|
|
||||||
|
## Shipping releases
|
||||||
|
|
||||||
|
#### 1. Create a 'Cut release $VERSION' issue
|
||||||
|
|
||||||
|
Use the **Release** issue template.
|
||||||
|
This will be used to facilitate changelog discussions and release testing.
|
||||||
|
|
||||||
|
https://github.com/KittyCAD/modeling-app/issues/new
|
||||||
|
|
||||||
|
#### 2. Push a new tag
|
||||||
|
|
||||||
|
Decide on a `v`-prefixed semver `VERSION` (e.g. `v1.2.3`) with the team and tag the repo on the latest main:
|
||||||
|
|
||||||
|
```
|
||||||
|
git tag $VERSION --message=""
|
||||||
|
git push origin $VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
This will trigger the `build-apps` workflow to set the version, build & sign the apps, and generate release files.
|
||||||
|
|
||||||
|
The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush).
|
||||||
|
|
||||||
|
#### 3. Manually test artifacts
|
||||||
|
|
||||||
|
The release builds can be found under the `out-{arch}-{platform}` zip files, at the very bottom of the `build-apps` summary page for the workflow (triggered by the tag in step 2).
|
||||||
|
|
||||||
|
Assign someone to each section of the manual checklist generated by the issue template.
|
||||||
|
|
||||||
|
#### 4. Bump the KCL version
|
||||||
|
|
||||||
|
Follow the instructions [here](./rust/README.md) to publish new crates.
|
||||||
|
This ensures that the KCL accepted by the app is also accepted by the CLI.
|
||||||
|
|
||||||
|
If there are documentation changes, merge the corresponding Dependabot PRs [here](https://github.com/KittyCAD/website/pulls/app%2Fdependabot) for the website.
|
||||||
|
You can trigger Dependabot to check for updates [here](https://github.com/KittyCAD/website/network/updates/17261214/jobs).
|
||||||
|
|
||||||
|
#### 5. Publish the release
|
||||||
|
|
||||||
|
Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the **Release title** field as well.
|
||||||
|
|
||||||
|
Click **Generate release notes** as a starting point to discuss the changelog in the issue. Once done, make sure **Set as the latest release** is checked, and click **Publish release**.
|
||||||
|
|
||||||
|
A new `publish-apps-release` workflow will start and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent.
|
||||||
|
|
||||||
|
#### 6. Close the issue
|
||||||
|
|
||||||
|
If everything is well and the release is out to the public, the issue tracking the release shall be closed.
|
||||||
|
10
INSTALL.md
10
INSTALL.md
@ -4,7 +4,7 @@ Compared to other CAD software, getting Zoo Design Studio up and running is quic
|
|||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
1. Download the [Zoo Design Studio installer](https://zoo.dev/modeling-app/download) for Windows and for your processor type.
|
1. Download the [Zoo Design Studio installer](https://zoo.dev/design-studio/download) for Windows and for your processor type.
|
||||||
|
|
||||||
2. Once downloaded, run the installer `Zoo Design Studio-{version}-{arch}-win.exe` which should take a few seconds.
|
2. Once downloaded, run the installer `Zoo Design Studio-{version}-{arch}-win.exe` which should take a few seconds.
|
||||||
|
|
||||||
@ -12,16 +12,16 @@ Compared to other CAD software, getting Zoo Design Studio up and running is quic
|
|||||||
|
|
||||||
## macOS
|
## macOS
|
||||||
|
|
||||||
1. Download the [Zoo Design Studio installer](https://zoo.dev/modeling-app/download) for macOS and for your processor type.
|
1. Download the [Zoo Design Studio installer](https://zoo.dev/design-studio/download) for macOS and for your processor type.
|
||||||
|
|
||||||
2. Once downloaded, open the disk image `Zoo Design Studio-{version}-{arch}-mac.dmg` and drag the applications to your `Applications` directory.
|
2. Once downloaded, open the disk image `Zoo Design Studio-{version}-{arch}-mac.dmg` and drag the applications to your `Applications` directory.
|
||||||
|
|
||||||
3. You can then open your `Applications` directory and double-click on `Zoo Design Studio` to open.
|
3. You can then open your `Applications` directory and double-click on `Zoo Design Studio` to open.
|
||||||
|
|
||||||
|
|
||||||
## Linux
|
## Linux
|
||||||
|
|
||||||
1. Download the [Zoo Design Studio installer](https://zoo.dev/modeling-app/download) for Linux and for your processor type.
|
1. Download the [Zoo Design Studio installer](https://zoo.dev/design-studio/download) for Linux and for your processor type.
|
||||||
|
|
||||||
2. Install the dependencies needed to run the [AppImage format](https://appimage.org/).
|
2. Install the dependencies needed to run the [AppImage format](https://appimage.org/).
|
||||||
- On Ubuntu, install the FUSE library with these commands in a terminal.
|
- On Ubuntu, install the FUSE library with these commands in a terminal.
|
||||||
@ -29,7 +29,7 @@ Compared to other CAD software, getting Zoo Design Studio up and running is quic
|
|||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install libfuse2
|
sudo apt install libfuse2
|
||||||
```
|
```
|
||||||
- Optionally, follow [these steps](https://github.com/probonopd/go-appimage/blob/master/src/appimaged/README.md#initial-setup) to install `appimaged`. It is a daemon that makes interacting with AppImage files more seamless.
|
- Optionally, follow [these steps](https://github.com/probonopd/go-appimage/blob/master/src/appimaged/README.md#initial-setup) to install `appimaged`. It is a daemon that makes interacting with AppImage files more seamless.
|
||||||
- Once installed, copy the downloaded `Zoo Design Studio-{version}-{arch}-linux.AppImage` to the directory of your choice, for instance `~/Applications`.
|
- Once installed, copy the downloaded `Zoo Design Studio-{version}-{arch}-linux.AppImage` to the directory of your choice, for instance `~/Applications`.
|
||||||
|
|
||||||
- `appimaged` should automatically find it and make it executable. If not, run:
|
- `appimaged` should automatically find it and make it executable. If not, run:
|
||||||
|
14
Makefile
14
Makefile
@ -49,7 +49,7 @@ RUST_SOURCES := $(wildcard rust/**/*.rs)
|
|||||||
|
|
||||||
REACT_SOURCES := $(wildcard src/*.tsx) $(wildcard src/**/*.tsx)
|
REACT_SOURCES := $(wildcard src/*.tsx) $(wildcard src/**/*.tsx)
|
||||||
TYPESCRIPT_SOURCES := tsconfig.* $(wildcard src/*.ts) $(wildcard src/**/*.ts)
|
TYPESCRIPT_SOURCES := tsconfig.* $(wildcard src/*.ts) $(wildcard src/**/*.ts)
|
||||||
VITE_SOURCES := $(wildcard vite.*) $(wildcard vite/**/*.tsx)
|
VITE_SOURCES := $(wildcard vite.*) $(wildcard vite/**/*.tsx) .env*
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: install public/kcl_wasm_lib_bg.wasm public/kcl-samples/manifest.json .vite/build/main.js
|
build: install public/kcl_wasm_lib_bg.wasm public/kcl-samples/manifest.json .vite/build/main.js
|
||||||
@ -62,7 +62,10 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
public/kcl-samples/manifest.json: $(KCL_SOURCES)
|
public/kcl-samples/manifest.json: $(KCL_SOURCES)
|
||||||
|
ifndef WINDOWS
|
||||||
cd rust/kcl-lib && EXPECTORATE=overwrite cargo test generate_manifest
|
cd rust/kcl-lib && EXPECTORATE=overwrite cargo test generate_manifest
|
||||||
|
@ touch $@
|
||||||
|
endif
|
||||||
|
|
||||||
.vite/build/main.js: $(REACT_SOURCES) $(TYPESCRIPT_SOURCES) $(VITE_SOURCES)
|
.vite/build/main.js: $(REACT_SOURCES) $(TYPESCRIPT_SOURCES) $(VITE_SOURCES)
|
||||||
npm run tronb:vite:dev
|
npm run tronb:vite:dev
|
||||||
@ -120,19 +123,18 @@ test-e2e: test-e2e-$(TARGET)
|
|||||||
|
|
||||||
.PHONY: test-e2e-web
|
.PHONY: test-e2e-web
|
||||||
test-e2e-web: install build ## Run the web e2e tests
|
test-e2e-web: install build ## Run the web e2e tests
|
||||||
@ curl -fs localhost:3000 >/dev/null || ( echo "Error: localhost:3000 not available, 'make run-web' first" && exit 1 )
|
|
||||||
ifdef E2E_GREP
|
ifdef E2E_GREP
|
||||||
npm run chrome:test -- --headed --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
npm run test:e2e:web -- --headed --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
||||||
else
|
else
|
||||||
npm run chrome:test -- --headed --workers='100%'
|
npm run test:e2e:web -- --headed --workers='100%'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: test-e2e-desktop
|
.PHONY: test-e2e-desktop
|
||||||
test-e2e-desktop: install build ## Run the desktop e2e tests
|
test-e2e-desktop: install build ## Run the desktop e2e tests
|
||||||
ifdef E2E_GREP
|
ifdef E2E_GREP
|
||||||
npm run test:playwright:electron -- --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
npm run test:e2e:desktop -- --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
||||||
else
|
else
|
||||||
npm run test:playwright:electron -- --workers='100%'
|
npm run test:e2e:desktop -- --workers='100%'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
10
README.md
10
README.md
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Zoo Design Studio
|
# Zoo Design Studio
|
||||||
|
|
||||||
[zoo.dev/modeling-app](https://zoo.dev/modeling-app)
|
[zoo.dev/design-studio](https://zoo.dev/design-studio)
|
||||||
|
|
||||||
A CAD application from the future, brought to you by the [Zoo team](https://zoo.dev).
|
A CAD application from the future, brought to you by the [Zoo team](https://zoo.dev).
|
||||||
|
|
||||||
@ -40,12 +40,8 @@ The 3D view in Design Studio is just a video stream from our hosted geometry eng
|
|||||||
|
|
||||||
## Get Started
|
## Get Started
|
||||||
|
|
||||||
We recommend downloading the latest application binary from our [releases](https://github.com/KittyCAD/modeling-app/releases) page. If you don't see your platform or architecture supported there, please file an issue.
|
We recommend downloading the latest application binary from our [website](https://zoo.dev/design-studio/download). If you don't see your platform or architecture supported there, please file an issue. See the [installation guide](INSTALL.md) for additional instructions.
|
||||||
|
|
||||||
## Developing
|
## Developing
|
||||||
|
|
||||||
Finally, if you'd like to run a development build or contribute to the project, please visit our [contributor guide](CONTRIBUTING.md) to get started.
|
Finally, if you'd like to run a development build or contribute to the project, please visit our [contributor guide](CONTRIBUTING.md) to get started. To contribute to the KittyCAD Language, see the dedicated [readme](rust/kcl-lib/README.md) for KCL.
|
||||||
|
|
||||||
## KCL
|
|
||||||
|
|
||||||
To contribute to the KittyCAD Language, see the [README](https://github.com/KittyCAD/modeling-app/tree/main/rust/kcl-lib) for KCL.
|
|
||||||
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 259 KiB |
@ -16,15 +16,16 @@ There are some useful functions for working with arrays in the standard library,
|
|||||||
|
|
||||||
Arrays have their own types: `[T]` where `T` is the type of the elements of the array, for example, `[string]` means an array of `string`s and `[any]` means an array of any values.
|
Arrays have their own types: `[T]` where `T` is the type of the elements of the array, for example, `[string]` means an array of `string`s and `[any]` means an array of any values.
|
||||||
|
|
||||||
Array types can also include length information: `[T; n]` denotes an array of length `n` (where `n` is a number literal) and `[T; 1+]` denotes an array whose length is at least one (i.e., a non-empty array). E.g., `[string; 1+]` and `[number(mm); 3]` are valid array types.
|
Array types can also include length information: `[T; n]` denotes an array of length `n` (where `n` is a number literal) and `[T; n+]` denotes an array whose length is at least `n`. The common case for that is `[T; 1+]`, i.e., a non-empty array. E.g., `[string; 1+]` and `[number(mm); 3]` are valid array types.
|
||||||
|
|
||||||
## Ranges
|
## Ranges
|
||||||
|
|
||||||
Ranges are a succinct way to create an array of sequential numbers. The syntax is `[start .. end]` where `start` and `end` evaluate to whole numbers (integers). Ranges are inclusive of the start and end. The end must be greater than the start. Examples:
|
Ranges are a succinct way to create an array of sequential numbers. The syntax is `[start .. end]` where `start` and `end` evaluate to whole numbers (integers). Ranges are inclusive of the start and end. The end must be greater than the start. A range which is exclusive of its end is written with `<end`. Examples:
|
||||||
|
|
||||||
```kcl,norun
|
```kcl,norun
|
||||||
[0..3] // [0, 1, 2, 3]
|
[0..3] // [0, 1, 2, 3]
|
||||||
[3..10] // [3, 4, 5, 6, 7, 8, 9, 10]
|
[3..10] // [3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
[3..<10] // [3, 4, 5, 6, 7, 8, 9]
|
||||||
x = 2
|
x = 2
|
||||||
[x..x+1] // [2, 3]
|
[x..x+1] // [2, 3]
|
||||||
```
|
```
|
||||||
|
@ -46,3 +46,7 @@ KCL has no support for area, volume, or other higher dimension units. When inter
|
|||||||
## Explicit conversions
|
## Explicit conversions
|
||||||
|
|
||||||
You might sometimes need to convert from one unit to another for some calculation. You can do this implicitly when calling a function (see above), but if you can't or don't want to, then you can use the explicit conversion functions in the [`std::units`](/docs/kcl-std/modules/std-units) module.
|
You might sometimes need to convert from one unit to another for some calculation. You can do this implicitly when calling a function (see above), but if you can't or don't want to, then you can use the explicit conversion functions in the [`std::units`](/docs/kcl-std/modules/std-units) module.
|
||||||
|
|
||||||
|
KCL cannot know about changes to units caused by arithmetic. For example, you may intend for `10in * 25.4` to be the value `254mm` (i.e., `10in` in mm), however, the result of that computation in KCL is `254in`. It is always better to rely on automatic conversion or to use the explicit conversion functions, where possible.
|
||||||
|
|
||||||
|
Converting between degrees and radians using π ([`PI`](/docs/kcl-std/consts/std-math-PI) in KCL) is especially prone to this error and so the `PI` constant always requires specifying units of any computation it is used with. E.g., `radius = (circumference / (2 * PI)): number(mm)`.
|
||||||
|
@ -4,8 +4,6 @@ excerpt: "Project specific settings for the app. These live in `project.toml` in
|
|||||||
layout: manual
|
layout: manual
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project Settings
|
|
||||||
|
|
||||||
Project specific settings for the app. These live in `project.toml` in the base of the project directory. Updating the settings for the project in the app will update this file automatically. Do not edit this file manually, as it may be overwritten by the app. Manual edits can cause corruption of the settings file.
|
Project specific settings for the app. These live in `project.toml` in the base of the project directory. Updating the settings for the project in the app will update this file automatically. Do not edit this file manually, as it may be overwritten by the app. Manual edits can cause corruption of the settings file.
|
||||||
|
|
||||||
## Project Configuration Structure
|
## Project Configuration Structure
|
||||||
@ -184,4 +182,4 @@ color = 240.0
|
|||||||
# Use inches as the default measurement unit
|
# Use inches as the default measurement unit
|
||||||
base_unit = "in"
|
base_unit = "in"
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -4,8 +4,6 @@ excerpt: "User specific settings for the app. These live in `user.toml` in the a
|
|||||||
layout: manual
|
layout: manual
|
||||||
---
|
---
|
||||||
|
|
||||||
# User Settings
|
|
||||||
|
|
||||||
User specific settings for the app. These live in `user.toml` in the app's configuration directory. Updating the settings in the app will update this file automatically. Do not edit this file manually, as it may be overwritten by the app. Manual edits can cause corruption of the settings file.
|
User specific settings for the app. These live in `user.toml` in the app's configuration directory. Updating the settings in the app will update this file automatically. Do not edit this file manually, as it may be overwritten by the app. Manual edits can cause corruption of the settings file.
|
||||||
|
|
||||||
## User Configuration Structure
|
## User Configuration Structure
|
||||||
@ -85,6 +83,13 @@ Allow orbiting in sketch mode.
|
|||||||
Whether to show the debug panel, which lets you see various states of the app to aid in development.
|
Whether to show the debug panel, which lets you see various states of the app to aid in development.
|
||||||
|
|
||||||
|
|
||||||
|
**Default:** None
|
||||||
|
|
||||||
|
##### fixed_size_grid
|
||||||
|
|
||||||
|
If true, the grid cells will be fixed-size, where the width is your default length unit. If false, the grid will get larger as you zoom out, and smaller as you zoom in.
|
||||||
|
|
||||||
|
|
||||||
**Default:** None
|
**Default:** None
|
||||||
|
|
||||||
|
|
||||||
@ -234,4 +239,4 @@ base_unit = "mm"
|
|||||||
# Disable text wrapping in the editor
|
# Disable text wrapping in the editor
|
||||||
text_wrapping = false
|
text_wrapping = false
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -44,7 +44,7 @@ detail on importing geometry.
|
|||||||
|
|
||||||
Tags are used to give a name (tag) to a specific path.
|
Tags are used to give a name (tag) to a specific path.
|
||||||
|
|
||||||
### `TagDeclarator`
|
### Tag declarations - `TagDecl`
|
||||||
|
|
||||||
The syntax for declaring a tag is `$myTag` you would use it in the following
|
The syntax for declaring a tag is `$myTag` you would use it in the following
|
||||||
way:
|
way:
|
||||||
@ -67,24 +67,28 @@ startSketchOn(XZ)
|
|||||||
|> close()
|
|> close()
|
||||||
```
|
```
|
||||||
|
|
||||||
### `TagIdentifier`
|
When a function requires declaring a new tag (using the `$` syntax), the argument has type [`TagDecl`](/docs/kcl-std/types/std-types-TagDecl).
|
||||||
|
|
||||||
As per the example above you can use the tag identifier to get a reference to the
|
### Tag identifiers
|
||||||
tagged object. The syntax for this is `myTag`.
|
|
||||||
|
|
||||||
In the example above we use the tag identifier to get the angle of the segment
|
A tag created using a tag declarator can be used by writing its name without the `$`, e.g., `myTag`.
|
||||||
`segAng(rectangleSegmentA001)`.
|
Where necessary to disambiguate from tag declarations, we call these tag identifiers.
|
||||||
|
|
||||||
### `Start`
|
In the example above we use the tag identifier `rectangleSegmentA001` to get the angle of the segment
|
||||||
|
using `segAng(rectangleSegmentA001)`.
|
||||||
|
|
||||||
There is a special tag, `START` (with type `Start`, although under the cover, it's a string)
|
Tags can identify either an edge or face of a solid, or a line or other edge of a sketch. Functions
|
||||||
for identifying the face of a solid which was the start of an extrusion (i.e., the surface which
|
which take a tag identifier as an argument will use either [`TaggedEdge`](/docs/kcl-std/types/std-types-TaggedEdge) (for the edge of a
|
||||||
is extruded).
|
solid or sketch) or [`TaggedFace`](/docs/kcl-std/types/std-types-TaggedFace).
|
||||||
|
|
||||||
### `End`
|
If a line in a sketch is tagged and then the sketch is extruded, the tag is a `TaggedEdge` before
|
||||||
|
extrusion and a `TaggedFace` after extrusion.
|
||||||
|
|
||||||
|
#### `START` and `END`
|
||||||
|
|
||||||
|
[`START`](/docs/kcl-std/consts/std-START) and [`END`](/docs/kcl-std/consts/std-END) are special tags
|
||||||
|
for identifying the starting and ending faces of an extruded solid.
|
||||||
|
|
||||||
There is a special tag, `END` (with type `End`, although under the cover, it's a string)
|
|
||||||
for identifying the face of a solid which was finishes an extrusion.
|
|
||||||
|
|
||||||
### Tag Scope
|
### Tag Scope
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
title: "KCL Constants"
|
|
||||||
excerpt: "Documentation for the KCL constants."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
|
|
||||||
|
|
||||||
### `std`
|
|
||||||
|
|
||||||
- [`END`](/docs/kcl/consts/std-END)
|
|
||||||
- [`START`](/docs/kcl/consts/std-START)
|
|
||||||
- [`X`](/docs/kcl/consts/std-X)
|
|
||||||
- [`XY`](/docs/kcl/consts/std-XY)
|
|
||||||
- [`XZ`](/docs/kcl/consts/std-XZ)
|
|
||||||
- [`Y`](/docs/kcl/consts/std-Y)
|
|
||||||
- [`YZ`](/docs/kcl/consts/std-YZ)
|
|
||||||
- [`Z`](/docs/kcl/consts/std-Z)
|
|
||||||
|
|
||||||
### `std::math`
|
|
||||||
|
|
||||||
- [`E`](/docs/kcl/consts/std-math-E)
|
|
||||||
- [`PI`](/docs/kcl/consts/std-math-PI)
|
|
||||||
- [`TAU`](/docs/kcl/consts/std-math-TAU)
|
|
||||||
|
|
||||||
### `std::turns`
|
|
||||||
|
|
||||||
- [`HALF_TURN`](/docs/kcl/consts/std-turns-HALF_TURN)
|
|
||||||
- [`QUARTER_TURN`](/docs/kcl/consts/std-turns-QUARTER_TURN)
|
|
||||||
- [`THREE_QUARTER_TURN`](/docs/kcl/consts/std-turns-THREE_QUARTER_TURN)
|
|
||||||
- [`ZERO`](/docs/kcl/consts/std-turns-ZERO)
|
|
||||||
|
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
Identifies the ending face of an extrusion. I.e., the new face created by an extrusion.
|
Identifies the ending face of an extrusion. I.e., the new face created by an extrusion.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
END: string = 'end'
|
END: TaggedFace
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`TaggedFace`](/docs/kcl-std/types/std-types-TaggedFace) - A tag which references a face of a solid, including the distinguished tags `START` and `END`.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
Identifies the starting face of an extrusion. I.e., the face which is extruded.
|
Identifies the starting face of an extrusion. I.e., the face which is extruded.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
START: string = 'start'
|
START: TaggedFace
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`TaggedFace`](/docs/kcl-std/types/std-types-TaggedFace) - A tag which references a face of a solid, including the distinguished tags `START` and `END`.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
The X-axis (can be used in both 2d and 3d contexts).
|
The X-axis (can be used in both 2d and 3d contexts).
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
X
|
X: Axis3d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Axis3d`](/docs/kcl-std/types/std-types-Axis3d) - An abstract and infinite line in 3d space.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
An abstract 3d plane aligned with the X and Y axes. Its normal is the positive Z axis.
|
An abstract 3d plane aligned with the X and Y axes. Its normal is the positive Z axis.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
XY
|
XY: Plane
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Plane`](/docs/kcl-std/types/std-types-Plane) - An abstract plane.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
An abstract 3d plane aligned with the X and Z axes. Its normal is the negative Y axis.
|
An abstract 3d plane aligned with the X and Z axes. Its normal is the negative Y axis.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
XZ
|
XZ: Plane
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Plane`](/docs/kcl-std/types/std-types-Plane) - An abstract plane.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
The Y-axis (can be used in both 2d and 3d contexts).
|
The Y-axis (can be used in both 2d and 3d contexts).
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
Y
|
Y: Axis3d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Axis3d`](/docs/kcl-std/types/std-types-Axis3d) - An abstract and infinite line in 3d space.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
An abstract 3d plane aligned with the Y and Z axes. Its normal is the positive X axis.
|
An abstract 3d plane aligned with the Y and Z axes. Its normal is the positive X axis.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
YZ
|
YZ: Plane
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Plane`](/docs/kcl-std/types/std-types-Plane) - An abstract plane.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
The 3D Z-axis.
|
The 3D Z-axis.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
Z
|
Z: Axis3d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`Axis3d`](/docs/kcl-std/types/std-types-Axis3d) - An abstract and infinite line in 3d space.
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -13,4 +13,8 @@ sweep::SKETCH_PLANE: string = 'sketchPlane'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`string`](/docs/kcl-std/types/std-types-string) - A sequence of characters
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,4 +13,8 @@ sweep::TRAJECTORY: string = 'trajectoryCurve'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`string`](/docs/kcl-std/types/std-types-string) - A sequence of characters
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,4 +13,8 @@ turns::HALF_TURN: number(deg) = 180deg
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`number(deg)`](/docs/kcl-std/types/std-types-number) - A number.
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,4 +13,8 @@ turns::QUARTER_TURN: number(deg) = 90deg
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`number(deg)`](/docs/kcl-std/types/std-types-number) - A number.
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,4 +13,8 @@ turns::THREE_QUARTER_TURN: number(deg) = 270deg
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`number(deg)`](/docs/kcl-std/types/std-types-number) - A number.
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,9 +8,13 @@ layout: manual
|
|||||||
No turn, zero degrees/radians.
|
No turn, zero degrees/radians.
|
||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
turns::ZERO: number = 0
|
turns::ZERO: number(Angle)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Type
|
||||||
|
|
||||||
|
[`number(Angle)`](/docs/kcl-std/types/std-types-number) - A number.
|
||||||
|
|
||||||
|
|
||||||
|
130
docs/kcl-std/functions/std-appearance-hexString.md
Normal file
130
docs/kcl-std/functions/std-appearance-hexString.md
Normal file
File diff suppressed because one or more lines are too long
64
docs/kcl-std/functions/std-appearance-rgb.md
Normal file
64
docs/kcl-std/functions/std-appearance-rgb.md
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
60
docs/kcl-std/functions/std-assert.md
Normal file
60
docs/kcl-std/functions/std-assert.md
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
title: "assert"
|
||||||
|
subtitle: "Function in std"
|
||||||
|
excerpt: "Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met."
|
||||||
|
layout: manual
|
||||||
|
---
|
||||||
|
|
||||||
|
Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met.
|
||||||
|
|
||||||
|
```kcl
|
||||||
|
assert(
|
||||||
|
@actual: number,
|
||||||
|
isGreaterThan?: number,
|
||||||
|
isLessThan?: number,
|
||||||
|
isGreaterThanOrEqual?: number,
|
||||||
|
isLessThanOrEqual?: number,
|
||||||
|
isEqualTo?: number,
|
||||||
|
tolerance?: number,
|
||||||
|
error?: string,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Arguments
|
||||||
|
|
||||||
|
| Name | Type | Description | Required |
|
||||||
|
|----------|------|-------------|----------|
|
||||||
|
| `actual` | [`number`](/docs/kcl-std/types/std-types-number) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. | Yes |
|
||||||
|
| `isGreaterThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than this. | No |
|
||||||
|
| `isLessThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than this. | No |
|
||||||
|
| `isGreaterThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than or equal to this. | No |
|
||||||
|
| `isLessThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No |
|
||||||
|
| `isEqualTo` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No |
|
||||||
|
| `tolerance` | [`number`](/docs/kcl-std/types/std-types-number) | If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. | No |
|
||||||
|
| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No |
|
||||||
|
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```kcl
|
||||||
|
n = 10
|
||||||
|
assert(n, isEqualTo = 10)
|
||||||
|
assert(
|
||||||
|
n,
|
||||||
|
isGreaterThanOrEqual = 0,
|
||||||
|
isLessThan = 100,
|
||||||
|
error = "number should be between 0 and 100",
|
||||||
|
)
|
||||||
|
assert(
|
||||||
|
1.0000000000012,
|
||||||
|
isEqualTo = 1,
|
||||||
|
tolerance = 0.0001,
|
||||||
|
error = "number should be almost exactly 1",
|
||||||
|
)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
36
docs/kcl-std/functions/std-assertIs.md
Normal file
36
docs/kcl-std/functions/std-assertIs.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
title: "assertIs"
|
||||||
|
subtitle: "Function in std"
|
||||||
|
excerpt: "Asserts that a value is the boolean value true."
|
||||||
|
layout: manual
|
||||||
|
---
|
||||||
|
|
||||||
|
Asserts that a value is the boolean value true.
|
||||||
|
|
||||||
|
```kcl
|
||||||
|
assertIs(
|
||||||
|
@actual: bool,
|
||||||
|
error?: string,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Arguments
|
||||||
|
|
||||||
|
| Name | Type | Description | Required |
|
||||||
|
|----------|------|-------------|----------|
|
||||||
|
| `actual` | [`bool`](/docs/kcl-std/types/std-types-bool) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. | Yes |
|
||||||
|
| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No |
|
||||||
|
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```kcl
|
||||||
|
kclIsFun = true
|
||||||
|
assertIs(kclIsFun)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -29,14 +29,12 @@ Consider using `atan2()` instead for the true inverse of tangent.
|
|||||||
```kcl
|
```kcl
|
||||||
sketch001 = startSketchOn(XZ)
|
sketch001 = startSketchOn(XZ)
|
||||||
|> startProfile(at = [0, 0])
|
|> startProfile(at = [0, 0])
|
||||||
|> angledLine(
|
|> angledLine(angle = atan(1.25), length = 20)
|
||||||
angle = atan(1.25),
|
|
||||||
length = 20,
|
|
||||||
)
|
|
||||||
|> yLine(endAbsolute = 0)
|
|> yLine(endAbsolute = 0)
|
||||||
|> close()
|
|> close()
|
||||||
|
|
||||||
extrude001 = extrude(sketch001, length = 5)
|
extrude001 = extrude(sketch001, length = 5)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -32,6 +32,7 @@ legAngX(
|
|||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
legAngX(hypotenuse = 5, leg = 3)
|
legAngX(hypotenuse = 5, leg = 3)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ legAngY(
|
|||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
legAngY(hypotenuse = 5, leg = 3)
|
legAngY(hypotenuse = 5, leg = 3)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ legLen(
|
|||||||
|
|
||||||
```kcl
|
```kcl
|
||||||
legLen(hypotenuse = 5, leg = 3)
|
legLen(hypotenuse = 5, leg = 3)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user