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
5 changes: 5 additions & 0 deletions .changeset/compiled-plugin-exports.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@fulldotdev/sitex": patch
---

Publish compiled package entrypoints for the Vite plugin and island runtime so consumers no longer load TypeScript files from node_modules.
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: CI

on:
pull_request:
branches: [main]
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
name: Validate
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup PNPM
uses: pnpm/action-setup@v6

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Check changeset
if: github.event_name == 'pull_request' && !startsWith(github.head_ref, 'changeset-release/')
run: pnpm exec changeset status --since=origin/${{ github.event.pull_request.base.ref }}

- name: Check formatting
run: pnpm format:check

- name: Type check
run: pnpm typecheck

- name: Build package
run: pnpm build:package

- name: Build site
run: pnpm build
50 changes: 50 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Release

on:
push:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false

permissions: {}

jobs:
release-pr:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write
pull-requests: write

steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup PNPM
uses: pnpm/action-setup@v6

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
registry-url: https://registry.npmjs.org
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Create release pull request
id: changesets
uses: changesets/action@v1
with:
version: pnpm release
publish: pnpm release:publish
commit: "[ci] release"
title: "[ci] release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ node_modules/

# build output
dist/
package-dist/
.vite/
.sitex/
.sitex-bench/
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ SiteX renders React routes to static HTML by default. When a page needs browser
## Install

```bash
pnpm add @fulldotdev/sitex react react-dom vite @vitejs/plugin-react
pnpm add --allow-build=esbuild @fulldotdev/sitex react react-dom vite @vitejs/plugin-react
pnpm add -D typescript @types/react @types/react-dom
```

Expand Down
62 changes: 45 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,35 @@
"name": "@fulldotdev/sitex",
"version": "0.1.0",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/fulldotdev/sitex.git"
},
"homepage": "https://github.com/fulldotdev/sitex#readme",
"bugs": {
"url": "https://github.com/fulldotdev/sitex/issues"
},
"publishConfig": {
"access": "public"
},
"type": "module",
"exports": {
"./island": "./sitex/hydration/server.tsx",
"./plugin": "./sitex/vite/plugin.ts",
"./island": {
"types": "./package-dist/hydration/server.d.ts",
"default": "./package-dist/hydration/server.js"
},
"./plugin": {
"types": "./package-dist/vite/plugin.d.ts",
"default": "./package-dist/vite/plugin.js"
},
"./tsconfig": "./sitex/config/tsconfig.json",
"./virtual": "./sitex/types/virtual.d.ts"
},
"files": [
"package-dist",
"sitex/config",
"sitex/types"
],
"engines": {
"node": ">=22.12.0"
},
Expand All @@ -22,6 +41,11 @@
"msw"
]
},
"peerDependencies": {
"react": ">=19",
"react-dom": ">=19",
"vite": ">=7"
},
"scripts": {
"dev": "vite --host 127.0.0.1 --port 4323",
"start": "pnpm dev",
Expand All @@ -30,45 +54,49 @@
"format:check": "prettier --check .",
"typecheck": "tsc --noEmit",
"check": "pnpm format:check && pnpm typecheck",
"build:package": "node scripts/build-package.mjs && tsc -p tsconfig.package.json",
"build": "vite build",
"preview": "vite preview --host 127.0.0.1 --port 4323",
"prepack": "pnpm build:package",
"changeset": "changeset",
"release": "changeset version && pnpm install --lockfile-only",
"release:publish": "pnpm build && changeset publish"
"release:publish": "pnpm build && pnpm build:package && changeset publish"
},
"dependencies": {
"@babel/generator": "^7.29.1",
"@babel/parser": "^7.29.3",
"@babel/traverse": "^7.29.0",
"@babel/types": "^7.29.0",
"fast-glob": "^3.3.3",
"vite-tsconfig-paths": "^6.1.1"
},
"devDependencies": {
"@base-ui/react": "^1.5.0",
"@changesets/changelog-github": "^0.7.0",
"@changesets/cli": "^2.31.0",
"@fontsource-variable/geist": "^5.2.9",
"@ianvs/prettier-plugin-sort-imports": "^4.7.1",
"@tailwindcss/vite": "^4.1.13",
"@types/babel__generator": "^7.27.0",
"@types/babel__traverse": "^7.28.0",
"@types/node": "^24.3.1",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"@vitejs/plugin-react": "^5.0.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"fast-glob": "^3.3.3",
"lucide-react": "^1.16.0",
"next-themes": "^0.4.6",
"prettier": "^3.8.3",
"prettier-plugin-tailwindcss": "^0.8.0",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"shadcn": "^4.8.3",
"shiki": "^4.1.0",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.1.13",
"tw-animate-css": "^1.4.0",
"vite": "^7.1.5",
"vite-tsconfig-paths": "^6.1.1"
},
"devDependencies": {
"@changesets/changelog-github": "^0.7.0",
"@changesets/cli": "^2.31.0",
"@ianvs/prettier-plugin-sort-imports": "^4.7.1",
"@types/node": "^24.3.1",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"prettier": "^3.8.3",
"prettier-plugin-tailwindcss": "^0.8.0",
"typescript": "^5.9.2"
"typescript": "^5.9.2",
"vite": "^7.1.5"
}
}
74 changes: 40 additions & 34 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions scripts/build-package.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { rm } from "node:fs/promises"
import { builtinModules, createRequire } from "node:module"
import { build } from "esbuild"

const require = createRequire(import.meta.url)
const packageJson = require("../package.json")

const external = [
...builtinModules,
...builtinModules.map((module) => `node:${module}`),
...Object.keys(packageJson.dependencies ?? {}),
...Object.keys(packageJson.peerDependencies ?? {}),
"virtual:*",
]

await rm("package-dist", { recursive: true, force: true })

await build({
entryPoints: [
"sitex/vite/plugin.ts",
"sitex/hydration/client.tsx",
"sitex/hydration/server.tsx",
"sitex/router/index.tsx",
"sitex/router/routes.ts",
],
outbase: "sitex",
outdir: "package-dist",
bundle: true,
external,
format: "esm",
jsx: "automatic",
platform: "neutral",
target: "es2022",
})
Loading
Loading