feat(core): Refactor TypeScript interfaces and improve module exports

This commit is contained in:
Philipp Kunz 2024-12-14 00:30:35 +01:00
parent 470f4fe730
commit 5d0d125e43
7 changed files with 76 additions and 59 deletions

View File

@ -1,5 +1,12 @@
# Changelog # Changelog
## 2024-12-14 - 1.5.0 - feat(core)
Refactor TypeScript interfaces and improve module exports
- Moved TypeScript interfaces to a dedicated file (ts/interfaces/index.ts).
- Updated import/export structure to improve code readability and maintainability.
- Enhanced the package.json to utilize a module exports field for better resolution.
## 2024-12-13 - 1.4.1 - fix(core) ## 2024-12-13 - 1.4.1 - fix(core)
Corrected log formatting for commit information output in CodeFeed Corrected log formatting for commit information output in CodeFeed

View File

@ -3,8 +3,10 @@
"version": "1.4.1", "version": "1.4.1",
"private": false, "private": false,
"description": "a module for creating feeds for code development", "description": "a module for creating feeds for code development",
"main": "dist_ts/index.js", "exports": {
"typings": "dist_ts/index.d.ts", ".": "./dist_ts/index.js",
"./interfaces": "./dist_ts/interfaces/index.js"
},
"type": "module", "type": "module",
"author": "Task Venture Capital GmbH", "author": "Task Venture Capital GmbH",
"license": "MIT", "license": "MIT",

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@foss.global/codefeed', name: '@foss.global/codefeed',
version: '1.4.1', version: '1.5.0',
description: 'a module for creating feeds for code development' description: 'a module for creating feeds for code development'
} }

View File

@ -1,3 +1,10 @@
// module
import * as interfaces from './interfaces/index.js';
export {
interfaces,
}
// @push.rocks // @push.rocks
import * as qenv from '@push.rocks/qenv'; import * as qenv from '@push.rocks/qenv';
import * as smartnpm from '@push.rocks/smartnpm'; import * as smartnpm from '@push.rocks/smartnpm';

View File

