@paklo/core 0.2.0 → 0.4.0
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/dist/{node/azure.d.ts → azure/index.d.ts} +4 -4
- package/dist/{node/azure.js → azure/index.js} +14 -14
- package/dist/azure/index.js.map +1 -0
- package/dist/{node/dependabot.d.ts → dependabot/index.d.ts} +2 -2
- package/dist/{node/dependabot.js → dependabot/index.js} +4 -4
- package/dist/{node/dependabot-BmHuie46.js → dependabot-B5pw4XDa.js} +2 -2
- package/dist/dependabot-B5pw4XDa.js.map +1 -0
- package/dist/{node/environment.d.ts → environment/index.d.ts} +1 -1
- package/dist/environment/index.js +3 -0
- package/dist/environment-DX5CD-dD.js.map +1 -0
- package/dist/github/index.d.ts +2 -0
- package/dist/{node/github.js → github/index.js} +82 -47
- package/dist/github/index.js.map +1 -0
- package/dist/{node/http.d.ts → http/index.d.ts} +8 -8
- package/dist/{node/http.js → http/index.js} +2 -2
- package/dist/{node/http-BG_-s47I.js → http-Be3uWaqn.js} +1 -1
- package/dist/http-Be3uWaqn.js.map +1 -0
- package/dist/{browser/github.d.ts → index-CYzMyUeu.d.ts} +30 -12
- package/dist/{node/index-Dgl6vmM4.d.ts → index-VTX2ArLa.d.ts} +23 -23
- package/dist/{node/job-C8KX68QT.js → job-CxYcRj_D.js} +1 -1
- package/dist/job-CxYcRj_D.js.map +1 -0
- package/dist/logger-bWnHxtAf.js.map +1 -0
- package/dist/{node/shared-data.d.ts → shared-data/index.d.ts} +1 -1
- package/dist/{node/shared-data.js → shared-data/index.js} +1 -1
- package/dist/shared-data/index.js.map +1 -0
- package/dist/{node/usage.d.ts → usage.d.ts} +1 -1
- package/dist/{node/usage.js → usage.js} +1 -1
- package/dist/usage.js.map +1 -0
- package/package.json +29 -33
- package/dist/browser/defineProperty-ie4tC-F5.js +0 -43
- package/dist/browser/environment-DinhzwQn.js +0 -139
- package/dist/browser/environment-DinhzwQn.js.map +0 -1
- package/dist/browser/environment.d.ts +0 -33
- package/dist/browser/environment.js +0 -3
- package/dist/browser/github.js +0 -199
- package/dist/browser/github.js.map +0 -1
- package/dist/browser/http.d.ts +0 -121
- package/dist/browser/http.js +0 -248
- package/dist/browser/http.js.map +0 -1
- package/dist/browser/logger-B7HLv660.js +0 -31
- package/dist/browser/logger-B7HLv660.js.map +0 -1
- package/dist/browser/logger.js +0 -4
- package/dist/browser/shared-data.d.ts +0 -22
- package/dist/browser/shared-data.js +0 -23
- package/dist/browser/shared-data.js.map +0 -1
- package/dist/browser/usage.d.ts +0 -102
- package/dist/browser/usage.js +0 -419
- package/dist/browser/usage.js.map +0 -1
- package/dist/node/azure.js.map +0 -1
- package/dist/node/dependabot-BmHuie46.js.map +0 -1
- package/dist/node/environment-DX5CD-dD.js.map +0 -1
- package/dist/node/environment.js +0 -3
- package/dist/node/github.d.ts +0 -2
- package/dist/node/github.js.map +0 -1
- package/dist/node/http-BG_-s47I.js.map +0 -1
- package/dist/node/index-3wZw74Ah.d.ts +0 -151
- package/dist/node/job-C8KX68QT.js.map +0 -1
- package/dist/node/logger-bWnHxtAf.js.map +0 -1
- package/dist/node/logger.d.ts +0 -23
- package/dist/node/shared-data.js.map +0 -1
- package/dist/node/usage.js.map +0 -1
- /package/dist/{node/environment-DX5CD-dD.js → environment-DX5CD-dD.js} +0 -0
- /package/dist/{node/logger-bWnHxtAf.js → logger-bWnHxtAf.js} +0 -0
- /package/dist/{browser/logger.d.ts → logger.d.ts} +0 -0
- /package/dist/{node/logger.js → logger.js} +0 -0
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import { n as logger } from "
|
|
3
|
-
import * as semver from "semver";
|
|
1
|
+
import "../environment-DX5CD-dD.js";
|
|
2
|
+
import { n as logger } from "../logger-bWnHxtAf.js";
|
|
4
3
|
import { z } from "zod/v4";
|
|
4
|
+
import { Octokit } from "octokit";
|
|
5
|
+
import * as semver from "semver";
|
|
6
|
+
|
|
7
|
+
//#region src/github/client.ts
|
|
8
|
+
/**
|
|
9
|
+
* Creates an authenticated GitHub API client using Octokit.
|
|
10
|
+
*
|
|
11
|
+
* @param token - GitHub personal access token or fine-grained token with appropriate permissions
|
|
12
|
+
* @returns Configured Octokit instance ready for API calls
|
|
13
|
+
*/
|
|
14
|
+
function createGitHubClient({ token }) {
|
|
15
|
+
return new Octokit({ auth: token });
|
|
16
|
+
}
|
|
5
17
|
|
|
18
|
+
//#endregion
|
|
6
19
|
//#region src/github/ghsa.ts
|
|
7
|
-
const GHSA_GRAPHQL_API = "https://api.github.com/graphql";
|
|
8
20
|
const GHSA_SECURITY_VULNERABILITIES_QUERY = `
|
|
9
21
|
query($ecosystem: SecurityAdvisoryEcosystem, $package: String) {
|
|
10
22
|
securityVulnerabilities(first: 100, ecosystem: $ecosystem, package: $package) {
|
|
@@ -20,9 +32,15 @@ const GHSA_SECURITY_VULNERABILITIES_QUERY = `
|
|
|
20
32
|
references {
|
|
21
33
|
url
|
|
22
34
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
cvssSeverities {
|
|
36
|
+
cvssV3 {
|
|
37
|
+
score
|
|
38
|
+
vectorString
|
|
39
|
+
}
|
|
40
|
+
cvssV4 {
|
|
41
|
+
score
|
|
42
|
+
vectorString
|
|
43
|
+
}
|
|
26
44
|
}
|
|
27
45
|
epss {
|
|
28
46
|
percentage
|
|
@@ -73,28 +91,30 @@ const SecurityAdvisorySeveritySchema = z.enum([
|
|
|
73
91
|
"HIGH",
|
|
74
92
|
"CRITICAL"
|
|
75
93
|
]);
|
|
94
|
+
const CweSchema = z.object({
|
|
95
|
+
cweId: z.string(),
|
|
96
|
+
name: z.string(),
|
|
97
|
+
description: z.string()
|
|
98
|
+
});
|
|
99
|
+
const CvssSchema = z.object({
|
|
100
|
+
score: z.number(),
|
|
101
|
+
vectorString: z.string().nullish()
|
|
102
|
+
});
|
|
76
103
|
const SecurityAdvisorySchema = z.object({
|
|
77
|
-
identifiers: z.
|
|
104
|
+
identifiers: z.object({
|
|
78
105
|
type: z.union([SecurityAdvisoryIdentifierSchema, z.string()]),
|
|
79
106
|
value: z.string()
|
|
80
|
-
})),
|
|
107
|
+
}).array(),
|
|
81
108
|
severity: SecurityAdvisorySeveritySchema.nullish(),
|
|
82
109
|
summary: z.string(),
|
|
83
110
|
description: z.string().nullish(),
|
|
84
|
-
references: z.
|
|
85
|
-
cvss:
|
|
86
|
-
score: z.number(),
|
|
87
|
-
vectorString: z.string()
|
|
88
|
-
}).nullish(),
|
|
111
|
+
references: z.object({ url: z.string() }).array().nullish(),
|
|
112
|
+
cvss: CvssSchema.nullish(),
|
|
89
113
|
epss: z.object({
|
|
90
|
-
percentage: z.number(),
|
|
91
|
-
percentile: z.number()
|
|
114
|
+
percentage: z.number().nullish(),
|
|
115
|
+
percentile: z.number().nullish()
|
|
92
116
|
}).nullish(),
|
|
93
|
-
cwes:
|
|
94
|
-
cweId: z.string(),
|
|
95
|
-
name: z.string(),
|
|
96
|
-
description: z.string()
|
|
97
|
-
})).nullish(),
|
|
117
|
+
cwes: CweSchema.array().nullish(),
|
|
98
118
|
publishedAt: z.string().nullish(),
|
|
99
119
|
updatedAt: z.string().nullish(),
|
|
100
120
|
withdrawnAt: z.string().nullish(),
|
|
@@ -107,6 +127,18 @@ const SecurityVulnerabilitySchema = z.object({
|
|
|
107
127
|
vulnerableVersionRange: z.string(),
|
|
108
128
|
firstPatchedVersion: FirstPatchedVersionSchema.nullish()
|
|
109
129
|
});
|
|
130
|
+
const CvssSeveritiesSchema = z.object({
|
|
131
|
+
cvssV3: CvssSchema.nullish(),
|
|
132
|
+
cvssV4: CvssSchema.nullish()
|
|
133
|
+
});
|
|
134
|
+
const GitHubSecurityVulnerabilitiesResponseSchema = z.object({ securityVulnerabilities: z.object({ nodes: z.object({
|
|
135
|
+
advisory: SecurityAdvisorySchema.omit({ cvss: true }).extend({
|
|
136
|
+
cvssSeverities: CvssSeveritiesSchema,
|
|
137
|
+
cwes: z.object({ nodes: CweSchema.array() }).nullish()
|
|
138
|
+
}),
|
|
139
|
+
firstPatchedVersion: FirstPatchedVersionSchema.nullish(),
|
|
140
|
+
vulnerableVersionRange: z.string()
|
|
141
|
+
}).array() }) });
|
|
110
142
|
function getGhsaPackageEcosystemFromDependabotPackageManager(dependabotPackageManager) {
|
|
111
143
|
switch (dependabotPackageManager) {
|
|
112
144
|
case "composer": return "COMPOSER";
|
|
@@ -125,12 +157,15 @@ function getGhsaPackageEcosystemFromDependabotPackageManager(dependabotPackageMa
|
|
|
125
157
|
}
|
|
126
158
|
}
|
|
127
159
|
/**
|
|
128
|
-
* GitHub
|
|
160
|
+
* GitHub Security Advisory client
|
|
129
161
|
*/
|
|
130
|
-
var
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
162
|
+
var GitHubSecurityAdvisoryClient = class {
|
|
163
|
+
octokit;
|
|
164
|
+
/**
|
|
165
|
+
* @param token GitHub personal access token with access to the GHSA API
|
|
166
|
+
*/
|
|
167
|
+
constructor(token) {
|
|
168
|
+
this.octokit = createGitHubClient({ token });
|
|
134
169
|
}
|
|
135
170
|
/**
|
|
136
171
|
* Get the list of security vulnerabilities for a given package ecosystem and list of packages
|
|
@@ -143,25 +178,25 @@ var GitHubGraphClient = class {
|
|
|
143
178
|
ecosystem: packageEcosystem,
|
|
144
179
|
package: pkg.name
|
|
145
180
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
package:
|
|
163
|
-
|
|
164
|
-
}
|
|
181
|
+
function pickCvss(value) {
|
|
182
|
+
if (value.cvssV4 && value.cvssV4.score > 0) return value.cvssV4;
|
|
183
|
+
if (value.cvssV3 && value.cvssV3.score > 0) return value.cvssV3;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const response = await this.octokit.graphql(GHSA_SECURITY_VULNERABILITIES_QUERY, variables);
|
|
187
|
+
return GitHubSecurityVulnerabilitiesResponseSchema.parse(response).securityVulnerabilities.nodes?.filter((v) => v.advisory != null)?.map((v) => ({
|
|
188
|
+
...v,
|
|
189
|
+
package: pkg,
|
|
190
|
+
advisory: {
|
|
191
|
+
...v.advisory,
|
|
192
|
+
cwes: v.advisory.cwes?.nodes,
|
|
193
|
+
cvss: pickCvss(v.advisory.cvssSeverities)
|
|
194
|
+
}
|
|
195
|
+
})) || [];
|
|
196
|
+
} catch (error) {
|
|
197
|
+
logger.warn(`GHSA GraphQL request failed for package ${pkg.name}: ${error}. Continuing with other packages.`);
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
165
200
|
});
|
|
166
201
|
}
|
|
167
202
|
/**
|
|
@@ -194,5 +229,5 @@ function filterVulnerabilities(securityVulnerabilities) {
|
|
|
194
229
|
}
|
|
195
230
|
|
|
196
231
|
//#endregion
|
|
197
|
-
export {
|
|
198
|
-
//# sourceMappingURL=
|
|
232
|
+
export { GitHubSecurityAdvisoryClient, PackageEcosystemSchema, PackageSchema, SecurityAdvisoryIdentifierSchema, SecurityAdvisorySchema, SecurityAdvisorySeveritySchema, SecurityVulnerabilitySchema, createGitHubClient, filterVulnerabilities, getGhsaPackageEcosystemFromDependabotPackageManager };
|
|
233
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["results: T2[]","v"],"sources":["../../src/github/client.ts","../../src/github/ghsa.ts"],"sourcesContent":["import { Octokit } from 'octokit';\n\n/**\n * Creates an authenticated GitHub API client using Octokit.\n *\n * @param token - GitHub personal access token or fine-grained token with appropriate permissions\n * @returns Configured Octokit instance ready for API calls\n */\nexport function createGitHubClient({ token }: { token: string }): Octokit {\n return new Octokit({\n auth: token,\n // could add retry here perhaps?\n });\n}\n","import type { Octokit } from 'octokit';\nimport * as semver from 'semver';\nimport { z } from 'zod/v4';\n\nimport { logger } from '@/logger';\nimport { createGitHubClient } from './client';\n\n// we use nullish() because it does optional() and allows the value to be set to null\n\nconst GHSA_SECURITY_VULNERABILITIES_QUERY = `\n query($ecosystem: SecurityAdvisoryEcosystem, $package: String) {\n securityVulnerabilities(first: 100, ecosystem: $ecosystem, package: $package) {\n nodes {\n advisory {\n identifiers {\n type,\n value\n },\n severity,\n summary,\n description,\n references {\n url\n }\n cvssSeverities {\n cvssV3 {\n score\n vectorString\n }\n cvssV4 {\n score\n vectorString\n }\n }\n epss {\n percentage\n percentile\n }\n cwes (first: 100) {\n nodes {\n cweId\n name\n description\n }\n }\n publishedAt\n updatedAt\n withdrawnAt\n permalink\n }\n vulnerableVersionRange\n firstPatchedVersion {\n identifier\n }\n }\n }\n }\n`;\n\nexport const PackageEcosystemSchema = z.enum([\n 'COMPOSER',\n 'ERLANG',\n 'GO',\n 'ACTIONS',\n 'MAVEN',\n 'NPM',\n 'NUGET',\n 'PIP',\n 'PUB',\n 'RUBYGEMS',\n 'RUST',\n 'SWIFT',\n]);\nexport type PackageEcosystem = z.infer<typeof PackageEcosystemSchema>;\n\nexport const PackageSchema = z.object({\n name: z.string(),\n version: z.string().nullish(),\n});\nexport type Package = z.infer<typeof PackageSchema>;\n\nexport const SecurityAdvisoryIdentifierSchema = z.enum(['CVE', 'GHSA']);\nexport type SecurityAdvisoryIdentifierType = z.infer<typeof SecurityAdvisoryIdentifierSchema>;\n\nexport const SecurityAdvisorySeveritySchema = z.enum(['LOW', 'MODERATE', 'HIGH', 'CRITICAL']);\nexport type SecurityAdvisorySeverity = z.infer<typeof SecurityAdvisorySeveritySchema>;\n\nconst CweSchema = z.object({\n cweId: z.string(),\n name: z.string(),\n description: z.string(),\n});\n\nconst CvssSchema = z.object({\n score: z.number(),\n vectorString: z.string().nullish(),\n});\ntype Cvss = z.infer<typeof CvssSchema>;\n\nexport const SecurityAdvisorySchema = z.object({\n identifiers: z\n .object({\n type: z.union([SecurityAdvisoryIdentifierSchema, z.string()]),\n value: z.string(),\n })\n .array(),\n severity: SecurityAdvisorySeveritySchema.nullish(),\n summary: z.string(),\n description: z.string().nullish(),\n references: z.object({ url: z.string() }).array().nullish(),\n cvss: CvssSchema.nullish(),\n epss: z\n .object({\n percentage: z.number().nullish(),\n percentile: z.number().nullish(),\n })\n .nullish(),\n cwes: CweSchema.array().nullish(),\n publishedAt: z.string().nullish(),\n updatedAt: z.string().nullish(),\n withdrawnAt: z.string().nullish(),\n permalink: z.string().nullish(),\n});\nexport type SecurityAdvisory = z.infer<typeof SecurityAdvisorySchema>;\n\nconst FirstPatchedVersionSchema = z.object({ identifier: z.string() });\nexport type FirstPatchedVersion = z.infer<typeof FirstPatchedVersionSchema>;\n\nexport const SecurityVulnerabilitySchema = z.object({\n package: PackageSchema,\n advisory: SecurityAdvisorySchema,\n vulnerableVersionRange: z.string(),\n firstPatchedVersion: FirstPatchedVersionSchema.nullish(),\n});\nexport type SecurityVulnerability = z.infer<typeof SecurityVulnerabilitySchema>;\n\nconst CvssSeveritiesSchema = z.object({\n cvssV3: CvssSchema.nullish(),\n cvssV4: CvssSchema.nullish(),\n});\ntype CvssSeverities = z.infer<typeof CvssSeveritiesSchema>;\n\nconst GitHubSecurityVulnerabilitiesResponseSchema = z.object({\n securityVulnerabilities: z.object({\n nodes: z\n .object({\n advisory: SecurityAdvisorySchema.omit({ cvss: true /* incoming is cvssSeverities */ }).extend({\n cvssSeverities: CvssSeveritiesSchema,\n cwes: z.object({ nodes: CweSchema.array() }).nullish(),\n }),\n firstPatchedVersion: FirstPatchedVersionSchema.nullish(),\n vulnerableVersionRange: z.string(),\n })\n .array(),\n }),\n});\ntype GitHubSecurityVulnerabilitiesResponse = z.infer<typeof GitHubSecurityVulnerabilitiesResponseSchema>;\n\nexport function getGhsaPackageEcosystemFromDependabotPackageManager(\n dependabotPackageManager: string,\n): PackageEcosystem {\n switch (dependabotPackageManager) {\n case 'composer':\n return 'COMPOSER';\n case 'elm':\n return 'ERLANG';\n case 'github_actions':\n return 'ACTIONS';\n case 'go_modules':\n return 'GO';\n case 'maven':\n return 'MAVEN';\n case 'npm_and_yarn':\n return 'NPM';\n case 'nuget':\n return 'NUGET';\n case 'pip':\n return 'PIP';\n case 'pub':\n return 'PUB';\n case 'bundler':\n return 'RUBYGEMS';\n case 'cargo':\n return 'RUST';\n case 'swift':\n return 'SWIFT';\n default:\n throw new Error(`Unknown dependabot package manager: ${dependabotPackageManager}`);\n }\n}\n\n/**\n * GitHub Security Advisory client\n */\nexport class GitHubSecurityAdvisoryClient {\n private readonly octokit: Octokit;\n\n /**\n * @param token GitHub personal access token with access to the GHSA API\n */\n constructor(token: string) {\n this.octokit = createGitHubClient({ token });\n }\n\n /**\n * Get the list of security vulnerabilities for a given package ecosystem and list of packages\n * @param packageEcosystem\n * @param packages\n */\n public async getSecurityVulnerabilitiesAsync(\n packageEcosystem: PackageEcosystem,\n packages: Package[],\n ): Promise<SecurityVulnerability[]> {\n // GitHub API doesn't support querying multiple package at once, so we need to make a request for each package individually.\n // To speed up the process, we can make the requests in parallel, 100 at a time. We batch the requests to avoid hitting the rate limit too quickly.\n // https://docs.github.com/en/graphql/overview/rate-limits-and-node-limits-for-the-graphql-api\n const securityVulnerabilities = await this.batchGraphQueryAsync<Package, SecurityVulnerability>(\n 100,\n packages,\n async (pkg) => {\n const variables = {\n ecosystem: packageEcosystem,\n package: pkg.name,\n };\n\n function pickCvss(value: CvssSeverities): Cvss | undefined {\n // Pick the one with a non-zero score\n if (value.cvssV4 && value.cvssV4.score > 0) return value.cvssV4;\n if (value.cvssV3 && value.cvssV3.score > 0) return value.cvssV3;\n }\n\n try {\n const response = await this.octokit.graphql<GitHubSecurityVulnerabilitiesResponse>(\n GHSA_SECURITY_VULNERABILITIES_QUERY,\n variables,\n );\n const parsed = GitHubSecurityVulnerabilitiesResponseSchema.parse(response);\n const vulnerabilities = parsed.securityVulnerabilities.nodes;\n return (\n vulnerabilities\n ?.filter((v) => v.advisory != null)\n ?.map(\n (v) =>\n ({\n ...v,\n package: pkg,\n advisory: {\n ...v.advisory,\n cwes: v.advisory.cwes?.nodes,\n cvss: pickCvss(v.advisory.cvssSeverities),\n },\n }) satisfies SecurityVulnerability,\n ) || []\n );\n } catch (error) {\n logger.warn(`GHSA GraphQL request failed for package ${pkg.name}: ${error}. Continuing with other packages.`);\n return [];\n }\n },\n );\n\n return securityVulnerabilities;\n }\n\n /**\n * Batch requests in parallel to speed up the process when we are forced to do a N+1 query\n * @param batchSize\n * @param items\n * @param action\n * @returns\n */\n private async batchGraphQueryAsync<T1, T2>(batchSize: number, items: T1[], action: (item: T1) => Promise<T2[]>) {\n const results: T2[] = [];\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n if (batch?.length) {\n try {\n const batchResults = await Promise.all(batch.map(action));\n if (batchResults?.length) {\n results.push(...batchResults.flat());\n }\n } catch (error) {\n logger.warn(`Request batch [${i}-${i + batchSize}] failed; The data may be incomplete. ${error}`);\n }\n }\n }\n return results;\n }\n}\n\nexport function filterVulnerabilities(securityVulnerabilities: SecurityVulnerability[]): SecurityVulnerability[] {\n // Filter out vulnerabilities that have been withdrawn or that are not relevant the current version of the package\n const affectedVulnerabilities = securityVulnerabilities\n .filter((v) => !v.advisory.withdrawnAt)\n .filter((v) => {\n const pkg = v.package;\n if (!pkg || !pkg.version || !v.vulnerableVersionRange) {\n return false;\n }\n\n /**\n * The vulnerable version range follows a basic syntax with a few forms:\n * `= 0.2.0` denotes a single vulnerable version\n * `<= 1.0.8` denotes a version range up to and including the specified version\n * `< 0.1.11` denotes a version range up to, but excluding, the specified version\n * `>= 4.3.0, < 4.3.5` denotes a version range with a known minimum and maximum version\n * `>= 0.0.1` denotes a version range with a known minimum, but no known maximum\n */\n const versionRangeRequirements = v.vulnerableVersionRange.split(',').map((v) => v.trim());\n return versionRangeRequirements.every((r) => pkg.version && semver.satisfies(pkg.version, r));\n });\n return affectedVulnerabilities;\n}\n"],"mappings":"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"}
|
|
@@ -39,7 +39,7 @@ interface ProblemDetails {
|
|
|
39
39
|
type CreateInnerApiClientOptions = {
|
|
40
40
|
/**
|
|
41
41
|
* The base URL to use for the API.
|
|
42
|
-
* @example 'https://
|
|
42
|
+
* @example 'https://www.paklo.app/api'
|
|
43
43
|
*/
|
|
44
44
|
baseUrl: string;
|
|
45
45
|
/** The token to use for authentication. This can be a JWT or specialized key. */
|
|
@@ -53,7 +53,7 @@ type RequestOptions = {
|
|
|
53
53
|
*/
|
|
54
54
|
userAgent?: string;
|
|
55
55
|
};
|
|
56
|
-
type ResourceResponse<T
|
|
56
|
+
type ResourceResponse<T = Record<string, unknown>> = {
|
|
57
57
|
/** The headers of the response. */
|
|
58
58
|
headers: Headers;
|
|
59
59
|
/** Whether the request was successful. */
|
|
@@ -63,15 +63,15 @@ type ResourceResponse<T$1 = Record<string, unknown>> = {
|
|
|
63
63
|
/** The status text of the response. */
|
|
64
64
|
statusText: string;
|
|
65
65
|
/** The data of the response. */
|
|
66
|
-
data?: T
|
|
66
|
+
data?: T;
|
|
67
67
|
/** The error of the response. */
|
|
68
68
|
error?: ProblemDetails;
|
|
69
69
|
};
|
|
70
|
-
type InnerRequestOptions<T
|
|
70
|
+
type InnerRequestOptions<T> = RequestOptions & {
|
|
71
71
|
/**
|
|
72
72
|
* The base URL to use for the request.
|
|
73
73
|
* This overrides the default base URL.
|
|
74
|
-
* @example 'https://
|
|
74
|
+
* @example 'https://www.paklo.app/api'
|
|
75
75
|
*/
|
|
76
76
|
baseUrl?: string;
|
|
77
77
|
/** Additional headers to use for the request. */
|
|
@@ -79,9 +79,9 @@ type InnerRequestOptions<T$1> = RequestOptions & {
|
|
|
79
79
|
/** The payload to use for the request. */
|
|
80
80
|
payload?: Record<string, unknown> | MultipartFormDataBody | ReadableStream | XMLHttpRequestBodyInit;
|
|
81
81
|
/** The schema to use when parsing the response. */
|
|
82
|
-
schema?: ZodType<T
|
|
82
|
+
schema?: ZodType<T>;
|
|
83
83
|
};
|
|
84
|
-
type InnerRequestOptionsComplete<T
|
|
84
|
+
type InnerRequestOptionsComplete<T> = InnerRequestOptions<T> & {
|
|
85
85
|
/** The method to use for the request. */
|
|
86
86
|
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
87
87
|
/** The URL to use for the request. */
|
|
@@ -118,4 +118,4 @@ declare function isErrorTemporaryFailure(e?: {
|
|
|
118
118
|
} | null): boolean;
|
|
119
119
|
//#endregion
|
|
120
120
|
export { CreateInnerApiClientOptions, HEADER_NAME_ACCEPT, HEADER_NAME_AUTHORIZATION, HEADER_NAME_CONTENT_DISPOSITION, HEADER_NAME_CONTENT_TYPE, HEADER_NAME_USER_AGENT, HttpRequestError, InnerApiClient, InnerRequestOptions, ProblemDetails, RequestOptions, ResourceResponse, isErrorTemporaryFailure };
|
|
121
|
-
//# sourceMappingURL=
|
|
121
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import { a as HEADER_NAME_AUTHORIZATION, c as HEADER_NAME_USER_AGENT, i as HEADER_NAME_ACCEPT, n as InnerApiClient, o as HEADER_NAME_CONTENT_DISPOSITION, r as isErrorTemporaryFailure, s as HEADER_NAME_CONTENT_TYPE, t as HttpRequestError } from "
|
|
1
|
+
import "../environment-DX5CD-dD.js";
|
|
2
|
+
import { a as HEADER_NAME_AUTHORIZATION, c as HEADER_NAME_USER_AGENT, i as HEADER_NAME_ACCEPT, n as InnerApiClient, o as HEADER_NAME_CONTENT_DISPOSITION, r as isErrorTemporaryFailure, s as HEADER_NAME_CONTENT_TYPE, t as HttpRequestError } from "../http-Be3uWaqn.js";
|
|
3
3
|
|
|
4
4
|
export { HEADER_NAME_ACCEPT, HEADER_NAME_AUTHORIZATION, HEADER_NAME_CONTENT_DISPOSITION, HEADER_NAME_CONTENT_TYPE, HEADER_NAME_USER_AGENT, HttpRequestError, InnerApiClient, isErrorTemporaryFailure };
|
|
@@ -242,4 +242,4 @@ function isErrorTemporaryFailure(e) {
|
|
|
242
242
|
|
|
243
243
|
//#endregion
|
|
244
244
|
export { HEADER_NAME_AUTHORIZATION as a, HEADER_NAME_USER_AGENT as c, HEADER_NAME_ACCEPT as i, InnerApiClient as n, HEADER_NAME_CONTENT_DISPOSITION as o, isErrorTemporaryFailure as r, HEADER_NAME_CONTENT_TYPE as s, HttpRequestError as t };
|
|
245
|
-
//# sourceMappingURL=http-
|
|
245
|
+
//# sourceMappingURL=http-Be3uWaqn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-Be3uWaqn.js","names":["data: Array<MultipartFormDataBodyPart['body']>","list: Buffer[]","headers: Record<string, string>","body: BodyInit | undefined","error: ProblemDetails","code: number"],"sources":["../src/http/headers.ts","../src/http/multipart.ts","../src/http/inner.ts"],"sourcesContent":["export const HEADER_NAME_CONTENT_DISPOSITION = 'Content-Disposition';\nexport const HEADER_NAME_CONTENT_TYPE = 'Content-Type';\nexport const HEADER_NAME_ACCEPT = 'Accept';\nexport const HEADER_NAME_USER_AGENT = 'User-Agent';\nexport const HEADER_NAME_AUTHORIZATION = 'Authorization';\n","import { HEADER_NAME_CONTENT_DISPOSITION, HEADER_NAME_CONTENT_TYPE } from './headers';\n\nexport class MultipartFormDataBody {\n private type = 'multipart/form-data';\n private boundary: string = `${Math.random().toString(36).substring(2)}`;\n private parts: Array<MultipartFormDataBodyPart> = [];\n\n public async encode(): Promise<Buffer> {\n if (this.parts.length === 0) {\n throw new Error('MultipartFormDataBody must have at least one part');\n }\n\n const data: Array<MultipartFormDataBodyPart['body']> = [];\n\n for (const part of this.parts) {\n // write boundary\n data.push(`--${this.boundary}\\r\\n`);\n\n // write headers\n for (const [key, value] of Object.entries(part.headers)) {\n data.push(`${key}: ${value}\\r\\n`);\n }\n data.push('\\r\\n');\n\n // write body\n data.push(part.body);\n data.push('\\r\\n');\n }\n\n data.push(`--${this.boundary}--\\r\\n`);\n\n const list: Buffer[] = [];\n for (const item of data) {\n if (item instanceof File) list.push(Buffer.from(await item.arrayBuffer()));\n else if (typeof item === 'string') list.push(Buffer.from(item, 'utf8'));\n else list.push(item);\n }\n return Buffer.concat(list);\n }\n\n public getBoundary(): string {\n return this.boundary;\n }\n\n public getContentType(): string {\n return `${this.type}; boundary=${this.boundary}`;\n }\n\n public add(name: string, value: string) {\n const part = createPart(name, value);\n this.parts.push(part);\n }\n\n public addFile(name: string, file: File) {\n const part = createPart(name, file, file.name, file.type);\n this.parts.push(part);\n }\n}\n\ntype MultipartFormDataBodyPart = {\n name: string;\n headers: Record<string, string>;\n body: Buffer | File | string;\n};\n\nfunction createPart(\n name: string,\n body: MultipartFormDataBodyPart['body'],\n filename?: string,\n contentType?: string,\n): MultipartFormDataBodyPart {\n const headers: Record<string, string> = {};\n headers[HEADER_NAME_CONTENT_DISPOSITION] = `form-data; name=\"${name}\"${filename ? `; filename=\"${filename}\"` : ''}`;\n if (contentType) headers[HEADER_NAME_CONTENT_TYPE] = contentType;\n return { name, headers, body };\n}\n","import type { ZodType } from 'zod/v4';\n\nimport { environment } from '@/environment';\n\nimport {\n HEADER_NAME_ACCEPT,\n HEADER_NAME_AUTHORIZATION,\n HEADER_NAME_CONTENT_TYPE,\n HEADER_NAME_USER_AGENT,\n} from './headers';\nimport { MultipartFormDataBody } from './multipart';\nimport type { ProblemDetails } from './problem';\n\nconst defaultUserAgent = `paklo/${environment.sha?.substring(0, 7) ?? 'dogfood'}`;\n\nexport type CreateInnerApiClientOptions = {\n /**\n * The base URL to use for the API.\n * @example 'https://www.paklo.app/api'\n */\n baseUrl: string;\n\n /** The token to use for authentication. This can be a JWT or specialized key. */\n token?: string;\n};\n\nexport type RequestOptions = {\n /**\n * Value for the `User-Agent` header.\n * This prepends the default value (e.g. `paklo/ab26320`)\n * which is important when we need to propagate the browser information to the server.\n */\n userAgent?: string;\n};\n\nexport type ResourceResponse<T = Record<string, unknown>> = {\n /** The headers of the response. */\n headers: Headers;\n\n /** Whether the request was successful. */\n successful: boolean;\n\n /** The status code of the response. */\n status: number;\n\n /** The status text of the response. */\n statusText: string;\n\n /** The data of the response. */\n data?: T;\n\n /** The error of the response. */\n error?: ProblemDetails;\n};\n\nexport type InnerRequestOptions<T> = RequestOptions & {\n /**\n * The base URL to use for the request.\n * This overrides the default base URL.\n * @example 'https://www.paklo.app/api'\n */\n baseUrl?: string;\n\n /** Additional headers to use for the request. */\n headers?: HeadersInit;\n\n /** The payload to use for the request. */\n payload?: Record<string, unknown> | MultipartFormDataBody | ReadableStream | XMLHttpRequestBodyInit;\n\n /** The schema to use when parsing the response. */\n schema?: ZodType<T>;\n};\n\ntype InnerRequestOptionsComplete<T> = InnerRequestOptions<T> & {\n /** The method to use for the request. */\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n /** The URL to use for the request. */\n url: string;\n};\n\nexport class InnerApiClient {\n private readonly baseUrl: string;\n private readonly headers: Headers;\n private readonly token?: string;\n\n /**\n * Create a new API client.\n * @param options The options to use for the client.\n */\n constructor({ baseUrl, token }: CreateInnerApiClientOptions) {\n this.baseUrl = baseUrl;\n\n this.headers = new Headers({\n [HEADER_NAME_ACCEPT]: 'application/json',\n });\n\n this.token = token;\n }\n\n async get<T>(url: string, options?: InnerRequestOptions<T>) {\n return this.request<T>({\n url: this.makeUrl(url, options),\n method: 'GET',\n ...options,\n });\n }\n\n async post<T>(url: string, options?: InnerRequestOptions<T>) {\n return this.request<T>({\n method: 'POST',\n url: this.makeUrl(url, options),\n ...options,\n });\n }\n\n async put<T>(url: string, options?: InnerRequestOptions<T>) {\n return this.request<T>({\n method: 'PUT',\n url: this.makeUrl(url, options),\n ...options,\n });\n }\n\n async patch<T>(url: string, options?: InnerRequestOptions<T>) {\n return this.request<T>({\n method: 'PATCH',\n url: this.makeUrl(url, options),\n ...options,\n });\n }\n\n async delete<T>(url: string, options?: InnerRequestOptions<T>) {\n return this.request<T>({\n method: 'DELETE',\n url: this.makeUrl(url, options),\n ...options,\n });\n }\n\n async request<T>(options: InnerRequestOptionsComplete<T>): Promise<ResourceResponse<T>> {\n const { method, url, payload, userAgent, headers: additionalHeaders, schema } = options;\n\n // create headers for the request\n const headers = new Headers(this.headers);\n const finalUserAgent = userAgent && userAgent.length > 0 ? `${userAgent} (${defaultUserAgent})` : defaultUserAgent;\n headers.set(HEADER_NAME_USER_AGENT, finalUserAgent);\n\n // populate authorization header\n if (this.token) {\n headers.set(HEADER_NAME_AUTHORIZATION, `Bearer ${this.token}`);\n }\n\n // populate additional headers\n // biome-ignore-start lint/suspicious/useIterableCallbackReturn: not used\n if (additionalHeaders) {\n if (additionalHeaders instanceof Headers) {\n additionalHeaders.forEach((value, key) => headers.set(key, value as string));\n } else if (Array.isArray(additionalHeaders)) {\n additionalHeaders.forEach(([key, value]) => headers.set(key, value));\n } else {\n Object.entries(additionalHeaders).forEach(([key, value]) => headers.set(key, value as string));\n }\n }\n // biome-ignore-end lint/suspicious/useIterableCallbackReturn: not used\n\n // prepare body\n let body: BodyInit | undefined;\n if (skipSerialization(payload)) body = payload;\n else if (payload instanceof MultipartFormDataBody) {\n body = new Uint8Array(await payload.encode());\n headers.set(HEADER_NAME_CONTENT_TYPE, payload.getContentType());\n } else {\n body = JSON.stringify(payload);\n headers.set(HEADER_NAME_CONTENT_TYPE, 'application/json');\n }\n\n // make request\n try {\n const response = await fetch(url, { method, headers, body });\n const { ok: successful, status, statusText } = response;\n\n if (!successful) {\n try {\n const rawError = await response.text();\n return { headers: response.headers, successful, status, statusText, error: JSON.parse(rawError) };\n } catch (err) {\n if (err instanceof SyntaxError) {\n return {\n headers: response.headers,\n successful,\n status,\n statusText,\n error: {\n title: 'Unknown error',\n status,\n statusText: response.statusText,\n },\n };\n }\n\n const error: ProblemDetails = {\n title: (err instanceof Error ? err.message : undefined) ?? 'Unknown error',\n status: response.status,\n statusText: response.statusText,\n };\n\n return { headers: response.headers, successful, status, statusText, error };\n }\n }\n\n const contentLength = response.headers.get('content-length');\n let data = contentLength && contentLength !== '0' ? ((await response.json()) as T) : undefined;\n if (data && schema) {\n const result = await schema.safeParseAsync(data);\n if (!result.success) {\n return {\n headers: response.headers,\n successful: false,\n status,\n statusText,\n data,\n error: {\n title: 'application_error',\n detail: 'Schema validation error',\n errors: result.error.flatten().fieldErrors,\n status: response.status,\n statusText: response.statusText,\n },\n };\n }\n data = result.data;\n }\n\n return { headers: response.headers, data, successful, status, statusText };\n } catch (err) {\n return {\n headers: new Headers(),\n successful: false,\n status: -1,\n statusText: 'Application Error',\n error: {\n title: 'application_error',\n detail: `Unable to fetch data. The request could not be resolved. ${err}`,\n },\n };\n }\n }\n\n private makeUrl<T>(url: string, options?: InnerRequestOptions<T>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) return url;\n const baseUrl = options?.baseUrl ?? this.baseUrl;\n return `${baseUrl}${url}`;\n }\n}\n\n/**\n * Whether to skip serialization of the payload.\n * @param payload The payload to check.\n * @returns true if the payload should not be serialized; otherwise, false.\n */\nfunction skipSerialization(\n payload: InnerRequestOptions<never>['payload'],\n): payload is FormData | URLSearchParams | ReadableStream | Blob | ArrayBuffer | string | undefined {\n return (\n payload instanceof FormData ||\n payload instanceof URLSearchParams ||\n payload instanceof ReadableStream ||\n payload instanceof Blob ||\n payload instanceof ArrayBuffer ||\n payload instanceof Buffer ||\n typeof payload === 'string' ||\n !payload\n );\n}\n\n/** Http request error */\nexport class HttpRequestError extends Error {\n constructor(\n message: string,\n public code: number,\n ) {\n super(message);\n }\n}\n\nexport function isErrorTemporaryFailure(e?: { code?: string | number; message?: string } | null): boolean {\n if (e instanceof HttpRequestError) {\n // Check for common HTTP status codes that indicate a temporary failure\n // See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n switch (e.code) {\n case 502:\n return true; // 502 Bad Gateway\n case 503:\n return true; // 503 Service Unavailable\n case 504:\n return true; // 504 Gateway Timeout\n default:\n return false;\n }\n } else if (e?.code) {\n // Check for Node.js system errors that indicate a temporary failure\n // See: https://nodejs.org/api/errors.html#errors_common_system_errors\n switch (e.code) {\n case 'ETIMEDOUT':\n return true; // Operation timed out\n default:\n return false;\n }\n } else {\n return false;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { z } from "zod/v4";
|
|
2
|
+
import { Octokit } from "octokit";
|
|
2
3
|
|
|
4
|
+
//#region src/github/client.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates an authenticated GitHub API client using Octokit.
|
|
8
|
+
*
|
|
9
|
+
* @param token - GitHub personal access token or fine-grained token with appropriate permissions
|
|
10
|
+
* @returns Configured Octokit instance ready for API calls
|
|
11
|
+
*/
|
|
12
|
+
declare function createGitHubClient({
|
|
13
|
+
token
|
|
14
|
+
}: {
|
|
15
|
+
token: string;
|
|
16
|
+
}): Octokit;
|
|
17
|
+
//#endregion
|
|
3
18
|
//#region src/github/ghsa.d.ts
|
|
4
19
|
declare const PackageEcosystemSchema: z.ZodEnum<{
|
|
5
20
|
COMPOSER: "COMPOSER";
|
|
@@ -54,11 +69,11 @@ declare const SecurityAdvisorySchema: z.ZodObject<{
|
|
|
54
69
|
}, z.core.$strip>>>>;
|
|
55
70
|
cvss: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
56
71
|
score: z.ZodNumber;
|
|
57
|
-
vectorString: z.ZodString
|
|
72
|
+
vectorString: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
58
73
|
}, z.core.$strip>>>;
|
|
59
74
|
epss: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
60
|
-
percentage: z.ZodNumber
|
|
61
|
-
percentile: z.ZodNumber
|
|
75
|
+
percentage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
76
|
+
percentile: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
62
77
|
}, z.core.$strip>>>;
|
|
63
78
|
cwes: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
64
79
|
cweId: z.ZodString;
|
|
@@ -101,11 +116,11 @@ declare const SecurityVulnerabilitySchema: z.ZodObject<{
|
|
|
101
116
|
}, z.core.$strip>>>>;
|
|
102
117
|
cvss: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
103
118
|
score: z.ZodNumber;
|
|
104
|
-
vectorString: z.ZodString
|
|
119
|
+
vectorString: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
105
120
|
}, z.core.$strip>>>;
|
|
106
121
|
epss: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
107
|
-
percentage: z.ZodNumber
|
|
108
|
-
percentile: z.ZodNumber
|
|
122
|
+
percentage: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
123
|
+
percentile: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
109
124
|
}, z.core.$strip>>>;
|
|
110
125
|
cwes: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
111
126
|
cweId: z.ZodString;
|
|
@@ -125,11 +140,14 @@ declare const SecurityVulnerabilitySchema: z.ZodObject<{
|
|
|
125
140
|
type SecurityVulnerability = z.infer<typeof SecurityVulnerabilitySchema>;
|
|
126
141
|
declare function getGhsaPackageEcosystemFromDependabotPackageManager(dependabotPackageManager: string): PackageEcosystem;
|
|
127
142
|
/**
|
|
128
|
-
* GitHub
|
|
143
|
+
* GitHub Security Advisory client
|
|
129
144
|
*/
|
|
130
|
-
declare class
|
|
131
|
-
private readonly
|
|
132
|
-
|
|
145
|
+
declare class GitHubSecurityAdvisoryClient {
|
|
146
|
+
private readonly octokit;
|
|
147
|
+
/**
|
|
148
|
+
* @param token GitHub personal access token with access to the GHSA API
|
|
149
|
+
*/
|
|
150
|
+
constructor(token: string);
|
|
133
151
|
/**
|
|
134
152
|
* Get the list of security vulnerabilities for a given package ecosystem and list of packages
|
|
135
153
|
* @param packageEcosystem
|
|
@@ -147,5 +165,5 @@ declare class GitHubGraphClient {
|
|
|
147
165
|
}
|
|
148
166
|
declare function filterVulnerabilities(securityVulnerabilities: SecurityVulnerability[]): SecurityVulnerability[];
|
|
149
167
|
//#endregion
|
|
150
|
-
export {
|
|
151
|
-
//# sourceMappingURL=
|
|
168
|
+
export { createGitHubClient as _, PackageEcosystemSchema as a, SecurityAdvisoryIdentifierSchema as c, SecurityAdvisorySeverity as d, SecurityAdvisorySeveritySchema as f, getGhsaPackageEcosystemFromDependabotPackageManager as g, filterVulnerabilities as h, PackageEcosystem as i, SecurityAdvisoryIdentifierType as l, SecurityVulnerabilitySchema as m, GitHubSecurityAdvisoryClient as n, PackageSchema as o, SecurityVulnerability as p, Package as r, SecurityAdvisory as s, FirstPatchedVersion as t, SecurityAdvisorySchema as u };
|
|
169
|
+
//# sourceMappingURL=index-CYzMyUeu.d.ts.map
|