1.0.9 โ€ข Published 8 months ago

@chklff/bridge-lovable-sdk v1.0.9

Weekly downloads
-
License
BSD-3-Clause
Repository
github
Last release
8 months ago

Bridge Lovable SDK

The official Bridge SDK for seamless Make automations in Lovable projects with Supabase integration.

npm version License: BSD-3-Clause

๐Ÿš€ Quick Start

Installation

npm install @chklff/bridge-lovable-sdk@latest

โš ๏ธ If you have an older version (1.0.6 or below), update to the latest:

npm uninstall @chklff/bridge-lovable-sdk
npm install @chklff/bridge-lovable-sdk@latest

Basic Setup

๐Ÿ”ฅ RECOMMENDED FOR LOVABLE: Direct configuration (no env files needed)

import { createBridgeClient } from '@chklff/bridge-lovable-sdk';

// โœ… BEST FOR LOVABLE: Direct configuration
const bridge = createBridgeClient({
  supabase: {
    url: 'https://your-project.supabase.co',
    serviceRoleKey: 'your-service-role-key'
  },
  makebridge: {
    secretKey: 'your-bridge-secret',
    keyId: 'your-bridge-key-id',
    zoneUrl: 'https://eu2.make.com',
    organizationId: 1234567
  }
});

// Alternative: Environment variables (for Node.js projects)
const bridge = createBridgeClient();

๐ŸŽฏ Lovable Integration

For Lovable projects, use direct configuration instead of environment variables:

// In your Lovable component or server action
import { createBridgeClient } from '@chklff/bridge-lovable-sdk';

const bridge = createBridgeClient({
  supabase: {
    url: 'https://your-project.supabase.co',
    serviceRoleKey: 'your-service-role-key'  // Add to Supabase Edge Functions secrets
  },
  makebridge: {
    secretKey: 'your-bridge-secret',         // Add to Supabase Edge Functions secrets
    keyId: 'your-bridge-key-id',
    zoneUrl: 'https://eu2.make.com',
    organizationId: 1234567
  }
});

// Now use the bridge client
const templates = await bridge.getTemplates();
const user = await bridge.createUser({ email, name });

Environment Variables (Node.js only)

For traditional Node.js projects, add these to your .env file:

# Supabase Configuration
SUPABASE_URL=your-supabase-url
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key

# Make Bridge Configuration
MAKE_BRIDGE_SECRET_KEY=your-bridge-secret
MAKE_BRIDGE_KEY_ID=your-bridge-key-id
MAKE_BRIDGE_ZONE_URL=https://eu2.make.com
MAKE_BRIDGE_ORGANIZATION_ID=1234567

Database Setup

The SDK requires specific Supabase tables to function properly. Create these tables in your Supabase project:

1. Users Table

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email TEXT UNIQUE NOT NULL,
  name TEXT NOT NULL,
  fname TEXT,
  lname TEXT,
  extname TEXT,
  make_customer_id INTEGER,
  make_organization_id INTEGER,
  make_operations_limit INTEGER,
  make_transfer_limit INTEGER,
  make_consumed_operations INTEGER DEFAULT 0,
  make_consumed_transfer INTEGER DEFAULT 0,
  make_is_paused BOOLEAN DEFAULT false,
  make_synced_at TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

-- Create indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_make_customer_id ON users(make_customer_id);

2. Make Templates Table

