You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.7 KiB
93 lines
2.7 KiB
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Types Checksum Generation Script
|
|
*
|
|
* Generates and commits a checksum of TypeScript definition files
|
|
* to catch accidental API changes.
|
|
*
|
|
* @author Matthew Raymer
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const { execSync } = require('child_process');
|
|
|
|
const TYPES_CHECKSUM_FILE = path.join(__dirname, '..', 'types-checksum.txt');
|
|
const DIST_TYPES_DIR = path.join(__dirname, '..', 'dist', 'esm');
|
|
|
|
/**
|
|
* Generate checksum of all TypeScript definition files
|
|
* @returns {string} Checksum of all .d.ts files
|
|
*/
|
|
function generateTypesChecksum() {
|
|
try {
|
|
if (!fs.existsSync(DIST_TYPES_DIR)) {
|
|
console.error('❌ Dist types directory not found. Run "npm run build" first.');
|
|
process.exit(1);
|
|
}
|
|
|
|
// Get all .d.ts files in dist/esm
|
|
const typeFiles = execSync(`find "${DIST_TYPES_DIR}" -name "*.d.ts" -type f`, { encoding: 'utf8' })
|
|
.trim()
|
|
.split('\n')
|
|
.filter(file => file.length > 0);
|
|
|
|
if (typeFiles.length === 0) {
|
|
console.warn('⚠️ No TypeScript definition files found in dist/esm');
|
|
return '';
|
|
}
|
|
|
|
console.log(`📁 Found ${typeFiles.length} TypeScript definition files:`);
|
|
typeFiles.forEach(file => console.log(` ${file}`));
|
|
|
|
// Generate checksum of all type files
|
|
const checksum = execSync(`cat ${typeFiles.join(' ')} | shasum -a 256`, { encoding: 'utf8' })
|
|
.trim()
|
|
.split(' ')[0];
|
|
|
|
return checksum;
|
|
} catch (error) {
|
|
console.error('Error generating types checksum:', error.message);
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate and commit types checksum
|
|
*/
|
|
function generateAndCommitChecksum() {
|
|
console.log('🔍 Generating types checksum...');
|
|
|
|
const checksum = generateTypesChecksum();
|
|
|
|
if (!checksum) {
|
|
console.error('❌ Could not generate types checksum');
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(`📝 Generated checksum: ${checksum}`);
|
|
|
|
// Write checksum to file
|
|
const checksumContent = `${checksum}\n# Generated on ${new Date().toISOString()}\n# Files: dist/esm/**/*.d.ts\n`;
|
|
fs.writeFileSync(TYPES_CHECKSUM_FILE, checksumContent);
|
|
|
|
console.log(`💾 Written checksum to ${TYPES_CHECKSUM_FILE}`);
|
|
|
|
// Check if file is already committed
|
|
try {
|
|
execSync(`git ls-files --error-unmatch "${TYPES_CHECKSUM_FILE}"`, { stdio: 'ignore' });
|
|
console.log('✅ Types checksum file is already tracked by git');
|
|
} catch (error) {
|
|
// File is not tracked, add it
|
|
console.log('📝 Adding types checksum file to git...');
|
|
execSync(`git add "${TYPES_CHECKSUM_FILE}"`);
|
|
console.log('✅ Types checksum file added to git');
|
|
}
|
|
|
|
console.log('✅ Types checksum generation complete');
|
|
}
|
|
|
|
// Run the generation
|
|
generateAndCommitChecksum();
|
|
|