Skip to content

Commit

Permalink
Identify parent component from the pubspec.yaml files (#1570)
Browse files Browse the repository at this point in the history
* Identify parent component from the pubspec.yaml files

Signed-off-by: Prabhu Subramanian <[email protected]>

---------

Signed-off-by: Prabhu Subramanian <[email protected]>
  • Loading branch information
prabhu authored Jan 16, 2025
1 parent 4408d04 commit a1025e6
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 48 deletions.
50 changes: 24 additions & 26 deletions lib/cli/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3959,14 +3959,30 @@ export async function createDartBom(path, options) {
);
let dependencies = [];
let pkgList = [];
const parentComponent = determineParentComponent(options);
let parentComponent;
if (pubSpecYamlFiles.length) {
for (const f of pubSpecYamlFiles) {
if (DEBUG_MODE) {
console.log(`Parsing ${f}`);
}
const pubYamlData = readFileSync(f, { encoding: "utf-8" });
const dlist = parsePubYamlData(pubYamlData);
if (dlist?.length) {
pkgList = pkgList.concat(dlist);
if (!parentComponent) {
parentComponent = pkgList[0];
parentComponent.type = "application";
}
}
}
}
if (pubFiles.length) {
for (const f of pubFiles) {
if (DEBUG_MODE) {
console.log(`Parsing ${f}`);
}
const pubLockData = readFileSync(f, { encoding: "utf-8" });
const retMap = await parsePubLockData(pubLockData);
const retMap = await parsePubLockData(pubLockData, f);
if (retMap.pkgList?.length) {
pkgList = pkgList.concat(retMap.pkgList);
}
Expand All @@ -3986,31 +4002,13 @@ export async function createDartBom(path, options) {
);
}
}
return buildBomNSData(options, pkgList, "pub", {
src: path,
dependencies,
parentComponent,
filename: pubFiles.join(", "),
});
}
if (pubSpecYamlFiles.length) {
for (const f of pubSpecYamlFiles) {
if (DEBUG_MODE) {
console.log(`Parsing ${f}`);
}
const pubYamlData = readFileSync(f, { encoding: "utf-8" });
const dlist = parsePubYamlData(pubYamlData);
if (dlist?.length) {
pkgList = pkgList.concat(dlist);
}
}
return buildBomNSData(options, pkgList, "pub", {
src: path,
filename: pubSpecYamlFiles.join(", "),
});
}

return {};
return buildBomNSData(options, pkgList, "pub", {
src: path,
dependencies,
parentComponent,
filename: pubFiles.join(", "),
});
}

/**
Expand Down
62 changes: 51 additions & 11 deletions lib/helpers/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -7426,27 +7426,45 @@ export async function parseCargoAuditableData(cargoData) {
return pkgList;
}

export async function parsePubLockData(pubLockData) {
/**
* Method to parse pubspec.lock files.
*
* @param pubLockData Contents of lock data
* @param lockFile Filename for setting evidence
*
* @returns {Object}
*/
export async function parsePubLockData(pubLockData, lockFile) {
if (!pubLockData) {
return [];
}
let pkgList = [];
const rootList = [];
const data = _load(pubLockData);
const packages = data.packages;

for (const [packageName, packageData] of Object.entries(packages)) {
const pkg = { name: packageName, version: packageData.version };
const pkg = {
name: packageName,
version: packageData.version,
properties: [],
};
// older dart versions don't have sha256
if (packageData.description?.sha256) {
pkg._integrity = `sha256-${packageData.description?.sha256}`;
}

const purlString = new PackageURL("dart", "", pkg.name, pkg.version)
if (
packageData.description?.url &&
packageData.description?.url !== "https://pub.dev"
) {
pkg.properties.push({
name: "cdx:pub:registry",
value: packageData.description.url,
});
}
const purlString = new PackageURL("pub", "", pkg.name, pkg.version)
.toString()
.replace(/%2F/g, "/");
pkg["bom-ref"] = decodeURIComponent(purlString);

if (packageData.dependency === "direct main") {
pkg.scope = "required";
rootList.push(pkg);
Expand All @@ -7455,14 +7473,30 @@ export async function parsePubLockData(pubLockData) {
} else if (packageData.dependency === "direct dev") {
pkg.scope = "optional";
}

if (lockFile) {
pkg.properties.push({
name: "SrcFile",
value: lockFile,
});
pkg.evidence = {
identity: {
field: "purl",
confidence: 1,
methods: [
{
technique: "manifest-analysis",
confidence: 1,
value: lockFile,
},
],
},
};
}
pkgList.push(pkg);
}

if (shouldFetchLicense()) {
pkgList = await getDartMetadata(pkgList);
}

return { rootList, pkgList };
}

Expand All @@ -7477,12 +7511,18 @@ export function parsePubYamlData(pubYamlData) {
if (!yamlObj) {
return pkgList;
}
pkgList.push({
const pkg = {
name: yamlObj.name,
description: yamlObj.description,
version: yamlObj.version,
homepage: { url: yamlObj.homepage },
});
};
const purlString = new PackageURL("pub", "", pkg.name, pkg.version)
.toString()
.replace(/%2F/g, "/");
pkg.purl = purlString;
pkg["bom-ref"] = decodeURIComponent(purlString);
pkgList.push(pkg);
return pkgList;
}

Expand Down
8 changes: 6 additions & 2 deletions lib/helpers/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2086,17 +2086,19 @@ test("parse pub lock", async () => {
version: "2.11.0",
_integrity:
"sha256-947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c",
"bom-ref": "pkg:dart/[email protected]",
"bom-ref": "pkg:pub/[email protected]",
scope: "required",
properties: [],
});
expect(root_list.length).toEqual(3);
expect(root_list[0]).toEqual({
name: "flare_flutter",
version: "3.0.2",
_integrity:
"sha256-99d63c60f00fac81249ce6410ee015d7b125c63d8278a30da81edf3317a1f6a0",
"bom-ref": "pkg:dart/[email protected]",
"bom-ref": "pkg:pub/[email protected]",
scope: "required",
properties: [],
});
dep_list = parsePubYamlData(
readFileSync("./test/data/pubspec.yaml", { encoding: "utf-8" }),
Expand All @@ -2110,6 +2112,8 @@ test("parse pub lock", async () => {
homepage: {
url: "https://github.com/marcos930807/awesomeDialogs",
},
"bom-ref": "pkg:pub/[email protected]",
purl: "pkg:pub/[email protected]",
});
});

Expand Down
2 changes: 1 addition & 1 deletion types/lib/cli/index.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 9 additions & 7 deletions types/lib/helpers/utils.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -680,13 +680,15 @@ export function parseCargoDependencyData(cargoLockData: any): {
dependsOn: any[];
}[];
export function parseCargoAuditableData(cargoData: any): Promise<any[]>;
export function parsePubLockData(pubLockData: any): Promise<any[] | {
rootList: {
name: string;
version: any;
}[];
pkgList: any[];
}>;
/**
* Method to parse pubspec.lock files.
*
* @param pubLockData Contents of lock data
* @param lockFile Filename for setting evidence
*
* @returns {Object}
*/
export function parsePubLockData(pubLockData: any, lockFile: any): any;
export function parsePubYamlData(pubYamlData: any): any[];
export function parseHelmYamlData(helmData: any): any[];
export function recurseImageNameLookup(keyValueObj: any, pkgList: any, imgList: any): any;
Expand Down
Loading

0 comments on commit a1025e6

Please sign in to comment.