Files
usage-statistics/dist/action.js

95 lines
4.4 KiB
JavaScript

import * as core from '@actions/core';
import { collectNpmBatch } from './collectors/npm.js';
import { collectGithubBatch } from './collectors/github.js';
import { collectPowerShellBatch } from './collectors/powershell.js';
import { collectPypiBatch } from './collectors/pypi.js';
import { getInputs, updateRepositoryReadme } from './utils.js';
import { writeFile } from 'fs/promises';
try {
const { npmPackages, githubRepositories, pypiPackages, powershellModules, jsonOutputPath, updateReadme, commitMessage, readmePath, } = getInputs();
// Debug logs are only output if the `ACTIONS_STEP_DEBUG` secret is true
core.debug(`NPM Packages: ${npmPackages.join(', ')}`);
core.debug(`GitHub Repositories: ${githubRepositories.join(', ')}`);
core.debug(`PyPI Packages: ${pypiPackages.join(', ')}`);
core.debug(`PowerShell Modules: ${powershellModules.join(', ')}`);
core.debug(``);
core.debug(`JSON Output Path: ${jsonOutputPath}`);
core.debug(`Update README: ${updateReadme}`);
core.debug(`Commit Message: ${commitMessage}`);
// Track which platforms are being used
const platformsTracked = [];
if (npmPackages.length > 0)
platformsTracked.push('NPM');
if (githubRepositories.length > 0)
platformsTracked.push('GitHub');
if (pypiPackages.length > 0)
platformsTracked.push('PyPI');
if (powershellModules.length > 0)
platformsTracked.push('PowerShell');
core.debug(`Platforms to track: ${platformsTracked.join(', ')}`);
core.info(`Successfully configured usage statistics tracker for ${platformsTracked.length} platforms`);
const metricPromises = [];
const metrics = [];
for (const platform of platformsTracked) {
core.info(`Collecting ${platform} metrics...`);
switch (platform) {
case 'NPM':
console.log(`Collecting NPM metrics for ${npmPackages.join(', ')}`);
console.time(`Collecting NPM metrics`);
metricPromises.push(collectNpmBatch(npmPackages).then(results => {
console.timeEnd(`Collecting NPM metrics`);
return results;
}));
break;
case 'GitHub':
console.log(`Collecting GitHub metrics for ${githubRepositories.join(', ')}`);
console.time(`Collecting GitHub metrics`);
metricPromises.push(collectGithubBatch(githubRepositories).then(results => {
console.timeEnd(`Collecting GitHub metrics`);
return results;
}));
break;
case 'PyPI':
console.log(`Collecting PyPI metrics for ${pypiPackages.join(', ')}`);
console.time(`Collecting PyPI metrics`);
metricPromises.push(collectPypiBatch(pypiPackages).then(results => {
console.timeEnd(`Collecting PyPI metrics`);
return results;
}));
break;
case 'PowerShell':
console.log(`Collecting PowerShell metrics for ${powershellModules.join(', ')}`);
console.time(`Collecting PowerShell metrics`);
metricPromises.push(collectPowerShellBatch(powershellModules).then(results => {
console.timeEnd(`Collecting PowerShell metrics`);
return results;
}));
break;
}
}
console.log('All metrics collecting started');
const metricResults = await Promise.all(metricPromises);
metrics.push(...metricResults.flat());
console.log('All metrics collecting completed');
if (updateReadme) {
console.log('Updating repository readme...');
await updateRepositoryReadme(metrics, readmePath);
}
console.log('Repository readme updated');
// Persist full result set to JSON for downstream consumption
try {
await writeFile(jsonOutputPath, JSON.stringify(metrics, null, 2), 'utf8');
core.setOutput('json-output', jsonOutputPath);
console.log(`Wrote metrics JSON to ${jsonOutputPath}`);
}
catch (writeErr) {
console.warn(`Failed to write metrics JSON to ${jsonOutputPath}:`, writeErr);
}
core.setOutput('commit-message', commitMessage);
}
catch (error) {
// Fail the workflow run if an error occurs
if (error instanceof Error)
core.setFailed(error.message);
}