Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,8 +20,8 @@ Thank you for your interest in contributing to Object UI! This document provides

### Prerequisites

- **Node.js** 18.0 or higher
- **pnpm** (recommended package manager)
- **Node.js** 22.11 or higher (the floor root `package.json` declares in `engines.node`)
- **pnpm** 10 or higher (the required package manager — the workspace pins `pnpm@10.31.0` via `packageManager`)
- **Git** for version control
- Basic knowledge of React, TypeScript, and Tailwind CSS

Expand DownExpand Up@@ -375,7 +375,7 @@ Our repository includes several automated GitHub workflows that will run when yo
- **Type Checking**: Validates TypeScript types
- **Tests**: Runs unit and integration tests
- **Build**: Ensures all packages build successfully
- **Matrix Testing**: Tests on Node.js 18.x and 20.x
- **Sharded Testing**: Tests run across 4 shards, all on Node.js 22.x — the only Node version any workflow declares
- **Coverage Thresholds**: Enforces minimum test coverage (see below)

##### Test Coverage Requirements
Expand Down
2 changes: 1 addition & 1 deletion QUICK_REFERENCE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,7 +128,7 @@ behind (objectui#5394 — that had happened once per release, three times).
- **Client:** `@objectstack/client` ^17.0.0 (declared by `apps/console/package.json`
and `packages/data-objectstack/package.json`)
- **Node.js:** ≥ 22 (see root `engines.node`)
- **pnpm:** ≥ 9 (the workspace pins `pnpm@10.31.0` via `packageManager`)
- **pnpm:** ≥ 10 (the workspace pins `pnpm@10.31.0` via `packageManager`)
- **React:** 18.x or 19.x (the `peerDependencies.react` range the packages declare)
- **TypeScript:** ≥ 5.0 (strict mode) — the stack floor stated in AGENTS.md §2, not a
manifest fact: nothing in this tree declares a `typescript` range to check it against,
Expand Down
6 changes: 3 additions & 3 deletions content/docs/guide/deployment.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,7 +20,7 @@ Create a multi-stage `Dockerfile` at the project root:
```dockerfile
# Stage 1: Build
FROM node:22-alpine AS builder
RUN corepack enable && corepack prepare pnpm@9 --activate
RUN corepack enable && corepack prepare pnpm@10 --activate
WORKDIR /app

COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
Expand DownExpand Up@@ -131,8 +131,8 @@ Create `netlify.toml` in the project root:
publish = "apps/console/dist"

[build.environment]
NODE_VERSION = "20"
PNPM_VERSION = "9"
NODE_VERSION = "22"
PNPM_VERSION = "10"

# SPA fallback — redirect all routes to index.html
[[redirects]]
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,8 +6,8 @@
"homepage": "https://www.objectui.org",
"packageManager": "pnpm@10.31.0",
"engines": {
"node": ">=22",
"pnpm": ">=9"
"node": ">=22.11",
"pnpm": ">=10"
},
"workspaces": [
"packages/*",
Expand Down
21 changes: 13 additions & 8 deletions scripts/setup.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,17 +11,22 @@ NC='\033[0m' # No Color
echo -e "${BLUE}🚀 ObjectUI Development Environment Setup${NC}"
echo -e "${BLUE}==========================================${NC}\n"

# Check Node.js
# Check Node.js — the floor is READ from the root package.json's `engines.node`
# rather than repeated here, so this script and the manifest cannot drift apart
# (objectui#5306: this check demanded Node 20 while the manifest said 22).
echo -e "${YELLOW}Checking prerequisites...${NC}"
if ! command -v node &> /dev/null; then
echo -e "${RED}❌ Node.js is not installed${NC}"
echo -e "${YELLOW}Please install Node.js 20+ from https://nodejs.org/${NC}"
echo -e "${YELLOW}Please install Node.js from https://nodejs.org/ — the required version is the one root package.json declares in engines.node${NC}"
exit 1
fi

NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
if [ "$NODE_VERSION" -lt 20 ]; then
echo -e "${RED}❌ Node.js version must be 20 or higher (current: $(node -v))${NC}"
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
# `>=22.11` -> `22.11`. A failed read exits the script under `set -e`, so an
# unreadable manifest can never be mistaken for a satisfied floor.
NODE_FLOOR=$(node -p "require('$REPO_ROOT/package.json').engines.node.replace(/^[^0-9]*/, '')")
if [ "$(printf '%s\n%s\n' "$NODE_FLOOR" "$(node -v | cut -d'v' -f2)" | sort -V | head -n1)" != "$NODE_FLOOR" ]; then
echo -e "${RED}❌ Node.js $NODE_FLOOR or higher is required (current: $(node -v))${NC}"
exit 1
fi
echo -e "${GREEN}✓ Node.js $(node -v) detected${NC}"
Expand All@@ -32,9 +37,9 @@ if ! command -v pnpm &> /dev/null; then
npm install -g pnpm
fi

PNPM_VERSION=$(pnpm -v | cut -d'.' -f1)
if [ "$PNPM_VERSION" -lt 9 ]; then
echo -e "${YELLOW}📦 Upgrading pnpm to v9+...${NC}"
PNPM_FLOOR=$(node -p "require('$REPO_ROOT/package.json').engines.pnpm.replace(/^[^0-9]*/, '')")
if [ "$(printf '%s\n%s\n' "$PNPM_FLOOR" "$(pnpm -v)" | sort -V | head -n1)" != "$PNPM_FLOOR" ]; then
echo -e "${YELLOW}📦 Upgrading pnpm to v$PNPM_FLOOR+...${NC}"
npm install -g pnpm@latest
fi
echo -e "${GREEN}✓ pnpm $(pnpm -v) detected${NC}"
Expand Down
Loading