{title}
++
diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index ab229901..7f5d4c8c 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -4,15 +4,15 @@ description: Sets up Node.js and PNPM with caching inputs: os: required: true - description: 'Operating system' + description: "Operating system" default: ubuntu-latest node-version: required: true - description: 'Node.js version' - default: '24' + description: "Node.js version" + default: "24" runs: - using: 'composite' + using: "composite" steps: - uses: pnpm/action-setup@v4 with: @@ -21,9 +21,9 @@ runs: - uses: actions/setup-node@v4 with: node-version: ${{ inputs.node-version }} - cache: 'pnpm' - cache-dependency-path: '**/pnpm-lock.yaml' - registry-url: 'https://registry.npmjs.org' + cache: "pnpm" + cache-dependency-path: "**/pnpm-lock.yaml" + registry-url: "https://registry.npmjs.org" - name: Get pnpm store directory shell: bash run: | @@ -34,5 +34,15 @@ runs: key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - run: pnpm install --prefer-offline + - name: Install dependencies in all workspaces shell: bash + run: | + echo "Installing dependencies in nx workspace..." + cd nx && pnpm install --prefer-offline + echo "Installing dependencies in vanilla workspace..." + cd ../vanilla && pnpm install --prefer-offline + echo "Installing dependencies in turborepo workspace..." + cd ../turborepo && pnpm install --prefer-offline + echo "Installing dependencies in scripts..." + cd ../scripts && pnpm install --prefer-offline + echo "✓ All dependencies installed" diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index a16fc5b9..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "npm" - directory: "/examples" # Location of package manifests - schedule: - interval: "monthly" # so we don't get buried in dependabot PR - - - diff --git a/.github/workflows/build-deploy-test.yml b/.github/workflows/build-deploy-test.yml index ffc5ca93..8f175c39 100644 --- a/.github/workflows/build-deploy-test.yml +++ b/.github/workflows/build-deploy-test.yml @@ -24,6 +24,26 @@ on: type: string repository_dispatch: types: [build-deploy-test] + pull_request: + branches: + - main + paths: + - "nx/**" + - "vanilla/**" + - "turborepo/**" + - "scripts/**" + - ".github/workflows/**" + - ".github/actions/**" + push: + branches: + - main + paths: + - "nx/**" + - "vanilla/**" + - "turborepo/**" + - "scripts/**" + - ".github/workflows/**" + - ".github/actions/**" env: NODE_VERSION: "24" @@ -54,11 +74,36 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: ./.github/actions/setup + - uses: pnpm/action-setup@v4 + with: + version: 10.6.3 + run_install: false + + - uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} + registry-url: "https://registry.npmjs.org" + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: pnpm-store-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + pnpm-store-${{ runner.os }}- + + - name: Install scripts dependencies + run: | + cd scripts + pnpm install --prefer-offline - name: Upgrade Zephyr plugins + if: github.event_name != 'pull_request' && github.event_name != 'push' run: | cd scripts if [ -n "${{ github.event.inputs.plugin_version }}" ]; then @@ -72,21 +117,98 @@ jobs: pnpm upgrade-plugins fi - - name: Install dependencies after upgrade - run: pnpm install --prefer-offline + - name: Install vanilla dependencies + run: | + cd vanilla + pnpm install --prefer-offline + + - name: Install nx example dependencies + run: | + cd nx/examples + for example in */; do + if [ -f "${example}package.json" ]; then + echo "Installing dependencies for nx/${example}" + cd "$example" + pnpm install --prefer-offline + cd .. + fi + done + + - name: Install turborepo example dependencies + run: | + cd turborepo/examples + for example in */; do + if [ -f "${example}package.json" ]; then + echo "Installing dependencies for turborepo/${example}" + cd "$example" + pnpm install --prefer-offline + cd .. + fi + done + + - name: Clean zephyr cache before build + run: | + echo "Cleaning $HOME/.zephyr directory..." + if [ -d "$HOME/.zephyr" ]; then + echo "Found existing .zephyr directory, checking contents:" + ls -lah "$HOME/.zephyr/" || true + echo "Removing .zephyr directory..." + rm -rf "$HOME/.zephyr" + fi + echo "Creating fresh .zephyr directory..." + mkdir -p "$HOME/.zephyr" - name: Build all examples run: | cd scripts if [ "${{ github.event.inputs.skip_cache }}" == "true" ] || [ "${{ github.event.client_payload.skip_cache }}" == "true" ]; then - echo "Building with --skip-cache flag" - pnpm build-packages:force + echo "Building all examples with --skip-cache flag" + pnpm build-packages --skip-cache else - echo "Building with cache enabled" + echo "Building all examples with cache enabled" pnpm build-packages fi env: NODE_ENV: production + ZE_SECRET_TOKEN: ${{ env.ZE_SECRET_TOKEN }} + ZE_API_GATE: ${{ env.ZE_API_GATE }} + ZE_API: ${{ env.ZE_API }} + + - name: Check zephyr cache after build + if: always() + run: | + echo "Checking $HOME/.zephyr after build..." + if [ -d "$HOME/.zephyr" ]; then + echo "Total files: $(ls -1 "$HOME/.zephyr" 2>/dev/null | wc -l)" + echo "Checking for subdirectories that might cause EISDIR error:" + find "$HOME/.zephyr" -type d 2>/dev/null || echo "No subdirectories found" + echo "" + echo "Files and directories in .zephyr:" + ls -lah "$HOME/.zephyr/" 2>/dev/null | head -30 || echo "Cannot list directory" + else + echo "$HOME/.zephyr does not exist" + fi + + - name: Upload build logs + uses: actions/upload-artifact@v4 + if: always() + with: + name: build-logs + path: scripts/tmp/build/ + retention-days: 3 + + - name: Check zephyr cache contents + run: | + echo "Checking $HOME/.zephyr directory..." + if [ -d "$HOME/.zephyr" ]; then + echo "Files and directories in .zephyr:" + ls -lah "$HOME/.zephyr/" | head -30 + echo "" + echo "Checking for subdirectories:" + find "$HOME/.zephyr" -type d | head -10 + else + echo "$HOME/.zephyr does not exist" + fi - name: Wait for deployments to be ready run: | @@ -104,6 +226,9 @@ jobs: pnpm test env: CI: true + ZE_SECRET_TOKEN: ${{ env.ZE_SECRET_TOKEN }} + ZE_API_GATE: ${{ env.ZE_API_GATE }} + ZE_API: ${{ env.ZE_API }} - name: Upload test results uses: actions/upload-artifact@v4 @@ -114,12 +239,3 @@ jobs: scripts/test-results/ scripts/playwright-report/ retention-days: 7 - - - name: Upload build logs - uses: actions/upload-artifact@v4 - if: always() - with: - name: build-logs - path: | - scripts/tmp/build/ - retention-days: 3 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..a45fd52c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/EXAMPLES_INVENTORY.md b/EXAMPLES_INVENTORY.md new file mode 100644 index 00000000..9721771f --- /dev/null +++ b/EXAMPLES_INVENTORY.md @@ -0,0 +1,295 @@ +# Examples Inventory & Standardization Plan + +This document catalogs all examples across the three directories (vanilla, nx, turborepo) and identifies standardization opportunities. + +## Current Inventory + +### Vanilla (23 examples) +1. angular-vite +2. basehref-examples +3. create-default-webpack-mf +4. create-mf-app-rspack +5. ember-vite +6. modernjs-app +7. ng-mf +8. parcel-react +9. plugin-testing +10. qwik-1.5 +11. react-airbnb-clone +12. react-rollup-ts +13. react-rspack-tractor-2.0 +14. react-tractor-sample +15. react-vite-mf +16. react-vite-ts +17. rolldown-react +18. rspack-project +19. rspress-ssg +20. solid +21. svelte +22. tsdown +23. vitepress + +### NX (4 examples) +1. create-nx-rspack-workspace-mf +2. create-nx-workspace-mf +3. nx-ng +4. react-vite-nx + +### Turborepo (1 example) +1. mf-turbo-rspack + +--- + +## Categorization by Technology + +### React Examples + +#### Vanilla +- `create-default-webpack-mf` - React + Webpack + Module Federation +- `create-mf-app-rspack` - React + Rspack + (likely MF) +- `react-airbnb-clone` - React + Rspack + Module Federation +- `react-rollup-ts` - React + Rollup + TypeScript +- `react-rspack-tractor-2.0` - React + Rspack (monorepo) +- `react-tractor-sample` - React + Webpack (monorepo) +- `react-vite-mf` - React + Vite + Module Federation +- `react-vite-ts` - React + Vite + TypeScript +- `rolldown-react` - React + Rolldown +- `rspack-project` - React + Rspack + +#### NX +- `create-nx-rspack-workspace-mf` - React + Rspack + Module Federation + NX +- `create-nx-workspace-mf` - React + Webpack + Module Federation + NX +- `react-vite-nx` - React + Vite + NX + +#### Turborepo +- `mf-turbo-rspack` - React + Rspack + Module Federation + Turborepo + +### Angular Examples + +#### Vanilla +- `angular-vite` - Angular + Vite +- `ng-mf` - Angular + Module Federation + +#### NX +- `nx-ng` - Angular v15 + Webpack + NX + +### Other Frameworks + +#### Vanilla +- `solid` - SolidJS +- `svelte` - Svelte +- `qwik-1.5` - Qwik +- `ember-vite` - Ember + Vite + +### Bundler/Build Tool Examples + +#### Vanilla +- `parcel-react` - Parcel bundler +- `modernjs-app` - ModernJS framework +- `rspress-ssg` - Rspress SSG +- `vitepress` - VitePress documentation +- `rolldown-react` - Rolldown bundler +- `tsdown` - TypeScript bundler + +### Utility/Testing Examples + +#### Vanilla +- `basehref-examples` - Base href examples +- `plugin-testing` - Plugin testing utilities + +--- + +## Standardization Opportunities + +### ✅ Already Standardized Across All Three + +**React + Rspack + Module Federation** +- ✅ Vanilla: `mf-turbo-rspack` equivalent exists as multiple examples +- ✅ NX: `create-nx-rspack-workspace-mf` +- ✅ Turborepo: `mf-turbo-rspack` + +### 🎯 Should Be Standardized (High Priority) + +#### 1. React + Vite + TypeScript (Simple) +- ✅ Vanilla: `react-vite-ts` +- ✅ NX: `react-vite-nx` +- ❌ Turborepo: **MISSING** - Should add `turbo-react-vite` + +#### 2. React + Webpack + Module Federation +- ✅ Vanilla: `create-default-webpack-mf` +- ✅ NX: `create-nx-workspace-mf` +- ❌ Turborepo: **MISSING** - Should add `turbo-webpack-mf` + +#### 3. Angular + Vite +- ✅ Vanilla: `angular-vite` +- ✅ NX: `nx-ng` (uses Webpack, should add Vite version) +- ❌ Turborepo: **MISSING** - Should add `turbo-angular-vite` + +#### 4. React + Rspack (Simple, no MF) +- ✅ Vanilla: `rspack-project` +- ❌ NX: **MISSING** - Should add `nx-rspack-simple` +- ❌ Turborepo: **MISSING** - Should add `turbo-rspack-simple` + +### 🔄 Framework Diversity (Medium Priority) + +#### 5. SolidJS +- ✅ Vanilla: `solid` +- ❌ NX: **MISSING** - Should add `nx-solid` +- ❌ Turborepo: **MISSING** - Should add `turbo-solid` + +#### 6. Svelte +- ✅ Vanilla: `svelte` +- ❌ NX: **MISSING** - Should add `nx-svelte` +- ❌ Turborepo: **MISSING** - Should add `turbo-svelte` + +### 📚 Advanced Patterns (Lower Priority) + +#### 7. React + Rollup +- ✅ Vanilla: `react-rollup-ts` +- ❌ NX: **MISSING** +- ❌ Turborepo: **MISSING** + +#### 8. React + Rolldown (Experimental) +- ✅ Vanilla: `rolldown-react` +- ❌ NX: **MISSING** +- ❌ Turborepo: **MISSING** + +--- + +## Proposed Standard Example Set + +Each directory should have these core examples: + +### Core Set (All Three Directories) + +#### React Examples +1. **react-vite-simple** - React + Vite + TypeScript (simple app) +2. **react-vite-mf** - React + Vite + Module Federation +3. **react-webpack-mf** - React + Webpack + Module Federation +4. **react-rspack-simple** - React + Rspack (simple app) +5. **react-rspack-mf** - React + Rspack + Module Federation + +#### Angular Examples +6. **angular-vite** - Angular + Vite +7. **angular-webpack-mf** - Angular + Webpack + Module Federation + +#### Other Frameworks +8. **solid-vite** - SolidJS + Vite +9. **svelte-vite** - Svelte + Vite + +### Extended Set (Vanilla Only) + +Keep these specialized examples in vanilla only: +- `qwik-1.5` - Qwik framework +- `ember-vite` - Ember framework +- `parcel-react` - Parcel bundler showcase +- `modernjs-app` - ModernJS framework +- `rolldown-react` - Rolldown bundler (experimental) +- `rspress-ssg` - Rspress SSG +- `vitepress` - VitePress documentation +- `basehref-examples` - Utility examples +- `plugin-testing` - Testing utilities + +--- + +## Migration Action Items + +### For NX Directory + +**Add:** +1. `nx-rspack-simple` - Simple React + Rspack without MF +2. `nx-solid-vite` - SolidJS example +3. `nx-svelte-vite` - Svelte example + +**Rename/Refactor:** +1. `create-nx-workspace-mf` → `nx-react-webpack-mf` (more consistent naming) +2. `create-nx-rspack-workspace-mf` → `nx-react-rspack-mf` (more consistent naming) +3. `react-vite-nx` → `nx-react-vite-simple` (more consistent naming) +4. `nx-ng` → `nx-angular-webpack` (more descriptive) + +### For Turborepo Directory + +**Add:** +1. `turbo-react-vite-simple` - React + Vite + TypeScript +2. `turbo-react-webpack-mf` - React + Webpack + Module Federation +3. `turbo-react-rspack-simple` - React + Rspack without MF +4. `turbo-angular-vite` - Angular + Vite +5. `turbo-solid-vite` - SolidJS example +6. `turbo-svelte-vite` - Svelte example + +**Rename/Refactor:** +1. `mf-turbo-rspack` → `turbo-react-rspack-mf` (more explicit about React) + +### For Vanilla Directory + +**Rename/Refactor for Consistency:** +1. `react-vite-ts` → `react-vite-simple` (align with other directories) +2. `create-default-webpack-mf` → `react-webpack-mf` (simpler naming) +3. `create-mf-app-rspack` → `react-rspack-mf` (simpler naming) +4. `rspack-project` → `react-rspack-simple` (more descriptive) +5. `react-vite-mf` → Keep as is (already well-named) +6. `angular-vite` → Keep as is (already well-named) +7. `ng-mf` → `angular-webpack-mf` (more descriptive) +8. `solid` → `solid-vite` (include bundler) +9. `svelte` → `svelte-vite` (include bundler) + +**Consider Removing/Archiving:** +- `react-tractor-sample` (redundant with other examples) +- `react-rspack-tractor-2.0` (redundant with other examples) +- `react-airbnb-clone` (nice demo but not core) + +--- + +## Naming Convention + +Going forward, use this naming pattern: + +### For Vanilla: +`{framework}-{bundler}-{feature}` + +Examples: +- `react-vite-simple` +- `react-webpack-mf` +- `angular-vite` + +### For NX: +`nx-{framework}-{bundler}-{feature}` + +Examples: +- `nx-react-vite-simple` +- `nx-react-webpack-mf` +- `nx-angular-vite` + +### For Turborepo: +`turbo-{framework}-{bundler}-{feature}` + +Examples: +- `turbo-react-vite-simple` +- `turbo-react-webpack-mf` +- `turbo-angular-vite` + +**Where:** +- `{framework}` = react, angular, solid, svelte, etc. +- `{bundler}` = vite, webpack, rspack, rollup, etc. +- `{feature}` = simple, mf (module federation), or specific feature + +--- + +## Summary + +**Current State:** +- Vanilla: 23 examples (comprehensive but inconsistent naming) +- NX: 4 examples (minimal coverage) +- Turborepo: 1 example (very minimal) + +**Standardized State Goal:** +- Vanilla: 9 core + specialized examples (~15-20 total) +- NX: 9 core examples (matching vanilla core set) +- Turborepo: 9 core examples (matching vanilla core set) + +**Benefits:** +- ✅ Consistent naming across all three directories +- ✅ Easy to compare same example across different monorepo tools +- ✅ Clear demonstration of each monorepo tool's strengths +- ✅ Reduced confusion for users +- ✅ Easier maintenance and testing diff --git a/Justfile b/Justfile new file mode 100644 index 00000000..095ead12 --- /dev/null +++ b/Justfile @@ -0,0 +1,182 @@ +# List all available commands +default: + @just --list + +# Install dependencies in all directories +install-all: + @echo "Installing vanilla dependencies..." + cd vanilla && pnpm install + @echo "Installing nx examples..." + cd nx/examples/mf-nx-rspack && pnpm install + @echo "Installing turborepo examples..." + cd turborepo/examples/mf-turbo-rspack && pnpm install + @echo "Installing scripts dependencies..." + cd scripts && pnpm install + @echo "✓ All dependencies installed" + +# Install dependencies in vanilla directory +install-vanilla: + cd vanilla && pnpm install + +# Install dependencies in nx examples +install-nx: + cd nx/examples/mf-nx-rspack && pnpm install + +# Install dependencies in turborepo examples +install-turborepo: + cd turborepo/examples/mf-turbo-rspack && pnpm install + +# Clean all node_modules in all directories +clean: + @echo "Cleaning vanilla..." + cd vanilla && pnpm remove-all-node-modules + @echo "Cleaning nx..." + cd nx && find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + + @echo "Cleaning turborepo..." + cd turborepo && find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + + @echo "✓ All node_modules removed" + +# Clean node_modules in vanilla directory +clean-vanilla: + cd vanilla && pnpm remove-all-node-modules + +# Clean node_modules in nx directory +clean-nx: + cd nx && find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + + +# Clean node_modules in turborepo directory +clean-turborepo: + cd turborepo && find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + + +# Clean all dist folders in all directories +clean-dist-all: + @echo "Cleaning vanilla dist..." + cd vanilla && pnpm remove-all-dist + @echo "Cleaning nx dist..." + cd nx && find . -name 'dist' -type d -prune -exec rm -rf '{}' + + @echo "Cleaning turborepo dist..." + cd turborepo && find . -name 'dist' -type d -prune -exec rm -rf '{}' + + @echo "✓ All dist folders removed" + +# Clean dist folders in vanilla directory +clean-dist-vanilla: + cd vanilla && pnpm remove-all-dist + +# Clean dist folders in nx directory +clean-dist-nx: + cd nx && find . -name 'dist' -type d -prune -exec rm -rf '{}' + + +# Clean dist folders in turborepo directory +clean-dist-turborepo: + cd turborepo && find . -name 'dist' -type d -prune -exec rm -rf '{}' + + +# Build a specific example in vanilla directory +build-vanilla example: + cd vanilla/examples/{{ example }} && pnpm build + +# Build a specific example in nx directory +build-nx example: + cd nx/examples/{{ example }} && pnpm build + +# Build a specific example in turborepo directory +build-turborepo example: + cd turborepo/examples/{{ example }} && pnpm build + +# Full reset - clean everything and reinstall +reset-all: clean clean-dist-all install-all + @echo "✓ Full reset complete" + +# Reset vanilla directory +reset-vanilla: clean-vanilla clean-dist-vanilla install-vanilla + @echo "✓ Vanilla reset complete" + +# Reset nx directory +reset-nx: clean-nx clean-dist-nx install-nx + @echo "✓ NX reset complete" + +# Reset turborepo directory +reset-turborepo: clean-turborepo clean-dist-turborepo install-turborepo + @echo "✓ Turborepo reset complete" + +# Build all vanilla examples in every environment +build-all-vanilla: + #!/usr/bin/env bash + set -euo pipefail + + echo "Building all vanilla examples..." + cd vanilla/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "✓ All vanilla examples built successfully" + +# Build all nx examples in every environment +build-all-nx: + #!/usr/bin/env bash + set -euo pipefail + + echo "Building all nx examples..." + cd nx/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "✓ All nx examples built successfully" + +# Build all turborepo examples in every environment +build-all-turborepo: + #!/usr/bin/env bash + set -euo pipefail + + echo "Building all turborepo examples..." + cd turborepo/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "✓ All turborepo examples built successfully" + +# Build all examples in every environment +build-all: + #!/usr/bin/env bash + set -euo pipefail + + echo "Building all vanilla examples..." + cd vanilla/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "Building all nx examples..." + cd nx/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "Building all turborepo examples..." + cd turborepo/examples + for d in */; do + [ -d "$d" ] || continue + echo "→ Building $d" + (cd "$d" && pnpm build) + done + cd ../.. + + echo "✓ All examples built successfully" + diff --git a/README.md b/README.md index a7a89d7f..776620e9 100644 --- a/README.md +++ b/README.md @@ -6,91 +6,131 @@ A selection of bundlers, frameworks, and patterns are used. Each example project comes with Zephyr Cloud enabled. Once you've forked this repository, you can clone it and follow the instructions to [build and deploy](#deploying-an-example-project) to your Zephyr Cloud account. -* __[`angular-vite`](./examples/angular-vite)__ - A React application with Module Federation, using Rspack as the bundler. -* __[`create-default-webpack-mf`](./examples/create-default-webpack-mf)__ - A React application with Module Federation, using Rspack as the bundler. -* __[`create-mf-app-rspack`](./examples/create-mf-app-rspack)__ - A React application using Rspack as the bundler. -* __[`create-nx-rspack-workpace-mf`](./examples/create-nx-rspack-workpace-mf)__ - A monorepo using Nx, React, Module Federation, and Rspack as the bundler. -* __[`create-nx-workspace-mf`](./examples/create-nx-workspace-mf)__ - A monorepo using Nx, React, Module Federation, and Webpack as the bundler. -* __[`modernjs-app`](./examples/modernjs-app)__ - A ModernJS app with React and Rspack as the bundler. -* __[`ng-nx`](./examples/ng-nx)__ - A monorepo using Nx, Angular v15, and Webpack as the bundler. -* __[`parce-react`](./examples/parcel-react)__ - A parcel and react application. -* __[`react-airbnb-clone`](./examples/react-airbnb-clone)__ - An AirBnb clone using React, Module Federation and Rspack as the bundler. -* __[`react-rollup-ts`](./examples/react-rollup-ts)__ - A React and rollup application. -* __[`react-rspack-tractor-2.0`](./examples/react-rspack-tractor-2.0)__ - A monorepo using pnpm workspace, React, and Rspack as the bundler. -* __[`react-tractor-sample`](./examples/react-tractor-sample)__ - A monorepo using Nx, React, and Webpack as the bundler. -* __[`react-vite-mf`](./examples/react-vite-mf)__ - A monorepo using pnpm workspace, Module Federation, React, and Vite as the bundler. -* __[`react-vite-nx`](./examples/react-vite-nx)__ - A monorepo using Nx, React, and Vite as the bundler. -* __[`react-vite-ts`](./examples/react-vite-ts)__ - A React application built in TypeScript, using Vite as the bundler. -* __[`rolldown-react`](./examples/rolldown-react)__ - A React app with Rolldown as the bundler. -* __[`rspack-project`](./examples/rspack-project)__ - A simple Rspack application using React. -* __[`solid`](./examples/solid)__ - An application using SolidJS. -* __[`turbo-rspack-mf`](./examples/turbo-rspack-mf/)__ - A monorepo using Turborepo, React, and Rspack as the bundler. - -## Deploying an example project -After cloning your fork of this repository locally, follow these steps: - -1. __Install dependencies__ - ```shell - pnpm i - ``` -2. __Change directory to the example codebase__ - For example, if you want to run the `create-default-webpack-mf` example: - - ```shell - cd ./examples/create-default-webpack-mf - ``` -3. __Build the project__ - ```shell - pnpm build - ``` +## Repository Structure + +This repository is organized into three independent directories, each with its own build system: + +### 📁 `/vanilla` - pnpm Workspaces +Simple examples without any monorepo build system. Uses pnpm workspaces for dependency management. + +**Examples:** +- `angular-vite` - Angular application with Vite +- `basehref-examples` - Base href examples +- `create-default-webpack-mf` - React with Module Federation and Webpack +- `create-mf-app-rspack` - React with Rspack +- `ember-vite` - Ember with Vite +- `modernjs-app` - ModernJS app with React and Rspack +- `ng-mf` - Angular with Module Federation +- `parcel-react` - Parcel and React application +- `plugin-testing` - Plugin testing examples +- `qwik-1.5` - Qwik application +- `react-airbnb-clone` - AirBnb clone with React, Module Federation and Rspack +- `react-rollup-ts` - React with Rollup +- `react-rspack-tractor-2.0` - React with Rspack +- `react-tractor-sample` - React with Webpack +- `react-vite-mf` - React with Vite and Module Federation +- `react-vite-ts` - React with TypeScript and Vite +- `rolldown-react` - React with Rolldown +- `rspack-project` - Simple Rspack with React +- `rspress-ssg` - Rspress SSG +- `solid` - SolidJS application +- `svelte` - Svelte application +- `tsdown` - TypeScript bundler example +- `vitepress` - VitePress documentation + +### 📁 `/nx` - NX Monorepo +Examples built with NX monorepo system. + +**Examples:** +- `create-nx-workspace-mf` - NX with React, Module Federation, and Webpack +- `create-nx-rspack-workspace-mf` - NX with React, Module Federation, and Rspack +- `react-vite-nx` - NX with React and Vite +- `nx-ng` - NX with Angular v15 and Webpack + +### 📁 `/turborepo` - Turborepo +Examples built with Turborepo monorepo system. + +**Examples:** +- `mf-turbo-rspack` - Turborepo with React and Rspack + +## Working with Examples + +Each directory (`vanilla`, `nx`, `turborepo`) is **completely independent** and has its own: +- `package.json` - Dependency management +- `pnpm-workspace.yaml` - Workspace configuration with shared catalogs +- `examples/` - Example projects + +### Using Just (Recommended) + +This repository includes a `Justfile` for convenient management. Install [just](https://github.com/casey/just) and run: + +```shell +# See all available commands +just + +# Install dependencies in all directories +just install-all + +# Install in a specific directory +just install-vanilla +just install-nx +just install-turborepo + +# Build a specific example +just build-vanilla react-vite-ts +just build-nx create-nx-workspace-mf +just build-turborepo mf-turbo-rspack + +# List all examples +just list-all + +# Clean everything +just clean-all + +# Full reset (clean + reinstall) +just reset-all +``` + +### Getting Started with a Specific Directory + +1. **Navigate to the directory you want to work with:** + ```shell + cd vanilla # or cd nx, or cd turborepo + ``` + +2. **Install dependencies:** + ```shell + pnpm install + ``` + +3. **Navigate to an example:** + ```shell + cd examples/react-vite-ts # or any other example + ``` + +4. **Build the project:** + ```shell + pnpm build + ``` After you build the project, it will be deployed to your Zephyr Cloud account. -For more information on using Zephyr Cloud, visit the [official documentation][documentation]. -[documentation]: https://docs.zephyr-cloud.io +## Important Notes + +- **No root-level dependencies**: The root of this repository has no `package.json`, `pnpm-workspace.yaml`, or build system. Each directory is completely self-contained. +- **Independent workspaces**: Each directory (`vanilla`, `nx`, `turborepo`) can be worked on independently without affecting the others. +- **Shared catalogs**: Each directory maintains its own pnpm catalog for consistent dependency versions across its examples. + +## Documentation + +For more information on using Zephyr Cloud, visit the [official documentation](https://docs.zephyr-cloud.io). ## Contributors +  -## TODO: +## TODO + - [ ] Remove `@rspack/plugin-minify` in favor of `terser-webpack-plugin` - [x] Move to consistent build command - [ ] Create testing matrix that can run with every canary of plugins - -## Status -:white_check_mark: `angular-vite` -:white_check_mark: `create-default-webpack-mf` -:white_check_mark: `create-mf-app-rspack` -:white_check_mark: `create-nx-rspack-workspace-mf` -:white_check_mark: `create-nx-workspace-mf` -:white_check_mark: `nx-ng` -:white_check_mark: `react-airbnb-clone` -:white_check_mark: `react-rollup-ts` -:white_check_mark: `react-rspack-tractor-2.0` -:white_check_mark: `react-tractor-sample` -:white_check_mark: `react-vite-mf` -:x: `react-vite-nx` - @nx/vite plugin dependency issue -:white_check_mark: `react-vite-ts` -:white_check_mark: `rspack-project` -:white_check_mark: `solid` -:white_check_mark: `svelte` -:white_check_mark: `turbo-rspack-mf` diff --git a/examples/angular-vite/package.json b/examples/angular-vite/package.json deleted file mode 100644 index b4ac867d..00000000 --- a/examples/angular-vite/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "angular-vite-zephyr-template", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "@angular/animations": "catalog:angular19", - "@angular/common": "catalog:angular19", - "@angular/compiler": "catalog:angular19", - "@angular/core": "catalog:angular19", - "@angular/platform-browser": "catalog:angular19", - "@angular/platform-browser-dynamic": "catalog:angular19", - "@angular/router": "catalog:angular19", - "rxjs": "catalog:angular19", - "tslib": "catalog:typescript", - "vite-plugin-zephyr": "catalog:zephyr", - "zone.js": "catalog:angular19" - }, - "devDependencies": { - "@analogjs/vite-plugin-angular": "catalog:angular19", - "@angular/build": "catalog:angular19", - "@angular/compiler-cli": "catalog:angular19", - "typescript": "catalog:typescript", - "vite": "catalog:vite6" - } -} diff --git a/examples/basehref-examples/README.md b/examples/basehref-examples/README.md deleted file mode 100644 index 531b9266..00000000 --- a/examples/basehref-examples/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# BaseHref Examples - -This directory contains example applications demonstrating the BaseHref functionality implemented in the Zephyr packages project. These examples show how to properly handle base paths for different deployment scenarios across various bundlers. - -## Examples - -### Vite Example - -A React application built with Vite, demonstrating: - -- Base path detection and configuration -- HTML base tag injection -- URL construction with proper base path handling -- Runtime base path usage via virtual module -- Support for deploying to non-root paths - -[View Vite Example](./vite-app) - -### Webpack Example - -A React application built with Webpack, demonstrating: - -- Public path detection and configuration -- HTML base tag injection -- URL construction with proper base path handling -- Runtime base path usage via global variable -- Manifest file generation with path information -- Support for deploying to non-root paths - -[View Webpack Example](./webpack-app) - -## Functionality Overview - -The BaseHref implementation provides a consistent way to handle application paths across different bundlers and deployment scenarios. It ensures proper path resolution for applications deployed to non-root paths or using CDNs. - -### Key Features - -1. **Path Normalization**: Consistent handling of paths across different formats (relative, absolute, URLs) -2. **Bundler Integration**: Support for Vite, Webpack, and Rspack configurations -3. **URL Construction**: Intelligent URL building with base path consideration -4. **Runtime Detection**: Client-side detection of base paths -5. **HTML Generation**: Proper HTML base tag handling - -## Usage - -Each example includes detailed instructions on how to: - -1. Install dependencies -2. Run the application with different base paths -3. Build the application for production -4. Test the built application - -## Deployment Considerations - -When deploying applications to non-root paths (e.g., `/app/` instead of `/`), proper base path handling is critical for: - -- Loading JavaScript and CSS files -- Resolving image and asset URLs -- Making API requests -- Client-side navigation -- Deep linking to routes - -These examples demonstrate best practices for handling these scenarios across different bundlers. diff --git a/examples/basehref-examples/package.json b/examples/basehref-examples/package.json deleted file mode 100644 index 0bcbcf17..00000000 --- a/examples/basehref-examples/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "basehref-examples", - "version": "1.0.0", - "description": "Examples demonstrating base href configuration with different bundlers", - "private": true, - "scripts": { - "build": "pnpm --filter basehref-rspack-app build && pnpm --filter basehref-vite-app build && pnpm --filter basehref-webpack-app build", - "build:rspack": "pnpm --filter basehref-rspack-app build", - "build:vite": "pnpm --filter basehref-vite-app build", - "build:webpack": "pnpm --filter basehref-webpack-app build", - "build:base": "pnpm --filter basehref-rspack-app build:base && pnpm --filter basehref-vite-app build:base && pnpm --filter basehref-webpack-app build:base", - "build:base:rspack": "pnpm --filter basehref-rspack-app build:base", - "build:base:vite": "pnpm --filter basehref-vite-app build:base", - "build:base:webpack": "pnpm --filter basehref-webpack-app build:base" - }, - "keywords": [ - "basehref", - "rspack", - "vite", - "webpack", - "react", - "zephyr" - ], - "repository": { - "type": "git", - "url": "https://github.com/zephyrcloud/zephyr-examples", - "directory": "examples/basehref-examples" - } -} \ No newline at end of file diff --git a/examples/basehref-examples/rspack-app/README.md b/examples/basehref-examples/rspack-app/README.md deleted file mode 100644 index 992a24e9..00000000 --- a/examples/basehref-examples/rspack-app/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Rspack project - -## Setup - -Install the dependencies: - -```bash -npm install -``` - -## Get started - -Start the dev server: - -```bash -npm run dev -``` - -Build the app for production: - -```bash -npm run build -``` diff --git a/examples/basehref-examples/rspack-app/index.html b/examples/basehref-examples/rspack-app/index.html deleted file mode 100644 index db87cea9..00000000 --- a/examples/basehref-examples/rspack-app/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
- - - -
- Edit src/App.tsx and save to test HMR
-
- Click on the Rspack and React logos to learn more -
-Configured Base: {baseHref.baseHref}
*/} -- Detected Base:{' '} - {detectedBase} -
-- Current URL:{' '} - {currentUrl} -
-{imagePaths.relative}
-- Resolves to:{' '} - - {new URL(imagePaths.relative, window.location.href).href} - -
-{imagePaths.absolute}
-- Resolves to:{' '} - - {new URL(imagePaths.absolute, window.location.origin).href} - -
-- new URL('assets/logo.png', baseHref.baseHref) -
- {/*Resolves to: {imagePaths.baseHref}
*/} -- You can activate distributed tasks executions and caching by - running: -
-nx connect-to-nx-cloud- - What is Nx Cloud? - -
Here are some things you can do with Nx:
-# Generate UI lib -nx g @nx/angular:lib ui -# Add a component -nx g @nx/angular:component button --project ui-
nx graph-
# see what's been affected by changes -nx affected:graph -# run tests for current changes -nx affected:test -# run e2e tests for current changes -nx affected:e2e-
- Carefully crafted with - -
-
- ))}
-
- ))}
- Test
+ + +``` +```` + +### Output + +```html + + + + +Test
+ + +``` + +## List Types + +### Ordered List + +#### Syntax + +```markdown +1. First item +2. Second item +3. Third item +``` + +#### Output + +1. First item +2. Second item +3. Third item + +### Unordered List + +#### Syntax + +```markdown +- List item +- Another item +- And another item +``` + +#### Output + +- List item +- Another item +- And another item + +### Nested list + +#### Syntax + +```markdown +- Fruit + - Apple + - Orange + - Banana +- Dairy + - Milk + - Cheese +``` + +#### Output + +- Fruit + - Apple + - Orange + - Banana +- Dairy + - Milk + - Cheese + +## Other Elements — abbr, sub, sup, kbd, mark + +### Syntax + +```markdown +GIF is a bitmap image format. + +H2O + +Xn + Yn = Zn + +Press CTRL + ALT + Delete to end the session. + +Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures. +``` + +### Output + +GIF is a bitmap image format. + +H2O + +Xn + Yn = Zn + +Press CTRL + ALT + Delete to end the session. + +Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures. diff --git a/vanilla/examples/astro/src/content/blog/second-post.md b/vanilla/examples/astro/src/content/blog/second-post.md new file mode 100644 index 00000000..79337d41 --- /dev/null +++ b/vanilla/examples/astro/src/content/blog/second-post.md @@ -0,0 +1,16 @@ +--- +title: 'Second post' +description: 'Lorem ipsum dolor sit amet' +pubDate: 'Jul 15 2022' +heroImage: '../../assets/blog-placeholder-4.jpg' +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Adipiscing enim eu turpis egestas pretium. Euismod elementum nisi quis eleifend quam adipiscing. In hac habitasse platea dictumst vestibulum. Sagittis purus sit amet volutpat. Netus et malesuada fames ac turpis egestas. Eget magna fermentum iaculis eu non diam phasellus vestibulum lorem. Varius sit amet mattis vulputate enim. Habitasse platea dictumst quisque sagittis. Integer quis auctor elit sed vulputate mi. Dictumst quisque sagittis purus sit amet. + +Morbi tristique senectus et netus. Id semper risus in hendrerit gravida rutrum quisque non tellus. Habitasse platea dictumst quisque sagittis purus sit amet. Tellus molestie nunc non blandit massa. Cursus vitae congue mauris rhoncus. Accumsan tortor posuere ac ut. Fringilla urna porttitor rhoncus dolor. Elit ullamcorper dignissim cras tincidunt lobortis. In cursus turpis massa tincidunt dui ut ornare lectus. Integer feugiat scelerisque varius morbi enim nunc. Bibendum neque egestas congue quisque egestas diam. Cras ornare arcu dui vivamus arcu felis bibendum. Dignissim suspendisse in est ante in nibh mauris. Sed tempus urna et pharetra pharetra massa massa ultricies mi. + +Mollis nunc sed id semper risus in. Convallis a cras semper auctor neque. Diam sit amet nisl suscipit. Lacus viverra vitae congue eu consequat ac felis donec. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Eget magna fermentum iaculis eu non diam. In vitae turpis massa sed elementum. Tristique et egestas quis ipsum suspendisse ultrices. Eget lorem dolor sed viverra ipsum. Vel turpis nunc eget lorem dolor sed viverra. Posuere ac ut consequat semper viverra nam. Laoreet suspendisse interdum consectetur libero id faucibus. Diam phasellus vestibulum lorem sed risus ultricies tristique. Rhoncus dolor purus non enim praesent elementum facilisis. Ultrices tincidunt arcu non sodales neque. Tempus egestas sed sed risus pretium quam vulputate. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Fringilla urna porttitor rhoncus dolor purus non. Amet dictum sit amet justo donec enim. + +Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Tortor posuere ac ut consequat semper viverra. Tellus mauris a diam maecenas sed enim ut sem viverra. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Arcu ac tortor dignissim convallis aenean et tortor at. Curabitur gravida arcu ac tortor dignissim convallis aenean et tortor. Egestas tellus rutrum tellus pellentesque eu. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam. Id donec ultrices tincidunt arcu. Id cursus metus aliquam eleifend mi. + +Tempus quam pellentesque nec nam aliquam sem. Risus at ultrices mi tempus imperdiet. Id porta nibh venenatis cras sed felis eget velit. Ipsum a arcu cursus vitae. Facilisis magna etiam tempor orci eu lobortis elementum. Tincidunt dui ut ornare lectus sit. Quisque non tellus orci ac. Blandit libero volutpat sed cras. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Egestas integer eget aliquet nibh praesent tristique magna. diff --git a/vanilla/examples/astro/src/content/blog/third-post.md b/vanilla/examples/astro/src/content/blog/third-post.md new file mode 100644 index 00000000..b871fa15 --- /dev/null +++ b/vanilla/examples/astro/src/content/blog/third-post.md @@ -0,0 +1,16 @@ +--- +title: 'Third post' +description: 'Lorem ipsum dolor sit amet' +pubDate: 'Jul 22 2022' +heroImage: '../../assets/blog-placeholder-2.jpg' +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Adipiscing enim eu turpis egestas pretium. Euismod elementum nisi quis eleifend quam adipiscing. In hac habitasse platea dictumst vestibulum. Sagittis purus sit amet volutpat. Netus et malesuada fames ac turpis egestas. Eget magna fermentum iaculis eu non diam phasellus vestibulum lorem. Varius sit amet mattis vulputate enim. Habitasse platea dictumst quisque sagittis. Integer quis auctor elit sed vulputate mi. Dictumst quisque sagittis purus sit amet. + +Morbi tristique senectus et netus. Id semper risus in hendrerit gravida rutrum quisque non tellus. Habitasse platea dictumst quisque sagittis purus sit amet. Tellus molestie nunc non blandit massa. Cursus vitae congue mauris rhoncus. Accumsan tortor posuere ac ut. Fringilla urna porttitor rhoncus dolor. Elit ullamcorper dignissim cras tincidunt lobortis. In cursus turpis massa tincidunt dui ut ornare lectus. Integer feugiat scelerisque varius morbi enim nunc. Bibendum neque egestas congue quisque egestas diam. Cras ornare arcu dui vivamus arcu felis bibendum. Dignissim suspendisse in est ante in nibh mauris. Sed tempus urna et pharetra pharetra massa massa ultricies mi. + +Mollis nunc sed id semper risus in. Convallis a cras semper auctor neque. Diam sit amet nisl suscipit. Lacus viverra vitae congue eu consequat ac felis donec. Egestas integer eget aliquet nibh praesent tristique magna sit amet. Eget magna fermentum iaculis eu non diam. In vitae turpis massa sed elementum. Tristique et egestas quis ipsum suspendisse ultrices. Eget lorem dolor sed viverra ipsum. Vel turpis nunc eget lorem dolor sed viverra. Posuere ac ut consequat semper viverra nam. Laoreet suspendisse interdum consectetur libero id faucibus. Diam phasellus vestibulum lorem sed risus ultricies tristique. Rhoncus dolor purus non enim praesent elementum facilisis. Ultrices tincidunt arcu non sodales neque. Tempus egestas sed sed risus pretium quam vulputate. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Fringilla urna porttitor rhoncus dolor purus non. Amet dictum sit amet justo donec enim. + +Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Tortor posuere ac ut consequat semper viverra. Tellus mauris a diam maecenas sed enim ut sem viverra. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Arcu ac tortor dignissim convallis aenean et tortor at. Curabitur gravida arcu ac tortor dignissim convallis aenean et tortor. Egestas tellus rutrum tellus pellentesque eu. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam. Id donec ultrices tincidunt arcu. Id cursus metus aliquam eleifend mi. + +Tempus quam pellentesque nec nam aliquam sem. Risus at ultrices mi tempus imperdiet. Id porta nibh venenatis cras sed felis eget velit. Ipsum a arcu cursus vitae. Facilisis magna etiam tempor orci eu lobortis elementum. Tincidunt dui ut ornare lectus sit. Quisque non tellus orci ac. Blandit libero volutpat sed cras. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Egestas integer eget aliquet nibh praesent tristique magna. diff --git a/vanilla/examples/astro/src/content/blog/using-mdx.mdx b/vanilla/examples/astro/src/content/blog/using-mdx.mdx new file mode 100644 index 00000000..bd8856e2 --- /dev/null +++ b/vanilla/examples/astro/src/content/blog/using-mdx.mdx @@ -0,0 +1,31 @@ +--- +title: 'Using MDX' +description: 'Lorem ipsum dolor sit amet' +pubDate: 'Jun 01 2024' +heroImage: '../../assets/blog-placeholder-5.jpg' +--- + +This theme comes with the [@astrojs/mdx](https://docs.astro.build/en/guides/integrations-guide/mdx/) integration installed and configured in your `astro.config.mjs` config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file. + +## Why MDX? + +MDX is a special flavor of Markdown that supports embedded JavaScript & JSX syntax. This unlocks the ability to [mix JavaScript and UI Components into your Markdown content](https://docs.astro.build/en/guides/markdown-content/#mdx-features) for things like interactive charts or alerts. + +If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze. + +## Example + +Here is how you import and use a UI component inside of MDX. +When you open this page in the browser, you should see the clickable button below. + +import HeaderLink from '../../components/HeaderLink.astro'; + ++ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Vitae ultricies leo integer malesuada nunc vel risus commodo + viverra. Adipiscing enim eu turpis egestas pretium. Euismod elementum nisi quis eleifend quam + adipiscing. In hac habitasse platea dictumst vestibulum. Sagittis purus sit amet volutpat. Netus + et malesuada fames ac turpis egestas. Eget magna fermentum iaculis eu non diam phasellus + vestibulum lorem. Varius sit amet mattis vulputate enim. Habitasse platea dictumst quisque + sagittis. Integer quis auctor elit sed vulputate mi. Dictumst quisque sagittis purus sit amet. +
+ ++ Morbi tristique senectus et netus. Id semper risus in hendrerit gravida rutrum quisque non + tellus. Habitasse platea dictumst quisque sagittis purus sit amet. Tellus molestie nunc non + blandit massa. Cursus vitae congue mauris rhoncus. Accumsan tortor posuere ac ut. Fringilla urna + porttitor rhoncus dolor. Elit ullamcorper dignissim cras tincidunt lobortis. In cursus turpis + massa tincidunt dui ut ornare lectus. Integer feugiat scelerisque varius morbi enim nunc. + Bibendum neque egestas congue quisque egestas diam. Cras ornare arcu dui vivamus arcu felis + bibendum. Dignissim suspendisse in est ante in nibh mauris. Sed tempus urna et pharetra pharetra + massa massa ultricies mi. +
+ ++ Mollis nunc sed id semper risus in. Convallis a cras semper auctor neque. Diam sit amet nisl + suscipit. Lacus viverra vitae congue eu consequat ac felis donec. Egestas integer eget aliquet + nibh praesent tristique magna sit amet. Eget magna fermentum iaculis eu non diam. In vitae + turpis massa sed elementum. Tristique et egestas quis ipsum suspendisse ultrices. Eget lorem + dolor sed viverra ipsum. Vel turpis nunc eget lorem dolor sed viverra. Posuere ac ut consequat + semper viverra nam. Laoreet suspendisse interdum consectetur libero id faucibus. Diam phasellus + vestibulum lorem sed risus ultricies tristique. Rhoncus dolor purus non enim praesent elementum + facilisis. Ultrices tincidunt arcu non sodales neque. Tempus egestas sed sed risus pretium quam + vulputate. Viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare. Fringilla + urna porttitor rhoncus dolor purus non. Amet dictum sit amet justo donec enim. +
+ ++ Mattis ullamcorper velit sed ullamcorper morbi tincidunt. Tortor posuere ac ut consequat semper + viverra. Tellus mauris a diam maecenas sed enim ut sem viverra. Venenatis urna cursus eget nunc + scelerisque viverra mauris in. Arcu ac tortor dignissim convallis aenean et tortor at. Curabitur + gravida arcu ac tortor dignissim convallis aenean et tortor. Egestas tellus rutrum tellus + pellentesque eu. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. Ut enim + blandit volutpat maecenas volutpat blandit aliquam etiam. Id donec ultrices tincidunt arcu. Id + cursus metus aliquam eleifend mi. +
+ ++ Tempus quam pellentesque nec nam aliquam sem. Risus at ultrices mi tempus imperdiet. Id porta + nibh venenatis cras sed felis eget velit. Ipsum a arcu cursus vitae. Facilisis magna etiam + tempor orci eu lobortis elementum. Tincidunt dui ut ornare lectus sit. Quisque non tellus orci + ac. Blandit libero volutpat sed cras. Nec tincidunt praesent semper feugiat nibh sed pulvinar + proin gravida. Egestas integer eget aliquet nibh praesent tristique magna. +
+
+
+ Welcome to the official Astro blog starter template. This + template serves as a lightweight, minimally-styled starting point for anyone looking to build + a personal website, blog, or portfolio with Astro. +
+
+ This template comes with a few integrations already configured in your
+ astro.config.mjs file. You can customize your setup with
+ Astro Integrations to add tools like Tailwind,
+ React, or Vue to your project.
+
Here are a few ideas on how to get started with the template:
+src/pages/index.astrosrc/components/Header.astrosrc/components/Footer.astrosrc/content/blog/src/layouts/BlogPost.astro+ Have fun! If you get stuck, remember to + read the docs + or join us on Discord to ask questions. +
++ Looking for a blog template with a bit more personality? Check out + astro-blog-template + by Maxi Ferreira. +
+Start building amazing things with Rsbuild.
+
diff --git a/examples/react-vite-mf/remote/src/assets/react.svg b/vanilla/examples/rspack-react/src/assets/react.svg
similarity index 100%
rename from examples/react-vite-mf/remote/src/assets/react.svg
rename to vanilla/examples/rspack-react/src/assets/react.svg
diff --git a/examples/basehref-examples/rspack-app/src/index.css b/vanilla/examples/rspack-react/src/index.css
similarity index 100%
rename from examples/basehref-examples/rspack-app/src/index.css
rename to vanilla/examples/rspack-react/src/index.css
diff --git a/vanilla/examples/rspack-react/src/main.tsx b/vanilla/examples/rspack-react/src/main.tsx
new file mode 100644
index 00000000..29baf78c
--- /dev/null
+++ b/vanilla/examples/rspack-react/src/main.tsx
@@ -0,0 +1,10 @@
+import React from "react";
+import ReactDOM from "react-dom/client";
+import App from "./App.tsx";
+import "./index.css";
+
+ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
+ This example demonstrates Ember.js with Vite and Zephyr Cloud.Welcome to Ember + Vite
+