Skip to content

Examples โ€‹

This section contains practical examples of using ScriptIt for various tasks. Each example demonstrates different features and use cases.

Quick Examples โ€‹

Hello World with Colors โ€‹

The simplest example showcasing colored console output:

javascript
// hello-colors.js
export const description = "Hello world with colored console output";

export async function execute(context) {
  // Use the enhanced console with fallback for colored output
  const console = context.console || global.console;

  console.log('๐Ÿ‘‹ Hello from ScriptIt!');
  console.info('โ„น๏ธ This is an info message');
  console.warn('โš ๏ธ This is a warning');
  console.error('โŒ This is an error');
  console.debug('๐Ÿ› This is debug info');
  
  return { message: 'Hello completed successfully!' };
}

Run with colors:

bash
scriptit exec hello-colors.js

Practical Examples โ€‹

1. Build Script with Colored Output โ€‹

javascript
// build.js
export const description = "Build script with colored console output";

export async function execute(context) {
  const console = context.console || global.console;
  const fs = require('fs');
  const path = require('path');

  console.info('๐Ÿš€ Starting build process...');

  try {
    // Clean dist directory
    console.log('๐Ÿงน Cleaning dist directory');
    if (fs.existsSync('dist')) {
      fs.rmSync('dist', { recursive: true });
    }
    fs.mkdirSync('dist');

    // Copy files
    console.log('๐Ÿ“ Copying source files');
    const files = fs.readdirSync('src');
    files.forEach(file => {
      const srcPath = path.join('src', file);
      const distPath = path.join('dist', file);
      fs.copyFileSync(srcPath, distPath);
      console.debug(`Copied: ${file}`);
    });

    console.log('โœ… Build completed successfully!');
    console.info(`๐Ÿ“ฆ ${files.length} files processed`);
    
    return { success: true, filesProcessed: files.length };

  } catch (error) {
    console.error('โŒ Build failed:', error.message);
    throw error;
  }
}

Run the build:

bash
scriptit exec build.js

2. API Testing Script โ€‹

javascript
// api-test.js
export const description = "API testing script with colored output";

export async function execute(context) {
  const console = context.console || global.console;

  console.info('๐ŸŒ Starting API tests...');
  
  const endpoints = [
    'https://jsonplaceholder.typicode.com/posts/1',
    'https://jsonplaceholder.typicode.com/users/1',
    'https://jsonplaceholder.typicode.com/comments?postId=1'
  ];

  const results = [];

  for (const endpoint of endpoints) {
    try {
      console.log(`๐Ÿ“ก Testing: ${endpoint}`);
      
      const response = await fetch(endpoint);
      
      if (response.ok) {
        const data = await response.json();
        console.log(`โœ… Success (${response.status})`);
        console.debug('Response keys:', Object.keys(data));
        results.push({ endpoint, status: 'success', code: response.status });
      } else {
        console.warn(`โš ๏ธ Warning: ${response.status} ${response.statusText}`);
        results.push({ endpoint, status: 'warning', code: response.status });
      }
      
    } catch (error) {
      console.error(`โŒ Failed: ${error.message}`);
      results.push({ endpoint, status: 'error', error: error.message });
    }
  }
  
  console.info('๐Ÿ API tests completed');
  return { results, totalTests: endpoints.length };
}

3. File Processing Script โ€‹

javascript
// process-files.js
export const description = "File processing script with statistics";

