Compare commits

..

3 Commits

1749 changed files with 20794 additions and 66060 deletions

View File

@ -1,6 +1,3 @@
rust/**/*.ts src/wasm-lib/*
!rust/kcl-language-server/client/src/**/*.ts
*.typegen.ts *.typegen.ts
packages/codemirror-lsp-client/dist/* packages/codemirror-lsp-client/dist/*
e2e/playwright/snapshots/prompt-to-edit/*
.vscode-test

View File

@ -4,7 +4,6 @@
"project": "./tsconfig.json" "project": "./tsconfig.json"
}, },
"plugins": [ "plugins": [
"react-perf",
"css-modules", "css-modules",
"jest", "jest",
"jsx-a11y", "jsx-a11y",

View File

@ -1,8 +0,0 @@
FROM node:slim
COPY . /action
WORKDIR /action
RUN npm install --production
ENTRYPOINT ["node", "/action/main.js"]

View File

@ -1,21 +0,0 @@
# github-release
Copy-pasted from
https://github.com/bytecodealliance/wasmtime/tree/8acfdbdd8aa550d1b84e0ce1e6222a6605d14e38/.github/actions/github-release
An action used to publish GitHub releases for `wasmtime`.
As of the time of this writing there's a few actions floating around which
perform github releases but they all tend to have their set of drawbacks.
Additionally nothing handles deleting releases which we need for our rolling
`dev` release.
To handle all this, this action rolls its own implementation using the
actions/toolkit repository and packages published there. These run in a Docker
container and take various inputs to orchestrate the release from the build.
More comments can be found in `main.js`.
Testing this is really hard. If you want to try though run `npm install` and
then `node main.js`. You'll have to configure a bunch of env vars though to get
anything reasonably working.

View File

@ -1,15 +0,0 @@
name: "wasmtime github releases"
description: "wasmtime github releases"
inputs:
token:
description: ""
required: true
name:
description: ""
required: true
files:
description: ""
required: true
runs:
using: "docker"
image: "Dockerfile"

View File

@ -1,143 +0,0 @@
const core = require("@actions/core");
const path = require("path");
const fs = require("fs");
const github = require("@actions/github");
const glob = require("glob");
function sleep(milliseconds) {
return new Promise((resolve) => setTimeout(resolve, milliseconds));
}
async function runOnce() {
// Load all our inputs and env vars. Note that `getInput` reads from `INPUT_*`
const files = core.getInput("files");
const name = core.getInput("name");
const token = core.getInput("token");
const slug = process.env.GITHUB_REPOSITORY;
const owner = slug.split("/")[0];
const repo = slug.split("/")[1];
const sha = process.env.HEAD_SHA;
core.info(`files: ${files}`);
core.info(`name: ${name}`);
const options = {
request: {
timeout: 30000,
},
};
const octokit = github.getOctokit(token, options);
// Delete the previous release since we can't overwrite one. This may happen
// due to retrying an upload or it may happen because we're doing the dev
// release.
const releases = await octokit.paginate("GET /repos/:owner/:repo/releases", { owner, repo });
for (const release of releases) {
if (release.tag_name !== name) {
continue;
}
const release_id = release.id;
core.info(`deleting release ${release_id}`);
await octokit.rest.repos.deleteRelease({ owner, repo, release_id });
}
// We also need to update the `dev` tag while we're at it on the `dev` branch.
if (name == "nightly") {
try {
core.info(`updating nightly tag`);
await octokit.rest.git.updateRef({
owner,
repo,
ref: "tags/nightly",
sha,
force: true,
});
} catch (e) {
core.error(e);
core.info(`creating nightly tag`);
await octokit.rest.git.createTag({
owner,
repo,
tag: "nightly",
message: "nightly release",
object: sha,
type: "commit",
});
}
}
// Creates an official GitHub release for this `tag`, and if this is `dev`
// then we know that from the previous block this should be a fresh release.
core.info(`creating a release`);
const release = await octokit.rest.repos.createRelease({
owner,
repo,
name,
tag_name: name,
target_commitish: sha,
prerelease: name === "nightly",
});
const release_id = release.data.id;
// Upload all the relevant assets for this release as just general blobs.
for (const file of glob.sync(files)) {
const size = fs.statSync(file).size;
const name = path.basename(file);
await runWithRetry(async function () {
// We can't overwrite assets, so remove existing ones from a previous try.
let assets = await octokit.rest.repos.listReleaseAssets({
owner,
repo,
release_id,
});
for (const asset of assets.data) {
if (asset.name === name) {
core.info(`delete asset ${name}`);
const asset_id = asset.id;
await octokit.rest.repos.deleteReleaseAsset({ owner, repo, asset_id });
}
}
core.info(`upload ${file}`);
const headers = { "content-length": size, "content-type": "application/octet-stream" };
const data = fs.createReadStream(file);
await octokit.rest.repos.uploadReleaseAsset({
data,
headers,
name,
url: release.data.upload_url,
});
});
}
}
async function runWithRetry(f) {
const retries = 10;
const maxDelay = 4000;
let delay = 1000;
for (let i = 0; i < retries; i++) {
try {
await f();
break;
} catch (e) {
if (i === retries - 1) throw e;
core.error(e);
const currentDelay = Math.round(Math.random() * delay);
core.info(`sleeping ${currentDelay} ms`);
await sleep(currentDelay);
delay = Math.min(delay * 2, maxDelay);
}
}
}
async function run() {
await runWithRetry(runOnce);
}
run().catch((err) => {
core.error(err);
core.setFailed(err.message);
});

View File

@ -1,10 +0,0 @@
{
"name": "wasmtime-github-release",
"version": "0.0.0",
"main": "main.js",
"dependencies": {
"@actions/core": "^1.6",
"@actions/github": "^5.0",
"glob": "^7.1.5"
}
}

View File

@ -10,7 +10,6 @@ updates:
- '/' - '/'
- '/packages/codemirror-lang-kcl/' - '/packages/codemirror-lang-kcl/'
- '/packages/codemirror-lsp-client/' - '/packages/codemirror-lsp-client/'
- '/rust/kcl-language-server/'
schedule: schedule:
interval: weekly interval: weekly
day: monday day: monday
@ -26,7 +25,7 @@ updates:
- adamchalmers - adamchalmers
- jessfraz - jessfraz
- package-ecosystem: 'cargo' # See documentation for possible values - package-ecosystem: 'cargo' # See documentation for possible values
directory: '/rust/' # Location of package manifests directory: '/src/wasm-lib/' # Location of package manifests
schedule: schedule:
interval: weekly interval: weekly
day: monday day: monday
@ -40,11 +39,3 @@ updates:
wasm-bindgen-deps: wasm-bindgen-deps:
patterns: patterns:
- "wasm-bindgen*" - "wasm-bindgen*"
- package-ecosystem: "pip" # See documentation for possible values
directory: "/rust/kcl-python-bindings/" # Location of package manifests
schedule:
interval: weekly
day: monday
reviewers:
- adamchalmers
- jessfraz

View File

@ -21,8 +21,8 @@ jobs:
- name: Cache wasm - name: Cache wasm
uses: Swatinem/rust-cache@v2 uses: Swatinem/rust-cache@v2
with: with:
workspaces: './rust' workspaces: './src/wasm-lib'
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- name: build wasm - name: build wasm
@ -33,4 +33,4 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: wasm-bundle name: wasm-bundle
path: rust/kcl-wasm-lib/pkg path: src/wasm-lib/pkg

View File

@ -7,11 +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]+' 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)
env: env:
IS_RELEASE: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'v') }} IS_RELEASE: ${{ github.ref_type == 'tag' }}
IS_NIGHTLY: ${{ github.ref_type == 'tag' && startsWith(github.ref_name, 'nightly-v') }} IS_NIGHTLY: ${{ github.event_name == 'schedule' }}
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@ -29,7 +32,6 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn'
- run: yarn install - run: yarn install
@ -38,10 +40,10 @@ jobs:
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
with: with:
workspaces: './rust' workspaces: './src/wasm-lib'
# TODO: see if we can fetch from main instead if no diff at rust # TODO: see if we can fetch from main instead if no diff at src/wasm-lib
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
@ -50,10 +52,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: yarn files:flip-to-nightly
export VERSION=${GITHUB_REF_NAME#nightly-v}
yarn files:set-version
yarn files:flip-to-nightly
- name: Set release version - name: Set release version
if: ${{ env.IS_RELEASE == 'true' }} if: ${{ env.IS_RELEASE == 'true' }}
@ -67,7 +66,7 @@ jobs:
path: | path: |
package.json package.json
electron-builder.yml electron-builder.yml
rust/kcl-wasm-lib/pkg/kcl_wasm_lib* src/wasm-lib/pkg/wasm_lib*
release-notes.md release-notes.md
assets/icon.ico assets/icon.ico
assets/icon.png assets/icon.png
@ -117,24 +116,21 @@ jobs:
ls -R prepared-files ls -R prepared-files
cp prepared-files/package.json package.json cp prepared-files/package.json package.json
cp prepared-files/electron-builder.yml electron-builder.yml cp prepared-files/electron-builder.yml electron-builder.yml
cp prepared-files/rust/kcl-wasm-lib/pkg/kcl_wasm_lib_bg.wasm public cp prepared-files/src/wasm-lib/pkg/wasm_lib_bg.wasm public
mkdir rust/kcl-wasm-lib/pkg mkdir src/wasm-lib/pkg
cp prepared-files/rust/kcl-wasm-lib/pkg/kcl_wasm_lib* rust/kcl-wasm-lib/pkg cp prepared-files/src/wasm-lib/pkg/wasm_lib* src/wasm-lib/pkg
cp prepared-files/release-notes.md release-notes.md cp prepared-files/release-notes.md release-notes.md
cp prepared-files/assets/icon.ico assets/icon.ico cp prepared-files/assets/icon.ico assets/icon.ico
cp prepared-files/assets/icon.png assets/icon.png cp prepared-files/assets/icon.png assets/icon.png
- name: Sync node version and setup cache - uses: actions/setup-node@v4
uses: actions/setup-node@v4
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn' # Set this to npm, yarn or pnpm.
- name: yarn install - name: yarn install
# Windows is picky sometimes and fails on fetch. Step takes about ~30s # Windows is picky sometimes and fails on fetch. Step takes about ~30s
uses: nick-fields/retry@v3.0.2 uses: nick-fields/retry@v3.0.1
with: with:
shell: bash
timeout_minutes: 2 timeout_minutes: 2
max_attempts: 3 max_attempts: 3
command: yarn install command: yarn install
@ -184,9 +180,8 @@ jobs:
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }} WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
DEBUG: "electron-notarize*" DEBUG: "electron-notarize*"
# TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures # TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures
uses: nick-fields/retry@v3.0.2 uses: nick-fields/retry@v3.0.1
with: with:
shell: bash
timeout_minutes: 10 timeout_minutes: 10
max_attempts: 3 max_attempts: 3
command: yarn tronb:package:prod command: yarn tronb:package:prod
@ -246,9 +241,8 @@ jobs:
WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }} WINDOWS_CERTIFICATE_THUMBPRINT: ${{ secrets.WINDOWS_CERTIFICATE_THUMBPRINT }}
DEBUG: "electron-notarize*" DEBUG: "electron-notarize*"
# TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures # TODO: Fix electron-notarize flakes. The logs above should help gather more data on failures
uses: nick-fields/retry@v3.0.2 uses: nick-fields/retry@v3.0.1
with: with:
shell: bash
timeout_minutes: 10 timeout_minutes: 10
max_attempts: 3 max_attempts: 3
command: yarn tronb:package:prod command: yarn tronb:package:prod
@ -276,7 +270,7 @@ jobs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
permissions: permissions:
contents: write contents: write
if: ${{ github.ref_type == 'tag' }} if: ${{ github.ref_type == 'tag' || github.event_name == 'schedule' }}
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) }}
@ -333,8 +327,8 @@ jobs:
env: env:
NOTES: ${{ needs.prepare-files.outputs.notes }} NOTES: ${{ needs.prepare-files.outputs.notes }}
PUB_DATE: ${{ github.event.repository.updated_at }} PUB_DATE: ${{ github.event.repository.updated_at }}
WEBSITE_DIR: ${{ env.IS_NIGHTLY == 'true' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }} WEBSITE_DIR: ${{ github.event_name == 'schedule' && 'dl.zoo.dev/releases/modeling-app/nightly' || 'dl.zoo.dev/releases/modeling-app' }}
URL_CODED_NAME: ${{ env.IS_NIGHTLY == 'true' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }} URL_CODED_NAME: ${{ github.event_name == 'schedule' && 'Zoo%20Modeling%20App%20%28Nightly%29' || 'Zoo%20Modeling%20App' }}
run: | run: |
RELEASE_DIR=https://${WEBSITE_DIR} RELEASE_DIR=https://${WEBSITE_DIR}
jq --null-input \ jq --null-input \
@ -389,7 +383,7 @@ jobs:
# see https://github.com/actions/checkout/issues/1471 # see https://github.com/actions/checkout/issues/1471
git fetch --prune --unshallow --tags git fetch --prune --unshallow --tags
export TAG="nightly-${VERSION}" export TAG="nightly-${VERSION}"
export PREVIOUS_TAG=$(git tag --list --sort=-committerdate "nightly-v[0-9]*" | head -n2 | tail -n1) export PREVIOUS_TAG=$(git describe --tags --match="nightly-v[0-9]*" --abbrev=0)
export NOTES=$(./scripts/get-nightly-changelog.sh) export NOTES=$(./scripts/get-nightly-changelog.sh)
yarn files:set-notes yarn files:set-notes
@ -417,3 +411,14 @@ jobs:
- name: Invalidate bucket cache on latest*.yml and last_download.json files - name: Invalidate bucket cache on latest*.yml and last_download.json files
if: ${{ env.IS_NIGHTLY == 'true' }} if: ${{ env.IS_NIGHTLY == 'true' }}
run: yarn files:invalidate-bucket:nightly run: yarn files:invalidate-bucket:nightly
- name: Tag nightly commit
if: ${{ env.IS_NIGHTLY == 'true' }}
uses: actions/github-script@v7
with:
script: |
const { VERSION } = process.env
const { owner, repo } = context.repo
const { sha } = context
const ref = `refs/tags/nightly-${VERSION}`
github.rest.git.createRef({ owner, repo, sha, ref })

View File

@ -17,20 +17,23 @@ jobs:
cargocheck: cargocheck:
name: cargo check name: cargo check
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use correct Rust toolchain - name: Install latest rust
shell: bash uses: actions-rs/toolchain@v1
run: |
cp --update=none rust/rust-toolchain.toml ./ || true
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
cache-workspaces: rust toolchain: stable
override: true
- name: Rust Cache
uses: Swatinem/rust-cache@v2.6.1
- name: Run check - name: Run check
run: | run: |
cd rust cd "${{ matrix.dir }}"
# We specifically want to test the disable-println feature # We specifically want to test the disable-println feature
# Since it is not enabled by default, we need to specify it # Since it is not enabled by default, we need to specify it
# This is used in kcl-lsp # This is used in kcl-lsp

View File

@ -23,22 +23,25 @@ jobs:
cargoclippy: cargoclippy:
name: cargo clippy name: cargo clippy
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: taiki-e/install-action@just - uses: taiki-e/install-action@just
- name: Use correct Rust toolchain - name: Install latest rust
shell: bash uses: actions-rs/toolchain@v1
run: |
cp --update=none rust/rust-toolchain.toml ./ || true
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
cache-workspaces: rust toolchain: stable
components: clippy override: true
components: clippy
- name: Rust Cache
uses: Swatinem/rust-cache@v2.6.1
- name: Run clippy - name: Run clippy
run: | run: |
cd rust cd "${{ matrix.dir }}"
just lint just lint
# If this fails, run "cargo check" to update Cargo.lock, # If this fails, run "cargo check" to update Cargo.lock,
# then add Cargo.lock to the PR. # then add Cargo.lock to the PR.

View File

@ -26,20 +26,23 @@ jobs:
cargofmt: cargofmt:
name: cargo fmt name: cargo fmt
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
dir: ['src/wasm-lib']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use correct Rust toolchain - name: Install latest rust
shell: bash uses: actions-rs/toolchain@v1
run: |
cp --update=none rust/rust-toolchain.toml ./ || true
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
cache-workspaces: rust toolchain: stable
components: rustfmt override: true
components: rustfmt
- name: Rust Cache
uses: Swatinem/rust-cache@v2.6.1
- name: Run cargo fmt - name: Run cargo fmt
run: | run: |
cd rust cd "${{ matrix.dir }}"
cargo fmt -- --check cargo fmt -- --check
shell: bash shell: bash

View File

@ -9,21 +9,21 @@ permissions: read-all
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true cancel-in-progress: true
name: cargo test name: cargo test of wasm-lib
jobs: jobs:
cargotest: cargotest:
name: cargo test name: cargo test
runs-on: ubuntu-latest-8-cores runs-on: ubuntu-latest-8-cores
strategy:
matrix:
dir: ['src/wasm-lib']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Use correct Rust toolchain - name: Install latest rust
shell: bash uses: actions-rs/toolchain@v1
run: |
cp --update=none rust/rust-toolchain.toml ./ || true
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
cache: false # Configured below. toolchain: stable
override: true
- name: Install vector - name: Install vector
run: | run: |
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev > /tmp/vector.sh
@ -42,13 +42,11 @@ jobs:
- uses: taiki-e/install-action@nextest - uses: taiki-e/install-action@nextest
- name: Rust Cache - name: Rust Cache
uses: Swatinem/rust-cache@v2.6.1 uses: Swatinem/rust-cache@v2.6.1
with:
workspaces: rust
- name: cargo test - name: cargo test
shell: bash shell: bash
run: |- run: |-
cd rust cd "${{ matrix.dir }}"
cargo llvm-cov nextest --workspace --lcov --output-path lcov.info --retries=2 --no-fail-fast -P ci 2>&1 | tee /tmp/github-actions.log cargo llvm-cov nextest --workspace --lcov --output-path lcov.info --test-threads=1 --retries=2 --no-fail-fast -P ci 2>&1 | tee /tmp/github-actions.log
env: env:
KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}} KITTYCAD_API_TOKEN: ${{secrets.KITTYCAD_API_TOKEN}}
RUST_MIN_STACK: 10485760000 RUST_MIN_STACK: 10485760000
@ -57,7 +55,7 @@ jobs:
with: with:
token: ${{secrets.CODECOV_TOKEN}} token: ${{secrets.CODECOV_TOKEN}}
fail_ci_if_error: true fail_ci_if_error: true
flags: rust flags: wasm-lib
verbose: true verbose: true
files: lcov.info files: lcov.info

View File

@ -3,8 +3,6 @@ on:
push: push:
branches: [ main ] branches: [ main ]
pull_request: pull_request:
schedule:
- cron: 0 * * * * # hourly
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@ -17,6 +15,23 @@ permissions:
jobs: jobs:
check-rust-changes:
runs-on: ubuntu-latest
outputs:
rust-changed: ${{ steps.filter.outputs.rust }}
steps:
- uses: actions/checkout@v4
- id: filter
name: Check for Rust changes
uses: dorny/paths-filter@v3
with:
filters: |
rust:
- 'src/wasm-lib/**'
electron: electron:
timeout-minutes: 60 timeout-minutes: 60
name: playwright:electron:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }} name: playwright:electron:${{ matrix.os }} ${{ matrix.shardIndex }} ${{ matrix.shardTotal }}
@ -27,8 +42,8 @@ jobs:
os: [namespace-profile-ubuntu-8-cores, namespace-profile-macos-8-cores, windows-16-cores] os: [namespace-profile-ubuntu-8-cores, namespace-profile-macos-8-cores, windows-16-cores]
shardIndex: [1, 2, 3, 4] shardIndex: [1, 2, 3, 4]
shardTotal: [4] shardTotal: [4]
# TODO: add ref here for main and latest release tag
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
needs: check-rust-changes
steps: steps:
- uses: actions/create-github-app-token@v1 - uses: actions/create-github-app-token@v1
id: app-token id: app-token
@ -39,19 +54,12 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
token: ${{ steps.app-token.outputs.token }} token: ${{ steps.app-token.outputs.token }}
- id: filter
name: Check for Rust changes
uses: dorny/paths-filter@v3
with:
filters: |
rust:
- 'rust/**'
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn' cache: 'yarn'
- uses: KittyCAD/action-install-cli@main
- name: Install dependencies - name: Install dependencies
id: deps-install
shell: bash shell: bash
run: yarn run: yarn
- name: Cache Playwright Browsers - name: Cache Playwright Browsers
@ -65,7 +73,7 @@ jobs:
run: yarn playwright install --with-deps run: yarn playwright install --with-deps
- 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.check-rust-changes.outputs.rust-changed == 'false'
uses: dawidd6/action-download-artifact@v7 uses: dawidd6/action-download-artifact@v7
continue-on-error: true continue-on-error: true
with: with:
@ -73,27 +81,27 @@ jobs:
name: wasm-bundle name: wasm-bundle
workflow: build-and-store-wasm.yml workflow: build-and-store-wasm.yml
branch: main branch: main
path: rust/kcl-wasm-lib/pkg path: src/wasm-lib/pkg
- name: copy wasm blob - name: copy wasm blob
if: github.event_name != 'schedule' && steps.filter.outputs.rust == 'false' if: needs.check-rust-changes.outputs.rust-changed == 'false'
shell: bash shell: bash
run: cp rust/kcl-wasm-lib/pkg/kcl_wasm_lib_bg.wasm public run: cp src/wasm-lib/pkg/wasm_lib_bg.wasm public
continue-on-error: true continue-on-error: true
- name: Setup Rust - name: Setup Rust
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- name: Cache Wasm (because rust diff) - name: Cache Wasm (because rust diff)
if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true' if: needs.check-rust-changes.outputs.rust-changed == 'true'
uses: Swatinem/rust-cache@v2 uses: Swatinem/rust-cache@v2
with: with:
workspaces: './rust' workspaces: './src/wasm-lib'
- name: OR Cache Wasm (because wasm cache failed) - name: OR Cache Wasm (because wasm cache failed)
if: steps.download-wasm.outcome == 'failure' if: steps.download-wasm.outcome == 'failure'
uses: Swatinem/rust-cache@v2 uses: Swatinem/rust-cache@v2
with: with:
workspaces: './rust' workspaces: './src/wasm-lib'
- name: install good sed - name: install good sed
if: ${{ startsWith(matrix.os, 'macos') }} if: ${{ startsWith(matrix.os, 'macos') }}
shell: bash shell: bash
@ -118,7 +126,7 @@ jobs:
cat /tmp/vector.toml cat /tmp/vector.toml
${HOME}/.vector/bin/vector --config /tmp/vector.toml & ${HOME}/.vector/bin/vector --config /tmp/vector.toml &
- name: Build Wasm (because rust diff) - name: Build Wasm (because rust diff)
if: github.event_name == 'schedule' || steps.filter.outputs.rust == 'true' if: needs.check-rust-changes.outputs.rust-changed == 'true'
shell: bash shell: bash
run: yarn build:wasm run: yarn build:wasm
- name: OR Build Wasm (because wasm cache failed) - name: OR Build Wasm (because wasm cache failed)
@ -134,7 +142,7 @@ jobs:
# TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest, # TODO: break this in its own job, for now it's not slowing down the overall execution as ubuntu is the quickest,
# but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes. # but we could do better. This forces a large 1/1 shard of all 20 snapshot tests that runs in about 3 minutes.
run: | run: |
yarn test:snapshots PLATFORM=web yarn playwright test --config=playwright.config.ts --retries="3" --update-snapshots --grep=@snapshot --shard=1/1
env: env:
CI: true CI: true
NODE_ENV: development NODE_ENV: development
@ -145,7 +153,7 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: ${{ !cancelled() && (success() || failure()) }} if: ${{ !cancelled() && (success() || failure()) }}
with: with:
name: playwright-report-snapshots-${{ matrix.os }}-snapshot-${{ matrix.shardIndex }}-${{ github.sha }} name: playwright-report-${{ matrix.os }}-snapshot-${{ matrix.shardIndex }}-${{ github.sha }}
path: playwright-report/ path: playwright-report/
include-hidden-files: true include-hidden-files: true
retention-days: 30 retention-days: 30
@ -159,7 +167,7 @@ jobs:
shell: bash shell: bash
id: git-check id: git-check
run: | run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots git add e2e/playwright/snapshot-tests.spec.ts-snapshots
if git status | grep -q "Changes to be committed" if git status | grep -q "Changes to be committed"
then echo "modified=true" >> $GITHUB_OUTPUT then echo "modified=true" >> $GITHUB_OUTPUT
else echo "modified=false" >> $GITHUB_OUTPUT else echo "modified=false" >> $GITHUB_OUTPUT
@ -168,7 +176,7 @@ jobs:
if: steps.git-check.outputs.modified == 'true' if: steps.git-check.outputs.modified == 'true'
shell: bash shell: bash
run: | run: |
git add e2e/playwright/snapshot-tests.spec.ts-snapshots e2e/playwright/snapshots git add e2e/playwright/snapshot-tests.spec.ts-snapshots
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
@ -194,10 +202,9 @@ jobs:
path: test-results/ path: test-results/
- 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: ${{ !cancelled() && (success() || failure()) }}
uses: nick-fields/retry@v3.0.2 uses: nick-fields/retry@v3.0.1
with: with:
shell: bash
command: .github/ci-cd-scripts/playwright-electron.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{matrix.os}} command: .github/ci-cd-scripts/playwright-electron.sh ${{matrix.shardIndex}} ${{matrix.shardTotal}} ${{matrix.os}}
timeout_minutes: 30 timeout_minutes: 30
max_attempts: 25 max_attempts: 25

View File

@ -1,401 +0,0 @@
name: kcl-language-server
on:
push:
branches:
- main
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-language-server/**'
- '**.rs'
- .github/workflows/kcl-language-server.yml
tags:
- 'kcl-*'
pull_request:
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-language-server/**'
- '**.rs'
- .github/workflows/kcl-language-server.yml
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
env:
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUSTFLAGS: ""
RUSTUP_MAX_RETRIES: 10
FETCH_DEPTH: 0 # pull in the tags for the version string
MACOSX_DEPLOYMENT_TARGET: 10.15
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc
jobs:
test:
name: vscode tests
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- name: Install dependencies
run: |
yarn install
cd rust/kcl-language-server
yarn install
- name: Run tests
run: |
cd rust/kcl-language-server
yarn build
yarn test-compile
ls -la dist
xvfb-run -a yarn test
if: runner.os == 'Linux'
- name: Run tests
run: |
cd rust/kcl-language-server
yarn test
if: runner.os != 'Linux'
build-release:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
target: x86_64-pc-windows-msvc
code-target:
win32-x64
#- os: windows-latest
#target: i686-pc-windows-msvc
#code-target:
#win32-ia32
#- os: windows-latest
#target: aarch64-pc-windows-msvc
#code-target: win32-arm64
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
code-target:
linux-x64
#- os: ubuntu-latest
#target: aarch64-unknown-linux-musl
#code-target: linux-arm64
- os: ubuntu-latest
target: aarch64-unknown-linux-gnu
code-target: linux-arm64
- os: ubuntu-latest
target: arm-unknown-linux-gnueabihf
code-target: linux-armhf
- os: macos-latest
target: x86_64-apple-darwin
code-target: darwin-x64
- os: macos-latest
target: aarch64-apple-darwin
code-target: darwin-arm64
name: build-release (${{ matrix.target }})
runs-on: ${{ matrix.os }}
container: ${{ matrix.container }}
env:
RA_TARGET: ${{ matrix.target }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
- name: Use correct Rust toolchain
shell: bash
run: |
rm rust/rust-toolchain.toml
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: rust
components: rust-src
target: ${{ matrix.target }}
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- name: Update apt repositories
if: matrix.target == 'aarch64-unknown-linux-gnu' || matrix.target == 'arm-unknown-linux-gnueabihf' || matrix.os == 'ubuntu-latest'
run: sudo apt-get update
- if: ${{ matrix.os == 'ubuntu-latest' }}
name: Install deps
shell: bash
run: |
sudo apt install -y \
ca-certificates \
clang \
cmake \
curl \
g++ \
gcc \
gcc-mingw-w64-i686 \
gcc-mingw-w64 \
jq \
libmpc-dev \
libmpfr-dev \
libgmp-dev \
libssl-dev \
libxml2-dev \
mingw-w64 \
wget \
zlib1g-dev
cargo install cross
- name: Install AArch64 target toolchain
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: sudo apt-get install gcc-aarch64-linux-gnu
- name: Install ARM target toolchain
if: matrix.target == 'arm-unknown-linux-gnueabihf'
run: sudo apt-get install gcc-arm-linux-gnueabihf
- name: build
run: |
cd rust
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
- name: Install dependencies
run: |
cd rust/kcl-language-server
yarn install
- name: Package Extension (release)
if: startsWith(github.event.ref, 'refs/tags/')
run: |
cd rust/kcl-language-server
npx vsce package -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }}
- name: Package Extension (nightly)
if: startsWith(github.event.ref, 'refs/tags/') == false
run: |
cd rust/kcl-language-server
npx vsce package -o "../build/kcl-language-server-${{ matrix.code-target }}.vsix" --target ${{ matrix.code-target }} --pre-release
- name: remove server
if: matrix.target == 'x86_64-unknown-linux-gnu'
run: |
cd rust/kcl-language-server
rm -rf server
- name: Package Extension (no server, release)
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/')
run: |
cd rust/kcl-language-server
npx vsce package -o ../build/kcl-language-server-no-server.vsix
- name: Package Extension (no server, nightly)
if: matrix.target == 'x86_64-unknown-linux-gnu' && startsWith(github.event.ref, 'refs/tags/') == false
run: |
cd rust/kcl-language-server
npx vsce package -o ../build/kcl-language-server-no-server.vsix --pre-release
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.target }}
path: ./rust/build
build-release-x86_64-unknown-linux-musl:
name: build-release (x86_64-unknown-linux-musl)
runs-on: ubuntu-latest
env:
RA_TARGET: x86_64-unknown-linux-musl
# For some reason `-crt-static` is not working for clang without lld
RUSTFLAGS: "-C link-arg=-fuse-ld=lld -C target-feature=-crt-static"
container:
image: alpine:latest
volumes:
- /usr/local/cargo/registry:/usr/local/cargo/registry
steps:
- name: Install dependencies
run: |
apk add --no-cache \
bash \
curl \
git \
clang \
lld \
musl-dev \
nodejs \
yarn \
npm
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
- name: Use correct Rust toolchain
shell: bash
run: |
rm rust/rust-toolchain.toml
- name: Install rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: rust
components: rust-src
target: ${{ matrix.target }}
- name: build
run: |
cd rust
cargo kcl-language-server-release build --client-patch-version ${{ github.run_number }}
- name: Install dependencies
run: |
cd rust/kcl-language-server
yarn install
- name: Package Extension (release)
if: startsWith(github.event.ref, 'refs/tags/')
run: |
cd rust/kcl-language-server
npx vsce package -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64
- name: Package Extension (release)
if: startsWith(github.event.ref, 'refs/tags/') == false
run: |
cd rust/kcl-language-server
npx vsce package -o "../build/kcl-language-server-alpine-x64.vsix" --target alpine-x64 --pre-release
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-x86_64-unknown-linux-musl
path: ./rust/build
publish:
name: publish
runs-on: ubuntu-latest
needs: ["build-release", "build-release-x86_64-unknown-linux-musl"]
if: startsWith(github.event.ref, 'refs/tags')
permissions:
contents: write
steps:
- run: echo "TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- run: 'echo "TAG: $TAG"'
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: ${{ env.FETCH_DEPTH }}
- name: Install Nodejs
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
- run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
- run: 'echo "HEAD_SHA: $HEAD_SHA"'
- uses: actions/download-artifact@v4
with:
name: release-aarch64-apple-darwin
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-x86_64-apple-darwin
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-x86_64-unknown-linux-gnu
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-x86_64-unknown-linux-musl
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-aarch64-unknown-linux-gnu
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-arm-unknown-linux-gnueabihf
path: rust/build
- uses: actions/download-artifact@v4
with:
name: release-x86_64-pc-windows-msvc
path:
rust/build
#- uses: actions/download-artifact@v4
#with:
#name: release-i686-pc-windows-msvc
#path:
#build
#- uses: actions/download-artifact@v4
#with:
#name: release-aarch64-pc-windows-msvc
#path: rust/build
- run: ls -al ./rust/build
- name: Publish Release
uses: ./.github/actions/github-release
with:
files: "rust/build/*"
name: ${{ env.TAG }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: move files to dir for upload
shell: bash
run: |
cd rust
mkdir -p releases/language-server/${{ env.TAG }}
cp -r build/* releases/language-server/${{ env.TAG }}
- name: "Authenticate to Google Cloud"
uses: "google-github-actions/auth@v2.1.8"
with:
credentials_json: "${{ secrets.GOOGLE_CLOUD_DL_SA }}"
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2.1.2
with:
project_id: kittycadapi
- name: "upload files to gcp"
id: upload-files
uses: google-github-actions/upload-cloud-storage@v2.2.2
with:
path: rust/releases
destination: dl.kittycad.io
- run: rm rust/build/kcl-language-server-no-server.vsix
- name: Publish Extension (Code Marketplace, release)
# token from https://dev.azure.com/kcl-language-server/
run: |
cd rust/kcl-language-server
npx vsce publish --pat ${{ secrets.VSCE_PAT }} --packagePath ../build/kcl-language-server-*.vsix
- name: Publish Extension (OpenVSX, release)
run: |
cd rust/kcl-language-server
npx ovsx publish --pat ${{ secrets.OPENVSX_TOKEN }} --packagePath ../build/kcl-language-server-*.vsix
timeout-minutes: 2

View File

@ -1,179 +0,0 @@
# This file is autogenerated by maturin v1.6.0 and then modified
# To update, run
#
# maturin generate-ci github
#
name: kcl-python-bindings
on:
push:
branches:
- main
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-python-bindings/**'
- '**.rs'
- .github/workflows/kcl-python-bindings.yml
tags:
- 'kcl-*'
pull_request:
paths:
- '**/Cargo.toml'
- '**/Cargo.lock'
- '**/rust-toolchain.toml'
- 'rust/kcl-python-bindings/**'
- '**.rs'
- .github/workflows/kcl-python-bindings.yml
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
linux-x86_64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: x86_64
args: --release --out dist --find-interpreter
sccache: 'true'
manylinux: auto
before-script-linux: |
yum install openssl-devel -y
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-linux-x86_64
path: rust/kcl-python-bindings/dist
windows:
runs-on: windows-16-cores
strategy:
matrix:
target:
- x64
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
architecture: ${{ matrix.target }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-windows-${{ matrix.target }}
path: rust/kcl-python-bindings/dist
macos:
runs-on: macos-latest
strategy:
matrix:
target:
- x86_64
- aarch64
fail-fast: false
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
target: ${{ matrix.target }}
args: --release --out dist --find-interpreter
sccache: 'true'
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-macos-${{ matrix.target }}
path: rust/kcl-python-bindings/dist
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: taiki-e/install-action@just
- name: Run tests
run: |
cd rust/kcl-python-bindings
just setup-uv
just test
env:
KITTYCAD_API_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN }}
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v5
- name: Install codespell
run: |
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
uv pip install pip --upgrade
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
working-directory: rust/kcl-python-bindings
command: sdist
args: --out dist
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: wheels-sdist
path: rust/kcl-python-bindings/dist
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
if: startsWith(github.ref, 'refs/tags/')
needs: [linux-x86_64, windows, macos, sdist]
steps:
- uses: actions/download-artifact@v4
- name: Install the latest version of uv
uses: astral-sh/setup-uv@v5
- name: Install codespell
run: |
cd rust/kcl-python-bindings
uv venv .venv
echo "VIRTUAL_ENV=.venv" >> $GITHUB_ENV
echo "$PWD/.venv/bin" >> $GITHUB_PATH
uv pip install pip --upgrade
- name: Publish to PyPI
uses: PyO3/maturin-action@v1
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
with:
working-directory: rust/kcl-python-bindings
command: upload
args: --non-interactive --skip-existing wheels-*/*

View File

@ -1,24 +0,0 @@
name: ruff
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
on:
push:
branches: main
paths:
- '**.py'
- .github/workflows/ruff.yml
pull_request:
paths:
- '**.py'
- .github/workflows/ruff.yml
permissions:
contents: read
pull-requests: write
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/ruff-action@v3

View File

@ -37,7 +37,7 @@ jobs:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn' cache: 'yarn'
- run: yarn install - run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- run: yarn build:wasm - run: yarn build:wasm
@ -52,12 +52,11 @@ jobs:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn' cache: 'yarn'
- run: yarn install - run: yarn install
- run: yarn --cwd ./rust/kcl-language-server --modules-folder node_modules install
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
with: with:
workspaces: './rust' workspaces: './src/wasm-lib'
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- run: yarn build:wasm - run: yarn build:wasm
@ -73,7 +72,6 @@ jobs:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'yarn' cache: 'yarn'
- run: yarn install - run: yarn install
- run: yarn --cwd ./rust/kcl-language-server --modules-folder node_modules install
- run: yarn lint - run: yarn lint
python-codespell: python-codespell:
@ -100,7 +98,7 @@ jobs:
cache: 'yarn' cache: 'yarn'
- run: yarn install - run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- run: yarn build:wasm - run: yarn build:wasm
@ -129,7 +127,7 @@ jobs:
cache: 'yarn' cache: 'yarn'
- run: yarn install - run: yarn install
- uses: taiki-e/install-action@955a6ff1416eae278c9f833008a9beb4b7f9afe3 - uses: taiki-e/install-action@2dbeb927f58939d3aa13bf06ba0c0a34b76b9bfb
with: with:
tool: wasm-pack tool: wasm-pack
- run: yarn build:wasm - run: yarn build:wasm
@ -143,7 +141,7 @@ jobs:
- name: run unit tests - name: run unit tests
if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }} if: ${{ github.event_name != 'release' && github.event_name != 'schedule' }}
run: xvfb-run -a yarn test:unit run: yarn test:unit
env: env:
VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }} VITE_KC_DEV_TOKEN: ${{ secrets.KITTYCAD_API_TOKEN_DEV }}

View File

@ -1,39 +0,0 @@
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: yarn 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

36
.gitignore vendored
View File

@ -1,7 +1,7 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies # dependencies
node_modules /node_modules
/.pnp /.pnp
.pnp.js .pnp.js
@ -9,7 +9,7 @@ node_modules
/coverage /coverage
# production # production
build /build
# misc # misc
.DS_Store .DS_Store
@ -24,21 +24,18 @@ yarn-debug.log*
yarn-error.log* yarn-error.log*
.idea .idea
.vscode # .vscode
.helix .helix
src/wasm-lib/.idea
src/wasm-lib/.vscode
# rust # rust
rust/target src/wasm-lib/target
rust/kcl-lib/bindings src/wasm-lib/bindings
public/kcl_wasm_lib_bg.wasm src/wasm-lib/kcl/bindings
rust/lcov.info public/wasm_lib_bg.wasm
rust/kcl-wasm-lib/pkg src/wasm-lib/lcov.info
*.snap.new src/wasm-lib/grackle/test_json_output
rust/kcl-lib/fuzz/Cargo.lock
rust/kcl-language-server-release/Cargo.lock
# kcl language server package
rust/kcl-language-server/dist/
e2e/playwright/playwright-secrets.env e2e/playwright/playwright-secrets.env
e2e/playwright/temp1.png e2e/playwright/temp1.png
@ -62,20 +59,15 @@ e2e/playwright/export-snapshots/*
## generated files ## generated files
src/**/*.typegen.ts src/**/*.typegen.ts
src/wasm-lib/grackle/stdlib_cube_partial.json
Mac_App_Distribution.provisionprofile Mac_App_Distribution.provisionprofile
*.tsbuildinfo *.tsbuildinfo
src/wasm-lib/pkg
.eslintcache .eslintcache
venv
.vite/ .vite/
# electron # electron
out/ out/
# python
__pycache__/
uv.lock
dist
venv
.vscode-test

