Compare commits

...

10 Commits

Author SHA1 Message Date
Jon Leopard
07b2e8347c docs: add comprehensive guide for keeping feature branches up-to-date
Added new section "Keeping Your Feature Branch Up-to-Date" covering:
- Daily start-of-work routine for syncing with develop
- Merge vs rebase best practices for teams
- Step-by-step conflict resolution guide
- When and how to ask for help with complex conflicts
- Real-world example of multi-day feature work

This addresses common questions from contributors about branch
management and helps prevent large merge conflicts by encouraging
regular syncing with develop.
2025-11-06 15:00:46 -07:00
Jon Leopard
b12cf9621f chore: stop tracking .claude/settings.local.json 2025-11-06 10:40:50 -07:00
Jon Leopard
51bd29b86d Merge branch 'origin/develop' into develop
Brings in product page migration and Nexus design system upgrade:
- Product edit page with 40+ new fields (inventory, packaging, compliance)
- Product lines and image management
- Nexus HTML→Laravel conversion with Blade templates
- FileStorageHelper trait for MinIO compatibility
- Resolved conflicts in .gitignore and .claude/settings.local.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 10:40:38 -07:00
Jon Leopard
fb38e0f8fa chore: ignore .worktrees directory 2025-11-06 10:39:06 -07:00
Jon Leopard
a48c634767 fix: only mount .vite cache directory, not entire node_modules
Mounting entire node_modules as PVC prevented npm install from working.
Now only mounting node_modules/.vite for persistent cache while allowing
node_modules to be installed normally from volume-mounted code.
2025-11-05 15:29:53 -07:00
Jon Leopard
4ec66cedd9 perf: optimize Vite performance with persistent cache and pre-bundling
Implement Phase 1 optimizations to improve containerized Vite performance for both k8s and Sail environments.

**Changes:**

1. **Persistent Volume Claims for Vite Cache**
   - Add k8s/local/vite-cache-pvc.yaml for persistent storage
   - Mount node_modules/.vite and node_modules on persistent volumes
   - Eliminates re-bundling dependencies on pod restart
   - Expected: 30s → 5-10s first load

2. **Vite Config Optimizations**
   - Add optimizeDeps with all project dependencies pre-bundled
   - Enable holdUntilCrawled for better discovery
   - Add warmup for frequently used files (app.js, app.css)
   - Add watch.usePolling option for container environments
   - Configurable via VITE_USE_POLLING env var

3. **Makefile Enhancements**
   - Deploy PVCs automatically in k-dev
   - Enable polling in k-vite (VITE_USE_POLLING=true)
   - Add k-cache-clear target for manual cache invalidation
   - Update messaging to reflect persistent cache usage

**Testing:**
These optimizations apply to both k8s (make k-vite) and Sail (make dev-vite) as they share vite.config.js.

**Expected Performance:**
- k8s first load: 30s → 5-10s
- k8s rebuilds: 3-5s → 1-3s
- Sail: Similar improvements

Host Vite (make k-dev-vite) remains fastest option (~150ms).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 14:55:54 -07:00
Jon Leopard
69f0164bc8 feat: add k8s worktree development with per-namespace Vite isolation
Implement Kubernetes-based local development environment that enables isolated namespaces per git worktree/branch. Each worktree gets its own k8s resources (PostgreSQL, Redis, Reverb) and unique Vite dev server port for parallel development.

**Key Features:**
- K8s namespace per worktree/branch with isolated databases
- Unique Vite port assignment per namespace (5173-5200 range)
- Host Vite for fast HMR (~150ms vs 30s in containers)
- Traefik ingress with per-branch domains
- Volume-mounted code for instant changes

**Changes:**
- Makefile: Add k-dev, k-dev-vite, k-down targets with port calculation
- k8s/local/deployment.yaml: Skip npm run build for faster startup
- k8s/local/ingress.yaml: Use Traefik instead of nginx
- vite.config.js: Support dynamic port assignment via VITE_PORT env var

**Workflow:**
```bash
# Terminal 1: Start k8s (develop namespace)
make k-dev

# Terminal 2: Start Vite on host (port 5179 for develop)
make k-dev-vite

# Access: http://develop.cannabrands.test
```

