Skip to content

Commit c03fb6f

Browse files
committed
chore: package.json validation in zip
1 parent 6a1896f commit c03fb6f

File tree

5 files changed

+57
-7
lines changed

5 files changed

+57
-7
lines changed

src/api/publishGithubRelease.js

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Refer https://json-schema.org/understanding-json-schema/index.html
22
import {HTTP_STATUS_CODES} from "@aicore/libcommonutils";
3-
import {getRepoDetails, getReleaseDetails, createIssue} from "../github.js";
3+
import {getRepoDetails, getReleaseDetails, createIssue, getOrgDetails} from "../github.js";
44
import db from "../db.js";
55
import {downloader} from "../utils/downloader.js";
66
import {ZipUtils} from "../utils/zipUtils.js";
@@ -151,7 +151,7 @@ function _validateGitHubReleaseAssets(githubReleaseDetails, issueMessages) {
151151
return extensionZipAsset;
152152
}
153153

154-
async function _validateExtensionPackageJson(githubReleaseTag, packageJSON, issueMessages) {
154+
async function _validateExtensionPackageJson(githubReleaseTag, packageJSON, repoDetails, issueMessages) {
155155
const queryObj = {};
156156
const newOwner = `github:${githubReleaseTag.owner}`;
157157
const releaseRef = `${githubReleaseTag.owner}/${githubReleaseTag.repo}/${githubReleaseTag.tag}`;
@@ -196,9 +196,33 @@ async function _validateExtensionPackageJson(githubReleaseTag, packageJSON, issu
196196
updatePublishErrors: true,
197197
error};
198198
}
199+
let org = await getOrgDetails(githubReleaseTag.owner);
200+
let ownershipVerifiedByGitHub = null;
201+
if(org && org.is_verified && org.blog){
202+
ownershipVerifiedByGitHub = [org.blog];
203+
}
204+
// now create the new registry package json
205+
registryPKG = registryPKG || {
206+
"versions": [],
207+
"totalDownloads": 0,
208+
"recent": {}
209+
};
210+
registryPKG.metadata= packageJSON;
211+
registryPKG.owner= `github:${githubReleaseTag.owner}`;
212+
registryPKG.gihubStars = repoDetails.stargazers_count;
213+
registryPKG.ownerRepo = `https://github.com/${githubReleaseTag.owner}/${githubReleaseTag.repo}`;
214+
registryPKG.ownershipVerifiedByGitHub = ownershipVerifiedByGitHub;
215+
registryPKG.versions.push({
216+
"version": packageJSON.version,
217+
"published": new Date().toISOString(),
218+
"brackets": packageJSON.engines.brackets,
219+
"downloads": 0
220+
});
221+
222+
console.log(registryPKG);
199223
}
200224

201-
async function _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAsset, issueMessages) {
225+
async function _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAsset, repoDetails, issueMessages) {
202226
const targetPath = `${EXTENSION_DOWNLOAD_DIR}/${githubReleaseTag.owner}_${githubReleaseTag.repo}_${githubReleaseTag.tag}_${extensionZipAsset.name}`;
203227
await downloader.downloadFile(extensionZipAsset.browser_download_url, targetPath);
204228
let {packageJSON, error} = await ZipUtils.getExtensionPackageJSON(targetPath);
@@ -225,7 +249,7 @@ async function _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAs
225249
updatePublishErrors: true,
226250
error};
227251
}
228-
await _validateExtensionPackageJson(githubReleaseTag, packageJSON, issueMessages);
252+
await _validateExtensionPackageJson(githubReleaseTag, packageJSON, repoDetails, issueMessages);
229253
return targetPath;
230254
}
231255

@@ -316,7 +340,7 @@ export async function publishGithubRelease(request, reply) {
316340
error: `Draft or PreRelease builds cannot be published.`};
317341
}
318342
const extensionZipAsset = _validateGitHubReleaseAssets(newGithubReleaseDetails, issueMessages);
319-
extensionZipPath = await _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAsset, issueMessages);
343+
extensionZipPath = await _downloadAndValidateExtensionZip(githubReleaseTag, extensionZipAsset, repoDetails, issueMessages);
320344
// we should also in the future do a virus scan, but will rely on av in users machine for the time being
321345
// https://developers.virustotal.com/reference/files-scan by Google Cloud is available for non-commercial apps.
322346
const response = {

src/utils/downloader.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function downloadFile(url, downloadFilePath) {
1818
}
1919
const file = fs.createWriteStream(downloadFilePath);
2020
follow.https.get(url, function(response) {
21+
console.log("response code", response.code);
2122
response.pipe(file);
2223
file.on('finish', function() {
2324
console.log("Download complete ", url, downloadFilePath);

test/unit/api/publishGithubRelease.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ describe('unit Tests for publishGithubRelease api', function () {
2525
mockedFunctions.githubMock.reset();
2626
mockedFunctions.githubMock.getRepoDetails("org", "repo");
2727
mockedFunctions.githubMock.getReleaseDetails("org", "repo", "gitTag");
28+
mockedFunctions.githubMock.getOrgDetails("org");
2829
downloader.downloadFile = async function () {
2930
return "/path/to/file.zip";
3031
};

test/unit/data/packagejson.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,8 @@ export const REGISTRY_PACKAGE_JSON = {
6060
"20180909": 103,
6161
"20180910": 85,
6262
"20180911": 10
63-
}
63+
},
64+
"gihubStars": 482,
65+
"ownerRepo": "https://github.com/louiealmeda/brackets-angular-moduler",
66+
"ownershipVerifiedByGitHub":["https://emmet.io"]
6467
};

test/unit/setupMocks.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,16 @@ let expect = chai.expect;
77

88
let setupDone = false;
99

10-
let getRepoDetailsResponses = {},
10+
let getOrgDetailsResponses = {},
11+
getRepoDetailsResponses = {},
1112
getReleaseDetailsResponses = {};
1213
async function githubRequestFnMock(url, options) {
14+
if(url.startsWith("GET /orgs/")){ // getOrgDetails api
15+
if(getOrgDetailsResponses[`${options.owner}`]) {
16+
return getOrgDetailsResponses[`${options.owner}`];
17+
}
18+
throw {status: 404};
19+
}
1320
if(url.startsWith("GET /repos/") && !url.includes("/releases/tags/")){ // getRepoDetails api
1421
if(getRepoDetailsResponses[`${options.owner}/${options.repo}`]) {
1522
return getRepoDetailsResponses[`${options.owner}/${options.repo}`];
@@ -123,6 +130,19 @@ export function getRepoDetails(org, repo) {
123130
};
124131
}
125132

133+
export function getOrgDetails(org) {
134+
mockedFunctions.githubRequestFnMock = githubRequestFnMock;
135+
getOrgDetailsResponses[`${org}`] = {
136+
data: {
137+
name: org,
138+
company: org,
139+
blog: `https://org`,
140+
is_verified: true,
141+
html_url: 'https://github.com/org'
142+
}
143+
};
144+
}
145+
126146
export function getReleaseDetails(owner, repo, tag, assetName = 'extension.zip', size = 1024) {
127147
mockedFunctions.githubRequestFnMock = githubRequestFnMock;
128148
getReleaseDetailsResponses[`${owner}/${repo}/${tag}`] = {
@@ -149,6 +169,7 @@ let mockedFunctions = {
149169
s3MockedKeyValues: {},
150170
githubRequestFnMock, // you should almost always use githubMock instead of githubRequestFnMock
151171
githubMock: {
172+
getOrgDetails,
152173
getRepoDetails,
153174
getReleaseDetails,
154175
reset: function () {

0 commit comments

Comments
 (0)