microfox
Version:
Universal CLI tool for creating modern TypeScript packages with npm availability checking
1 lines • 8.96 kB
Source Map (JSON)
{"version":3,"sources":["../src/commands/track-ci.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { glob } from 'glob';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { pathToFileURL } from 'url';\nimport yaml from 'js-yaml';\nimport { findUp } from 'find-up';\n\nexport const trackCi = new Command('track-ci')\n .description('Generate GitHub Actions workflows from tracker scripts.')\n .action(async () => {\n console.log(chalk.cyan('Generating GitHub Actions workflow...'));\n const projectRoot = process.cwd();\n\n const trackerFiles = await glob('**/__track__/**/*.tracker.ts', {\n cwd: projectRoot,\n ignore: '**/node_modules/**',\n });\n\n if (trackerFiles.length === 0) {\n console.log(chalk.yellow('No tracker files found to generate workflows from.'));\n return;\n }\n\n const workflow: any = {\n name: 'Automated Trackers',\n on: {},\n jobs: {},\n };\n\n for (const trackerPath of trackerFiles) {\n try {\n const fullTrackerPath = path.resolve(projectRoot, trackerPath);\n const trackerModule = await import(pathToFileURL(fullTrackerPath).href);\n const tracker = trackerModule.default;\n\n if (tracker && tracker.config && tracker.config.github) {\n const jobName = tracker.config.github.name.replace(/\\s+/g, '-').toLowerCase();\n const { on } = tracker.config.github;\n\n // --- MERGE TRIGGERS (logic is the same) ---\n for (const key of Object.keys(on)) {\n if (key === 'schedule') {\n workflow.on.schedule = [...(workflow.on.schedule || []), ...on[key]];\n } else {\n if (!workflow.on[key]) workflow.on[key] = {};\n if (on[key].branches) {\n workflow.on[key].branches = [...(workflow.on[key].branches || []), ...on[key].branches];\n }\n if (on[key].paths) {\n workflow.on[key].paths = [...(workflow.on[key].paths || []), ...on[key].paths];\n }\n }\n }\n // --- End Merging ---\n\n // --- GENERATE PRECISE 'IF' CONDITION FOR THE JOB ---\n const conditions: string[] = [];\n if (on.push) {\n conditions.push(\"github.event_name == 'push'\");\n }\n if (on.pull_request) {\n conditions.push(\"github.event_name == 'pull_request'\");\n }\n if (on.schedule) {\n on.schedule.forEach((s:any) => {\n conditions.push(`github.event.schedule == '${s.cron}'`);\n });\n }\n const ifCondition = conditions.join(' || ');\n // --- END 'IF' CONDITION ---\n\n // Define the job, now with the precise conditional\n workflow.jobs[jobName] = {\n 'if': ifCondition,\n 'runs-on': 'ubuntu-latest',\n steps: [\n { name: 'Checkout Code', uses: 'actions/checkout@v4' },\n { name: 'Setup Node.js', uses: 'actions/setup-node@v4', with: { 'node-version': '20' } },\n { name: 'Install Dependencies', run: 'npm install' },\n { name: 'Run Tracker', run: `npx microfox track --file ${trackerPath}` }, // Assumes microfox is available\n ],\n };\n console.log(chalk.green(` Added job: ${tracker.config.github.name} with condition: \"${ifCondition}\"`));\n }\n } catch (error) {\n console.error(chalk.red(` Failed to process tracker ${trackerPath}:`), error);\n }\n }\n \n // --- Safer Cleanup and Deduplication ---\n if (workflow.on.push) {\n if (workflow.on.push.branches) workflow.on.push.branches = [...new Set(workflow.on.push.branches)];\n if (workflow.on.push.paths) workflow.on.push.paths = [...new Set(workflow.on.push.paths)];\n if (workflow.on.push.branches?.length === 0) delete workflow.on.push.branches;\n if (workflow.on.push.paths?.length === 0) delete workflow.on.push.paths;\n if (Object.keys(workflow.on.push).length === 0) delete workflow.on.push;\n }\n if (workflow.on.pull_request) {\n if (workflow.on.pull_request.branches) workflow.on.pull_request.branches = [...new Set(workflow.on.pull_request.branches)];\n if (workflow.on.pull_request.paths) workflow.on.pull_request.paths = [...new Set(workflow.on.pull_request.paths)];\n if (workflow.on.pull_request.branches?.length === 0) delete workflow.on.pull_request.branches;\n if (workflow.on.pull_request.paths?.length === 0) delete workflow.on.pull_request.paths;\n if (Object.keys(workflow.on.pull_request).length === 0) delete workflow.on.pull_request;\n }\n if (workflow.on.schedule?.length === 0) delete workflow.on.schedule;\n // --- End Cleanup ---\n\n const workflowYaml = yaml.dump(workflow);\n \n // --- INTELLIGENT OUTPUT PATH DISCOVERY ---\n let githubDir = await findUp('.github', { type: 'directory' });\n if (!githubDir) {\n // If not found, create it at the project root\n githubDir = path.resolve(projectRoot, '.github');\n console.log(chalk.yellow('Could not find .github directory. Creating one at project root.'));\n }\n const outputPath = path.resolve(githubDir, 'workflows', 'trackers.yml');\n // --- END DISCOVERY ---\n \n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, workflowYaml);\n \n console.log(chalk.cyan(`\\nSuccessfully generated workflow at ${outputPath}`));\n }); "],"mappings":"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","names":[]}