File tree Expand file tree Collapse file tree
public/components/views/home/report Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ ---
2+ " @nodesecure/server " : minor
3+ ---
4+
5+ Improve report test and implementation
Original file line number Diff line number Diff line change 106106 "@nodesecure/npm-registry-sdk" : " 4.5.2" ,
107107 "@nodesecure/ossf-scorecard-sdk" : " 4.0.1" ,
108108 "@nodesecure/rc" : " 5.5.0" ,
109- "@nodesecure/report" : " 4.2.1 " ,
109+ "@nodesecure/report" : " 4.2.2 " ,
110110 "@nodesecure/scanner" : " 10.7.0" ,
111111 "@nodesecure/server" : " 1.0.0" ,
112112 "@nodesecure/utils" : " ^2.2.0" ,
Original file line number Diff line number Diff line change @@ -252,12 +252,8 @@ class PopupReport extends LitElement {
252252 "Content-Type" : "application/json"
253253 }
254254 } ) . then ( async ( response ) => {
255- const { data : json } = await response . json ( ) ;
256- const url = window . URL . createObjectURL (
257- new Blob (
258- [ new Uint8Array ( json . data ) . buffer ] , { type : "application/pdf" }
259- )
260- ) ;
255+ const blob = await response . blob ( ) ;
256+ const url = window . URL . createObjectURL ( blob ) ;
261257 const link = document . createElement ( "a" ) ;
262258 link . href = url ;
263259 link . target = "_blank" ;
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ import { AsyncLocalStorage } from "node:async_hooks";
33
44// Import Third-party Dependencies
55import type { PayloadCache } from "@nodesecure/cache";
6+ import type { report } from "@nodesecure/report";
67
78// Import Internal Dependencies
89import type { ViewBuilder } from "./ViewBuilder.class.ts";
@@ -18,6 +19,7 @@ export interface AsyncStoreContext {
1819 french: NestedStringRecord;
1920 };
2021 viewBuilder: ViewBuilder;
22+ reporter?: typeof report;
2123}
2224
2325export const context = new AsyncLocalStorage<AsyncStoreContext>();
Original file line number Diff line number Diff line change @@ -61,7 +61,7 @@ export async function post(
6161 const body = await bodyParser<ReportRequestBody>(req);
6262 const { title, includesAllDeps, theme } = body;
6363
64- const { cache } = context.getStore()!;
64+ const { cache, reporter: reportFn = report } = context.getStore()!;
6565
6666 const currentSpec = cache.getCurrentSpec();
6767 if (currentSpec === null) {
@@ -87,10 +87,12 @@ export async function post(
8787 const reportPayload = structuredClone({
8888 ...kReportPayload,
8989 title,
90- npm: repo === undefined ? undefined : {
91- organizationPrefix,
92- packages: [repo]
93- },
90+ npm: repo === undefined ?
91+ undefined :
92+ {
93+ organizationPrefix,
94+ packages: [repo]
95+ },
9496 theme
9597 });
9698
@@ -101,14 +103,12 @@ export async function post(
101103 [name]: scannerPayload.dependencies[name]
102104 } satisfies Dependencies;
103105
104- const data = await report (
106+ const data = await reportFn (
105107 dependencies,
106108 reportPayload
107109 );
108110
109- return send(res, {
110- data
111- }, {
111+ return send(res, data, {
112112 headers: {
113113 "content-type": "application/pdf"
114114 }
Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ export interface SendOptions {
1010 headers?: OutgoingHttpHeaders;
1111}
1212
13- type SendData = string | object;
13+ type SendData = string | object | Buffer ;
1414
1515export function send(
1616 res: ServerResponse,
@@ -21,9 +21,12 @@ export function send(
2121
2222 let contentType = headers["content-type"] as string | undefined
2323 ?? res.getHeader("content-type") as string | undefined;
24-
25- let body: string;
26- if (typeof data === "object") {
24+ let body: string | Buffer;
25+ if (Buffer.isBuffer(data)) {
26+ body = data;
27+ contentType ??= "application/octet-stream";
28+ }
29+ else if (typeof data === "object") {
2730 body = JSON.stringify(data);
2831 contentType ??= "application/json;charset=utf-8";
2932 }
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import http from "node:http";
77import sirv from "sirv";
88import { PayloadCache } from "@nodesecure/cache";
99import type { Payload } from "@nodesecure/scanner";
10+ import type { report } from "@nodesecure/report";
1011
1112// Import Internal Dependencies
1213import { getApiRouter } from "./endpoints/index.ts";
@@ -32,6 +33,7 @@ export interface BuildServerOptions {
3233 res: http.ServerResponse,
3334 next: () => void
3435 ) => void;
36+ reporter?: typeof report;
3537}
3638
3739export async function buildServer(
@@ -47,7 +49,8 @@ export async function buildServer(
4749 scanType = "from",
4850 projectRootDir,
4951 componentsDir,
50- i18n
52+ i18n,
53+ reporter
5154 } = options;
5255 const cache = await new PayloadCache().load();
5356
@@ -58,7 +61,8 @@ export async function buildServer(
5861 const store: AsyncStoreContext = {
5962 i18n,
6063 viewBuilder,
61- cache
64+ cache,
65+ reporter
6266 };
6367 if (runFromPayload && dataFilePath !== undefined) {
6468 const payloadStr = await fs.readFile(dataFilePath, "utf-8");
Original file line number Diff line number Diff line change @@ -41,6 +41,7 @@ describe("httpServer", () => {
4141 ({ httpServer } = await buildServer(JSON_PATH, {
4242 projectRootDir: kProjectRootDir,
4343 componentsDir: kComponentsDir,
44+ reporter: async() => Buffer.from("fake-pdf-data"),
4445 i18n: {
4546 english: {
4647 ui: {}
@@ -282,7 +283,7 @@ describe("httpServer", () => {
282283 });
283284 });
284285
285- test.skip ("'/report' should return a Buffer", async() => {
286+ test("'/report' should return a Buffer", async() => {
286287 const result = await post<Buffer>(
287288 new URL("/report", kHttpURL),
288289 {
You can’t perform that action at this time.
0 commit comments