@ -1,49 +1,5 @@
import * as plugins from './codefeed.plugins.js'; import * as plugins from './codefeed.plugins.js';
interface RepositoryOwner {
login: string;
}
interface Repository {
owner: RepositoryOwner;
name: string;
}
interface CommitAuthor {
date: string;
}
interface CommitDetail {
message: string;
author: CommitAuthor;
}
interface Commit {
sha: string;
commit: CommitDetail;
}
interface Tag {
commit?: {
sha?: string;
};
}
interface RepoSearchResponse {
data: Repository[];
}
export interface CommitResult {
baseUrl: string;
org: string;
repo: string;
timestamp: string;
hash: string;
commitMessage: string;
tagged: boolean;
publishedOnNpm: boolean;
prettyAgoTime: string;
}
export class CodeFeed { export class CodeFeed {
private baseUrl: string; private baseUrl: string;
@ -123,9 +79,9 @@ export class CodeFeed {
/** /**
* Fetch all repositories accessible to the token/user. * Fetch all repositories accessible to the token/user.
*/ */
private async fetchAllRepositories(): Promise<Repository[]> { private async fetchAllRepositories(): Promise<plugins.interfaces.Repository[]> {
let page = 1; let page = 1;
const allRepos: Repository[] = []; const allRepos: plugins.interfaces.Repository[] = [];
while (true) { while (true) {
const url = new URL(`${this.baseUrl}/api/v1/repos/search`); const url = new URL(`${this.baseUrl}/api/v1/repos/search`);
@ -140,7 +96,7 @@ export class CodeFeed {
throw new Error(`Failed to fetch repositories: ${resp.statusText}`); throw new Error(`Failed to fetch repositories: ${resp.statusText}`);
} }
const data: RepoSearchResponse = await resp.json(); const data: plugins.interfaces.RepoSearchResponse = await resp.json();
allRepos.push(...data.data); allRepos.push(...data.data);
if (data.data.length < 50) { if (data.data.length < 50) {
@ -157,7 +113,7 @@ export class CodeFeed {
*/ */
private async fetchTags(owner: string, repo: string): Promise<Set<string>> { private async fetchTags(owner: string, repo: string): Promise<Set<string>> {
let page = 1; let page = 1;
const tags: Tag[] = []; const tags: plugins.interfaces.Tag[] = [];
while (true) { while (true) {
const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/tags`); const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/tags`);
@ -173,7 +129,7 @@ export class CodeFeed {
throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`); throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`);
} }
const data: Tag[] = await resp.json(); const data: plugins.interfaces.Tag[] = await resp.json();
tags.push(...data); tags.push(...data);
if (data.length < 50) { if (data.length < 50) {
@ -195,10 +151,10 @@ export class CodeFeed {
/** /**
* Fetch commits from the last 24 hours for a repository. * Fetch commits from the last 24 hours for a repository.
*/ */
private async fetchRecentCommitsForRepo(owner: string, repo: string): Promise<Commit[]> { private async fetchRecentCommitsForRepo(owner: string, repo: string): Promise<plugins.interfaces.Commit[]> {
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
let page = 1; let page = 1;
const recentCommits: Commit[] = []; const recentCommits: plugins.interfaces.Commit[] = [];
while (true) { while (true) {
const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/commits`); const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/commits`);
@ -214,7 +170,7 @@ export class CodeFeed {
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`); throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
} }
const data: Commit[] = await resp.json(); const data: plugins.interfaces.Commit[] = await resp.json();
if (data.length === 0) { if (data.length === 0) {
break; break;
} }
@ -237,10 +193,10 @@ export class CodeFeed {
/** /**
* Fetch all commits by querying all organizations. * Fetch all commits by querying all organizations.
*/ */
public async fetchAllCommitsFromInstance(): Promise<CommitResult[]> { public async fetchAllCommitsFromInstance(): Promise<plugins.interfaces.CommitResult[]> {
const orgs = await this.fetchAllOrganizations(); const orgs = await this.fetchAllOrganizations();
console.log(`Found ${orgs.length} organizations`); console.log(`Found ${orgs.length} organizations`);
let allCommits: CommitResult[] = []; let allCommits: plugins.interfaces.CommitResult[] = [];
for (const orgName of orgs) { for (const orgName of orgs) {
console.log(`Checking activity for organization: ${orgName}`); console.log(`Checking activity for organization: ${orgName}`);
@ -284,7 +240,7 @@ export class CodeFeed {
const commits = await this.fetchRecentCommitsForRepo(org, repo); const commits = await this.fetchRecentCommitsForRepo(org, repo);
const commitResults = commits.map((c) => { const commitResults = commits.map((c) => {
const commit: CommitResult = { const commit: plugins.interfaces.CommitResult = {
baseUrl: this.baseUrl, baseUrl: this.baseUrl,
org, org,
repo, repo,

44
ts/interfaces/index.ts Normal file
View File

@ -0,0 +1,44 @@
export interface RepositoryOwner {
login: string;
}
export interface Repository {
owner: RepositoryOwner;
name: string;
}
export interface CommitAuthor {
date: string;
}
export interface CommitDetail {
message: string;
author: CommitAuthor;
}
export interface Commit {
sha: string;
commit: CommitDetail;
}
export interface Tag {
commit?: {
sha?: string;
};
}
export interface RepoSearchResponse {
data: Repository[];
}
export interface CommitResult {
baseUrl: string;
org: string;
repo: string;
timestamp: string;
hash: string;
commitMessage: string;
tagged: boolean;
publishedOnNpm: boolean;
prettyAgoTime: string;
}

View File

@ -8,7 +8,8 @@
"esModuleInterop": true, "esModuleInterop": true,
"verbatimModuleSyntax": true, "verbatimModuleSyntax": true,
"baseUrl": ".", "baseUrl": ".",
"paths": {} "paths": {
}
}, },
"exclude": [ "exclude": [
"dist_*/**/*.d.ts" "dist_*/**/*.d.ts"