@dependabit/github-client 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/auth/basic.d.ts +46 -0
- package/dist/auth/basic.d.ts.map +1 -0
- package/dist/auth/basic.js +88 -0
- package/dist/auth/basic.js.map +1 -0
- package/dist/auth/oauth.d.ts +48 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +139 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/token.d.ts +40 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +67 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/auth.d.ts +47 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +78 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +74 -0
- package/dist/client.js.map +1 -0
- package/dist/commits.d.ts +57 -0
- package/dist/commits.d.ts.map +1 -0
- package/dist/commits.js +113 -0
- package/dist/commits.js.map +1 -0
- package/dist/feedback.d.ts +69 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +111 -0
- package/dist/feedback.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/issues.d.ts +55 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +123 -0
- package/dist/issues.js.map +1 -0
- package/dist/rate-limit.d.ts +71 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +145 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/releases.d.ts +50 -0
- package/dist/releases.d.ts.map +1 -0
- package/dist/releases.js +113 -0
- package/dist/releases.js.map +1 -0
- package/package.json +39 -0
- package/src/auth/basic.ts +102 -0
- package/src/auth/oauth.ts +183 -0
- package/src/auth/token.ts +81 -0
- package/src/auth.ts +100 -0
- package/src/client.test.ts +115 -0
- package/src/client.ts +109 -0
- package/src/commits.ts +184 -0
- package/src/feedback.ts +166 -0
- package/src/index.ts +15 -0
- package/src/issues.ts +185 -0
- package/src/rate-limit.ts +210 -0
- package/src/releases.ts +149 -0
- package/test/auth/basic.test.ts +122 -0
- package/test/auth/oauth.test.ts +196 -0
- package/test/auth/token.test.ts +97 -0
- package/test/commits.test.ts +169 -0
- package/test/feedback.test.ts +203 -0
- package/test/issues.test.ts +197 -0
- package/test/rate-limit.test.ts +154 -0
- package/test/releases.test.ts +187 -0
- package/tsconfig.json +10 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token authentication handler for GitHub API
|
|
3
|
+
* Supports GitHub PAT tokens, fine-grained tokens, and API keys
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Handler for token-based authentication (GitHub PAT, API keys)
|
|
7
|
+
*/
|
|
8
|
+
export class TokenAuthHandler {
|
|
9
|
+
token;
|
|
10
|
+
GITHUB_TOKEN_PREFIXES = [
|
|
11
|
+
'ghp_', // Personal Access Token
|
|
12
|
+
'gho_', // OAuth Access Token
|
|
13
|
+
'ghu_', // User-to-Server Token
|
|
14
|
+
'ghs_', // Server-to-Server Token
|
|
15
|
+
'ghr_', // Refresh Token
|
|
16
|
+
'github_pat_' // Fine-grained PAT
|
|
17
|
+
];
|
|
18
|
+
constructor(token) {
|
|
19
|
+
if (!token || token.trim() === '') {
|
|
20
|
+
throw new Error('Token cannot be empty');
|
|
21
|
+
}
|
|
22
|
+
this.token = token;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Authenticate and return auth object
|
|
26
|
+
*/
|
|
27
|
+
async authenticate() {
|
|
28
|
+
return {
|
|
29
|
+
type: 'token',
|
|
30
|
+
token: this.token
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate token format
|
|
35
|
+
*/
|
|
36
|
+
validate() {
|
|
37
|
+
// Check if token starts with valid GitHub prefix or is an API key
|
|
38
|
+
const hasValidPrefix = this.GITHUB_TOKEN_PREFIXES.some((prefix) => this.token.startsWith(prefix));
|
|
39
|
+
// Allow any token format, but prefer GitHub token prefixes
|
|
40
|
+
return hasValidPrefix || this.token.length > 0;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get authentication type
|
|
44
|
+
*/
|
|
45
|
+
getType() {
|
|
46
|
+
return 'token';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update token (for rotation)
|
|
50
|
+
*/
|
|
51
|
+
updateToken(newToken) {
|
|
52
|
+
if (!newToken || newToken.trim() === '') {
|
|
53
|
+
throw new Error('Token cannot be empty');
|
|
54
|
+
}
|
|
55
|
+
this.token = newToken;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get current token
|
|
59
|
+
*
|
|
60
|
+
* @warning This method exposes the raw token value. Use with caution and avoid
|
|
61
|
+
* logging or displaying the token. Prefer using authenticate() for auth operations.
|
|
62
|
+
*/
|
|
63
|
+
getToken() {
|
|
64
|
+
return this.token;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/auth/token.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,CAAS;IACL,qBAAqB,GAAG;QACvC,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,gBAAgB;QACxB,aAAa,CAAC,mBAAmB;KAClC,CAAC;IAEF,YAAY,KAAa,EAAE;QACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAAA,CACpB;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,GAAuB;QACvC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IAAA,CACH;IAED;;OAEG;IACH,QAAQ,GAAY;QAClB,kEAAkE;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAChE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAC9B,CAAC;QAEF,2DAA2D;QAC3D,OAAO,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAAA,CAChD;IAED;;OAEG;IACH,OAAO,GAAW;QAChB,OAAO,OAAO,CAAC;IAAA,CAChB;IAED;;OAEG;IACH,WAAW,CAAC,QAAgB,EAAQ;QAClC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;IAAA,CACvB;IAED;;;;;OAKG;IACH,QAAQ,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC;IAAA,CACnB;CACF"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication support for GitHub API client
|
|
3
|
+
* Provides token, OAuth, and basic authentication methods
|
|
4
|
+
*/
|
|
5
|
+
import { TokenAuthHandler, type TokenAuth } from './auth/token';
|
|
6
|
+
import { OAuthHandler, type OAuthAuth, type OAuthConfig } from './auth/oauth';
|
|
7
|
+
import { BasicAuthHandler, type BasicAuth } from './auth/basic';
|
|
8
|
+
export type AuthType = 'token' | 'oauth' | 'basic';
|
|
9
|
+
export type AuthResult = TokenAuth | OAuthAuth | BasicAuth;
|
|
10
|
+
export interface AuthConfig {
|
|
11
|
+
type: AuthType;
|
|
12
|
+
token?: string;
|
|
13
|
+
oauth?: OAuthConfig;
|
|
14
|
+
username?: string;
|
|
15
|
+
password?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Authentication manager that supports multiple auth methods
|
|
19
|
+
*/
|
|
20
|
+
export declare class AuthManager {
|
|
21
|
+
private handler;
|
|
22
|
+
constructor(config: AuthConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Perform authentication
|
|
25
|
+
*/
|
|
26
|
+
authenticate(code?: string): Promise<AuthResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Validate authentication configuration
|
|
29
|
+
*/
|
|
30
|
+
validate(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Get authentication type
|
|
33
|
+
*/
|
|
34
|
+
getType(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get underlying handler
|
|
37
|
+
*/
|
|
38
|
+
getHandler(): TokenAuthHandler | OAuthHandler | BasicAuthHandler;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create authentication manager from config
|
|
42
|
+
*/
|
|
43
|
+
export declare function createAuth(config: AuthConfig): AuthManager;
|
|
44
|
+
export { TokenAuthHandler, type TokenAuth } from './auth/token';
|
|
45
|
+
export { OAuthHandler, type OAuthAuth, type OAuthConfig } from './auth/oauth';
|
|
46
|
+
export { BasicAuthHandler, type BasicAuth } from './auth/basic';
|
|
47
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqD;IAEpE,YAAY,MAAM,EAAE,UAAU,EA0B7B;IAED;;OAEG;IACG,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQrD;IAED;;OAEG;IACH,QAAQ,IAAI,OAAO,CAElB;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,CAEhB;IAED;;OAEG;IACH,UAAU,IAAI,gBAAgB,GAAG,YAAY,GAAG,gBAAgB,CAE/D;CACF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAE1D;AAGD,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication support for GitHub API client
|
|
3
|
+
* Provides token, OAuth, and basic authentication methods
|
|
4
|
+
*/
|
|
5
|
+
import { TokenAuthHandler } from './auth/token';
|
|
6
|
+
import { OAuthHandler } from './auth/oauth';
|
|
7
|
+
import { BasicAuthHandler } from './auth/basic';
|
|
8
|
+
/**
|
|
9
|
+
* Authentication manager that supports multiple auth methods
|
|
10
|
+
*/
|
|
11
|
+
export class AuthManager {
|
|
12
|
+
handler;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
switch (config.type) {
|
|
15
|
+
case 'token':
|
|
16
|
+
if (!config.token) {
|
|
17
|
+
throw new Error('Token is required for token authentication');
|
|
18
|
+
}
|
|
19
|
+
this.handler = new TokenAuthHandler(config.token);
|
|
20
|
+
break;
|
|
21
|
+
case 'oauth':
|
|
22
|
+
if (!config.oauth) {
|
|
23
|
+
throw new Error('OAuth config is required for OAuth authentication');
|
|
24
|
+
}
|
|
25
|
+
this.handler = new OAuthHandler(config.oauth);
|
|
26
|
+
break;
|
|
27
|
+
case 'basic':
|
|
28
|
+
if (!config.username || !config.password) {
|
|
29
|
+
throw new Error('Username and password are required for basic authentication');
|
|
30
|
+
}
|
|
31
|
+
this.handler = new BasicAuthHandler(config.username, config.password);
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
throw new Error(`Unsupported authentication type: ${config.type}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Perform authentication
|
|
39
|
+
*/
|
|
40
|
+
async authenticate(code) {
|
|
41
|
+
if (this.handler instanceof OAuthHandler && code) {
|
|
42
|
+
return this.handler.authenticate(code);
|
|
43
|
+
}
|
|
44
|
+
if (this.handler instanceof TokenAuthHandler || this.handler instanceof BasicAuthHandler) {
|
|
45
|
+
return this.handler.authenticate();
|
|
46
|
+
}
|
|
47
|
+
throw new Error('Invalid authentication flow');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate authentication configuration
|
|
51
|
+
*/
|
|
52
|
+
validate() {
|
|
53
|
+
return this.handler.validate();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get authentication type
|
|
57
|
+
*/
|
|
58
|
+
getType() {
|
|
59
|
+
return this.handler.getType();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get underlying handler
|
|
63
|
+
*/
|
|
64
|
+
getHandler() {
|
|
65
|
+
return this.handler;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create authentication manager from config
|
|
70
|
+
*/
|
|
71
|
+
export function createAuth(config) {
|
|
72
|
+
return new AuthManager(config);
|
|
73
|
+
}
|
|
74
|
+
// Re-export handler classes and types
|
|
75
|
+
export { TokenAuthHandler } from './auth/token';
|
|
76
|
+
export { OAuthHandler } from './auth/oauth';
|
|
77
|
+
export { BasicAuthHandler } from './auth/basic';
|
|
78
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAoC,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAahE;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,OAAO,CAAqD;IAEpE,YAAY,MAAkB,EAAE;QAC9B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClD,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBACjF,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtE,MAAM;YAER;gBACE,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IAAA,CACF;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAa,EAAuB;QACrD,IAAI,IAAI,CAAC,OAAO,YAAY,YAAY,IAAI,IAAI,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,YAAY,gBAAgB,IAAI,IAAI,CAAC,OAAO,YAAY,gBAAgB,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAAA,CAChD;IAED;;OAEG;IACH,QAAQ,GAAY;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAAA,CAChC;IAED;;OAEG;IACH,OAAO,GAAW;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CAC/B;IAED;;OAEG;IACH,UAAU,GAAuD;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACrB;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAe;IAC1D,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAAA,CAChC;AAED,sCAAsC;AACtC,OAAO,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAoC,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Octokit } from 'octokit';
|
|
2
|
+
/**
|
|
3
|
+
* Rate limit information
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitInfo {
|
|
6
|
+
limit: number;
|
|
7
|
+
remaining: number;
|
|
8
|
+
reset: number;
|
|
9
|
+
used: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* GitHub client configuration
|
|
13
|
+
*/
|
|
14
|
+
export interface GitHubClientConfig {
|
|
15
|
+
auth?: string;
|
|
16
|
+
rateLimitWarningThreshold?: number;
|
|
17
|
+
rateLimitMinRemaining?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* GitHub API client wrapper with rate limit handling
|
|
21
|
+
*/
|
|
22
|
+
export declare class GitHubClient {
|
|
23
|
+
private octokit;
|
|
24
|
+
private rateLimitWarningThreshold;
|
|
25
|
+
private rateLimitMinRemaining;
|
|
26
|
+
private lastRateLimitCheck?;
|
|
27
|
+
constructor(config?: GitHubClientConfig);
|
|
28
|
+
/**
|
|
29
|
+
* Get current rate limit status
|
|
30
|
+
*/
|
|
31
|
+
getRateLimit(): Promise<RateLimitInfo>;
|
|
32
|
+
/**
|
|
33
|
+
* Check rate limit and throw if exceeded; log a warning when remaining is low.
|
|
34
|
+
*/
|
|
35
|
+
checkRateLimit(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Execute a request with rate limit checking
|
|
38
|
+
*/
|
|
39
|
+
withRateLimit<T>(fn: () => Promise<T>): Promise<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Get the underlying Octokit instance
|
|
42
|
+
*/
|
|
43
|
+
getOctokit(): Octokit;
|
|
44
|
+
/**
|
|
45
|
+
* Get last known rate limit info (cached)
|
|
46
|
+
*/
|
|
47
|
+
getLastRateLimitCheck(): RateLimitInfo | undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a GitHub client instance
|
|
51
|
+
*/
|
|
52
|
+
export declare function createGitHubClient(config?: GitHubClientConfig): GitHubClient;
|
|
53
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,kBAAkB,CAAC,CAAgB;IAE3C,YAAY,MAAM,GAAE,kBAAuB,EAM1C;IAED;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,CAa3C;IAED;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBpC;IAED;;OAEG;IACG,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGvD;IAED;;OAEG;IACH,UAAU,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,qBAAqB,IAAI,aAAa,GAAG,SAAS,CAEjD;CACF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Octokit } from 'octokit';
|
|
2
|
+
/**
|
|
3
|
+
* GitHub API client wrapper with rate limit handling
|
|
4
|
+
*/
|
|
5
|
+
export class GitHubClient {
|
|
6
|
+
octokit;
|
|
7
|
+
rateLimitWarningThreshold;
|
|
8
|
+
rateLimitMinRemaining;
|
|
9
|
+
lastRateLimitCheck;
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
this.octokit = new Octokit({
|
|
12
|
+
auth: config.auth
|
|
13
|
+
});
|
|
14
|
+
this.rateLimitWarningThreshold = config.rateLimitWarningThreshold ?? 100;
|
|
15
|
+
this.rateLimitMinRemaining = config.rateLimitMinRemaining ?? 10;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get current rate limit status
|
|
19
|
+
*/
|
|
20
|
+
async getRateLimit() {
|
|
21
|
+
const response = await this.octokit.rest.rateLimit.get();
|
|
22
|
+
const core = response.data.rate;
|
|
23
|
+
const info = {
|
|
24
|
+
limit: core.limit,
|
|
25
|
+
remaining: core.remaining,
|
|
26
|
+
reset: core.reset,
|
|
27
|
+
used: core.used
|
|
28
|
+
};
|
|
29
|
+
this.lastRateLimitCheck = info;
|
|
30
|
+
return info;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check rate limit and throw if exceeded; log a warning when remaining is low.
|
|
34
|
+
*/
|
|
35
|
+
async checkRateLimit() {
|
|
36
|
+
const rateLimit = await this.getRateLimit();
|
|
37
|
+
if (rateLimit.remaining <= this.rateLimitMinRemaining) {
|
|
38
|
+
const resetTime = new Date(rateLimit.reset * 1000);
|
|
39
|
+
const waitMs = resetTime.getTime() - Date.now();
|
|
40
|
+
if (waitMs > 0) {
|
|
41
|
+
throw new Error(`Rate limit exceeded. ${rateLimit.remaining} requests remaining. Reset at ${resetTime.toISOString()}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (rateLimit.remaining <= this.rateLimitWarningThreshold) {
|
|
45
|
+
console.warn(`Rate limit warning: ${rateLimit.remaining}/${rateLimit.limit} requests remaining`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute a request with rate limit checking
|
|
50
|
+
*/
|
|
51
|
+
async withRateLimit(fn) {
|
|
52
|
+
await this.checkRateLimit();
|
|
53
|
+
return fn();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the underlying Octokit instance
|
|
57
|
+
*/
|
|
58
|
+
getOctokit() {
|
|
59
|
+
return this.octokit;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get last known rate limit info (cached)
|
|
63
|
+
*/
|
|
64
|
+
getLastRateLimitCheck() {
|
|
65
|
+
return this.lastRateLimitCheck;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a GitHub client instance
|
|
70
|
+
*/
|
|
71
|
+
export function createGitHubClient(config) {
|
|
72
|
+
return new GitHubClient(config);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAqBlC;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,OAAO,CAAU;IACjB,yBAAyB,CAAS;IAClC,qBAAqB,CAAS;IAC9B,kBAAkB,CAAiB;IAE3C,YAAY,MAAM,GAAuB,EAAE,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,yBAAyB,IAAI,GAAG,CAAC;QACzE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAAA,CACjE;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,GAA2B;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,MAAM,IAAI,GAAkB;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,OAAO,IAAI,CAAC;IAAA,CACb;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,GAAkB;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5C,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEhD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,wBAAwB,SAAS,CAAC,SAAS,iCAAiC,SAAS,CAAC,WAAW,EAAE,EAAE,CACtG,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAC1D,OAAO,CAAC,IAAI,CACV,uBAAuB,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,qBAAqB,CACnF,CAAC;QACJ,CAAC;IAAA,CACF;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAI,EAAoB,EAAc;QACvD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,CAAC;IAAA,CACb;IAED;;OAEG;IACH,UAAU,GAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACrB;IAED;;OAEG;IACH,qBAAqB,GAA8B;QACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAAA,CAChC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B,EAAgB;IAC5E,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,CACjC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Analysis
|
|
3
|
+
* Fetch and analyze commits from GitHub API
|
|
4
|
+
*/
|
|
5
|
+
import type { GitHubClient } from './client.js';
|
|
6
|
+
export interface CommitInfo {
|
|
7
|
+
sha: string;
|
|
8
|
+
message: string;
|
|
9
|
+
author: {
|
|
10
|
+
name: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
date: string;
|
|
13
|
+
};
|
|
14
|
+
url?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CommitFile {
|
|
17
|
+
filename: string;
|
|
18
|
+
status: 'added' | 'removed' | 'modified' | 'renamed' | 'copied' | 'changed' | 'unchanged';
|
|
19
|
+
additions?: number;
|
|
20
|
+
deletions?: number;
|
|
21
|
+
changes?: number;
|
|
22
|
+
patch?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CommitDiff {
|
|
25
|
+
sha: string;
|
|
26
|
+
files: CommitFile[];
|
|
27
|
+
}
|
|
28
|
+
export interface ParsedFiles {
|
|
29
|
+
added: string[];
|
|
30
|
+
modified: string[];
|
|
31
|
+
removed: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface FetchCommitsOptions {
|
|
34
|
+
since?: string;
|
|
35
|
+
until?: string;
|
|
36
|
+
sha?: string;
|
|
37
|
+
path?: string;
|
|
38
|
+
per_page?: number;
|
|
39
|
+
page?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fetch commits from GitHub API
|
|
43
|
+
*/
|
|
44
|
+
export declare function fetchCommits(client: GitHubClient, owner: string, repo: string, options?: FetchCommitsOptions): Promise<CommitInfo[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Get detailed diff for a specific commit
|
|
47
|
+
*/
|
|
48
|
+
export declare function getCommitDiff(client: GitHubClient, owner: string, repo: string, sha: string): Promise<CommitDiff>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse commit files into categorized lists
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseCommitFiles(files: CommitFile[]): ParsedFiles;
|
|
53
|
+
/**
|
|
54
|
+
* Get commits between two refs
|
|
55
|
+
*/
|
|
56
|
+
export declare function getCommitsBetween(client: GitHubClient, owner: string, repo: string, base: string, head: string): Promise<CommitInfo[]>;
|
|
57
|
+
//# sourceMappingURL=commits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commits.d.ts","sourceRoot":"","sources":["../src/commits.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,CAAC,CAyBrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,WAAW,CAkBjE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,EAAE,CAAC,CA8BvB"}
|
package/dist/commits.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Analysis
|
|
3
|
+
* Fetch and analyze commits from GitHub API
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Fetch commits from GitHub API
|
|
7
|
+
*/
|
|
8
|
+
export async function fetchCommits(client, owner, repo, options = {}) {
|
|
9
|
+
const octokit = client.getOctokit();
|
|
10
|
+
const response = await octokit.rest.repos.listCommits({
|
|
11
|
+
owner,
|
|
12
|
+
repo,
|
|
13
|
+
...options
|
|
14
|
+
});
|
|
15
|
+
return response.data.map((commit) => {
|
|
16
|
+
const info = {
|
|
17
|
+
sha: commit.sha,
|
|
18
|
+
message: commit.commit.message,
|
|
19
|
+
author: {
|
|
20
|
+
name: commit.commit.author?.name || 'Unknown',
|
|
21
|
+
date: commit.commit.author?.date || new Date().toISOString()
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
if (commit.commit.author?.email) {
|
|
25
|
+
info.author.email = commit.commit.author.email;
|
|
26
|
+
}
|
|
27
|
+
if (commit.html_url) {
|
|
28
|
+
info.url = commit.html_url;
|
|
29
|
+
}
|
|
30
|
+
return info;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get detailed diff for a specific commit
|
|
35
|
+
*/
|
|
36
|
+
export async function getCommitDiff(client, owner, repo, sha) {
|
|
37
|
+
const octokit = client.getOctokit();
|
|
38
|
+
const response = await octokit.rest.repos.getCommit({
|
|
39
|
+
owner,
|
|
40
|
+
repo,
|
|
41
|
+
ref: sha
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
sha: response.data.sha,
|
|
45
|
+
files: (response.data.files || []).map((file) => {
|
|
46
|
+
const commitFile = {
|
|
47
|
+
filename: file.filename,
|
|
48
|
+
status: file.status
|
|
49
|
+
};
|
|
50
|
+
if (file.additions !== undefined)
|
|
51
|
+
commitFile.additions = file.additions;
|
|
52
|
+
if (file.deletions !== undefined)
|
|
53
|
+
commitFile.deletions = file.deletions;
|
|
54
|
+
if (file.changes !== undefined)
|
|
55
|
+
commitFile.changes = file.changes;
|
|
56
|
+
if (file.patch !== undefined)
|
|
57
|
+
commitFile.patch = file.patch;
|
|
58
|
+
return commitFile;
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse commit files into categorized lists
|
|
64
|
+
*/
|
|
65
|
+
export function parseCommitFiles(files) {
|
|
66
|
+
const result = {
|
|
67
|
+
added: [],
|
|
68
|
+
modified: [],
|
|
69
|
+
removed: []
|
|
70
|
+
};
|
|
71
|
+
for (const file of files) {
|
|
72
|
+
if (file.status === 'added') {
|
|
73
|
+
result.added.push(file.filename);
|
|
74
|
+
}
|
|
75
|
+
else if (file.status === 'modified' || file.status === 'changed') {
|
|
76
|
+
result.modified.push(file.filename);
|
|
77
|
+
}
|
|
78
|
+
else if (file.status === 'removed') {
|
|
79
|
+
result.removed.push(file.filename);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get commits between two refs
|
|
86
|
+
*/
|
|
87
|
+
export async function getCommitsBetween(client, owner, repo, base, head) {
|
|
88
|
+
const octokit = client.getOctokit();
|
|
89
|
+
const response = await octokit.rest.repos.compareCommits({
|
|
90
|
+
owner,
|
|
91
|
+
repo,
|
|
92
|
+
base,
|
|
93
|
+
head
|
|
94
|
+
});
|
|
95
|
+
return response.data.commits.map((commit) => {
|
|
96
|
+
const info = {
|
|
97
|
+
sha: commit.sha,
|
|
98
|
+
message: commit.commit.message,
|
|
99
|
+
author: {
|
|
100
|
+
name: commit.commit.author?.name || 'Unknown',
|
|
101
|
+
date: commit.commit.author?.date || new Date().toISOString()
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
if (commit.commit.author?.email) {
|
|
105
|
+
info.author.email = commit.commit.author.email;
|
|
106
|
+
}
|
|
107
|
+
if (commit.html_url) {
|
|
108
|
+
info.url = commit.html_url;
|
|
109
|
+
}
|
|
110
|
+
return info;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=commits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commits.js","sourceRoot":"","sources":["../src/commits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* False positive feedback listener for dependency tracking
|
|
3
|
+
* Monitors GitHub issue labels to collect user feedback on detections
|
|
4
|
+
*/
|
|
5
|
+
export interface IssueWithLabels {
|
|
6
|
+
number: number;
|
|
7
|
+
title: string;
|
|
8
|
+
labels: Array<string | {
|
|
9
|
+
name: string;
|
|
10
|
+
}>;
|
|
11
|
+
created_at?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IssueManagerInterface {
|
|
14
|
+
listIssues(): Promise<Array<IssueWithLabels>>;
|
|
15
|
+
getIssue(issueNumber: number): Promise<IssueWithLabels>;
|
|
16
|
+
}
|
|
17
|
+
export interface FeedbackConfig {
|
|
18
|
+
truePositiveLabel?: string;
|
|
19
|
+
falsePositiveLabel?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface FeedbackData {
|
|
22
|
+
truePositives: Array<{
|
|
23
|
+
number: number;
|
|
24
|
+
title: string;
|
|
25
|
+
created_at?: string | undefined;
|
|
26
|
+
}>;
|
|
27
|
+
falsePositives: Array<{
|
|
28
|
+
number: number;
|
|
29
|
+
title: string;
|
|
30
|
+
created_at?: string | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
total: number;
|
|
33
|
+
}
|
|
34
|
+
export interface FeedbackRate {
|
|
35
|
+
falsePositiveRate: number;
|
|
36
|
+
truePositiveRate: number;
|
|
37
|
+
totalFeedback: number;
|
|
38
|
+
}
|
|
39
|
+
export interface CollectOptions {
|
|
40
|
+
startDate?: Date;
|
|
41
|
+
endDate?: Date;
|
|
42
|
+
repository?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Listener that monitors issue labels for false positive feedback
|
|
46
|
+
*/
|
|
47
|
+
export declare class FeedbackListener {
|
|
48
|
+
private issueManager;
|
|
49
|
+
private truePositiveLabel;
|
|
50
|
+
private falsePositiveLabel;
|
|
51
|
+
constructor(issueManager: IssueManagerInterface, config?: FeedbackConfig);
|
|
52
|
+
/**
|
|
53
|
+
* Collect feedback from issues with feedback labels
|
|
54
|
+
*/
|
|
55
|
+
collectFeedback(options?: CollectOptions): Promise<FeedbackData>;
|
|
56
|
+
/**
|
|
57
|
+
* Calculate false positive rate from collected feedback
|
|
58
|
+
*/
|
|
59
|
+
getFeedbackRate(options?: CollectOptions): Promise<FeedbackRate>;
|
|
60
|
+
/**
|
|
61
|
+
* Get feedback from recent time window (e.g., last 30 days)
|
|
62
|
+
*/
|
|
63
|
+
getRecentFeedback(days: number, referenceDate?: Date): Promise<FeedbackData>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a specific issue has feedback label
|
|
66
|
+
*/
|
|
67
|
+
monitorIssue(issueNumber: number): Promise<boolean>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACzF,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAC1F,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAS;IAEnC,YAAY,YAAY,EAAE,qBAAqB,EAAE,MAAM,GAAE,cAAmB,EAI3E;IAED;;OAEG;IACG,eAAe,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4DzE;IAED;;OAEG;IACG,eAAe,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBzE;IAED;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAMjF;IAED;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUxD;CACF"}
|