Advanced Usage and Future Features: GitLab MR Extractor Deep Dive (Part 3)
Welcome to the final part of our series on gitlab-mr-extractor
. In Parts 1 and
2, we covered the why and how. Now, let's look at some advanced usage patterns
and what's coming next.
Advanced Usage Patterns
1. Analyzing Change Patterns
One cool thing you can do is analyze what kind of changes are happening in your codebase:
tsx
const extractor = new GitLabMergeRequestExtractor({ baseUrl: 'https://gitlab.com', privateToken: process.env.GITLAB_TOKEN, projectId: 'your-project-id', }) // Get all merge requests const mergeRequests = await extractor.extractMergeRequests() // Analyze changes by file type const changesByFileType = mergeRequests.reduce((acc, mr) => { mr.changes.forEach(change => { const extension = change.new_path.split('.').pop() || 'unknown' acc[extension] = (acc[extension] || 0) + change.changes.length }) return acc }, {}) console.log('Changes by file type:', changesByFileType)
2. Custom Export Formats
The library supports JSON and CSV out of the box, but you can create custom exporters:
tsx
class CustomExporter { static export(mergeRequests) { return mergeRequests.map(mr => ({ id: mr.iid, title: mr.title, changes: mr.changes.reduce( (total, change) => total + change.changes.length, 0, ), author: mr.author.name, merged_at: new Date(mr.merged_at).toLocaleDateString(), })) } } const data = CustomExporter.export(mergeRequests)
3. Filtering and Searching
Need to find specific changes? No problem:
tsx
// Find all changes to package.json files const packageChanges = mergeRequests.filter(mr => mr.changes.some(change => change.new_path.includes('package.json')), ) // Find security-related changes const securityChanges = mergeRequests.filter( mr => mr.title.toLowerCase().includes('security') || mr.description.toLowerCase().includes('security'), )
Real-World Use Cases
1. Code Review Automation
Here's how we use it to automate parts of our review process:
tsx
async function analyzeCodeChanges(mergeRequest) { const riskyPatterns = ['eval(', 'process.env', 'sudo', 'chmod'] const riskyChanges = mergeRequest.changes.filter(change => change.changes.some(c => riskyPatterns.some(pattern => c.content.includes(pattern)), ), ) return { id: mergeRequest.iid, riskyChanges, needsSecurityReview: riskyChanges.length > 0, } }
2. Documentation Updates
We also use it to keep our docs up to date:
tsx
function checkDocumentationNeeds(mergeRequest) { const codeChanges = mergeRequest.changes.filter( c => !c.new_path.includes('docs/'), ) const docChanges = mergeRequest.changes.filter(c => c.new_path.includes('docs/'), ) return { needsDocs: codeChanges.length > 0 && docChanges.length === 0, changedFiles: codeChanges.map(c => c.new_path), } }
Future Features
Here's what's coming in the next releases:
1. AI-Powered Analysis
tsx
// Coming in v2.0 class AIAnalyzer { async analyzeDiff(diff: string) { return { complexity: await this.calculateComplexity(diff), suggestedReviewers: await this.findBestReviewers(diff), securityRisks: await this.assessSecurityRisks(diff), } } }
2. Real-time Webhooks
tsx
// Coming in v1.5 class MergeRequestWebhook { onNewMergeRequest(callback: (mr: MergeRequest) => void) { // Real-time notifications for new MRs } }
3. Custom Rules Engine
tsx
// Coming in v1.4 class RulesEngine { addRule(rule: Rule) { this.rules.push(rule) } async evaluate(mergeRequest: MergeRequest) { return Promise.all(this.rules.map(rule => rule.evaluate(mergeRequest))) } }
Contributing
Want to help build these features? Here's how:
- Check out our GitHub repo
- Look at the issues page
- Pick something that interests you
- Submit a PR!
What's Next?
While this concludes our blog series, development continues! Here's what you can do:
- Try out the library:
npm install gitlab-mr-extractor
- Star us on GitHub
- Report bugs or feature requests
- Join our community
Thanks for reading this series! If you have questions or want to contribute, find me on GitHub or Twitter.
This is Part 3 of a series on gitlab-mr-extractor. Read Part 1 or Part 2