This document explains what gets committed to git when syncing from upstream pie-elements.
Audience: This guide is for maintainers who sync from upstream. Regular developers don't need to run upstream:sync - synced packages are already committed to git, so just git pull to get updates.
For each element/library package, we commit:
src/- Source files (transformed from upstream).js→.tsconversions.jsx→.tsxconversions- Import path rewrites (lodash → lodash-es, etc.)
package.json- Generated ESM-compatible package.jsonvite.config.ts- Generated build configurationvite.config.iife.ts- IIFE build config (if needed)tsconfig.json- TypeScript configurationdocs/demo/- Demo configuration files (config.mjs, session.mjs)
dist/- Build outputs (gitignored globally)node_modules/- Dependencies (gitignored globally).turbo/- Turbo cache (gitignored globally)
These are regenerated automatically on every upstream:sync and should NOT be committed:
-
apps/element-demo/src/lib/element-imports.ts- Maps element names to import paths
- Uses absolute
/@fs/paths specific to your machine - Regenerated by predev script
-
apps/element-demo/src/lib/elements/registry.ts- Element metadata registry
- Contains timestamp that changes on every sync
- Regenerated from scanning
packages/elements-react/
-
apps/element-demo/src/lib/data/sample-configs/react/- Sample config/session JSON files
- Copied from each element's
docs/demo/directory - Redundant since source configs are already committed in element packages
- Timestamps cause spurious diffs -
registry.tshas a generation timestamp - Redundant data - Sample configs are duplicated from element packages
- Machine-specific paths -
element-imports.tsuses absolute file paths - Regenerated automatically - These files are rebuilt on demand
Demo app generated files are automatically created when needed:
During upstream:sync:
bun cli upstream:sync- Generates
registry.tsfrom scanningpackages/elements-react/ - Copies configs from
packages/elements-react/*/docs/demo/→sample-configs/react/
When starting the demo app:
cd apps/element-demo
bun run dev # Runs "predev" script first- The
predevscript runsbun run generate-imports - This generates
element-imports.tswith absolute/@fs/paths for Vite - Also regenerates
registry.tsandsample-configs/if needed
Result: New developers don't need these files in git. Running the demo app generates them automatically from the committed element packages.
Before committing an upstream sync, verify you're not committing build artifacts:
# After running upstream:sync, check what changed
git status
# Should see:
# - packages/elements-react/*/src/
# - packages/elements-react/*/package.json
# - packages/lib-react/*/src/
# - packages/lib-react/*/package.json
# Should NOT see:
# - packages/elements-react/*/dist/
# - packages/elements-react/*/node_modules/
# - apps/element-demo/src/lib/element-imports.ts
# - apps/element-demo/src/lib/elements/registry.ts
# - apps/element-demo/src/lib/data/sample-configs/
# Add only the synced packages
git add packages/elements-react packages/lib-react
# Verify what will be committed
git diff --cached --stat
# Commit
git commit -m "sync: update from upstream pie-elements"These files are deterministic (no timestamps) and serve important purposes:
- Bootstrap requirement - Workspace resolution needs
package.jsonto exist - Deterministic generation - Same upstream produces same output
- Review-friendly - Can see what changed in dependencies/exports
- Self-documenting - Shows the ESM transformation applied
Committing synced packages adds approximately:
- ~1000 source files (
.ts,.tsx) - ~28 package.json files (one per element)
- ~28 vite.config.ts files
- Total: ~5-10 MB (source only, excluding build artifacts)
This is acceptable since:
- Build artifacts (
dist/,node_modules/) are gitignored - Files are actual source code, not generated binaries
- Solves the bootstrap chicken-and-egg problem for new developers