Multiple worktrees can run simultaneously, each with unique ports determined by namespace hash. This provides production-like isolation with developer-friendly performance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 13:38:43 -07:00
Jon Leopard
d7e49e0be3 Merge branch 'develop' of code.cannabrands.app:Cannabrands/hub into develop 2025-11-04 17:37:54 -07:00
Jon Leopard
535e320e2f Merge branch 'develop' of code.cannabrands.app:Cannabrands/hub into develop 2025-11-04 14:49:59 -07:00
Jon Leopard
71082da9f9 fix(k8s): configure nginx ingress controller and update setup docs
- Add ingressClassName: nginx to ingress manifest
- Remove leftover Traefik annotations
- Update Makefile comments with portable $(pwd) instead of hardcoded paths
- Add nginx ingress installation instructions
- Document Traefik disabling in k3d cluster creation

This fixes 404 errors when accessing the develop cluster from project root.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 16:18:07 -07:00
9 changed files with 286 additions and 56 deletions

View File

@@ -1,27 +0,0 @@
{
"permissions": {
"allow": [
"Bash(test:*)",
"Bash(docker exec:*)",
"Bash(docker stats:*)",
"Bash(docker logs:*)",
"Bash(docker-compose down:*)",
"Bash(docker-compose up:*)",
"Bash(php --version:*)",
"Bash(docker-compose build:*)",
"Bash(docker-compose restart:*)",
"Bash(find:*)",
"Bash(docker ps:*)",
"Bash(php -l:*)",
"Bash(curl:*)",
"Bash(cat:*)",
"Bash(docker update:*)",
"Bash(grep:*)",
"Bash(sed:*)",
"Bash(php artisan:*)",
"Bash(php check_blade.php:*)"
],
"deny": [],
"ask": []
}
}

3
.gitignore vendored
View File

@@ -59,3 +59,6 @@ core.*
!resources/**/*.jpg
!resources/**/*.jpeg
.claude/settings.local.json
# Git worktrees directory
.worktrees/

View File

