Guide to setting up a development environment for IFClite.
| Tool | Version | Purpose |
|---|---|---|
| Node.js | 18.0+ | JavaScript runtime |
| pnpm | 8.0+ | Package manager |
| Rust | stable | WASM compilation |
| wasm-pack | 0.12+ | WASM toolchain |
=== “macOS”
```bash
# Install Node.js via Homebrew
brew install node@18
# Install pnpm
npm install -g pnpm
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Add WASM target
rustup target add wasm32-unknown-unknown
# Install wasm-pack
cargo install wasm-pack
```
=== “Linux”
```bash
# Install Node.js (Ubuntu/Debian)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Install pnpm
npm install -g pnpm
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# Add WASM target
rustup target add wasm32-unknown-unknown
# Install wasm-pack
cargo install wasm-pack
```
=== “Windows”
```powershell
# Install Node.js via winget
winget install OpenJS.NodeJS.LTS
# Install pnpm
npm install -g pnpm
# Install Rust via rustup-init.exe
# Download from https://rustup.rs
# Add WASM target
rustup target add wasm32-unknown-unknown
# Install wasm-pack
cargo install wasm-pack
```
git clone https://github.com/louistrue/ifc-lite.git
cd ifc-lite
pnpm install
pnpm build
# Run tests
pnpm test
# Start viewer
cd apps/viewer && pnpm dev
ifc-lite/
├── rust/ # Rust crates
│ ├── core/ # Parser crate
│ ├── geometry/ # Geometry crate
│ └── wasm-bindings/ # WASM crate
├── packages/ # TypeScript packages
│ ├── parser/ # @ifc-lite/parser
│ ├── geometry/ # @ifc-lite/geometry
│ ├── renderer/ # @ifc-lite/renderer
│ ├── query/ # @ifc-lite/query
│ ├── data/ # @ifc-lite/data
│ ├── export/ # @ifc-lite/export
│ └── codegen/ # Schema generator
├── apps/
│ └── viewer/ # Demo viewer app
├── docs/ # Documentation
└── plan/ # Specifications
Run all packages in watch mode:
pnpm -r dev
Or specific packages:
# Watch parser
cd packages/parser && pnpm dev
# Watch renderer
cd packages/renderer && pnpm dev
cd apps/viewer
pnpm dev
Open http://localhost:5173 in your browser.
cd rust/wasm-bindings
wasm-pack build --target web --release
The output goes to rust/wasm-bindings/pkg/.
cd rust
cargo test
Rust Documentation (rustdoc):
# Generate and open in browser
cd rust && cargo doc --no-deps --open
# Generate for specific crate
cd rust/core && cargo doc --open
# Generate without opening
cargo doc --no-deps
# Output: target/doc/index.html
MkDocs (Project Documentation):
cd docs && mkdocs serve
# Opens at http://127.0.0.1:8000
Install recommended extensions:
{
"recommendations": [
"rust-lang.rust-analyzer",
"tamasfe.even-better-toml",
"bradlc.vscode-tailwindcss",
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint"
]
}
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"rust-analyzer.cargo.features": "all"
}
TypeScript packages:
cd packages/parser
pnpm add new-package
Rust crates:
cd rust/core
cargo add new-crate
mkdir packages/new-package
cd packages/new-package
# Initialize
pnpm init
# Add to workspace (update root package.json if needed)
# TypeScript
pnpm update -r
# Rust
cargo update
# Clean and rebuild
cd rust
cargo clean
wasm-pack build --target web --release
# Clean install
rm -rf node_modules pnpm-lock.yaml
pnpm install
# Rebuild type declarations
pnpm -r build
git checkout -b feature/my-feature
# or
git checkout -b fix/bug-description
Make your changes and test them:
# Run tests
pnpm test
# Build to verify
pnpm build
Push your branch and open a PR on GitHub:
git push origin feature/my-feature
PR Requirements: