Modules Architechture
Ecosistema completo para organización y gestión de contenido con interfaces espaciales
GoGrab Space - Modules Architecture Decision
Question: Do Modules Need to Be NX Libraries?
TL;DR: YES, modules are NX libraries. They can be created visually (modularity-lib) or coded manually, but both produce NX libraries.
Last Updated: January 7, 2026 Session ID: 28.2 Status: ✅ Current Architecture - Hybrid Approach
Library Hierarchy (Session 28.2)
libs/libs-space/ ← SPACE Level (Global/Company)
├── theme-designer - Global themes
├── deployment-engine - Deployment infrastructure
└── universe-* - [Universe tools, re-exported]
libs/libs-universe/ ← UNIVERSE Level (Project) ← NEW
├── Re-exports universe-* from libs-space
├── Re-exports from libs-structural
└── Project-specific tools
libs/libs-structural/ ← Core Infrastructure
├── modular-universe - Grid layouts
├── page-builder - Page editing
├── singularity-lib - Logic flows
└── vibe-universe - AI generation
Inheritance Rules (like SCSS):
- Space settings cascade down as defaults
- Universe settings take precedence when defined
Architecture Comparison
Option A: Modules as NX Libraries ✅ (RECOMMENDED)
Structure:
editor/
├── libs/ # Reusable NX libraries
│ ├── core-angular/
│ ├── storage-system/
│ └── theme-system/
└── modules/ # Feature modules (also NX libraries)
└── user-management/ # Still an NX library, different location
├── project.json
├── tsconfig.lib.json
└── src/
Pros:
- ✅ Independent builds - Can be built separately from apps
- ✅ NX dependency graph - Proper dependency tracking and caching
- ✅ Lazy loading - Can be dynamically imported/loaded
- ✅ TypeScript path resolution - Proper @module imports
- ✅ Independent testing - Can run tests independently
- ✅ Publishable - Can be published to NPM if needed
- ✅ Parallel builds - NX can build multiple modules in parallel
- ✅ Affected detection - NX knows what to rebuild
- ✅ Code generation - Can use NX generators
- ✅ Consistent tooling - Same build/test/lint commands
Cons:
- Configuration overhead (but we have templates)
- More files per module
Option B: Modules as Regular TypeScript Code ❌
Structure:
editor/
├── libs/ # NX libraries
└── modules/ # Regular TypeScript (NOT NX libraries)
└── user-management/
└── src/
└── index.ts # Just TypeScript files
Pros:
- Simpler file structure
- Less configuration
Cons:
- ❌ No independent builds - Must be part of app build
- ❌ No dependency tracking - NX doesn't know about them
- ❌ No lazy loading - Can't dynamically import
- ❌ No caching - Rebuilds every time
- ❌ No parallel builds - All compiled with the app
- ❌ No affected detection - Always rebuilds
- ❌ Import issues - Complex TypeScript path resolution
- ❌ Can't publish - Not packageable
- ❌ Testing complexity - Must test through the app
How Modules Are Created
Visual Builder (modularity-lib)
The Module Workbench creates modules visually and exports them as NX libraries:
- Define entities, actions, embeddables in visual UI
- Click "Export as Angular Library"
- Generated output includes:
project.json- Nx configurationtsconfig.lib.json- Build configpackage.json- NPM metadata- Complete source code
Code-First (Traditional)
Developers manually create NX libraries:
npx nx g @nx/angular:lib my-module --directory=modules --standalone
Both approaches produce NX libraries - just different creation methods.
Why Modules MUST Be NX Libraries
1. Dynamic Loading (GoGrab Space Requirement)
Whether created visually or manually, modules load dynamically:
// This requires modules to be separate build artifacts
const module = await import('@user-management');
await module.UserManagementModule.initialize();
Verdict: ✅ Requires NX library with proper build output (visual builder handles this)
2. Module Adapter Pattern
export class LibraryModuleAdapter implements BrowserModuleContract {
async initialize(): Promise<void> {
// Dynamically imports the module
const lib = await import(this.libraryName);
// ... initialization
}
}
Verdict: ✅ Requires independently built module
3. Dependency Graph for Smart Rebuilds
# Only rebuilds affected modules
nx affected:build --base=main
If modules aren't NX libraries, every change rebuilds everything.
Verdict: ✅ Critical for performance
4. Independent Testing
# Test just the module
nx test user-management
Verdict: ✅ Essential for CI/CD efficiency
5. Multi-App Sharing
// apps/gograb-space uses the module
import { UserManagementModule } from '@user-management';
// apps/atlas-admin also uses it
import { UserManagementModule } from '@user-management';
Both apps can import the same built artifact.
Verdict: ✅ Enables true modularity
6. TypeScript Path Resolution
With NX Library:
{
"paths": {
"@user-management": ["dist/libs/user-management/index"]
}
}
✅ Works perfectly with proper type definitions
Without NX Library:
{
"paths": {
"@user-management": ["modules/user-management/src/index.ts"]
}
}
❌ No type definitions, no build validation, complex resolution
Recommended Architecture
Clear Separation of Concerns
editor/
├── libs/ # 🔧 Foundational NX Libraries
│ ├── core-angular/ # Contracts, base services
│ ├── core-models/ # Type definitions
│ ├── storage-system/ # Flash Persistence
│ ├── theme-system/ # Theme utilities
│ ├── editor-web-lib/ # Editor pillar (foundational)
│ ├── space-map-lib/ # Space Map pillar (foundational)
│ ├── singularity-lib/ # Singularity pillar (foundational)
│ └── ux-*/ # UI component libraries
│
└── modules/ # 📦 Feature Modules (also NX libraries!)
├── user-management/ # User CRUD module
├── product-catalog/ # Product management module
├── analytics/ # Analytics module
└── reporting/ # Reporting module
Key Distinction
| Category | Purpose | Examples |
|---|---|---|
| libs/ | Reusable building blocks, pillars, utilities | @libs-foundational/core-angular, @storage-system, @editor-web-lib |
| modules/ | Business feature modules that USE libs | @user-management, @product-catalog |
Both are NX libraries, but serve different architectural roles!
Implementation: Modules Folder Configuration
1. Keep NX Library Structure
Each module in modules/ should have:
- ✅
project.json- NX configuration - ✅
tsconfig.lib.json- Build configuration - ✅
package.json- NPM metadata - ✅
ng-package.json- Angular packaging
2. Update Path Mappings
// tsconfig.base.json
{
"paths": {
// Libs (foundational)
"@libs-foundational/core-angular": ["libs/core-angular/src/index"],
"@storage-system": ["libs/storage-system/src/index"],
// Modules (features)
"@user-management": ["modules/user-management/src/index"],
"@product-catalog": ["modules/product-catalog/src/index"]
}
}
3. Update Build Paths
// modules/user-management/project.json
{
"sourceRoot": "modules/user-management/src",
"targets": {
"build": {
"outputs": ["{workspaceRoot}/dist/modules/user-management"]
}
}
}
4. Update Output Structure
dist/
├── libs/ # Built foundational libraries
│ ├── core-angular/
│ └── storage-system/
└── modules/ # Built feature modules
├── user-management/
└── product-catalog/
Benefits of This Approach
- ✅ Clear Organization -
libs/vsmodules/is immediately understandable - ✅ All NX Benefits - Caching, dependency graph, affected builds
- ✅ Dynamic Loading - Modules can be lazy-loaded
- ✅ Independent Development - Each module builds/tests independently
- ✅ Scalability - Can grow to 100+ modules without issues
- ✅ Team Workflow - Teams can own specific modules
- ✅ CI/CD Efficiency - Only affected modules rebuild
- ✅ Code Reuse - Modules can import from libs/
- ✅ Type Safety - Full TypeScript support with proper paths
- ✅ GoGrab Space Compatible - Works with module adapters and BrowserModuleContract
Migration Checklist
When moving modules from libs/modules/ to modules/:
- Update
project.jsonpaths - Update
tsconfig.lib.jsonpaths - Update
tsconfig.base.jsonpath mappings - Update import statements if needed
- Update build output directories
- Update test configurations
- Rebuild affected projects
- Update documentation
Conclusion
Modules MUST remain NX libraries to support:
- Dynamic loading
- Independent builds
- Dependency tracking
- Lazy loading
- Multi-app sharing
- Type safety
- CI/CD efficiency
The organizational move from libs/modules/ to modules/ is excellent for clarity, but each module should still be a properly configured NX library!
🎨 The Visual Builder (modularity-lib)
The Module Workbench creates NX libraries visually - you don't need to manually configure project.json or tsconfig files!
What It Generates
- ✅ Proper NX library structure
- ✅ All configuration files (project.json, tsconfig.lib.json, package.json)
- ✅ BrowserModuleContract implementation
- ✅ Barrel exports in index.ts
- ✅ Complete source code
How It Works
- Build your module in the visual UI
- Click "Export as Angular Library"
- Place generated files in
modules/your-module/ - Run
nx build your-module - Import and use!
Result: You get all benefits of NX libraries without manual configuration complexity.
Decision Date: October 23, 2025
Last Updated: December 3, 2025 - 9:55 PM EST
Session ID: 3
Status: ✅ Approved and Active - Hybrid Approach
Architectural Pattern: Modules as NX Libraries (Visual or Code-First)
Creation Tools:
- Visual:
/modularity(Module Workbench) - Code:
nx g @nx/angular:libModule System: UsesBrowserModuleContractfrom@libs-core/module-base(see Module Registration)