Member Junction
    Preparing search index...

    Module @memberjunction/server-bootstrap - v5.49.0

    @memberjunction/server-bootstrap

    MemberJunction Server Bootstrap - Encapsulates all server initialization logic into a single, simple function.

    In MemberJunction 3.0, server applications (MJAPI) became minimal bootstrapping files (~6 lines of code) that import all functionality from NPM packages. This package provides the createMJServer() function that handles all the complex initialization logic.

    graph TD
        A["createMJServer()"] --> B["Load Configuration
    (mj.config.cjs / .mjrc)"] B --> C["Discover Generated Packages
    (entities, actions, resolvers)"] C --> D["Auto-Import via
    @RegisterClass Side Effects"] D --> E["Build Resolver Paths"] E --> F["Run beforeStart Hook"] F --> G["serve() from @memberjunction/server"] G --> H["Database Connection Pool"] G --> I["GraphQL Schema Builder"] G --> J["WebSocket Subscriptions"] G --> K["REST API Endpoints"] G --> L["Graceful Shutdown"] G --> M["Run afterStart Hook"] style A fill:#2d6a9f,stroke:#1a4971,color:#fff style B fill:#7c5295,stroke:#563a6b,color:#fff style C fill:#7c5295,stroke:#563a6b,color:#fff style D fill:#2d8659,stroke:#1a5c3a,color:#fff style G fill:#2d6a9f,stroke:#1a4971,color:#fff style H fill:#b8762f,stroke:#8a5722,color:#fff style I fill:#b8762f,stroke:#8a5722,color:#fff style J fill:#b8762f,stroke:#8a5722,color:#fff style K fill:#b8762f,stroke:#8a5722,color:#fff
    npm install @memberjunction/server-bootstrap
    

    Create your packages/api/src/index.ts:

    import { createMJServer } from '@memberjunction/server-bootstrap';

    // Import generated packages to trigger registration
    import '@mycompany/generated-entities';
    import '@mycompany/generated-actions';
    import '@mycompany/generated-resolvers';

    createMJServer().catch(console.error);

    That's it! Your entire MJAPI application in 6 lines.

    import { createMJServer } from '@memberjunction/server-bootstrap';

    createMJServer({
    // Add custom resolver paths
    resolverPaths: ['./custom-resolvers/**/*Resolver.{js,ts}'],

    // Run custom logic before server starts
    beforeStart: async () => {
    console.log('Initializing custom services...');
    // Your initialization code here
    },

    // Run custom logic after server starts
    afterStart: async () => {
    console.log('Server is ready!');
    // Your post-startup code here
    },

    // Configure REST API
    restApiOptions: {
    enabled: true,
    includeEntities: ['Users', 'Companies'],
    excludeEntities: ['SystemSettings']
    }
    }).catch(console.error);

    The createMJServer() function handles:

    1. Configuration Loading - Automatically finds and loads mj.config.cjs or .mjrc
    2. Generated Package Discovery - Auto-imports generated entities, actions, forms, and resolvers
    3. Database Connection - Sets up connection pooling with configured credentials
    4. GraphQL Schema Building - Discovers resolvers and builds the GraphQL schema
    5. WebSocket Setup - Configures WebSocket support for GraphQL subscriptions
    6. REST API Setup - Registers REST endpoints based on configuration
    7. Graceful Shutdown - Handles SIGTERM/SIGINT signals properly
    8. Scheduled Jobs - Initializes and starts scheduled job service if enabled

    The function uses your mj.config.cjs for all database and server settings:

    // mj.config.cjs
    module.exports = {
    dbHost: process.env.DB_HOST,
    dbPort: process.env.DB_PORT || 1433,
    dbDatabase: process.env.DB_DATABASE,
    dbUsername: process.env.DB_USERNAME,
    dbPassword: process.env.DB_PASSWORD,

    graphqlPort: process.env.PORT || 4000,

    // Code Generation Configuration
    codeGeneration: {
    outputMode: 'packages',
    packageScope: '@mycompany',
    packages: {
    entities: {
    path: './packages/generated-entities',
    name: '@mycompany/generated-entities'
    },
    actions: {
    path: './packages/generated-actions',
    name: '@mycompany/generated-actions'
    },
    graphqlResolvers: {
    path: './packages/generated-resolvers',
    name: '@mycompany/generated-resolvers'
    }
    }
    }
    };

    Creates and starts a MemberJunction API server.

    • options.configPath - Path to config file (optional, auto-discovers if not provided)
    • options.resolverPaths - Additional resolver paths beyond defaults
    • options.beforeStart - Hook function to run before server starts
    • options.afterStart - Hook function to run after server starts
    • options.restApiOptions - REST API configuration options

    Promise that resolves when the server is running.

    In MemberJunction 2.x, your MJAPI/src/index.ts had ~34 lines of boilerplate code for database setup, schema building, etc.

    Before (2.x):

    // 34 lines of configuration, pool setup, schema building, etc.
    import { serve } from '@memberjunction/server';
    // ... lots of setup code ...
    await serve(resolverPaths);

    After (3.0):

    import { createMJServer } from '@memberjunction/server-bootstrap';
    createMJServer().catch(console.error);

    All the complexity is now encapsulated in this package and updated via NPM.

    • Zero-copy updates - npm update brings all improvements automatically
    • No stale code - Bootstrap logic stays up-to-date with MJ releases
    • Minimal surface area - Fewer lines of code means fewer places for bugs
    • Standard patterns - Everyone uses the same initialization flow
    • Extensible - Hooks allow custom logic without modifying core

    MIT

    Classes

    BaseServerMiddleware

    Interfaces

    MJServerConfig

    Type Aliases

    MJServerOptions

    Functions

    createMJServer