Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
470f4fe730 | |||
daeb38c91c | |||
9b46b0d46e | |||
46bd0a2486 | |||
d23a27eb66 | |||
96ed35e953 | |||
e3b51414a9 | |||
7b1e9ed072 | |||
27dc4dd6aa | |||
76c662356e | |||
c1e15ab47c | |||
19ecb3f9a5 |
35
changelog.md
35
changelog.md
@ -1,5 +1,40 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.4.1 - fix(core)
|
||||||
|
Corrected log formatting for commit information output in CodeFeed
|
||||||
|
|
||||||
|
- Fixed formatting issue in commit log output within the CodeFeed class to ensure proper display of timestamps.
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.4.0 - feat(CodeFeed)
|
||||||
|
Enhance commit results with human-readable time
|
||||||
|
|
||||||
|
- Integrated smarttime plugin to calculate and format timestamps into human-readable time.
|
||||||
|
- Updated dependencies in package.json to include smarttime and adjusted versions for existing packages.
|
||||||
|
- Improved fetchAllCommitsFromInstance method to display formatted time ago information for each commit.
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.3.0 - feat(core)
|
||||||
|
Export CommitResult interface for external use.
|
||||||
|
|
||||||
|
- Changed CommitResult from a local interface to an exported interface, allowing for external usage and integration.
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.2.1 - fix(core)
|
||||||
|
No changes detected
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.2.0 - feat(core)
|
||||||
|
Add organization-level activity fetching and RSS parsing
|
||||||
|
|
||||||
|
- Integrated smartxml package for XML parsing.
|
||||||
|
- Implemented fetching of all organizations within a Gitea instance.
|
||||||
|
- Added functionality to check new activities in organization RSS feeds.
|
||||||
|
- Enhanced fetching logic to include repository commits and tags.
|
||||||
|
|
||||||
|
## 2024-12-13 - 1.1.0 - feat(core)
|
||||||
|
Add tracking of commits published on npm
|
||||||
|
|
||||||
|
- Introduced a check for published commits on npm using smartnpm.
|
||||||
|
- Enhanced fetchAllCommitsFromInstance to include 'publishedOnNpm' status in results.
|
||||||
|
|
||||||
## 2024-12-13 - 1.0.2 - fix(core)
|
## 2024-12-13 - 1.0.2 - fix(core)
|
||||||
Improve error handling in fetchRecentCommitsForRepo method
|
Improve error handling in fetchRecentCommitsForRepo method
|
||||||
|
|
||||||
|
11
package.json
11
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@foss.global/codefeed",
|
"name": "@foss.global/codefeed",
|
||||||
"version": "1.0.2",
|
"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",
|
"main": "dist_ts/index.js",
|
||||||
@ -10,7 +10,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(tstest test/ --web)",
|
"test": "(tstest test/ --web)",
|
||||||
"build": "(tsbuild --web --allowimplicitany)",
|
"build": "(tsbuild tsfolders --web --allowimplicitany)",
|
||||||
"buildDocs": "(tsdoc)"
|
"buildDocs": "(tsdoc)"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -19,10 +19,13 @@
|
|||||||
"@git.zone/tsrun": "^1.2.46",
|
"@git.zone/tsrun": "^1.2.46",
|
||||||
"@git.zone/tstest": "^1.0.44",
|
"@git.zone/tstest": "^1.0.44",
|
||||||
"@push.rocks/tapbundle": "^5.0.15",
|
"@push.rocks/tapbundle": "^5.0.15",
|
||||||
"@types/node": "^20.8.7"
|
"@types/node": "^22.10.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/qenv": "^6.1.0"
|
"@push.rocks/qenv": "^6.1.0",
|
||||||
|
"@push.rocks/smartnpm": "^2.0.4",
|
||||||
|
"@push.rocks/smarttime": "^4.1.1",
|
||||||
|
"@push.rocks/smartxml": "^1.0.8"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
139
pnpm-lock.yaml
generated
139
pnpm-lock.yaml
generated
@ -11,6 +11,15 @@ importers:
|
|||||||
'@push.rocks/qenv':
|
'@push.rocks/qenv':
|
||||||
specifier: ^6.1.0
|
specifier: ^6.1.0
|
||||||
version: 6.1.0
|
version: 6.1.0
|
||||||
|
'@push.rocks/smartnpm':
|
||||||
|
specifier: ^2.0.4
|
||||||
|
version: 2.0.4
|
||||||
|
'@push.rocks/smarttime':
|
||||||
|
specifier: ^4.1.1
|
||||||
|
version: 4.1.1
|
||||||
|
'@push.rocks/smartxml':
|
||||||
|
specifier: ^1.0.8
|
||||||
|
version: 1.0.8
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@git.zone/tsbuild':
|
'@git.zone/tsbuild':
|
||||||
specifier: ^2.1.25
|
specifier: ^2.1.25
|
||||||
@ -28,8 +37,8 @@ importers:
|
|||||||
specifier: ^5.0.15
|
specifier: ^5.0.15
|
||||||
version: 5.5.3(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/credential-providers@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)))(socks@2.8.3)
|
version: 5.5.3(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/credential-providers@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)))(socks@2.8.3)
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^20.8.7
|
specifier: ^22.10.2
|
||||||
version: 20.17.10
|
version: 22.10.2
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@ -836,8 +845,8 @@ packages:
|
|||||||
'@push.rocks/smartstring@4.0.15':
|
'@push.rocks/smartstring@4.0.15':
|
||||||
resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==}
|
resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==}
|
||||||
|
|
||||||
'@push.rocks/smarttime@4.0.8':
|
'@push.rocks/smarttime@4.1.1':
|
||||||
resolution: {integrity: sha512-He+1ebBowVd8rW+VHZMFmz407xVMQf/JbyKr3s1ozoIlJS1AhZpDvlkzyqLV2tNMP1/cEBeo25ImJN2x1pksBA==}
|
resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==}
|
||||||
|
|
||||||
'@push.rocks/smartunique@3.0.9':
|
'@push.rocks/smartunique@3.0.9':
|
||||||
resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==}
|
resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==}
|
||||||
@ -1385,8 +1394,8 @@ packages:
|
|||||||
'@types/node-forge@1.3.11':
|
'@types/node-forge@1.3.11':
|
||||||
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
|
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
|
||||||
|
|
||||||
'@types/node@20.17.10':
|
'@types/node@22.10.2':
|
||||||
resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==}
|
resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==}
|
||||||
|
|
||||||
'@types/parse5@6.0.3':
|
'@types/parse5@6.0.3':
|
||||||
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==}
|
||||||
@ -1856,9 +1865,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==}
|
resolution: {integrity: sha512-9pSLe+tDJnmNak2JeMkz6ZmTCXP5p6vCxSd4kvDqrTJkqAP62j2uAEIZjf8cPDZIakStujqVzh5Y5MIWH3yYAw==}
|
||||||
engines: {node: '>=6.0'}
|
engines: {node: '>=6.0'}
|
||||||
|
|
||||||
croner@7.0.8:
|
croner@9.0.0:
|
||||||
resolution: {integrity: sha512-4E27J9ZQV9prM9ggU18QGPYPMSblbA9JuGv4Ff3Gk6supX4RszNGQxBgiFBL6wb/L9HuSMpFbQpduMiDRo+z5Q==}
|
resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==}
|
||||||
engines: {node: '>=6.0'}
|
engines: {node: '>=18.0'}
|
||||||
|
|
||||||
cross-fetch@3.1.5:
|
cross-fetch@3.1.5:
|
||||||
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
|
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
|
||||||
@ -1874,6 +1883,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==}
|
resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==}
|
||||||
engines: {node: '>=14.16'}
|
engines: {node: '>=14.16'}
|
||||||
|
|
||||||
|
date-fns@4.1.0:
|
||||||
|
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
|
||||||
|
|
||||||
dayjs@1.11.13:
|
dayjs@1.11.13:
|
||||||
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
|
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
|
||||||
|
|
||||||
@ -3225,6 +3237,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==}
|
resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
parse-ms@4.0.0:
|
||||||
|
resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
parse5@6.0.1:
|
parse5@6.0.1:
|
||||||
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
|
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
|
||||||
|
|
||||||
@ -3316,6 +3332,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==}
|
resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==}
|
||||||
engines: {node: '>=14.16'}
|
engines: {node: '>=14.16'}
|
||||||
|
|
||||||
|
pretty-ms@9.2.0:
|
||||||
|
resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
process-nextick-args@2.0.1:
|
process-nextick-args@2.0.1:
|
||||||
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
|
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
|
||||||
|
|
||||||
@ -3835,8 +3855,8 @@ packages:
|
|||||||
unbzip2-stream@1.4.3:
|
unbzip2-stream@1.4.3:
|
||||||
resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
|
resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
|
||||||
|
|
||||||
undici-types@6.19.8:
|
undici-types@6.20.0:
|
||||||
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
|
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
|
||||||
|
|
||||||
unified@11.0.5:
|
unified@11.0.5:
|
||||||
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
|
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
|
||||||
@ -4104,7 +4124,7 @@ snapshots:
|
|||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smartsitemap': 2.0.3
|
'@push.rocks/smartsitemap': 2.0.3
|
||||||
'@push.rocks/smartstream': 3.2.5
|
'@push.rocks/smartstream': 3.2.5
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
'@push.rocks/taskbuffer': 3.1.7
|
'@push.rocks/taskbuffer': 3.1.7
|
||||||
'@push.rocks/webrequest': 3.0.37
|
'@push.rocks/webrequest': 3.0.37
|
||||||
'@push.rocks/webstore': 2.0.20
|
'@push.rocks/webstore': 2.0.20
|
||||||
@ -5045,7 +5065,7 @@ snapshots:
|
|||||||
'@jest/schemas': 29.6.3
|
'@jest/schemas': 29.6.3
|
||||||
'@types/istanbul-lib-coverage': 2.0.6
|
'@types/istanbul-lib-coverage': 2.0.6
|
||||||
'@types/istanbul-reports': 3.0.4
|
'@types/istanbul-reports': 3.0.4
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/yargs': 17.0.33
|
'@types/yargs': 17.0.33
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
|
|
||||||
@ -5183,7 +5203,7 @@ snapshots:
|
|||||||
'@push.rocks/smartmatch': 2.0.0
|
'@push.rocks/smartmatch': 2.0.0
|
||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
'@types/minimatch': 5.1.2
|
'@types/minimatch': 5.1.2
|
||||||
'@types/symbol-tree': 3.2.5
|
'@types/symbol-tree': 3.2.5
|
||||||
symbol-tree: 3.2.4
|
symbol-tree: 3.2.4
|
||||||
@ -5293,7 +5313,7 @@ snapshots:
|
|||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smartstring': 4.0.15
|
'@push.rocks/smartstring': 4.0.15
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
'@push.rocks/smartunique': 3.0.9
|
'@push.rocks/smartunique': 3.0.9
|
||||||
'@push.rocks/taskbuffer': 3.1.7
|
'@push.rocks/taskbuffer': 3.1.7
|
||||||
'@tsclass/tsclass': 4.2.0
|
'@tsclass/tsclass': 4.2.0
|
||||||
@ -5486,7 +5506,7 @@ snapshots:
|
|||||||
'@push.rocks/smartpath': 5.0.18
|
'@push.rocks/smartpath': 5.0.18
|
||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
'@push.rocks/smartrequest': 2.0.23
|
'@push.rocks/smartrequest': 2.0.23
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
'@push.rocks/smartversion': 3.0.5
|
'@push.rocks/smartversion': 3.0.5
|
||||||
package-json: 8.1.1
|
package-json: 8.1.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -5609,7 +5629,7 @@ snapshots:
|
|||||||
'@push.rocks/smartlog': 3.0.7
|
'@push.rocks/smartlog': 3.0.7
|
||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
engine.io: 6.5.4
|
engine.io: 6.5.4
|
||||||
socket.io: 4.7.5
|
socket.io: 4.7.5
|
||||||
socket.io-client: 4.7.5
|
socket.io-client: 4.7.5
|
||||||
@ -5663,15 +5683,16 @@ snapshots:
|
|||||||
strip-indent: 4.0.0
|
strip-indent: 4.0.0
|
||||||
url: 0.11.4
|
url: 0.11.4
|
||||||
|
|
||||||
'@push.rocks/smarttime@4.0.8':
|
'@push.rocks/smarttime@4.1.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@push.rocks/lik': 6.1.0
|
'@push.rocks/lik': 6.1.0
|
||||||
'@push.rocks/smartdelay': 3.0.5
|
'@push.rocks/smartdelay': 3.0.5
|
||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
croner: 7.0.8
|
croner: 9.0.0
|
||||||
|
date-fns: 4.1.0
|
||||||
dayjs: 1.11.13
|
dayjs: 1.11.13
|
||||||
is-nan: 1.3.2
|
is-nan: 1.3.2
|
||||||
pretty-ms: 8.0.0
|
pretty-ms: 9.2.0
|
||||||
|
|
||||||
'@push.rocks/smartunique@3.0.9':
|
'@push.rocks/smartunique@3.0.9':
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -5712,7 +5733,7 @@ snapshots:
|
|||||||
'@push.rocks/smartrequest': 2.0.23
|
'@push.rocks/smartrequest': 2.0.23
|
||||||
'@push.rocks/smarts3': 2.2.5
|
'@push.rocks/smarts3': 2.2.5
|
||||||
'@push.rocks/smartshell': 3.2.0
|
'@push.rocks/smartshell': 3.2.0
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
expect: 29.7.0
|
expect: 29.7.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@aws-sdk/client-sso-oidc'
|
- '@aws-sdk/client-sso-oidc'
|
||||||
@ -5735,7 +5756,7 @@ snapshots:
|
|||||||
'@push.rocks/smartlog': 3.0.7
|
'@push.rocks/smartlog': 3.0.7
|
||||||
'@push.rocks/smartpromise': 4.0.4
|
'@push.rocks/smartpromise': 4.0.4
|
||||||
'@push.rocks/smartrx': 3.0.7
|
'@push.rocks/smartrx': 3.0.7
|
||||||
'@push.rocks/smarttime': 4.0.8
|
'@push.rocks/smarttime': 4.1.1
|
||||||
'@push.rocks/smartunique': 3.0.9
|
'@push.rocks/smartunique': 3.0.9
|
||||||
|
|
||||||
'@push.rocks/webrequest@3.0.37':
|
'@push.rocks/webrequest@3.0.37':
|
||||||
@ -6320,14 +6341,14 @@ snapshots:
|
|||||||
|
|
||||||
'@types/accepts@1.3.7':
|
'@types/accepts@1.3.7':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/babel__code-frame@7.0.6': {}
|
'@types/babel__code-frame@7.0.6': {}
|
||||||
|
|
||||||
'@types/body-parser@1.19.5':
|
'@types/body-parser@1.19.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/connect': 3.4.38
|
'@types/connect': 3.4.38
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/buffer-json@2.0.3': {}
|
'@types/buffer-json@2.0.3': {}
|
||||||
|
|
||||||
@ -6343,17 +6364,17 @@ snapshots:
|
|||||||
|
|
||||||
'@types/clean-css@4.2.11':
|
'@types/clean-css@4.2.11':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
source-map: 0.6.1
|
source-map: 0.6.1
|
||||||
|
|
||||||
'@types/co-body@6.1.3':
|
'@types/co-body@6.1.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/qs': 6.9.17
|
'@types/qs': 6.9.17
|
||||||
|
|
||||||
'@types/connect@3.4.38':
|
'@types/connect@3.4.38':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/content-disposition@0.5.8': {}
|
'@types/content-disposition@0.5.8': {}
|
||||||
|
|
||||||
@ -6366,11 +6387,11 @@ snapshots:
|
|||||||
'@types/connect': 3.4.38
|
'@types/connect': 3.4.38
|
||||||
'@types/express': 5.0.0
|
'@types/express': 5.0.0
|
||||||
'@types/keygrip': 1.0.6
|
'@types/keygrip': 1.0.6
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/cors@2.8.17':
|
'@types/cors@2.8.17':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/debounce@1.2.4': {}
|
'@types/debounce@1.2.4': {}
|
||||||
|
|
||||||
@ -6384,14 +6405,14 @@ snapshots:
|
|||||||
|
|
||||||
'@types/express-serve-static-core@4.19.6':
|
'@types/express-serve-static-core@4.19.6':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/qs': 6.9.17
|
'@types/qs': 6.9.17
|
||||||
'@types/range-parser': 1.2.7
|
'@types/range-parser': 1.2.7
|
||||||
'@types/send': 0.17.4
|
'@types/send': 0.17.4
|
||||||
|
|
||||||
'@types/express-serve-static-core@5.0.2':
|
'@types/express-serve-static-core@5.0.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/qs': 6.9.17
|
'@types/qs': 6.9.17
|
||||||
'@types/range-parser': 1.2.7
|
'@types/range-parser': 1.2.7
|
||||||
'@types/send': 0.17.4
|
'@types/send': 0.17.4
|
||||||
@ -6416,30 +6437,30 @@ snapshots:
|
|||||||
|
|
||||||
'@types/from2@2.3.5':
|
'@types/from2@2.3.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/fs-extra@11.0.4':
|
'@types/fs-extra@11.0.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/jsonfile': 6.1.4
|
'@types/jsonfile': 6.1.4
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/fs-extra@9.0.13':
|
'@types/fs-extra@9.0.13':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/glob@7.2.0':
|
'@types/glob@7.2.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/minimatch': 5.1.2
|
'@types/minimatch': 5.1.2
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/glob@8.1.0':
|
'@types/glob@8.1.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/minimatch': 5.1.2
|
'@types/minimatch': 5.1.2
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/gunzip-maybe@1.4.2':
|
'@types/gunzip-maybe@1.4.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/hast@3.0.4':
|
'@types/hast@3.0.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6473,7 +6494,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/jsonfile@6.1.4':
|
'@types/jsonfile@6.1.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/keygrip@1.0.6': {}
|
'@types/keygrip@1.0.6': {}
|
||||||
|
|
||||||
@ -6490,7 +6511,7 @@ snapshots:
|
|||||||
'@types/http-errors': 2.0.4
|
'@types/http-errors': 2.0.4
|
||||||
'@types/keygrip': 1.0.6
|
'@types/keygrip': 1.0.6
|
||||||
'@types/koa-compose': 3.2.8
|
'@types/koa-compose': 3.2.8
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/mdast@4.0.4':
|
'@types/mdast@4.0.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6508,11 +6529,11 @@ snapshots:
|
|||||||
|
|
||||||
'@types/node-forge@1.3.11':
|
'@types/node-forge@1.3.11':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/node@20.17.10':
|
'@types/node@22.10.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 6.19.8
|
undici-types: 6.20.0
|
||||||
|
|
||||||
'@types/parse5@6.0.3': {}
|
'@types/parse5@6.0.3': {}
|
||||||
|
|
||||||
@ -6528,19 +6549,19 @@ snapshots:
|
|||||||
|
|
||||||
'@types/s3rver@3.7.4':
|
'@types/s3rver@3.7.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/semver@7.5.8': {}
|
'@types/semver@7.5.8': {}
|
||||||
|
|
||||||
'@types/send@0.17.4':
|
'@types/send@0.17.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/mime': 1.3.5
|
'@types/mime': 1.3.5
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/serve-static@1.15.7':
|
'@types/serve-static@1.15.7':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/http-errors': 2.0.4
|
'@types/http-errors': 2.0.4
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/send': 0.17.4
|
'@types/send': 0.17.4
|
||||||
|
|
||||||
'@types/sinon-chai@3.2.12':
|
'@types/sinon-chai@3.2.12':
|
||||||
@ -6560,11 +6581,11 @@ snapshots:
|
|||||||
|
|
||||||
'@types/tar-stream@2.2.3':
|
'@types/tar-stream@2.2.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/through2@2.0.41':
|
'@types/through2@2.0.41':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/triple-beam@1.3.5': {}
|
'@types/triple-beam@1.3.5': {}
|
||||||
|
|
||||||
@ -6588,7 +6609,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/whatwg-url@8.2.2':
|
'@types/whatwg-url@8.2.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
'@types/webidl-conversions': 7.0.3
|
'@types/webidl-conversions': 7.0.3
|
||||||
|
|
||||||
'@types/which@2.0.2': {}
|
'@types/which@2.0.2': {}
|
||||||
@ -6597,11 +6618,11 @@ snapshots:
|
|||||||
|
|
||||||
'@types/ws@7.4.7':
|
'@types/ws@7.4.7':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/ws@8.5.13':
|
'@types/ws@8.5.13':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
|
|
||||||
'@types/yargs-parser@21.0.3': {}
|
'@types/yargs-parser@21.0.3': {}
|
||||||
|
|
||||||
@ -6611,7 +6632,7 @@ snapshots:
|
|||||||
|
|
||||||
'@types/yauzl@2.10.3':
|
'@types/yauzl@2.10.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@ungap/structured-clone@1.2.1': {}
|
'@ungap/structured-clone@1.2.1': {}
|
||||||
@ -7028,7 +7049,7 @@ snapshots:
|
|||||||
|
|
||||||
croner@5.7.0: {}
|
croner@5.7.0: {}
|
||||||
|
|
||||||
croner@7.0.8: {}
|
croner@9.0.0: {}
|
||||||
|
|
||||||
cross-fetch@3.1.5:
|
cross-fetch@3.1.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -7051,6 +7072,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
type-fest: 2.19.0
|
type-fest: 2.19.0
|
||||||
|
|
||||||
|
date-fns@4.1.0: {}
|
||||||
|
|
||||||
dayjs@1.11.13: {}
|
dayjs@1.11.13: {}
|
||||||
|
|
||||||
debounce@1.2.1: {}
|
debounce@1.2.1: {}
|
||||||
@ -7194,7 +7217,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@types/cookie': 0.4.1
|
'@types/cookie': 0.4.1
|
||||||
'@types/cors': 2.8.17
|
'@types/cors': 2.8.17
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
accepts: 1.3.8
|
accepts: 1.3.8
|
||||||
base64id: 2.0.0
|
base64id: 2.0.0
|
||||||
cookie: 0.4.2
|
cookie: 0.4.2
|
||||||
@ -7886,7 +7909,7 @@ snapshots:
|
|||||||
jest-util@29.7.0:
|
jest-util@29.7.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jest/types': 29.6.3
|
'@jest/types': 29.6.3
|
||||||
'@types/node': 20.17.10
|
'@types/node': 22.10.2
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
ci-info: 3.9.0
|
ci-info: 3.9.0
|
||||||
graceful-fs: 4.2.11
|
graceful-fs: 4.2.11
|
||||||
@ -8683,6 +8706,8 @@ snapshots:
|
|||||||
|
|
||||||
parse-ms@3.0.0: {}
|
parse-ms@3.0.0: {}
|
||||||
|
|
||||||
|
parse-ms@4.0.0: {}
|
||||||
|
|
||||||
parse5@6.0.1: {}
|
parse5@6.0.1: {}
|
||||||
|
|
||||||
parseurl@1.3.3: {}
|
parseurl@1.3.3: {}
|
||||||
@ -8757,6 +8782,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
parse-ms: 3.0.0
|
parse-ms: 3.0.0
|
||||||
|
|
||||||
|
pretty-ms@9.2.0:
|
||||||
|
dependencies:
|
||||||
|
parse-ms: 4.0.0
|
||||||
|
|
||||||
process-nextick-args@2.0.1: {}
|
process-nextick-args@2.0.1: {}
|
||||||
|
|
||||||
progress@2.0.3: {}
|
progress@2.0.3: {}
|
||||||
@ -9380,7 +9409,7 @@ snapshots:
|
|||||||
buffer: 5.7.1
|
buffer: 5.7.1
|
||||||
through: 2.3.8
|
through: 2.3.8
|
||||||
|
|
||||||
undici-types@6.19.8: {}
|
undici-types@6.20.0: {}
|
||||||
|
|
||||||
unified@11.0.5:
|
unified@11.0.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@foss.global/codefeed',
|
name: '@foss.global/codefeed',
|
||||||
version: '1.0.2',
|
version: '1.4.1',
|
||||||
description: 'a module for creating feeds for code development'
|
description: 'a module for creating feeds for code development'
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
// @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 smartxml from '@push.rocks/smartxml';
|
||||||
|
import * as smarttime from '@push.rocks/smarttime';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
qenv,
|
qenv,
|
||||||
|
smartnpm,
|
||||||
|
smartxml,
|
||||||
|
smarttime,
|
||||||
}
|
}
|
175
ts/index.ts
175
ts/index.ts
@ -33,7 +33,7 @@ interface RepoSearchResponse {
|
|||||||
data: Repository[];
|
data: Repository[];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface CommitResult {
|
export interface CommitResult {
|
||||||
baseUrl: string;
|
baseUrl: string;
|
||||||
org: string;
|
org: string;
|
||||||
repo: string;
|
repo: string;
|
||||||
@ -41,18 +41,88 @@ interface CommitResult {
|
|||||||
hash: string;
|
hash: string;
|
||||||
commitMessage: string;
|
commitMessage: string;
|
||||||
tagged: boolean;
|
tagged: boolean;
|
||||||
|
publishedOnNpm: boolean;
|
||||||
|
prettyAgoTime: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CodeFeed {
|
export class CodeFeed {
|
||||||
private baseUrl: string;
|
private baseUrl: string;
|
||||||
private token?: string;
|
private token?: string;
|
||||||
|
private npmRegistry = new plugins.smartnpm.NpmRegistry();
|
||||||
|
private smartxmlInstance = new plugins.smartxml.SmartXml();
|
||||||
|
private lastRunTimestamp: string;
|
||||||
|
|
||||||
constructor(baseUrl: string, token?: string) {
|
constructor(baseUrl: string, token?: string, lastRunTimestamp?: string) {
|
||||||
this.baseUrl = baseUrl;
|
this.baseUrl = baseUrl;
|
||||||
this.token = token;
|
this.token = token;
|
||||||
console.log('CodeFeed initialized');
|
this.lastRunTimestamp = lastRunTimestamp || new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString();
|
||||||
|
console.log('CodeFeed initialized with last run timestamp:', this.lastRunTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch all organizations from the Gitea instance.
|
||||||
|
*/
|
||||||
|
private async fetchAllOrganizations(): Promise<string[]> {
|
||||||
|
const url = `${this.baseUrl}/api/v1/orgs`;
|
||||||
|
const response = await fetch(url, {
|
||||||
|
headers: this.token ? { Authorization: `token ${this.token}` } : {},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to fetch organizations: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data: { username: string }[] = await response.json();
|
||||||
|
return data.map((org) => org.username);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch organization-level activity RSS feed.
|
||||||
|
*/
|
||||||
|
private async fetchOrgRssFeed(optionsArg: {
|
||||||
|
orgName: string,
|
||||||
|
repoName?: string,
|
||||||
|
}): Promise<any[]> {
|
||||||
|
let rssUrl: string
|
||||||
|
if (optionsArg.orgName && !optionsArg.repoName) {
|
||||||
|
rssUrl = `${this.baseUrl}/${optionsArg.orgName}.atom`;
|
||||||
|
} else if (optionsArg.orgName && optionsArg.repoName) {
|
||||||
|
rssUrl = `${this.baseUrl}/${optionsArg.orgName}/${optionsArg.repoName}.atom`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch(rssUrl);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to fetch RSS feed for organization ${optionsArg.orgName}/${optionsArg.repoName}: ${response.statusText}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rssText = await response.text();
|
||||||
|
|
||||||
|
// Parse the Atom feed using fast-xml-parser
|
||||||
|
const rssData = this.smartxmlInstance.parseXmlToObject(rssText);
|
||||||
|
|
||||||
|
// Return the <entry> elements from the feed
|
||||||
|
return rssData.feed.entry || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the organization's RSS feed has any new activities since the last run.
|
||||||
|
*/
|
||||||
|
private async hasNewActivity(optionsArg: {
|
||||||
|
orgName: string,
|
||||||
|
repoName?: string,
|
||||||
|
}): Promise<boolean> {
|
||||||
|
const entries = await this.fetchOrgRssFeed(optionsArg);
|
||||||
|
|
||||||
|
// Filter entries to find new activities since the last run
|
||||||
|
return entries.some((entry: any) => {
|
||||||
|
const updated = new Date(entry.updated);
|
||||||
|
return updated > new Date(this.lastRunTimestamp);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch all repositories accessible to the token/user.
|
||||||
|
*/
|
||||||
private async fetchAllRepositories(): Promise<Repository[]> {
|
private async fetchAllRepositories(): Promise<Repository[]> {
|
||||||
let page = 1;
|
let page = 1;
|
||||||
const allRepos: Repository[] = [];
|
const allRepos: Repository[] = [];
|
||||||
@ -63,7 +133,7 @@ export class CodeFeed {
|
|||||||
url.searchParams.set('page', page.toString());
|
url.searchParams.set('page', page.toString());
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await fetch(url.href, {
|
||||||
headers: this.token ? { 'Authorization': `token ${this.token}` } : {}
|
headers: this.token ? { 'Authorization': `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
@ -82,6 +152,9 @@ export class CodeFeed {
|
|||||||
return allRepos;
|
return allRepos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch all tags for a given repository.
|
||||||
|
*/
|
||||||
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: Tag[] = [];
|
||||||
@ -92,7 +165,7 @@ export class CodeFeed {
|
|||||||
url.searchParams.set('page', page.toString());
|
url.searchParams.set('page', page.toString());
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await fetch(url.href, {
|
||||||
headers: this.token ? { 'Authorization': `token ${this.token}` } : {}
|
headers: this.token ? { 'Authorization': `token ${this.token}` } : {},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
@ -119,6 +192,9 @@ export class CodeFeed {
|
|||||||
return taggedCommitShas;
|
return taggedCommitShas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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<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;
|
||||||
@ -126,12 +202,13 @@ export class CodeFeed {
|
|||||||
|
|
||||||
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`);
|
||||||
url.searchParams.set('limit', '1');
|
url.searchParams.set('limit', '50');
|
||||||
url.searchParams.set('page', page.toString());
|
url.searchParams.set('page', page.toString());
|
||||||
|
|
||||||
const resp = await fetch(url.href, {
|
const resp = await fetch(url.href, {
|
||||||
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.href}`);
|
||||||
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
|
throw new Error(`Failed to fetch commits for ${owner}/${repo}: ${resp.statusText}`);
|
||||||
@ -147,7 +224,6 @@ export class CodeFeed {
|
|||||||
if (commitDate > twentyFourHoursAgo) {
|
if (commitDate > twentyFourHoursAgo) {
|
||||||
recentCommits.push(commit);
|
recentCommits.push(commit);
|
||||||
} else {
|
} else {
|
||||||
// If we encounter a commit older than 24 hours, we can stop fetching more pages
|
|
||||||
return recentCommits;
|
return recentCommits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,11 +234,47 @@ export class CodeFeed {
|
|||||||
return recentCommits;
|
return recentCommits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch all commits by querying all organizations.
|
||||||
|
*/
|
||||||
public async fetchAllCommitsFromInstance(): Promise<CommitResult[]> {
|
public async fetchAllCommitsFromInstance(): Promise<CommitResult[]> {
|
||||||
const repos = await this.fetchAllRepositories();
|
const orgs = await this.fetchAllOrganizations();
|
||||||
|
console.log(`Found ${orgs.length} organizations`);
|
||||||
let allCommits: CommitResult[] = [];
|
let allCommits: CommitResult[] = [];
|
||||||
|
|
||||||
for (const r of repos) {
|
for (const orgName of orgs) {
|
||||||
|
console.log(`Checking activity for organization: ${orgName}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const hasActivity = await this.hasNewActivity({
|
||||||
|
orgName,
|
||||||
|
});
|
||||||
|
if (!hasActivity) {
|
||||||
|
console.log(`No new activity for organization: ${orgName}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error fetching activity for organization ${orgName}:`, error.message);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`New activity detected for organization: ${orgName}. Processing repositories...`);
|
||||||
|
|
||||||
|
const repos = await this.fetchAllRepositories();
|
||||||
|
for (const r of repos.filter((repo) => repo.owner.login === orgName)) {
|
||||||
|
try {
|
||||||
|
const hasActivity = await this.hasNewActivity({
|
||||||
|
orgName,
|
||||||
|
repoName: r.name,
|
||||||
|
});
|
||||||
|
if (!hasActivity) {
|
||||||
|
console.log(`No new activity for repository: ${orgName}/${r.name}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error fetching activity for repository ${orgName}/${r.name}:`, error.message);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const org = r.owner.login;
|
const org = r.owner.login;
|
||||||
const repo = r.name;
|
const repo = r.name;
|
||||||
console.log(`Processing repository ${org}/${repo}`);
|
console.log(`Processing repository ${org}/${repo}`);
|
||||||
@ -170,25 +282,54 @@ export class CodeFeed {
|
|||||||
try {
|
try {
|
||||||
const taggedCommitShas = await this.fetchTags(org, repo);
|
const taggedCommitShas = await this.fetchTags(org, repo);
|
||||||
const commits = await this.fetchRecentCommitsForRepo(org, repo);
|
const commits = await this.fetchRecentCommitsForRepo(org, repo);
|
||||||
console.log(`${org}/${repo} -> Found ${commits.length} commits`);
|
|
||||||
|
|
||||||
const formatted = commits.map((c): CommitResult => ({
|
const commitResults = commits.map((c) => {
|
||||||
|
const commit: CommitResult = {
|
||||||
baseUrl: this.baseUrl,
|
baseUrl: this.baseUrl,
|
||||||
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()),
|
||||||
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,
|
||||||
|
}
|
||||||
|
return commit;
|
||||||
|
});
|
||||||
|
|
||||||
allCommits.push(...formatted);
|
if (commitResults.length > 0) {
|
||||||
} catch (error: any) {
|
try {
|
||||||
|
const packageInfo = await this.npmRegistry.getPackageInfo(`@${org}/${repo}`);
|
||||||
|
for (const commit of commitResults.filter((c) => c.tagged)) {
|
||||||
|
const correspondingVersion = packageInfo.allVersions.find((versionArg) => {
|
||||||
|
return versionArg.version === commit.commitMessage.replace('\n', '');
|
||||||
|
});
|
||||||
|
if (correspondingVersion) {
|
||||||
|
commit.publishedOnNpm = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to fetch package info for ${org}/${repo}:`, error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allCommits.push(...commitResults);
|
||||||
|
} catch (error) {
|
||||||
console.error(`Skipping repository ${org}/${repo} due to error:`, error.message);
|
console.error(`Skipping repository ${org}/${repo} due to error:`, error.message);
|
||||||
continue;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(`Processed ${allCommits.length} commits in total.`);
|
||||||
|
for (const c of allCommits) {
|
||||||
|
console.log(`______________________________________________________
|
||||||
|
${c.prettyAgoTime} ago:
|
||||||
|
Commit ${c.hash} by ${c.org}/${c.repo} at ${c.timestamp}
|
||||||
|
${c.commitMessage}
|
||||||
|
Published on npm: ${c.publishedOnNpm}
|
||||||
|
`);
|
||||||
|
}
|
||||||
return allCommits;
|
return allCommits;
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user