export async function execute(context) {
  const console = context.console || global.console;
  const fs = require('fs');
  const path = require('path');

  // Get directory from context parameters or use current directory
  const directory = context.env.TARGET_DIR || '.';
  
  console.info(`๐Ÿ“‚ Processing files in: ${directory}`);
  
  try {
    const files = fs.readdirSync(directory);
    console.log(`Found ${files.length} files`);
    
    const stats = {
      total: 0,
      javascript: 0,
      typescript: 0,
      json: 0,
      other: 0
    };
    
    files.forEach(file => {
      const ext = path.extname(file).toLowerCase();
      stats.total++;
      
      switch (ext) {
        case '.js':
          stats.javascript++;
          console.debug(`๐Ÿ“„ JavaScript: ${file}`);
          break;
        case '.ts':
          stats.typescript++;
          console.debug(`๐Ÿ“˜ TypeScript: ${file}`);
          break;
        case '.json':
          stats.json++;
          console.debug(`๐Ÿ“‹ JSON: ${file}`);
          break;
        default:
          stats.other++;
          console.debug(`๐Ÿ“„ Other: ${file}`);
      }
    });
    
    console.log('๐Ÿ“Š File Statistics:');
    console.info(`  JavaScript: ${stats.javascript}`);
    console.info(`  TypeScript: ${stats.typescript}`);
    console.info(`  JSON: ${stats.json}`);
    console.info(`  Other: ${stats.other}`);
    console.log(`  Total: ${stats.total}`);
    
    return stats;
    
  } catch (error) {
    console.error('โŒ Error processing files:', error.message);
    throw error;
  }
}

Run with environment variable:

bash
TARGET_DIR=src scriptit exec process-files.js

4. Environment Configuration Script โ€‹

javascript
// setup-env.js
export const description = "Environment setup script";

export async function execute(context) {
  const console = context.console || global.console;
  const fs = require('fs');

  console.info('โš™๏ธ Setting up environment...');
  
  const environments = ['development', 'staging', 'production'];
  const created = [];
  
  environments.forEach(env => {
    const envFile = `.env.${env}`;
    
    if (fs.existsSync(envFile)) {
      console.log(`โœ… Found: ${envFile}`);
    } else {
      console.warn(`โš ๏ธ Missing: ${envFile}`);
      
      // Create template
      const template = `# ${env.toUpperCase()} Environment
NODE_ENV=${env}
API_URL=https://api.${env}.example.com
DEBUG=${env === 'development' ? 'true' : 'false'}
`;
      
      fs.writeFileSync(envFile, template);
      console.log(`๐Ÿ“ Created template: ${envFile}`);
      created.push(envFile);
    }
  });
  
  console.info('๐ŸŽฏ Environment setup completed');
  return { environmentsChecked: environments.length, filesCreated: created };
}

5. Data Validation Script โ€‹

javascript
// validate-data.js
export const description = "Data validation script with detailed reporting";

function validateUser(user) {
  const errors = [];
  
  if (!user.name || user.name.length < 2) {
    errors.push('Name must be at least 2 characters');
  }
  
  if (!user.email || !user.email.includes('@')) {
    errors.push('Valid email is required');
  }
  
  if (!user.age || user.age < 0 || user.age > 150) {
    errors.push('Age must be between 0 and 150');
  }
  
  return errors;
}

export async function execute(context) {
  const console = context.console || global.console;

  console.info('๐Ÿ” Starting data validation...');
  
  const users = [
    { name: 'John Doe', email: 'john@example.com', age: 30 },
    { name: 'J', email: 'invalid-email', age: -5 },
    { name: 'Jane Smith', email: 'jane@example.com', age: 25 },
    { name: '', email: 'test@example.com', age: 200 }
  ];
  
  let validCount = 0;
  let invalidCount = 0;
  const validationResults = [];
  
  users.forEach((user, index) => {
    console.log(`๐Ÿ‘ค Validating user ${index + 1}: ${user.name || 'Unknown'}`);
    
    const errors = validateUser(user);
    
    if (errors.length === 0) {
      console.log('  โœ… Valid');
      validCount++;
      validationResults.push({ user, valid: true });
    } else {
      console.error('  โŒ Invalid:');
      errors.forEach(error => {
        console.warn(`    โ€ข ${error}`);
      });
      invalidCount++;
      validationResults.push({ user, valid: false, errors });
    }
  });
  
  console.info('๐Ÿ“Š Validation Summary:');
  console.log(`  Valid users: ${validCount}`);
  console.error(`  Invalid users: ${invalidCount}`);
  console.log(`  Total processed: ${users.length}`);
  
  return {
    summary: { valid: validCount, invalid: invalidCount, total: users.length },
    results: validationResults
  };
}

