Shared Code Strategy
Extracting shared types and utilities into reusable @jose-madrid workspace packages.
Shared Code Extraction Strategy
Overview
This document outlines the strategy for extracting shared types and utilities from the monorepo into reusable packages. Based on the investigation findings, both fundraising and admin functionality already exist within apps/storefront, making this a code organization and reusability initiative rather than a migration from external repositories.
Goal: Create shared packages (@jose-madrid/shared-types and @jose-madrid/shared-utils) that can be consumed by current and future applications in the monorepo, reducing duplication and improving maintainability.
Current State Analysis
Existing Applications
- apps/storefront: Next.js application containing storefront, fundraising, and admin functionality
- apps/backend: API service for backend operations
Code Organization
All business logic currently resides in apps/storefront:
- 107+ fundraising files: Components, types, utilities, API routes
- 415+ admin files: Comprehensive admin interface with RBAC
- Shared types: Currently duplicated or tightly coupled to storefront
- Shared utilities: Reusable logic that could benefit multiple apps
Identified Shared Code
1. Shared Types (packages/shared-types)
Core Business Types
Priority: HIGH - Foundation for all apps
-
User & Authentication
UserRoleenum (ADMIN, DEVELOPER, STAFF, WHOLESALE, FUNDRAISER, CUSTOMER)Userinterface (base user properties)Sessiontype (authentication session data)Permissiontypes (RBAC permission structure)
-
E-Commerce
Productinterface (product catalog)Orderinterface (order structure)OrderIteminterface (order line items)Categoryinterface (product categories)CartIteminterface (shopping cart items)PaymentMethodtype (payment method options)ShippingMethodtype (shipping options)
-
Fundraising
Fundraiserinterface (campaign structure)FundraiserParticipantinterface (participant data)FundraiserCharacterinterface (Battle Arena characters)FundraiserTeaminterface (team structure)BattleStateinterface (Battle Arena state)CharacterClasstype (character class enum)CommissionRatetype (commission calculation)
-
Email & Communications
NewsletterTemplatetype (email templates)NewsletterBlocktype (email blocks)EmailCampaigninterface (campaign structure)EmailAutomationinterface (automation workflows)
-
Analytics
AnalyticsMetricinterface (metric structure)ChartDatainterface (chart data format)DateRangeinterface (analytics date ranges)
API Response Types
Priority: HIGH - Critical for API consistency
ApiResponse<T>generic (standardized API responses)ApiErrorinterface (error structure)PaginatedResponse<T>generic (paginated results)ValidationErrorinterface (validation errors)
Form & Validation Types
Priority: MEDIUM - Developer productivity
FormFieldinterface (form field structure)ValidationSchematype (Zod schema types)FormStatetype (form state management)
2. Shared Utilities (packages/shared-utils)
Authentication & Authorization
Priority: HIGH - Security critical
-
RBAC Utilities
getUserPermissions(user)- Get user permissionshasPermission(user, permission)- Check permissionrequirePermission(user, permission)- Assert permissionfilterByPermissions(items, user)- Filter by permissions
-
Role Utilities
getRoleBadgeVariant(role)- Get UI badge variant for roleformatUserRole(role)- Format role for displayisAdmin(user)- Check admin roleisDeveloper(user)- Check developer roleisStaff(user)- Check staff role
Business Logic
Priority: HIGH - Core calculations
-
Fundraising Utilities (
apps/storefront/lib/fundraising/)calculateCommission(orderTotal, rate)- Commission calculationcalculateCommissionFromNumber(total, rate)- Number versioncalculateTotalCommission(orders, rate)- Total commission- Referral tracking utilities (from
referral-tracker.ts)
-
Discount & Pricing
- Discount calculation logic (from
lib/discounts.ts) - Price formatting utilities
- Discount calculation logic (from
API & Validation
Priority: HIGH - Consistency
-
API Helpers (
lib/api/)apiResponse<T>(data)- Create success responseapiError(message, code)- Create error responsevalidateApiKey(key)- API key validation- Rate limiting utilities (from
lib/rate-limiter.ts)
-
Validation Utilities (
lib/validation.ts,lib/validations/)- Common Zod schemas (email, phone, etc.)
- Validation helpers
- Input sanitization
Data Formatting
Priority: MEDIUM - User experience
-
Date & Time
- Date range utilities (
lib/analytics/date-range.ts) - Date formatting helpers
- Date range utilities (
-
Number & Currency
- Currency formatting
- Number formatting
- Percentage calculations
-
String Utilities
- Slug generation
- Truncation
- Sanitization
Analytics
Priority: MEDIUM - Reporting
- Chart Utilities (
lib/analytics/chart-utils.ts)- Chart data transformation
- Metric calculations
- Data aggregation helpers
Crypto & Security
Priority: HIGH - Security critical
- Crypto Utilities (
lib/crypto.ts)- Hashing utilities
- Token generation
- Encryption/decryption helpers
3. Audit Log Utilities
Priority: MEDIUM - Compliance
- Audit logging (
lib/audit.ts) - Event tracking
- Change history
Proposed Package Structure
packages/
├── shared-types/
│ ├── package.json
│ ├── tsconfig.json
│ ├── index.ts # Main export
│ ├── src/
│ │ ├── user.ts # User & auth types
│ │ ├── ecommerce.ts # Product, order types
│ │ ├── fundraising.ts # Fundraiser types
│ │ ├── email.ts # Email types
│ │ ├── analytics.ts # Analytics types
│ │ ├── api.ts # API response types
│ │ └── forms.ts # Form types
│ └── README.md
│
└── shared-utils/
├── package.json
├── tsconfig.json
├── index.ts # Main export
├── src/
│ ├── auth/
│ │ ├── rbac.ts # RBAC utilities
│ │ └── roles.ts # Role utilities
│ ├── fundraising/
│ │ ├── commission.ts # Commission calculations
│ │ └── referrals.ts # Referral tracking
│ ├── api/
│ │ ├── responses.ts # API response helpers
│ │ ├── validation.ts # API validation
│ │ └── rate-limit.ts # Rate limiting
│ ├── formatting/
│ │ ├── currency.ts # Currency formatting
│ │ ├── date.ts # Date formatting
│ │ └── string.ts # String utilities
│ ├── analytics/
│ │ └── charts.ts # Chart utilities
│ ├── crypto/
│ │ └── index.ts # Crypto utilities
│ └── validation/
│ ├── schemas.ts # Common Zod schemas
│ └── helpers.ts # Validation helpers
└── README.mdMigration Order (Phased Approach)
To minimize breaking changes and ensure stability, extract shared code in the following order:
Phase 1: Foundation Types (Low Risk)
Target: Week 1
-
Create
packages/shared-typespackage- Set up package.json with
@jose-madrid/shared-types - Configure TypeScript for type-only exports
- Add to workspace
- Set up package.json with
-
Extract Core Types (no dependencies)
- User & role types
- API response types (
ApiResponse<T>,ApiError) - Basic e-commerce types (
Product,Order)
-
Update apps/storefront imports
- Replace local type imports with
@jose-madrid/shared-types - Verify type-check passes:
npm run type-check --workspace=@jose-madrid/storefront
- Replace local type imports with
Success Criteria:
- Type-check passes for all apps
- No runtime errors
- Reduced type duplication
Phase 2: Business Types (Medium Risk)
Target: Week 1-2
-
Extract Fundraising Types
Fundraiser,FundraiserParticipant,FundraiserTeamFundraiserCharacter,BattleState,CharacterClass
-
Extract Email Types
NewsletterTemplate,NewsletterBlock- Email campaign types
-
Extract Analytics Types
- Chart data types
- Metric types
Success Criteria:
- All apps type-check successfully
- Tests pass
- No compilation errors
Phase 3: Utility Functions - Pure Logic (Low Risk)
Target: Week 2
-
Create
packages/shared-utilspackage- Set up package.json with
@jose-madrid/shared-utils - Configure TypeScript for code exports
- Add to workspace
- Set up package.json with
-
Extract Pure Calculation Functions (no external dependencies)
calculateCommission()and related functions- Currency/number formatting
- String utilities (slug, truncate)
-
Update storefront imports
- Replace local utility imports
- Verify unit tests pass
Success Criteria:
- All utility tests pass
- No side effects from extraction
- Clean import paths
Phase 4: API & Validation Utilities (Medium Risk)
Target: Week 2-3
-
Extract API Helpers
- Response builders (
apiResponse,apiError) - API key validation
- Rate limiting utilities
- Response builders (
-
Extract Validation Utilities
- Common Zod schemas
- Validation helpers
-
Update all apps
- Storefront
- Backend (if applicable)
Success Criteria:
- API responses maintain format
- Validation works correctly
- Rate limiting functions correctly
Phase 5: Authentication Utilities (Higher Risk)
Target: Week 3
-
Extract RBAC Utilities (carefully - security critical)
- Permission checking functions
- Role utilities
- Navigation filtering
-
Extensive Testing
- Unit tests for RBAC functions
- Integration tests for permission flows
- Manual testing of admin access
-
Update storefront
- Replace RBAC imports
- Verify all permission checks work
Success Criteria:
- All permission checks work correctly
- No security regressions
- Admin access remains restricted
- Tests cover edge cases
Phase 6: Analytics & Crypto (Low-Medium Risk)
Target: Week 3-4
-
Extract Chart Utilities
- Chart data transformation
- Metric calculations
-
Extract Crypto Utilities
- Hashing, token generation
- IMPORTANT: Verify crypto compatibility across Node versions
-
Extract Audit Utilities
- Audit logging helpers
Success Criteria:
- Analytics display correctly
- Crypto functions work identically
- Audit logs continue to work
Breaking Change Prevention Strategy
1. Incremental Extraction
- Extract one category at a time
- Run full test suite after each extraction
- Commit after each successful phase
2. Parallel Development
- Keep original code in place during extraction
- Only remove original code after successful verification
- Use deprecation comments if needed
3. Type Safety
- Leverage TypeScript for compile-time safety
- Run
npm run type-checkafter every change - Use strict TypeScript config in shared packages
4. Testing Strategy
- Unit Tests: Test shared utilities in isolation
- Integration Tests: Verify apps work with shared code
- E2E Tests: Run fundraising and admin E2E tests
- Manual Testing: Test critical flows (checkout, permissions, fundraising)
5. Version Control
- One pull request per phase
- Detailed commit messages
- Easy to revert if issues arise
Dependency Management
Package Dependencies
shared-types:
{
"dependencies": {},
"devDependencies": {
"typescript": "^5.0.0"
}
}shared-utils:
{
"dependencies": {
"@jose-madrid/shared-types": "workspace:*",
"@prisma/client": "^5.0.0", // For Decimal type
"zod": "^3.0.0" // For validation schemas
},
"devDependencies": {
"typescript": "^5.0.0",
"vitest": "^1.0.0" // For testing
}
}Import Conventions
// ✅ CORRECT: Named imports from shared packages
import { UserRole, Fundraiser } from '@jose-madrid/shared-types'
import { calculateCommission, hasPermission } from '@jose-madrid/shared-utils'
// ❌ AVOID: Deep imports (breaks encapsulation)
import { UserRole } from '@jose-madrid/shared-types/src/user'Testing Requirements
Phase 1-2 (Types)
- Type-check passes:
npm run type-check - Build succeeds:
turbo run build
Phase 3-6 (Utilities)
- Unit tests for all extracted utilities
- Integration tests for critical paths
- Minimum 80% code coverage for shared packages
E2E Testing
Run after each phase:
# Fundraising flow
npm run test:e2e --workspace=@jose-madrid/storefront -- fundraising
# Admin access and permissions
npm run test:e2e --workspace=@jose-madrid/storefront -- admin
# Checkout flow (tests commission calculations)
npm run test:e2e --workspace=@jose-madrid/storefront -- checkoutRollback Strategy
If issues arise during any phase:
- Immediate Rollback: Revert the last commit
- Identify Root Cause: Debug the issue
- Fix Forward: Apply fix and re-test
- Document: Add to "Known Issues" section
Each phase is independently revertible without affecting previous phases.
Success Metrics
Quantitative
- Code Reduction: 20-30% reduction in duplicated code
- Type Coverage: 100% of core business types in shared packages
- Test Coverage: 80%+ for shared utilities
- Build Time: No significant increase in build time
- Bundle Size: No increase in bundle size (tree-shaking verified)
Qualitative
- Developer Experience: Easier to find and reuse types/utilities
- Consistency: Single source of truth for business logic
- Maintainability: Changes to shared logic update all apps
- Type Safety: Better autocomplete and type inference
Risk Assessment
Low Risk
- Pure type extraction (Phase 1-2)
- Pure calculation functions (Phase 3)
- Analytics utilities (Phase 6)
Medium Risk
- API & validation utilities (Phase 4)
- Chart utilities (Phase 6)
Higher Risk
- RBAC utilities (Phase 5) - Security critical
- Crypto utilities (Phase 6) - Compatibility critical
Mitigation:
- Extensive testing for higher-risk items
- Security review for RBAC extraction
- Backward compatibility checks for crypto
Future Considerations
When External Apps Are Added (apps/fundraising, apps/admin)
If/when fundraising or admin are extracted into separate apps:
- Immediate Benefit: Shared packages already exist
- Reduced Duplication: New apps import from shared packages
- Consistent Logic: Business rules centralized
- Easier Migration: Types already defined
Package Versioning
Once extracted:
- Use workspace protocol:
"@jose-madrid/shared-types": "workspace:*" - Lock shared package versions for production deployments
- Consider semantic versioning for breaking changes
Documentation
Each shared package should include:
- README.md: Package purpose, usage examples
- CHANGELOG.md: Version history
- API Documentation: Generated from TSDoc comments
Timeline Summary
| Phase | Description | Duration | Risk |
|---|---|---|---|
| 1 | Foundation Types | Week 1 | Low |
| 2 | Business Types | Week 1-2 | Medium |
| 3 | Pure Utilities | Week 2 | Low |
| 4 | API & Validation | Week 2-3 | Medium |
| 5 | RBAC Utilities | Week 3 | Higher |
| 6 | Analytics & Crypto | Week 3-4 | Low-Medium |
Total Estimated Time: 3-4 weeks for complete extraction
Recommendation: Start with Phases 1-3 as a proof of concept (Week 1-2), then evaluate before continuing.
Open Questions
-
❓ Should we extract utilities that depend on Prisma (e.g.,
getPrisma()from auth.ts)?- Recommendation: Keep Prisma-dependent code in apps for now, extract only pure logic
-
❓ Should email template utilities be shared or remain in storefront?
- Recommendation: Extract types, keep rendering logic in storefront initially
-
❓ Should we create additional packages (e.g.,
shared-config,shared-constants)?- Recommendation: Start with types and utils, add more packages based on actual need
-
❓ How to handle environment-specific code (e.g., different API URLs)?
- Recommendation: Keep env-specific code in apps, shared packages should be env-agnostic
Next Steps
- Review this strategy with team/stakeholders
- Create Phase 1 implementation subtask (foundation types)
- Set up CI checks for shared packages (type-check, test, lint)
- Begin Phase 1 extraction following the migration order above
Document Version: 1.0
Last Updated: 2026-06-19
Author: Claude (Subtask 1-4)
How is this guide?
Last updated on