Compare commits
1 Commits
remove-unu
...
jtran/upda
Author | SHA1 | Date | |
---|---|---|---|
441e18e916 |
@ -1,4 +1,3 @@
|
|||||||
[codespell]
|
[codespell]
|
||||||
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,atleast,ue,afterall,ser,fromM,FromM
|
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,atleast,ue,afterall,ser,fromM,FromM
|
||||||
skip: **/target,node_modules,build,dist,./out,**/Cargo.lock,./docs/**/*.md,./e2e/playwright/lib/console-error-whitelist.ts,.package-lock.json,**/package-lock.json,./openapi/*.json,./packages/codemirror-lang-kcl/test/all.test.ts,./public/kcl-samples,./rust/kcl-lib/tests/kcl_samples,tsconfig.tsbuildinfo,./src/lib/machine-api.d.ts,./test-results,./playwright-report,./kcl-book/book
|
skip: **/target,node_modules,build,dist,./out,**/Cargo.lock,./docs/kcl/*.md,./e2e/playwright/lib/console-error-whitelist.ts,.package-lock.json,**/package-lock.json,./openapi/*.json,./packages/codemirror-lang-kcl/test/all.test.ts,./public/kcl-samples,./rust/kcl-lib/tests/kcl_samples,tsconfig.tsbuildinfo,./src/lib/machine-api.d.ts
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
# DO NOT commit secrets, overrides go in the ignored `.env.development.local`
|
|
||||||
|
|
||||||
NODE_ENV=development
|
NODE_ENV=development
|
||||||
DEV=true
|
DEV=true
|
||||||
|
|
||||||
@ -9,11 +7,7 @@ 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_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"
|
# ONLY add your token in .env.development.local if you want to skip auth, otherwise this token takes precedence!
|
||||||
#token="required token for playwright. TODO: clean up env vars in #3973"
|
#VITE_KC_DEV_TOKEN="your token from dev.zoo.dev should go in .env.development.local"
|
||||||
|
|
||||||
RUST_BACKTRACE=1
|
|
||||||
PYO3_PYTHON=/usr/local/bin/python3
|
|
||||||
#KITTYCAD_API_TOKEN="required token for engine testing"
|
|
||||||
|
|
||||||
FAIL_ON_CONSOLE_ERRORS=true
|
FAIL_ON_CONSOLE_ERRORS=true
|
||||||
|
@ -87,14 +87,6 @@
|
|||||||
{
|
{
|
||||||
"selector": "CallExpression[callee.object.name='TOML'][callee.property.name='parse']",
|
"selector": "CallExpression[callee.object.name='TOML'][callee.property.name='parse']",
|
||||||
"message": "Do not use TOML.parse directly. Use the wrappers in test-utils instead like tomlToSettings."
|
"message": "Do not use TOML.parse directly. Use the wrappers in test-utils instead like tomlToSettings."
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": "CallExpression[callee.property.name='split'] > Literal[value='/']",
|
|
||||||
"message": "Avoid using split with '/'."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": "CallExpression[callee.property.name='join'] > Literal[value='/']",
|
|
||||||
"message": "Avoid using join with '/'."
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"no-restricted-imports": [
|
"no-restricted-imports": [
|
||||||
|
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:playwright:electron:ubuntu -- --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:playwright:electron: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:playwright:electron: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:playwright:electron:ubuntu -- --last-failed || true
|
||||||
elif [[ "$3" == *windows* ]]; then
|
elif [[ "$3" == *windows* ]]; then
|
||||||
npm run test:playwright:electron -- --grep=@windows --last-failed || true
|
npm run test:playwright:electron: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:playwright:electron: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
|
||||||
|
41
.github/ci-cd-scripts/upload-results.sh
vendored
41
.github/ci-cd-scripts/upload-results.sh
vendored
@ -1,41 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [ -z "${TAB_API_URL:-}" ] || [ -z "${TAB_API_KEY:-}" ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
project="https://github.com/KittyCAD/modeling-app"
|
|
||||||
branch="${GITHUB_HEAD_REF:-${GITHUB_REF_NAME:-}}"
|
|
||||||
commit="${CI_COMMIT_SHA:-${GITHUB_SHA:-}}"
|
|
||||||
|
|
||||||
echo "Uploading batch results"
|
|
||||||
curl --silent --request POST \
|
|
||||||
--header "X-API-Key: ${TAB_API_KEY}" \
|
|
||||||
--form "project=${project}" \
|
|
||||||
--form "branch=${branch}" \
|
|
||||||
--form "commit=${commit}" \
|
|
||||||
--form "tests=@test-results/junit.xml" \
|
|
||||||
--form "CI_COMMIT_SHA=${CI_COMMIT_SHA:-}" \
|
|
||||||
--form "CI_PR_NUMBER=${CI_PR_NUMBER:-}" \
|
|
||||||
--form "GITHUB_BASE_REF=${GITHUB_BASE_REF:-}" \
|
|
||||||
--form "GITHUB_EVENT_NAME=${GITHUB_EVENT_NAME:-}" \
|
|
||||||
--form "GITHUB_HEAD_REF=${GITHUB_HEAD_REF:-}" \
|
|
||||||
--form "GITHUB_REF_NAME=${GITHUB_REF_NAME:-}" \
|
|
||||||
--form "GITHUB_REF=${GITHUB_REF:-}" \
|
|
||||||
--form "GITHUB_SHA=${GITHUB_SHA:-}" \
|
|
||||||
--form "GITHUB_WORKFLOW=${GITHUB_WORKFLOW:-}" \
|
|
||||||
--form "RUNNER_ARCH=${RUNNER_ARCH:-}" \
|
|
||||||
${TAB_API_URL}/api/results/bulk
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Sharing updated report"
|
|
||||||
curl --silent --request POST \
|
|
||||||
--header "Content-Type: application/json" \
|
|
||||||
--header "X-API-Key: ${TAB_API_KEY}" \
|
|
||||||
--data "{
|
|
||||||
\"project\": \"${project}\",
|
|
||||||
\"branch\": \"${branch}\",
|
|
||||||
\"commit\": \"${commit}\"
|
|
||||||
}" \
|
|
||||||
${TAB_API_URL}/api/share
|
|
441
.github/dependabot.yml
vendored
441
.github/dependabot.yml
vendored
@ -16,12 +16,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -52,408 +49,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-python-bindings
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-to-core
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-language-server-release
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-wasm-lib
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-derive-docs
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-bumper
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-language-server
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-lib
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-lib/fuzz
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-test-server
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- patch
|
|
||||||
major:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
minor:
|
|
||||||
applies-to: version-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
- package-ecosystem: cargo
|
|
||||||
directory: /rust/kcl-directory-test-macro
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: monday
|
|
||||||
time: '03:00'
|
|
||||||
timezone: America/Los_Angeles
|
|
||||||
open-pull-requests-limit: 5
|
|
||||||
reviewers:
|
|
||||||
- adamchalmers
|
|
||||||
- franknoirot
|
|
||||||
- irev-dev
|
|
||||||
- jessfraz
|
|
||||||
groups:
|
|
||||||
security:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- minor
|
|
||||||
- patch
|
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -484,12 +82,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -520,12 +115,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -556,12 +148,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -592,12 +181,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -628,12 +214,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -664,12 +247,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
@ -700,12 +280,9 @@ updates:
|
|||||||
security:
|
security:
|
||||||
applies-to: security-updates
|
applies-to: security-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
- major
|
||||||
- minor
|
- minor
|
||||||
- patch
|
- patch
|
||||||
security-major:
|
|
||||||
applies-to: security-updates
|
|
||||||
update-types:
|
|
||||||
- major
|
|
||||||
patch:
|
patch:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
update-types:
|
update-types:
|
||||||
|
78
.github/workflows/build-apps.yml
vendored
78
.github/workflows/build-apps.yml
vendored
@ -7,13 +7,14 @@ on:
|
|||||||
- main
|
- main
|
||||||
tags:
|
tags:
|
||||||
- 'v[0-9]+.[0-9]+.[0-9]+'
|
- 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
|
- 'nightly-v[0-9]+.[0-9]+.[0-9]+'
|
||||||
|
|
||||||
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_NIGHTLY: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'nightly-v') }}
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -94,9 +95,7 @@ jobs:
|
|||||||
- name: Set nightly version, product name, release notes, and icons
|
- name: Set nightly version, product name, release notes, and icons
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_NIGHTLY == 'true' }}
|
||||||
run: |
|
run: |
|
||||||
COMMIT=$(git rev-parse --short HEAD)
|
export VERSION=${GITHUB_REF_NAME#nightly-v}
|
||||||
DATE=$(date +'%-y.%-m.%-d')
|
|
||||||
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-nightly
|
||||||
|
|
||||||
@ -123,6 +122,18 @@ jobs:
|
|||||||
- id: export_notes
|
- id: export_notes
|
||||||
run: echo "notes=`cat release-notes.md`" >> "$GITHUB_OUTPUT"
|
run: echo "notes=`cat release-notes.md`" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Prepare electron-builder.yml file for updater test
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
run: |
|
||||||
|
yq -i '.publish[0].url = "https://dl.zoo.dev/releases/modeling-app/updater-test"' electron-builder.yml
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
with:
|
||||||
|
name: prepared-files-updater-test
|
||||||
|
path: |
|
||||||
|
electron-builder.yml
|
||||||
|
|
||||||
|
|
||||||
build-apps:
|
build-apps:
|
||||||
needs: [prepare-files]
|
needs: [prepare-files]
|
||||||
@ -247,13 +258,55 @@ jobs:
|
|||||||
|
|
||||||
# TODO: add the 'Build for Mac TestFlight (nightly)' stage back
|
# TODO: add the 'Build for Mac TestFlight (nightly)' stage back
|
||||||
|
|
||||||
|
# The steps below are for updater-test builds, only on release
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
name: prepared-files-updater-test
|
||||||
|
|
||||||
|
- name: Copy updated electron-builder.yml file for updater test
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
run: |
|
||||||
|
ls -R prepared-files-updater-test
|
||||||
|
cp prepared-files-updater-test/electron-builder.yml electron-builder.yml
|
||||||
|
|
||||||
|
- name: Build the app (updater-test)
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
env:
|
||||||
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
|
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
|
CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
|
||||||
|
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||||
|
CSC_KEYCHAIN: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
||||||
|
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
|
||||||
|
run: npm run tronb:package:prod
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
with:
|
||||||
|
name: updater-test-arm64-${{ matrix.platform }}
|
||||||
|
path: |
|
||||||
|
out/*-arm64-win.exe
|
||||||
|
out/*-arm64-mac.dmg
|
||||||
|
out/*-arm64-linux.AppImage
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ env.IS_RELEASE == 'true' }}
|
||||||
|
with:
|
||||||
|
name: updater-test-x64-${{ matrix.platform }}
|
||||||
|
path: |
|
||||||
|
out/*-x64-win.exe
|
||||||
|
out/*-x64-mac.dmg
|
||||||
|
out/*-x86_64-linux.AppImage
|
||||||
|
|
||||||
|
|
||||||
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)
|
if: ${{ github.ref_type == 'tag' }}
|
||||||
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 }}
|
||||||
VERSION: ${{ format('v{0}', needs.prepare-files.outputs.version) }}
|
VERSION: ${{ format('v{0}', needs.prepare-files.outputs.version) }}
|
||||||
@ -359,6 +412,17 @@ jobs:
|
|||||||
- name: List artifacts
|
- name: List artifacts
|
||||||
run: "ls -R out"
|
run: "ls -R out"
|
||||||
|
|
||||||
|
- name: Set more complete nightly release notes
|
||||||
|
if: ${{ env.IS_NIGHTLY == 'true' }}
|
||||||
|
run: |
|
||||||
|
# Note: preferred going this way instead of a full clone in the checkout step,
|
||||||
|
# see https://github.com/actions/checkout/issues/1471
|
||||||
|
git fetch --prune --unshallow --tags
|
||||||
|
export TAG="nightly-${VERSION}"
|
||||||
|
export PREVIOUS_TAG=$(git tag --list --sort=-committerdate "nightly-v[0-9]*" | head -n2 | tail -n1)
|
||||||
|
export NOTES=$(./scripts/get-nightly-changelog.sh)
|
||||||
|
npm run files:set-notes
|
||||||
|
|
||||||
- name: Authenticate to Google Cloud
|
- name: Authenticate to Google Cloud
|
||||||
if: ${{ env.IS_NIGHTLY == 'true' }}
|
if: ${{ env.IS_NIGHTLY == 'true' }}
|
||||||
uses: 'google-github-actions/auth@v2.1.8'
|
uses: 'google-github-actions/auth@v2.1.8'
|
||||||
|
56
.github/workflows/build-wasm.yml
vendored
56
.github/workflows/build-wasm.yml
vendored
@ -1,56 +0,0 @@
|
|||||||
name: Build WASM
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
npm-build-wasm:
|
|
||||||
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version-file: '.nvmrc'
|
|
||||||
cache: 'npm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Use correct Rust toolchain
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
|
||||||
|
|
||||||
- name: Install rust
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
cache: false # configured below
|
|
||||||
|
|
||||||
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
|
||||||
with:
|
|
||||||
tool: wasm-pack
|
|
||||||
|
|
||||||
- name: Use Rust cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: './rust'
|
|
||||||
|
|
||||||
- name: Build Wasm
|
|
||||||
shell: bash
|
|
||||||
run: npm run build:wasm
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: prepared-wasm
|
|
||||||
path: |
|
|
||||||
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: prepared-ts-rs-bindings
|
|
||||||
path: |
|
|
||||||
rust/kcl-lib/bindings/*
|
|
6
.github/workflows/cargo-bench.yml
vendored
6
.github/workflows/cargo-bench.yml
vendored
@ -26,8 +26,12 @@ name: cargo bench
|
|||||||
jobs:
|
jobs:
|
||||||
cargo-bench:
|
cargo-bench:
|
||||||
name: cargo bench
|
name: cargo bench
|
||||||
runs-on: ubuntu-latest
|
runs-on:
|
||||||
|
- runs-on=${{ github.run_id }}
|
||||||
|
- runner=32cpu-linux-x64
|
||||||
|
- extras=s3-cache
|
||||||
steps:
|
steps:
|
||||||
|
- uses: runs-on/action@v1
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Use correct Rust toolchain
|
- name: Use correct Rust toolchain
|
||||||
shell: bash
|
shell: bash
|
||||||
|
189
.github/workflows/cargo-test.yml
vendored
189
.github/workflows/cargo-test.yml
vendored
@ -2,6 +2,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
permissions:
|
permissions:
|
||||||
@ -12,14 +13,10 @@ concurrency:
|
|||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
name: cargo test
|
name: cargo test
|
||||||
jobs:
|
jobs:
|
||||||
build-test-artifacts:
|
cargotest:
|
||||||
name: Build test artifacts
|
name: cargo test
|
||||||
runs-on:
|
runs-on: ubuntu-latest-8-cores
|
||||||
- runs-on=${{ github.run_id }}
|
|
||||||
- runner=8cpu-linux-x64
|
|
||||||
- extras=s3-cache
|
|
||||||
steps:
|
steps:
|
||||||
- uses: runs-on/action@v1
|
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v1
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
@ -42,6 +39,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
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 }}
|
||||||
|
- uses: taiki-e/install-action@cargo-llvm-cov
|
||||||
- uses: taiki-e/install-action@nextest
|
- uses: taiki-e/install-action@nextest
|
||||||
- name: Install just
|
- name: Install just
|
||||||
uses: taiki-e/install-action@just
|
uses: taiki-e/install-action@just
|
||||||
@ -83,10 +81,9 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
cd rust
|
cd rust
|
||||||
cargo nextest run --workspace --features artifact-graph --retries=10 --no-fail-fast --profile ci simulation_tests::kcl_samples 2>&1 | tee /tmp/github-actions.log
|
cargo nextest run --workspace --retries=2 --no-fail-fast --profile ci simulation_tests::kcl_samples 2>&1 | tee /tmp/github-actions.log
|
||||||
env:
|
env:
|
||||||
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}}
|
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}}
|
||||||
ZOO_HOST: https://api.dev.zoo.dev
|
|
||||||
RUST_BACKTRACE: full
|
RUST_BACKTRACE: full
|
||||||
RUST_MIN_STACK: 10485760000
|
RUST_MIN_STACK: 10485760000
|
||||||
- name: Commit differences
|
- name: Commit differences
|
||||||
@ -99,7 +96,9 @@ jobs:
|
|||||||
popd
|
popd
|
||||||
git add \
|
git add \
|
||||||
rust/kcl-lib/tests \
|
rust/kcl-lib/tests \
|
||||||
public/kcl-samples
|
public/kcl-samples/manifest.json \
|
||||||
|
public/kcl-samples/README.md \
|
||||||
|
public/kcl-samples/screenshots
|
||||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
git config --local user.name "github-actions[bot]"
|
git config --local user.name "github-actions[bot]"
|
||||||
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
||||||
@ -115,167 +114,27 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
# The default is auto, and insta behaves differently in CI vs. not.
|
# The default is auto, and insta behaves differently in CI vs. not.
|
||||||
INSTA_UPDATE: always
|
INSTA_UPDATE: always
|
||||||
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}}
|
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}}
|
||||||
ZOO_HOST: https://api.dev.zoo.dev
|
|
||||||
# Configure nextest when it's run by insta (via just).
|
# Configure nextest when it's run by insta (via just).
|
||||||
NEXTEST_PROFILE: ci
|
NEXTEST_PROFILE: ci
|
||||||
RUST_BACKTRACE: full
|
RUST_BACKTRACE: full
|
||||||
RUST_MIN_STACK: 10485760000
|
RUST_MIN_STACK: 10485760000
|
||||||
- name: Build and archive tests
|
- name: cargo test
|
||||||
run: |
|
if: steps.path-changes.outputs.outside-kcl-samples == 'true'
|
||||||
cd rust
|
|
||||||
cargo nextest archive --workspace --features artifact-graph --archive-file nextest-archive.tar.zst
|
|
||||||
- name: Upload archive to workflow
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: nextest-archive
|
|
||||||
path: rust/nextest-archive.tar.zst
|
|
||||||
run-test-artifacts:
|
|
||||||
name: cargo test (shard ${{ matrix.partitionIndex}})
|
|
||||||
runs-on:
|
|
||||||
- runs-on=${{ github.run_id }}
|
|
||||||
- runner=32cpu-linux-x64
|
|
||||||
- extras=s3-cache
|
|
||||||
needs: build-test-artifacts
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
partitionIndex: [1, 2, 3, 4, 5, 6]
|
|
||||||
partitionTotal: [6]
|
|
||||||
steps:
|
|
||||||
- uses: runs-on/action@v1
|
|
||||||
- uses: actions/create-github-app-token@v1
|
|
||||||
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 }}
|
|
||||||
- name: Use correct Rust toolchain
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
|
||||||
- name: Install Rust
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
cache: false # Configured below.
|
|
||||||
- name: Start Vector
|
|
||||||
run: .github/ci-cd-scripts/start-vector-ubuntu.sh
|
|
||||||
env:
|
|
||||||
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }}
|
|
||||||
OS_NAME: ${{ env.OS_NAME }}
|
|
||||||
- uses: taiki-e/install-action@nextest
|
|
||||||
- name: Download archive
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: nextest-archive
|
|
||||||
- name: Run tests
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |-
|
run: |-
|
||||||
cp nextest-archive.tar.zst rust/nextest-archive.tar.zst
|
|
||||||
ls -lah
|
|
||||||
cd rust
|
cd rust
|
||||||
cargo nextest run \
|
cargo llvm-cov nextest --workspace --lcov --output-path lcov.info --retries=2 --no-fail-fast -P ci 2>&1 | tee /tmp/github-actions.log
|
||||||
--retries=10 --no-fail-fast --profile=ci --archive-file nextest-archive.tar.zst \
|
|
||||||
--partition count:${{ matrix.partitionIndex}}/${{ matrix.partitionTotal }} \
|
|
||||||
2>&1 | tee /tmp/github-actions.log
|
|
||||||
env:
|
env:
|
||||||
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}}
|
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}}
|
||||||
ZOO_HOST: https://api.dev.zoo.dev
|
|
||||||
RUST_MIN_STACK: 10485760000
|
RUST_MIN_STACK: 10485760000
|
||||||
- name: Upload results
|
- name: Upload to codecov.io
|
||||||
if: always()
|
if: steps.path-changes.outputs.outside-kcl-samples == 'true'
|
||||||
run: .github/ci-cd-scripts/upload-results.sh
|
uses: codecov/codecov-action@v5
|
||||||
env:
|
|
||||||
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 }}
|
|
||||||
run-internal-kcl-samples:
|
|
||||||
name: cargo test (internal-kcl-samples)
|
|
||||||
runs-on:
|
|
||||||
- runs-on=${{ github.run_id }}
|
|
||||||
- runner=32cpu-linux-x64
|
|
||||||
- extras=s3-cache
|
|
||||||
steps:
|
|
||||||
- uses: runs-on/action@v1
|
|
||||||
- uses: actions/create-github-app-token@v1
|
|
||||||
id: app-token
|
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
token: ${{secrets.CODECOV_TOKEN}}
|
||||||
private-key: ${{ secrets.MODELING_APP_GH_APP_PRIVATE_KEY }}
|
fail_ci_if_error: true
|
||||||
owner: ${{ github.repository_owner }}
|
flags: rust
|
||||||
- uses: actions/checkout@v4
|
verbose: true
|
||||||
with:
|
files: lcov.info
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
|
||||||
- name: Use correct Rust toolchain
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
|
||||||
- name: Install Rust
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
cache: false # Configured below.
|
|
||||||
- name: Start Vector
|
|
||||||
run: .github/ci-cd-scripts/start-vector-ubuntu.sh
|
|
||||||
env:
|
|
||||||
GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }}
|
|
||||||
OS_NAME: ${{ env.OS_NAME }}
|
|
||||||
- uses: taiki-e/install-action@nextest
|
|
||||||
- name: Download internal KCL samples
|
|
||||||
run: git clone --depth=1 https://x-access-token:${{ secrets.GH_PAT_KCL_SAMPLES_INTERNAL }}@github.com/KittyCAD/kcl-samples-internal public/kcl-samples/internal
|
|
||||||
- name: Run tests
|
|
||||||
shell: bash
|
|
||||||
run: |-
|
|
||||||
cd rust/kcl-lib
|
|
||||||
cargo nextest run \
|
|
||||||
--retries=10 --no-fail-fast --features artifact-graph --profile=ci \
|
|
||||||
internal \
|
|
||||||
2>&1 | tee /tmp/github-actions.log
|
|
||||||
env:
|
|
||||||
TWENTY_TWENTY: overwrite
|
|
||||||
INSTA_UPDATE: always
|
|
||||||
EXPECTORATE: overwrite
|
|
||||||
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN_DEV}}
|
|
||||||
ZOO_HOST: https://api.dev.zoo.dev
|
|
||||||
MODELING_APP_INTERNAL_SAMPLES_SECRET: ${{secrets.MODELING_APP_INTERNAL_SAMPLES_SECRET}}
|
|
||||||
RUST_MIN_STACK: 10485760000
|
|
||||||
run-wasm-tests:
|
|
||||||
name: Run wasm tests
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, macos-latest]
|
|
||||||
fail-fast: false
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Use correct Rust toolchain
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
|
||||||
- name: Install rust
|
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
||||||
with:
|
|
||||||
cache: false # Configured below.
|
|
||||||
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
|
||||||
with:
|
|
||||||
tool: wasm-pack
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: './rust'
|
|
||||||
- name: Build Wasm
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
npm install
|
|
||||||
npm run build:wasm
|
|
||||||
- name: Run wasm tests
|
|
||||||
run: |
|
|
||||||
cd rust
|
|
||||||
cd kcl-wasm-lib
|
|
||||||
#wasm-pack test --headless --chrome
|
|
||||||
env:
|
|
||||||
KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
|
||||||
NODE_ENV: development
|
|
||||||
|
47
.github/workflows/check-exampleKcl.yml
vendored
Normal file
47
.github/workflows/check-exampleKcl.yml
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
name: Check Onboarding KCL
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
paths:
|
||||||
|
- 'src/lib/exampleKcl.ts'
|
||||||
|
- 'public/kcl-samples/bracket/main.kcl'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Comment on PR
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const message = '`public/kcl-samples/bracket/main.kcl` or `src/lib/exampleKcl.ts` has been updated in this PR, please review and update the `src/routes/onboarding`, if needed.';
|
||||||
|
const issue_number = context.payload.pull_request.number;
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
|
const { data: comments } = await github.rest.issues.listComments({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number
|
||||||
|
});
|
||||||
|
|
||||||
|
const commentExists = comments.some(comment => comment.body === message);
|
||||||
|
|
||||||
|
if (!commentExists) {
|
||||||
|
// Post a comment on the PR
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number,
|
||||||
|
body: message,
|
||||||
|
});
|
||||||
|
}
|
216
.github/workflows/e2e-tests.yml
vendored
216
.github/workflows/e2e-tests.yml
vendored
@ -3,6 +3,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
- all-e2e # this bypasses `fixme()` using `orRunWhenFullSuiteEnabled()`
|
||||||
pull_request:
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: 0 * * * * # hourly
|
- cron: 0 * * * * # hourly
|
||||||
@ -18,13 +19,73 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
prepare-wasm:
|
conditions:
|
||||||
# separate job on Ubuntu to build or fetch the wasm blob once on the fastest runner
|
runs-on: ubuntu-latest
|
||||||
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
outputs:
|
||||||
|
significant: ${{ steps.path-changes.outputs.significant }}
|
||||||
|
should-run: ${{ steps.should-run.outputs.should-run }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Fetch the base branch
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
run: git fetch origin ${{ github.base_ref }} --depth=1
|
||||||
|
|
||||||
|
- name: Check for path changes
|
||||||
|
id: path-changes
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Manual runs or push should run all tests.
|
||||||
|
if [[ ${{ github.event_name }} != 'pull_request' ]]; then
|
||||||
|
echo "significant=true" >> $GITHUB_OUTPUT
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
changed_files=$(git diff --name-only origin/${{ github.base_ref }})
|
||||||
|
echo "$changed_files"
|
||||||
|
if grep -Evq '^README.md|^public/kcl-samples/|^rust/kcl-lib/tests/kcl_samples/' <<< "$changed_files" ; then
|
||||||
|
echo "significant=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "significant=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Should run
|
||||||
|
id: should-run
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
# We should run when this is a scheduled run or if there are
|
||||||
|
# significant changes in the diff.
|
||||||
|
if [[ ${{ github.event_name }} == 'schedule' || ${{ steps.path-changes.outputs.significant }} == 'true' ]]; then
|
||||||
|
echo "should-run=true" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "should-run=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Display conditions
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# For debugging purposes
|
||||||
|
set -euo pipefail
|
||||||
|
echo "GITHUB_REF: $GITHUB_REF"
|
||||||
|
echo "GITHUB_HEAD_REF: $GITHUB_HEAD_REF"
|
||||||
|
echo "GITHUB_BASE_REF: $GITHUB_BASE_REF"
|
||||||
|
echo "significant: ${{ steps.path-changes.outputs.significant }}"
|
||||||
|
echo "should-run: ${{ steps.should-run.outputs.should-run }}"
|
||||||
|
|
||||||
|
prepare-wasm:
|
||||||
|
# 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
|
||||||
|
needs: conditions
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
|
|
||||||
- id: filter
|
- id: filter
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
name: Check for Rust changes
|
name: Check for Rust changes
|
||||||
uses: dorny/paths-filter@v3
|
uses: dorny/paths-filter@v3
|
||||||
with:
|
with:
|
||||||
@ -33,16 +94,18 @@ jobs:
|
|||||||
- 'rust/**'
|
- 'rust/**'
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- 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: ${{ needs.conditions.outputs.should-run == 'true' && github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' }}
|
||||||
uses: dawidd6/action-download-artifact@v7
|
uses: dawidd6/action-download-artifact@v7
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
@ -52,8 +115,9 @@ jobs:
|
|||||||
branch: main
|
branch: main
|
||||||
path: rust/kcl-wasm-lib/pkg
|
path: rust/kcl-wasm-lib/pkg
|
||||||
|
|
||||||
- name: Build Wasm condition
|
- name: Build WASM condition
|
||||||
id: wasm
|
id: wasm
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: |
|
run: |
|
||||||
set -euox pipefail
|
set -euox pipefail
|
||||||
# Build wasm if this is a scheduled run, there are Rust changes, or
|
# Build wasm if this is a scheduled run, there are Rust changes, or
|
||||||
@ -65,34 +129,35 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Use correct Rust toolchain
|
- name: Use correct Rust toolchain
|
||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
||||||
|
|
||||||
- name: Install Rust
|
- name: Install rust
|
||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@v1
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
with:
|
with:
|
||||||
cache: false # Configured below.
|
cache: false # Configured below.
|
||||||
|
|
||||||
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
with:
|
with:
|
||||||
tool: wasm-pack
|
tool: wasm-pack
|
||||||
|
|
||||||
- name: Use Rust cache
|
- name: Rust Cache
|
||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
uses: Swatinem/rust-cache@v2
|
uses: Swatinem/rust-cache@v2
|
||||||
with:
|
with:
|
||||||
workspaces: './rust'
|
workspaces: './rust'
|
||||||
|
|
||||||
- name: Build Wasm
|
- name: Build Wasm
|
||||||
if: ${{ steps.wasm.outputs.should-build-wasm == 'true' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && steps.wasm.outputs.should-build-wasm == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: npm run build:wasm
|
run: npm run build:wasm
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
with:
|
with:
|
||||||
name: prepared-wasm
|
name: prepared-wasm
|
||||||
path: |
|
path: |
|
||||||
@ -101,9 +166,10 @@ jobs:
|
|||||||
snapshots:
|
snapshots:
|
||||||
name: playwright:snapshots:ubuntu
|
name: playwright:snapshots:ubuntu
|
||||||
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
|
||||||
needs: [prepare-wasm]
|
needs: [conditions, prepare-wasm]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@v1
|
- uses: actions/create-github-app-token@v1
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
app-id: ${{ secrets.MODELING_APP_GH_APP_ID }}
|
||||||
@ -111,13 +177,16 @@ jobs:
|
|||||||
owner: ${{ github.repository_owner }}
|
owner: ${{ github.repository_owner }}
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.app-token.outputs.token }}
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
name: prepared-wasm
|
name: prepared-wasm
|
||||||
|
|
||||||
- name: Copy prepared Wasm
|
- name: Copy prepared wasm
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
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
|
||||||
@ -125,25 +194,34 @@ jobs:
|
|||||||
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
id: deps-install
|
id: deps-install
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Cache browsers
|
- name: Cache Playwright Browsers
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
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 browsers
|
- name: Install Playwright Browsers
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm run playwright install --with-deps
|
run: npm run playwright install --with-deps
|
||||||
|
|
||||||
- name: Capture snapshots
|
- name: build web
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
|
run: npm run tronb:vite:dev
|
||||||
|
|
||||||
|
- name: Run ubuntu/chrome snapshots
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
uses: nick-fields/retry@v3.0.2
|
uses: nick-fields/retry@v3.0.2
|
||||||
with:
|
with:
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -152,6 +230,7 @@ jobs:
|
|||||||
max_attempts: 5
|
max_attempts: 5
|
||||||
env:
|
env:
|
||||||
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
token: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
|
snapshottoken: ${{ secrets.KITTYCAD_API_TOKEN }}
|
||||||
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 }}
|
||||||
@ -159,7 +238,7 @@ jobs:
|
|||||||
TARGET: web
|
TARGET: web
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: ${{ !cancelled() && (success() || failure()) }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && !cancelled() && (success() || failure()) }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report-ubuntu-snapshot-${{ github.sha }}
|
name: playwright-report-ubuntu-snapshot-${{ github.sha }}
|
||||||
path: playwright-report/
|
path: playwright-report/
|
||||||
@ -167,61 +246,71 @@ jobs:
|
|||||||
retention-days: 30
|
retention-days: 30
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|
||||||
|
- name: Check for changes
|
||||||
|
if: ${{ needs.conditions.outputs.should-run == 'true' && github.ref != 'refs/heads/main' }}
|
||||||
|
shell: bash
|
||||||
|
id: git-check
|
||||||
|
run: |
|
||||||
|
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
|
||||||
|
if git status | grep -q "Changes to be committed"
|
||||||
|
then echo "modified=true" >> $GITHUB_OUTPUT
|
||||||
|
else echo "modified=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Commit changes, if any
|
||||||
|
# TODO: find a more reliable way to detect visual changes
|
||||||
|
if: ${{ false && needs.conditions.outputs.should-run == 'true' && steps.git-check.outputs.modified == 'true' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
||||||
|
git fetch origin
|
||||||
|
echo ${{ github.head_ref }}
|
||||||
|
git checkout ${{ github.head_ref }}
|
||||||
|
git commit -m "A snapshot a day keeps the bugs away! 📷🐛" || true
|
||||||
|
git push
|
||||||
|
git push origin ${{ github.head_ref }}
|
||||||
|
|
||||||
electron:
|
electron:
|
||||||
needs: [prepare-wasm]
|
needs: [conditions, prepare-wasm]
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
env:
|
env:
|
||||||
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}
|
OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}
|
||||||
name: playwright:electron:${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} (shard ${{ matrix.shardIndex }})
|
name: playwright:electron:${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}:${{ matrix.shardIndex }}:${{ matrix.shardTotal }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# TODO: enable namespace-profile-windows-latest once available
|
# TODO: enable namespace-profile-windows-latest once available
|
||||||
include:
|
os:
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
- "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
||||||
shardIndex: 1
|
- namespace-profile-macos-8-cores
|
||||||
shardTotal: 8
|
- windows-latest-8-cores
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
shardIndex: [1, 2, 3, 4]
|
||||||
shardIndex: 2
|
shardTotal: [4]
|
||||||
shardTotal: 8
|
# Disable macos and windows tests on hourly e2e tests since we only care
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
# about server side changes.
|
||||||
shardIndex: 3
|
# Technique from https://github.com/joaomcteixeira/python-project-skeleton/pull/31/files
|
||||||
shardTotal: 8
|
isScheduled:
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
- ${{ github.event_name == 'schedule' }}
|
||||||
shardIndex: 4
|
exclude:
|
||||||
shardTotal: 8
|
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
|
||||||
shardIndex: 5
|
|
||||||
shardTotal: 8
|
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
|
||||||
shardIndex: 6
|
|
||||||
shardTotal: 8
|
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
|
||||||
shardIndex: 7
|
|
||||||
shardTotal: 8
|
|
||||||
- os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64"
|
|
||||||
shardIndex: 8
|
|
||||||
shardTotal: 8
|
|
||||||
- os: namespace-profile-macos-8-cores
|
- os: namespace-profile-macos-8-cores
|
||||||
shardIndex: 1
|
isScheduled: true
|
||||||
shardTotal: 2
|
|
||||||
- os: namespace-profile-macos-8-cores
|
|
||||||
shardIndex: 2
|
|
||||||
shardTotal: 2
|
|
||||||
- os: windows-latest-8-cores
|
- os: windows-latest-8-cores
|
||||||
shardIndex: 1
|
isScheduled: true
|
||||||
shardTotal: 2
|
# TODO: add ref here for main and latest release tag
|
||||||
- os: windows-latest-8-cores
|
|
||||||
shardIndex: 2
|
|
||||||
shardTotal: 2
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
name: prepared-wasm
|
name: prepared-wasm
|
||||||
|
|
||||||
- name: Copy prepared wasm
|
- name: Copy prepared wasm
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
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
|
||||||
@ -229,15 +318,18 @@ jobs:
|
|||||||
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
cp prepared-wasm/kcl_wasm_lib* rust/kcl-wasm-lib/pkg
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
with:
|
with:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
id: deps-install
|
id: deps-install
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|
||||||
- name: Cache Playwright Browsers
|
- name: Cache Playwright Browsers
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
@ -245,20 +337,22 @@ jobs:
|
|||||||
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }}
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm run playwright install --with-deps
|
run: npm run playwright install --with-deps
|
||||||
|
|
||||||
- name: Build web
|
- name: Build web
|
||||||
|
if: needs.conditions.outputs.should-run == 'true'
|
||||||
run: npm run tronb:vite:dev
|
run: npm run tronb:vite:dev
|
||||||
|
|
||||||
- name: Start Vector
|
- name: Start Vector
|
||||||
if: ${{ !contains(matrix.os, 'windows') }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && !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
|
||||||
env:
|
env:
|
||||||
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 }}
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
if: ${{ !cancelled() && (success() || failure()) }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && !cancelled() && (success() || failure()) }}
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
@ -266,7 +360,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Run playwright/electron flow (with retries)
|
- name: Run playwright/electron flow (with retries)
|
||||||
id: retry
|
id: retry
|
||||||
if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }}
|
if: ${{ needs.conditions.outputs.should-run == 'true' && !cancelled() && steps.deps-install.outcome == 'success' }}
|
||||||
uses: nick-fields/retry@v3.0.2
|
uses: nick-fields/retry@v3.0.2
|
||||||
with:
|
with:
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -283,7 +377,7 @@ jobs:
|
|||||||
TARGET: desktop
|
TARGET: desktop
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: ${{ needs.conditions.outputs.should-run == 'true' && always() }}
|
||||||
with:
|
with:
|
||||||
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/
|
||||||
@ -292,7 +386,7 @@ jobs:
|
|||||||
overwrite: true
|
overwrite: true
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: ${{ needs.conditions.outputs.should-run == 'true' && always() }}
|
||||||
with:
|
with:
|
||||||
name: playwright-report-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
name: playwright-report-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }}
|
||||||
path: playwright-report/
|
path: playwright-report/
|
||||||
|
14
.github/workflows/generate-website-docs.yml
vendored
14
.github/workflows/generate-website-docs.yml
vendored
@ -38,13 +38,15 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -p documentation/content/pages/docs/kcl/
|
mkdir -p documentation/content/pages/docs/kcl/
|
||||||
# cleanup old
|
# cleanup old
|
||||||
rm -rf documentation/content/pages/docs/kcl-std
|
rm -rf documentation/content/pages/docs/kcl/*.md
|
||||||
rm -rf documentation/content/pages/docs/kcl-lang
|
rm -rf documentation/content/pages/docs/kcl/types
|
||||||
|
rm -rf documentation/content/pages/docs/kcl/settings
|
||||||
|
rm -rf documentation/content/pages/docs/kcl/consts
|
||||||
# move new
|
# move new
|
||||||
mv -f docs/kcl-std documentation/content/pages/docs
|
mv -f docs/kcl/*.md documentation/content/pages/docs/kcl/
|
||||||
mv -f docs/kcl-lang documentation/content/pages/docs
|
mv -f docs/kcl/types documentation/content/pages/docs/kcl/
|
||||||
# We don't need the README
|
mv -f docs/kcl/settings documentation/content/pages/docs/kcl/
|
||||||
rm documentation/content/pages/docs/kcl-std/README.md
|
mv -f docs/kcl/consts documentation/content/pages/docs/kcl/
|
||||||
- name: move kcl-samples
|
- name: move kcl-samples
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
61
.github/workflows/kcl-language-server.yml
vendored
61
.github/workflows/kcl-language-server.yml
vendored
@ -21,11 +21,14 @@ on:
|
|||||||
- '**.rs'
|
- '**.rs'
|
||||||
- .github/workflows/kcl-language-server.yml
|
- .github/workflows/kcl-language-server.yml
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_INCREMENTAL: 0
|
CARGO_INCREMENTAL: 0
|
||||||
CARGO_NET_RETRY: 10
|
CARGO_NET_RETRY: 10
|
||||||
@ -35,9 +38,10 @@ env:
|
|||||||
MACOSX_DEPLOYMENT_TARGET: 10.15
|
MACOSX_DEPLOYMENT_TARGET: 10.15
|
||||||
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
||||||
CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc
|
CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
name: kcl-language-server (vscode tests)
|
name: vscode tests
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@ -73,7 +77,8 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
target: x86_64-pc-windows-msvc
|
target: x86_64-pc-windows-msvc
|
||||||
code-target: win32-x64
|
code-target:
|
||||||
|
win32-x64
|
||||||
#- os: windows-latest
|
#- os: windows-latest
|
||||||
#target: i686-pc-windows-msvc
|
#target: i686-pc-windows-msvc
|
||||||
#code-target:
|
#code-target:
|
||||||
@ -83,7 +88,8 @@ jobs:
|
|||||||
#code-target: win32-arm64
|
#code-target: win32-arm64
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
target: x86_64-unknown-linux-gnu
|
target: x86_64-unknown-linux-gnu
|
||||||
code-target: linux-x64
|
code-target:
|
||||||
|
linux-x64
|
||||||
#- os: ubuntu-latest
|
#- os: ubuntu-latest
|
||||||
#target: aarch64-unknown-linux-musl
|
#target: aarch64-unknown-linux-musl
|
||||||
#code-target: linux-arm64
|
#code-target: linux-arm64
|
||||||
@ -99,33 +105,41 @@ jobs:
|
|||||||
- os: macos-latest
|
- os: macos-latest
|
||||||
target: aarch64-apple-darwin
|
target: aarch64-apple-darwin
|
||||||
code-target: darwin-arm64
|
code-target: darwin-arm64
|
||||||
name: kcl-language-server build-release (${{ matrix.target }})
|
|
||||||
|
name: build-release (${{ matrix.target }})
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
container: ${{ matrix.container }}
|
container: ${{ matrix.container }}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RA_TARGET: ${{ matrix.target }}
|
RA_TARGET: ${{ matrix.target }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: ${{ env.FETCH_DEPTH }}
|
fetch-depth: ${{ env.FETCH_DEPTH }}
|
||||||
|
|
||||||
- name: Use correct Rust toolchain
|
- name: Use correct Rust toolchain
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
rm rust/rust-toolchain.toml
|
rm rust/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: rust
|
cache: rust
|
||||||
components: rust-src
|
components: rust-src
|
||||||
target: ${{ matrix.target }}
|
target: ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Install Node.js
|
- name: Install Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
|
|
||||||
- name: Update apt repositories
|
- name: Update apt repositories
|
||||||
if: matrix.target == 'aarch64-unknown-linux-gnu' || matrix.target == 'arm-unknown-linux-gnueabihf' || matrix.os == 'ubuntu-latest'
|
if: matrix.target == 'aarch64-unknown-linux-gnu' || matrix.target == 'arm-unknown-linux-gnueabihf' || matrix.os == 'ubuntu-latest'
|
||||||
run: sudo apt-get update
|
run: sudo apt-get update
|
||||||
|
|
||||||
- if: ${{ matrix.os == 'ubuntu-latest' }}
|
- if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||||
name: Install deps
|
name: Install deps
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -150,53 +164,64 @@ jobs:
|
|||||||
zlib1g-dev
|
zlib1g-dev
|
||||||
|
|
||||||
cargo install cross
|
cargo install cross
|
||||||
|
|
||||||
- name: Install AArch64 target toolchain
|
- name: Install AArch64 target toolchain
|
||||||
if: matrix.target == 'aarch64-unknown-linux-gnu'
|
if: matrix.target == 'aarch64-unknown-linux-gnu'
|
||||||
run: sudo apt-get install gcc-aarch64-linux-gnu
|
run: sudo apt-get install gcc-aarch64-linux-gnu
|
||||||
|
|
||||||
- name: Install ARM target toolchain
|
- name: Install ARM target toolchain
|
||||||
if: matrix.target == 'arm-unknown-linux-gnueabihf'
|
if: matrix.target == 'arm-unknown-linux-gnueabihf'
|
||||||
run: sudo apt-get install gcc-arm-linux-gnueabihf
|
run: sudo apt-get install gcc-arm-linux-gnueabihf
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
run: |
|
run: |
|
||||||
cd rust
|
cd rust
|
||||||
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
|
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
# npm will symlink which will cause issues w tarballing later
|
# npm will symlink which will cause issues w tarballing later
|
||||||
yarn install
|
yarn install
|
||||||
|
|
||||||
- name: Package Extension (release)
|
- name: Package Extension (release)
|
||||||
if: startsWith(github.event.ref, 'refs/tags/')
|
if: startsWith(github.event.ref, 'refs/tags/')
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }}
|
npx vsce package --yarn -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }}
|
||||||
|
|
||||||
- name: Package Extension (nightly)
|
- name: Package Extension (nightly)
|
||||||
if: startsWith(github.event.ref, 'refs/tags/') == false
|
if: startsWith(github.event.ref, 'refs/tags/') == false
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} --pre-release
|
npx vsce package --yarn -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} --pre-release
|
||||||
|
|
||||||
- name: remove server
|
- name: remove server
|
||||||
if: matrix.target == 'x86_64-unknown-linux-gnu'
|
if: matrix.target == 'x86_64-unknown-linux-gnu'
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
rm -rf server
|
rm -rf server
|
||||||
|
|
||||||
- name: Package Extension (no server, release)
|
- name: Package Extension (no server, release)
|
||||||
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/')
|
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/')
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o ../build/kcl-language-server-no-server.vsix
|
npx vsce package --yarn -o ../build/kcl-language-server-no-server.vsix
|
||||||
|
|
||||||
- name: Package Extension (no server, nightly)
|
- name: Package Extension (no server, nightly)
|
||||||
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/') == false
|
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/') == false
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o ../build/kcl-language-server-no-server.vsix --pre-release
|
npx vsce package --yarn -o ../build/kcl-language-server-no-server.vsix --pre-release
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: release-${{ matrix.target }}
|
name: release-${{ matrix.target }}
|
||||||
path: ./rust/build
|
path: ./rust/build
|
||||||
|
|
||||||
build-release-x86_64-unknown-linux-musl:
|
build-release-x86_64-unknown-linux-musl:
|
||||||
name: kcl-language-server build-release (x86_64-unknown-linux-musl)
|
name: build-release (x86_64-unknown-linux-musl)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
RA_TARGET: x86_64-unknown-linux-musl
|
RA_TARGET: x86_64-unknown-linux-musl
|
||||||
@ -206,6 +231,7 @@ jobs:
|
|||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
volumes:
|
volumes:
|
||||||
- /usr/local/cargo/registry:/usr/local/cargo/registry
|
- /usr/local/cargo/registry:/usr/local/cargo/registry
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@ -219,46 +245,55 @@ jobs:
|
|||||||
nodejs \
|
nodejs \
|
||||||
npm \
|
npm \
|
||||||
yarn
|
yarn
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: ${{ env.FETCH_DEPTH }}
|
fetch-depth: ${{ env.FETCH_DEPTH }}
|
||||||
|
|
||||||
- name: Use correct Rust toolchain
|
- name: Use correct Rust toolchain
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
rm rust/rust-toolchain.toml
|
rm rust/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: rust
|
cache: rust
|
||||||
components: rust-src
|
components: rust-src
|
||||||
target: ${{ matrix.target }}
|
target: ${{ matrix.target }}
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
run: |
|
run: |
|
||||||
cd rust
|
cd rust
|
||||||
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
|
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
# npm will symlink which will cause issues w tarballing later
|
# npm will symlink which will cause issues w tarballing later
|
||||||
yarn install
|
yarn install
|
||||||
|
|
||||||
- name: Package Extension (release)
|
- name: Package Extension (release)
|
||||||
if: startsWith(github.event.ref, 'refs/tags/')
|
if: startsWith(github.event.ref, 'refs/tags/')
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64
|
npx vsce package --yarn -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64
|
||||||
|
|
||||||
- name: Package Extension (release)
|
- name: Package Extension (release)
|
||||||
if: startsWith(github.event.ref, 'refs/tags/') == false
|
if: startsWith(github.event.ref, 'refs/tags/') == false
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce package --yarn -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64 --pre-release
|
npx vsce package --yarn -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64 --pre-release
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: release-x86_64-unknown-linux-musl
|
name: release-x86_64-unknown-linux-musl
|
||||||
path: ./rust/build
|
path: ./rust/build
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
name: kcl-language-server (publish)
|
name: publish
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: ["build-release", "build-release-x86_64-unknown-linux-musl"]
|
needs: ["build-release", "build-release-x86_64-unknown-linux-musl"]
|
||||||
if: startsWith(github.event.ref, 'refs/tags')
|
if: startsWith(github.event.ref, 'refs/tags')
|
||||||
@ -266,17 +301,22 @@ jobs:
|
|||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
- run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- run: 'echo "TAG: $TAG"'
|
- run: 'echo "TAG: $TAG"'
|
||||||
|
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: ${{ env.FETCH_DEPTH }}
|
fetch-depth: ${{ env.FETCH_DEPTH }}
|
||||||
|
|
||||||
- name: Install Nodejs
|
- name: Install Nodejs
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
|
|
||||||
- run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
|
- run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
|
||||||
- run: 'echo "HEAD_SHA: $HEAD_SHA"'
|
- run: 'echo "HEAD_SHA: $HEAD_SHA"'
|
||||||
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: release-aarch64-apple-darwin
|
name: release-aarch64-apple-darwin
|
||||||
@ -304,7 +344,8 @@ jobs:
|
|||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: release-x86_64-pc-windows-msvc
|
name: release-x86_64-pc-windows-msvc
|
||||||
path: rust/build
|
path:
|
||||||
|
rust/build
|
||||||
#- uses: actions/download-artifact@v4
|
#- uses: actions/download-artifact@v4
|
||||||
#with:
|
#with:
|
||||||
#name: release-i686-pc-windows-msvc
|
#name: release-i686-pc-windows-msvc
|
||||||
@ -315,18 +356,21 @@ jobs:
|
|||||||
#name: release-aarch64-pc-windows-msvc
|
#name: release-aarch64-pc-windows-msvc
|
||||||
#path: rust/build
|
#path: rust/build
|
||||||
- run: ls -al ./rust/build
|
- run: ls -al ./rust/build
|
||||||
|
|
||||||
- name: Publish Release
|
- name: Publish Release
|
||||||
uses: ./.github/actions/github-release
|
uses: ./.github/actions/github-release
|
||||||
with:
|
with:
|
||||||
files: "rust/build/*"
|
files: "rust/build/*"
|
||||||
name: ${{ env.TAG }}
|
name: ${{ env.TAG }}
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: move files to dir for upload
|
- name: move files to dir for upload
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd rust
|
cd rust
|
||||||
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.8"
|
||||||
with:
|
with:
|
||||||
@ -341,12 +385,15 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: rust/releases
|
path: rust/releases
|
||||||
destination: dl.kittycad.io
|
destination: dl.kittycad.io
|
||||||
|
|
||||||
- run: rm rust/build/kcl-language-server-no-server.vsix
|
- run: rm rust/build/kcl-language-server-no-server.vsix
|
||||||
|
|
||||||
- name: Publish Extension (Code Marketplace, release)
|
- name: Publish Extension (Code Marketplace, release)
|
||||||
# token from https://dev.azure.com/kcl-language-server/
|
# token from https://dev.azure.com/kcl-language-server/
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
npx vsce publish --pat ${{ secrets.VSCE_PAT }} --packagePath ../build/kcl-language-server-*.vsix
|
npx vsce publish --pat ${{ secrets.VSCE_PAT }} --packagePath ../build/kcl-language-server-*.vsix
|
||||||
|
|
||||||
- name: Publish Extension (OpenVSX, release)
|
- name: Publish Extension (OpenVSX, release)
|
||||||
run: |
|
run: |
|
||||||
cd rust/kcl-language-server
|
cd rust/kcl-language-server
|
||||||
|
17
.github/workflows/kcl-python-bindings.yml
vendored
17
.github/workflows/kcl-python-bindings.yml
vendored
@ -4,6 +4,7 @@
|
|||||||
# maturin generate-ci github
|
# maturin generate-ci github
|
||||||
#
|
#
|
||||||
name: kcl-python-bindings
|
name: kcl-python-bindings
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@ -26,14 +27,16 @@ on:
|
|||||||
- '**.rs'
|
- '**.rs'
|
||||||
- .github/workflows/kcl-python-bindings.yml
|
- .github/workflows/kcl-python-bindings.yml
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux-x86_64:
|
linux-x86_64:
|
||||||
name: kcl-python-bindings (linux-x86_64)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@ -55,8 +58,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: wheels-linux-x86_64
|
name: wheels-linux-x86_64
|
||||||
path: rust/kcl-python-bindings/dist
|
path: rust/kcl-python-bindings/dist
|
||||||
|
|
||||||
windows:
|
windows:
|
||||||
name: kcl-python-bindings (windows)
|
|
||||||
runs-on: windows-16-cores
|
runs-on: windows-16-cores
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@ -81,8 +84,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: wheels-windows-${{ matrix.target }}
|
name: wheels-windows-${{ matrix.target }}
|
||||||
path: rust/kcl-python-bindings/dist
|
path: rust/kcl-python-bindings/dist
|
||||||
|
|
||||||
macos:
|
macos:
|
||||||
name: kcl-python-bindings (macos)
|
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@ -107,8 +110,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: wheels-macos-${{ matrix.target }}
|
name: wheels-macos-${{ matrix.target }}
|
||||||
path: rust/kcl-python-bindings/dist
|
path: rust/kcl-python-bindings/dist
|
||||||
|
|
||||||
test:
|
test:
|
||||||
name: kcl-python-bindings (test)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@ -122,10 +125,9 @@ jobs:
|
|||||||
just setup-uv
|
just setup-uv
|
||||||
just test
|
just test
|
||||||
env:
|
env:
|
||||||
KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN }}
|
||||||
ZOO_HOST: https://api.dev.zoo.dev
|
|
||||||
sdist:
|
sdist:
|
||||||
name: kcl-python-bindings (sdist)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@ -148,6 +150,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: wheels-sdist
|
name: wheels-sdist
|
||||||
path: rust/kcl-python-bindings/dist
|
path: rust/kcl-python-bindings/dist
|
||||||
|
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
168
.github/workflows/static-analysis.yml
vendored
168
.github/workflows/static-analysis.yml
vendored
@ -28,7 +28,53 @@ jobs:
|
|||||||
- run: npm run fmt:check
|
- run: npm run fmt:check
|
||||||
|
|
||||||
npm-build-wasm:
|
npm-build-wasm:
|
||||||
uses: ./.github/workflows/build-wasm.yml
|
# Build the wasm blob once on the fastest runner.
|
||||||
|
runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Use correct Rust toolchain
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
[ -e rust-toolchain.toml ] || cp rust/rust-toolchain.toml ./
|
||||||
|
|
||||||
|
- name: Install rust
|
||||||
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
|
with:
|
||||||
|
cache: false # Configured below.
|
||||||
|
|
||||||
|
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
||||||
|
with:
|
||||||
|
tool: wasm-pack
|
||||||
|
|
||||||
|
- name: Rust Cache
|
||||||
|
uses: Swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
workspaces: './rust'
|
||||||
|
|
||||||
|
- name: Build Wasm
|
||||||
|
shell: bash
|
||||||
|
run: npm run build:wasm
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: prepared-wasm
|
||||||
|
path: |
|
||||||
|
rust/kcl-wasm-lib/pkg/kcl_wasm_lib*
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: prepared-ts-rs-bindings
|
||||||
|
path: |
|
||||||
|
rust/kcl-lib/bindings/*
|
||||||
|
|
||||||
npm-tsc:
|
npm-tsc:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -125,5 +171,123 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
- name: Install codespell
|
||||||
|
run: |
|
||||||
|
python -m pip install codespell
|
||||||
- name: Run codespell
|
- name: Run codespell
|
||||||
uses: crate-ci/typos@v1.32.0
|
run: codespell --config .codespellrc # Edit this file to tweak the typo list and other configuration.
|
||||||
|
|
||||||
|
npm-unit-test-kcl-samples:
|
||||||
|
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
|
||||||
|
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
||||||
|
with:
|
||||||
|
tool: wasm-pack
|
||||||
|
|
||||||
|
- 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 simpleserver:bg
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
|
||||||
|
- name: Install Chromium Browser
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
run: npm run playwright install chromium --with-deps
|
||||||
|
|
||||||
|
- name: run unit tests for kcl samples
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
run: npm run test:unit:kcl-samples
|
||||||
|
env:
|
||||||
|
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
|
|
||||||
|
npm-unit-test:
|
||||||
|
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
|
||||||
|
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
||||||
|
with:
|
||||||
|
tool: wasm-pack
|
||||||
|
|
||||||
|
- 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 simpleserver:bg
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
|
||||||
|
- name: Install Chromium Browser
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
run: npm run playwright install chromium --with-deps
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
run: xvfb-run -a npm run test:unit
|
||||||
|
env:
|
||||||
|
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
||||||
|
|
||||||
|
- name: Check for changes
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
||||||
|
id: git-check
|
||||||
|
run: |
|
||||||
|
git add src/lang/std/artifactMapGraphs
|
||||||
|
if git status src/lang/std/artifactMapGraphs | grep -q "Changes to be committed"
|
||||||
|
then echo "modified=true" >> $GITHUB_OUTPUT
|
||||||
|
else echo "modified=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
- name: Commit changes, if any
|
||||||
|
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' && steps.git-check.outputs.modified == 'true' }}
|
||||||
|
run: |
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
||||||
|
git fetch origin
|
||||||
|
echo ${{ github.head_ref }}
|
||||||
|
git checkout ${{ github.head_ref }}
|
||||||
|
# TODO when webkit works on ubuntu remove the os part of the commit message
|
||||||
|
git commit -am "Look at this (photo)Graph *in the voice of Nickelback*" || true
|
||||||
|
git push
|
||||||
|
git push origin ${{ github.head_ref }}
|
||||||
|
39
.github/workflows/tag-nightly.yml
vendored
Normal file
39
.github/workflows/tag-nightly.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
name: tag-nightly
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 4 * * *'
|
||||||
|
# Daily at 04:00 AM UTC
|
||||||
|
# Will checkout the last commit from the default branch (main as of 2023-10-04)
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag-nightly:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
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/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- run: npm install
|
||||||
|
|
||||||
|
- name: Push tag
|
||||||
|
run: |
|
||||||
|
VERSION_NO_V=$(date +'%-y.%-m.%-d')
|
||||||
|
TAG="nightly-v$VERSION_NO_V"
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git tag $TAG
|
||||||
|
git push origin tag $TAG
|
124
.github/workflows/unit-tests.yml
vendored
124
.github/workflows/unit-tests.yml
vendored
@ -1,124 +0,0 @@
|
|||||||
name: Unit Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
actions: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
npm-build-wasm:
|
|
||||||
uses: ./.github/workflows/build-wasm.yml
|
|
||||||
|
|
||||||
npm-test-unit:
|
|
||||||
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
|
|
||||||
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
|
||||||
with:
|
|
||||||
tool: wasm-pack
|
|
||||||
|
|
||||||
- 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 simpleserver:bg
|
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
|
||||||
|
|
||||||
- name: Install Chromium Browser
|
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
|
||||||
run: npm run playwright install chromium --with-deps
|
|
||||||
|
|
||||||
- name: Run unit tests
|
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
|
||||||
run: xvfb-run -a npm run test:unit
|
|
||||||
env:
|
|
||||||
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}
|
|
||||||
|
|
||||||
- name: Check for changes
|
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
|
|
||||||
id: git-check
|
|
||||||
run: |
|
|
||||||
git add src/lang/std/artifactMapGraphs
|
|
||||||
if git status src/lang/std/artifactMapGraphs | grep -q "Changes to be committed"
|
|
||||||
then echo "modified=true" >> $GITHUB_OUTPUT
|
|
||||||
else echo "modified=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Commit changes, if any
|
|
||||||
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' && steps.git-check.outputs.modified == 'true' }}
|
|
||||||
run: |
|
|
||||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git config --local user.name "github-actions[bot]"
|
|
||||||
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
|
|
||||||
git fetch origin
|
|
||||||
echo ${{ github.head_ref }}
|
|
||||||
git checkout ${{ github.head_ref }}
|
|
||||||
# TODO when webkit works on ubuntu remove the os part of the commit message
|
|
||||||
git commit -am "Look at this (photo)Graph *in the voice of Nickelback*" || true
|
|
||||||
git push
|
|
||||||
git push origin ${{ github.head_ref }}
|
|
||||||
|
|
||||||
npm-test-unit-components:
|
|
||||||
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
|
|
||||||
- uses: taiki-e/install-action@d4635f2de61c8b8104d59cd4aede2060638378cc
|
|
||||||
with:
|
|
||||||
tool: wasm-pack
|
|
||||||
|
|
||||||
- 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/
|
|
||||||
|
|
||||||
- name: Run component tests
|
|
||||||
run: npm run test:unit:components
|
|
45
.github/workflows/update-e2e-branch.yml
vendored
Normal file
45
.github/workflows/update-e2e-branch.yml
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
name: update-e2e-branch
|
||||||
|
|
||||||
|
# This is used to sync the `all-e2e` branch with the `main` branch for the
|
||||||
|
# logic in the test utility `orRunWhenFullSuiteEnabled()` that allows all e2e
|
||||||
|
# tests to run on a particular branch to analyze failures metrics in Axiom.
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 * * * *' # runs every hour
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-branch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
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 }}
|
||||||
|
|
||||||
|
- name: Sync with main
|
||||||
|
run: |
|
||||||
|
# Create the branch
|
||||||
|
git checkout all-e2e || git checkout -b all-e2e
|
||||||
|
|
||||||
|
# Reset to main
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main
|
||||||
|
|
||||||
|
# Get a new SHA to prevent overwriting the commit status on main
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git commit --allow-empty --message="[all-e2e] $(git log --max-count=1 --pretty=%B)"
|
||||||
|
|
||||||
|
# Overwrite the branch
|
||||||
|
git remote set-url origin https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/${{ github.repository }}.git
|
||||||
|
git push --force origin all-e2e
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -58,8 +58,6 @@ trace.zip
|
|||||||
/public/kcl-samples/.github
|
/public/kcl-samples/.github
|
||||||
/public/kcl-samples/screenshots/main.kcl
|
/public/kcl-samples/screenshots/main.kcl
|
||||||
/public/kcl-samples/step/main.kcl
|
/public/kcl-samples/step/main.kcl
|
||||||
/public/kcl-samples/internal
|
|
||||||
/rust/kcl-lib/tests/kcl_samples/internal
|
|
||||||
/test-results/
|
/test-results/
|
||||||
/playwright-report/
|
/playwright-report/
|
||||||
/blob-report/
|
/blob-report/
|
||||||
@ -87,4 +85,3 @@ venv
|
|||||||
|
|
||||||
.vscode-test
|
.vscode-test
|
||||||
.biome/
|
.biome/
|
||||||
.million
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
npm run fmt
|
|
4
.husky/pre-push
Executable file
4
.husky/pre-push
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npm run fmt-check
|
151
CONTRIBUTING.md
151
CONTRIBUTING.md
@ -63,7 +63,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 `dev.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.
|
||||||
|
|
||||||
### Developing in Chrome
|
### Developing in Chrome
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ The following will need to be run when checking out a new commit and guarantees
|
|||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
npm run build:wasm
|
npm run build:wasm
|
||||||
npm start
|
npm start # or npm run build:local && npm run serve for slower but more production-like build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Before submitting a PR
|
## Before submitting a PR
|
||||||
@ -130,7 +130,7 @@ git tag $VERSION
|
|||||||
git push origin --tags
|
git push origin --tags
|
||||||
```
|
```
|
||||||
|
|
||||||
This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files.
|
This will trigger the `build-apps` workflow, set the version, build & sign the apps, and generate release files as well as updater-test artifacts.
|
||||||
|
|
||||||
The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush)).
|
The workflow should be listed right away [in this list](https://github.com/KittyCAD/modeling-app/actions/workflows/build-apps.yml?query=event%3Apush)).
|
||||||
|
|
||||||
@ -142,10 +142,13 @@ The release builds can be found under the `out-{arch}-{platform}` zip files, at
|
|||||||
|
|
||||||
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.
|
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
|
##### Updater-test builds
|
||||||
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.
|
The other `build-apps` output in the release `build-apps` workflow (triggered by 2.) is `updater-test-{arch}-{platform}`. It's a semi-automated process: for macOS, Windows, and Linux, download the corresponding updater-test artifact file, install the app, run it, expect an updater prompt to a dummy v0.255.255, install it and check that the app comes back at that version.
|
||||||
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.
|
|
||||||
|
The only difference with these builds is that they point to a different update location on the release bucket, with this dummy v0.255.255 always available. This helps ensuring that the version we release will be able to update to the next one available.
|
||||||
|
|
||||||
|
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 (or the updater-test location in the storage bucket).
|
||||||
|
|
||||||
```
|
```
|
||||||
# Windows (PowerShell)
|
# Windows (PowerShell)
|
||||||
@ -195,9 +198,15 @@ For more information on fuzzing you can check out
|
|||||||
|
|
||||||
### Playwright tests
|
### Playwright tests
|
||||||
|
|
||||||
Prepare these system dependencies:
|
You will need a `./e2e/playwright/playwright-secrets.env` file:
|
||||||
|
|
||||||
- Set $token from https://zoo.dev/account/api-tokens
|
```bash
|
||||||
|
$ touch ./e2e/playwright/playwright-secrets.env
|
||||||
|
$ cat ./e2e/playwright/playwright-secrets.env
|
||||||
|
token=<dev.zoo.dev/account/api-tokens>
|
||||||
|
snapshottoken=<zoo.dev/account/api-tokens>
|
||||||
|
```
|
||||||
|
or use `export` to set the environment variables `token` and `snapshottoken`.
|
||||||
|
|
||||||
#### Snapshot tests (Google Chrome on Ubuntu only)
|
#### Snapshot tests (Google Chrome on Ubuntu only)
|
||||||
|
|
||||||
@ -291,17 +300,131 @@ Which will run our suite of [Vitest unit](https://vitest.dev/) and [React Testin
|
|||||||
|
|
||||||
### Rust tests
|
### Rust tests
|
||||||
|
|
||||||
Prepare these system dependencies:
|
**Dependencies**
|
||||||
|
|
||||||
- Set `$KITTYCAD_API_TOKEN` from https://zoo.dev/account/api-tokens
|
- `KITTYCAD_API_TOKEN`
|
||||||
- Install `just` following [these instructions](https://just.systems/man/en/packages.html)
|
- `cargo-nextest`
|
||||||
|
- `just`
|
||||||
|
|
||||||
then run tests that target the KCL language:
|
#### Setting KITTYCAD_API_TOKEN
|
||||||
|
|
||||||
|
Use the production zoo.dev token, set this environment variable before running the tests
|
||||||
|
|
||||||
|
#### Installing cargonextest
|
||||||
|
|
||||||
```
|
```
|
||||||
npm run test:rust
|
cd rust
|
||||||
|
cargo search cargo-nextest
|
||||||
|
cargo install cargo-nextest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### just
|
||||||
|
|
||||||
|
install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-binaries)
|
||||||
|
|
||||||
|
#### Running the tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# With just
|
||||||
|
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
|
||||||
|
# Make sure you installed cargo-nextest
|
||||||
|
# Make sure you installed just
|
||||||
|
cd rust
|
||||||
|
just test
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Without just
|
||||||
|
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
|
||||||
|
# Make sure you installed cargo-nextest
|
||||||
|
cd rust
|
||||||
|
export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `XXX` is an API token from the production engine (NOT the dev environment).
|
||||||
|
|
||||||
|
We recommend using [nextest](https://nexte.st/) to run the Rust tests (its faster and is used in CI). Once installed, run the tests using
|
||||||
|
|
||||||
|
```
|
||||||
|
cd rust
|
||||||
|
KITTYCAD_API_TOKEN=XXX cargo run nextest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mapping CI CD jobs to local commands
|
||||||
|
|
||||||
|
When you see the CI CD fail on jobs you may wonder three things
|
||||||
|
|
||||||
|
- Do I have a bug in my code?
|
||||||
|
- Is the test flaky?
|
||||||
|
- Is there a bug in `main`?
|
||||||
|
|
||||||
|
To answer these questions the following commands will give you confidence to locate the issue.
|
||||||
|
|
||||||
|
#### Static Analysis
|
||||||
|
|
||||||
|
Part of the CI CD pipeline performs static analysis on the code. Use the following commands to mimic the CI CD jobs.
|
||||||
|
|
||||||
|
The following set of commands should get us closer to one and done commands to instantly retest issues.
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run test-setup
|
||||||
|
```
|
||||||
|
|
||||||
|
> Gotcha, are packages up to date and is the wasm built?
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run tsc
|
||||||
|
npm run fmt:check
|
||||||
|
npm run lint
|
||||||
|
npm run test:unit:local
|
||||||
|
```
|
||||||
|
|
||||||
|
> Gotcha: Our unit tests have integration tests in them. You need to run a localhost server to run the unit tests.
|
||||||
|
|
||||||
|
#### E2E Tests
|
||||||
|
|
||||||
|
**Playwright Electron**
|
||||||
|
|
||||||
|
These E2E tests run in electron. There are tests that are skipped if they are ran in a windows, linux, or macos environment. We can use playwright tags to implement test skipping.
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run test:playwright:electron:local
|
||||||
|
npm run test:playwright:electron:windows:local
|
||||||
|
npm run test:playwright:electron:macos:local
|
||||||
|
npm run test:playwright:electron:ubuntu:local
|
||||||
|
```
|
||||||
|
|
||||||
|
> Why does it say local? The CI CD commands that run in the pipeline cannot be ran locally. A single command will not properly setup the testing environment locally.
|
||||||
|
|
||||||
|
#### Some notes on CI
|
||||||
|
|
||||||
|
The tests are broken into snapshot tests and non-snapshot tests, and they run in that order, they automatically commit new snap shots, so if you see an image commit check it was an intended change. If we have non-determinism in the snapshots such that they are always committing new images, hopefully this annoyance makes us fix them asap, if you notice this happening let Kurt know. But for the odd occasion `git reset --hard HEAD~ && git push -f` is your friend.
|
||||||
|
|
||||||
|
How to interpret failing playwright tests?
|
||||||
|
If your tests fail, click through to the action and see that the tests failed on a line that includes `await page.getByTestId('loading').waitFor({ state: 'detached' })`, this means the test fail because the stream never started. It's you choice if you want to re-run the test, or ignore the failure.
|
||||||
|
|
||||||
|
We run on ubuntu and macos, because safari doesn't work on linux because of the dreaded "no RTCPeerConnection variable" error. But linux runs first and then macos for the same reason that we limit the number of parallel tests to 1 because we limit stream connections per user, so tests would start failing we if let them run together.
|
||||||
|
|
||||||
|
If something fails on CI you can download the artifact, unzip it and then open `playwright-report/data/<UUID>.zip` with https://trace.playwright.dev/ to see what happened.
|
||||||
|
|
||||||
|
#### Getting started writing a playwright test in our app
|
||||||
|
|
||||||
|
Besides following the instructions above and using the playwright docs, our app is weird because of the whole stream thing, which means our testing is weird. Because we've just figured out this stuff and therefore docs might go stale quick here's a 15min vid/tutorial
|
||||||
|
|
||||||
|
https://github.com/KittyCAD/modeling-app/assets/29681384/6f5e8e85-1003-4fd9-be7f-f36ce833942d
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary>
|
||||||
|
PS: for the debug panel, the following JSON is useful for snapping the camera
|
||||||
|
</summary>
|
||||||
|
|
||||||
|
```JSON
|
||||||
|
{"type":"modeling_cmd_req","cmd_id":"054e5472-e5e9-4071-92d7-1ce3bac61956","cmd":{"type":"default_camera_look_at","center":{"x":15,"y":0,"z":0},"up":{"x":0,"y":0,"z":1},"vantage":{"x":30,"y":30,"z":30}}}
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
### 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`.
|
||||||
|
26
Makefile
26
Makefile
@ -1,5 +1,5 @@
|
|||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: install check build
|
all: install build check
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# INSTALL
|
# INSTALL
|
||||||
@ -23,7 +23,6 @@ endif
|
|||||||
install: node_modules/.package-lock.json $(CARGO) $(WASM_PACK) ## Install dependencies
|
install: node_modules/.package-lock.json $(CARGO) $(WASM_PACK) ## Install dependencies
|
||||||
|
|
||||||
node_modules/.package-lock.json: package.json package-lock.json
|
node_modules/.package-lock.json: package.json package-lock.json
|
||||||
npm prune
|
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
$(CARGO):
|
$(CARGO):
|
||||||
@ -44,7 +43,6 @@ endif
|
|||||||
# BUILD
|
# BUILD
|
||||||
|
|
||||||
CARGO_SOURCES := rust/.cargo/config.toml $(wildcard rust/Cargo.*) $(wildcard rust/**/Cargo.*)
|
CARGO_SOURCES := rust/.cargo/config.toml $(wildcard rust/Cargo.*) $(wildcard rust/**/Cargo.*)
|
||||||
KCL_SOURCES := $(wildcard public/kcl-samples/**/*.kcl)
|
|
||||||
RUST_SOURCES := $(wildcard rust/**/*.rs)
|
RUST_SOURCES := $(wildcard rust/**/*.rs)
|
||||||
|
|
||||||
REACT_SOURCES := $(wildcard src/*.tsx) $(wildcard src/**/*.tsx)
|
REACT_SOURCES := $(wildcard src/*.tsx) $(wildcard src/**/*.tsx)
|
||||||
@ -52,7 +50,13 @@ TYPESCRIPT_SOURCES := tsconfig.* $(wildcard src/*.ts) $(wildcard src/**/*.ts)
|
|||||||
VITE_SOURCES := $(wildcard vite.*) $(wildcard vite/**/*.tsx)
|
VITE_SOURCES := $(wildcard vite.*) $(wildcard vite/**/*.tsx)
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: install public/kcl_wasm_lib_bg.wasm public/kcl-samples/manifest.json .vite/build/main.js
|
build: build-web build-desktop
|
||||||
|
|
||||||
|
.PHONY: build-web
|
||||||
|
build-web: install public/kcl_wasm_lib_bg.wasm build/index.html
|
||||||
|
|
||||||
|
.PHONY: build-desktop
|
||||||
|
build-desktop: install public/kcl_wasm_lib_bg.wasm .vite/build/main.js
|
||||||
|
|
||||||
public/kcl_wasm_lib_bg.wasm: $(CARGO_SOURCES) $(RUST_SOURCES)
|
public/kcl_wasm_lib_bg.wasm: $(CARGO_SOURCES) $(RUST_SOURCES)
|
||||||
ifdef WINDOWS
|
ifdef WINDOWS
|
||||||
@ -61,8 +65,8 @@ else
|
|||||||
npm run build:wasm:dev
|
npm run build:wasm:dev
|
||||||
endif
|
endif
|
||||||
|
|
||||||
public/kcl-samples/manifest.json: $(KCL_SOURCES)
|
build/index.html: $(REACT_SOURCES) $(TYPESCRIPT_SOURCES) $(VITE_SOURCES)
|
||||||
cd rust/kcl-lib && EXPECTORATE=overwrite cargo test generate_manifest
|
npm run build:local
|
||||||
|
|
||||||
.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
|
||||||
@ -91,11 +95,11 @@ TARGET ?= desktop
|
|||||||
run: run-$(TARGET)
|
run: run-$(TARGET)
|
||||||
|
|
||||||
.PHONY: run-web
|
.PHONY: run-web
|
||||||
run-web: install build ## Start the web app
|
run-web: install build-web ## Start the web app
|
||||||
npm run start
|
npm run start
|
||||||
|
|
||||||
.PHONY: run-desktop
|
.PHONY: run-desktop
|
||||||
run-desktop: install build ## Start the desktop app
|
run-desktop: install build-desktop ## Start the desktop app
|
||||||
npm run tron:start
|
npm run tron:start
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -110,8 +114,6 @@ test: test-unit test-e2e
|
|||||||
|
|
||||||
.PHONY: test-unit
|
.PHONY: test-unit
|
||||||
test-unit: install ## Run the unit tests
|
test-unit: install ## Run the unit tests
|
||||||
npm run test:rust
|
|
||||||
npm run test:unit:components
|
|
||||||
@ curl -fs localhost:3000 >/dev/null || ( echo "Error: localhost:3000 not available, 'make run-web' first" && exit 1 )
|
@ curl -fs localhost:3000 >/dev/null || ( echo "Error: localhost:3000 not available, 'make run-web' first" && exit 1 )
|
||||||
npm run test:unit
|
npm run test:unit
|
||||||
|
|
||||||
@ -119,7 +121,7 @@ test-unit: install ## Run the unit tests
|
|||||||
test-e2e: test-e2e-$(TARGET)
|
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-web ## Run the web e2e tests
|
||||||
@ curl -fs localhost:3000 >/dev/null || ( echo "Error: localhost:3000 not available, 'make run-web' first" && exit 1 )
|
@ 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 chrome:test -- --headed --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
||||||
@ -128,7 +130,7 @@ else
|
|||||||
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-desktop ## 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:playwright:electron -- --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES)
|
||||||
else
|
else
|
||||||
|
@ -34,7 +34,7 @@ The 3D view in Design Studio is just a video stream from our hosted geometry eng
|
|||||||
- WebSockets (via [KittyCAD TS client](https://github.com/KittyCAD/kittycad.ts))
|
- WebSockets (via [KittyCAD TS client](https://github.com/KittyCAD/kittycad.ts))
|
||||||
- Code Editor
|
- Code Editor
|
||||||
- [CodeMirror](https://codemirror.net/)
|
- [CodeMirror](https://codemirror.net/)
|
||||||
- [Custom WASM LSP Server](https://github.com/KittyCAD/modeling-app/tree/main/rust/kcl-lib/src/lsp/kcl)
|
- Custom WASM LSP Server
|
||||||
- Modeling
|
- Modeling
|
||||||
- [KittyCAD TypeScript client](https://github.com/KittyCAD/kittycad.ts)
|
- [KittyCAD TypeScript client](https://github.com/KittyCAD/kittycad.ts)
|
||||||
|
|
||||||
@ -42,6 +42,8 @@ The 3D view in Design Studio is just a video stream from our hosted geometry eng
|
|||||||
|
|
||||||
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 [releases](https://github.com/KittyCAD/modeling-app/releases) page. If you don't see your platform or architecture supported there, please file an issue.
|
||||||
|
|
||||||
|
If you'd like to try out upcoming changes sooner, you can also download those from our [nightly releases](https://zoo.dev/modeling-app/download/nightly) page.
|
||||||
|
|
||||||
## 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.
|
||||||
|
40
_typos.toml
40
_typos.toml
@ -1,40 +0,0 @@
|
|||||||
[files]
|
|
||||||
extend-exclude = [
|
|
||||||
"**/target",
|
|
||||||
"node_modules",
|
|
||||||
"build",
|
|
||||||
"dist",
|
|
||||||
"out",
|
|
||||||
"**/Cargo.lock",
|
|
||||||
"docs/**/*.md",
|
|
||||||
"docs/**/*.json",
|
|
||||||
"e2e/playwright/lib/console-error-whitelist.ts",
|
|
||||||
".package-lock.json",
|
|
||||||
"**/package-lock.json",
|
|
||||||
"openapi/*.json",
|
|
||||||
"packages/codemirror-lang-kcl/test/all.test.ts",
|
|
||||||
"public/kcl-samples",
|
|
||||||
"rust/kcl-lib/tests/kcl_samples",
|
|
||||||
"tsconfig.tsbuildinfo",
|
|
||||||
"src/lib/machine-api.d.ts",
|
|
||||||
"kcl-book/book",
|
|
||||||
]
|
|
||||||
|
|
||||||
[default.extend-words]
|
|
||||||
metalness = "metalness" # appearance API
|
|
||||||
Hom = "Hom" # short for homogenous
|
|
||||||
typ = "typ" # used to declare a variable named 'type' which is a reserved keyword in Rust
|
|
||||||
ue = "ue" # short for UnaryExpression
|
|
||||||
THRE = "THRE" # Weird bug that wrongly detects THREEjs as a typo
|
|
||||||
nwo = "nwo" # don't know what this is about tbh
|
|
||||||
"ot" = "ot" # some abbreviation, idk what
|
|
||||||
"oe" = "oe" # some abbreviation, idk what
|
|
||||||
"colinear" = "colinear" # some engine shit, kidding
|
|
||||||
|
|
||||||
[default]
|
|
||||||
extend-ignore-identifiers-re = [
|
|
||||||
"\\dnd", # e.g. 2nd
|
|
||||||
]
|
|
||||||
extend-ignore-re = [
|
|
||||||
"@xstate-layout .*",
|
|
||||||
]
|
|
@ -1,53 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Arithmetic and logic"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
KCL supports the usual arithmetic operators on numbers and logic operators on booleans:
|
|
||||||
|
|
||||||
| Operator | Meaning |
|
|
||||||
|----------|---------|
|
|
||||||
| `+` | Addition |
|
|
||||||
| `-` | Subtraction or unary negation |
|
|
||||||
| `*` | Multiplication |
|
|
||||||
| `/` | Division |
|
|
||||||
| `%` | Modulus aka remainder |
|
|
||||||
| `^` | Power, e.g., `x ^ 2` means `x` squared |
|
|
||||||
| `&` | Logical 'and' |
|
|
||||||
| `|` | Logical 'or' |
|
|
||||||
| `!` | Unary logical 'not' |
|
|
||||||
|
|
||||||
KCL also supports comparsion operators which operate on numbers and produce booleans:
|
|
||||||
|
|
||||||
| Operator | Meaning |
|
|
||||||
|----------|---------|
|
|
||||||
| `==` | Equal |
|
|
||||||
| `!=` | Not equal |
|
|
||||||
| `<` | Less than |
|
|
||||||
| `>` | Greater than |
|
|
||||||
| `<=` | Less than or equal |
|
|
||||||
| `>=` | Greater than or equal |
|
|
||||||
|
|
||||||
Arithmetics and logic expressions can be arbitrairly combined with the usual rules of associativity and precedence, e.g.,
|
|
||||||
|
|
||||||
```
|
|
||||||
myMathExpression = 3 + 1 * 2 / 3 - 7
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also nest expressions in parenthesis:
|
|
||||||
|
|
||||||
```
|
|
||||||
myMathExpression = 3 + (1 * 2 / (3 - 7))
|
|
||||||
```
|
|
||||||
|
|
||||||
KCL numbers are implemented using [floating point numbers](https://en.wikipedia.org/wiki/Floating-point_arithmetic). This means that there are occasionally representation and rounding issues, and some oddities such as supporting positive and negative zero.
|
|
||||||
|
|
||||||
Some operators can be applied to other types:
|
|
||||||
|
|
||||||
- `+` can be used to concatenate strings, e.g., `'hello' + ' ' + 'world!'`
|
|
||||||
- Unary `-` can be used with planes or line-like objects such as axes to produce an object with opposite orientation, e.g., `-XY` is a plain which is aligned with `XY` but whose normal aligns with the negative Z axis.
|
|
||||||
- The following operators can be used with solids as shorthand for CSG operations:
|
|
||||||
- `+` or `|` for [`union`](/docs/kcl-std/union).
|
|
||||||
- `-` for [`subtract`](/docs/kcl-std/subtract).
|
|
||||||
- `&` for [`intersect`](/docs/kcl-std/intersect)
|
|
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Arrays and ranges"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Arrays are sequences of values.
|
|
||||||
|
|
||||||
Arrays can be written out as *array literals* using a sequence of expressions surrounded by square brackets, e.g., `['hello', 'world']` is an array of strings, `[x, x + 1, x + 2]` is an array of numbers (assuming `x` is a number), `[]` is an empty array, and `['hello', 42, true]` is a mixed array.
|
|
||||||
|
|
||||||
A value in an array can be accessed by indexing using square brackets where the index is a number, for example, `arr[0]`, `arr[42]`, `arr[i]` (where `arr` is an array and `i` is a (whole) number).
|
|
||||||
|
|
||||||
There are some useful functions for working with arrays in the standard library, see [std::array](/docs/kcl-std/modules/std-array) for details.
|
|
||||||
|
|
||||||
## Array types
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
## 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:
|
|
||||||
|
|
||||||
```kcl,norun
|
|
||||||
[0..3] // [0, 1, 2, 3]
|
|
||||||
[3..10] // [3, 4, 5, 6, 7, 8, 9, 10]
|
|
||||||
x = 2
|
|
||||||
[x..x+1] // [2, 3]
|
|
||||||
```
|
|
||||||
|
|
||||||
The units of the start and end numbers must be the same and the result inherits those units.
|
|
@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Attributes"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Attributes are syntax which affects the language item they annotate. In KCL they are indicated using `@`. For example, `@settings` affects the file in which it appears.
|
|
||||||
|
|
||||||
There are two kinds of attributes: named and unnamed attributes. Named attributes (e.g., `@settings`) have a name immediately after the `@` (e.g., `settings`) and affect their surrounding scope. Unnamed attributes have no name and affect the following item, e.g.,
|
|
||||||
|
|
||||||
```kcl,norun
|
|
||||||
@(lengthUnit = ft, coords = opengl)
|
|
||||||
import "tests/inputs/cube.obj"
|
|
||||||
```
|
|
||||||
|
|
||||||
has an unnamed attribute on the `import` statement.
|
|
||||||
|
|
||||||
Named and unnamed attributes may take a parenthesized list of arguments (like a function). Named attributes may also appear without any arguments (e.g., `@no_std`).
|
|
||||||
|
|
||||||
## Named attributes
|
|
||||||
|
|
||||||
The `@settings` attribute affects the current file and accepts the following arguments: `defaultLengthUnit`, `defaultAngleUnit`, and `kclVersion`. See [settings](/docs/kcl-lang/settings) for details.
|
|
||||||
|
|
||||||
The `@no_std` attribute affects the current file, takes no arguments, and causes the standard library to not be implicitly available. It can still be used by being explicitly imported.
|
|
||||||
|
|
||||||
## Unnamed attributes
|
|
||||||
|
|
||||||
Unnamed attributes may be used on `import` statements when importing non-KCL files. See [projects, modules, and imports](/docs/kcl-lang/modules) for details.
|
|
||||||
|
|
||||||
Other unnamed attributes are used on functions inside the standard library, but these are not available in user code.
|
|
@ -1,99 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Importing geometry from other CAD systems"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
`import` can also be used to import files from other CAD systems. The format of the statement is the
|
|
||||||
same as for KCL files. You can only import the whole file, not items from it. E.g.,
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import "tests/inputs/cube.obj"
|
|
||||||
|
|
||||||
// Use `cube` just like a KCL object.
|
|
||||||
```
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
import "tests/inputs/cube.sldprt" as cube
|
|
||||||
|
|
||||||
// Use `cube` just like a KCL object.
|
|
||||||
```
|
|
||||||
|
|
||||||
For formats lacking unit data (such as STL, OBJ, or PLY files), the default
|
|
||||||
unit of measurement is millimeters. Alternatively you may specify the unit
|
|
||||||
by using an attribute. Likewise, you can also specify a coordinate system. E.g.,
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
@(lengthUnit = ft, coords = opengl)
|
|
||||||
import "tests/inputs/cube.obj"
|
|
||||||
```
|
|
||||||
|
|
||||||
When importing a GLTF file, the bin file will be imported as well.
|
|
||||||
|
|
||||||
Import paths are relative to the current project directory. Imports currently only work when
|
|
||||||
using the native Design Studio, not in the browser.
|
|
||||||
|
|
||||||
### Supported values
|
|
||||||
|
|
||||||
File formats: `fbx`, `gltf`/`glb`, `obj`+, `ply`+, `sldprt`, `step`/`stp`, `stl`+. (Those marked with a
|
|
||||||
'+' support customising the length unit and coordinate system).
|
|
||||||
|
|
||||||
Length units: `mm` (the default), `cm`, `m`, `inch`, `ft`, `yd`.
|
|
||||||
|
|
||||||
Coordinate systems:
|
|
||||||
|
|
||||||
- `zoo` (the default), forward: -Y, up: +Z, handedness: right
|
|
||||||
- `opengl`, forward: +Z, up: +Y, handedness: right
|
|
||||||
- `vulkan`, forward: +Z, up: -Y, handedness: left
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Performance deep‑dive for foreign‑file imports
|
|
||||||
|
|
||||||
Parallelized foreign‑file imports now let you overlap file reads, initialization,
|
|
||||||
and rendering. To maximize throughput, you need to understand the three distinct
|
|
||||||
stages—reading, initializing (background render start), and invocation (blocking)
|
|
||||||
—and structure your code to defer blocking operations until the end.
|
|
||||||
|
|
||||||
### Foreign import execution stages
|
|
||||||
|
|
||||||
1. **Import (Read / Initialization) Stage**
|
|
||||||
```kcl
|
|
||||||
import "tests/inputs/cube.step" as cube
|
|
||||||
```
|
|
||||||
- Reads the file from disk and makes its API available.
|
|
||||||
- Starts engine rendering but **does not block** your script.
|
|
||||||
- This kick‑starts the render pipeline while you keep executing other code.
|
|
||||||
|
|
||||||
2. **Invocation (Blocking) Stage**
|
|
||||||
```kcl
|
|
||||||
import "tests/inputs/cube.step" as cube
|
|
||||||
|
|
||||||
cube
|
|
||||||
|> translate(z=10) // ← blocks here only
|
|
||||||
```
|
|
||||||
- Any method call (e.g., `translate`, `scale`, `rotate`) waits for the background render to finish before applying transformations.
|
|
||||||
|
|
||||||
### Best practices
|
|
||||||
|
|
||||||
#### 1. Defer blocking calls
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
import "tests/inputs/cube.step" as cube // 1) Read / Background render starts
|
|
||||||
|
|
||||||
|
|
||||||
// --- perform other operations and calculations here ---
|
|
||||||
|
|
||||||
|
|
||||||
cube
|
|
||||||
|> translate(z=10) // 2) Blocks only here
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Split heavy work into separate modules
|
|
||||||
|
|
||||||
Place computationally expensive or IO‑heavy work into its own module so it can render in parallel while `main.kcl` continues.
|
|
||||||
|
|
||||||
#### Future improvements
|
|
||||||
|
|
||||||
Upcoming releases will auto‑analyse dependencies and only block when truly necessary. Until then, explicit deferral will give you the best performance.
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Functions"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
We have support for defining your own functions. Functions can take in any
|
|
||||||
type of argument. Below is an example of the syntax:
|
|
||||||
|
|
||||||
```
|
|
||||||
fn myFn(x) {
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
As you can see above `myFn` just returns whatever it is given.
|
|
||||||
|
|
||||||
KCL uses keyword arguments:
|
|
||||||
|
|
||||||
```
|
|
||||||
// If you declare a function like this
|
|
||||||
fn add(left, right) {
|
|
||||||
return left + right
|
|
||||||
}
|
|
||||||
|
|
||||||
// You can call it like this:
|
|
||||||
total = add(left = 1, right = 2)
|
|
||||||
```
|
|
||||||
|
|
||||||
Functions can also declare one *unlabeled* arg. If you do want to declare an unlabeled arg, it must
|
|
||||||
be the first arg declared.
|
|
||||||
|
|
||||||
```
|
|
||||||
// The @ indicates an argument is used without a label.
|
|
||||||
// Note that only the first argument can use @.
|
|
||||||
fn increment(@x) {
|
|
||||||
return x + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add(@x, delta) {
|
|
||||||
return x + delta
|
|
||||||
}
|
|
||||||
|
|
||||||
two = increment(1)
|
|
||||||
three = add(1, delta = 2)
|
|
||||||
```
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
title: "KCL Language Reference"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a reference for KCL. If you are learning KCL, you may prefer the [guide](https://zoo.dev/docs/kcl-book/intro.html) which explains
|
|
||||||
things in a more tutorial fashion. See also our documentation of the [standard library](/docs/kcl-std).
|
|
||||||
|
|
||||||
## Topics
|
|
||||||
|
|
||||||
* [Pipelines](/docs/kcl-lang/pipelines)
|
|
||||||
* [Arithmetic and logic](/docs/kcl-lang/arithmetic)
|
|
||||||
* [Values and types](/docs/kcl-lang/types)
|
|
||||||
* [Numeric types and units](/docs/kcl-lang/numeric)
|
|
||||||
* [Functions](/docs/kcl-lang/functions)
|
|
||||||
* [Arrays and ranges](/docs/kcl-lang/arrays)
|
|
||||||
* [Projects and modules](/docs/kcl-lang/modules)
|
|
||||||
* [Attributes](/docs/kcl-lang/attributes)
|
|
||||||
* [Importing geometry from other CAD systems](/docs/kcl-lang/foreign-imports)
|
|
||||||
* [Settings](/docs/kcl-lang/settings)
|
|
||||||
* [Known Issues](/docs/kcl-lang/known-issues)
|
|
@ -1,266 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Projects and modules"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
`KCL` allows splitting code up into multiple files. Each file is somewhat
|
|
||||||
isolated from other files as a separate module.
|
|
||||||
|
|
||||||
When you define a function, you can use `export` before it to make it available
|
|
||||||
to other modules.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
// util.kcl
|
|
||||||
export fn increment(@x) {
|
|
||||||
return x + 1
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Other files in the project can now import functions that have been exported.
|
|
||||||
This makes them available to use in another file.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
// main.kcl
|
|
||||||
import increment from "util.kcl"
|
|
||||||
|
|
||||||
answer = increment(41)
|
|
||||||
```
|
|
||||||
|
|
||||||
Imported files _must_ be in the same project so that units are uniform across
|
|
||||||
modules. This means that it must be in the same directory.
|
|
||||||
|
|
||||||
Import statements must be at the top-level of a file. It is not allowed to have
|
|
||||||
an `import` statement inside a function or in the body of an if‑else.
|
|
||||||
|
|
||||||
Multiple functions can be exported in a file.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
// util.kcl
|
|
||||||
export fn increment(@x) {
|
|
||||||
return x + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
export fn decrement(@x) {
|
|
||||||
return x - 1
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
When importing, you can import multiple functions at once.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import increment, decrement from "util.kcl"
|
|
||||||
```
|
|
||||||
|
|
||||||
Imported symbols can be renamed for convenience or to avoid name collisions.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import increment as inc, decrement as dec from "util.kcl"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Functions vs `clone`
|
|
||||||
|
|
||||||
There are two common patterns for re‑using geometry:
|
|
||||||
|
|
||||||
1. **Wrap the construction in a function** – flexible and fully parametric.
|
|
||||||
2. **Duplicate an existing object with `clone`** – lightning‑fast, but an exact
|
|
||||||
duplicate.
|
|
||||||
|
|
||||||
### Parametric function example
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
fn cube(center) {
|
|
||||||
return startSketchOn(XY)
|
|
||||||
|> startProfile(at = [center[0] - 10, center[1] - 10])
|
|
||||||
|> line(endAbsolute = [center[0] + 10, center[1] - 10])
|
|
||||||
|> line(endAbsolute = [center[0] + 10, center[1] + 10])
|
|
||||||
|> line(endAbsolute = [center[0] - 10, center[1] + 10])
|
|
||||||
|> close()
|
|
||||||
|> extrude(length = 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
myCube = cube(center = [0, 0])
|
|
||||||
```
|
|
||||||
|
|
||||||
*Pros*
|
|
||||||
- Any argument can be a parameter – size, position, appearance, etc.
|
|
||||||
- Works great inside loops, arrays, or optimisation sweeps.
|
|
||||||
|
|
||||||
*Cons*
|
|
||||||
- Every invocation rebuilds the entire feature tree.
|
|
||||||
- **Slower** than a straight duplicate – each call is its own render job.
|
|
||||||
|
|
||||||
### `clone` example
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
sketch001 = startSketchOn(-XZ)
|
|
||||||
|> circle(center = [0, 0], radius = 10)
|
|
||||||
|> extrude(length = 5)
|
|
||||||
|> appearance(color = "#ff0000", metalness = 90, roughness = 90)
|
|
||||||
|
|
||||||
sketch002 = clone(sketch001) // ✓ instant copy
|
|
||||||
```
|
|
||||||
|
|
||||||
*Pros*
|
|
||||||
- Roughly an O(1) operation – we just duplicate the underlying engine handle.
|
|
||||||
- Perfect when you need ten identical bolts or two copies of the same imported STEP file.
|
|
||||||
|
|
||||||
*Cons*
|
|
||||||
- **Not parametric** – the clone is exactly the same shape as the source.
|
|
||||||
- If you need to tweak dimensions per‑instance, you’re back to a function.
|
|
||||||
|
|
||||||
> **Rule of thumb** – Reach for `clone` when the geometry is already what you want. Reach for a function when you need customisation.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Module‑level parallelism
|
|
||||||
|
|
||||||
Under the hood, the Design Studio runs **every module in parallel** where it can. This means:
|
|
||||||
|
|
||||||
- The top‑level code of `foo.kcl`, `bar.kcl`, and `baz.kcl` all start executing immediately and concurrently.
|
|
||||||
- Imports that read foreign files (STEP/OBJ/…) overlap their I/O and background render.
|
|
||||||
- CPU‑bound calculations in separate modules get their own worker threads.
|
|
||||||
|
|
||||||
### Why modules beat one‑big‑file
|
|
||||||
|
|
||||||
If you shoe‑horn everything into `main.kcl`, each statement runs sequentially:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import "big.step" as gizmo // blocks main while reading
|
|
||||||
|
|
||||||
gizmo |> translate(x=50) // blocks again while waiting for render
|
|
||||||
```
|
|
||||||
|
|
||||||
Split `gizmo` into its own file and the read/render can overlap whatever else `main.kcl` is doing.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
// gizmo.kcl (worker A)
|
|
||||||
import "big.step"
|
|
||||||
|
|
||||||
// main.kcl (worker B)
|
|
||||||
import "gizmo.kcl" as gizmo // non‑blocking
|
|
||||||
|
|
||||||
// ... other setup ...
|
|
||||||
|
|
||||||
gizmo |> translate(x=50) // only blocks here
|
|
||||||
```
|
|
||||||
|
|
||||||
### Gotcha: defining but **not** calling functions
|
|
||||||
|
|
||||||
Defining a function inside a module is instantaneous – we just record the byte‑code. The heavy lifting happens when the function is **called**. So:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
// util.kcl
|
|
||||||
export fn makeBolt(size) { /* … expensive CAD … */ }
|
|
||||||
```
|
|
||||||
|
|
||||||
If `main.kcl` waits until the very end to call `makeBolt`, *none* of that work was parallelised – you’ve pushed the cost back onto the serial tail of your script.
|
|
||||||
|
|
||||||
**Better:** call it early or move the invocation into another module.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
// bolt_instance.kcl
|
|
||||||
import makeBolt from "util.kcl"
|
|
||||||
bolt = makeBolt(5) // executed in parallel
|
|
||||||
bolt
|
|
||||||
```
|
|
||||||
|
|
||||||
Now `main.kcl` can `import "bolt_instance.kcl" as bolt` and get the result that was rendered while it was busy doing other things.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Whole module import
|
|
||||||
|
|
||||||
You can also import the whole module. This is useful if you want to use the
|
|
||||||
result of a module as a variable, like a part.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import "cube.kcl"
|
|
||||||
cube
|
|
||||||
|> translate(x=10)
|
|
||||||
```
|
|
||||||
|
|
||||||
This imports the whole module and makes it available as `cube`. You can then
|
|
||||||
use it like any other object. The `cube` variable is now a reference to the
|
|
||||||
result of the module. This means that if you change the module, the `cube`
|
|
||||||
variable will change as well.
|
|
||||||
|
|
||||||
In `cube.kcl`, you cannot have multiple objects. It has to be a single part. If
|
|
||||||
you have multiple objects, you will get an error. This is because the module is
|
|
||||||
expected to return a single object that can be used as a variable.
|
|
||||||
|
|
||||||
The last expression or variable definition becomes the module's return value.
|
|
||||||
The module is expected to return a single object that can be used as a variable
|
|
||||||
by whatever imports it.
|
|
||||||
|
|
||||||
So for example, this is allowed:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
... a bunch of code to create cube and cube2 ...
|
|
||||||
|
|
||||||
myUnion = union([cube, cube2])
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also do this:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
... a bunch of code to create cube and cube2 ...
|
|
||||||
|
|
||||||
union([cube, cube2])
|
|
||||||
```
|
|
||||||
|
|
||||||
Either way, the last line will return the union of the two objects.
|
|
||||||
|
|
||||||
Or what you could do instead is:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
... a bunch of code to create cube and cube2 ...
|
|
||||||
|
|
||||||
myUnion = union([cube, cube2])
|
|
||||||
myUnion
|
|
||||||
```
|
|
||||||
|
|
||||||
This will assign the union of the two objects to a variable, and then return it
|
|
||||||
on the last statement. It's simply another way of doing the same thing.
|
|
||||||
|
|
||||||
The final statement is what's important because it's the return value of the
|
|
||||||
entire module. The module is expected to return a single object that can be used
|
|
||||||
as a variable by the file that imports it.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Multiple instances of the same import
|
|
||||||
|
|
||||||
Whether you are importing a file from another CAD system or a KCL file, that
|
|
||||||
file represents object(s) in memory. If you import the same file multiple times,
|
|
||||||
it will only be rendered once.
|
|
||||||
|
|
||||||
If you want to have multiple instances of the same object, you can use the
|
|
||||||
[`clone`](/docs/kcl/clone) function. This will render a new instance of the object in memory.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
import cube from "cube.kcl"
|
|
||||||
|
|
||||||
cube
|
|
||||||
|> translate(x=10)
|
|
||||||
clone(cube)
|
|
||||||
|> translate(x=20)
|
|
||||||
```
|
|
||||||
|
|
||||||
In the sample above, the `cube` object is imported from a KCL file. The first
|
|
||||||
instance is translated 10 units in the x direction. The second instance is
|
|
||||||
cloned and translated 20 units in the x direction. The two instances are now
|
|
||||||
separate objects in memory, and can be manipulated independently.
|
|
||||||
|
|
||||||
Here is an example with a file from another CAD system:
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
import "tests/inputs/cube.step"
|
|
||||||
|
|
||||||
cube
|
|
||||||
|> translate(x=10)
|
|
||||||
clone(cube)
|
|
||||||
|> translate(x=20)
|
|
||||||
```
|
|
@ -1,48 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Numeric types and units"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Numbers and numeric types in KCL include information about the units of the numbers. So rather than just having a number like `42`, we always have information about the units so we don't confuse 42 mm with 42 inches.
|
|
||||||
|
|
||||||
|
|
||||||
## Numeric literals
|
|
||||||
|
|
||||||
When writing a number literal, you can use a unit suffix to explicitly state the unit, e.g., `42mm`. The following units are available:
|
|
||||||
|
|
||||||
- Length units:
|
|
||||||
- metric: `mm`, `cm`, `m`
|
|
||||||
- imperial: `in`, `ft`, `yd`
|
|
||||||
- Angle units: `deg`, `rad`
|
|
||||||
- `_` to indicate a unitless number such as a count or ratio.
|
|
||||||
|
|
||||||
If you write a numeric literal without a suffix, then the defaults for the current file are used. These defaults are specified using the `@settings` attribute, see [settings](/docs/kcl-lang/settings) for details. Note that if using the defaults, the KCL interpreter won't know whether you intend the number to be a length, angle, or count and will treat it as being possibly any of them.
|
|
||||||
|
|
||||||
|
|
||||||
## Numeric types
|
|
||||||
|
|
||||||
Just like numbers carry units information, the `number` type also includes units information. Units are written in parentheses after the type, e.g., `number(mm)`.
|
|
||||||
|
|
||||||
Any of the suffixes described above can be used meaning that values with that type have the supplied units. E.g., `number(mm)` is the type of number values with mm units and `number(_)` is the type of number values with no units.
|
|
||||||
|
|
||||||
You can also use `number(Length)`, `number(Angle)`, or `number(Count)`. These types mean a number with any length, angle, or unitless (count) units, respectively (note that `number(_)` and `number(Count)` are equivalent since there is only one kind of unitless-ness).
|
|
||||||
|
|
||||||
Using just `number` means accepting any kind of number, even where the units are unknown by KCL.
|
|
||||||
|
|
||||||
|
|
||||||
## Function calls
|
|
||||||
|
|
||||||
When calling a function with an argument with numeric type, the declared numeric type in the function signature and the units of the argument value used in the function call must be compatible. Units are adjusted automatically. For example, if a function requires an argument with type `number(mm)`, then you can call it with `2in` and the units will be automatically adjusted, but calling it with `90deg` will cause an error.
|
|
||||||
|
|
||||||
|
|
||||||
## Mixing units with arithmetic
|
|
||||||
|
|
||||||
When doing arithmetic or comparisons, units will be adjusted as necessary if possible. However, often arithmetic expressions exceed the ability of KCL to accurately choose units which can result in warnings in your code or sometimes errors. In these cases, you will need to give KCL more information. Sometimes this can be done by making units explicit using suffixes. If not, then you will need to use *type ascription*, which asserts that an expression has the supplied type. For example, `(x * y): number(mm)` tells KCL that the units of `x * y` is mm. Note that type ascription does not do any adjustment of the numbers, e.g., `2mm: number(in)` has the value `2in` (note that this would be a very non-idiomatic way to use numeric type ascription, you could simply write `2in`. Usually type ascription is only necessary for supplying type information about the result of computation).
|
|
||||||
|
|
||||||
KCL has no support for area, volume, or other higher dimension units. When internal unit tracking requires multiple dimensions, KCL essentially gives up. This is usually where the extra type information described above is needed. If doing computation with higher dimensioned units, you must ensure that all adjustments occur before any computation. E.g., if you want to compute an area with unknown units, you must convert all numbers to the same unit before starting.
|
|
||||||
|
|
||||||
|
|
||||||
## 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.
|
|
@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Pipelines"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
It can be hard to read repeated function calls, because of all the nested brackets.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
i = 1
|
|
||||||
x = h(g(f(i)))
|
|
||||||
```
|
|
||||||
|
|
||||||
You can make this easier to read by breaking it into many declarations, but that is a bit annoying.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
i = 1
|
|
||||||
x0 = f(i)
|
|
||||||
x1 = g(x0)
|
|
||||||
x = h(x1)
|
|
||||||
```
|
|
||||||
|
|
||||||
Instead, you can use the pipeline operator (`|>`) to simplify this.
|
|
||||||
|
|
||||||
Basically, `x |> f(%)` is a shorthand for `f(x)`. The left-hand side of the `|>` gets put into
|
|
||||||
the `%` in the right-hand side.
|
|
||||||
|
|
||||||
So, this means `x |> f(%) |> g(%)` is shorthand for `g(f(x))`. The code example above, with its
|
|
||||||
somewhat-clunky `x0` and `x1` constants could be rewritten as
|
|
||||||
|
|
||||||
```norun
|
|
||||||
i = 1
|
|
||||||
x = i
|
|
||||||
|> f(%)
|
|
||||||
|> g(%)
|
|
||||||
|> h(%)
|
|
||||||
```
|
|
||||||
|
|
||||||
This helps keep your code neat and avoid unnecessary declarations.
|
|
||||||
|
|
||||||
## Pipelines and keyword arguments
|
|
||||||
|
|
||||||
Say you have a long pipeline of sketch functions, like this:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
startSketchOn(XZ)
|
|
||||||
|> line(%, end = [3, 4])
|
|
||||||
|> line(%, end = [10, 10])
|
|
||||||
|> line(%, end = [-13, -14])
|
|
||||||
|> close(%)
|
|
||||||
```
|
|
||||||
|
|
||||||
In this example, each function call outputs a sketch, and it gets put into the next function call via
|
|
||||||
the `%`, into the first (unlabeled) argument.
|
|
||||||
|
|
||||||
If a function call uses an unlabeled first parameter, it will default to `%` if it's not given. This
|
|
||||||
means that `|> line(%, end = [3, 4])` and `|> line(end = [3, 4])` are equivalent! So the above
|
|
||||||
could be rewritten as
|
|
||||||
|
|
||||||
```norun
|
|
||||||
startSketchOn(XZ)
|
|
||||||
|> line(end = [3, 4])
|
|
||||||
|> line(end = [10, 10])
|
|
||||||
|> line(end = [-13, -14])
|
|
||||||
|> close()
|
|
||||||
```
|
|
@ -1,161 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Values and types"
|
|
||||||
excerpt: "Documentation of the KCL language for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
`KCL` defines the following types and keywords the language.
|
|
||||||
|
|
||||||
All these types can be nested in various forms where nesting applies. Like
|
|
||||||
arrays can hold objects and vice versa.
|
|
||||||
|
|
||||||
## Constant declaration
|
|
||||||
|
|
||||||
Constants are defined with a name and a value, like so:
|
|
||||||
|
|
||||||
```
|
|
||||||
myBool = false
|
|
||||||
```
|
|
||||||
|
|
||||||
Currently you cannot redeclare a constant.
|
|
||||||
|
|
||||||
|
|
||||||
## Objects
|
|
||||||
|
|
||||||
An object is defined with `{}` braces. Here is an example object:
|
|
||||||
|
|
||||||
```
|
|
||||||
myObj = { a = 0, b = "thing" }
|
|
||||||
```
|
|
||||||
|
|
||||||
To get the property of an object, you can call `myObj.a`, which in the above
|
|
||||||
example returns 0.
|
|
||||||
|
|
||||||
## `ImportedGeometry`
|
|
||||||
|
|
||||||
Using `import` you can import geometry defined using other CAD software. In KCL,
|
|
||||||
these objects have type `ImportedGeometry` and can mostly be treated like any
|
|
||||||
other solid (they can be rotated, scaled, etc.), although there is no access to
|
|
||||||
their internal components. See the [modules and imports docs](modules) for more
|
|
||||||
detail on importing geometry.
|
|
||||||
|
|
||||||
|
|
||||||
## Tags
|
|
||||||
|
|
||||||
Tags are used to give a name (tag) to a specific path.
|
|
||||||
|
|
||||||
### `TagDeclarator`
|
|
||||||
|
|
||||||
The syntax for declaring a tag is `$myTag` you would use it in the following
|
|
||||||
way:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
startSketchOn(XZ)
|
|
||||||
|> startProfile(at = origin)
|
|
||||||
|> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001) - 90,
|
|
||||||
length = 196.99,
|
|
||||||
tag = $rectangleSegmentB001,
|
|
||||||
)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001),
|
|
||||||
length = -segLen(rectangleSegmentA001),
|
|
||||||
tag = $rectangleSegmentC001,
|
|
||||||
)
|
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
||||||
|> close()
|
|
||||||
```
|
|
||||||
|
|
||||||
### `TagIdentifier`
|
|
||||||
|
|
||||||
As per the example above you can use the tag identifier to get a reference to the
|
|
||||||
tagged object. The syntax for this is `myTag`.
|
|
||||||
|
|
||||||
In the example above we use the tag identifier to get the angle of the segment
|
|
||||||
`segAng(rectangleSegmentA001)`.
|
|
||||||
|
|
||||||
### `Start`
|
|
||||||
|
|
||||||
There is a special tag, `START` (with type `Start`, although under the cover, it's a string)
|
|
||||||
for identifying the face of a solid which was the start of an extrusion (i.e., the surface which
|
|
||||||
is extruded).
|
|
||||||
|
|
||||||
### `End`
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
Tags are scoped globally if in the root context meaning in this example you can
|
|
||||||
use the tag `rectangleSegmentA001` in any function or expression in the file.
|
|
||||||
|
|
||||||
However if the code was written like this:
|
|
||||||
|
|
||||||
```norun
|
|
||||||
fn rect(origin) {
|
|
||||||
return startSketchOn(XZ)
|
|
||||||
|> startProfile(at = origin)
|
|
||||||
|> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001) - 90,
|
|
||||||
length = 196.99,
|
|
||||||
tag = $rectangleSegmentB001,
|
|
||||||
)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001),
|
|
||||||
length = -segLen(rectangleSegmentA001),
|
|
||||||
tag = $rectangleSegmentC001,
|
|
||||||
)
|
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
||||||
|> close()
|
|
||||||
}
|
|
||||||
|
|
||||||
rect(origin = [0, 0])
|
|
||||||
rect(origin = [20, 0])
|
|
||||||
```
|
|
||||||
|
|
||||||
Those tags would only be available in the `rect` function and not globally.
|
|
||||||
|
|
||||||
However you likely want to use those tags somewhere outside the `rect` function.
|
|
||||||
|
|
||||||
Tags are accessible through the sketch group they are declared in.
|
|
||||||
For example the following code works.
|
|
||||||
|
|
||||||
```norun
|
|
||||||
fn rect(origin) {
|
|
||||||
return startSketchOn(XZ)
|
|
||||||
|> startProfile(at = origin)
|
|
||||||
|> angledLine(angle = 0, length = 191.26, tag = $rectangleSegmentA001)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001) - 90,
|
|
||||||
length = 196.99,
|
|
||||||
tag = $rectangleSegmentB001,
|
|
||||||
)
|
|
||||||
|> angledLine(
|
|
||||||
angle = segAng(rectangleSegmentA001),
|
|
||||||
length = -segLen(rectangleSegmentA001),
|
|
||||||
tag = $rectangleSegmentC001,
|
|
||||||
)
|
|
||||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
|
||||||
|> close()
|
|
||||||
}
|
|
||||||
|
|
||||||
rect(origin = [0, 0])
|
|
||||||
myRect = rect(origin = [20, 0])
|
|
||||||
|
|
||||||
myRect
|
|
||||||
|> extrude(length = 10)
|
|
||||||
|> fillet(radius = 0.5, tags = [myRect.tags.rectangleSegmentA001])
|
|
||||||
```
|
|
||||||
|
|
||||||
See how we use the tag `rectangleSegmentA001` in the `fillet` function outside
|
|
||||||
the `rect` function. This is because the `rect` function is returning the
|
|
||||||
sketch group that contains the tags.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
If you find any issues using any of the above expressions or syntax,
|
|
||||||
please file an issue with the `ast` label on the [modeling-app
|
|
||||||
repo](https://github.com/KittyCAD/modeling-app/issues/new).
|
|
@ -1,5 +0,0 @@
|
|||||||
# Autogenerated docs
|
|
||||||
|
|
||||||
Everything in this directory and its subdirectories (except this file) is automatically generated. Do not edit anything in this directory directly, your changes will be lost.
|
|
||||||
|
|
||||||
The directory contents are generated by running the `test_generate_stdlib_markdown_docs` test in `/rust/kcl-lib/src/docs/gen_std_tests.rs`. Files are generated from the standard library declared in KCL (`/rust/kcl-lib/std`) and in Rust (`/rust/kcl-lib/src/std`), and by copying files from `../kcl-src`.
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "X"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "The X-axis (can be used in both 2d and 3d contexts)."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
The X-axis (can be used in both 2d and 3d contexts).
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
X
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "XY"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "An abstract 3d plane aligned with the X and Y axes. Its normal is the positive Z axis."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract 3d plane aligned with the X and Y axes. Its normal is the positive Z axis.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
XY
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "XZ"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "An abstract 3d plane aligned with the X and Z axes. Its normal is the negative Y axis."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract 3d plane aligned with the X and Z axes. Its normal is the negative Y axis.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
XZ
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Y"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "The Y-axis (can be used in both 2d and 3d contexts)."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
The Y-axis (can be used in both 2d and 3d contexts).
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
Y
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "YZ"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "An abstract 3d plane aligned with the Y and Z axes. Its normal is the positive X axis."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract 3d plane aligned with the Y and Z axes. Its normal is the positive X axis.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
YZ
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Z"
|
|
||||||
subtitle: "Constant in std"
|
|
||||||
excerpt: "The 3D Z-axis."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
The 3D Z-axis.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
Z
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "sweep::SKETCH_PLANE"
|
|
||||||
subtitle: "Constant in std::sweep"
|
|
||||||
excerpt: "Local/relative to a position centered within the plane being sketched on"
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Local/relative to a position centered within the plane being sketched on
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
sweep::SKETCH_PLANE: string = 'sketchPlane'
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "sweep::TRAJECTORY"
|
|
||||||
subtitle: "Constant in std::sweep"
|
|
||||||
excerpt: "Local/relative to the trajectory curve"
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Local/relative to the trajectory curve
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
sweep::TRAJECTORY: string = 'trajectoryCurve'
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "turns::HALF_TURN"
|
|
||||||
subtitle: "Constant in std::turns"
|
|
||||||
excerpt: "A half turn, 180 degrees or π radians."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A half turn, 180 degrees or π radians.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
turns::HALF_TURN: number(deg) = 180deg
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "turns::QUARTER_TURN"
|
|
||||||
subtitle: "Constant in std::turns"
|
|
||||||
excerpt: "A quarter turn, 90 degrees or π/2 radians."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A quarter turn, 90 degrees or π/2 radians.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
turns::QUARTER_TURN: number(deg) = 90deg
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "turns::THREE_QUARTER_TURN"
|
|
||||||
subtitle: "Constant in std::turns"
|
|
||||||
excerpt: "Three quarters of a turn, 270 degrees or 1.5*π radians."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Three quarters of a turn, 270 degrees or 1.5*π radians.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
turns::THREE_QUARTER_TURN: number(deg) = 270deg
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
title: "turns::ZERO"
|
|
||||||
subtitle: "Constant in std::turns"
|
|
||||||
excerpt: "No turn, zero degrees/radians."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
No turn, zero degrees/radians.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
turns::ZERO: number = 0
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,43 +0,0 @@
|
|||||||
---
|
|
||||||
title: "atan"
|
|
||||||
subtitle: "Function in std::math"
|
|
||||||
excerpt: "Compute the arctangent of a number."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Compute the arctangent of a number.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
atan(@num: number(_)): number(rad)
|
|
||||||
```
|
|
||||||
|
|
||||||
Consider using `atan2()` instead for the true inverse of tangent.
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(_)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(rad)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
sketch001 = startSketchOn(XZ)
|
|
||||||
|> startProfile(at = [0, 0])
|
|
||||||
|> angledLine(
|
|
||||||
angle = atan(1.25),
|
|
||||||
length = 20,
|
|
||||||
)
|
|
||||||
|> yLine(endAbsolute = 0)
|
|
||||||
|> close()
|
|
||||||
|
|
||||||
extrude001 = extrude(sketch001, length = 5)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
title: "legAngX"
|
|
||||||
subtitle: "Function in std::math"
|
|
||||||
excerpt: "Compute the angle of the given leg for x."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Compute the angle of the given leg for x.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
legAngX(
|
|
||||||
hypotenuse: number(Length),
|
|
||||||
leg: number(Length),
|
|
||||||
): number(deg)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `hypotenuse` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of the triangle's hypotenuse. | Yes |
|
|
||||||
| `leg` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side). | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(deg)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
legAngX(hypotenuse = 5, leg = 3)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
title: "legAngY"
|
|
||||||
subtitle: "Function in std::math"
|
|
||||||
excerpt: "Compute the angle of the given leg for y."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Compute the angle of the given leg for y.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
legAngY(
|
|
||||||
hypotenuse: number(Length),
|
|
||||||
leg: number(Length),
|
|
||||||
): number(deg)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `hypotenuse` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of the triangle's hypotenuse. | Yes |
|
|
||||||
| `leg` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side). | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(deg)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
legAngY(hypotenuse = 5, leg = 3)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
title: "legLen"
|
|
||||||
subtitle: "Function in std::math"
|
|
||||||
excerpt: "Compute the length of the given leg."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Compute the length of the given leg.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
legLen(
|
|
||||||
hypotenuse: number(Length),
|
|
||||||
leg: number(Length),
|
|
||||||
): number(Length)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `hypotenuse` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of the triangle's hypotenuse. | Yes |
|
|
||||||
| `leg` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The length of one of the triangle's legs (i.e. non-hypotenuse side). | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
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
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toCentimeters"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Convert a number to centimeters from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Convert a number to centimeters from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toCentimeters(@num: number(Length)): number(cm)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(cm)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toFeet"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Convert a number to feet from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Convert a number to feet from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toFeet(@num: number(Length)): number(ft)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(ft)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toInches"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Convert a number to inches from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Convert a number to inches from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toInches(@num: number(Length)): number(in)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(in)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toMeters"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Convert a number to meters from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Convert a number to meters from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toMeters(@num: number(Length)): number(m)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(m)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toMillimeters"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Convert a number to millimeters from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Convert a number to millimeters from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toMillimeters(@num: number(Length)): number(mm)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(mm)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units::toYards"
|
|
||||||
subtitle: "Function in std::units"
|
|
||||||
excerpt: "Converts a number to yards from its current units."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Converts a number to yards from its current units.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
units::toYards(@num: number(Length)): number(yd)
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Arguments
|
|
||||||
|
|
||||||
| Name | Type | Description | Required |
|
|
||||||
|----------|------|-------------|----------|
|
|
||||||
| `num` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | A number. | Yes |
|
|
||||||
|
|
||||||
### Returns
|
|
||||||
|
|
||||||
[`number(yd)`](/docs/kcl-std/types/std-types-number) - A number.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,166 +0,0 @@
|
|||||||
---
|
|
||||||
title: "KCL Standard Library"
|
|
||||||
excerpt: "Documentation for the KCL standard library for the Zoo Design Studio."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
|
|
||||||
### Functions
|
|
||||||
|
|
||||||
* [**std**](/docs/kcl-std/modules/std)
|
|
||||||
* [`appearance`](/docs/kcl-std/appearance)
|
|
||||||
* [`assert`](/docs/kcl-std/assert)
|
|
||||||
* [`assertIs`](/docs/kcl-std/assertIs)
|
|
||||||
* [`clone`](/docs/kcl-std/functions/std-clone)
|
|
||||||
* [`helix`](/docs/kcl-std/functions/std-helix)
|
|
||||||
* [`offsetPlane`](/docs/kcl-std/functions/std-offsetPlane)
|
|
||||||
* [`patternLinear2d`](/docs/kcl-std/patternLinear2d)
|
|
||||||
* [**std::array**](/docs/kcl-std/modules/std-array)
|
|
||||||
* [`map`](/docs/kcl-std/functions/std-array-map)
|
|
||||||
* [`pop`](/docs/kcl-std/functions/std-array-pop)
|
|
||||||
* [`push`](/docs/kcl-std/functions/std-array-push)
|
|
||||||
* [`reduce`](/docs/kcl-std/functions/std-array-reduce)
|
|
||||||
* [**std::math**](/docs/kcl-std/modules/std-math)
|
|
||||||
* [`abs`](/docs/kcl-std/functions/std-math-abs)
|
|
||||||
* [`acos`](/docs/kcl-std/functions/std-math-acos)
|
|
||||||
* [`asin`](/docs/kcl-std/functions/std-math-asin)
|
|
||||||
* [`atan`](/docs/kcl-std/functions/std-math-atan)
|
|
||||||
* [`atan2`](/docs/kcl-std/functions/std-math-atan2)
|
|
||||||
* [`ceil`](/docs/kcl-std/functions/std-math-ceil)
|
|
||||||
* [`cos`](/docs/kcl-std/functions/std-math-cos)
|
|
||||||
* [`floor`](/docs/kcl-std/functions/std-math-floor)
|
|
||||||
* [`legAngX`](/docs/kcl-std/functions/std-math-legAngX)
|
|
||||||
* [`legAngY`](/docs/kcl-std/functions/std-math-legAngY)
|
|
||||||
* [`legLen`](/docs/kcl-std/functions/std-math-legLen)
|
|
||||||
* [`ln`](/docs/kcl-std/functions/std-math-ln)
|
|
||||||
* [`log`](/docs/kcl-std/functions/std-math-log)
|
|
||||||
* [`log10`](/docs/kcl-std/functions/std-math-log10)
|
|
||||||
* [`log2`](/docs/kcl-std/functions/std-math-log2)
|
|
||||||
* [`max`](/docs/kcl-std/functions/std-math-max)
|
|
||||||
* [`min`](/docs/kcl-std/functions/std-math-min)
|
|
||||||
* [`polar`](/docs/kcl-std/functions/std-math-polar)
|
|
||||||
* [`pow`](/docs/kcl-std/functions/std-math-pow)
|
|
||||||
* [`rem`](/docs/kcl-std/functions/std-math-rem)
|
|
||||||
* [`round`](/docs/kcl-std/functions/std-math-round)
|
|
||||||
* [`sin`](/docs/kcl-std/functions/std-math-sin)
|
|
||||||
* [`sqrt`](/docs/kcl-std/functions/std-math-sqrt)
|
|
||||||
* [`tan`](/docs/kcl-std/functions/std-math-tan)
|
|
||||||
* [**std::sketch**](/docs/kcl-std/modules/std-sketch)
|
|
||||||
* [`angledLine`](/docs/kcl-std/angledLine)
|
|
||||||
* [`angledLineThatIntersects`](/docs/kcl-std/angledLineThatIntersects)
|
|
||||||
* [`arc`](/docs/kcl-std/arc)
|
|
||||||
* [`bezierCurve`](/docs/kcl-std/bezierCurve)
|
|
||||||
* [`circle`](/docs/kcl-std/functions/std-sketch-circle)
|
|
||||||
* [`circleThreePoint`](/docs/kcl-std/circleThreePoint)
|
|
||||||
* [`close`](/docs/kcl-std/close)
|
|
||||||
* [`extrude`](/docs/kcl-std/extrude)
|
|
||||||
* [`getCommonEdge`](/docs/kcl-std/getCommonEdge)
|
|
||||||
* [`getNextAdjacentEdge`](/docs/kcl-std/getNextAdjacentEdge)
|
|
||||||
* [`getOppositeEdge`](/docs/kcl-std/getOppositeEdge)
|
|
||||||
* [`getPreviousAdjacentEdge`](/docs/kcl-std/getPreviousAdjacentEdge)
|
|
||||||
* [`involuteCircular`](/docs/kcl-std/involuteCircular)
|
|
||||||
* [`lastSegX`](/docs/kcl-std/lastSegX)
|
|
||||||
* [`lastSegY`](/docs/kcl-std/lastSegY)
|
|
||||||
* [`line`](/docs/kcl-std/line)
|
|
||||||
* [`loft`](/docs/kcl-std/loft)
|
|
||||||
* [`patternCircular2d`](/docs/kcl-std/patternCircular2d)
|
|
||||||
* [`patternTransform2d`](/docs/kcl-std/functions/std-sketch-patternTransform2d)
|
|
||||||
* [`polygon`](/docs/kcl-std/polygon)
|
|
||||||
* [`profileStart`](/docs/kcl-std/profileStart)
|
|
||||||
* [`profileStartX`](/docs/kcl-std/profileStartX)
|
|
||||||
* [`profileStartY`](/docs/kcl-std/profileStartY)
|
|
||||||
* [`revolve`](/docs/kcl-std/functions/std-sketch-revolve)
|
|
||||||
* [`segAng`](/docs/kcl-std/segAng)
|
|
||||||
* [`segEnd`](/docs/kcl-std/segEnd)
|
|
||||||
* [`segEndX`](/docs/kcl-std/segEndX)
|
|
||||||
* [`segEndY`](/docs/kcl-std/segEndY)
|
|
||||||
* [`segLen`](/docs/kcl-std/segLen)
|
|
||||||
* [`segStart`](/docs/kcl-std/segStart)
|
|
||||||
* [`segStartX`](/docs/kcl-std/segStartX)
|
|
||||||
* [`segStartY`](/docs/kcl-std/segStartY)
|
|
||||||
* [`startProfile`](/docs/kcl-std/startProfile)
|
|
||||||
* [`startSketchOn`](/docs/kcl-std/startSketchOn)
|
|
||||||
* [`subtract2d`](/docs/kcl-std/subtract2d)
|
|
||||||
* [`sweep`](/docs/kcl-std/sweep)
|
|
||||||
* [`tangentToEnd`](/docs/kcl-std/tangentToEnd)
|
|
||||||
* [`tangentialArc`](/docs/kcl-std/tangentialArc)
|
|
||||||
* [`xLine`](/docs/kcl-std/xLine)
|
|
||||||
* [`yLine`](/docs/kcl-std/yLine)
|
|
||||||
* [**std::solid**](/docs/kcl-std/modules/std-solid)
|
|
||||||
* [`chamfer`](/docs/kcl-std/functions/std-solid-chamfer)
|
|
||||||
* [`fillet`](/docs/kcl-std/functions/std-solid-fillet)
|
|
||||||
* [`hollow`](/docs/kcl-std/functions/std-solid-hollow)
|
|
||||||
* [`intersect`](/docs/kcl-std/intersect)
|
|
||||||
* [`patternCircular3d`](/docs/kcl-std/patternCircular3d)
|
|
||||||
* [`patternLinear3d`](/docs/kcl-std/patternLinear3d)
|
|
||||||
* [`patternTransform`](/docs/kcl-std/functions/std-solid-patternTransform)
|
|
||||||
* [`shell`](/docs/kcl-std/functions/std-solid-shell)
|
|
||||||
* [`subtract`](/docs/kcl-std/subtract)
|
|
||||||
* [`union`](/docs/kcl-std/union)
|
|
||||||
* [**std::transform**](/docs/kcl-std/modules/std-transform)
|
|
||||||
* [`mirror2d`](/docs/kcl-std/functions/std-transform-mirror2d)
|
|
||||||
* [`rotate`](/docs/kcl-std/rotate)
|
|
||||||
* [`scale`](/docs/kcl-std/scale)
|
|
||||||
* [`translate`](/docs/kcl-std/translate)
|
|
||||||
* [**std::units**](/docs/kcl-std/modules/std-units)
|
|
||||||
* [`units::toCentimeters`](/docs/kcl-std/functions/std-units-toCentimeters)
|
|
||||||
* [`units::toDegrees`](/docs/kcl-std/functions/std-units-toDegrees)
|
|
||||||
* [`units::toFeet`](/docs/kcl-std/functions/std-units-toFeet)
|
|
||||||
* [`units::toInches`](/docs/kcl-std/functions/std-units-toInches)
|
|
||||||
* [`units::toMeters`](/docs/kcl-std/functions/std-units-toMeters)
|
|
||||||
* [`units::toMillimeters`](/docs/kcl-std/functions/std-units-toMillimeters)
|
|
||||||
* [`units::toRadians`](/docs/kcl-std/functions/std-units-toRadians)
|
|
||||||
* [`units::toYards`](/docs/kcl-std/functions/std-units-toYards)
|
|
||||||
|
|
||||||
### Constants
|
|
||||||
|
|
||||||
* [**std**](/docs/kcl-std/modules/std)
|
|
||||||
* [`END`](/docs/kcl-std/consts/std-END)
|
|
||||||
* [`START`](/docs/kcl-std/consts/std-START)
|
|
||||||
* [`X`](/docs/kcl-std/consts/std-X)
|
|
||||||
* [`XY`](/docs/kcl-std/consts/std-XY)
|
|
||||||
* [`XZ`](/docs/kcl-std/consts/std-XZ)
|
|
||||||
* [`Y`](/docs/kcl-std/consts/std-Y)
|
|
||||||
* [`YZ`](/docs/kcl-std/consts/std-YZ)
|
|
||||||
* [`Z`](/docs/kcl-std/consts/std-Z)
|
|
||||||
* [**std::math**](/docs/kcl-std/modules/std-math)
|
|
||||||
* [`E`](/docs/kcl-std/consts/std-math-E)
|
|
||||||
* [`PI`](/docs/kcl-std/consts/std-math-PI)
|
|
||||||
* [`TAU`](/docs/kcl-std/consts/std-math-TAU)
|
|
||||||
* [**std::sweep**](/docs/kcl-std/modules/std-sweep)
|
|
||||||
* [`sweep::SKETCH_PLANE`](/docs/kcl-std/consts/std-sweep-SKETCH_PLANE)
|
|
||||||
* [`sweep::TRAJECTORY`](/docs/kcl-std/consts/std-sweep-TRAJECTORY)
|
|
||||||
* [**std::turns**](/docs/kcl-std/modules/std-turns)
|
|
||||||
* [`turns::HALF_TURN`](/docs/kcl-std/consts/std-turns-HALF_TURN)
|
|
||||||
* [`turns::QUARTER_TURN`](/docs/kcl-std/consts/std-turns-QUARTER_TURN)
|
|
||||||
* [`turns::THREE_QUARTER_TURN`](/docs/kcl-std/consts/std-turns-THREE_QUARTER_TURN)
|
|
||||||
* [`turns::ZERO`](/docs/kcl-std/consts/std-turns-ZERO)
|
|
||||||
|
|
||||||
### Types
|
|
||||||
|
|
||||||
See also the [types overview](/docs/kcl-lang/types)
|
|
||||||
|
|
||||||
* [**Primitive types**](/docs/kcl-lang/types)
|
|
||||||
* [`End`](/docs/kcl-lang/types#End)
|
|
||||||
* [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry)
|
|
||||||
* [`Start`](/docs/kcl-lang/types#Start)
|
|
||||||
* [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator)
|
|
||||||
* [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier)
|
|
||||||
* [`any`](/docs/kcl-std/types/std-types-any)
|
|
||||||
* [`bool`](/docs/kcl-std/types/std-types-bool)
|
|
||||||
* [`fn`](/docs/kcl-std/types/std-types-fn)
|
|
||||||
* [`number`](/docs/kcl-std/types/std-types-number)
|
|
||||||
* [`string`](/docs/kcl-std/types/std-types-string)
|
|
||||||
* [`tag`](/docs/kcl-std/types/std-types-tag)
|
|
||||||
* [**std::types**](/docs/kcl-std/modules/std-types)
|
|
||||||
* [`Axis2d`](/docs/kcl-std/types/std-types-Axis2d)
|
|
||||||
* [`Axis3d`](/docs/kcl-std/types/std-types-Axis3d)
|
|
||||||
* [`Edge`](/docs/kcl-std/types/std-types-Edge)
|
|
||||||
* [`Face`](/docs/kcl-std/types/std-types-Face)
|
|
||||||
* [`Helix`](/docs/kcl-std/types/std-types-Helix)
|
|
||||||
* [`Plane`](/docs/kcl-std/types/std-types-Plane)
|
|
||||||
* [`Point2d`](/docs/kcl-std/types/std-types-Point2d)
|
|
||||||
* [`Point3d`](/docs/kcl-std/types/std-types-Point3d)
|
|
||||||
* [`Sketch`](/docs/kcl-std/types/std-types-Sketch)
|
|
||||||
* [`Solid`](/docs/kcl-std/types/std-types-Solid)
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
title: "array"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "Functions for manipulating arrays of values. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Functions for manipulating arrays of values.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`map`](/docs/kcl-std/functions/std-array-map)
|
|
||||||
* [`pop`](/docs/kcl-std/functions/std-array-pop)
|
|
||||||
* [`push`](/docs/kcl-std/functions/std-array-push)
|
|
||||||
* [`reduce`](/docs/kcl-std/functions/std-array-reduce)
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
title: "math"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "Functions for mathematical operations and some useful constants. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Functions for mathematical operations and some useful constants.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`E`](/docs/kcl-std/consts/std-math-E)
|
|
||||||
* [`PI`](/docs/kcl-std/consts/std-math-PI)
|
|
||||||
* [`TAU`](/docs/kcl-std/consts/std-math-TAU)
|
|
||||||
* [`abs`](/docs/kcl-std/functions/std-math-abs)
|
|
||||||
* [`acos`](/docs/kcl-std/functions/std-math-acos)
|
|
||||||
* [`asin`](/docs/kcl-std/functions/std-math-asin)
|
|
||||||
* [`atan`](/docs/kcl-std/functions/std-math-atan)
|
|
||||||
* [`atan2`](/docs/kcl-std/functions/std-math-atan2)
|
|
||||||
* [`ceil`](/docs/kcl-std/functions/std-math-ceil)
|
|
||||||
* [`cos`](/docs/kcl-std/functions/std-math-cos)
|
|
||||||
* [`floor`](/docs/kcl-std/functions/std-math-floor)
|
|
||||||
* [`legAngX`](/docs/kcl-std/functions/std-math-legAngX)
|
|
||||||
* [`legAngY`](/docs/kcl-std/functions/std-math-legAngY)
|
|
||||||
* [`legLen`](/docs/kcl-std/functions/std-math-legLen)
|
|
||||||
* [`ln`](/docs/kcl-std/functions/std-math-ln)
|
|
||||||
* [`log`](/docs/kcl-std/functions/std-math-log)
|
|
||||||
* [`log10`](/docs/kcl-std/functions/std-math-log10)
|
|
||||||
* [`log2`](/docs/kcl-std/functions/std-math-log2)
|
|
||||||
* [`max`](/docs/kcl-std/functions/std-math-max)
|
|
||||||
* [`min`](/docs/kcl-std/functions/std-math-min)
|
|
||||||
* [`polar`](/docs/kcl-std/functions/std-math-polar)
|
|
||||||
* [`pow`](/docs/kcl-std/functions/std-math-pow)
|
|
||||||
* [`rem`](/docs/kcl-std/functions/std-math-rem)
|
|
||||||
* [`round`](/docs/kcl-std/functions/std-math-round)
|
|
||||||
* [`sin`](/docs/kcl-std/functions/std-math-sin)
|
|
||||||
* [`sqrt`](/docs/kcl-std/functions/std-math-sqrt)
|
|
||||||
* [`tan`](/docs/kcl-std/functions/std-math-tan)
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
title: "sketch"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "Sketching is the foundational activity for most KCL programs. A sketch is a two-dimensional drawing made from paths or shapes. A sketch is always drawn on a surface (either an abstract plane of a face of a solid). A sketch can be made into a solid by extruding it (or revolving, etc.). "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Sketching is the foundational activity for most KCL programs. A sketch is a two-dimensional drawing made from paths or shapes. A sketch is always drawn on a surface (either an abstract plane of a face of a solid). A sketch can be made into a solid by extruding it (or revolving, etc.).
|
|
||||||
|
|
||||||
This module contains functions for creating and manipulating sketches, and making them into solids.
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`angledLine`](/docs/kcl-std/angledLine)
|
|
||||||
* [`angledLineThatIntersects`](/docs/kcl-std/angledLineThatIntersects)
|
|
||||||
* [`arc`](/docs/kcl-std/arc)
|
|
||||||
* [`bezierCurve`](/docs/kcl-std/bezierCurve)
|
|
||||||
* [`circle`](/docs/kcl-std/functions/std-sketch-circle)
|
|
||||||
* [`circleThreePoint`](/docs/kcl-std/circleThreePoint)
|
|
||||||
* [`close`](/docs/kcl-std/close)
|
|
||||||
* [`extrude`](/docs/kcl-std/extrude)
|
|
||||||
* [`getCommonEdge`](/docs/kcl-std/getCommonEdge)
|
|
||||||
* [`getNextAdjacentEdge`](/docs/kcl-std/getNextAdjacentEdge)
|
|
||||||
* [`getOppositeEdge`](/docs/kcl-std/getOppositeEdge)
|
|
||||||
* [`getPreviousAdjacentEdge`](/docs/kcl-std/getPreviousAdjacentEdge)
|
|
||||||
* [`involuteCircular`](/docs/kcl-std/involuteCircular)
|
|
||||||
* [`lastSegX`](/docs/kcl-std/lastSegX)
|
|
||||||
* [`lastSegY`](/docs/kcl-std/lastSegY)
|
|
||||||
* [`line`](/docs/kcl-std/line)
|
|
||||||
* [`loft`](/docs/kcl-std/loft)
|
|
||||||
* [`patternCircular2d`](/docs/kcl-std/patternCircular2d)
|
|
||||||
* [`patternTransform2d`](/docs/kcl-std/functions/std-sketch-patternTransform2d)
|
|
||||||
* [`polygon`](/docs/kcl-std/polygon)
|
|
||||||
* [`profileStart`](/docs/kcl-std/profileStart)
|
|
||||||
* [`profileStartX`](/docs/kcl-std/profileStartX)
|
|
||||||
* [`profileStartY`](/docs/kcl-std/profileStartY)
|
|
||||||
* [`revolve`](/docs/kcl-std/functions/std-sketch-revolve)
|
|
||||||
* [`segAng`](/docs/kcl-std/segAng)
|
|
||||||
* [`segEnd`](/docs/kcl-std/segEnd)
|
|
||||||
* [`segEndX`](/docs/kcl-std/segEndX)
|
|
||||||
* [`segEndY`](/docs/kcl-std/segEndY)
|
|
||||||
* [`segLen`](/docs/kcl-std/segLen)
|
|
||||||
* [`segStart`](/docs/kcl-std/segStart)
|
|
||||||
* [`segStartX`](/docs/kcl-std/segStartX)
|
|
||||||
* [`segStartY`](/docs/kcl-std/segStartY)
|
|
||||||
* [`startProfile`](/docs/kcl-std/startProfile)
|
|
||||||
* [`startSketchOn`](/docs/kcl-std/startSketchOn)
|
|
||||||
* [`subtract2d`](/docs/kcl-std/subtract2d)
|
|
||||||
* [`sweep`](/docs/kcl-std/sweep)
|
|
||||||
* [`tangentToEnd`](/docs/kcl-std/tangentToEnd)
|
|
||||||
* [`tangentialArc`](/docs/kcl-std/tangentialArc)
|
|
||||||
* [`xLine`](/docs/kcl-std/xLine)
|
|
||||||
* [`yLine`](/docs/kcl-std/yLine)
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
title: "solid"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "This module contains functions for modifying solids, e.g., by adding a fillet or chamfer, or removing part of a solid. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
This module contains functions for modifying solids, e.g., by adding a fillet or chamfer, or removing part of a solid.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`chamfer`](/docs/kcl-std/functions/std-solid-chamfer)
|
|
||||||
* [`fillet`](/docs/kcl-std/functions/std-solid-fillet)
|
|
||||||
* [`hollow`](/docs/kcl-std/functions/std-solid-hollow)
|
|
||||||
* [`intersect`](/docs/kcl-std/intersect)
|
|
||||||
* [`patternCircular3d`](/docs/kcl-std/patternCircular3d)
|
|
||||||
* [`patternLinear3d`](/docs/kcl-std/patternLinear3d)
|
|
||||||
* [`patternTransform`](/docs/kcl-std/functions/std-solid-patternTransform)
|
|
||||||
* [`shell`](/docs/kcl-std/functions/std-solid-shell)
|
|
||||||
* [`subtract`](/docs/kcl-std/subtract)
|
|
||||||
* [`union`](/docs/kcl-std/union)
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
title: "sweep"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: ""
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`sweep::SKETCH_PLANE`](/docs/kcl-std/consts/std-sweep-SKETCH_PLANE)
|
|
||||||
* [`sweep::TRAJECTORY`](/docs/kcl-std/consts/std-sweep-TRAJECTORY)
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
title: "transform"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "This module contains functions for transforming sketches and solids. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
This module contains functions for transforming sketches and solids.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`mirror2d`](/docs/kcl-std/functions/std-transform-mirror2d)
|
|
||||||
* [`rotate`](/docs/kcl-std/rotate)
|
|
||||||
* [`scale`](/docs/kcl-std/scale)
|
|
||||||
* [`translate`](/docs/kcl-std/translate)
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
title: "turns"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "This module contains a few handy constants for defining turns. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
This module contains a few handy constants for defining turns.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`turns::HALF_TURN`](/docs/kcl-std/consts/std-turns-HALF_TURN)
|
|
||||||
* [`turns::QUARTER_TURN`](/docs/kcl-std/consts/std-turns-QUARTER_TURN)
|
|
||||||
* [`turns::THREE_QUARTER_TURN`](/docs/kcl-std/consts/std-turns-THREE_QUARTER_TURN)
|
|
||||||
* [`turns::ZERO`](/docs/kcl-std/consts/std-turns-ZERO)
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: "types"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "KCL types. This module contains fundamental types like `number`, `string`, `Solid`, and `Sketch`. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
KCL types. This module contains fundamental types like `number`, `string`, `Solid`, and `Sketch`.
|
|
||||||
|
|
||||||
Types can (optionally) be used to describe a function's arguments and returned value. They are checked when a program runs and can help avoid errors. They are also useful to help document what a function does.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Types
|
|
||||||
|
|
||||||
* [`Axis2d`](/docs/kcl-std/types/std-types-Axis2d)
|
|
||||||
* [`Axis3d`](/docs/kcl-std/types/std-types-Axis3d)
|
|
||||||
* [`Edge`](/docs/kcl-std/types/std-types-Edge)
|
|
||||||
* [`Face`](/docs/kcl-std/types/std-types-Face)
|
|
||||||
* [`Helix`](/docs/kcl-std/types/std-types-Helix)
|
|
||||||
* [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry)
|
|
||||||
* [`Plane`](/docs/kcl-std/types/std-types-Plane)
|
|
||||||
* [`Point2d`](/docs/kcl-std/types/std-types-Point2d)
|
|
||||||
* [`Point3d`](/docs/kcl-std/types/std-types-Point3d)
|
|
||||||
* [`Sketch`](/docs/kcl-std/types/std-types-Sketch)
|
|
||||||
* [`Solid`](/docs/kcl-std/types/std-types-Solid)
|
|
||||||
* [`any`](/docs/kcl-std/types/std-types-any)
|
|
||||||
* [`bool`](/docs/kcl-std/types/std-types-bool)
|
|
||||||
* [`fn`](/docs/kcl-std/types/std-types-fn)
|
|
||||||
* [`number`](/docs/kcl-std/types/std-types-number)
|
|
||||||
* [`string`](/docs/kcl-std/types/std-types-string)
|
|
||||||
* [`tag`](/docs/kcl-std/types/std-types-tag)
|
|
@ -1,25 +0,0 @@
|
|||||||
---
|
|
||||||
title: "units"
|
|
||||||
subtitle: "Module in std"
|
|
||||||
excerpt: "Functions for converting numbers to different units. "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Functions for converting numbers to different units.
|
|
||||||
|
|
||||||
All numbers in KCL include units, e.g., the number `42` is always '42 mm' or '42 degrees', etc. it is never just '42'. For more information, see [numeric types](/docs/kcl-lang/numeric).
|
|
||||||
|
|
||||||
Note that you only need to explicitly convert the units of a number if you need a specific unit for your own calculations. When calling a function, KCL will convert a number to the required units automatically (where possible, and give an error or warning if it's not possible).
|
|
||||||
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`units::toCentimeters`](/docs/kcl-std/functions/std-units-toCentimeters)
|
|
||||||
* [`units::toDegrees`](/docs/kcl-std/functions/std-units-toDegrees)
|
|
||||||
* [`units::toFeet`](/docs/kcl-std/functions/std-units-toFeet)
|
|
||||||
* [`units::toInches`](/docs/kcl-std/functions/std-units-toInches)
|
|
||||||
* [`units::toMeters`](/docs/kcl-std/functions/std-units-toMeters)
|
|
||||||
* [`units::toMillimeters`](/docs/kcl-std/functions/std-units-toMillimeters)
|
|
||||||
* [`units::toRadians`](/docs/kcl-std/functions/std-units-toRadians)
|
|
||||||
* [`units::toYards`](/docs/kcl-std/functions/std-units-toYards)
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
title: "std"
|
|
||||||
subtitle: "Module in std::"
|
|
||||||
excerpt: "The KCL standard library "
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
The KCL standard library
|
|
||||||
|
|
||||||
Contains frequently used constants, functions for interacting with the KittyCAD servers to create sketches and geometry, and utility functions.
|
|
||||||
|
|
||||||
The standard library is organised into modules (listed below), but most things are always available in KCL programs.
|
|
||||||
|
|
||||||
You might also want the [KCL language reference](/docs/kcl-lang) or the [KCL guide](https://zoo.dev/docs/kcl-book/intro.html).
|
|
||||||
|
|
||||||
## Modules
|
|
||||||
|
|
||||||
* [`array`](/docs/kcl-std/modules/std-array)
|
|
||||||
* [`math`](/docs/kcl-std/modules/std-math)
|
|
||||||
* [`sketch`](/docs/kcl-std/modules/std-sketch)
|
|
||||||
* [`solid`](/docs/kcl-std/modules/std-solid)
|
|
||||||
* [`sweep::sweep`](/docs/kcl-std/modules/std-sweep)
|
|
||||||
* [`transform`](/docs/kcl-std/modules/std-transform)
|
|
||||||
* [`turns::turns`](/docs/kcl-std/modules/std-turns)
|
|
||||||
* [`types`](/docs/kcl-std/modules/std-types)
|
|
||||||
* [`units::units`](/docs/kcl-std/modules/std-units)
|
|
||||||
|
|
||||||
## Functions and constants
|
|
||||||
|
|
||||||
* [`END`](/docs/kcl-std/consts/std-END)
|
|
||||||
* [`START`](/docs/kcl-std/consts/std-START)
|
|
||||||
* [`X`](/docs/kcl-std/consts/std-X)
|
|
||||||
* [`XY`](/docs/kcl-std/consts/std-XY)
|
|
||||||
* [`XZ`](/docs/kcl-std/consts/std-XZ)
|
|
||||||
* [`Y`](/docs/kcl-std/consts/std-Y)
|
|
||||||
* [`YZ`](/docs/kcl-std/consts/std-YZ)
|
|
||||||
* [`Z`](/docs/kcl-std/consts/std-Z)
|
|
||||||
* [`appearance`](/docs/kcl-std/appearance)
|
|
||||||
* [`assert`](/docs/kcl-std/assert)
|
|
||||||
* [`assertIs`](/docs/kcl-std/assertIs)
|
|
||||||
* [`clone`](/docs/kcl-std/functions/std-clone)
|
|
||||||
* [`helix`](/docs/kcl-std/functions/std-helix)
|
|
||||||
* [`offsetPlane`](/docs/kcl-std/functions/std-offsetPlane)
|
|
||||||
* [`patternLinear2d`](/docs/kcl-std/patternLinear2d)
|
|
||||||
|
|
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
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Axis2d"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "An abstract and infinite line in 2d space."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract and infinite line in 2d space.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Axis3d"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "An abstract and infinite line in 3d space."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract and infinite line in 3d space.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Edge"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "An edge of a solid."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An edge of a solid.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Face"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "A face of a solid."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A face of a solid.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Helix"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "A helix; created by the `helix` function."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A helix; created by the `helix` function.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "ImportedGeometry"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "Represents geometry which is defined using some other CAD system and imported into KCL."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
Represents geometry which is defined using some other CAD system and imported into KCL.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Plane"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "An abstract plane."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
An abstract plane.
|
|
||||||
|
|
||||||
A plane has a position and orientation in space defined by its origin and axes. A plane is abstract
|
|
||||||
in the sense that it is not part of the objects being drawn. A plane can be used to sketch on.
|
|
||||||
|
|
||||||
A plane can be created in several ways:
|
|
||||||
- you can use one of the default planes, e.g., `XY`.
|
|
||||||
- you can use `offsetPlane` to create a new plane offset from an existing one, e.g., `offsetPlane(XY, offset = 150)`.
|
|
||||||
- you can use negation to create a plane from an existing one which is identical but has an opposite normal
|
|
||||||
e.g., `-XY`.
|
|
||||||
- you can define an entirely custom plane, e.g.,
|
|
||||||
|
|
||||||
```js
|
|
||||||
myXY = {
|
|
||||||
origin = { x = 0, y = 0, z = 0 },
|
|
||||||
xAxis = { x = 1, y = 0, z = 0 },
|
|
||||||
yAxis = { x = 0, y = 1, z = 0 },
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Any object with appropriate `origin`, `xAxis`, and `yAxis` fields can be used as a plane.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Point2d"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "A point in two dimensional space."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A point in two dimensional space.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
type Point2d = [number(Length); 2]
|
|
||||||
```
|
|
||||||
|
|
||||||
[`Point2d`](/docs/kcl-std/types/std-types-Point2d) is an alias for a two-element array of [number](/docs/kcl-std/types/std-types-number)s. To write a value
|
|
||||||
with type [`Point2d`](/docs/kcl-std/types/std-types-Point2d), use an array, e.g., `[0, 0]` or `[5.0, 3.14]`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Point3d"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "A point in three dimensional space."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A point in three dimensional space.
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
type Point3d = [number(Length); 3]
|
|
||||||
```
|
|
||||||
|
|
||||||
[`Point3d`](/docs/kcl-std/types/std-types-Point3d) is an alias for a three-element array of [number](/docs/kcl-std/types/std-types-number)s. To write a value
|
|
||||||
with type [`Point3d`](/docs/kcl-std/types/std-types-Point3d), use an array, e.g., `[0, 0, 0]` or `[5.0, 3.14, 6.8]`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
title: "any"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: ""
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The [`any`](/docs/kcl-std/types/std-types-any) type is the type of all possible values in KCL. I.e., if a function accepts an argument
|
|
||||||
with type [`any`](/docs/kcl-std/types/std-types-any), then it can accept any value.
|
|
||||||
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
```kcl
|
|
||||||
fn acceptAnything(@input: any) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
acceptAnything(42)
|
|
||||||
acceptAnything('hello')
|
|
||||||
acceptAnything(XY)
|
|
||||||
acceptAnything([0, 1, 2])
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
title: "fn"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "The type of any function in KCL."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
The type of any function in KCL.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
title: "number"
|
|
||||||
subtitle: "Type in std::types"
|
|
||||||
excerpt: "A number."
|
|
||||||
layout: manual
|
|
||||||
---
|
|
||||||
|
|
||||||
A number.
|
|
||||||
|
|
||||||
May be signed or unsigned, an integer or decimal value.
|
|
||||||
|
|
||||||
KCL numbers always include units, e.g., the number `42` is always '42 mm' or '42 degrees', etc.
|
|
||||||
it is never just '42'. The [`number`](/docs/kcl-std/types/std-types-number) type may or may not include units, if none are specified, then
|
|
||||||
it is the type of any number. E.g.,
|
|
||||||
|
|
||||||
- [`number`](/docs/kcl-std/types/std-types-number): the type of any numbers,
|
|
||||||
- [`number(mm)`](/docs/kcl-std/types/std-types-number): the type of numbers in millimeters,
|
|
||||||
- [`number(in)`](/docs/kcl-std/types/std-types-number): the type of numbers in inches,
|
|
||||||
- [`number(Length)`](/docs/kcl-std/types/std-types-number): the type of numbers in any length unit,
|
|
||||||
- [`number(deg)`](/docs/kcl-std/types/std-types-number): the type of numbers in degrees,
|
|
||||||
- [`number(Angle)`](/docs/kcl-std/types/std-types-number): the type of numbers in any angle unit,
|
|
||||||
- [`number(_)`](/docs/kcl-std/types/std-types-number) or [`number(Count)`](/docs/kcl-std/types/std-types-number): the type of unit-less numbers, representing a count of things,
|
|
||||||
or a ratio, etc.
|
|
||||||
|
|
||||||
For more information, see [numeric types](/docs/kcl-lang/numeric).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user