@@ -239,6 +239,163 @@ git push origin feature/my-feature
git push --no-verify
```
### Keeping Your Feature Branch Up-to-Date
**Best practice for teams:** Sync your feature branch with `develop` regularly to avoid large merge conflicts.
#### Daily Start-of-Work Routine
```bash
# 1. Get latest changes from develop
git checkout develop
git pull origin develop
# 2. Update your feature branch
git checkout feature/my-feature
git merge develop
# 3. If there are conflicts (see below), resolve them
# 4. Continue working
```
**How often?**
- Minimum: Once per day (start of work)
- Better: Multiple times per day if develop is active
- Always: Before creating your Pull Request
#### Merge vs Rebase: Which to Use?
**For teams of 5+ developers, use `merge` (not `rebase`):**
```bash
git checkout feature/my-feature
git merge develop
```
**Why merge over rebase?**
- ✅ Safer: Preserves your commit history
- ✅ Collaborative: Works when multiple people work on the same feature branch
- ✅ Transparent: Shows when you integrated upstream changes
- ✅ No force-push: Once you've pushed to origin, merge won't require `--force`
**When to use rebase:**
- ⚠️ Only if you haven't pushed yet
- ⚠️ Only if you're the sole developer on the branch
- ⚠️ You want a cleaner, linear history
```bash
# Only do this if you haven't pushed yet!
git checkout feature/my-feature
git rebase develop
```
**Never rebase after pushing** - it rewrites history and breaks collaboration.
#### Handling Merge Conflicts
When you run `git merge develop` and see conflicts:
```bash
$ git merge develop
Auto-merging app/Http/Controllers/OrderController.php
CONFLICT (content): Merge conflict in app/Http/Controllers/OrderController.php
Automatic merge failed; fix conflicts and then commit the result.
```
**Step-by-step resolution:**
1. **See which files have conflicts:**
```bash
git status
# Look for "both modified:" files
```
2. **Open conflicted files** - look for conflict markers:
```php
<<<<<<< HEAD
// Your code
=======
// Code from develop
>>>>>>> develop
```
3. **Resolve conflicts** - edit the file to keep what you need:
```php
// Choose your code, their code, or combine both
// Remove the <<<, ===, >>> markers
```
4. **Mark as resolved:**
```bash
git add app/Http/Controllers/OrderController.php
```
5. **Complete the merge:**
```bash
git commit -m "merge: resolve conflicts with develop"
```
6. **Run tests to ensure nothing broke:**
```bash
./vendor/bin/sail artisan test
```
7. **Push the merge commit:**
```bash
git push origin feature/my-feature
```
#### When Conflicts Are Too Complex
If conflicts are extensive or you're unsure:
1. **Abort the merge:**
```bash
git merge --abort
```
2. **Ask for help** in #engineering Slack:
- "I'm merging develop into feature/X and have conflicts in OrderController"
- Someone might have context on the upstream changes
3. **Pair program the resolution** - screen share with the person who made the conflicting changes
4. **Alternative: Start fresh** (last resort):
```bash
# Create new branch from latest develop
git checkout develop
git pull origin develop
git checkout -b feature/my-feature-v2
# Cherry-pick your commits
git cherry-pick <commit-hash>
```
#### Example: Multi-Day Feature Work
```bash
# Monday morning
git checkout develop && git pull origin develop
git checkout feature/payment-integration
git merge develop # Get latest changes
# Work all day, make commits
# Tuesday morning
git checkout develop && git pull origin develop
git checkout feature/payment-integration
git merge develop # Sync again (someone added auth changes)
# Continue working
# Wednesday
git checkout develop && git pull origin develop
git checkout feature/payment-integration
git merge develop # Final sync before PR
git push origin feature/payment-integration
# Create Pull Request
```
**Result:** Small, manageable syncs instead of one huge conflict on PR day.
### When to Test Locally
**Always run tests before pushing if you:**

View File

@@ -9,9 +9,13 @@
# --api-port 6443 \
# --port "80:80@loadbalancer" \
# --port "443:443@loadbalancer" \
# --volume /Users/jon/projects/cannabrands/cannabrands_new/.worktrees:/worktrees \
# --volume /Users/jon/projects/cannabrands/cannabrands_new:/project-root \
# --volume k3d-dev-images:/k3d/images
# --volume $(pwd)/.worktrees:/worktrees \
# --volume $(pwd):/project-root \
# --volume k3d-dev-images:/k3d/images \
# --k3s-arg "--disable=traefik@server:0"
#
# Then install nginx ingress:
# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# Detect if we're in a worktree or project root
GIT_DIR := $(shell git rev-parse --git-dir 2>/dev/null)
@@ -35,6 +39,8 @@ K8S_NS := $(shell echo "$(CURRENT_BRANCH)" | sed 's/feature\//feat-/' | sed 's/b
SANITIZED_BRANCH := $(shell echo "$(CURRENT_BRANCH)" | sed 's/[^a-zA-Z0-9]/_/g')
# Generate host from branch
K8S_HOST := $(shell echo "$(CURRENT_BRANCH)" | sed 's/feature\///' | sed 's/bugfix\///' | sed 's/\//-/g').cannabrands.test
# Generate unique Vite port from namespace (5173-5200 range)
VITE_PORT := $(shell echo "$(K8S_NS)" | cksum | cut -d' ' -f1 | awk '{print 5173 + ($$1 % 28)}')
# Read database credentials from .env
DB_USERNAME := $(shell grep '^DB_USERNAME=' .env 2>/dev/null | cut -d '=' -f2)
DB_PASSWORD := $(shell grep '^DB_PASSWORD=' .env 2>/dev/null | cut -d '=' -f2)
@@ -95,6 +101,9 @@ k-dev: ## Start k8s local environment (like Sail, but with namespace isolation)
@# Deploy Reverb (WebSocket server)
@export NS=$(K8S_NS) K8S_VOLUME_PATH=$(K8S_VOLUME_PATH) K8S_HOST=$(K8S_HOST) && \
envsubst < k8s/local/reverb.yaml | kubectl apply -f -
@# Create persistent volumes for Vite cache
@export NS=$(K8S_NS) && \
envsubst < k8s/local/vite-cache-pvc.yaml | kubectl apply -f -
@# Wait for DB
@echo "⏳ Waiting for PostgreSQL..."
@kubectl -n $(K8S_NS) wait --for=condition=ready pod -l app=postgres --timeout=60s
@@ -108,13 +117,18 @@ k-dev: ## Start k8s local environment (like Sail, but with namespace isolation)
@echo ""
@echo "✅ Ready! Visit: http://$(K8S_HOST)"
@echo ""
@echo "💡 Your code is volume-mounted - changes are instant!"
@echo " Edit files → refresh browser → see changes"
@echo "🎨 Next: Start Vite for hot module replacement:"
@echo " make k-dev-vite # In another terminal (port $(VITE_PORT))"
@echo ""
@echo "💡 Each worktree gets a unique Vite port for parallel development!"
@echo " This worktree: Port $(VITE_PORT) (auto-assigned from namespace: $(K8S_NS))"
@echo " Persistent cache enabled for faster Vite startup"
@echo ""
@echo "📝 Useful commands:"
@echo " make k-logs # View app logs"
@echo " make k-shell # Open shell in pod"
@echo " make k-vite # Start Vite dev server"
@echo " make k-logs # View app logs"
@echo " make k-shell # Open shell in pod"
@echo " make k-dev-vite # Start Vite dev server (recommended)"
@echo " make k-cache-clear # Clear Vite cache if needed"
@echo ""
@echo "🔌 WebSocket (Reverb) available at: ws://reverb.$(K8S_HOST):8080"
@@ -135,10 +149,22 @@ k-artisan: ## Run artisan command (usage: make k-artisan CMD="migrate")
k-composer: ## Run composer (usage: make k-composer CMD="install")
@kubectl -n $(K8S_NS) exec deploy/web -- composer $(CMD)
k-vite: ## Run Vite dev server in k8s pod
@echo "🎨 Starting Vite dev server in pod..."
k-dev-vite: ## Run Vite dev server on HOST (recommended for k8s - fast HMR)
@echo "🎨 Starting Vite dev server on HOST (fast)..."
@echo " Namespace: $(K8S_NS)"
@echo " Port: $(VITE_PORT) (auto-assigned per worktree)"
@VITE_PORT=$(VITE_PORT) npm run dev
k-vite: ## Run Vite dev server in k8s pod (slower - use k-dev-vite instead)
@echo "🎨 Starting Vite dev server in pod (with optimizations)..."
@echo " Consider using 'make k-dev-vite' for better performance"
@echo " Access at: http://vite.$(K8S_HOST)"
@kubectl -n $(K8S_NS) exec deploy/web -- npm run dev
@kubectl -n $(K8S_NS) exec deploy/web -- sh -c "VITE_HMR_HOST=vite.$(K8S_HOST) VITE_USE_POLLING=true npm run dev"
k-cache-clear: ## Clear Vite cache in k8s pod
@echo "🗑 Clearing Vite cache..."
@kubectl -n $(K8S_NS) exec deploy/web -- rm -rf node_modules/.vite
@echo "✅ Cache cleared. Restart Vite for changes to take effect."
k-test: ## Run tests in k8s pod
@echo "🧪 Running tests in k8s pod..."

View File

@@ -54,6 +54,8 @@ spec:
volumeMounts:
- name: code
mountPath: /var/www/html
- name: vite-cache
mountPath: /var/www/html/node_modules/.vite
# Startup command
command: ["/bin/bash", "-c"]
@@ -81,8 +83,10 @@ spec:
echo "Installing/updating npm dependencies..."
npm install --no-audit --no-fund
echo "Building frontend assets..."
npm run build
# Skip npm run build when using host Vite (faster startup)
# Uncomment for production or if running make k-vite:
# echo "Building frontend assets..."
# npm run build
echo "Running migrations..."
php artisan migrate --force
@@ -128,3 +132,6 @@ spec:
hostPath:
path: ${K8S_VOLUME_PATH}
type: Directory
- name: vite-cache
persistentVolumeClaim:
claimName: vite-cache-pvc

View File

@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vite-cache-pvc
namespace: ${NS}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path

28
package-lock.json generated
View File

@@ -1056,7 +1056,8 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@svgdotjs/svg.draggable.js": {
"version": "3.0.6",
@@ -1084,7 +1085,6 @@
"resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.5.tgz",
"integrity": "sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==",
"license": "MIT",
"peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Fuzzyma"
@@ -1108,7 +1108,6 @@
"resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz",
"integrity": "sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 14.18"
},
@@ -1482,7 +1481,6 @@
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.0.tgz",
"integrity": "sha512-lpokA5okCF1BKh10LG8YjqhfpxyHBk4gE7boIgVHltJzYoM7O9nK3M7VlntLEJGsVmu7U/RzUWajmHREGT38Eg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@vue/reactivity": "~3.1.1"
}
@@ -1641,7 +1639,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.9",
"caniuse-lite": "^1.0.30001746",
@@ -2062,7 +2059,6 @@
"integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"meow": "^13.0.0"
},
@@ -2390,7 +2386,6 @@
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC",
"peer": true,
"engines": {
"node": ">=12"
}
@@ -2582,6 +2577,7 @@
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz",
"integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==",
"license": "MIT",
"peer": true,
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
@@ -2595,6 +2591,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -2612,6 +2609,7 @@
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
"integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.0.0"
}
@@ -2762,8 +2760,7 @@
"version": "4.32.9",
"resolved": "https://registry.npmjs.org/filepond/-/filepond-4.32.9.tgz",
"integrity": "sha512-MnNnRrTS1M/6C/puIs5dNkbP1RMGANFxnygwdweNXAxyeCS4S68UM4CdvmyF7UrZB93Fhop7Bea2Ib6rkrYHUw==",
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/filepond-plugin-file-validate-type": {
"version": "1.2.9",
@@ -3731,7 +3728,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -3771,7 +3767,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -3799,7 +3794,6 @@
"resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0.tgz",
"integrity": "sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"tweetnacl": "^1.0.3"
}
@@ -3970,6 +3964,7 @@
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
"integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
@@ -3985,6 +3980,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -4002,6 +3998,7 @@
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
"integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
"license": "MIT",
"peer": true,
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
@@ -4015,6 +4012,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -4138,8 +4136,7 @@
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.15.tgz",
"integrity": "sha512-k2WLnWkYFkdpRv+Oby3EBXIyQC8/s1HOFMBUViwtAh6Z5uAozeUSMQlIsn/c6Q2iJzqG6aJT3wdPaRNj70iYxQ==",
"dev": true,
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.0",
@@ -4323,7 +4320,6 @@
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
@@ -4447,6 +4443,7 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
"integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.0.0"
},
@@ -4467,6 +4464,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
"integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==",
"peer": true,
"engines": {
"node": ">=0.4.0"
}

View File

@@ -24,7 +24,7 @@ export default {
require("daisyui"),
addIconSelectors(['lucide', 'hugeicons', 'ri'])
],
daisyui: {
themes: ["light", "dark"],
},

View File

@@ -10,4 +10,58 @@ export default defineConfig({
refresh: true,
}),
],
// Dependency pre-bundling optimization
optimizeDeps: {
// Force pre-bundle these dependencies for faster startup
include: [
'@alpinejs/intersect',
'@alpinejs/morph',
'@alpinejs/persist',
'animejs',
'apexcharts',
'cal-heatmap',
'cally',
'choices.js',
'filepond',
'filepond-plugin-file-validate-type',
'filepond-plugin-image-preview',
'laravel-echo',
'laravel-precognition-alpine',
'pusher-js',
'sortablejs',
],
// Hold crawling until all imports are discovered
holdUntilCrawled: true,
},
// Cache configuration
cacheDir: 'node_modules/.vite',
server: {
host: "0.0.0.0", // Listen on all interfaces
port: process.env.VITE_PORT ? parseInt(process.env.VITE_PORT) : 5173,
strictPort: false, // Allow fallback port if assigned port is taken
allowedHosts: [".cannabrands.test"], // Allow all subdomains
// File watching optimization for containers
watch: {
// Use polling for container environments (increases CPU but more reliable)
usePolling: process.env.VITE_USE_POLLING === 'true',
interval: 1000, // Check every 1 second (vs default 100ms)
binaryInterval: 3000, // For binary files
},
// Warmup frequently used files
warmup: {
clientFiles: [
'./resources/js/app.js',
'./resources/css/app.css',
],
},
hmr: {
// Host mode (npm run dev on macOS): use localhost with assigned port
// K8s mode (make k-vite): use vite subdomain through ingress
host: process.env.VITE_HMR_HOST || "localhost",
clientPort: process.env.VITE_HMR_HOST
? 80
: (process.env.VITE_PORT ? parseInt(process.env.VITE_PORT) : 5173),
protocol: "http",
},
},
});