View File

@ -7,10 +7,10 @@ coverage
*.rs *.rs
*.hbs *.hbs
target target
src/wasm-lib/pkg
src/wasm-lib/kcl/bindings
e2e/playwright/export-snapshots e2e/playwright/export-snapshots
e2e/playwright/snapshots/prompt-to-edit
# XState generated files # XState generated files
src/machines/**.typegen.ts src/machines/**.typegen.ts
.vscode-test

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"rust-analyzer.linkedProjects": [
"src/wasm-lib/Cargo.toml"
]
}

View File

@ -1,6 +1,6 @@
.PHONY: dev .PHONY: dev
KCL_WASM_LIB_FILES := $(wildcard rust/**/*.rs) WASM_LIB_FILES := $(wildcard src/wasm-lib/**/*.rs)
TS_SRC := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts) TS_SRC := $(wildcard src/**/*.tsx) $(wildcard src/**/*.ts)
XSTATE_TYPEGENS := $(wildcard src/machines/*.typegen.ts) XSTATE_TYPEGENS := $(wildcard src/machines/*.typegen.ts)
@ -18,7 +18,7 @@ lee-electron-test:
$(XSTATE_TYPEGENS): $(TS_SRC) $(XSTATE_TYPEGENS): $(TS_SRC)
yarn xstate typegen 'src/**/*.ts?(x)' yarn xstate typegen 'src/**/*.ts?(x)'
public/kcl_wasm_lib_bg.wasm: $(KCL_WASM_LIB_FILES) public/wasm_lib_bg.wasm: $(WASM_LIB_FILES)
yarn build:wasm yarn build:wasm
node_modules: package.json yarn.lock node_modules: package.json yarn.lock

View File

@ -40,7 +40,7 @@ The 3D view in Modeling App is just a video stream from our hosted geometry engi
[Original demo video](https://drive.google.com/file/d/183_wjqGdzZ8EEZXSqZ3eDcJocYPCyOdC/view?pli=1) [Original demo video](https://drive.google.com/file/d/183_wjqGdzZ8EEZXSqZ3eDcJocYPCyOdC/view?pli=1)
[Original demo slides](https://github.com/user-attachments/files/19010536/demo.pdf) [Original demo slides](https://github.com/KittyCAD/Eng/files/10398178/demo.pdf)
## Get started ## Get started
@ -52,21 +52,18 @@ Install a node version manager such as [fnm](https://github.com/Schniz/fnm?tab=r
On Windows, it's also recommended to [upgrade your PowerShell version](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#winget), we're using 7. On Windows, it's also recommended to [upgrade your PowerShell version](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#winget), we're using 7.
Then in the repo run the following to install and use the node version specified in `.nvmrc`. You might need to specify your processor architecture with `--arch arm64` or `--arch x64` if it's not autodetected. Then in the repo run the following to install and use the node version specified in `.nvmrc`. You might need to specify your processor architecture with `--arch arm64` or `--arch x64` if it's not autodetected.
``` ```
fnm install --corepack-enabled fnm install --corepack-enabled
fnm use fnm use
``` ```
Install the NPM dependencies with: Install the NPM dependencies with:
``` ```
yarn install yarn install
``` ```
This project uses a lot of Rust compiled to [WASM](https://webassembly.org/) within it. We have package scripts to run rustup, see `package.json` for reference: This project uses a lot of Rust compiled to [WASM](https://webassembly.org/) within it. We have package scripts to run rustup, see `package.json` for reference:
``` ```
# macOS/Linux # macOS/Linux
yarn install:rust yarn install:rust
@ -78,7 +75,6 @@ yarn install:wasm-pack:cargo
``` ```
Then to build the WASM layer, run: Then to build the WASM layer, run:
``` ```
# macOS/Linux # macOS/Linux
yarn build:wasm yarn build:wasm
@ -139,7 +135,6 @@ To package the app for your platform with electron-builder, run `yarn tronb:pack
Which commands from setup are one off vs need to be run every time? Which commands from setup are one off vs need to be run every time?
The following will need to be run when checking out a new commit and guarantees the build is not stale: The following will need to be run when checking out a new commit and guarantees the build is not stale:
```bash ```bash
yarn install yarn install
yarn build:wasm yarn build:wasm
@ -190,12 +185,11 @@ Manually test against this [list](https://github.com/KittyCAD/modeling-app/issue
##### Updater-test builds ##### Updater-test builds
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. 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.
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. 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). 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)
& 'C:\Program Files\Zoo Modeling App\Zoo Modeling App.exe' & 'C:\Program Files\Zoo Modeling App\Zoo Modeling App.exe'
@ -211,14 +205,15 @@ If the prompt doesn't show up, start the app in command line to grab the electro
Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the _Release title_ field as well. Head over to https://github.com/KittyCAD/modeling-app/releases/new, pick the newly created tag and type it in the _Release title_ field as well.
Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_. Hit _Generate release notes_ as a starting point to discuss the changelog in the issue. Once done, make sure _Set as the latest release_ is checked, and hit _Publish release_.
A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent. A new `publish-apps-release` will kick in and you should be able to find it [here](https://github.com/KittyCAD/modeling-app/actions?query=event%3Arelease). On success, the files will be uploaded to the public bucket as well as to the GitHub release, and the announcement on Discord will be sent.
#### 5. Close the issue #### 5. Close the issue
If everything is well and the release is out to the public, the issue tracking the release shall be closed. If everything is well and the release is out to the public, the issue tracking the release shall be closed.
## Fuzzing the parser ## Fuzzing the parser
Make sure you install cargo fuzz: Make sure you install cargo fuzz:
@ -228,7 +223,7 @@ $ cargo install cargo-fuzz
``` ```
```bash ```bash
$ cd rust/kcl-lib $ cd src/wasm-lib/kcl
# list the fuzz targets # list the fuzz targets
$ cargo fuzz list $ cargo fuzz list
@ -256,7 +251,6 @@ snapshottoken=<your-snapshot-token>
For a portable way to run Playwright you'll need Docker. For a portable way to run Playwright you'll need Docker.
#### Generic example #### Generic example
After that, open a terminal and run: After that, open a terminal and run:
```bash ```bash
@ -269,6 +263,7 @@ and in another terminal, run:
PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn playwright test --project="Google Chrome" <test suite> PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn playwright test --project="Google Chrome" <test suite>
``` ```
#### Specific example #### Specific example
open a terminal and run: open a terminal and run:
@ -286,6 +281,7 @@ PW_TEST_CONNECT_WS_ENDPOINT=ws://127.0.0.1:4444/ yarn playwright test --project=
run a specific test change the test from `test('...` to `test.only('...` run a specific test change the test from `test('...` to `test.only('...`
(note if you commit this, the tests will instantly fail without running any of the tests) (note if you commit this, the tests will instantly fail without running any of the tests)
**Gotcha**: running the docker container with a mismatched image against your `./node_modules/playwright` will cause a failure. Make sure the versions are matched and up to date. **Gotcha**: running the docker container with a mismatched image against your `./node_modules/playwright` will cause a failure. Make sure the versions are matched and up to date.
run headed run headed
@ -379,19 +375,17 @@ Which will run our suite of [Vitest unit](https://vitest.dev/) and [React Testin
- `just` - `just`
#### Setting KITTYCAD_API_TOKEN #### Setting KITTYCAD_API_TOKEN
Use the production zoo.dev token, set this environment variable before running the tests Use the production zoo.dev token, set this environment variable before running the tests
#### Installing cargonextest #### Installing cargonextest
``` ```
cd rust cd src/wasm-lib
cargo search cargo-nextest cargo search cargo-nextest
cargo install cargo-nextest cargo install cargo-nextest
``` ```
#### just #### just
install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-binaries) install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-binaries)
#### Running the tests #### Running the tests
@ -401,7 +395,7 @@ install [`just`](https://github.com/casey/just?tab=readme-ov-file#pre-built-bina
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set # Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
# Make sure you installed cargo-nextest # Make sure you installed cargo-nextest
# Make sure you installed just # Make sure you installed just
cd rust cd src/wasm-lib
just test just test
``` ```
@ -409,7 +403,7 @@ just test
# Without just # Without just
# Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set # Make sure KITTYCAD_API_TOKEN=<prod zoo.dev token> is set
# Make sure you installed cargo-nextest # Make sure you installed cargo-nextest
cd rust cd src/wasm-lib
export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1 export RUST_BRACKTRACE="full" && cargo nextest run --workspace --test-threads=1
``` ```
@ -418,14 +412,13 @@ 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 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 cd src/wasm-lib
KITTYCAD_API_TOKEN=XXX cargo run nextest KITTYCAD_API_TOKEN=XXX cargo run nextest
``` ```
### Mapping CI CD jobs to local commands ### Mapping CI CD jobs to local commands
When you see the CI CD fail on jobs you may wonder three things When you see the CI CD fail on jobs you may wonder three things
- Do I have a bug in my code? - Do I have a bug in my code?
- Is the test flaky? - Is the test flaky?
- Is there a bug in `main`? - Is there a bug in `main`?
@ -444,6 +437,7 @@ yarn test-setup
> Gotcha, are packages up to date and is the wasm built? > Gotcha, are packages up to date and is the wasm built?
``` ```
yarn tsc yarn tsc
yarn fmt-check yarn fmt-check
@ -499,7 +493,7 @@ PS: for the debug panel, the following JSON is useful for snapping the camera
## KCL ## KCL
For how to contribute to KCL, [see our KCL README](https://github.com/KittyCAD/modeling-app/tree/main/rust/kcl-lib). For how to contribute to KCL, [see our KCL README](https://github.com/KittyCAD/modeling-app/tree/main/src/wasm-lib/kcl).
### Logging ### Logging

View File

@ -1,5 +1,5 @@
--- ---
title: "std::YZ" title: "HALF_TURN"
excerpt: "" excerpt: ""
layout: manual layout: manual
--- ---
@ -9,7 +9,7 @@ layout: manual
```js ```js
std::YZ HALF_TURN: number(deg) = 180deg
``` ```

15
docs/kcl/QUARTER_TURN.md Normal file
View File

@ -0,0 +1,15 @@
---
title: "QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
QUARTER_TURN: number(deg) = 90deg
```

View File

@ -0,0 +1,15 @@
---
title: "THREE_QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
THREE_QUARTER_TURN: number(deg) = 270deg
```

View File

@ -1,5 +1,5 @@
--- ---
title: "std::XY" title: "ZERO"
excerpt: "" excerpt: ""
layout: manual layout: manual
--- ---
@ -9,7 +9,7 @@ layout: manual
```js ```js
std::XY ZERO: number = 0
``` ```

View File

@ -9,7 +9,7 @@ Compute the absolute value of a number.
```js ```js
abs(num: number): number abs(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,7 +9,7 @@ Compute the arccosine of a number (in radians).
```js ```js
acos(num: number): number acos(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,11 +9,7 @@ Returns the angle to match the given length for x.
```js ```js
angleToMatchLengthX( angleToMatchLengthX(tag: TagIdentifier, to: number, sketch: Sketch) -> number
tag: TagIdentifier,
to: number,
sketch: Sketch,
): number
``` ```

View File

@ -9,11 +9,7 @@ Returns the angle to match the given length for y.
```js ```js
angleToMatchLengthY( angleToMatchLengthY(tag: TagIdentifier, to: number, sketch: Sketch) -> number
tag: TagIdentifier,
to: number,
sketch: Sketch,
): number
``` ```

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLine" title: "angledLine"
excerpt: "Draw a line segment relative to the current origin using the polar measure of some angle and distance." excerpt: "Draw a line segment relative to the current origin using the polar"
layout: manual layout: manual
--- ---
Draw a line segment relative to the current origin using the polar measure of some angle and distance. Draw a line segment relative to the current origin using the polar
measure of some angle and distance.
```js ```js
angledLine( angledLine(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLine(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> yLineTo(15, %) |> yLineTo(15, %)
|> angledLine({ angle = 30, length = 15 }, %) |> angledLine({ angle = 30, length = 15 }, %)

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLineOfXLength" title: "angledLineOfXLength"
excerpt: "Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some relative length in the 'x' dimension." excerpt: "Create a line segment from the current 2-dimensional sketch origin"
layout: manual layout: manual
--- ---
Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some relative length in the 'x' dimension. Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some relative length in the 'x' dimension.
```js ```js
angledLineOfXLength( angledLineOfXLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLineOfXLength(
### Examples ### Examples
```js ```js
sketch001 = startSketchOn(XZ) sketch001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1) |> angledLineOfXLength({ angle = 45, length = 10 }, %, $edge1)
|> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2) |> angledLineOfXLength({ angle = -15, length = 20 }, %, $edge2)

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLineOfYLength" title: "angledLineOfYLength"
excerpt: "Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some relative length in the 'y' dimension." excerpt: "Create a line segment from the current 2-dimensional sketch origin"
layout: manual layout: manual
--- ---
Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some relative length in the 'y' dimension. Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some relative length in the 'y' dimension.
```js ```js
angledLineOfYLength( angledLineOfYLength(data: AngledLineData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLineOfYLength(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [10, 0]) |> line(end = [10, 0])
|> angledLineOfYLength({ angle = 45, length = 10 }, %) |> angledLineOfYLength({ angle = 45, length = 10 }, %)

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLineThatIntersects" title: "angledLineThatIntersects"
excerpt: "Draw an angled line from the current origin, constructing a line segment such that the newly created line intersects the desired target line segment." excerpt: "Draw an angled line from the current origin, constructing a line segment"
layout: manual layout: manual
--- ---
Draw an angled line from the current origin, constructing a line segment such that the newly created line intersects the desired target line segment. Draw an angled line from the current origin, constructing a line segment
such that the newly created line intersects the desired target line segment.
```js ```js
angledLineThatIntersects( angledLineThatIntersects(data: AngledLineThatIntersectsData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineThatIntersectsData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLineThatIntersects(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(endAbsolute = [5, 10]) |> line(endAbsolute = [5, 10])
|> line(endAbsolute = [-10, 10], tag = $lineToIntersect) |> line(endAbsolute = [-10, 10], tag = $lineToIntersect)

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLineToX" title: "angledLineToX"
excerpt: "Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some length, ending at the provided value in the 'x' dimension." excerpt: "Create a line segment from the current 2-dimensional sketch origin"
layout: manual layout: manual
--- ---
Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some length, ending at the provided value in the 'x' dimension. Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some length, ending at the provided value in the 'x' dimension.
```js ```js
angledLineToX( angledLineToX(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineToData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLineToX(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> angledLineToX({ angle = 30, to = 10 }, %) |> angledLineToX({ angle = 30, to = 10 }, %)
|> line(end = [0, 10]) |> line(end = [0, 10])

View File

@ -1,19 +1,15 @@
--- ---
title: "angledLineToY" title: "angledLineToY"
excerpt: "Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some length, ending at the provided value in the 'y' dimension." excerpt: "Create a line segment from the current 2-dimensional sketch origin"
layout: manual layout: manual
--- ---
Create a line segment from the current 2-dimensional sketch origin along some angle (in degrees) for some length, ending at the provided value in the 'y' dimension. Create a line segment from the current 2-dimensional sketch origin
along some angle (in degrees) for some length, ending at the provided value in the 'y' dimension.
```js ```js
angledLineToY( angledLineToY(data: AngledLineToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: AngledLineToData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ angledLineToY(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> angledLineToY({ angle = 60, to = 20 }, %) |> angledLineToY({ angle = 60, to = 20 }, %)
|> line(end = [-20, 0]) |> line(end = [-20, 0])

File diff suppressed because one or more lines are too long

View File

@ -11,11 +11,7 @@ The arc is constructed such that the current position of the sketch is placed al
Unless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc. Unless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc.
```js ```js
arc( arc(data: ArcData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: ArcData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -35,7 +31,7 @@ arc(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [10, 0]) |> line(end = [10, 0])
|> arc({ |> arc({

View File

@ -1,19 +1,15 @@
--- ---
title: "arcTo" title: "arcTo"
excerpt: "Draw a three point arc." excerpt: "Draw a 3 point arc."
layout: manual layout: manual
--- ---
Draw a three point arc. Draw a 3 point arc.
The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from the start and end. The arc is constructed such that the start point is the current position of the sketch and two more points defined as the end and interior point. The interior point is placed between the start point and end point. The radius of the arc will be controlled by how far the interior point is placed from the start and end.
```js ```js
arcTo( arcTo(data: ArcToData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: ArcToData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ arcTo(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> arcTo({ end = [10, 0], interior = [5, 5] }, %) |> arcTo({ end = [10, 0], interior = [5, 5] }, %)
|> close() |> close()

View File

@ -9,7 +9,7 @@ Compute the arcsine of a number (in radians).
```js ```js
asin(num: number): number asin(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -1,18 +1,15 @@
--- ---
title: "assert" title: "assert"
excerpt: "Check a value at runtime, and raise an error if the argument provided is false." excerpt: "Check a value at runtime, and raise an error if the argument provided"
layout: manual layout: manual
--- ---
Check a value at runtime, and raise an error if the argument provided is false. Check a value at runtime, and raise an error if the argument provided
is false.
```js ```js
assert( assert(data: bool, message: string) -> ()
data: bool,
message: string,
): ()
``` ```

View File

@ -1,20 +1,15 @@
--- ---
title: "assertEqual" title: "assertEqual"
excerpt: "Check that a numerical value equals another at runtime, otherwise raise an error." excerpt: "Check that a numerical value equals another at runtime,"
layout: manual layout: manual
--- ---
Check that a numerical value equals another at runtime, otherwise raise an error. Check that a numerical value equals another at runtime,
otherwise raise an error.
```js ```js
assertEqual( assertEqual(left: number, right: number, epsilon: number, message: string) -> ()
left: number,
right: number,
epsilon: number,
message: string,
): ()
``` ```

View File

@ -1,19 +1,15 @@
--- ---
title: "assertGreaterThan" title: "assertGreaterThan"
excerpt: "Check that a numerical value is greater than another at runtime, otherwise raise an error." excerpt: "Check that a numerical value is greater than another at runtime,"
layout: manual layout: manual
--- ---
Check that a numerical value is greater than another at runtime, otherwise raise an error. Check that a numerical value is greater than another at runtime,
otherwise raise an error.
```js ```js
assertGreaterThan( assertGreaterThan(left: number, right: number, message: string) -> ()
left: number,
right: number,
message: string,
): ()
``` ```

View File

@ -1,19 +1,15 @@
--- ---
title: "assertGreaterThanOrEq" title: "assertGreaterThanOrEq"
excerpt: "Check that a numerical value is greater than or equal to another at runtime, otherwise raise an error." excerpt: "Check that a numerical value is greater than or equal to another at runtime,"
layout: manual layout: manual
--- ---
Check that a numerical value is greater than or equal to another at runtime, otherwise raise an error. Check that a numerical value is greater than or equal to another at runtime,
otherwise raise an error.
```js ```js
assertGreaterThanOrEq( assertGreaterThanOrEq(left: number, right: number, message: string) -> ()
left: number,
right: number,
message: string,
): ()
``` ```

View File

@ -1,19 +1,15 @@
--- ---
title: "assertLessThan" title: "assertLessThan"
excerpt: "Check that a numerical value is less than to another at runtime, otherwise raise an error." excerpt: "Check that a numerical value is less than to another at runtime,"
layout: manual layout: manual
--- ---
Check that a numerical value is less than to another at runtime, otherwise raise an error. Check that a numerical value is less than to another at runtime,
otherwise raise an error.
```js ```js
assertLessThan( assertLessThan(left: number, right: number, message: string) -> ()
left: number,
right: number,
message: string,
): ()
``` ```

View File

@ -1,19 +1,15 @@
--- ---
title: "assertLessThanOrEq" title: "assertLessThanOrEq"
excerpt: "Check that a numerical value is less than or equal to another at runtime, otherwise raise an error." excerpt: "Check that a numerical value is less than or equal to another at runtime,"
layout: manual layout: manual
--- ---
Check that a numerical value is less than or equal to another at runtime, otherwise raise an error. Check that a numerical value is less than or equal to another at runtime,
otherwise raise an error.
```js ```js
assertLessThanOrEq( assertLessThanOrEq(left: number, right: number, message: string) -> ()
left: number,
right: number,
message: string,
): ()
``` ```

View File

@ -9,7 +9,7 @@ Compute the arctangent of a number (in radians).
```js ```js
atan(num: number): number atan(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,10 +9,7 @@ Compute the four quadrant arctangent of Y and X (in radians).
```js ```js
atan2( atan2(y: number, x: number) -> number
y: number,
x: number,
): number
``` ```
### Tags ### Tags

View File

@ -1,19 +1,15 @@
--- ---
title: "bezierCurve" title: "bezierCurve"
excerpt: "Draw a smooth, continuous, curved line segment from the current origin to the desired (x, y), using a number of control points to shape the curve's shape." excerpt: "Draw a smooth, continuous, curved line segment from the current origin to"
layout: manual layout: manual
--- ---
Draw a smooth, continuous, curved line segment from the current origin to the desired (x, y), using a number of control points to shape the curve's shape. Draw a smooth, continuous, curved line segment from the current origin to
the desired (x, y), using a number of control points to shape the curve's shape.
```js ```js
bezierCurve( bezierCurve(data: BezierData, sketch: Sketch, tag?: TagDeclarator) -> Sketch
data: BezierData,
sketch: Sketch,
tag?: TagDeclarator,
): Sketch
``` ```
@ -33,7 +29,7 @@ bezierCurve(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XZ) exampleSketch = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0, 10]) |> line(end = [0, 10])
|> bezierCurve({ |> bezierCurve({

View File

@ -9,7 +9,7 @@ Compute the smallest integer greater than or equal to a number.
```js ```js
ceil(num: number): number ceil(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,12 +9,7 @@ Cut a straight transitional edge along a tagged path.
Chamfer is similar in function and use to a fillet, except a fillet will blend the transition along an edge, rather than cut a sharp, straight transitional edge. Chamfer is similar in function and use to a fillet, except a fillet will blend the transition along an edge, rather than cut a sharp, straight transitional edge.
```js ```js
chamfer( chamfer(solid: Solid, length: number, tags: [EdgeReference], tag?: TagDeclarator) -> Solid
solid: Solid,
length: number,
tags: [EdgeReference],
tag?: TagDeclarator,
): Solid
``` ```

View File

@ -1,20 +1,15 @@
--- ---
title: "circle" title: "circle"
excerpt: "Construct a 2-dimensional circle, of the specified radius, centered at the provided (x, y) origin point." excerpt: "Construct a 2-dimensional circle, of the specified radius, centered at"
layout: manual layout: manual
--- ---
Construct a 2-dimensional circle, of the specified radius, centered at the provided (x, y) origin point. Construct a 2-dimensional circle, of the specified radius, centered at
the provided (x, y) origin point.
```js ```js
circle( circle(data: CircleData, sketchSurfaceOrGroup: SketchOrSurface, tag?: TagDeclarator) -> Sketch
sketchOrSurface: SketchOrSurface,
center: [number],
radius: number,
tag?: TagDeclarator,
): Sketch
``` ```
@ -22,10 +17,9 @@ circle(
| Name | Type | Description | Required | | Name | Type | Description | Required |
|----------|------|-------------|----------| |----------|------|-------------|----------|
| `sketchOrSurface` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | Plane or surface to sketch on. | Yes | | `data` | [`CircleData`](/docs/kcl/types/CircleData) | Data for drawing an circle | Yes |
| `center` | `[number]` | The center of the circle. | Yes | | `sketchSurfaceOrGroup` | [`SketchOrSurface`](/docs/kcl/types/SketchOrSurface) | A sketch surface or a sketch. | Yes |
| `radius` | `number` | The radius of the circle. | Yes | | `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | | No |
| `tag` | [`TagDeclarator`](/docs/kcl/types#tag-declaration) | Create a new tag which refers to this circle | No |
### Returns ### Returns
@ -36,7 +30,7 @@ circle(
```js ```js
exampleSketch = startSketchOn("-XZ") exampleSketch = startSketchOn("-XZ")
|> circle(center = [0, 0], radius = 10) |> circle({ center = [0, 0], radius = 10 }, %)
example = extrude(exampleSketch, length = 5) example = extrude(exampleSketch, length = 5)
``` ```
@ -50,7 +44,7 @@ exampleSketch = startSketchOn("XZ")
|> line(end = [0, 30]) |> line(end = [0, 30])
|> line(end = [-30, 0]) |> line(end = [-30, 0])
|> close() |> close()
|> hole(circle(center = [0, 15], radius = 5), %) |> hole(circle({ center = [0, 15], radius = 5 }, %), %)
example = extrude(exampleSketch, length = 5) example = extrude(exampleSketch, length = 5)
``` ```

View File

@ -9,13 +9,7 @@ Construct a circle derived from 3 points.
```js ```js
circleThreePoint( circleThreePoint(p1: [number], p2: [number], p3: [number], sketchSurfaceOrGroup: SketchOrSurface, tag?: TagDeclarator) -> Sketch
p1: [number],
p2: [number],
p3: [number],
sketchSurfaceOrGroup: SketchOrSurface,
tag?: TagDeclarator,
): Sketch
``` ```

File diff suppressed because one or more lines are too long

View File

@ -15,7 +15,7 @@ For example, if the current project uses inches, this function will return `0.39
We merely provide these functions for convenience and readability, as `10 * cm()` is more readable that your intent is "I want 10 centimeters" than `10 * 10`, if the project settings are in millimeters. We merely provide these functions for convenience and readability, as `10 * cm()` is more readable that your intent is "I want 10 centimeters" than `10 * 10`, if the project settings are in millimeters.
```js ```js
cm(): number cm() -> number
``` ```
### Tags ### Tags

32
docs/kcl/const_E.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
---
title: "HALF_TURN"
excerpt: ""
layout: manual
---
```js
HALF_TURN: number(deg) = 180deg
```

28
docs/kcl/const_PI.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
---
title: "QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
QUARTER_TURN: number(deg) = 90deg
```

32
docs/kcl/const_TAU.md Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
---
title: "THREE_QUARTER_TURN"
excerpt: ""
layout: manual
---
```js
THREE_QUARTER_TURN: number(deg) = 270deg
```

View File

@ -1,5 +1,5 @@
--- ---
title: "std::XZ" title: "ZERO"
excerpt: "" excerpt: ""
layout: manual layout: manual
--- ---
@ -9,7 +9,7 @@ layout: manual
```js ```js
std::XZ ZERO: number = 0
``` ```

View File

@ -18,7 +18,7 @@ std::math::PI: number = 3.14159265358979323846264338327950288_
circumference = 70 circumference = 70
exampleSketch = startSketchOn("XZ") exampleSketch = startSketchOn("XZ")
|> circle(center = [0, 0], radius = circumference/ (2 * PI)) |> circle({ center = [0, 0], radius = circumference/ (2 * PI) }, %)
example = extrude(exampleSketch, length = 5) example = extrude(exampleSketch, length = 5)
``` ```

File diff suppressed because one or more lines are too long

View File

@ -11,7 +11,7 @@ Return the value of Eulers number `e`.
**DEPRECATED** use the constant E **DEPRECATED** use the constant E
```js ```js
e(): number e() -> number
``` ```
### Tags ### Tags

View File

@ -1,18 +1,15 @@
--- ---
title: "extrude" title: "extrude"
excerpt: "Extend a 2-dimensional sketch through a third dimension in order to create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid." excerpt: "Extend a 2-dimensional sketch through a third dimension in order to"
layout: manual layout: manual
--- ---
Extend a 2-dimensional sketch through a third dimension in order to create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid. Extend a 2-dimensional sketch through a third dimension in order to
create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.
```js ```js
extrude( extrude(sketchSet: SketchSet, length: number) -> SolidSet
sketchSet: SketchSet,
length: number,
): SolidSet
``` ```

View File

@ -9,13 +9,7 @@ Blend a transitional edge along a tagged path, smoothing the sharp edge.
Fillet is similar in function and use to a chamfer, except a chamfer will cut a sharp transition along an edge while fillet will smoothly blend the transition. Fillet is similar in function and use to a chamfer, except a chamfer will cut a sharp transition along an edge while fillet will smoothly blend the transition.
```js ```js
fillet( fillet(solid: Solid, radius: number, tags: [EdgeReference], tolerance?: number, tag?: TagDeclarator) -> Solid
solid: Solid,
radius: number,
tags: [EdgeReference],
tolerance?: number,
tag?: TagDeclarator,
): Solid
``` ```

View File

@ -9,7 +9,7 @@ Compute the largest integer less than or equal to a number.
```js ```js
floor(num: number): number floor(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -15,7 +15,7 @@ For example, if the current project uses inches, this function will return `12`.
We merely provide these functions for convenience and readability, as `10 * ft()` is more readable that your intent is "I want 10 feet" than `10 * 304.8`, if the project settings are in millimeters. We merely provide these functions for convenience and readability, as `10 * ft()` is more readable that your intent is "I want 10 feet" than `10 * 304.8`, if the project settings are in millimeters.
```js ```js
ft(): number ft() -> number
``` ```
### Tags ### Tags

View File

@ -9,7 +9,7 @@ Get the next adjacent edge to the edge given.
```js ```js
getNextAdjacentEdge(tag: TagIdentifier): Uuid getNextAdjacentEdge(tag: TagIdentifier) -> Uuid
``` ```

View File

@ -9,7 +9,7 @@ Get the opposite edge to the edge given.
```js ```js
getOppositeEdge(tag: TagIdentifier): Uuid getOppositeEdge(tag: TagIdentifier) -> Uuid
``` ```

View File

@ -9,7 +9,7 @@ Get the previous adjacent edge to the edge given.
```js ```js
getPreviousAdjacentEdge(tag: TagIdentifier): Uuid getPreviousAdjacentEdge(tag: TagIdentifier) -> Uuid
``` ```

View File

@ -9,14 +9,7 @@ Create a helix.
```js ```js
helix( helix(revolutions: number, angleStart: number, ccw?: bool, radius: number, axis: Axis3dOrEdgeReference, length?: number) -> HelixValue
revolutions: number,
angleStart: number,
ccw?: bool,
radius: number,
axis: Axis3dOrEdgeReference,
length?: number,
): HelixValue
``` ```
@ -51,7 +44,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path. // Create a spring by sweeping around the helix path.
springSketch = startSketchOn('YZ') springSketch = startSketchOn('YZ')
|> circle(center = [0, 0], radius = 0.5) |> circle({ center = [0, 0], radius = 0.5 }, %)
|> sweep(path = helixPath) |> sweep(path = helixPath)
``` ```
@ -74,7 +67,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path. // Create a spring by sweeping around the helix path.
springSketch = startSketchOn('XY') springSketch = startSketchOn('XY')
|> circle(center = [0, 0], radius = 0.5) |> circle({ center = [0, 0], radius = 0.5 }, %)
|> sweep(path = helixPath) |> sweep(path = helixPath)
``` ```
@ -98,7 +91,7 @@ helixPath = helix(
// Create a spring by sweeping around the helix path. // Create a spring by sweeping around the helix path.
springSketch = startSketchOn('XY') springSketch = startSketchOn('XY')
|> circle(center = [0, 0], radius = 1) |> circle({ center = [0, 0], radius = 1 }, %)
|> sweep(path = helixPath) |> sweep(path = helixPath)
``` ```

View File

@ -9,10 +9,7 @@ Create a helix on a cylinder.
```js ```js
helixRevolutions( helixRevolutions(data: HelixRevolutionsData, solid: Solid) -> Solid
data: HelixRevolutionsData,
solid: Solid,
): Solid
``` ```
@ -32,7 +29,7 @@ helixRevolutions(
```js ```js
part001 = startSketchOn('XY') part001 = startSketchOn('XY')
|> circle(center = [5, 5], radius = 10) |> circle({ center = [5, 5], radius = 10 }, %)
|> extrude(length = 10) |> extrude(length = 10)
|> helixRevolutions({ |> helixRevolutions({
angleStart = 0, angleStart = 0,

View File

@ -9,10 +9,7 @@ Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.
```js ```js
hole( hole(holeSketch: SketchSet, sketch: Sketch) -> Sketch
holeSketch: SketchSet,
sketch: Sketch,
): Sketch
``` ```
@ -31,14 +28,14 @@ hole(
### Examples ### Examples
```js ```js
exampleSketch = startSketchOn(XY) exampleSketch = startSketchOn('XY')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0, 5]) |> line(end = [0, 5])
|> line(end = [5, 0]) |> line(end = [5, 0])
|> line(end = [0, -5]) |> line(end = [0, -5])
|> close() |> close()
|> hole(circle(center = [1, 1], radius = .25), %) |> hole(circle({ center = [1, 1], radius = .25 }, %), %)
|> hole(circle(center = [1, 4], radius = .25), %) |> hole(circle({ center = [1, 4], radius = .25 }, %), %)
example = extrude(exampleSketch, length = 1) example = extrude(exampleSketch, length = 1)
``` ```
@ -47,7 +44,7 @@ example = extrude(exampleSketch, length = 1)
```js ```js
fn squareHoleSketch() { fn squareHoleSketch() {
squareSketch = startSketchOn(-XZ) squareSketch = startSketchOn('-XZ')
|> startProfileAt([-1, -1], %) |> startProfileAt([-1, -1], %)
|> line(end = [2, 0]) |> line(end = [2, 0])
|> line(end = [0, 2]) |> line(end = [0, 2])
@ -56,8 +53,8 @@ fn squareHoleSketch() {
return squareSketch return squareSketch
} }
exampleSketch = startSketchOn(-XZ) exampleSketch = startSketchOn('-XZ')
|> circle(center = [0, 0], radius = 3) |> circle({ center = [0, 0], radius = 3 }, %)
|> hole(squareHoleSketch(), %) |> hole(squareHoleSketch(), %)
example = extrude(exampleSketch, length = 1) example = extrude(exampleSketch, length = 1)
``` ```

View File

@ -9,10 +9,7 @@ Make the inside of a 3D object hollow.
Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains around the exterior of the shape. Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains around the exterior of the shape.
```js ```js
hollow( hollow(thickness: number, solid: Solid) -> Solid
thickness: number,
solid: Solid,
): Solid
``` ```
@ -70,11 +67,17 @@ case = startSketchOn('-XZ')
|> extrude(length = 65) |> extrude(length = 65)
thing1 = startSketchOn(case, 'end') thing1 = startSketchOn(case, 'end')
|> circle(center = [-size / 2, -size / 2], radius = 25) |> circle({
center = [-size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50) |> extrude(length = 50)
thing2 = startSketchOn(case, 'end') thing2 = startSketchOn(case, 'end')
|> circle(center = [size / 2, -size / 2], radius = 25) |> circle({
center = [size / 2, -size / 2],
radius = 25
}, %)
|> extrude(length = 50) |> extrude(length = 50)
hollow(0.5, case) hollow(0.5, case)

View File

@ -15,10 +15,7 @@ For formats lacking unit data (such as STL, OBJ, or PLY files), the default unit
Note: The import command currently only works when using the native Modeling App. Note: The import command currently only works when using the native Modeling App.
```js ```js
import( import(filePath: String, options?: ImportFormat) -> ImportedGeometry
filePath: String,
options?: ImportFormat,
): ImportedGeometry
``` ```

View File

@ -15,7 +15,7 @@ For example, if the current project uses inches, this function will return `1`.
We merely provide these functions for convenience and readability, as `10 * inch()` is more readable that your intent is "I want 10 inches" than `10 * 25.4`, if the project settings are in millimeters. We merely provide these functions for convenience and readability, as `10 * inch()` is more readable that your intent is "I want 10 inches" than `10 * 25.4`, if the project settings are in millimeters.
```js ```js
inch(): number inch() -> number
``` ```
### Tags ### Tags

View File

@ -6,22 +6,13 @@ layout: manual
## Table of Contents ## Table of Contents
### Language * [Types](kcl/types)
* [Modules](kcl/modules)
* [`Types`](kcl/types) * [Known Issues](kcl/KNOWN-ISSUES)
* [`Modules`](kcl/modules)
* [`Settings`](kcl/settings)
* [`Known Issues`](kcl/known-issues)
### Standard library
* **`std`** * **`std`**
* [`HALF_TURN`](kcl/const_std-HALF_TURN) * [`HALF_TURN`](kcl/const_std-HALF_TURN)
* [`QUARTER_TURN`](kcl/const_std-QUARTER_TURN) * [`QUARTER_TURN`](kcl/const_std-QUARTER_TURN)
* [`THREE_QUARTER_TURN`](kcl/const_std-THREE_QUARTER_TURN) * [`THREE_QUARTER_TURN`](kcl/const_std-THREE_QUARTER_TURN)
* [`XY`](kcl/const_std-XY)
* [`XZ`](kcl/const_std-XZ)
* [`YZ`](kcl/const_std-YZ)
* [`ZERO`](kcl/const_std-ZERO) * [`ZERO`](kcl/const_std-ZERO)
* [`abs`](kcl/abs) * [`abs`](kcl/abs)
* [`acos`](kcl/acos) * [`acos`](kcl/acos)
@ -99,9 +90,7 @@ layout: manual
* [`reduce`](kcl/reduce) * [`reduce`](kcl/reduce)
* [`rem`](kcl/rem) * [`rem`](kcl/rem)
* [`revolve`](kcl/revolve) * [`revolve`](kcl/revolve)
* [`rotate`](kcl/rotate)
* [`round`](kcl/round) * [`round`](kcl/round)
* [`scale`](kcl/scale)
* [`segAng`](kcl/segAng) * [`segAng`](kcl/segAng)
* [`segEnd`](kcl/segEnd) * [`segEnd`](kcl/segEnd)
* [`segEndX`](kcl/segEndX) * [`segEndX`](kcl/segEndX)
@ -121,7 +110,6 @@ layout: manual
* [`tangentialArcToRelative`](kcl/tangentialArcToRelative) * [`tangentialArcToRelative`](kcl/tangentialArcToRelative)
* [`toDegrees`](kcl/toDegrees) * [`toDegrees`](kcl/toDegrees)
* [`toRadians`](kcl/toRadians) * [`toRadians`](kcl/toRadians)
* [`translate`](kcl/translate)
* [`xLine`](kcl/xLine) * [`xLine`](kcl/xLine)
* [`xLineTo`](kcl/xLineTo) * [`xLineTo`](kcl/xLineTo)
* [`yLine`](kcl/yLine) * [`yLine`](kcl/yLine)

View File

@ -11,7 +11,7 @@ Convert a number to an integer.
DEPRECATED use floor(), ceil(), or round(). DEPRECATED use floor(), ceil(), or round().
```js ```js
int(num: number): number int(num: number) -> number
``` ```
### Tags ### Tags
@ -37,7 +37,7 @@ n = int(ceil(5 / 2))
assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3") assertEqual(n, 3, 0.0001, "5/2 = 2.5, rounded up makes 3")
// Draw n cylinders. // Draw n cylinders.
startSketchOn('XZ') startSketchOn('XZ')
|> circle(center = [0, 0], radius = 2) |> circle({ center = [0, 0], radius = 2 }, %)
|> extrude(length = 5) |> extrude(length = 5)
|> patternTransform( |> patternTransform(
instances = n, instances = n,

View File

@ -1,15 +1,15 @@
--- ---
title: "lastSegX" title: "lastSegX"
excerpt: "Extract the 'x' axis value of the last line segment in the provided 2-d sketch." excerpt: "Extract the 'x' axis value of the last line segment in the provided 2-d"
layout: manual layout: manual
--- ---
Extract the 'x' axis value of the last line segment in the provided 2-d sketch. Extract the 'x' axis value of the last line segment in the provided 2-d
sketch.
```js ```js
lastSegX(sketch: Sketch): number lastSegX(sketch: Sketch) -> number
``` ```

View File

@ -1,15 +1,15 @@
--- ---
title: "lastSegY" title: "lastSegY"
excerpt: "Extract the 'y' axis value of the last line segment in the provided 2-d sketch." excerpt: "Extract the 'y' axis value of the last line segment in the provided 2-d"
layout: manual layout: manual
--- ---
Extract the 'y' axis value of the last line segment in the provided 2-d sketch. Extract the 'y' axis value of the last line segment in the provided 2-d
sketch.
```js ```js
lastSegY(sketch: Sketch): number lastSegY(sketch: Sketch) -> number
``` ```

View File

@ -9,10 +9,7 @@ Compute the angle of the given leg for x.
```js ```js
legAngX( legAngX(hypotenuse: number, leg: number) -> number
hypotenuse: number,
leg: number,
): number
``` ```
### Tags ### Tags

View File

@ -9,10 +9,7 @@ Compute the angle of the given leg for y.
```js ```js
legAngY( legAngY(hypotenuse: number, leg: number) -> number
hypotenuse: number,
leg: number,
): number
``` ```
### Tags ### Tags

View File

@ -9,10 +9,7 @@ Compute the length of the given leg.
```js ```js
legLen( legLen(hypotenuse: number, leg: number) -> number
hypotenuse: number,
leg: number,
): number
``` ```
### Tags ### Tags

View File

@ -9,12 +9,7 @@ Extend the current sketch with a new straight line.
```js ```js
line( line(sketch: Sketch, endAbsolute?: [number], end?: [number], tag?: TagDeclarator) -> Sketch
sketch: Sketch,
endAbsolute?: [number],
end?: [number],
tag?: TagDeclarator,
): Sketch
``` ```
@ -35,7 +30,7 @@ line(
### Examples ### Examples
```js ```js
triangle = startSketchOn(XZ) triangle = startSketchOn("XZ")
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
// The 'end' argument means it ends at exactly [10, 0]. // The 'end' argument means it ends at exactly [10, 0].
// This is an absolute measurement, it is NOT relative to // This is an absolute measurement, it is NOT relative to
@ -46,7 +41,7 @@ triangle = startSketchOn(XZ)
|> close() |> close()
|> extrude(length = 5) |> extrude(length = 5)
box = startSketchOn(XZ) box = startSketchOn("XZ")
|> startProfileAt([10, 10], %) |> startProfileAt([10, 10], %)
// The 'to' argument means move the pen this much. // The 'to' argument means move the pen this much.
// So, [10, 0] is a relative distance away from the current point. // So, [10, 0] is a relative distance away from the current point.

View File

@ -9,7 +9,7 @@ Compute the natural logarithm of the number.
```js ```js
ln(num: number): number ln(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,13 +9,7 @@ Create a 3D surface or solid by interpolating between two or more sketches.
The sketches need to closed and on the same plane. The sketches need to closed and on the same plane.
```js ```js
loft( loft(sketches: [Sketch], vDegree: NonZeroU32, bezApproximateRational: bool, baseCurveIndex?: integer, tolerance?: number) -> Solid
sketches: [Sketch],
vDegree: NonZeroU32,
bezApproximateRational: bool,
baseCurveIndex?: integer,
tolerance?: number,
): Solid
``` ```
@ -69,10 +63,10 @@ squareSketch = startSketchOn('XY')
|> close() |> close()
circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))
|> circle(center = [0, 100], radius = 50) |> circle({ center = [0, 100], radius = 50 }, %)
circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))
|> circle(center = [0, 100], radius = 20) |> circle({ center = [0, 100], radius = 20 }, %)
loft([ loft([
squareSketch, squareSketch,
@ -94,10 +88,10 @@ squareSketch = startSketchOn('XY')
|> close() |> close()
circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75)) circleSketch0 = startSketchOn(offsetPlane('XY', offset = 75))
|> circle(center = [0, 100], radius = 50) |> circle({ center = [0, 100], radius = 50 }, %)
circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150)) circleSketch1 = startSketchOn(offsetPlane('XY', offset = 150))
|> circle(center = [0, 100], radius = 20) |> circle({ center = [0, 100], radius = 20 }, %)
loft( loft(
[ [

View File

@ -9,10 +9,7 @@ Compute the logarithm of the number with respect to an arbitrary base.
The result might not be correctly rounded owing to implementation details; `log2()` can produce more accurate results for base 2, and `log10()` can produce more accurate results for base 10. The result might not be correctly rounded owing to implementation details; `log2()` can produce more accurate results for base 2, and `log10()` can produce more accurate results for base 10.
```js ```js
log( log(num: number, base: number) -> number
num: number,
base: number,
): number
``` ```
### Tags ### Tags

View File

@ -9,7 +9,7 @@ Compute the base 10 logarithm of the number.
```js ```js
log10(num: number): number log10(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -9,7 +9,7 @@ Compute the base 2 logarithm of the number.
```js ```js
log2(num: number): number log2(num: number) -> number
``` ```
### Tags ### Tags

View File

@ -15,7 +15,7 @@ For example, if the current project uses inches, this function will return `39.3
We merely provide these functions for convenience and readability, as `10 * m()` is more readable that your intent is "I want 10 meters" than `10 * 1000`, if the project settings are in millimeters. We merely provide these functions for convenience and readability, as `10 * m()` is more readable that your intent is "I want 10 meters" than `10 * 1000`, if the project settings are in millimeters.
```js ```js
m(): number m() -> number
``` ```
### Tags ### Tags

View File

@ -9,10 +9,7 @@ Apply a function to every element of a list.
Given a list like `[a, b, c]`, and a function like `f`, returns `[f(a), f(b), f(c)]` Given a list like `[a, b, c]`, and a function like `f`, returns `[f(a), f(b), f(c)]`
```js ```js
map( map(array: [KclValue], mapFn: FunctionSource) -> [KclValue]
array: [KclValue],
mapFn: FunctionSource,
): [KclValue]
``` ```
@ -34,7 +31,7 @@ map(
r = 10 // radius r = 10 // radius
fn drawCircle(id) { fn drawCircle(id) {
return startSketchOn("XY") return startSketchOn("XY")
|> circle(center = [id * 2 * r, 0], radius = r) |> circle({ center = [id * 2 * r, 0], radius = r }, %)
} }
// Call `drawCircle`, passing in each element of the array. // Call `drawCircle`, passing in each element of the array.
@ -50,7 +47,7 @@ r = 10 // radius
// Call `map`, using an anonymous function instead of a named one. // Call `map`, using an anonymous function instead of a named one.
circles = map([1..3], fn(id) { circles = map([1..3], fn(id) {
return startSketchOn("XY") return startSketchOn("XY")
|> circle(center = [id * 2 * r, 0], radius = r) |> circle({ center = [id * 2 * r, 0], radius = r }, %)
}) })
``` ```

View File

@ -9,7 +9,7 @@ Compute the maximum of the given arguments.
```js ```js
max(args: [number]): number max(args: [number]) -> number
``` ```
### Tags ### Tags

View File

@ -9,7 +9,7 @@ Compute the minimum of the given arguments.
```js ```js
min(args: [number]): number min(args: [number]) -> number
``` ```
### Tags ### Tags

View File

@ -11,10 +11,7 @@ Only works on unclosed sketches for now.
Mirror occurs around a local sketch axis rather than a global axis. Mirror occurs around a local sketch axis rather than a global axis.
```js ```js
mirror2d( mirror2d(data: Mirror2dData, sketchSet: SketchSet) -> [Sketch]
data: Mirror2dData,
sketchSet: SketchSet,
): [Sketch]
``` ```

Some files were not shown because too many files have changed in this diff Show More