Library Usage Examples โ€‹

Basic Library Integration โ€‹

typescript
// lib-example.ts
import { createScriptRunner } from '@glyphtek/scriptit'

async function runScripts() {
  const runner = await createScriptRunner({
    scriptsDir: './scripts',
    tmpDir: './tmp',
    consoleInterception: {
      enabled: true,
      useColors: true
    }
  })

  // Execute a file
  const result = await runner.executeScript('hello-colors.js')
  console.log('Script result:', result)

  // Execute inline code (must have proper structure)
  await runner.executeCode(`
    export async function execute(context) {
      const console = context.console || global.console
      console.log('Running from library!')
      console.info('This will be colored blue')
      return { source: 'library' }
    }
  `)
}

runScripts()

Event Handling โ€‹

typescript
// events-example.ts
import { createScriptRunner } from '@glyphtek/scriptit'

const runner = createScriptRunner({
  consoleInterception: true
})

// Listen to events
runner.on('scriptStart', (scriptPath) => {
  console.log(`๐Ÿš€ Starting: ${scriptPath}`)
})

runner.on('scriptEnd', (scriptPath, exitCode) => {
  if (exitCode === 0) {
    console.log(`โœ… Completed: ${scriptPath}`)
  } else {
    console.error(`โŒ Failed: ${scriptPath} (exit code: ${exitCode})`)
  }
})

runner.on('error', (error) => {
  console.error('๐Ÿ’ฅ Error:', error.message)
})

// Execute script
await runner.executeScript('my-script.js')

Running Examples โ€‹

CLI Examples โ€‹

bash
# Run a single script with colored console
scriptit exec example.js

# Specify runtime
scriptit exec example.js --runtime bun

# With environment variables
TARGET_DIR=src scriptit exec process-files.js

# Interactive TUI (browse and select scripts)
scriptit run

Script Structure Requirements โ€‹

Important: All ScriptIt scripts must export either:

  1. An execute function (traditional pattern):
javascript
export async function execute(context) {
  // Your script logic here
  return result; // optional
}
  1. A default function (default export pattern):
javascript
export default async function(context) {
  // Your script logic here
  return result; // optional
}

Scripts without these functions will fail with an error.

Tips for Better Examples โ€‹

1. Use Descriptive Console Messages โ€‹

javascript
// โœ… Good
export async function execute(context) {
  const console = context.console || global.console;
  console.info('๐Ÿ”„ Processing user data...');
  console.log('โœ… User validation completed');
  console.error('โŒ Database connection failed');
}

// โŒ Less helpful
export async function execute(context) {
  console.log('Processing...');
  console.log('Done');
  console.log('Error');
}

2. Include Context in Logs โ€‹

javascript
// โœ… Good
export async function execute(context) {
  const console = context.console || global.console;
  const orderId = context.env.ORDER_ID;
  const userId = context.env.USER_ID;
  
  console.log('Processing order:', orderId, 'for user:', userId);
  console.error('Payment failed for order:', orderId, 'error:', error.message);
}

// โŒ Less context
export async function execute(context) {
  console.log('Processing order');
  console.error('Payment failed');
}

3. Use Appropriate Log Levels โ€‹

javascript
// โœ… Good usage
export async function execute(context) {
  const console = context.console || global.console;
  
  console.debug('Variable state:', { user, order });  // Development info
  console.info('Cache updated successfully');         // System info
  console.log('User logged in:', username);          // General info
  console.warn('API rate limit approaching');        // Warnings
  console.error('Database connection lost');         // Errors
}

// โŒ Wrong levels
export async function execute(context) {
  console.error('User logged in');                   // Wrong level
  console.log('Critical system failure');           // Wrong level
}

More Examples โ€‹

Contributing Examples โ€‹

Have a great example to share? We'd love to include it! Please:

  1. Create a clear, well-commented example
  2. Include both the script and how to run it
  3. Explain what the example demonstrates
  4. Test it with colored console output
  5. Ensure proper script structure (execute or default function)
  6. Submit a pull request

Check our Contributing Guide for more details.

Released under the MIT License.