Skip to content
Back to skills

Conditional Generation

ASecurity

Determines which files and dependencies to generate based on application type (standalone vs micro-frontend). Controls conditional features.

  • 666 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added February 8, 2026
developmentjavascriptjavavuetestingfrontend

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill conditional-generation --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Conditional Generation?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Conditional Generation
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-conditional-generation/badge)](https://www.skillsdirectory.com/skills/majiayu000-conditional-generation)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: conditional-generation
description: Determines which files and dependencies to generate based on application type (standalone vs micro-frontend). Controls conditional features.
---

# Conditional File Generation Skill

## Purpose
Determine which files, dependencies, and environment variables to include based on the application type (standalone vs micro-frontend).

## When to Use
Execute this skill after configuration is loaded and before file generation (Step 6 in AGENT_INSTRUCTIONS.md).

## Input Parameters
From configuration:
- `application_type` - Either `"standalone"` or `"micro-frontend"`
- `is_standalone` - Boolean derived from application_type
- `is_microfrontend` - Boolean derived from application_type
- `enable_single_spa` - Boolean flag for single-spa integration

## Key Differences: Standalone vs Micro-Frontend

| Feature | Micro-Frontend | Standalone |
|---------|---------------|------------|
| `.env.standalone` | ✅ Create | ❌ Skip |
| `single-spa-vue` dependency | ✅ Include | ❌ Skip |
| `serve` npm script | `npm-run-all --parallel build:watch dev lint:init:watch` | `vite serve --port {port} --mode standalone` |
| `VITE_LAUNCHER_APP_URL` | ✅ Include | ❌ Skip |
| `launcherAppUrl` in EnvConsts | ✅ Export | ❌ Skip |
| main.ts template | single-spa lifecycle | Simple mount |
| index.html mount | `#single-spa-application:...` | `#app` |
| Build format | `system` (SystemJS) | `es` (ES modules) |
| Router base | `/scoped-path` | `/` (typically) |

## Instructions

### Step 1: Auto-Correct Inconsistent Configuration

```javascript
// Validate and auto-correct enable_single_spa for standalone apps
if (userConfig.is_standalone && userConfig.enable_single_spa) {
  console.warn('⚠️  Warning: Standalone apps typically do not use single-spa.');
  console.warn('   Auto-correcting: enable_single_spa = false\n');
  userConfig.enable_single_spa = false;
}

// Validate and ensure enable_single_spa is true for micro-frontends
if (userConfig.is_microfrontend && !userConfig.enable_single_spa) {
  console.warn('⚠️  Warning: Micro-frontend apps require single-spa.');
  console.warn('   Auto-correcting: enable_single_spa = true\n');
  userConfig.enable_single_spa = true;
}
```

### Step 2: Determine Files to Generate

```javascript
// Files that should ONLY be created for micro-frontend applications
const conditionalFiles = {
  '.env.standalone': userConfig.is_microfrontend
};

// Create a helper function
function shouldGenerateFile(filename) {
  if (filename in conditionalFiles) {
    return conditionalFiles[filename];
  }
  return true;  // Generate by default
}
```

### Step 3: Determine Dependencies to Include

```javascript
// Dependencies that should ONLY be included for micro-frontend applications
const conditionalDependencies = {
  'single-spa-vue': userConfig.is_microfrontend
};

// Create a helper function
function shouldIncludeDependency(dependencyName) {
  if (dependencyName in conditionalDependencies) {
    return conditionalDependencies[dependencyName];
  }
  return true;  // Include by default
}
```

### Step 4: Determine Environment Variables to Include

```javascript
// Environment variables that should ONLY be included for micro-frontend applications
const conditionalEnvVars = {
  'VITE_LAUNCHER_APP_URL': userConfig.is_microfrontend,
  'launcherAppUrl': userConfig.is_microfrontend  // For EnvConsts.ts
};

// Create a helper function
function shouldIncludeEnvVar(varName) {
  if (varName in conditionalEnvVars) {
    return conditionalEnvVars[varName];
  }
  return true;  // Include by default
}
```

### Step 5: Select Appropriate Templates

```javascript
// Determine which template to use for each file
const templates = {
  'main.ts': userConfig.is_microfrontend 
    ? 'main-microfrontend.ts' 
    : 'main-standalone.ts',
    
  'EnvConsts.ts': userConfig.is_microfrontend
    ? 'EnvConsts-microfrontend.ts'
    : 'EnvConsts-standalone.ts',
    
  'index.html': userConfig.is_microfrontend
    ? 'index-microfrontend.html'
    : 'index-standalone.html'
};

// Helper function
function getTemplate(filename) {
  return templates[filename] || filename;
}
```

### Step 6: Configure Build Settings

```javascript
// Set vite build format based on application type
userConfig.vite_build_format = userConfig.is_microfrontend ? 'system' : 'es';

// Set default router base based on application type
if (!userConfig.router_base_path) {
  userConfig.router_base_path = userConfig.is_microfrontend 
    ? `/${userConfig.application_name.replace('-web', '')}`
    : '/';
}
```

### Step 7: Display Conditional Generation Summary

```javascript
console.log('\n' + '─'.repeat(60));
console.log('  CONDITIONAL FILE GENERATION');
console.log('─'.repeat(60));
console.log(`Application Type:  ${userConfig.application_type}`);
console.log(`Build Format:      ${userConfig.vite_build_format}`);
console.log(`Single-SPA:        ${userConfig.enable_single_spa ? 'Enabled' : 'Disabled'}`);

if (userConfig.is_microfrontend) {
  console.log('\nMicro-Frontend Files:');
  console.log('  ✓ .env.standalone');
  console.log('  ✓ main.ts (single-spa lifecycle)');
  console.log('  ✓ EnvConsts.ts (with launcherAppUrl)');
  console.log('  ✓ Dependencies: single-spa-vue');
} else {
  console.log('\nStandalone App Files:');
  console.log('  ✗ .env.standalone (skipped)');
  console.log('  ✓ main.ts (simple mount)');
  console.log('  ✓ EnvConsts.ts (without launcherAppUrl)');
  console.log('  ✗ single-spa-vue (skipped)');
}

console.log('─'.repeat(60) + '\n');
```

## Output

### For Micro-Frontend Applications

**Files Created:**
- `.env.standalone` ✅
- `main.ts` (with single-spa lifecycle) ✅
- `EnvConsts.ts` (with launcherAppUrl) ✅
- `index.html` (with #single-spa-application:...) ✅

**Dependencies Added:**
- `single-spa-vue` ✅

**Environment Variables:**
- `VITE_LAUNCHER_APP_URL` ✅

**Build Configuration:**
- `vite_build_format`: `"system"`

### For Standalone Applications

**Files Created:**
- `.env.standalone` ❌ (skipped)
- `main.ts` (simple mount) ✅
- `EnvConsts.ts` (without launcherAppUrl) ✅
- `index.html` (with #app) ✅

**Dependencies Added:**
- `single-spa-vue` ❌ (skipped)

**Environment Variables:**
- `VITE_LAUNCHER_APP_URL` ❌ (skipped)

**Build Configuration:**
- `vite_build_format`: `"es"`

## Decision Flow Diagram

```
User sets application_type
    │
    ├─── "micro-frontend" ────┐
    │                         │
    │                         ▼
    │                   Create .env.standalone
    │                   Include single-spa-vue
    │                   Add VITE_LAUNCHER_APP_URL
    │                   Use main-microfrontend.ts
    │                   Export launcherAppUrl
    │                   Set enable_single_spa = true
    │                   Use #single-spa-application:... mount
    │                   Build format = "system"
    │
    └─── "standalone" ────────┐
                              │
                              ▼
                        Skip .env.standalone
                        Skip single-spa-vue
                        Skip VITE_LAUNCHER_APP_URL
                        Use main-standalone.ts
                        Skip launcherAppUrl
                        Set enable_single_spa = false
                        Use #app mount
                        Build format = "es"
```

## Validation Rules

### Auto-Correction Rules

1. **Standalone + enable_single_spa = true**
   - Auto-correct to `enable_single_spa = false`
   - Show warning to user

2. **Micro-frontend + enable_single_spa = false**
   - Auto-correct to `enable_single_spa = true`
   - Show warning to user

### Consistency Checks

```javascript
// Validate configuration consistency
function validateConditionalGeneration(config) {
  const issues = [];
  
  // Check 1: Standalone should not have single-spa
  if (config.is_standalone && config.enable_single_spa) {
    issues.push('Standalone apps should not use single-spa');
    config.enable_single_spa = false;  // Auto-fix
  }
  
  // Check 2: Micro-frontend requires single-spa
  if (config.is_microfrontend && !config.enable_single_spa) {
    issues.push('Micro-frontend apps require single-spa');
    config.enable_single_spa = true;  // Auto-fix
  }
  
  // Check 3: Build format matches app type
  if (config.is_microfrontend && config.vite_build_format !== 'system') {
    issues.push('Micro-frontend should use "system" build format');
    config.vite_build_format = 'system';  // Auto-fix
  }
  
  if (config.is_standalone && config.vite_build_format !== 'es') {
    issues.push('Standalone should use "es" build format');
    config.vite_build_format = 'es';  // Auto-fix
  }
  
  // Display issues and fixes
  if (issues.length > 0) {
    console.warn('\n⚠️  Configuration Auto-Corrections:');
    issues.forEach(issue => console.warn(`   - ${issue}`));
    console.warn('');
  }
  
  return config;
}
```

## Integration with Skills

### Affects env-standalone Skill
- Micro-frontend: Generate file
- Standalone: Skip file

### Affects main-entry Skill
- Micro-frontend: Use template with single-spa lifecycle
- Standalone: Use template with simple mount

### Affects env-constants Skill
- Micro-frontend: Include launcherAppUrl export
- Standalone: Exclude launcherAppUrl export

### Affects index-html Skill
- Micro-frontend: Use `#single-spa-application:{app-name}` mount point
- Standalone: Use `#app` mount point

### Affects package-json Skill
- Micro-frontend: Include single-spa-vue dependency
- Standalone: Exclude single-spa-vue dependency
- Micro-frontend: `serve` script = `"npm-run-all --parallel build:watch dev lint:init:watch"`
- Standalone: `serve` script = `"vite serve --port {{default_port}} --mode standalone"`

### Affects vite-config Skill
- Micro-frontend: Set build.lib.formats = ['system']
- Standalone: Set build.lib.formats = ['es']

## Related Skills
- **configuration**: Provides application_type and derived flags
- **env-standalone**: Conditionally generated file
- **main-entry**: Uses different templates
- **env-constants**: Uses different templates
- **index-html**: Uses different mount points
- **package-json**: Includes different dependencies
- **vite-config**: Uses different build formats

## Testing Checklist

- [ ] Generate micro-frontend → Verify .env.standalone exists
- [ ] Generate standalone → Verify .env.standalone does NOT exist
- [ ] Check micro-frontend main.ts → Has single-spa lifecycle
- [ ] Check standalone main.ts → Simple createApp and mount
- [ ] Check micro-frontend EnvConsts.ts → Has launcherAppUrl
- [ ] Check standalone EnvConsts.ts → NO launcherAppUrl
- [ ] Check micro-frontend package.json → Has single-spa-vue
- [ ] Check standalone package.json → NO single-spa-vue
- [ ] Verify auto-correction when enable_single_spa conflicts with standalone
- [ ] Verify auto-correction when enable_single_spa missing for micro-frontend
- [ ] Check micro-frontend vite.config.ts → format: 'system'
- [ ] Check standalone vite.config.ts → format: 'es'

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.