Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
a43114ab61 | |||
1e0ccec03e | |||
e5e0ceee78 | |||
d9ab609039 | |||
aa039e8b5e | |||
f511ab7a63 | |||
1df8064247 | |||
ac1f398422 |
23
changelog.md
23
changelog.md
@ -1,5 +1,28 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2024-12-14 - 1.6.4 - fix(core)
|
||||||
|
Refactor fetch logic to use a unified fetchFunction for API calls
|
||||||
|
|
||||||
|
- Consolidated API request logic in the CodeFeed class to use fetchFunction for improved maintainability.
|
||||||
|
|
||||||
|
## 2024-12-14 - 1.6.3 - fix(codefeed)
|
||||||
|
Refactor and fix formatting issues in the CodeFeed module
|
||||||
|
|
||||||
|
- Refactored various method format and spacing.
|
||||||
|
- Fixed error handling formatting for readability.
|
||||||
|
- Improved consistency in JSON handling for API responses.
|
||||||
|
|
||||||
|
## 2024-12-14 - 1.6.2 - fix(core)
|
||||||
|
Fix sorting order of tagged commits by timestamp
|
||||||
|
|
||||||
|
- Fixed the sorting order of commits to be by timestamp in descending order after filtering for tagged commits.
|
||||||
|
|
||||||
|
## 2024-12-14 - 1.6.1 - fix(docs)
|
||||||
|
Updated project metadata and expanded documentation for installation and usage.
|
||||||
|
|
||||||
|
- Updated description and keywords in package.json and npmextra.json.
|
||||||
|
- Significant expansion of the README.md with detailed installation, usage, and feature instructions.
|
||||||
|
|
||||||
## 2024-12-14 - 1.6.0 - feat(core)
|
## 2024-12-14 - 1.6.0 - feat(core)
|
||||||
Add changelog fetching and parsing functionality
|
Add changelog fetching and parsing functionality
|
||||||
|
|
||||||
|
@ -5,10 +5,23 @@
|
|||||||
"githost": "code.foss.global",
|
"githost": "code.foss.global",
|
||||||
"gitscope": "foss.global",
|
"gitscope": "foss.global",
|
||||||
"gitrepo": "codefeed",
|
"gitrepo": "codefeed",
|
||||||
"description": "a module for creating feeds for code development",
|
"description": "The @foss.global/codefeed module is designed for generating feeds from Gitea repositories, enhancing development workflows by processing commit data and repository activities.",
|
||||||
"npmPackagename": "@foss.global/codefeed",
|
"npmPackagename": "@foss.global/codefeed",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"projectDomain": "foss.global"
|
"projectDomain": "foss.global",
|
||||||
|
"keywords": [
|
||||||
|
"codefeed",
|
||||||
|
"Gitea",
|
||||||
|
"commits",
|
||||||
|
"changelog",
|
||||||
|
"repository",
|
||||||
|
"development tools",
|
||||||
|
"npm",
|
||||||
|
"module",
|
||||||
|
"code analysis",
|
||||||
|
"activity feed",
|
||||||
|
"version control"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmci": {
|
"npmci": {
|
||||||
|
17
package.json
17
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "@foss.global/codefeed",
|
"name": "@foss.global/codefeed",
|
||||||
"version": "1.6.0",
|
"version": "1.6.4",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "a module for creating feeds for code development",
|
"description": "The @foss.global/codefeed module is designed for generating feeds from Gitea repositories, enhancing development workflows by processing commit data and repository activities.",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./dist_ts/index.js",
|
".": "./dist_ts/index.js",
|
||||||
"./interfaces": "./dist_ts/interfaces/index.js"
|
"./interfaces": "./dist_ts/interfaces/index.js"
|
||||||
@ -48,5 +48,18 @@
|
|||||||
"cli.js",
|
"cli.js",
|
||||||
"npmextra.json",
|
"npmextra.json",
|
||||||
"readme.md"
|
"readme.md"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"codefeed",
|
||||||
|
"Gitea",
|
||||||
|
"commits",
|
||||||
|
"changelog",
|
||||||
|
"repository",
|
||||||
|
"development tools",
|
||||||
|
"npm",
|
||||||
|
"module",
|
||||||
|
"code analysis",
|
||||||
|
"activity feed",
|
||||||
|
"version control"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
129
readme.md
129
readme.md
@ -1,7 +1,130 @@
|
|||||||
|
```markdown
|
||||||
# @foss.global/codefeed
|
# @foss.global/codefeed
|
||||||
|
|
||||||
a module for creating feeds for code development
|
A module for creating feeds for code development.
|
||||||
|
|
||||||
## How to create the docs
|
## Install
|
||||||
|
|
||||||
To create docs run gitzone aidoc.
|
To install the `@foss.global/codefeed` package, you can run the following npm command in your project directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @foss.global/codefeed
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensure that you have a compatible version of Node.js installed and that your project is set up to support ECMAScript modules. The `@foss.global/codefeed` module uses ESM syntax.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The `@foss.global/codefeed` package is designed to help developers generate feeds for code developments, specifically targeting Gitea repositories. It fetches and processes commit data, changelogs, and repository activities for further analysis or visualization. Here, we'll delve into how you can utilize the different features of the `CodeFeed` class.
|
||||||
|
|
||||||
|
### Setting Up CodeFeed
|
||||||
|
|
||||||
|
To get started, import the `CodeFeed` class from the module:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { CodeFeed } from '@foss.global/codefeed';
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, create an instance of `CodeFeed`. You'll need the base URL of your Gitea instance and optionally an API token if your repositories require authentication:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const codeFeed = new CodeFeed('https://your-gitea-instance-url.com', 'your-api-token');
|
||||||
|
```
|
||||||
|
|
||||||
|
The constructor can also accept a `lastRunTimestamp` which indicates the last time a sync was performed. If not provided, it defaults to 24 hours prior to the current time.
|
||||||
|
|
||||||
|
### Fetching Commits
|
||||||
|
|
||||||
|
One of the core functionalities of CodeFeed is fetching commits from a Gitea instance. By calling `fetchAllCommitsFromInstance`, you can retrieve commits across multiple repositories:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
const commits = await codeFeed.fetchAllCommitsFromInstance();
|
||||||
|
console.log(commits);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('An error occurred while fetching commits:', error);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
```
|
||||||
|
|
||||||
|
This method scans all organizations and repositories, filters commits tagged within the last 24 hours, and enriches them with metadata like changelogs or npm publication status.
|
||||||
|
|
||||||
|
Each commit object in the resulting array conforms to the `ICommitResult` interface, containing details such as:
|
||||||
|
- `baseUrl`
|
||||||
|
- `org`
|
||||||
|
- `repo`
|
||||||
|
- `timestamp`
|
||||||
|
- `hash`
|
||||||
|
- `commitMessage`
|
||||||
|
- `tagged` (boolean)
|
||||||
|
- `publishedOnNpm` (boolean)
|
||||||
|
- `prettyAgoTime` (human-readable relative time)
|
||||||
|
- `changelog` (text from the `changelog.md` associated with a commit)
|
||||||
|
|
||||||
|
### Understanding the Data Fetch Process
|
||||||
|
|
||||||
|
#### Fetching Organizations
|
||||||
|
|
||||||
|
The `fetchAllOrganizations` method collects all organizations within the Gitea instance:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const organizations = await codeFeed.fetchAllOrganizations();
|
||||||
|
console.log('Organizations:', organizations);
|
||||||
|
```
|
||||||
|
|
||||||
|
This method interacts with the Gitea API to pull organization names, aiding further requests that require organization context.
|
||||||
|
|
||||||
|
#### Fetching Repositories
|
||||||
|
|
||||||
|
Repositories under these organizations can be retrieved using `fetchAllRepositories`:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const repositories = await codeFeed.fetchAllRepositories();
|
||||||
|
console.log('Repositories:', repositories);
|
||||||
|
```
|
||||||
|
|
||||||
|
Here, filtering by organization can help narrow down the scope further when dealing with large instances.
|
||||||
|
|
||||||
|
#### Fetching Tags and Commits
|
||||||
|
|
||||||
|
To handle repository-specific details, use:
|
||||||
|
|
||||||
|
- `fetchTags(owner: string, repo: string)`: Appropriately handles paginated tag data within a repository.
|
||||||
|
|
||||||
|
- `fetchRecentCommitsForRepo(owner: string, repo: string)`: Gathers commit data specific to the past 24 hours for a given repository.
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const tags = await codeFeed.fetchTags('orgName', 'repoName');
|
||||||
|
const recentCommits = await codeFeed.fetchRecentCommitsForRepo('orgName', 'repoName');
|
||||||
|
|
||||||
|
console.log('Tags:', tags);
|
||||||
|
console.log('Recent Commits:', recentCommits);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Changelog Integration
|
||||||
|
|
||||||
|
Loading changelog content from a repository is integrated into the flow with `loadChangelogFromRepo`. This can be accessed when processing specific commits:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
await codeFeed.loadChangelogFromRepo('org', 'repo');
|
||||||
|
const changelog = codeFeed.getChangelogForVersion('1.0.0');
|
||||||
|
console.log('Changelog for version 1.0.0:', changelog);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reacting to Repository Activity
|
||||||
|
|
||||||
|
The method `hasNewActivity` checks for recent changes within an organization or a repository. This is particularly useful for setting up alerting systems or continuous integration triggers:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const hasActivity = await codeFeed.hasNewActivity({ orgName: 'orgName', repoName: 'repoName' });
|
||||||
|
console.log('New activity detected:', hasActivity);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Conclusion
|
||||||
|
|
||||||
|
The `@foss.global/codefeed` module provides robust capabilities for extracting and managing feed data related to code developments in Gitea environments. Through systematic setup and leveraging API-driven methods, it becomes a valuable tool for developers aiming to keep track of software progress and changes efficiently. The integration hooks like changelog and npm verification further enrich its utility, offering consolidated insights into each commit's journey from codebase to published package.
|
||||||
|
|
||||||
|
Explore integrating these capabilities into your development workflows to enhance tracking, deployment pipelines, or analytics systems within your projects. Remember to always handle API tokens securely and adhere to best practices when managing access to repository resources. Stay updated on any changes or enhancements to this module for further feature exposures or bug fixes. Happy coding!
|
||||||
|
```
|
||||||
|
undefined
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@foss.global/codefeed',
|
name: '@foss.global/codefeed',
|
||||||
version: '1.6.0',
|
version: '1.6.4',
|
||||||
description: 'a module for creating feeds for code development'
|
description: 'The @foss.global/codefeed module is designed for generating feeds from Gitea repositories, enhancing development workflows by processing commit data and repository activities.'
|
||||||
}
|
}
|
||||||
|
106
ts/index.ts
106
ts/index.ts
@ -11,7 +11,8 @@ export class CodeFeed {
|
|||||||
constructor(baseUrl: string, token?: string, lastRunTimestamp?: string) {
|
constructor(baseUrl: string, token?: string, lastRunTimestamp?: string) {
|
||||||
this.baseUrl = baseUrl;
|
this.baseUrl = baseUrl;
|
||||||
this.token = token;
|
this.token = token;
|
||||||
this.lastRunTimestamp = lastRunTimestamp || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
this.lastRunTimestamp =
|
||||||
|
lastRunTimestamp || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
||||||
console.log('CodeFeed initialized with last run timestamp:', this.lastRunTimestamp);
|
console.log('CodeFeed initialized with last run timestamp:', this.lastRunTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,16 +20,18 @@ export class CodeFeed {
|
|||||||
* Load the changelog directly from the Gitea repository.
|
* Load the changelog directly from the Gitea repository.
|
||||||
*/
|
*/
|
||||||
private async loadChangelogFromRepo(owner: string, repo: string): Promise<void> {
|
private async loadChangelogFromRepo(owner: string, repo: string): Promise<void> {
|
||||||
const url = `${this.baseUrl}/api/v1/repos/${owner}/${repo}/contents/changelog.md`;
|
const url = `/api/v1/repos/${owner}/${repo}/contents/changelog.md`;
|
||||||
const headers: Record<string, string> = {};
|
const headers: Record<string, string> = {};
|
||||||
if (this.token) {
|
if (this.token) {
|
||||||
headers['Authorization'] = `token ${this.token}`;
|
headers['Authorization'] = `token ${this.token}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(url, { headers });
|
const response = await this.fetchFunction(url, { headers });
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
console.error(`Could not fetch CHANGELOG.md from ${owner}/${repo}: ${response.status} ${response.statusText}`);
|
console.error(
|
||||||
|
`Could not fetch CHANGELOG.md from ${owner}/${repo}: ${response.status} ${response.statusText}`
|
||||||
|
);
|
||||||
this.changelogContent = '';
|
this.changelogContent = '';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -77,8 +80,8 @@ export class CodeFeed {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async fetchAllOrganizations(): Promise<string[]> {
|
private async fetchAllOrganizations(): Promise<string[]> {
|
||||||
const url = `${this.baseUrl}/api/v1/orgs`;
|
const url = `/api/v1/orgs`;
|
||||||
const response = await fetch(url, {
|
const response = await this.fetchFunction(url, {
|
||||||
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -91,21 +94,23 @@ export class CodeFeed {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async fetchOrgRssFeed(optionsArg: {
|
private async fetchOrgRssFeed(optionsArg: {
|
||||||
orgName: string,
|
orgName: string;
|
||||||
repoName?: string,
|
repoName?: string;
|
||||||
}): Promise<any[]> {
|
}): Promise<any[]> {
|
||||||
let rssUrl: string;
|
let rssUrl: string;
|
||||||
if (optionsArg.orgName && !optionsArg.repoName) {
|
if (optionsArg.orgName && !optionsArg.repoName) {
|
||||||
rssUrl = `${this.baseUrl}/${optionsArg.orgName}.atom`;
|
rssUrl = `/${optionsArg.orgName}.atom`;
|
||||||
} else if (optionsArg.orgName && optionsArg.repoName) {
|
} else if (optionsArg.orgName && optionsArg.repoName) {
|
||||||
rssUrl = `${this.baseUrl}/${optionsArg.orgName}/${optionsArg.repoName}.atom`;
|
rssUrl = `/${optionsArg.orgName}/${optionsArg.repoName}.atom`;
|
||||||
} else {
|
} else {
|
||||||
throw new Error('Invalid arguments provided to fetchOrgRssFeed.');
|
throw new Error('Invalid arguments provided to fetchOrgRssFeed.');
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(rssUrl);
|
const response = await this.fetchFunction(rssUrl, {});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`Failed to fetch RSS feed for organization ${optionsArg.orgName}/${optionsArg.repoName}: ${response.statusText}`);
|
throw new Error(
|
||||||
|
`Failed to fetch RSS feed for organization ${optionsArg.orgName}/${optionsArg.repoName}: ${response.statusText}`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const rssText = await response.text();
|
const rssText = await response.text();
|
||||||
@ -114,8 +119,8 @@ export class CodeFeed {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async hasNewActivity(optionsArg: {
|
private async hasNewActivity(optionsArg: {
|
||||||
orgName: string,
|
orgName: string;
|
||||||
repoName?: string,
|
repoName?: string;
|
||||||
}): Promise<boolean> {
|
}): Promise<boolean> {
|
||||||
const entries = await this.fetchOrgRssFeed(optionsArg);
|
const entries = await this.fetchOrgRssFeed(optionsArg);
|
||||||
|
|
||||||
@ -130,12 +135,10 @@ export class CodeFeed {
|
|||||||
const allRepos: plugins.interfaces.IRepository[] = [];
|
const allRepos: plugins.interfaces.IRepository[] = [];
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const url = new URL(`${this.baseUrl}/api/v1/repos/search`);
|
const url = `/api/v1/repos/search?limit=50&page=${page.toString()}`;
|
||||||
url.searchParams.set('limit', '50');
|
|
||||||
url.searchParams.set('page', page.toString());
|
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await this.fetchFunction(url, {
|
||||||
headers: this.token ? { 'Authorization': `token ${this.token}` } : {},
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
@ -159,16 +162,16 @@ export class CodeFeed {
|
|||||||
const tags: plugins.interfaces.ITag[] = [];
|
const tags: plugins.interfaces.ITag[] = [];
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/tags`);
|
const url = `/api/v1/repos/${owner}/${repo}/tags?limit=50&page=${page.toString()}`;
|
||||||
url.searchParams.set('limit', '50');
|
|
||||||
url.searchParams.set('page', page.toString());
|
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await this.fetchFunction(url, {
|
||||||
headers: this.token ? { 'Authorization': `token ${this.token}` } : {},
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
console.error(`Failed to fetch tags for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url.href}`);
|
console.error(
|
||||||
|
`Failed to fetch tags for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url}`
|
||||||
|
);
|
||||||
throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`);
|
throw new Error(`Failed to fetch tags for ${owner}/${repo}: ${resp.statusText}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,22 +194,25 @@ export class CodeFeed {
|
|||||||
return taggedCommitShas;
|
return taggedCommitShas;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async fetchRecentCommitsForRepo(owner: string, repo: string): Promise<plugins.interfaces.ICommit[]> {
|
private async fetchRecentCommitsForRepo(
|
||||||
|
owner: string,
|
||||||
|
repo: string
|
||||||
|
): Promise<plugins.interfaces.ICommit[]> {
|
||||||
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: plugins.interfaces.ICommit[] = [];
|
const recentCommits: plugins.interfaces.ICommit[] = [];
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const url = new URL(`${this.baseUrl}/api/v1/repos/${owner}/${repo}/commits`);
|
const url = `/api/v1/repos/${owner}/${repo}/commits?limit=50&page=${page.toString()}`;
|
||||||
url.searchParams.set('limit', '50');
|
|
||||||
url.searchParams.set('page', page.toString());
|
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await this.fetchFunction(url, {
|
||||||
headers: this.token ? { 'Authorization': `token ${this.token}` } : {},
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
console.error(`Failed to fetch commits for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url.href}`);
|
console.error(
|
||||||
|
`Failed to fetch commits for ${owner}/${repo}: ${resp.status} ${resp.statusText} at ${url}`
|
||||||
|
);
|
||||||
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
|
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +271,10 @@ export class CodeFeed {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error(`Error fetching activity for repository ${orgName}/${r.name}:`, error.message);
|
console.error(
|
||||||
|
`Error fetching activity for repository ${orgName}/${r.name}:`,
|
||||||
|
error.message
|
||||||
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,12 +295,14 @@ export class CodeFeed {
|
|||||||
org,
|
org,
|
||||||
repo,
|
repo,
|
||||||
timestamp: c.commit.author.date,
|
timestamp: c.commit.author.date,
|
||||||
prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(new Date(c.commit.author.date).getTime()),
|
prettyAgoTime: plugins.smarttime.getMilliSecondsAsHumanReadableAgoTime(
|
||||||
|
new Date(c.commit.author.date).getTime()
|
||||||
|
),
|
||||||
hash: c.sha,
|
hash: c.sha,
|
||||||
commitMessage: c.commit.message,
|
commitMessage: c.commit.message,
|
||||||
tagged: taggedCommitShas.has(c.sha),
|
tagged: taggedCommitShas.has(c.sha),
|
||||||
publishedOnNpm: false,
|
publishedOnNpm: false,
|
||||||
changelog: undefined
|
changelog: undefined,
|
||||||
};
|
};
|
||||||
return commit;
|
return commit;
|
||||||
});
|
});
|
||||||
@ -306,15 +317,23 @@ export class CodeFeed {
|
|||||||
});
|
});
|
||||||
if (correspondingVersion) {
|
if (correspondingVersion) {
|
||||||
commitResult.publishedOnNpm = true;
|
commitResult.publishedOnNpm = true;
|
||||||
const changelogEntry = this.getChangelogForVersion(versionCandidate);
|
|
||||||
if (changelogEntry) {
|
|
||||||
commitResult.changelog = changelogEntry;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error(`Failed to fetch package info for ${org}/${repo}:`, error.message);
|
console.error(`Failed to fetch package info for ${org}/${repo}:`, error.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (const commitResult of commitResults.filter((c) => c.tagged)) {
|
||||||
|
const versionCandidate = commitResult.commitMessage.replace('\n', '').trim();
|
||||||
|
const changelogEntry = this.getChangelogForVersion(versionCandidate);
|
||||||
|
if (changelogEntry) {
|
||||||
|
commitResult.changelog = changelogEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error(`Failed to fetch changelog info for ${org}/${repo}:`, error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allCommits.push(...commitResults);
|
allCommits.push(...commitResults);
|
||||||
@ -326,7 +345,9 @@ export class CodeFeed {
|
|||||||
|
|
||||||
console.log(`Processed ${allCommits.length} commits in total.`);
|
console.log(`Processed ${allCommits.length} commits in total.`);
|
||||||
|
|
||||||
allCommits = allCommits.filter(commitArg => commitArg.tagged);
|
allCommits = allCommits
|
||||||
|
.filter((commitArg) => commitArg.tagged)
|
||||||
|
.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
||||||
|
|
||||||
console.log(`Filtered to ${allCommits.length} commits with tagged statuses.`);
|
console.log(`Filtered to ${allCommits.length} commits with tagged statuses.`);
|
||||||
|
|
||||||
@ -342,4 +363,9 @@ export class CodeFeed {
|
|||||||
|
|
||||||
return allCommits;
|
return allCommits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async fetchFunction(urlArg: string, optionsArg: RequestInit): Promise<Response> {
|
||||||
|
const response = await fetch(`${this.baseUrl}${urlArg}`, optionsArg);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user