CREATE TABLE make_templates (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  make_template_id INTEGER NOT NULL,
  public_version_id TEXT NOT NULL,
  name TEXT NOT NULL,
  description TEXT,
  category TEXT,
  trigger_events TEXT[],
  configuration_schema JSONB,
  webhook_config JSONB,
  metadata JSONB,
  is_active BOOLEAN NOT NULL DEFAULT true,
  synced_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

-- Create indexes
CREATE INDEX idx_make_templates_public_version_id ON make_templates(public_version_id);
CREATE INDEX idx_make_templates_make_template_id ON make_templates(make_template_id);
CREATE INDEX idx_make_templates_category ON make_templates(category);
CREATE INDEX idx_make_templates_is_active ON make_templates(is_active);

3. User Automations Table

CREATE TABLE user_automations (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  template_id UUID NOT NULL REFERENCES make_templates(id) ON DELETE RESTRICT,
  public_version_id TEXT NOT NULL,
  flow_id TEXT NOT NULL,
  scenario_id TEXT,
  wizard_url TEXT,
  status TEXT NOT NULL DEFAULT 'initializing',
  webhook_data TEXT,
  configuration JSONB,
  created_components JSONB,
  completed_at TIMESTAMP WITH TIME ZONE,
  last_synced_at TIMESTAMP WITH TIME ZONE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

-- Create indexes
CREATE INDEX idx_user_automations_user_id ON user_automations(user_id);
CREATE INDEX idx_user_automations_template_id ON user_automations(template_id);
CREATE INDEX idx_user_automations_flow_id ON user_automations(flow_id);
CREATE INDEX idx_user_automations_scenario_id ON user_automations(scenario_id);
CREATE INDEX idx_user_automations_status ON user_automations(status);

4. Automation Logs Table (Optional - for monitoring)

CREATE TABLE automation_logs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  automation_id UUID REFERENCES user_automations(id) ON DELETE CASCADE,
  execution_id TEXT,
  event_type TEXT,
  event_data JSONB,
  status TEXT NOT NULL,
  input_data JSONB,
  output_data JSONB,
  error_message TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);

-- Create indexes
CREATE INDEX idx_automation_logs_automation_id ON automation_logs(automation_id);
CREATE INDEX idx_automation_logs_status ON automation_logs(status);
CREATE INDEX idx_automation_logs_event_type ON automation_logs(event_type);

Row Level Security (RLS)

Enable RLS and create policies for your application:

-- Enable RLS
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE make_templates ENABLE ROW LEVEL SECURITY;
ALTER TABLE user_automations ENABLE ROW LEVEL SECURITY;
ALTER TABLE automation_logs ENABLE ROW LEVEL SECURITY;

-- Example policies (customize based on your auth requirements)
CREATE POLICY "Public read access for make_templates" ON make_templates
  FOR SELECT USING (is_active = true);

CREATE POLICY "Users can read their own data" ON users
  FOR SELECT USING (auth.uid() = id);

CREATE POLICY "Users can read their own automations" ON user_automations
  FOR SELECT USING (user_id = auth.uid());

๐Ÿ“š Core Features

User Management

// Create a new user
const user = await bridge.createUser({
  email: 'user@example.com',
  name: 'John Doe',
  firstName: 'John',
  lastName: 'Doe'
});

// Get user by email or ID
const user = await bridge.getUser('user@example.com');

// Delete user (removes from both Supabase and Make Bridge)
const result = await bridge.deleteUser('user@example.com');

Template Management

// Get available automation templates
const templates = await bridge.getTemplates();

// Filter by category
const emailTemplates = await bridge.getTemplates('email');

// Sync templates from Make Bridge
await bridge.syncTemplates();

Automation Initialization

// Initialize automation for a user
const automation = await bridge.initializeAutomation({
  templateId: '2800',
  userId: user.id,
  userName: user.name,
  config: {
    autoActivate: true,
    autoFinalize: true,
    scenarioName: 'My Custom Automation'
  }
});

console.log('Wizard URL:', automation.wizardUrl);
console.log('Flow ID:', automation.flowId);

Triggering Automations

// Trigger an automation with event data
const result = await bridge.triggerAutomation({
  templateId: '2800',
  userId: user.id,
  eventType: 'user_signup',
  eventData: {
    userId: user.id,
    email: user.email,
    signupDate: new Date().toISOString()
  }
});

โš›๏ธ React Integration

Hooks for Lovable Projects

import { 
  useBridgeAutomation, 
  useBridgeTemplates, 
  useBridgeUser 
} from '@chklff/bridge-lovable-sdk';

function AutomationDashboard({ user, bridgeClient }) {
  const {
    automations,
    loading,
    error,
    initializeAutomation,
    triggerAutomation
  } = useBridgeAutomation(bridgeClient, user.id);

  const {
    templates,
    syncTemplates,
    filterByCategory
  } = useBridgeTemplates(bridgeClient);

  const handleCreateAutomation = async (templateId) => {
    await initializeAutomation({
      templateId,
      userName: user.name
    });
  };

  return (
    <div>
      <h2>Your Automations</h2>
      {loading && <p>Loading...</p>}
      {error && <p className="error">{error}</p>}
      
      <div className="templates">
        {templates.map(template => (
          <div key={template.id} className="template-card">
            <h3>{template.name}</h3>
            <p>{template.description}</p>
            <button onClick={() => handleCreateAutomation(template.publicVersionId)}>
              Create Automation
            </button>
          </div>
        ))}
      </div>
      
      <div className="automations">
        {automations.map(automation => (
          <div key={automation.id} className="automation-card">
            <h4>{automation.name}</h4>
            <span className={`status ${automation.status}`}>
              {automation.status}
            </span>
          </div>
        ))}
      </div>
    </div>
  );
}

Template Selector Component

import { useBridgeTemplates } from '@chklff/bridge-lovable-sdk';

function TemplateSelector({ bridgeClient, onSelectTemplate }) {
  const {
    templates,
    loading,
    searchTemplates,
    getTemplatesByCategory
  } = useBridgeTemplates(bridgeClient);

  const [searchQuery, setSearchQuery] = useState('');
  const filteredTemplates = searchTemplates(searchQuery);
  const categorizedTemplates = getTemplatesByCategory();

  return (
    <div className="template-selector">
      <input
        type="text"
        placeholder="Search templates..."
        value={searchQuery}
        onChange={(e) => setSearchQuery(e.target.value)}
      />
      
      {searchQuery ? (
        <div className="search-results">
          {filteredTemplates.map(template => (
            <TemplateCard 
              key={template.id} 
              template={template} 
              onSelect={onSelectTemplate} 
            />
          ))}
        </div>
      ) : (
        <div className="categories">
          {Object.entries(categorizedTemplates).map(([category, templates]) => (
            <div key={category} className="category">
              <h3>{category}</h3>
              {templates.map(template => (
                <TemplateCard 
                  key={template.id} 
                  template={template} 
                  onSelect={onSelectTemplate} 
                />
              ))}
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

๐Ÿ› ๏ธ Advanced Usage

Custom Configuration

import { BridgeSDK } from '@chklff/bridge-lovable-sdk';

const bridge = new BridgeSDK({
  supabase: {
    url: process.env.SUPABASE_URL,
    serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY
  },
  makebridge: {
    secretKey: process.env.MAKE_BRIDGE_SECRET_KEY,
    keyId: process.env.MAKE_BRIDGE_KEY_ID,
    zoneUrl: process.env.MAKE_BRIDGE_ZONE_URL,
    organizationId: Number(process.env.MAKE_BRIDGE_ORGANIZATION_ID)
  }
});

Error Handling

try {
  const automation = await bridge.initializeAutomation({
    templateId: '2800',
    userId: user.id,
    userName: user.name
  });
} catch (error) {
  if (error.message.includes('Template not found')) {
    console.error('Template does not exist');
  } else if (error.message.includes('User not found')) {
    console.error('User needs to be created first');
  } else {
    console.error('Automation failed:', error.message);
  }
}

Analytics and Monitoring

// Get automation analytics
const analytics = await bridge.getAnalytics();
console.log('Total executions:', analytics.totalExecutions);
console.log('Success rate:', analytics.successfulExecutions / analytics.totalExecutions);

// Get analytics for specific template
const templateAnalytics = await bridge.getAnalytics('2800');

// Get analytics for specific user
const userAnalytics = await bridge.getAnalytics(null, user.id);

Webhook Management

// Get user's webhook URLs
const webhooks = await bridge.getUserWebhooks(user.id);
webhooks.forEach(webhook => {
  console.log(`${webhook.name}: ${webhook.url}`);
});

// Check automation flow completion
const completion = await bridge.checkFlowCompletion(flowId, user.id);
if (completion.isComplete) {
  console.log('Automation setup complete!');
}

๐ŸŽฏ TypeScript Support

Full TypeScript support with comprehensive type definitions:

import { 
  BridgeSDK, 
  BridgeConfiguration, 
  AutomationTemplate, 
  BridgeUser 
} from '@chklff/bridge-lovable-sdk';

const config: BridgeConfiguration = {
  supabase: {
    url: process.env.SUPABASE_URL!,
    serviceRoleKey: process.env.SUPABASE_SERVICE_ROLE_KEY!
  },
  makebridge: {
    secretKey: process.env.MAKE_BRIDGE_SECRET_KEY!,
    keyId: process.env.MAKE_BRIDGE_KEY_ID!,
    zoneUrl: process.env.MAKE_BRIDGE_ZONE_URL!,
    organizationId: Number(process.env.MAKE_BRIDGE_ORGANIZATION_ID!)
  }
};

const bridge = new BridgeSDK(config);

const user: BridgeUser = await bridge.createUser({
  email: 'user@example.com',
  name: 'John Doe'
});

โœ… Testing & Validation

Before using the SDK, run the health check to ensure everything is configured correctly:

# Run comprehensive health check
npx @chklff/bridge-lovable-sdk health-check

# Validate environment variables only
npx @chklff/bridge-lovable-sdk validate-env

This will test:

  • โœ… Environment variables
  • โœ… Supabase connection and tables
  • โœ… Make Bridge API access
  • โœ… Template synchronization
  • โœ… User creation functionality

Quick Setup Validation

  1. Install the latest working version:

    npm install @chklff/bridge-lovable-sdk@latest
  2. Set up environment variables (see Database Setup section above)

  3. Run health check:

    npx @chklff/bridge-lovable-sdk health-check
  4. If health check fails, see TROUBLESHOOTING.md for solutions

Common Issues

  • "Template sync fails" โ†’ Check Make Bridge credentials and organization ID
  • "Database tables not found" โ†’ Run the SQL setup scripts in Supabase
  • "Environment variables missing" โ†’ Create .env file with all required variables
  • "Permission denied" โ†’ Use Service Role Key, not anon key for Supabase

๐Ÿ“š Full troubleshooting guide: TROUBLESHOOTING.md

๐Ÿงช CLI Tools

The SDK includes powerful CLI tools for development and testing:

# Health & Validation
npx @chklff/bridge-lovable-sdk health-check
npx @chklff/bridge-lovable-sdk validate-env

# User Management
npx @chklff/bridge-lovable-sdk create-user test@example.com "Test User"
npx @chklff/bridge-lovable-sdk delete-user test@example.com

# Template Management
npx @chklff/bridge-lovable-sdk sync-enhanced
npx @chklff/bridge-lovable-sdk sync-status
npx @chklff/bridge-lovable-sdk lifecycle-stats

# Automation
npx @chklff/bridge-lovable-sdk init-template 2800 test@example.com

๐Ÿ“ Project Structure

@chklff/bridge-lovable-sdk/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ lib/
โ”‚   โ”‚   โ”œโ”€โ”€ bridge-sdk.js           # Main SDK class
โ”‚   โ”‚   โ”œโ”€โ”€ client-factory.js       # Quick initialization
โ”‚   โ”‚   โ”œโ”€โ”€ integrations/           # Make Bridge & Supabase
โ”‚   โ”‚   โ”œโ”€โ”€ templates/              # Template management
โ”‚   โ”‚   โ”œโ”€โ”€ users/                  # User management
โ”‚   โ”‚   โ””โ”€โ”€ utils/                  # Utilities & validation
โ”‚   โ”œโ”€โ”€ react/                      # React hooks
โ”‚   โ”œโ”€โ”€ types/                      # TypeScript definitions
โ”‚   โ””โ”€โ”€ cli/                        # CLI tools
โ”œโ”€โ”€ examples/                       # Usage examples
โ””โ”€โ”€ docs/                          # Documentation

๐Ÿ”ง Development

# Install dependencies
npm install

# Run CLI in development
npm run dev

# Build for production
npm run build

# Run tests
npm test

# Lint code
npm run lint

๐Ÿ“– Examples

Check out the /examples directory for complete integration examples:

๐Ÿค Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“„ License

This project is licensed under the BSD-3-Clause License - see the LICENSE file for details.

๐Ÿ†˜ Support


Built with โค๏ธ for the Lovable community

1.0.9

8 months ago

1.0.8

8 months ago

1.0.7

8 months ago

1.0.6

8 months ago

1.0.5

8 months ago

1.0.4

8 months ago

1.0.3

8 months ago

1.0.2

8 months ago

1.0.1

8 months ago

1.0.0

8 months ago