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):


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:

Cons:

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:

Cons:

How Modules Are Created

Visual Builder (modularity-lib)

The Module Workbench creates modules visually and exports them as NX libraries:

  1. Define entities, actions, embeddables in visual UI
  2. Click "Export as Angular Library"
  3. Generated output includes:
    • project.json - Nx configuration
    • tsconfig.lib.json - Build config
    • package.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:

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

  1. ✅ Clear Organization - libs/ vs modules/ is immediately understandable
  2. ✅ All NX Benefits - Caching, dependency graph, affected builds
  3. ✅ Dynamic Loading - Modules can be lazy-loaded
  4. ✅ Independent Development - Each module builds/tests independently
  5. ✅ Scalability - Can grow to 100+ modules without issues
  6. ✅ Team Workflow - Teams can own specific modules
  7. ✅ CI/CD Efficiency - Only affected modules rebuild
  8. ✅ Code Reuse - Modules can import from libs/
  9. ✅ Type Safety - Full TypeScript support with proper paths
  10. ✅ GoGrab Space Compatible - Works with module adapters and BrowserModuleContract

Migration Checklist

When moving modules from libs/modules/ to modules/:

Conclusion

Modules MUST remain NX libraries to support:

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

How It Works

  1. Build your module in the visual UI
  2. Click "Export as Angular Library"
  3. Place generated files in modules/your-module/
  4. Run nx build your-module
  5. 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: