@continuous-excellence/ze-great-dashboard-aws 0.31.46 → 0.31.48
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/cli.js +2127 -384
- package/dist/index.js +2102 -359
- package/dist/lambda.mjs +2248 -1342
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -48,9 +48,6 @@ import { join, resolve } from "node:path";
|
|
|
48
48
|
// packages/server/src/allowlist.ts
|
|
49
49
|
import { ZodError } from "zod";
|
|
50
50
|
|
|
51
|
-
// packages/server/src/adapters/azure-devops.ts
|
|
52
|
-
import { readFile } from "node:fs/promises";
|
|
53
|
-
|
|
54
51
|
// packages/shared/src/board-config.ts
|
|
55
52
|
import { z as z2 } from "zod";
|
|
56
53
|
|
|
@@ -111,6 +108,17 @@ var githubActionsBuildEventsSchema = z2.array(githubActionsBuildEventSchema).min
|
|
|
111
108
|
var attentionTreatments = ["beacon", "alarm", "steady"];
|
|
112
109
|
var attentionTreatmentSchema = z2.enum(attentionTreatments);
|
|
113
110
|
var httpValueJsonPathSchema = z2.string().regex(/^\$(?:\.[A-Za-z_][A-Za-z0-9_]*|\[\d+\])*$/, "must be a simple JSON path");
|
|
111
|
+
var testResultsArtifactSchema = z2.object({
|
|
112
|
+
artifact: z2.string().min(1).max(128),
|
|
113
|
+
entry: z2.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*\.json$/, "must be a root-level JSON file")
|
|
114
|
+
});
|
|
115
|
+
var testCountPanelSchema = z2.object({
|
|
116
|
+
id: z2.string().min(1),
|
|
117
|
+
type: z2.literal("test-count"),
|
|
118
|
+
source: z2.string().min(1),
|
|
119
|
+
pipeline: z2.string().min(1),
|
|
120
|
+
test_results: testResultsArtifactSchema
|
|
121
|
+
});
|
|
114
122
|
var httpValueFactSchema = z2.object({
|
|
115
123
|
/** Stable address below the panel; labels and ordering may change without repointing it. */
|
|
116
124
|
id: z2.string().min(1),
|
|
@@ -170,7 +178,9 @@ var panelSchema = z2.looseObject({
|
|
|
170
178
|
/** Up to four independently fetched source-agnostic readings in one visual panel. */
|
|
171
179
|
facts: httpValueGroupedPanelSchema.shape.facts.optional(),
|
|
172
180
|
/** Optional GitHub Actions-only restriction on which workflow triggers count as build evidence. */
|
|
173
|
-
build_events: githubActionsBuildEventsSchema.optional()
|
|
181
|
+
build_events: githubActionsBuildEventsSchema.optional(),
|
|
182
|
+
/** Workflow-run artifact carrying a test-count panel's summary. */
|
|
183
|
+
test_results: testResultsArtifactSchema.optional()
|
|
174
184
|
}).superRefine((panel, ctx) => {
|
|
175
185
|
if ("display" in panel) {
|
|
176
186
|
ctx.addIssue({
|
|
@@ -180,6 +190,28 @@ var panelSchema = z2.looseObject({
|
|
|
180
190
|
params: { constraint: "display was removed; use density" }
|
|
181
191
|
});
|
|
182
192
|
}
|
|
193
|
+
if (panel.type === "test-count") {
|
|
194
|
+
if (!panel.source)
|
|
195
|
+
ctx.addIssue({ code: "custom", path: ["source"], message: "test-count requires a source" });
|
|
196
|
+
if (typeof panel.pipeline !== "string" || !panel.pipeline)
|
|
197
|
+
ctx.addIssue({
|
|
198
|
+
code: "custom",
|
|
199
|
+
path: ["pipeline"],
|
|
200
|
+
message: "test-count requires a workflow filename"
|
|
201
|
+
});
|
|
202
|
+
if (!panel.test_results)
|
|
203
|
+
ctx.addIssue({
|
|
204
|
+
code: "custom",
|
|
205
|
+
path: ["test_results"],
|
|
206
|
+
message: "test-count requires test_results artifact configuration"
|
|
207
|
+
});
|
|
208
|
+
} else if (panel.test_results) {
|
|
209
|
+
ctx.addIssue({
|
|
210
|
+
code: "custom",
|
|
211
|
+
path: ["test_results"],
|
|
212
|
+
message: "test_results is only supported by test-count panels"
|
|
213
|
+
});
|
|
214
|
+
}
|
|
183
215
|
if (panel.type !== "http-value") return;
|
|
184
216
|
if (panel.facts) {
|
|
185
217
|
if (panel.url !== void 0)
|
|
@@ -555,6 +587,18 @@ var pipelineStatusSchema = z4.object({
|
|
|
555
587
|
/** When this workflow run was last updated by its source, distinct from our observation time. */
|
|
556
588
|
sourceUpdatedAt: z4.iso.datetime().optional()
|
|
557
589
|
});
|
|
590
|
+
var testCountSchema = z4.discriminatedUnion("status", [
|
|
591
|
+
z4.object({
|
|
592
|
+
type: z4.literal("test-count"),
|
|
593
|
+
status: z4.literal("reported"),
|
|
594
|
+
total: z4.number().int().nonnegative(),
|
|
595
|
+
passed: z4.number().int().nonnegative().optional(),
|
|
596
|
+
failed: z4.number().int().nonnegative().optional(),
|
|
597
|
+
skipped: z4.number().int().nonnegative().optional()
|
|
598
|
+
}),
|
|
599
|
+
z4.object({ type: z4.literal("test-count"), status: z4.literal("pending") }),
|
|
600
|
+
z4.object({ type: z4.literal("test-count"), status: z4.literal("not-reported") })
|
|
601
|
+
]);
|
|
558
602
|
var pullRequestHealthItemSchema = z4.object({
|
|
559
603
|
label: z4.string().min(1),
|
|
560
604
|
status: pipelineStatusSchema.shape.status,
|
|
@@ -613,112 +657,947 @@ var securityDetailsResponseSchema = z5.strictObject({
|
|
|
613
657
|
])
|
|
614
658
|
});
|
|
615
659
|
|
|
616
|
-
// packages/server/src/adapters/
|
|
617
|
-
import { z as
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
pipeline: z6.number().int().positive()
|
|
623
|
-
});
|
|
624
|
-
var buildSchema = z6.object({
|
|
625
|
-
id: z6.number().int().positive(),
|
|
626
|
-
buildNumber: z6.string().min(1),
|
|
627
|
-
status: z6.string().nullable().optional(),
|
|
628
|
-
result: z6.string().nullable().optional(),
|
|
629
|
-
sourceBranch: z6.string().min(1).nullable().optional(),
|
|
630
|
-
startTime: z6.string().nullable().optional(),
|
|
631
|
-
finishTime: z6.string().nullable().optional(),
|
|
632
|
-
lastChangedDate: z6.string().nullable().optional()
|
|
633
|
-
});
|
|
634
|
-
var buildsSchema = z6.object({ value: z6.array(buildSchema) });
|
|
635
|
-
var timelineSchema = z6.object({
|
|
636
|
-
records: z6.array(
|
|
637
|
-
z6.object({
|
|
638
|
-
id: z6.string().min(1),
|
|
639
|
-
parentId: z6.string().min(1).nullable().optional(),
|
|
640
|
-
type: z6.string().min(1),
|
|
641
|
-
name: z6.string().min(1),
|
|
642
|
-
state: z6.string().nullable().optional()
|
|
643
|
-
})
|
|
644
|
-
)
|
|
645
|
-
});
|
|
646
|
-
function permittedAzureDevOpsCalls(panel, source) {
|
|
647
|
-
const { panel: parsedPanel, source: parsedSource } = z6.object({ panel: pipelinePanelSchema, source: azureDevOpsSourceSchema }).parse({ panel, source });
|
|
648
|
-
return [buildsCall(parsedPanel.pipeline, parsedSource)];
|
|
660
|
+
// packages/server/src/adapters/github-actions.ts
|
|
661
|
+
import { z as z7 } from "zod";
|
|
662
|
+
|
|
663
|
+
// packages/server/src/credentials.ts
|
|
664
|
+
function environmentCredentials(env = process.env) {
|
|
665
|
+
return { get: (name) => env[name] };
|
|
649
666
|
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
667
|
+
|
|
668
|
+
// packages/server/src/github-auth.ts
|
|
669
|
+
import { createSign } from "node:crypto";
|
|
670
|
+
|
|
671
|
+
// packages/server/src/upstream.ts
|
|
672
|
+
function publicErrorMessage(kind) {
|
|
673
|
+
switch (kind) {
|
|
674
|
+
case "unreachable":
|
|
675
|
+
return "The source could not be reached. Check its address and network connectivity.";
|
|
676
|
+
case "unauthorized":
|
|
677
|
+
return "The dashboard is not authorized to read this source. Check the configured access.";
|
|
678
|
+
case "not-found":
|
|
679
|
+
return "The configured source was not found. Check the board configuration.";
|
|
680
|
+
case "no-runs":
|
|
681
|
+
return "No matching workflow runs were found. Check the configured workflow and branch.";
|
|
682
|
+
case "upstream-error":
|
|
683
|
+
return "The source returned an unreadable response. Check the source service and configuration.";
|
|
684
|
+
}
|
|
661
685
|
}
|
|
662
|
-
function
|
|
663
|
-
const
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
return url;
|
|
686
|
+
function forwardValidators(requestHeaders, upstreamHeaders) {
|
|
687
|
+
for (const name of ["if-none-match", "if-modified-since"]) {
|
|
688
|
+
const value2 = requestHeaders.get(name);
|
|
689
|
+
if (value2) upstreamHeaders.set(name, value2);
|
|
690
|
+
}
|
|
668
691
|
}
|
|
669
|
-
function
|
|
670
|
-
|
|
692
|
+
function observedAt(upstreamDate) {
|
|
693
|
+
const parsed = upstreamDate ? new Date(upstreamDate) : void 0;
|
|
694
|
+
return parsed && !Number.isNaN(parsed.valueOf()) ? parsed.toISOString() : (/* @__PURE__ */ new Date()).toISOString();
|
|
695
|
+
}
|
|
696
|
+
function upstreamErrorEnvelope(args2) {
|
|
697
|
+
return {
|
|
698
|
+
panelId: args2.panelId,
|
|
699
|
+
state: "error",
|
|
700
|
+
observedAt: observedAt(args2.upstreamDate),
|
|
701
|
+
link: publicLink(args2.link),
|
|
702
|
+
error: {
|
|
703
|
+
kind: args2.kind,
|
|
704
|
+
// Raw failures regularly contain URLs, query values, response fragments, or credentials.
|
|
705
|
+
// The specific evidence stays server-side; the browser gets this fixed actionable vocabulary.
|
|
706
|
+
message: publicErrorMessage(args2.kind)
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
function publicLink(value2) {
|
|
711
|
+
if (!value2) return null;
|
|
712
|
+
try {
|
|
713
|
+
const url = new URL(value2);
|
|
714
|
+
url.search = "";
|
|
715
|
+
url.hash = "";
|
|
716
|
+
return url.toString();
|
|
717
|
+
} catch {
|
|
718
|
+
return null;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
function upstreamErrorResponse(envelope) {
|
|
722
|
+
return new Response(JSON.stringify(envelope), { status: 200 });
|
|
723
|
+
}
|
|
724
|
+
function upstreamErrorKind(status) {
|
|
725
|
+
if (status === 401 || status === 403) return "unauthorized";
|
|
726
|
+
if (status === 404) return "not-found";
|
|
727
|
+
return "upstream-error";
|
|
728
|
+
}
|
|
729
|
+
function safeNetworkCode(error) {
|
|
730
|
+
const code = error && typeof error === "object" ? error.code : void 0;
|
|
731
|
+
return code === "ECONNREFUSED" || code === "ENOTFOUND" || code === "ETIMEDOUT" || code === "EAI_AGAIN" ? code : void 0;
|
|
671
732
|
}
|
|
672
733
|
|
|
673
|
-
// packages/server/src/
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
})
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
})
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
734
|
+
// packages/server/src/github-auth.ts
|
|
735
|
+
var GithubAuthenticationError = class extends Error {
|
|
736
|
+
constructor() {
|
|
737
|
+
super("GitHub authentication could not be completed.");
|
|
738
|
+
this.name = "GithubAuthenticationError";
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
function createGithubClient(credentials, now = Date.now) {
|
|
742
|
+
const tokens = /* @__PURE__ */ new Map();
|
|
743
|
+
const pending = /* @__PURE__ */ new Map();
|
|
744
|
+
async function installationToken(source, fetcher, refresh = false) {
|
|
745
|
+
const app = source.github_app;
|
|
746
|
+
if (!app) return void 0;
|
|
747
|
+
const appId = requiredCredential(credentials, app.app_id_env);
|
|
748
|
+
const privateKey = requiredCredential(credentials, app.private_key_env);
|
|
749
|
+
const installationId = requiredCredential(credentials, app.installation_id_env);
|
|
750
|
+
const cacheKey = `${appId}:${installationId}:${app.private_key_env}`;
|
|
751
|
+
const cached = tokens.get(cacheKey);
|
|
752
|
+
if (!refresh && cached && cached.expiresAt > now() + 6e4)
|
|
753
|
+
return { token: cached.token, cacheKey };
|
|
754
|
+
const existing = pending.get(cacheKey);
|
|
755
|
+
if (existing) return { token: await existing, cacheKey };
|
|
756
|
+
const exchange = exchangeInstallationToken({ appId, privateKey, installationId, fetcher, now }).then(({ token, expiresAt }) => {
|
|
757
|
+
tokens.set(cacheKey, { token, expiresAt });
|
|
758
|
+
return token;
|
|
759
|
+
}).catch((error) => {
|
|
760
|
+
if (error instanceof GithubAuthenticationError) throw error;
|
|
761
|
+
throw new GithubAuthenticationError();
|
|
762
|
+
});
|
|
763
|
+
pending.set(cacheKey, exchange);
|
|
764
|
+
try {
|
|
765
|
+
return { token: await exchange, cacheKey };
|
|
766
|
+
} finally {
|
|
767
|
+
pending.delete(cacheKey);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
return {
|
|
771
|
+
async get({ source, url, requestHeaders, fetcher }) {
|
|
772
|
+
const headers = githubHeaders(requestHeaders);
|
|
773
|
+
if (source.token_env)
|
|
774
|
+
headers.set("authorization", `Bearer ${requiredCredential(credentials, source.token_env)}`);
|
|
775
|
+
const appToken = await installationToken(source, fetcher);
|
|
776
|
+
if (appToken) headers.set("authorization", `Bearer ${appToken.token}`);
|
|
777
|
+
const response = await fetcher(url, { headers });
|
|
778
|
+
if (!appToken || response.status !== 401) return response;
|
|
779
|
+
tokens.delete(appToken.cacheKey);
|
|
780
|
+
const refreshed = await installationToken(source, fetcher, true);
|
|
781
|
+
if (!refreshed) return response;
|
|
782
|
+
const replayHeaders = githubHeaders(requestHeaders);
|
|
783
|
+
replayHeaders.set("authorization", `Bearer ${refreshed.token}`);
|
|
784
|
+
return fetcher(url, { headers: replayHeaders });
|
|
785
|
+
}
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
function githubHeaders(requestHeaders) {
|
|
789
|
+
const headers = new Headers({ accept: "application/vnd.github+json" });
|
|
790
|
+
forwardValidators(requestHeaders, headers);
|
|
791
|
+
return headers;
|
|
792
|
+
}
|
|
793
|
+
async function exchangeInstallationToken(args2) {
|
|
794
|
+
let jwt;
|
|
795
|
+
try {
|
|
796
|
+
jwt = createAppJwt(args2.appId, args2.privateKey, args2.now());
|
|
797
|
+
} catch {
|
|
798
|
+
throw new GithubAuthenticationError();
|
|
799
|
+
}
|
|
800
|
+
let response;
|
|
801
|
+
try {
|
|
802
|
+
response = await args2.fetcher(
|
|
803
|
+
`https://api.github.com/app/installations/${encodeURIComponent(args2.installationId)}/access_tokens`,
|
|
804
|
+
{
|
|
805
|
+
method: "POST",
|
|
806
|
+
headers: new Headers({
|
|
807
|
+
accept: "application/vnd.github+json",
|
|
808
|
+
authorization: `Bearer ${jwt}`,
|
|
809
|
+
"content-type": "application/json"
|
|
810
|
+
})
|
|
811
|
+
}
|
|
812
|
+
);
|
|
813
|
+
} catch {
|
|
814
|
+
throw new GithubAuthenticationError();
|
|
815
|
+
}
|
|
816
|
+
if (!response.ok) throw new GithubAuthenticationError();
|
|
817
|
+
const body = await response.json();
|
|
818
|
+
if (!body.token || !body.expires_at) throw new GithubAuthenticationError();
|
|
819
|
+
const expiresAt = new Date(body.expires_at).valueOf();
|
|
820
|
+
if (!Number.isFinite(expiresAt)) throw new GithubAuthenticationError();
|
|
821
|
+
return { token: body.token, expiresAt };
|
|
822
|
+
}
|
|
823
|
+
function createAppJwt(appId, privateKey, now = Date.now()) {
|
|
824
|
+
const issuedAt = Math.floor(now / 1e3) - 60;
|
|
825
|
+
const header = base64url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
|
|
826
|
+
const payload = base64url(JSON.stringify({ iat: issuedAt, exp: issuedAt + 540, iss: appId }));
|
|
827
|
+
const signingInput = `${header}.${payload}`;
|
|
828
|
+
const signer = createSign("RSA-SHA256");
|
|
829
|
+
signer.update(signingInput);
|
|
830
|
+
signer.end();
|
|
831
|
+
return `${signingInput}.${base64url(signer.sign(privateKey))}`;
|
|
832
|
+
}
|
|
833
|
+
function requiredCredential(credentials, name) {
|
|
834
|
+
const value2 = credentials.get(name);
|
|
835
|
+
if (value2) return value2;
|
|
836
|
+
throw new GithubAuthenticationError();
|
|
837
|
+
}
|
|
838
|
+
function base64url(value2) {
|
|
839
|
+
return Buffer.from(value2).toString("base64url");
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// node_modules/fflate/esm/browser.js
|
|
843
|
+
var u8 = Uint8Array;
|
|
844
|
+
var u16 = Uint16Array;
|
|
845
|
+
var i32 = Int32Array;
|
|
846
|
+
var fleb = new u8([
|
|
847
|
+
0,
|
|
848
|
+
0,
|
|
849
|
+
0,
|
|
850
|
+
0,
|
|
851
|
+
0,
|
|
852
|
+
0,
|
|
853
|
+
0,
|
|
854
|
+
0,
|
|
855
|
+
1,
|
|
856
|
+
1,
|
|
857
|
+
1,
|
|
858
|
+
1,
|
|
859
|
+
2,
|
|
860
|
+
2,
|
|
861
|
+
2,
|
|
862
|
+
2,
|
|
863
|
+
3,
|
|
864
|
+
3,
|
|
865
|
+
3,
|
|
866
|
+
3,
|
|
867
|
+
4,
|
|
868
|
+
4,
|
|
869
|
+
4,
|
|
870
|
+
4,
|
|
871
|
+
5,
|
|
872
|
+
5,
|
|
873
|
+
5,
|
|
874
|
+
5,
|
|
875
|
+
0,
|
|
876
|
+
/* unused */
|
|
877
|
+
0,
|
|
878
|
+
0,
|
|
879
|
+
/* impossible */
|
|
880
|
+
0
|
|
881
|
+
]);
|
|
882
|
+
var fdeb = new u8([
|
|
883
|
+
0,
|
|
884
|
+
0,
|
|
885
|
+
0,
|
|
886
|
+
0,
|
|
887
|
+
1,
|
|
888
|
+
1,
|
|
889
|
+
2,
|
|
890
|
+
2,
|
|
891
|
+
3,
|
|
892
|
+
3,
|
|
893
|
+
4,
|
|
894
|
+
4,
|
|
895
|
+
5,
|
|
896
|
+
5,
|
|
897
|
+
6,
|
|
898
|
+
6,
|
|
899
|
+
7,
|
|
900
|
+
7,
|
|
901
|
+
8,
|
|
902
|
+
8,
|
|
903
|
+
9,
|
|
904
|
+
9,
|
|
905
|
+
10,
|
|
906
|
+
10,
|
|
907
|
+
11,
|
|
908
|
+
11,
|
|
909
|
+
12,
|
|
910
|
+
12,
|
|
911
|
+
13,
|
|
912
|
+
13,
|
|
913
|
+
/* unused */
|
|
914
|
+
0,
|
|
915
|
+
0
|
|
916
|
+
]);
|
|
917
|
+
var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
918
|
+
var freb = function(eb, start) {
|
|
919
|
+
var b = new u16(31);
|
|
920
|
+
for (var i3 = 0; i3 < 31; ++i3) {
|
|
921
|
+
b[i3] = start += 1 << eb[i3 - 1];
|
|
922
|
+
}
|
|
923
|
+
var r = new i32(b[30]);
|
|
924
|
+
for (var i3 = 1; i3 < 30; ++i3) {
|
|
925
|
+
for (var j = b[i3]; j < b[i3 + 1]; ++j) {
|
|
926
|
+
r[j] = j - b[i3] << 5 | i3;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return { b, r };
|
|
930
|
+
};
|
|
931
|
+
var _a = freb(fleb, 2);
|
|
932
|
+
var fl = _a.b;
|
|
933
|
+
var revfl = _a.r;
|
|
934
|
+
fl[28] = 258, revfl[258] = 28;
|
|
935
|
+
var _b = freb(fdeb, 0);
|
|
936
|
+
var fd = _b.b;
|
|
937
|
+
var revfd = _b.r;
|
|
938
|
+
var rev = new u16(32768);
|
|
939
|
+
for (i = 0; i < 32768; ++i) {
|
|
940
|
+
x = (i & 43690) >> 1 | (i & 21845) << 1;
|
|
941
|
+
x = (x & 52428) >> 2 | (x & 13107) << 2;
|
|
942
|
+
x = (x & 61680) >> 4 | (x & 3855) << 4;
|
|
943
|
+
rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
|
|
944
|
+
}
|
|
945
|
+
var x;
|
|
946
|
+
var i;
|
|
947
|
+
var hMap = (function(cd, mb, r) {
|
|
948
|
+
var s = cd.length;
|
|
949
|
+
var i3 = 0;
|
|
950
|
+
var l = new u16(mb);
|
|
951
|
+
for (; i3 < s; ++i3) {
|
|
952
|
+
if (cd[i3])
|
|
953
|
+
++l[cd[i3] - 1];
|
|
954
|
+
}
|
|
955
|
+
var le = new u16(mb);
|
|
956
|
+
for (i3 = 1; i3 < mb; ++i3) {
|
|
957
|
+
le[i3] = le[i3 - 1] + l[i3 - 1] << 1;
|
|
958
|
+
}
|
|
959
|
+
var co;
|
|
960
|
+
if (r) {
|
|
961
|
+
co = new u16(1 << mb);
|
|
962
|
+
var rvb = 15 - mb;
|
|
963
|
+
for (i3 = 0; i3 < s; ++i3) {
|
|
964
|
+
if (cd[i3]) {
|
|
965
|
+
var sv = i3 << 4 | cd[i3];
|
|
966
|
+
var r_1 = mb - cd[i3];
|
|
967
|
+
var v = le[cd[i3] - 1]++ << r_1;
|
|
968
|
+
for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
|
|
969
|
+
co[rev[v] >> rvb] = sv;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
} else {
|
|
974
|
+
co = new u16(s);
|
|
975
|
+
for (i3 = 0; i3 < s; ++i3) {
|
|
976
|
+
if (cd[i3]) {
|
|
977
|
+
co[i3] = rev[le[cd[i3] - 1]++] >> 15 - cd[i3];
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
return co;
|
|
720
982
|
});
|
|
721
|
-
var
|
|
983
|
+
var flt = new u8(288);
|
|
984
|
+
for (i = 0; i < 144; ++i)
|
|
985
|
+
flt[i] = 8;
|
|
986
|
+
var i;
|
|
987
|
+
for (i = 144; i < 256; ++i)
|
|
988
|
+
flt[i] = 9;
|
|
989
|
+
var i;
|
|
990
|
+
for (i = 256; i < 280; ++i)
|
|
991
|
+
flt[i] = 7;
|
|
992
|
+
var i;
|
|
993
|
+
for (i = 280; i < 288; ++i)
|
|
994
|
+
flt[i] = 8;
|
|
995
|
+
var i;
|
|
996
|
+
var fdt = new u8(32);
|
|
997
|
+
for (i = 0; i < 32; ++i)
|
|
998
|
+
fdt[i] = 5;
|
|
999
|
+
var i;
|
|
1000
|
+
var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
|
|
1001
|
+
var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
|
|
1002
|
+
var max = function(a) {
|
|
1003
|
+
var m = a[0];
|
|
1004
|
+
for (var i3 = 1; i3 < a.length; ++i3) {
|
|
1005
|
+
if (a[i3] > m)
|
|
1006
|
+
m = a[i3];
|
|
1007
|
+
}
|
|
1008
|
+
return m;
|
|
1009
|
+
};
|
|
1010
|
+
var bits = function(d, p, m) {
|
|
1011
|
+
var o = p / 8 | 0;
|
|
1012
|
+
return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
|
|
1013
|
+
};
|
|
1014
|
+
var bits16 = function(d, p) {
|
|
1015
|
+
var o = p / 8 | 0;
|
|
1016
|
+
return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
|
|
1017
|
+
};
|
|
1018
|
+
var shft = function(p) {
|
|
1019
|
+
return (p + 7) / 8 | 0;
|
|
1020
|
+
};
|
|
1021
|
+
var slc = function(v, s, e) {
|
|
1022
|
+
if (s == null || s < 0)
|
|
1023
|
+
s = 0;
|
|
1024
|
+
if (e == null || e > v.length)
|
|
1025
|
+
e = v.length;
|
|
1026
|
+
return new u8(v.subarray(s, e));
|
|
1027
|
+
};
|
|
1028
|
+
var ec = [
|
|
1029
|
+
"unexpected EOF",
|
|
1030
|
+
"invalid block type",
|
|
1031
|
+
"invalid length/literal",
|
|
1032
|
+
"invalid distance",
|
|
1033
|
+
"stream finished",
|
|
1034
|
+
"no stream handler",
|
|
1035
|
+
,
|
|
1036
|
+
// determined by compression function
|
|
1037
|
+
"no callback",
|
|
1038
|
+
"invalid UTF-8 data",
|
|
1039
|
+
"extra field too long",
|
|
1040
|
+
"date not in range 1980-2099",
|
|
1041
|
+
"filename too long",
|
|
1042
|
+
"stream finishing",
|
|
1043
|
+
"invalid zip data"
|
|
1044
|
+
// determined by unknown compression method
|
|
1045
|
+
];
|
|
1046
|
+
var err = function(ind, msg, nt) {
|
|
1047
|
+
var e = new Error(msg || ec[ind]);
|
|
1048
|
+
e.code = ind;
|
|
1049
|
+
if (Error.captureStackTrace)
|
|
1050
|
+
Error.captureStackTrace(e, err);
|
|
1051
|
+
if (!nt)
|
|
1052
|
+
throw e;
|
|
1053
|
+
return e;
|
|
1054
|
+
};
|
|
1055
|
+
var inflt = function(dat, st, buf, dict) {
|
|
1056
|
+
var sl = dat.length, dl = dict ? dict.length : 0;
|
|
1057
|
+
if (!sl || st.f && !st.l)
|
|
1058
|
+
return buf || new u8(0);
|
|
1059
|
+
var noBuf = !buf;
|
|
1060
|
+
var resize = noBuf || st.i != 2;
|
|
1061
|
+
var noSt = st.i;
|
|
1062
|
+
if (noBuf)
|
|
1063
|
+
buf = new u8(sl * 3);
|
|
1064
|
+
var cbuf = function(l2) {
|
|
1065
|
+
var bl = buf.length;
|
|
1066
|
+
if (l2 > bl) {
|
|
1067
|
+
var nbuf = new u8(Math.max(bl * 2, l2));
|
|
1068
|
+
nbuf.set(buf);
|
|
1069
|
+
buf = nbuf;
|
|
1070
|
+
}
|
|
1071
|
+
};
|
|
1072
|
+
var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
|
|
1073
|
+
var tbts = sl * 8;
|
|
1074
|
+
do {
|
|
1075
|
+
if (!lm) {
|
|
1076
|
+
final = bits(dat, pos, 1);
|
|
1077
|
+
var type = bits(dat, pos + 1, 3);
|
|
1078
|
+
pos += 3;
|
|
1079
|
+
if (!type) {
|
|
1080
|
+
var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
|
|
1081
|
+
if (t > sl) {
|
|
1082
|
+
if (noSt)
|
|
1083
|
+
err(0);
|
|
1084
|
+
break;
|
|
1085
|
+
}
|
|
1086
|
+
if (resize)
|
|
1087
|
+
cbuf(bt + l);
|
|
1088
|
+
buf.set(dat.subarray(s, t), bt);
|
|
1089
|
+
st.b = bt += l, st.p = pos = t * 8, st.f = final;
|
|
1090
|
+
continue;
|
|
1091
|
+
} else if (type == 1)
|
|
1092
|
+
lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
|
|
1093
|
+
else if (type == 2) {
|
|
1094
|
+
var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
|
|
1095
|
+
var tl = hLit + bits(dat, pos + 5, 31) + 1;
|
|
1096
|
+
pos += 14;
|
|
1097
|
+
var ldt = new u8(tl);
|
|
1098
|
+
var clt = new u8(19);
|
|
1099
|
+
for (var i3 = 0; i3 < hcLen; ++i3) {
|
|
1100
|
+
clt[clim[i3]] = bits(dat, pos + i3 * 3, 7);
|
|
1101
|
+
}
|
|
1102
|
+
pos += hcLen * 3;
|
|
1103
|
+
var clb = max(clt), clbmsk = (1 << clb) - 1;
|
|
1104
|
+
var clm = hMap(clt, clb, 1);
|
|
1105
|
+
for (var i3 = 0; i3 < tl; ) {
|
|
1106
|
+
var r = clm[bits(dat, pos, clbmsk)];
|
|
1107
|
+
pos += r & 15;
|
|
1108
|
+
var s = r >> 4;
|
|
1109
|
+
if (s < 16) {
|
|
1110
|
+
ldt[i3++] = s;
|
|
1111
|
+
} else {
|
|
1112
|
+
var c = 0, n = 0;
|
|
1113
|
+
if (s == 16)
|
|
1114
|
+
n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i3 - 1];
|
|
1115
|
+
else if (s == 17)
|
|
1116
|
+
n = 3 + bits(dat, pos, 7), pos += 3;
|
|
1117
|
+
else if (s == 18)
|
|
1118
|
+
n = 11 + bits(dat, pos, 127), pos += 7;
|
|
1119
|
+
while (n--)
|
|
1120
|
+
ldt[i3++] = c;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
|
|
1124
|
+
lbt = max(lt);
|
|
1125
|
+
dbt = max(dt);
|
|
1126
|
+
lm = hMap(lt, lbt, 1);
|
|
1127
|
+
dm = hMap(dt, dbt, 1);
|
|
1128
|
+
} else
|
|
1129
|
+
err(1);
|
|
1130
|
+
if (pos > tbts) {
|
|
1131
|
+
if (noSt)
|
|
1132
|
+
err(0);
|
|
1133
|
+
break;
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
if (resize)
|
|
1137
|
+
cbuf(bt + 131072);
|
|
1138
|
+
var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
|
|
1139
|
+
var lpos = pos;
|
|
1140
|
+
for (; ; lpos = pos) {
|
|
1141
|
+
var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
|
|
1142
|
+
pos += c & 15;
|
|
1143
|
+
if (pos > tbts) {
|
|
1144
|
+
if (noSt)
|
|
1145
|
+
err(0);
|
|
1146
|
+
break;
|
|
1147
|
+
}
|
|
1148
|
+
if (!c)
|
|
1149
|
+
err(2);
|
|
1150
|
+
if (sym < 256)
|
|
1151
|
+
buf[bt++] = sym;
|
|
1152
|
+
else if (sym == 256) {
|
|
1153
|
+
lpos = pos, lm = null;
|
|
1154
|
+
break;
|
|
1155
|
+
} else {
|
|
1156
|
+
var add = sym - 254;
|
|
1157
|
+
if (sym > 264) {
|
|
1158
|
+
var i3 = sym - 257, b = fleb[i3];
|
|
1159
|
+
add = bits(dat, pos, (1 << b) - 1) + fl[i3];
|
|
1160
|
+
pos += b;
|
|
1161
|
+
}
|
|
1162
|
+
var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
|
|
1163
|
+
if (!d)
|
|
1164
|
+
err(3);
|
|
1165
|
+
pos += d & 15;
|
|
1166
|
+
var dt = fd[dsym];
|
|
1167
|
+
if (dsym > 3) {
|
|
1168
|
+
var b = fdeb[dsym];
|
|
1169
|
+
dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
|
|
1170
|
+
}
|
|
1171
|
+
if (pos > tbts) {
|
|
1172
|
+
if (noSt)
|
|
1173
|
+
err(0);
|
|
1174
|
+
break;
|
|
1175
|
+
}
|
|
1176
|
+
if (resize)
|
|
1177
|
+
cbuf(bt + 131072);
|
|
1178
|
+
var end = bt + add;
|
|
1179
|
+
if (bt < dt) {
|
|
1180
|
+
var shift = dl - dt, dend = Math.min(dt, end);
|
|
1181
|
+
if (shift + bt < 0)
|
|
1182
|
+
err(3);
|
|
1183
|
+
for (; bt < dend; ++bt)
|
|
1184
|
+
buf[bt] = dict[shift + bt];
|
|
1185
|
+
}
|
|
1186
|
+
for (; bt < end; ++bt)
|
|
1187
|
+
buf[bt] = buf[bt - dt];
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
st.l = lm, st.p = lpos, st.b = bt, st.f = final;
|
|
1191
|
+
if (lm)
|
|
1192
|
+
final = 1, st.m = lbt, st.d = dm, st.n = dbt;
|
|
1193
|
+
} while (!final);
|
|
1194
|
+
return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
|
|
1195
|
+
};
|
|
1196
|
+
var et = /* @__PURE__ */ new u8(0);
|
|
1197
|
+
var b2 = function(d, b) {
|
|
1198
|
+
return d[b] | d[b + 1] << 8;
|
|
1199
|
+
};
|
|
1200
|
+
var b4 = function(d, b) {
|
|
1201
|
+
return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
|
|
1202
|
+
};
|
|
1203
|
+
var b8 = function(d, b) {
|
|
1204
|
+
return b4(d, b) + b4(d, b + 4) * 4294967296;
|
|
1205
|
+
};
|
|
1206
|
+
var Inflate = /* @__PURE__ */ (function() {
|
|
1207
|
+
function Inflate2(opts, cb) {
|
|
1208
|
+
if (typeof opts == "function")
|
|
1209
|
+
cb = opts, opts = {};
|
|
1210
|
+
this.ondata = cb;
|
|
1211
|
+
var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);
|
|
1212
|
+
this.s = { i: 0, b: dict ? dict.length : 0 };
|
|
1213
|
+
this.o = new u8(32768);
|
|
1214
|
+
this.p = new u8(0);
|
|
1215
|
+
if (dict)
|
|
1216
|
+
this.o.set(dict);
|
|
1217
|
+
}
|
|
1218
|
+
Inflate2.prototype.e = function(c) {
|
|
1219
|
+
if (!this.ondata)
|
|
1220
|
+
err(5);
|
|
1221
|
+
if (this.d)
|
|
1222
|
+
err(4);
|
|
1223
|
+
if (!this.p.length)
|
|
1224
|
+
this.p = c;
|
|
1225
|
+
else if (c.length) {
|
|
1226
|
+
var n = new u8(this.p.length + c.length);
|
|
1227
|
+
n.set(this.p), n.set(c, this.p.length), this.p = n;
|
|
1228
|
+
}
|
|
1229
|
+
};
|
|
1230
|
+
Inflate2.prototype.c = function(final) {
|
|
1231
|
+
this.s.i = +(this.d = final || false);
|
|
1232
|
+
var bts = this.s.b;
|
|
1233
|
+
var dt = inflt(this.p, this.s, this.o);
|
|
1234
|
+
this.ondata(slc(dt, bts, this.s.b), this.d);
|
|
1235
|
+
this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;
|
|
1236
|
+
this.p = slc(this.p, this.s.p / 8 | 0), this.s.p &= 7;
|
|
1237
|
+
};
|
|
1238
|
+
Inflate2.prototype.push = function(chunk, final) {
|
|
1239
|
+
this.e(chunk), this.c(final);
|
|
1240
|
+
};
|
|
1241
|
+
return Inflate2;
|
|
1242
|
+
})();
|
|
1243
|
+
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
1244
|
+
var tds = 0;
|
|
1245
|
+
try {
|
|
1246
|
+
td.decode(et, { stream: true });
|
|
1247
|
+
tds = 1;
|
|
1248
|
+
} catch (e) {
|
|
1249
|
+
}
|
|
1250
|
+
var dutf8 = function(d) {
|
|
1251
|
+
for (var r = "", i3 = 0; ; ) {
|
|
1252
|
+
var c = d[i3++];
|
|
1253
|
+
var eb = (c > 127) + (c > 223) + (c > 239);
|
|
1254
|
+
if (i3 + eb > d.length)
|
|
1255
|
+
return { s: r, r: slc(d, i3 - 1) };
|
|
1256
|
+
if (!eb)
|
|
1257
|
+
r += String.fromCharCode(c);
|
|
1258
|
+
else if (eb == 3) {
|
|
1259
|
+
c = ((c & 15) << 18 | (d[i3++] & 63) << 12 | (d[i3++] & 63) << 6 | d[i3++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);
|
|
1260
|
+
} else if (eb & 1)
|
|
1261
|
+
r += String.fromCharCode((c & 31) << 6 | d[i3++] & 63);
|
|
1262
|
+
else
|
|
1263
|
+
r += String.fromCharCode((c & 15) << 12 | (d[i3++] & 63) << 6 | d[i3++] & 63);
|
|
1264
|
+
}
|
|
1265
|
+
};
|
|
1266
|
+
function strFromU8(dat, latin1) {
|
|
1267
|
+
if (latin1) {
|
|
1268
|
+
var r = "";
|
|
1269
|
+
for (var i3 = 0; i3 < dat.length; i3 += 16384)
|
|
1270
|
+
r += String.fromCharCode.apply(null, dat.subarray(i3, i3 + 16384));
|
|
1271
|
+
return r;
|
|
1272
|
+
} else if (td) {
|
|
1273
|
+
return td.decode(dat);
|
|
1274
|
+
} else {
|
|
1275
|
+
var _a3 = dutf8(dat), s = _a3.s, r = _a3.r;
|
|
1276
|
+
if (r.length)
|
|
1277
|
+
err(8);
|
|
1278
|
+
return s;
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
var z64hs = function(d, b, l, z11, sc, su, off) {
|
|
1282
|
+
var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;
|
|
1283
|
+
var nf = nsc + nsu + noff;
|
|
1284
|
+
if (z11 && nf) {
|
|
1285
|
+
for (; b + 4 < e; b += 4 + b2(d, b + 2)) {
|
|
1286
|
+
if (b2(d, b) == 1) {
|
|
1287
|
+
return [
|
|
1288
|
+
nsc ? b8(d, b + 4 + 8 * nsu) : sc,
|
|
1289
|
+
nsu ? b8(d, b + 4) : su,
|
|
1290
|
+
noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,
|
|
1291
|
+
1
|
|
1292
|
+
];
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
if (z11 < 2)
|
|
1296
|
+
err(13);
|
|
1297
|
+
}
|
|
1298
|
+
return [sc, su, off, 0];
|
|
1299
|
+
};
|
|
1300
|
+
var UnzipPassThrough = /* @__PURE__ */ (function() {
|
|
1301
|
+
function UnzipPassThrough2() {
|
|
1302
|
+
}
|
|
1303
|
+
UnzipPassThrough2.prototype.push = function(chunk, final) {
|
|
1304
|
+
this.ondata(null, chunk, final);
|
|
1305
|
+
};
|
|
1306
|
+
UnzipPassThrough2.compression = 0;
|
|
1307
|
+
return UnzipPassThrough2;
|
|
1308
|
+
})();
|
|
1309
|
+
var UnzipInflate = /* @__PURE__ */ (function() {
|
|
1310
|
+
function UnzipInflate2() {
|
|
1311
|
+
var _this = this;
|
|
1312
|
+
this.i = new Inflate(function(dat, final) {
|
|
1313
|
+
_this.ondata(null, dat, final);
|
|
1314
|
+
});
|
|
1315
|
+
}
|
|
1316
|
+
UnzipInflate2.prototype.push = function(chunk, final) {
|
|
1317
|
+
try {
|
|
1318
|
+
this.i.push(chunk, final);
|
|
1319
|
+
} catch (e) {
|
|
1320
|
+
this.ondata(e, null, final);
|
|
1321
|
+
}
|
|
1322
|
+
};
|
|
1323
|
+
UnzipInflate2.compression = 8;
|
|
1324
|
+
return UnzipInflate2;
|
|
1325
|
+
})();
|
|
1326
|
+
var Unzip = /* @__PURE__ */ (function() {
|
|
1327
|
+
function Unzip2(cb) {
|
|
1328
|
+
this.onfile = cb;
|
|
1329
|
+
this.k = [];
|
|
1330
|
+
this.o = {
|
|
1331
|
+
0: UnzipPassThrough
|
|
1332
|
+
};
|
|
1333
|
+
this.p = et;
|
|
1334
|
+
}
|
|
1335
|
+
Unzip2.prototype.push = function(chunk, final) {
|
|
1336
|
+
var _this = this;
|
|
1337
|
+
if (!this.onfile)
|
|
1338
|
+
err(5);
|
|
1339
|
+
if (!this.p)
|
|
1340
|
+
err(4);
|
|
1341
|
+
if (this.c > 0) {
|
|
1342
|
+
var len = Math.min(this.c, chunk.length);
|
|
1343
|
+
var toAdd = chunk.subarray(0, len);
|
|
1344
|
+
this.c -= len;
|
|
1345
|
+
if (this.d)
|
|
1346
|
+
this.d.push(toAdd, !this.c);
|
|
1347
|
+
else
|
|
1348
|
+
this.k[0].push(toAdd);
|
|
1349
|
+
chunk = chunk.subarray(len);
|
|
1350
|
+
if (chunk.length)
|
|
1351
|
+
return this.push(chunk, final);
|
|
1352
|
+
} else {
|
|
1353
|
+
var f = 0, i3 = 0, is = void 0, buf = void 0;
|
|
1354
|
+
if (!this.p.length)
|
|
1355
|
+
buf = chunk;
|
|
1356
|
+
else if (!chunk.length)
|
|
1357
|
+
buf = this.p;
|
|
1358
|
+
else {
|
|
1359
|
+
buf = new u8(this.p.length + chunk.length);
|
|
1360
|
+
buf.set(this.p), buf.set(chunk, this.p.length);
|
|
1361
|
+
}
|
|
1362
|
+
var l = buf.length, oc = this.c, add = oc && this.d;
|
|
1363
|
+
var _loop_2 = function() {
|
|
1364
|
+
var sig = b4(buf, i3);
|
|
1365
|
+
if (sig == 67324752) {
|
|
1366
|
+
f = 1, is = i3;
|
|
1367
|
+
this_1.d = null;
|
|
1368
|
+
this_1.c = 0;
|
|
1369
|
+
var bf = b2(buf, i3 + 6), cmp_1 = b2(buf, i3 + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i3 + 26), es = b2(buf, i3 + 28);
|
|
1370
|
+
if (l > i3 + 30 + fnl + es) {
|
|
1371
|
+
var chks_3 = [];
|
|
1372
|
+
this_1.k.unshift(chks_3);
|
|
1373
|
+
f = 2;
|
|
1374
|
+
var lsc = b4(buf, i3 + 18), lsu = b4(buf, i3 + 22);
|
|
1375
|
+
var fn_1 = strFromU8(buf.subarray(i3 + 30, i3 += 30 + fnl), !u);
|
|
1376
|
+
var _a3 = z64hs(buf, i3, es, 2, lsc, lsu, 0), sc_1 = _a3[0], su_1 = _a3[1], z64 = _a3[3];
|
|
1377
|
+
if (dd)
|
|
1378
|
+
sc_1 = -1 - z64;
|
|
1379
|
+
i3 += es;
|
|
1380
|
+
this_1.c = sc_1;
|
|
1381
|
+
var d_1;
|
|
1382
|
+
var file_1 = {
|
|
1383
|
+
name: fn_1,
|
|
1384
|
+
compression: cmp_1,
|
|
1385
|
+
start: function() {
|
|
1386
|
+
if (!file_1.ondata)
|
|
1387
|
+
err(5);
|
|
1388
|
+
if (!sc_1)
|
|
1389
|
+
file_1.ondata(null, et, true);
|
|
1390
|
+
else {
|
|
1391
|
+
var ctr = _this.o[cmp_1];
|
|
1392
|
+
if (!ctr)
|
|
1393
|
+
file_1.ondata(err(14, "unknown compression type " + cmp_1, 1), null, false);
|
|
1394
|
+
d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);
|
|
1395
|
+
d_1.ondata = function(err3, dat3, final2) {
|
|
1396
|
+
file_1.ondata(err3, dat3, final2);
|
|
1397
|
+
};
|
|
1398
|
+
for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {
|
|
1399
|
+
var dat2 = chks_4[_i];
|
|
1400
|
+
d_1.push(dat2, false);
|
|
1401
|
+
}
|
|
1402
|
+
if (_this.k[0] == chks_3 && _this.c)
|
|
1403
|
+
_this.d = d_1;
|
|
1404
|
+
else
|
|
1405
|
+
d_1.push(et, true);
|
|
1406
|
+
}
|
|
1407
|
+
},
|
|
1408
|
+
terminate: function() {
|
|
1409
|
+
if (d_1 && d_1.terminate)
|
|
1410
|
+
d_1.terminate();
|
|
1411
|
+
}
|
|
1412
|
+
};
|
|
1413
|
+
if (sc_1 >= 0)
|
|
1414
|
+
file_1.size = sc_1, file_1.originalSize = su_1;
|
|
1415
|
+
this_1.onfile(file_1);
|
|
1416
|
+
}
|
|
1417
|
+
return "break";
|
|
1418
|
+
} else if (oc) {
|
|
1419
|
+
if (sig == 134695760) {
|
|
1420
|
+
is = i3 += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;
|
|
1421
|
+
return "break";
|
|
1422
|
+
} else if (sig == 33639248) {
|
|
1423
|
+
is = i3 -= 4, f = 3, this_1.c = 0;
|
|
1424
|
+
return "break";
|
|
1425
|
+
}
|
|
1426
|
+
}
|
|
1427
|
+
};
|
|
1428
|
+
var this_1 = this;
|
|
1429
|
+
for (; i3 < l - 4; ++i3) {
|
|
1430
|
+
var state_1 = _loop_2();
|
|
1431
|
+
if (state_1 === "break")
|
|
1432
|
+
break;
|
|
1433
|
+
}
|
|
1434
|
+
this.p = et;
|
|
1435
|
+
if (oc < 0) {
|
|
1436
|
+
var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 134695760 && 4)) : buf.subarray(0, i3);
|
|
1437
|
+
if (add)
|
|
1438
|
+
add.push(dat, !!f);
|
|
1439
|
+
else
|
|
1440
|
+
this.k[+(f == 2)].push(dat);
|
|
1441
|
+
}
|
|
1442
|
+
if (f & 2)
|
|
1443
|
+
return this.push(buf.subarray(i3), final);
|
|
1444
|
+
this.p = buf.subarray(i3);
|
|
1445
|
+
}
|
|
1446
|
+
if (final) {
|
|
1447
|
+
if (this.c)
|
|
1448
|
+
err(13);
|
|
1449
|
+
this.p = null;
|
|
1450
|
+
}
|
|
1451
|
+
};
|
|
1452
|
+
Unzip2.prototype.register = function(decoder) {
|
|
1453
|
+
this.o[decoder.compression] = decoder;
|
|
1454
|
+
};
|
|
1455
|
+
return Unzip2;
|
|
1456
|
+
})();
|
|
1457
|
+
|
|
1458
|
+
// packages/server/src/workflow-artifact-summary.ts
|
|
1459
|
+
import { z as z6 } from "zod";
|
|
1460
|
+
var maxArtifactBytes = 64 * 1024;
|
|
1461
|
+
var testResultsSummarySchema = z6.object({
|
|
1462
|
+
schemaVersion: z6.literal(1),
|
|
1463
|
+
runId: z6.number().int().positive(),
|
|
1464
|
+
runAttempt: z6.number().int().positive(),
|
|
1465
|
+
headSha: z6.string().min(1),
|
|
1466
|
+
total: z6.number().int().nonnegative(),
|
|
1467
|
+
passed: z6.number().int().nonnegative().optional(),
|
|
1468
|
+
failed: z6.number().int().nonnegative().optional(),
|
|
1469
|
+
skipped: z6.number().int().nonnegative().optional(),
|
|
1470
|
+
metadata: z6.record(z6.string(), z6.unknown()).optional()
|
|
1471
|
+
}).superRefine((summary, ctx) => {
|
|
1472
|
+
const outcomeTotal = (summary.passed ?? 0) + (summary.failed ?? 0) + (summary.skipped ?? 0);
|
|
1473
|
+
for (const key of ["passed", "failed", "skipped"]) {
|
|
1474
|
+
if (summary[key] !== void 0 && summary[key] > summary.total)
|
|
1475
|
+
ctx.addIssue({ code: "custom", path: [key], message: "must not exceed total" });
|
|
1476
|
+
}
|
|
1477
|
+
if (outcomeTotal > summary.total)
|
|
1478
|
+
ctx.addIssue({ code: "custom", path: ["total"], message: "must cover the declared outcomes" });
|
|
1479
|
+
});
|
|
1480
|
+
async function readTestResultsArtifact(response, entry) {
|
|
1481
|
+
const reader = response.body?.getReader();
|
|
1482
|
+
if (!reader) throw new Error("Artifact archive has no readable body.");
|
|
1483
|
+
let compressedBytes = 0;
|
|
1484
|
+
let entryCount = 0;
|
|
1485
|
+
let outputBytes = 0;
|
|
1486
|
+
let complete = false;
|
|
1487
|
+
let failure2;
|
|
1488
|
+
const chunks = [];
|
|
1489
|
+
const archive = new Unzip((file) => {
|
|
1490
|
+
entryCount += 1;
|
|
1491
|
+
if (file.name !== entry || entryCount > 1) {
|
|
1492
|
+
failure2 = new Error("Artifact archive has an unexpected entry.");
|
|
1493
|
+
return;
|
|
1494
|
+
}
|
|
1495
|
+
if ((file.originalSize ?? 0) > maxArtifactBytes) {
|
|
1496
|
+
failure2 = new Error("Artifact entry exceeds the configured size limit.");
|
|
1497
|
+
return;
|
|
1498
|
+
}
|
|
1499
|
+
file.ondata = (error, data, final) => {
|
|
1500
|
+
if (error) {
|
|
1501
|
+
failure2 = error;
|
|
1502
|
+
return;
|
|
1503
|
+
}
|
|
1504
|
+
outputBytes += data.length;
|
|
1505
|
+
if (outputBytes > maxArtifactBytes) {
|
|
1506
|
+
failure2 = new Error("Artifact entry exceeds the configured size limit.");
|
|
1507
|
+
file.terminate();
|
|
1508
|
+
return;
|
|
1509
|
+
}
|
|
1510
|
+
chunks.push(data);
|
|
1511
|
+
if (final) complete = true;
|
|
1512
|
+
};
|
|
1513
|
+
file.start();
|
|
1514
|
+
});
|
|
1515
|
+
archive.register(UnzipInflate);
|
|
1516
|
+
try {
|
|
1517
|
+
for (; ; ) {
|
|
1518
|
+
const { done, value: value2 } = await reader.read();
|
|
1519
|
+
if (value2) {
|
|
1520
|
+
compressedBytes += value2.length;
|
|
1521
|
+
if (compressedBytes > maxArtifactBytes)
|
|
1522
|
+
throw new Error("Artifact archive exceeds the configured size limit.");
|
|
1523
|
+
archive.push(value2, done);
|
|
1524
|
+
} else if (done) archive.push(new Uint8Array(), true);
|
|
1525
|
+
if (done) break;
|
|
1526
|
+
if (failure2) throw failure2;
|
|
1527
|
+
}
|
|
1528
|
+
} finally {
|
|
1529
|
+
reader.releaseLock();
|
|
1530
|
+
}
|
|
1531
|
+
if (failure2) throw failure2;
|
|
1532
|
+
if (entryCount !== 1 || !complete)
|
|
1533
|
+
throw new Error("Artifact archive did not contain the configured summary.");
|
|
1534
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(concat(chunks, outputBytes));
|
|
1535
|
+
}
|
|
1536
|
+
function concat(chunks, length) {
|
|
1537
|
+
const result = new Uint8Array(length);
|
|
1538
|
+
let offset = 0;
|
|
1539
|
+
for (const chunk of chunks) {
|
|
1540
|
+
result.set(chunk, offset);
|
|
1541
|
+
offset += chunk.length;
|
|
1542
|
+
}
|
|
1543
|
+
return result;
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
// packages/server/src/adapters/github-actions.ts
|
|
1547
|
+
var pipelinePanelSchema = z7.object({
|
|
1548
|
+
id: z7.string().min(1),
|
|
1549
|
+
type: z7.literal("pipeline-status"),
|
|
1550
|
+
source: z7.string().min(1),
|
|
1551
|
+
/** GitHub accepts a workflow filename or numeric workflow id in this URL segment. */
|
|
1552
|
+
pipeline: z7.string().min(1)
|
|
1553
|
+
});
|
|
1554
|
+
var pullRequestHealthPanelSchema = z7.object({
|
|
1555
|
+
id: z7.string().min(1),
|
|
1556
|
+
type: z7.literal("pull-request-health"),
|
|
1557
|
+
source: z7.string().min(1),
|
|
1558
|
+
base_branch: z7.string().min(1),
|
|
1559
|
+
update_workflows: z7.array(
|
|
1560
|
+
z7.object({
|
|
1561
|
+
workflow: z7.string().min(1),
|
|
1562
|
+
branch_prefixes: z7.array(z7.string().min(1)).min(1)
|
|
1563
|
+
})
|
|
1564
|
+
).min(1),
|
|
1565
|
+
build_workflow: z7.string().min(1),
|
|
1566
|
+
build_events: githubActionsBuildEventsSchema.optional()
|
|
1567
|
+
});
|
|
1568
|
+
var runSchema = z7.object({
|
|
1569
|
+
id: z7.number().int().positive().optional(),
|
|
1570
|
+
run_attempt: z7.number().int().positive().optional(),
|
|
1571
|
+
head_sha: z7.string().min(1).optional(),
|
|
1572
|
+
status: z7.string(),
|
|
1573
|
+
conclusion: z7.string().nullable(),
|
|
1574
|
+
name: z7.string().min(1),
|
|
1575
|
+
html_url: z7.url(),
|
|
1576
|
+
/** The GitHub Actions trigger that started this run. */
|
|
1577
|
+
event: z7.string().min(1).optional(),
|
|
1578
|
+
/** The branch that produced this run; absent for some event types. */
|
|
1579
|
+
head_branch: z7.string().min(1).nullable().optional(),
|
|
1580
|
+
// Timestamp quality should only remove timing advice, never make an otherwise useful run unreadable.
|
|
1581
|
+
run_started_at: z7.string().nullable().optional(),
|
|
1582
|
+
updated_at: z7.string().optional(),
|
|
1583
|
+
created_at: z7.string().optional()
|
|
1584
|
+
});
|
|
1585
|
+
var artifactsSchema = z7.object({
|
|
1586
|
+
artifacts: z7.array(
|
|
1587
|
+
z7.object({ id: z7.number().int().positive(), name: z7.string().min(1), expired: z7.boolean() })
|
|
1588
|
+
)
|
|
1589
|
+
});
|
|
1590
|
+
var runsSchema = z7.object({ workflow_runs: z7.array(runSchema) });
|
|
1591
|
+
var jobsSchema = z7.object({
|
|
1592
|
+
jobs: z7.array(
|
|
1593
|
+
z7.object({
|
|
1594
|
+
name: z7.string().min(1),
|
|
1595
|
+
status: z7.string(),
|
|
1596
|
+
steps: z7.array(z7.object({ name: z7.string().min(1), status: z7.string() })).optional()
|
|
1597
|
+
})
|
|
1598
|
+
)
|
|
1599
|
+
});
|
|
1600
|
+
var pullRequestsSchema = z7.array(
|
|
722
1601
|
z7.object({
|
|
723
1602
|
number: z7.number().int().positive(),
|
|
724
1603
|
html_url: z7.url(),
|
|
@@ -727,7 +1606,7 @@ var pullRequestsSchema = z7.array(
|
|
|
727
1606
|
})
|
|
728
1607
|
);
|
|
729
1608
|
function permittedGithubActionsCalls(panel, source, _credentials) {
|
|
730
|
-
const { panel: parsedPanel, source: parsedSource } = z7.object({ panel:
|
|
1609
|
+
const { panel: parsedPanel, source: parsedSource } = z7.object({ panel: pipelinePanelSchema, source: githubActionsSourceSchema }).parse({ panel, source });
|
|
731
1610
|
const url = new URL(
|
|
732
1611
|
`https://api.github.com/repos/${parsedSource.repo}/actions/workflows/${encodeURIComponent(parsedPanel.pipeline)}/runs`
|
|
733
1612
|
);
|
|
@@ -735,41 +1614,820 @@ function permittedGithubActionsCalls(panel, source, _credentials) {
|
|
|
735
1614
|
url.searchParams.set("per_page", "1");
|
|
736
1615
|
return [{ url: url.toString(), headers: new Headers() }];
|
|
737
1616
|
}
|
|
738
|
-
function
|
|
739
|
-
|
|
1617
|
+
function testCountCapabilities(panel, source) {
|
|
1618
|
+
return z7.object({ panel: testCountPanelSchema, source: githubActionsSourceSchema }).parse({ panel, source });
|
|
1619
|
+
}
|
|
1620
|
+
async function fetchGithubActionsTestCount(args2) {
|
|
1621
|
+
const { panel, source } = testCountCapabilities(args2.panel, args2.source);
|
|
1622
|
+
const githubClient = githubClientFor(args2);
|
|
1623
|
+
const noValidators = new Headers();
|
|
1624
|
+
let failureLink = sourceLinkForWorkflow(source, panel.pipeline);
|
|
1625
|
+
let failureObservedAt;
|
|
1626
|
+
try {
|
|
1627
|
+
const selected = await selectGithubWorkflowRun({
|
|
1628
|
+
...args2,
|
|
1629
|
+
source,
|
|
1630
|
+
workflow: panel.pipeline,
|
|
1631
|
+
requestHeaders: noValidators,
|
|
1632
|
+
githubClient
|
|
1633
|
+
});
|
|
1634
|
+
if (!selected.response.ok) return testCountFailure(panel.id, source, selected.response);
|
|
1635
|
+
const { run: run2 } = selected;
|
|
1636
|
+
if (!run2?.id)
|
|
1637
|
+
return testCountEnvelope(
|
|
1638
|
+
noRunEnvelope(panel.id, source, panel.pipeline, selected.response.headers.get("date"))
|
|
1639
|
+
);
|
|
1640
|
+
const link = run2.html_url;
|
|
1641
|
+
const runObservedAt = selected.observedAt;
|
|
1642
|
+
failureLink = link;
|
|
1643
|
+
failureObservedAt = runObservedAt;
|
|
1644
|
+
if (run2.status !== "completed")
|
|
1645
|
+
return testCountEnvelope({
|
|
1646
|
+
panelId: panel.id,
|
|
1647
|
+
state: "ok",
|
|
1648
|
+
observedAt: runObservedAt,
|
|
1649
|
+
link,
|
|
1650
|
+
signal: { type: "test-count", status: "pending" }
|
|
1651
|
+
});
|
|
1652
|
+
const artifactsResponse = await githubFetch(
|
|
1653
|
+
githubArtifactsCall(source, run2.id, panel.test_results),
|
|
1654
|
+
{
|
|
1655
|
+
...args2,
|
|
1656
|
+
source,
|
|
1657
|
+
requestHeaders: noValidators,
|
|
1658
|
+
githubClient
|
|
1659
|
+
}
|
|
1660
|
+
);
|
|
1661
|
+
if (!artifactsResponse.ok) return testCountFailure(panel.id, source, artifactsResponse, link);
|
|
1662
|
+
const artifactObservedAt = observedAt2(artifactsResponse.headers.get("date"));
|
|
1663
|
+
failureObservedAt = oldestObservation(runObservedAt, artifactObservedAt);
|
|
1664
|
+
const artifacts = artifactsSchema.parse(await artifactsResponse.json()).artifacts;
|
|
1665
|
+
const matches = artifacts.filter((artifact2) => artifact2.name === panel.test_results.artifact);
|
|
1666
|
+
if (matches.length === 0)
|
|
1667
|
+
return testCountEnvelope({
|
|
1668
|
+
panelId: panel.id,
|
|
1669
|
+
state: "ok",
|
|
1670
|
+
observedAt: oldestObservation(runObservedAt, artifactObservedAt),
|
|
1671
|
+
link,
|
|
1672
|
+
signal: { type: "test-count", status: "not-reported" }
|
|
1673
|
+
});
|
|
1674
|
+
if (matches.length !== 1 || matches[0]?.expired)
|
|
1675
|
+
return testCountEnvelope(
|
|
1676
|
+
errorEnvelope(
|
|
1677
|
+
panel.id,
|
|
1678
|
+
"upstream-error",
|
|
1679
|
+
"The test-results artifact is unavailable.",
|
|
1680
|
+
link
|
|
1681
|
+
)
|
|
1682
|
+
);
|
|
1683
|
+
const [artifact] = matches;
|
|
1684
|
+
if (!artifact)
|
|
1685
|
+
return testCountEnvelope(
|
|
1686
|
+
errorEnvelope(
|
|
1687
|
+
panel.id,
|
|
1688
|
+
"upstream-error",
|
|
1689
|
+
"The test-results artifact is unavailable.",
|
|
1690
|
+
link
|
|
1691
|
+
)
|
|
1692
|
+
);
|
|
1693
|
+
const archiveResponse = await githubFetch(githubArtifactDownloadCall(source, artifact.id), {
|
|
1694
|
+
...args2,
|
|
1695
|
+
source,
|
|
1696
|
+
requestHeaders: noValidators,
|
|
1697
|
+
githubClient
|
|
1698
|
+
});
|
|
1699
|
+
if (!archiveResponse.ok) return testCountFailure(panel.id, source, archiveResponse, link);
|
|
1700
|
+
const archiveObservedAt = observedAt2(archiveResponse.headers.get("date"));
|
|
1701
|
+
failureObservedAt = oldestObservation(runObservedAt, artifactObservedAt, archiveObservedAt);
|
|
1702
|
+
const summary = testResultsSummarySchema.parse(
|
|
1703
|
+
JSON.parse(await readTestResultsArtifact(archiveResponse, panel.test_results.entry))
|
|
1704
|
+
);
|
|
1705
|
+
if (summary.runId !== run2.id || summary.runAttempt !== run2.run_attempt || summary.headSha !== run2.head_sha)
|
|
1706
|
+
throw new Error("Test-results manifest does not belong to the selected workflow run.");
|
|
1707
|
+
return testCountEnvelope({
|
|
1708
|
+
panelId: panel.id,
|
|
1709
|
+
state: "ok",
|
|
1710
|
+
observedAt: oldestObservation(runObservedAt, artifactObservedAt, archiveObservedAt),
|
|
1711
|
+
link,
|
|
1712
|
+
signal: {
|
|
1713
|
+
type: "test-count",
|
|
1714
|
+
status: "reported",
|
|
1715
|
+
total: summary.total,
|
|
1716
|
+
...summary.passed === void 0 ? {} : { passed: summary.passed },
|
|
1717
|
+
...summary.failed === void 0 ? {} : { failed: summary.failed },
|
|
1718
|
+
...summary.skipped === void 0 ? {} : { skipped: summary.skipped }
|
|
1719
|
+
}
|
|
1720
|
+
});
|
|
1721
|
+
} catch (error) {
|
|
1722
|
+
return testCountEnvelope(
|
|
1723
|
+
errorEnvelope(
|
|
1724
|
+
panel.id,
|
|
1725
|
+
error instanceof GithubAuthenticationError ? "unauthorized" : "upstream-error",
|
|
1726
|
+
error,
|
|
1727
|
+
failureLink,
|
|
1728
|
+
failureObservedAt
|
|
1729
|
+
)
|
|
1730
|
+
);
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
function pullRequestHealthCapabilities(panel) {
|
|
1734
|
+
const { panel: parsed } = z7.object({ panel: pullRequestHealthPanelSchema }).parse({ panel });
|
|
1735
|
+
return {
|
|
1736
|
+
panel: parsed,
|
|
1737
|
+
configuredUpdateWorkflow(workflow) {
|
|
1738
|
+
return parsed.update_workflows.find((candidate) => candidate.workflow === workflow);
|
|
1739
|
+
},
|
|
1740
|
+
permitsBuildBranch(branch) {
|
|
1741
|
+
return parsed.update_workflows.some(
|
|
1742
|
+
({ branch_prefixes }) => branch_prefixes.some((prefix) => branch.startsWith(prefix))
|
|
1743
|
+
);
|
|
1744
|
+
}
|
|
1745
|
+
};
|
|
1746
|
+
}
|
|
1747
|
+
function githubRunsCall(source, workflow, branch, event, perPage = 1, created) {
|
|
1748
|
+
const url = new URL(
|
|
1749
|
+
`https://api.github.com/repos/${source.repo}/actions/workflows/${encodeURIComponent(workflow)}/runs`
|
|
1750
|
+
);
|
|
1751
|
+
if (branch) url.searchParams.set("branch", branch);
|
|
1752
|
+
if (event) url.searchParams.set("event", event);
|
|
1753
|
+
if (created) url.searchParams.set("created", `>=${created}`);
|
|
1754
|
+
url.searchParams.set("per_page", String(perPage));
|
|
1755
|
+
return { url: url.toString(), headers: new Headers() };
|
|
1756
|
+
}
|
|
1757
|
+
function sourceLinkForRepository(source) {
|
|
1758
|
+
return `https://github.com/${source.repo}`;
|
|
1759
|
+
}
|
|
1760
|
+
async function fetchGithubActionsPipeline(args2) {
|
|
1761
|
+
const parsedSource = githubActionsSourceSchema.parse(args2.source);
|
|
1762
|
+
const parsedPanel = pipelinePanelSchema.parse(args2.panel);
|
|
1763
|
+
const githubClient = githubClientFor(args2);
|
|
1764
|
+
let selected;
|
|
1765
|
+
try {
|
|
1766
|
+
selected = await selectGithubWorkflowRun({
|
|
1767
|
+
...args2,
|
|
1768
|
+
source: parsedSource,
|
|
1769
|
+
workflow: parsedPanel.pipeline,
|
|
1770
|
+
githubClient
|
|
1771
|
+
});
|
|
1772
|
+
} catch (error) {
|
|
1773
|
+
return {
|
|
1774
|
+
response: new Response(
|
|
1775
|
+
JSON.stringify(
|
|
1776
|
+
errorEnvelope(
|
|
1777
|
+
args2.panel.id,
|
|
1778
|
+
error instanceof GithubAuthenticationError ? "unauthorized" : "unreachable",
|
|
1779
|
+
error,
|
|
1780
|
+
sourceLink(args2.panel, args2.source)
|
|
1781
|
+
)
|
|
1782
|
+
),
|
|
1783
|
+
{ status: 200 }
|
|
1784
|
+
),
|
|
1785
|
+
failure: {
|
|
1786
|
+
kind: error instanceof GithubAuthenticationError ? "unauthorized" : "unreachable",
|
|
1787
|
+
...safeNetworkCode(error) ? { networkCode: safeNetworkCode(error) } : {}
|
|
1788
|
+
}
|
|
1789
|
+
};
|
|
1790
|
+
}
|
|
1791
|
+
const upstream = selected.response;
|
|
1792
|
+
if (upstream.status === 304) return { response: upstream };
|
|
1793
|
+
if (!upstream.ok) return githubPipelineFailure(args2, upstream);
|
|
1794
|
+
try {
|
|
1795
|
+
const run2 = selected.run;
|
|
1796
|
+
if (!run2) {
|
|
1797
|
+
return {
|
|
1798
|
+
response: new Response(
|
|
1799
|
+
JSON.stringify(
|
|
1800
|
+
errorEnvelope(
|
|
1801
|
+
args2.panel.id,
|
|
1802
|
+
"no-runs",
|
|
1803
|
+
parsedSource.branch ? `No workflow runs found for branch "${parsedSource.branch}". Check the source's branch setting.` : "No workflow runs found.",
|
|
1804
|
+
sourceLink(args2.panel, args2.source),
|
|
1805
|
+
observedAt2(upstream.headers.get("date"))
|
|
1806
|
+
)
|
|
1807
|
+
),
|
|
1808
|
+
{ status: 200 }
|
|
1809
|
+
),
|
|
1810
|
+
failure: { kind: "no-runs", upstreamStatus: upstream.status }
|
|
1811
|
+
};
|
|
1812
|
+
}
|
|
1813
|
+
const signal = {
|
|
1814
|
+
type: "pipeline-status",
|
|
1815
|
+
status: normalizeStatus(run2.status, run2.conclusion),
|
|
1816
|
+
rawStatus: run2.conclusion ?? run2.status,
|
|
1817
|
+
name: run2.name,
|
|
1818
|
+
...run2.head_branch ?? parsedSource.branch ? { branch: run2.head_branch ?? parsedSource.branch } : {},
|
|
1819
|
+
...timestamp(run2.updated_at) ? { sourceUpdatedAt: timestamp(run2.updated_at) } : {},
|
|
1820
|
+
...timestamp(run2.run_started_at) ? { runStartedAt: timestamp(run2.run_started_at) } : {},
|
|
1821
|
+
...run2.id !== void 0 ? { sourceRunId: String(run2.id) } : {},
|
|
1822
|
+
...run2.status === "completed" ? completedRunDuration(run2) : {}
|
|
1823
|
+
};
|
|
1824
|
+
if (signal.status === "running" && run2.id !== void 0) {
|
|
1825
|
+
const activity = await activeGithubActivity({
|
|
1826
|
+
source: parsedSource,
|
|
1827
|
+
runId: run2.id,
|
|
1828
|
+
requestHeaders: args2.requestHeaders,
|
|
1829
|
+
fetcher: args2.fetcher,
|
|
1830
|
+
githubClient: githubClientFor(args2)
|
|
1831
|
+
});
|
|
1832
|
+
if (activity) signal.activity = activity;
|
|
1833
|
+
}
|
|
1834
|
+
const envelope = {
|
|
1835
|
+
panelId: args2.panel.id,
|
|
1836
|
+
state: "ok",
|
|
1837
|
+
observedAt: observedAt2(upstream.headers.get("date")),
|
|
1838
|
+
link: run2.html_url,
|
|
1839
|
+
signal
|
|
1840
|
+
};
|
|
1841
|
+
return { envelope, response: upstream };
|
|
1842
|
+
} catch (error) {
|
|
1843
|
+
return {
|
|
1844
|
+
response: new Response(
|
|
1845
|
+
JSON.stringify(
|
|
1846
|
+
errorEnvelope(
|
|
1847
|
+
args2.panel.id,
|
|
1848
|
+
"upstream-error",
|
|
1849
|
+
error,
|
|
1850
|
+
sourceLink(args2.panel, args2.source),
|
|
1851
|
+
observedAt2(upstream.headers.get("date"))
|
|
1852
|
+
)
|
|
1853
|
+
),
|
|
1854
|
+
{ status: 200 }
|
|
1855
|
+
),
|
|
1856
|
+
failure: { kind: "upstream-error", upstreamStatus: upstream.status }
|
|
1857
|
+
};
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
function githubPipelineFailure(args2, upstream) {
|
|
1861
|
+
return {
|
|
1862
|
+
response: new Response(
|
|
1863
|
+
JSON.stringify(
|
|
1864
|
+
errorEnvelope(
|
|
1865
|
+
args2.panel.id,
|
|
1866
|
+
errorKind(upstream.status),
|
|
1867
|
+
`${upstream.status} ${upstream.statusText}`,
|
|
1868
|
+
sourceLink(args2.panel, args2.source),
|
|
1869
|
+
observedAt2(upstream.headers.get("date"))
|
|
1870
|
+
)
|
|
1871
|
+
),
|
|
1872
|
+
{ status: 200 }
|
|
1873
|
+
),
|
|
1874
|
+
failure: { kind: errorKind(upstream.status), upstreamStatus: upstream.status }
|
|
1875
|
+
};
|
|
1876
|
+
}
|
|
1877
|
+
function recentRunsCreatedAt(now = /* @__PURE__ */ new Date()) {
|
|
1878
|
+
return new Date(now.valueOf() - 30 * 24 * 60 * 60 * 1e3).toISOString();
|
|
1879
|
+
}
|
|
1880
|
+
function newestGithubRun(runs) {
|
|
1881
|
+
return runs.reduce((newest, candidate) => {
|
|
1882
|
+
if (!newest) return candidate;
|
|
1883
|
+
const candidateCreatedAt = Date.parse(candidate.created_at ?? "");
|
|
1884
|
+
const newestCreatedAt = Date.parse(newest.created_at ?? "");
|
|
1885
|
+
if (candidateCreatedAt > newestCreatedAt) return candidate;
|
|
1886
|
+
if (candidateCreatedAt < newestCreatedAt) return newest;
|
|
1887
|
+
return (candidate.id ?? 0) > (newest.id ?? 0) ? candidate : newest;
|
|
1888
|
+
}, void 0);
|
|
1889
|
+
}
|
|
1890
|
+
async function selectGithubWorkflowRun(args2) {
|
|
1891
|
+
let response = await githubFetch(
|
|
1892
|
+
githubRunsCall(
|
|
1893
|
+
args2.source,
|
|
1894
|
+
args2.workflow,
|
|
1895
|
+
args2.source.branch,
|
|
1896
|
+
void 0,
|
|
1897
|
+
100,
|
|
1898
|
+
recentRunsCreatedAt()
|
|
1899
|
+
),
|
|
1900
|
+
args2
|
|
1901
|
+
);
|
|
1902
|
+
if (response.status === 304 || !response.ok)
|
|
1903
|
+
return { response, observedAt: observedAt2(response.headers.get("date")), run: void 0 };
|
|
1904
|
+
let runs = runsSchema.parse(await response.json()).workflow_runs;
|
|
1905
|
+
if (runs.length === 0) {
|
|
1906
|
+
response = await githubFetch(
|
|
1907
|
+
githubRunsCall(args2.source, args2.workflow, args2.source.branch),
|
|
1908
|
+
args2
|
|
1909
|
+
);
|
|
1910
|
+
if (response.status === 304 || !response.ok)
|
|
1911
|
+
return { response, observedAt: observedAt2(response.headers.get("date")), run: void 0 };
|
|
1912
|
+
runs = runsSchema.parse(await response.json()).workflow_runs;
|
|
1913
|
+
}
|
|
1914
|
+
return {
|
|
1915
|
+
response,
|
|
1916
|
+
observedAt: observedAt2(response.headers.get("date")),
|
|
1917
|
+
run: newestGithubRun(runs)
|
|
1918
|
+
};
|
|
1919
|
+
}
|
|
1920
|
+
async function activeGithubActivity(args2) {
|
|
1921
|
+
const call = githubJobsCall(args2.source, args2.runId);
|
|
1922
|
+
try {
|
|
1923
|
+
const response = await githubFetch(call, args2);
|
|
1924
|
+
if (!response.ok) return void 0;
|
|
1925
|
+
const jobs = jobsSchema.parse(await response.json()).jobs;
|
|
1926
|
+
const job = jobs.find((candidate) => candidate.status === "in_progress") ?? jobs.find((candidate) => candidate.status === "queued");
|
|
1927
|
+
if (!job) return void 0;
|
|
1928
|
+
const step = job.steps?.find((candidate) => candidate.status === "in_progress");
|
|
1929
|
+
return step ? { kind: "step", name: step.name, parent: job.name } : { kind: "job", name: job.name };
|
|
1930
|
+
} catch {
|
|
1931
|
+
return void 0;
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
async function githubFetch(call, args2) {
|
|
1935
|
+
return args2.githubClient.get({
|
|
1936
|
+
source: args2.source,
|
|
1937
|
+
url: call.url,
|
|
1938
|
+
requestHeaders: args2.requestHeaders,
|
|
1939
|
+
fetcher: args2.fetcher
|
|
1940
|
+
});
|
|
1941
|
+
}
|
|
1942
|
+
function githubClientFor(args2) {
|
|
1943
|
+
return args2.githubClient ?? createGithubClient(args2.credentials ?? environmentCredentials());
|
|
1944
|
+
}
|
|
1945
|
+
function githubJobsCall(source, runId) {
|
|
1946
|
+
const url = new URL(`https://api.github.com/repos/${source.repo}/actions/runs/${runId}/jobs`);
|
|
1947
|
+
url.searchParams.set("per_page", "100");
|
|
1948
|
+
return { url: url.toString(), headers: new Headers() };
|
|
1949
|
+
}
|
|
1950
|
+
function githubArtifactsCall(source, runId, testResults) {
|
|
1951
|
+
const url = new URL(`https://api.github.com/repos/${source.repo}/actions/runs/${runId}/artifacts`);
|
|
1952
|
+
url.searchParams.set("name", testResults.artifact);
|
|
1953
|
+
url.searchParams.set("per_page", "100");
|
|
1954
|
+
return { url: url.toString(), headers: new Headers() };
|
|
1955
|
+
}
|
|
1956
|
+
function githubArtifactDownloadCall(source, artifactId) {
|
|
1957
|
+
return {
|
|
1958
|
+
url: `https://api.github.com/repos/${source.repo}/actions/artifacts/${artifactId}/zip`,
|
|
1959
|
+
headers: new Headers()
|
|
1960
|
+
};
|
|
1961
|
+
}
|
|
1962
|
+
function noRunEnvelope(panelId, source, pipeline, date) {
|
|
1963
|
+
return {
|
|
1964
|
+
panelId,
|
|
1965
|
+
state: "error",
|
|
1966
|
+
observedAt: observedAt2(date),
|
|
1967
|
+
link: sourceLinkForWorkflow(source, pipeline),
|
|
1968
|
+
error: {
|
|
1969
|
+
kind: "no-runs",
|
|
1970
|
+
message: "No matching workflow runs were found. Check the configured workflow and branch."
|
|
1971
|
+
}
|
|
1972
|
+
};
|
|
1973
|
+
}
|
|
1974
|
+
function testCountFailure(panelId, source, response, link = sourceLinkForRepository(source)) {
|
|
1975
|
+
return testCountEnvelope(
|
|
1976
|
+
errorEnvelope(
|
|
1977
|
+
panelId,
|
|
1978
|
+
errorKind(response.status),
|
|
1979
|
+
`${response.status} ${response.statusText}`,
|
|
1980
|
+
link,
|
|
1981
|
+
observedAt2(response.headers.get("date"))
|
|
1982
|
+
),
|
|
1983
|
+
{ kind: errorKind(response.status), upstreamStatus: response.status }
|
|
1984
|
+
);
|
|
1985
|
+
}
|
|
1986
|
+
function testCountEnvelope(envelope, failure2) {
|
|
1987
|
+
return { envelope, response: new Response(null), ...failure2 ? { failure: failure2 } : {} };
|
|
1988
|
+
}
|
|
1989
|
+
function oldestObservation(...values) {
|
|
1990
|
+
return values.reduce((oldest, value2) => Date.parse(value2) < Date.parse(oldest) ? value2 : oldest);
|
|
1991
|
+
}
|
|
1992
|
+
function completedRunDuration(run2) {
|
|
1993
|
+
const startedAt = timestamp(run2.run_started_at);
|
|
1994
|
+
const updatedAt = timestamp(run2.updated_at);
|
|
1995
|
+
if (!startedAt || !updatedAt) return {};
|
|
1996
|
+
const durationMs = new Date(updatedAt).valueOf() - new Date(startedAt).valueOf();
|
|
1997
|
+
return Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {};
|
|
1998
|
+
}
|
|
1999
|
+
function timestamp(value2) {
|
|
2000
|
+
if (!value2 || !z7.iso.datetime().safeParse(value2).success) return void 0;
|
|
2001
|
+
return Number.isFinite(new Date(value2).valueOf()) ? value2 : void 0;
|
|
2002
|
+
}
|
|
2003
|
+
function normalizeStatus(status, conclusion) {
|
|
2004
|
+
if (status !== "completed") return "running";
|
|
2005
|
+
if (conclusion === "success") return "passed";
|
|
2006
|
+
if (conclusion === "failure" || conclusion === "timed_out") return "failed";
|
|
2007
|
+
if (conclusion === "cancelled") return "cancelled";
|
|
2008
|
+
return "unknown";
|
|
2009
|
+
}
|
|
2010
|
+
function errorKind(status) {
|
|
2011
|
+
return upstreamErrorKind(status);
|
|
2012
|
+
}
|
|
2013
|
+
function errorEnvelope(panelId, kind, error, link, observedAt4 = (/* @__PURE__ */ new Date()).toISOString()) {
|
|
2014
|
+
return upstreamErrorEnvelope({ panelId, kind, error, link, upstreamDate: observedAt4 });
|
|
2015
|
+
}
|
|
2016
|
+
function sourceLink(panel, source) {
|
|
2017
|
+
const parsedPanel = z7.object({ pipeline: z7.string().min(1) }).parse(panel);
|
|
2018
|
+
const parsedSource = githubActionsSourceSchema.parse(source);
|
|
2019
|
+
return sourceLinkForWorkflow(parsedSource, parsedPanel.pipeline);
|
|
2020
|
+
}
|
|
2021
|
+
function sourceLinkForWorkflow(source, pipeline) {
|
|
2022
|
+
return `https://github.com/${source.repo}/actions/workflows/${encodeURIComponent(pipeline)}`;
|
|
2023
|
+
}
|
|
2024
|
+
function observedAt2(value2) {
|
|
2025
|
+
return observedAt(value2);
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
// packages/server/src/configuration-error.ts
|
|
2029
|
+
var ConfigurationError = class extends Error {
|
|
2030
|
+
constructor(message2, diagnostics) {
|
|
2031
|
+
super(message2);
|
|
2032
|
+
this.diagnostics = diagnostics;
|
|
2033
|
+
}
|
|
2034
|
+
diagnostics;
|
|
2035
|
+
};
|
|
2036
|
+
function configurationLocation(path) {
|
|
2037
|
+
return path.reduce(
|
|
2038
|
+
(location, part) => typeof part === "number" ? `${location}[${part}]` : `${location}${location ? "." : ""}${String(part)}`,
|
|
2039
|
+
""
|
|
2040
|
+
) || "configuration";
|
|
2041
|
+
}
|
|
2042
|
+
function boardConfigurationLocation(config, path) {
|
|
2043
|
+
const [record, key, ...rest] = path;
|
|
2044
|
+
if ((record === "boards" || record === "sources") && key !== void 0) {
|
|
2045
|
+
const entries = config && typeof config === "object" ? Reflect.get(config, record) : void 0;
|
|
2046
|
+
const index = entries && typeof entries === "object" ? Object.keys(entries).indexOf(String(key)) : -1;
|
|
2047
|
+
return configurationLocation([record, index, ...rest]);
|
|
2048
|
+
}
|
|
2049
|
+
return configurationLocation(path);
|
|
2050
|
+
}
|
|
2051
|
+
function schemaDiagnostics(error, locate, kind = "schema") {
|
|
2052
|
+
return error.issues.map((issue) => ({
|
|
2053
|
+
kind,
|
|
2054
|
+
location: locate(issue.path),
|
|
2055
|
+
constraint: correctiveConstraint(issue)
|
|
2056
|
+
}));
|
|
2057
|
+
}
|
|
2058
|
+
function correctiveConstraint(issue) {
|
|
2059
|
+
switch (issue.code) {
|
|
2060
|
+
case "invalid_type":
|
|
2061
|
+
return `Provide a value of type ${issue.expected}.`;
|
|
2062
|
+
case "too_big":
|
|
2063
|
+
return `Use ${issue.inclusive ? "at most" : "fewer than"} ${issue.maximum} ${issue.origin === "array" ? "entries" : issue.origin === "string" ? "characters" : "as the value"}.`;
|
|
2064
|
+
case "too_small":
|
|
2065
|
+
return `Use ${issue.inclusive ? "at least" : "more than"} ${issue.minimum} ${issue.origin === "array" ? "entries" : issue.origin === "string" ? "characters" : "as the value"}.`;
|
|
2066
|
+
// Format messages are fixed by our schemas (or Zod); unlike custom issues they contain no authored values.
|
|
2067
|
+
case "invalid_format":
|
|
2068
|
+
return issue.message;
|
|
2069
|
+
case "invalid_value":
|
|
2070
|
+
return "Use one of the values allowed by the board schema.";
|
|
2071
|
+
case "custom":
|
|
2072
|
+
return typeof issue.params?.constraint === "string" ? issue.params.constraint : "Correct this field according to the board schema.";
|
|
2073
|
+
default:
|
|
2074
|
+
return "Provide a value matching the board schema for this field.";
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
// packages/server/src/adapters/azure-devops.ts
|
|
2079
|
+
import { readFile } from "node:fs/promises";
|
|
2080
|
+
import { z as z8 } from "zod";
|
|
2081
|
+
var pipelinePanelSchema2 = z8.object({
|
|
2082
|
+
id: z8.string().min(1),
|
|
2083
|
+
type: z8.literal("pipeline-status"),
|
|
2084
|
+
source: z8.string().min(1),
|
|
2085
|
+
pipeline: z8.number().int().positive()
|
|
2086
|
+
});
|
|
2087
|
+
var buildSchema = z8.object({
|
|
2088
|
+
id: z8.number().int().positive(),
|
|
2089
|
+
buildNumber: z8.string().min(1),
|
|
2090
|
+
status: z8.string().nullable().optional(),
|
|
2091
|
+
result: z8.string().nullable().optional(),
|
|
2092
|
+
sourceBranch: z8.string().min(1).nullable().optional(),
|
|
2093
|
+
startTime: z8.string().nullable().optional(),
|
|
2094
|
+
finishTime: z8.string().nullable().optional(),
|
|
2095
|
+
lastChangedDate: z8.string().nullable().optional()
|
|
2096
|
+
});
|
|
2097
|
+
var buildsSchema = z8.object({ value: z8.array(buildSchema) });
|
|
2098
|
+
var timelineSchema = z8.object({
|
|
2099
|
+
records: z8.array(
|
|
2100
|
+
z8.object({
|
|
2101
|
+
id: z8.string().min(1),
|
|
2102
|
+
parentId: z8.string().min(1).nullable().optional(),
|
|
2103
|
+
type: z8.string().min(1),
|
|
2104
|
+
name: z8.string().min(1),
|
|
2105
|
+
state: z8.string().nullable().optional()
|
|
2106
|
+
})
|
|
2107
|
+
)
|
|
2108
|
+
});
|
|
2109
|
+
function permittedAzureDevOpsCalls(panel, source) {
|
|
2110
|
+
const { panel: parsedPanel, source: parsedSource } = z8.object({ panel: pipelinePanelSchema2, source: azureDevOpsSourceSchema }).parse({ panel, source });
|
|
2111
|
+
return [buildsCall(parsedPanel.pipeline, parsedSource)];
|
|
2112
|
+
}
|
|
2113
|
+
async function fetchAzureDevOpsPipeline(args2) {
|
|
2114
|
+
const panel = pipelinePanelSchema2.parse(args2.panel);
|
|
2115
|
+
const source = azureDevOpsSourceSchema.parse(args2.source);
|
|
2116
|
+
const authorization = await azureDevOpsAuthorization(source, args2.credentials);
|
|
2117
|
+
if (!authorization) {
|
|
2118
|
+
return {
|
|
2119
|
+
response: errorResponse(
|
|
2120
|
+
errorEnvelope2(
|
|
2121
|
+
panel.id,
|
|
2122
|
+
"unauthorized",
|
|
2123
|
+
"Azure DevOps credentials are not available.",
|
|
2124
|
+
sourceLink2(panel.pipeline, source)
|
|
2125
|
+
)
|
|
2126
|
+
),
|
|
2127
|
+
failure: { kind: "unauthorized" }
|
|
2128
|
+
};
|
|
2129
|
+
}
|
|
2130
|
+
const call = buildsCall(panel.pipeline, source);
|
|
2131
|
+
copyValidators(args2.requestHeaders, call.headers);
|
|
2132
|
+
call.headers.set("authorization", authorization);
|
|
2133
|
+
let upstream;
|
|
2134
|
+
try {
|
|
2135
|
+
upstream = await args2.fetcher(call.url, { headers: call.headers });
|
|
2136
|
+
} catch (error) {
|
|
2137
|
+
return {
|
|
2138
|
+
response: errorResponse(
|
|
2139
|
+
errorEnvelope2(panel.id, "unreachable", error, sourceLink2(panel.pipeline, source))
|
|
2140
|
+
),
|
|
2141
|
+
failure: {
|
|
2142
|
+
kind: "unreachable",
|
|
2143
|
+
...safeNetworkCode(error) ? { networkCode: safeNetworkCode(error) } : {}
|
|
2144
|
+
}
|
|
2145
|
+
};
|
|
2146
|
+
}
|
|
2147
|
+
if (upstream.status === 304) return { response: upstream };
|
|
2148
|
+
if (!upstream.ok) {
|
|
2149
|
+
return {
|
|
2150
|
+
response: errorResponse(
|
|
2151
|
+
errorEnvelope2(
|
|
2152
|
+
panel.id,
|
|
2153
|
+
errorKind2(upstream.status),
|
|
2154
|
+
`${upstream.status} ${upstream.statusText}`,
|
|
2155
|
+
sourceLink2(panel.pipeline, source),
|
|
2156
|
+
observedAt3(upstream.headers.get("date"))
|
|
2157
|
+
)
|
|
2158
|
+
),
|
|
2159
|
+
failure: { kind: errorKind2(upstream.status), upstreamStatus: upstream.status }
|
|
2160
|
+
};
|
|
2161
|
+
}
|
|
2162
|
+
try {
|
|
2163
|
+
const build = buildsSchema.parse(await upstream.json()).value[0];
|
|
2164
|
+
if (!build) {
|
|
2165
|
+
return {
|
|
2166
|
+
response: errorResponse(
|
|
2167
|
+
errorEnvelope2(
|
|
2168
|
+
panel.id,
|
|
2169
|
+
"no-runs",
|
|
2170
|
+
source.branch ? `No builds found for branch "${source.branch}". Check the source's branch setting.` : "No builds found.",
|
|
2171
|
+
sourceLink2(panel.pipeline, source),
|
|
2172
|
+
observedAt3(upstream.headers.get("date"))
|
|
2173
|
+
)
|
|
2174
|
+
),
|
|
2175
|
+
failure: { kind: "no-runs", upstreamStatus: upstream.status }
|
|
2176
|
+
};
|
|
2177
|
+
}
|
|
2178
|
+
const signal = {
|
|
2179
|
+
type: "pipeline-status",
|
|
2180
|
+
status: normalizeStatus2(build.status, build.result),
|
|
2181
|
+
rawStatus: build.result ?? build.status ?? "unknown",
|
|
2182
|
+
name: build.buildNumber,
|
|
2183
|
+
...build.sourceBranch ?? source.branch ? { branch: build.sourceBranch ?? source.branch } : {},
|
|
2184
|
+
...timestamp2(build.startTime) ? { runStartedAt: timestamp2(build.startTime) } : {},
|
|
2185
|
+
...timestamp2(build.lastChangedDate) ? { sourceUpdatedAt: timestamp2(build.lastChangedDate) } : {},
|
|
2186
|
+
sourceRunId: String(build.id),
|
|
2187
|
+
...completedBuildDuration(build)
|
|
2188
|
+
};
|
|
2189
|
+
if (signal.status === "running") {
|
|
2190
|
+
const activity = await activeAzureDevOpsActivity({
|
|
2191
|
+
buildId: build.id,
|
|
2192
|
+
source,
|
|
2193
|
+
fetcher: args2.fetcher,
|
|
2194
|
+
authorization: call.headers.get("authorization") ?? ""
|
|
2195
|
+
});
|
|
2196
|
+
if (activity) signal.activity = activity;
|
|
2197
|
+
}
|
|
2198
|
+
return {
|
|
2199
|
+
envelope: {
|
|
2200
|
+
panelId: panel.id,
|
|
2201
|
+
state: "ok",
|
|
2202
|
+
observedAt: observedAt3(upstream.headers.get("date")),
|
|
2203
|
+
link: buildLink(build.id, source),
|
|
2204
|
+
signal
|
|
2205
|
+
},
|
|
2206
|
+
response: upstream
|
|
2207
|
+
};
|
|
2208
|
+
} catch (error) {
|
|
2209
|
+
return {
|
|
2210
|
+
response: errorResponse(
|
|
2211
|
+
errorEnvelope2(
|
|
2212
|
+
panel.id,
|
|
2213
|
+
"upstream-error",
|
|
2214
|
+
error,
|
|
2215
|
+
sourceLink2(panel.pipeline, source),
|
|
2216
|
+
observedAt3(upstream.headers.get("date"))
|
|
2217
|
+
)
|
|
2218
|
+
),
|
|
2219
|
+
failure: { kind: "upstream-error", upstreamStatus: upstream.status }
|
|
2220
|
+
};
|
|
2221
|
+
}
|
|
2222
|
+
}
|
|
2223
|
+
var delegatedTokenFileSchema = z8.object({
|
|
2224
|
+
accessToken: z8.string().min(1),
|
|
2225
|
+
expiresAt: z8.string().min(1)
|
|
2226
|
+
});
|
|
2227
|
+
async function azureDevOpsAuthorization(source, credentials) {
|
|
2228
|
+
if (source.token_env) {
|
|
2229
|
+
const token = credentials.get(source.token_env);
|
|
2230
|
+
return token ? `Basic ${btoa(`:${token}`)}` : void 0;
|
|
2231
|
+
}
|
|
2232
|
+
if (!source.entra_token_file_env) return void 0;
|
|
2233
|
+
const tokenFile = credentials.get(source.entra_token_file_env);
|
|
2234
|
+
if (!tokenFile) return void 0;
|
|
2235
|
+
try {
|
|
2236
|
+
const token = delegatedTokenFileSchema.parse(JSON.parse(await readFile(tokenFile, "utf8")));
|
|
2237
|
+
const expiresAt = Date.parse(token.expiresAt);
|
|
2238
|
+
if (!Number.isFinite(expiresAt) || expiresAt <= Date.now()) return void 0;
|
|
2239
|
+
return `Bearer ${token.accessToken}`;
|
|
2240
|
+
} catch {
|
|
2241
|
+
return void 0;
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
function buildsCall(definitionId, source) {
|
|
2245
|
+
const url = apiUrl(source, "build/builds");
|
|
2246
|
+
url.searchParams.set("definitions", String(definitionId));
|
|
2247
|
+
if (source.branch) url.searchParams.set("branchName", adoBranch(source.branch));
|
|
2248
|
+
url.searchParams.set("queryOrder", "queueTimeDescending");
|
|
2249
|
+
url.searchParams.set("$top", "1");
|
|
2250
|
+
return { url: url.toString(), headers: new Headers({ accept: "application/json" }) };
|
|
2251
|
+
}
|
|
2252
|
+
function timelineCall(buildId, source) {
|
|
740
2253
|
return {
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
return parsed.update_workflows.find((candidate) => candidate.workflow === workflow);
|
|
744
|
-
},
|
|
745
|
-
permitsBuildBranch(branch) {
|
|
746
|
-
return parsed.update_workflows.some(
|
|
747
|
-
({ branch_prefixes }) => branch_prefixes.some((prefix) => branch.startsWith(prefix))
|
|
748
|
-
);
|
|
749
|
-
}
|
|
2254
|
+
url: apiUrl(source, `build/builds/${buildId}/timeline`).toString(),
|
|
2255
|
+
headers: new Headers({ accept: "application/json" })
|
|
750
2256
|
};
|
|
751
2257
|
}
|
|
2258
|
+
function apiUrl(source, suffix) {
|
|
2259
|
+
const url = new URL(
|
|
2260
|
+
`https://dev.azure.com/${encodeURIComponent(source.organization)}/${encodeURIComponent(source.project)}/_apis/${suffix}`
|
|
2261
|
+
);
|
|
2262
|
+
url.searchParams.set("api-version", "7.1");
|
|
2263
|
+
return url;
|
|
2264
|
+
}
|
|
2265
|
+
function adoBranch(branch) {
|
|
2266
|
+
return branch.startsWith("refs/") ? branch : `refs/heads/${branch}`;
|
|
2267
|
+
}
|
|
2268
|
+
async function activeAzureDevOpsActivity(args2) {
|
|
2269
|
+
const call = timelineCall(args2.buildId, args2.source);
|
|
2270
|
+
call.headers.set("authorization", args2.authorization);
|
|
2271
|
+
try {
|
|
2272
|
+
const response = await args2.fetcher(call.url, { headers: call.headers });
|
|
2273
|
+
if (!response.ok) return void 0;
|
|
2274
|
+
const records = timelineSchema.parse(await response.json()).records;
|
|
2275
|
+
const active = records.find((record) => record.state === "inProgress");
|
|
2276
|
+
if (!active) return void 0;
|
|
2277
|
+
const parent = active.parentId ? records.find((record) => record.id === active.parentId) : void 0;
|
|
2278
|
+
const kind = active.type.toLowerCase();
|
|
2279
|
+
return {
|
|
2280
|
+
kind: kind === "stage" ? "stage" : kind === "job" ? "job" : "step",
|
|
2281
|
+
name: active.name,
|
|
2282
|
+
...parent ? { parent: parent.name } : {}
|
|
2283
|
+
};
|
|
2284
|
+
} catch {
|
|
2285
|
+
return void 0;
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
function normalizeStatus2(status, result) {
|
|
2289
|
+
if (status === "notStarted" || status === "postponed" || status === "inProgress" || status === "cancelling")
|
|
2290
|
+
return "running";
|
|
2291
|
+
if (status !== "completed") return "unknown";
|
|
2292
|
+
if (result === "succeeded") return "passed";
|
|
2293
|
+
if (result === "failed") return "failed";
|
|
2294
|
+
if (result === "partiallySucceeded") return "warning";
|
|
2295
|
+
if (result === "canceled") return "cancelled";
|
|
2296
|
+
return "unknown";
|
|
2297
|
+
}
|
|
2298
|
+
function completedBuildDuration(build) {
|
|
2299
|
+
const startedAt = timestamp2(build.startTime);
|
|
2300
|
+
const finishedAt = timestamp2(build.finishTime);
|
|
2301
|
+
if (!startedAt || !finishedAt) return {};
|
|
2302
|
+
const durationMs = new Date(finishedAt).valueOf() - new Date(startedAt).valueOf();
|
|
2303
|
+
return Number.isFinite(durationMs) && durationMs >= 0 ? { durationMs } : {};
|
|
2304
|
+
}
|
|
2305
|
+
function timestamp2(value2) {
|
|
2306
|
+
if (!value2 || !z8.iso.datetime().safeParse(value2).success) return void 0;
|
|
2307
|
+
return Number.isFinite(new Date(value2).valueOf()) ? value2 : void 0;
|
|
2308
|
+
}
|
|
2309
|
+
function copyValidators(requestHeaders, upstreamHeaders) {
|
|
2310
|
+
forwardValidators(requestHeaders, upstreamHeaders);
|
|
2311
|
+
}
|
|
2312
|
+
function buildLink(buildId, source) {
|
|
2313
|
+
return `https://dev.azure.com/${encodeURIComponent(source.organization)}/${encodeURIComponent(source.project)}/_build/results?buildId=${buildId}`;
|
|
2314
|
+
}
|
|
2315
|
+
function sourceLink2(definitionId, source) {
|
|
2316
|
+
return `https://dev.azure.com/${encodeURIComponent(source.organization)}/${encodeURIComponent(source.project)}/_build?definitionId=${definitionId}`;
|
|
2317
|
+
}
|
|
2318
|
+
function errorResponse(envelope) {
|
|
2319
|
+
return upstreamErrorResponse(envelope);
|
|
2320
|
+
}
|
|
2321
|
+
function errorEnvelope2(panelId, kind, error, link, date) {
|
|
2322
|
+
return upstreamErrorEnvelope({ panelId, kind, error, link, upstreamDate: date });
|
|
2323
|
+
}
|
|
2324
|
+
function errorKind2(status) {
|
|
2325
|
+
return upstreamErrorKind(status);
|
|
2326
|
+
}
|
|
2327
|
+
function observedAt3(value2) {
|
|
2328
|
+
return observedAt(value2);
|
|
2329
|
+
}
|
|
752
2330
|
|
|
753
2331
|
// packages/server/src/adapters/gitlab-ci.ts
|
|
754
|
-
import { z as
|
|
755
|
-
var pipelinePanelSchema3 =
|
|
756
|
-
id:
|
|
757
|
-
type:
|
|
758
|
-
source:
|
|
2332
|
+
import { z as z9 } from "zod";
|
|
2333
|
+
var pipelinePanelSchema3 = z9.object({
|
|
2334
|
+
id: z9.string().min(1),
|
|
2335
|
+
type: z9.literal("pipeline-status"),
|
|
2336
|
+
source: z9.string().min(1)
|
|
759
2337
|
});
|
|
760
|
-
var pipelineSchema =
|
|
761
|
-
id:
|
|
762
|
-
name:
|
|
763
|
-
status:
|
|
764
|
-
ref:
|
|
765
|
-
created_at:
|
|
766
|
-
updated_at:
|
|
767
|
-
web_url:
|
|
2338
|
+
var pipelineSchema = z9.object({
|
|
2339
|
+
id: z9.number().int().positive(),
|
|
2340
|
+
name: z9.string().min(1).nullable().optional(),
|
|
2341
|
+
status: z9.string(),
|
|
2342
|
+
ref: z9.string().min(1).nullable().optional(),
|
|
2343
|
+
created_at: z9.string().nullable().optional(),
|
|
2344
|
+
updated_at: z9.string().nullable().optional(),
|
|
2345
|
+
web_url: z9.url()
|
|
768
2346
|
});
|
|
769
2347
|
function permittedGitlabCiCalls(panel, source) {
|
|
770
|
-
const { source: parsedSource } =
|
|
2348
|
+
const { source: parsedSource } = z9.object({ panel: pipelinePanelSchema3, source: gitlabCiSourceSchema }).parse({ panel, source });
|
|
771
2349
|
return [pipelinesCall(parsedSource)];
|
|
772
2350
|
}
|
|
2351
|
+
async function fetchGitlabCiPipeline(args2) {
|
|
2352
|
+
const panel = pipelinePanelSchema3.parse(args2.panel);
|
|
2353
|
+
const source = gitlabCiSourceSchema.parse(args2.source);
|
|
2354
|
+
const token = args2.credentials.get(source.token_env);
|
|
2355
|
+
if (!token)
|
|
2356
|
+
return failure(
|
|
2357
|
+
panel.id,
|
|
2358
|
+
"unauthorized",
|
|
2359
|
+
"GitLab credentials are not available.",
|
|
2360
|
+
sourceLink3(source)
|
|
2361
|
+
);
|
|
2362
|
+
const call = pipelinesCall(source);
|
|
2363
|
+
forwardValidators(args2.requestHeaders, call.headers);
|
|
2364
|
+
call.headers.set("private-token", token);
|
|
2365
|
+
let upstream;
|
|
2366
|
+
try {
|
|
2367
|
+
upstream = await args2.fetcher(call.url, { headers: call.headers });
|
|
2368
|
+
} catch (error) {
|
|
2369
|
+
return failure(panel.id, "unreachable", error, sourceLink3(source), void 0, {
|
|
2370
|
+
kind: "unreachable",
|
|
2371
|
+
...safeNetworkCode(error) ? { networkCode: safeNetworkCode(error) } : {}
|
|
2372
|
+
});
|
|
2373
|
+
}
|
|
2374
|
+
if (upstream.status === 304) return { response: upstream };
|
|
2375
|
+
if (!upstream.ok) {
|
|
2376
|
+
const kind = upstreamErrorKind(upstream.status);
|
|
2377
|
+
return failure(
|
|
2378
|
+
panel.id,
|
|
2379
|
+
kind,
|
|
2380
|
+
`${upstream.status} ${upstream.statusText}`,
|
|
2381
|
+
sourceLink3(source),
|
|
2382
|
+
upstream.headers.get("date"),
|
|
2383
|
+
{ kind, upstreamStatus: upstream.status }
|
|
2384
|
+
);
|
|
2385
|
+
}
|
|
2386
|
+
try {
|
|
2387
|
+
const pipeline = z9.array(pipelineSchema).parse(await upstream.json())[0];
|
|
2388
|
+
if (!pipeline) {
|
|
2389
|
+
const detail = source.branch ? `No pipelines found for ref "${source.branch}". Check the source's branch setting.` : "No pipelines found.";
|
|
2390
|
+
return failure(
|
|
2391
|
+
panel.id,
|
|
2392
|
+
"no-runs",
|
|
2393
|
+
detail,
|
|
2394
|
+
sourceLink3(source),
|
|
2395
|
+
upstream.headers.get("date"),
|
|
2396
|
+
{
|
|
2397
|
+
kind: "no-runs",
|
|
2398
|
+
upstreamStatus: upstream.status
|
|
2399
|
+
}
|
|
2400
|
+
);
|
|
2401
|
+
}
|
|
2402
|
+
const signal = {
|
|
2403
|
+
type: "pipeline-status",
|
|
2404
|
+
status: normalizeStatus3(pipeline.status),
|
|
2405
|
+
rawStatus: pipeline.status,
|
|
2406
|
+
name: pipeline.name ?? `Pipeline #${pipeline.id}`,
|
|
2407
|
+
...pipeline.ref ?? source.branch ? { branch: pipeline.ref ?? source.branch } : {},
|
|
2408
|
+
...timestamp3(pipeline.created_at) ? { runStartedAt: timestamp3(pipeline.created_at) } : {},
|
|
2409
|
+
...timestamp3(pipeline.updated_at) ? { sourceUpdatedAt: timestamp3(pipeline.updated_at) } : {},
|
|
2410
|
+
sourceRunId: String(pipeline.id)
|
|
2411
|
+
};
|
|
2412
|
+
const envelope = {
|
|
2413
|
+
panelId: panel.id,
|
|
2414
|
+
state: "ok",
|
|
2415
|
+
observedAt: observedAt(upstream.headers.get("date")),
|
|
2416
|
+
link: publicLink(pipeline.web_url),
|
|
2417
|
+
signal
|
|
2418
|
+
};
|
|
2419
|
+
return { envelope, response: upstream };
|
|
2420
|
+
} catch (error) {
|
|
2421
|
+
return failure(
|
|
2422
|
+
panel.id,
|
|
2423
|
+
"upstream-error",
|
|
2424
|
+
error,
|
|
2425
|
+
sourceLink3(source),
|
|
2426
|
+
upstream.headers.get("date"),
|
|
2427
|
+
{ kind: "upstream-error", upstreamStatus: upstream.status }
|
|
2428
|
+
);
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
773
2431
|
function pipelinesCall(source) {
|
|
774
2432
|
const url = new URL(source.url);
|
|
775
2433
|
url.pathname = `${url.pathname.replace(/\/$/, "")}/api/v4/projects/${encodeURIComponent(source.project)}/pipelines`;
|
|
@@ -777,69 +2435,169 @@ function pipelinesCall(source) {
|
|
|
777
2435
|
if (source.branch) url.searchParams.set("ref", source.branch);
|
|
778
2436
|
return { url: url.toString(), headers: new Headers({ accept: "application/json" }) };
|
|
779
2437
|
}
|
|
2438
|
+
function sourceLink3(source) {
|
|
2439
|
+
const url = new URL(source.url);
|
|
2440
|
+
url.pathname = `${url.pathname.replace(/\/$/, "")}/${source.project.split("/").map(encodeURIComponent).join("/")}/-/pipelines`;
|
|
2441
|
+
return url.toString();
|
|
2442
|
+
}
|
|
2443
|
+
function normalizeStatus3(status) {
|
|
2444
|
+
if (["created", "waiting_for_resource", "preparing", "pending", "running"].includes(status))
|
|
2445
|
+
return "running";
|
|
2446
|
+
if (status === "success") return "passed";
|
|
2447
|
+
if (status === "failed") return "failed";
|
|
2448
|
+
if (status === "canceled") return "cancelled";
|
|
2449
|
+
if (["manual", "skipped", "scheduled"].includes(status)) return "warning";
|
|
2450
|
+
return "unknown";
|
|
2451
|
+
}
|
|
2452
|
+
function timestamp3(value2) {
|
|
2453
|
+
if (!value2 || !z9.iso.datetime().safeParse(value2).success) return void 0;
|
|
2454
|
+
return Number.isFinite(new Date(value2).valueOf()) ? value2 : void 0;
|
|
2455
|
+
}
|
|
2456
|
+
function failure(panelId, kind, error, link, date, failure2) {
|
|
2457
|
+
return {
|
|
2458
|
+
response: upstreamErrorResponse(
|
|
2459
|
+
upstreamErrorEnvelope({ panelId, kind, error, link, upstreamDate: date })
|
|
2460
|
+
),
|
|
2461
|
+
...failure2 ? { failure: failure2 } : { failure: { kind } }
|
|
2462
|
+
};
|
|
2463
|
+
}
|
|
780
2464
|
|
|
781
2465
|
// packages/server/src/adapters/http-value.ts
|
|
782
|
-
import { z as
|
|
2466
|
+
import { z as z10 } from "zod";
|
|
783
2467
|
function permittedHttpValueCalls(panel) {
|
|
784
2468
|
const grouped = httpValueGroupedPanelSchema.safeParse(panel);
|
|
785
|
-
const urls = grouped.success ? grouped.data.facts.map((fact) => fact.url) : [
|
|
2469
|
+
const urls = grouped.success ? grouped.data.facts.map((fact) => fact.url) : [z10.object({ panel: httpValueScalarPanelSchema }).parse({ panel }).panel.url];
|
|
786
2470
|
return urls.map(permittedCall);
|
|
787
2471
|
}
|
|
2472
|
+
async function fetchHttpValue(args2) {
|
|
2473
|
+
const panel = httpValueScalarPanelSchema.parse(args2.panel);
|
|
2474
|
+
const [call] = permittedHttpValueCalls(args2.panel);
|
|
2475
|
+
if (!call) throw new Error("http-value adapter declared no permitted call");
|
|
2476
|
+
forwardValidators(args2.requestHeaders, call.headers);
|
|
2477
|
+
let upstream;
|
|
2478
|
+
try {
|
|
2479
|
+
upstream = await args2.fetcher(call.url, { headers: call.headers });
|
|
2480
|
+
} catch (error) {
|
|
2481
|
+
return {
|
|
2482
|
+
response: errorResponse2("unreachable", error, panel),
|
|
2483
|
+
failure: {
|
|
2484
|
+
kind: "unreachable",
|
|
2485
|
+
...safeNetworkCode(error) ? { networkCode: safeNetworkCode(error) } : {}
|
|
2486
|
+
}
|
|
2487
|
+
};
|
|
2488
|
+
}
|
|
2489
|
+
if (upstream.status === 304) return { response: upstream };
|
|
2490
|
+
if (!upstream.ok) {
|
|
2491
|
+
return {
|
|
2492
|
+
response: errorResponse2(
|
|
2493
|
+
upstreamErrorKind(upstream.status),
|
|
2494
|
+
`${upstream.status} ${upstream.statusText}`,
|
|
2495
|
+
panel,
|
|
2496
|
+
upstream
|
|
2497
|
+
),
|
|
2498
|
+
failure: { kind: upstreamErrorKind(upstream.status), upstreamStatus: upstream.status }
|
|
2499
|
+
};
|
|
2500
|
+
}
|
|
2501
|
+
try {
|
|
2502
|
+
const text = await upstream.text();
|
|
2503
|
+
const value2 = panel.json_path ? extractJsonPath(JSON.parse(text), panel.json_path) : parseValue(text);
|
|
2504
|
+
const signal = { type: "http-value", value: value2 };
|
|
2505
|
+
return {
|
|
2506
|
+
envelope: {
|
|
2507
|
+
panelId: panel.id,
|
|
2508
|
+
state: "ok",
|
|
2509
|
+
observedAt: observedAt(upstream.headers.get("date")),
|
|
2510
|
+
link: publicLink(panel.link ?? panel.url),
|
|
2511
|
+
signal
|
|
2512
|
+
},
|
|
2513
|
+
response: upstream
|
|
2514
|
+
};
|
|
2515
|
+
} catch (error) {
|
|
2516
|
+
return {
|
|
2517
|
+
response: errorResponse2("upstream-error", error, panel, upstream),
|
|
2518
|
+
failure: { kind: "upstream-error", upstreamStatus: upstream.status }
|
|
2519
|
+
};
|
|
2520
|
+
}
|
|
2521
|
+
}
|
|
788
2522
|
function permittedCall(value2) {
|
|
789
2523
|
const url = new URL(value2);
|
|
790
2524
|
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
791
2525
|
throw new Error("http-value URLs must use http or https");
|
|
792
2526
|
return { url: url.toString(), headers: new Headers({ accept: "application/json, text/plain" }) };
|
|
793
2527
|
}
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
2528
|
+
function parseValue(text) {
|
|
2529
|
+
const trimmed = text.trim();
|
|
2530
|
+
try {
|
|
2531
|
+
const parsed = JSON.parse(trimmed);
|
|
2532
|
+
if (typeof parsed === "string" || typeof parsed === "number" || typeof parsed === "boolean")
|
|
2533
|
+
return parsed;
|
|
2534
|
+
} catch {
|
|
800
2535
|
}
|
|
801
|
-
|
|
802
|
-
};
|
|
803
|
-
function configurationLocation(path) {
|
|
804
|
-
return path.reduce(
|
|
805
|
-
(location, part) => typeof part === "number" ? `${location}[${part}]` : `${location}${location ? "." : ""}${String(part)}`,
|
|
806
|
-
""
|
|
807
|
-
) || "configuration";
|
|
2536
|
+
return trimmed;
|
|
808
2537
|
}
|
|
809
|
-
function
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
2538
|
+
function extractJsonPath(value2, path) {
|
|
2539
|
+
let current = value2;
|
|
2540
|
+
const segments = path === "$" ? [] : path.slice(1).split(/\.|\[|\]/).filter(Boolean);
|
|
2541
|
+
for (const segment of segments) {
|
|
2542
|
+
if (typeof current !== "object" || current === null || !(segment in current))
|
|
2543
|
+
throw new Error(`JSON path ${path} was not found`);
|
|
2544
|
+
current = current[segment];
|
|
815
2545
|
}
|
|
816
|
-
|
|
2546
|
+
if (typeof current !== "string" && typeof current !== "number" && typeof current !== "boolean") {
|
|
2547
|
+
throw new Error(`JSON path ${path} did not select a scalar value`);
|
|
2548
|
+
}
|
|
2549
|
+
return current;
|
|
817
2550
|
}
|
|
818
|
-
function
|
|
819
|
-
return
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
2551
|
+
function errorResponse2(kind, error, panel, response) {
|
|
2552
|
+
return upstreamErrorResponse(
|
|
2553
|
+
upstreamErrorEnvelope({
|
|
2554
|
+
panelId: panel.id,
|
|
2555
|
+
kind,
|
|
2556
|
+
error,
|
|
2557
|
+
link: panel.link ?? panel.url,
|
|
2558
|
+
upstreamDate: response?.headers.get("date")
|
|
2559
|
+
})
|
|
2560
|
+
);
|
|
824
2561
|
}
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
2562
|
+
|
|
2563
|
+
// packages/server/src/panel-adapters.ts
|
|
2564
|
+
function readPanelAdapter(panel, source) {
|
|
2565
|
+
if (panel.type === "pipeline-status" && source?.type === "github-actions") {
|
|
2566
|
+
permittedGithubActionsCalls(panel, source);
|
|
2567
|
+
return {
|
|
2568
|
+
destination: () => "https://api.github.com",
|
|
2569
|
+
fetch: ({ source: _configuredSource, ...args2 }) => fetchGithubActionsPipeline({ ...args2, source })
|
|
2570
|
+
};
|
|
2571
|
+
}
|
|
2572
|
+
if (panel.type === "test-count" && source?.type === "github-actions") {
|
|
2573
|
+
testCountCapabilities(panel, source);
|
|
2574
|
+
return {
|
|
2575
|
+
destination: () => "https://api.github.com",
|
|
2576
|
+
fetch: ({ source: _configuredSource, ...args2 }) => fetchGithubActionsTestCount({ ...args2, source })
|
|
2577
|
+
};
|
|
2578
|
+
}
|
|
2579
|
+
if (panel.type === "pipeline-status" && source?.type === "azure-devops") {
|
|
2580
|
+
permittedAzureDevOpsCalls(panel, source);
|
|
2581
|
+
return {
|
|
2582
|
+
destination: () => "https://dev.azure.com",
|
|
2583
|
+
fetch: ({ source: _configuredSource, ...args2 }) => fetchAzureDevOpsPipeline({ ...args2, source })
|
|
2584
|
+
};
|
|
2585
|
+
}
|
|
2586
|
+
if (panel.type === "pipeline-status" && source?.type === "gitlab-ci") {
|
|
2587
|
+
permittedGitlabCiCalls(panel, source);
|
|
2588
|
+
return {
|
|
2589
|
+
destination: (_panel, resolvedSource) => resolvedSource && "url" in resolvedSource && typeof resolvedSource.url === "string" ? resolvedSource.url : "https://gitlab.com",
|
|
2590
|
+
fetch: ({ source: _configuredSource, ...args2 }) => fetchGitlabCiPipeline({ ...args2, source })
|
|
2591
|
+
};
|
|
2592
|
+
}
|
|
2593
|
+
if (panel.type === "http-value") {
|
|
2594
|
+
permittedHttpValueCalls(panel);
|
|
2595
|
+
return {
|
|
2596
|
+
destination: (configuredPanel) => configuredPanel.url ?? "",
|
|
2597
|
+
...panel.facts ? {} : { fetch: (args2) => fetchHttpValue(args2) }
|
|
2598
|
+
};
|
|
842
2599
|
}
|
|
2600
|
+
return void 0;
|
|
843
2601
|
}
|
|
844
2602
|
|
|
845
2603
|
// packages/server/src/allowlist.ts
|
|
@@ -892,22 +2650,7 @@ function derive(config, rejectUnsupported) {
|
|
|
892
2650
|
return allowed;
|
|
893
2651
|
}
|
|
894
2652
|
function panelCapability(panel, source) {
|
|
895
|
-
if (panel
|
|
896
|
-
permittedGithubActionsCalls(panel, source);
|
|
897
|
-
return { kind: "server", operations: ["read"] };
|
|
898
|
-
}
|
|
899
|
-
if (panel.type === "pipeline-status" && source?.type === "azure-devops") {
|
|
900
|
-
permittedAzureDevOpsCalls(panel, source);
|
|
901
|
-
return { kind: "server", operations: ["read"] };
|
|
902
|
-
}
|
|
903
|
-
if (panel.type === "pipeline-status" && source?.type === "gitlab-ci") {
|
|
904
|
-
permittedGitlabCiCalls(panel, source);
|
|
905
|
-
return { kind: "server", operations: ["read"] };
|
|
906
|
-
}
|
|
907
|
-
if (panel.type === "http-value") {
|
|
908
|
-
permittedHttpValueCalls(panel);
|
|
909
|
-
return { kind: "server", operations: ["read"] };
|
|
910
|
-
}
|
|
2653
|
+
if (readPanelAdapter(panel, source)) return { kind: "server", operations: ["read"] };
|
|
911
2654
|
if (panel.type === "pull-request-health" && source?.type === "github-actions") {
|
|
912
2655
|
pullRequestHealthCapabilities(panel);
|
|
913
2656
|
return {
|
|
@@ -1461,17 +3204,17 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
|
1461
3204
|
// node_modules/fflate/esm/index.mjs
|
|
1462
3205
|
import { createRequire } from "module";
|
|
1463
3206
|
var require2 = createRequire("/");
|
|
1464
|
-
var
|
|
1465
|
-
var
|
|
3207
|
+
var _a2;
|
|
3208
|
+
var Worker2;
|
|
1466
3209
|
var isMarkedAsUntransferable;
|
|
1467
3210
|
try {
|
|
1468
|
-
|
|
3211
|
+
_a2 = require2("worker_threads"), Worker2 = _a2.Worker, isMarkedAsUntransferable = _a2.isMarkedAsUntransferable;
|
|
1469
3212
|
} catch (e) {
|
|
1470
3213
|
}
|
|
1471
|
-
var
|
|
1472
|
-
var
|
|
1473
|
-
var
|
|
1474
|
-
var
|
|
3214
|
+
var u82 = Uint8Array;
|
|
3215
|
+
var u162 = Uint16Array;
|
|
3216
|
+
var i322 = Int32Array;
|
|
3217
|
+
var fleb2 = new u82([
|
|
1475
3218
|
0,
|
|
1476
3219
|
0,
|
|
1477
3220
|
0,
|
|
@@ -1507,7 +3250,7 @@ var fleb = new u8([
|
|
|
1507
3250
|
/* impossible */
|
|
1508
3251
|
0
|
|
1509
3252
|
]);
|
|
1510
|
-
var
|
|
3253
|
+
var fdeb2 = new u82([
|
|
1511
3254
|
0,
|
|
1512
3255
|
0,
|
|
1513
3256
|
0,
|
|
@@ -1542,102 +3285,102 @@ var fdeb = new u8([
|
|
|
1542
3285
|
0,
|
|
1543
3286
|
0
|
|
1544
3287
|
]);
|
|
1545
|
-
var
|
|
1546
|
-
var
|
|
1547
|
-
var b = new
|
|
1548
|
-
for (var
|
|
1549
|
-
b[
|
|
3288
|
+
var clim2 = new u82([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
3289
|
+
var freb2 = function(eb, start) {
|
|
3290
|
+
var b = new u162(31);
|
|
3291
|
+
for (var i3 = 0; i3 < 31; ++i3) {
|
|
3292
|
+
b[i3] = start += 1 << eb[i3 - 1];
|
|
1550
3293
|
}
|
|
1551
|
-
var r = new
|
|
1552
|
-
for (var
|
|
1553
|
-
for (var j = b[
|
|
1554
|
-
r[j] = j - b[
|
|
3294
|
+
var r = new i322(b[30]);
|
|
3295
|
+
for (var i3 = 1; i3 < 30; ++i3) {
|
|
3296
|
+
for (var j = b[i3]; j < b[i3 + 1]; ++j) {
|
|
3297
|
+
r[j] = j - b[i3] << 5 | i3;
|
|
1555
3298
|
}
|
|
1556
3299
|
}
|
|
1557
3300
|
return { b, r };
|
|
1558
3301
|
};
|
|
1559
|
-
var
|
|
1560
|
-
var
|
|
1561
|
-
var
|
|
1562
|
-
|
|
1563
|
-
var
|
|
1564
|
-
var
|
|
1565
|
-
var
|
|
1566
|
-
var
|
|
1567
|
-
for (
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
3302
|
+
var _a2 = freb2(fleb2, 2);
|
|
3303
|
+
var fl2 = _a2.b;
|
|
3304
|
+
var revfl2 = _a2.r;
|
|
3305
|
+
fl2[28] = 258, revfl2[258] = 28;
|
|
3306
|
+
var _b2 = freb2(fdeb2, 0);
|
|
3307
|
+
var fd2 = _b2.b;
|
|
3308
|
+
var revfd2 = _b2.r;
|
|
3309
|
+
var rev2 = new u162(32768);
|
|
3310
|
+
for (i2 = 0; i2 < 32768; ++i2) {
|
|
3311
|
+
x2 = (i2 & 43690) >> 1 | (i2 & 21845) << 1;
|
|
3312
|
+
x2 = (x2 & 52428) >> 2 | (x2 & 13107) << 2;
|
|
3313
|
+
x2 = (x2 & 61680) >> 4 | (x2 & 3855) << 4;
|
|
3314
|
+
rev2[i2] = ((x2 & 65280) >> 8 | (x2 & 255) << 8) >> 1;
|
|
1572
3315
|
}
|
|
1573
|
-
var
|
|
1574
|
-
var
|
|
1575
|
-
var
|
|
3316
|
+
var x2;
|
|
3317
|
+
var i2;
|
|
3318
|
+
var hMap2 = (function(cd, mb, r) {
|
|
1576
3319
|
var s = cd.length;
|
|
1577
|
-
var
|
|
1578
|
-
var l = new
|
|
1579
|
-
for (;
|
|
1580
|
-
if (cd[
|
|
1581
|
-
++l[cd[
|
|
3320
|
+
var i3 = 0;
|
|
3321
|
+
var l = new u162(mb);
|
|
3322
|
+
for (; i3 < s; ++i3) {
|
|
3323
|
+
if (cd[i3])
|
|
3324
|
+
++l[cd[i3] - 1];
|
|
1582
3325
|
}
|
|
1583
|
-
var le = new
|
|
1584
|
-
for (
|
|
1585
|
-
le[
|
|
3326
|
+
var le = new u162(mb);
|
|
3327
|
+
for (i3 = 1; i3 < mb; ++i3) {
|
|
3328
|
+
le[i3] = le[i3 - 1] + l[i3 - 1] << 1;
|
|
1586
3329
|
}
|
|
1587
3330
|
var co;
|
|
1588
3331
|
if (r) {
|
|
1589
|
-
co = new
|
|
3332
|
+
co = new u162(1 << mb);
|
|
1590
3333
|
var rvb = 15 - mb;
|
|
1591
|
-
for (
|
|
1592
|
-
if (cd[
|
|
1593
|
-
var sv =
|
|
1594
|
-
var r_1 = mb - cd[
|
|
1595
|
-
var v = le[cd[
|
|
3334
|
+
for (i3 = 0; i3 < s; ++i3) {
|
|
3335
|
+
if (cd[i3]) {
|
|
3336
|
+
var sv = i3 << 4 | cd[i3];
|
|
3337
|
+
var r_1 = mb - cd[i3];
|
|
3338
|
+
var v = le[cd[i3] - 1]++ << r_1;
|
|
1596
3339
|
for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
|
|
1597
|
-
co[
|
|
3340
|
+
co[rev2[v] >> rvb] = sv;
|
|
1598
3341
|
}
|
|
1599
3342
|
}
|
|
1600
3343
|
}
|
|
1601
3344
|
} else {
|
|
1602
|
-
co = new
|
|
1603
|
-
for (
|
|
1604
|
-
if (cd[
|
|
1605
|
-
co[
|
|
3345
|
+
co = new u162(s);
|
|
3346
|
+
for (i3 = 0; i3 < s; ++i3) {
|
|
3347
|
+
if (cd[i3]) {
|
|
3348
|
+
co[i3] = rev2[le[cd[i3] - 1]++] >> 15 - cd[i3];
|
|
1606
3349
|
}
|
|
1607
3350
|
}
|
|
1608
3351
|
}
|
|
1609
3352
|
return co;
|
|
1610
3353
|
});
|
|
1611
|
-
var
|
|
1612
|
-
for (
|
|
1613
|
-
|
|
1614
|
-
var
|
|
1615
|
-
for (
|
|
1616
|
-
|
|
1617
|
-
var
|
|
1618
|
-
for (
|
|
1619
|
-
|
|
1620
|
-
var
|
|
1621
|
-
for (
|
|
1622
|
-
|
|
1623
|
-
var
|
|
1624
|
-
var
|
|
1625
|
-
for (
|
|
1626
|
-
|
|
1627
|
-
var
|
|
1628
|
-
var flm = /* @__PURE__ */
|
|
1629
|
-
var fdm = /* @__PURE__ */
|
|
1630
|
-
var
|
|
3354
|
+
var flt2 = new u82(288);
|
|
3355
|
+
for (i2 = 0; i2 < 144; ++i2)
|
|
3356
|
+
flt2[i2] = 8;
|
|
3357
|
+
var i2;
|
|
3358
|
+
for (i2 = 144; i2 < 256; ++i2)
|
|
3359
|
+
flt2[i2] = 9;
|
|
3360
|
+
var i2;
|
|
3361
|
+
for (i2 = 256; i2 < 280; ++i2)
|
|
3362
|
+
flt2[i2] = 7;
|
|
3363
|
+
var i2;
|
|
3364
|
+
for (i2 = 280; i2 < 288; ++i2)
|
|
3365
|
+
flt2[i2] = 8;
|
|
3366
|
+
var i2;
|
|
3367
|
+
var fdt2 = new u82(32);
|
|
3368
|
+
for (i2 = 0; i2 < 32; ++i2)
|
|
3369
|
+
fdt2[i2] = 5;
|
|
3370
|
+
var i2;
|
|
3371
|
+
var flm = /* @__PURE__ */ hMap2(flt2, 9, 0);
|
|
3372
|
+
var fdm = /* @__PURE__ */ hMap2(fdt2, 5, 0);
|
|
3373
|
+
var shft2 = function(p) {
|
|
1631
3374
|
return (p + 7) / 8 | 0;
|
|
1632
3375
|
};
|
|
1633
|
-
var
|
|
3376
|
+
var slc2 = function(v, s, e) {
|
|
1634
3377
|
if (s == null || s < 0)
|
|
1635
3378
|
s = 0;
|
|
1636
3379
|
if (e == null || e > v.length)
|
|
1637
3380
|
e = v.length;
|
|
1638
|
-
return new
|
|
3381
|
+
return new u82(v.subarray(s, e));
|
|
1639
3382
|
};
|
|
1640
|
-
var
|
|
3383
|
+
var ec2 = [
|
|
1641
3384
|
"unexpected EOF",
|
|
1642
3385
|
"invalid block type",
|
|
1643
3386
|
"invalid length/literal",
|
|
@@ -1655,11 +3398,11 @@ var ec = [
|
|
|
1655
3398
|
"invalid zip data"
|
|
1656
3399
|
// determined by unknown compression method
|
|
1657
3400
|
];
|
|
1658
|
-
var
|
|
1659
|
-
var e = new Error(msg ||
|
|
3401
|
+
var err2 = function(ind, msg, nt) {
|
|
3402
|
+
var e = new Error(msg || ec2[ind]);
|
|
1660
3403
|
e.code = ind;
|
|
1661
3404
|
if (Error.captureStackTrace)
|
|
1662
|
-
Error.captureStackTrace(e,
|
|
3405
|
+
Error.captureStackTrace(e, err2);
|
|
1663
3406
|
if (!nt)
|
|
1664
3407
|
throw e;
|
|
1665
3408
|
return e;
|
|
@@ -1679,16 +3422,16 @@ var wbits16 = function(d, p, v) {
|
|
|
1679
3422
|
};
|
|
1680
3423
|
var hTree = function(d, mb) {
|
|
1681
3424
|
var t = [];
|
|
1682
|
-
for (var
|
|
1683
|
-
if (d[
|
|
1684
|
-
t.push({ s:
|
|
3425
|
+
for (var i3 = 0; i3 < d.length; ++i3) {
|
|
3426
|
+
if (d[i3])
|
|
3427
|
+
t.push({ s: i3, f: d[i3] });
|
|
1685
3428
|
}
|
|
1686
3429
|
var s = t.length;
|
|
1687
3430
|
var t2 = t.slice();
|
|
1688
3431
|
if (!s)
|
|
1689
|
-
return { t:
|
|
3432
|
+
return { t: et2, l: 0 };
|
|
1690
3433
|
if (s == 1) {
|
|
1691
|
-
var v = new
|
|
3434
|
+
var v = new u82(t[0].s + 1);
|
|
1692
3435
|
v[t[0].s] = 1;
|
|
1693
3436
|
return { t: v, l: 1 };
|
|
1694
3437
|
}
|
|
@@ -1704,20 +3447,20 @@ var hTree = function(d, mb) {
|
|
|
1704
3447
|
t[i1++] = { s: -1, f: l.f + r.f, l, r };
|
|
1705
3448
|
}
|
|
1706
3449
|
var maxSym = t2[0].s;
|
|
1707
|
-
for (var
|
|
1708
|
-
if (t2[
|
|
1709
|
-
maxSym = t2[
|
|
3450
|
+
for (var i3 = 1; i3 < s; ++i3) {
|
|
3451
|
+
if (t2[i3].s > maxSym)
|
|
3452
|
+
maxSym = t2[i3].s;
|
|
1710
3453
|
}
|
|
1711
|
-
var tr = new
|
|
3454
|
+
var tr = new u162(maxSym + 1);
|
|
1712
3455
|
var mbt = ln(t[i1 - 1], tr, 0);
|
|
1713
3456
|
if (mbt > mb) {
|
|
1714
|
-
var
|
|
3457
|
+
var i3 = 0, dt = 0;
|
|
1715
3458
|
var lft = mbt - mb, cst = 1 << lft;
|
|
1716
3459
|
t2.sort(function(a, b) {
|
|
1717
3460
|
return tr[b.s] - tr[a.s] || a.f - b.f;
|
|
1718
3461
|
});
|
|
1719
|
-
for (;
|
|
1720
|
-
var i2_1 = t2[
|
|
3462
|
+
for (; i3 < s; ++i3) {
|
|
3463
|
+
var i2_1 = t2[i3].s;
|
|
1721
3464
|
if (tr[i2_1] > mb) {
|
|
1722
3465
|
dt += cst - (1 << mbt - tr[i2_1]);
|
|
1723
3466
|
tr[i2_1] = mb;
|
|
@@ -1726,14 +3469,14 @@ var hTree = function(d, mb) {
|
|
|
1726
3469
|
}
|
|
1727
3470
|
dt >>= lft;
|
|
1728
3471
|
while (dt > 0) {
|
|
1729
|
-
var i2_2 = t2[
|
|
3472
|
+
var i2_2 = t2[i3].s;
|
|
1730
3473
|
if (tr[i2_2] < mb)
|
|
1731
3474
|
dt -= 1 << mb - tr[i2_2]++ - 1;
|
|
1732
3475
|
else
|
|
1733
|
-
++
|
|
3476
|
+
++i3;
|
|
1734
3477
|
}
|
|
1735
|
-
for (;
|
|
1736
|
-
var i2_3 = t2[
|
|
3478
|
+
for (; i3 >= 0 && dt; --i3) {
|
|
3479
|
+
var i2_3 = t2[i3].s;
|
|
1737
3480
|
if (tr[i2_3] == mb) {
|
|
1738
3481
|
--tr[i2_3];
|
|
1739
3482
|
++dt;
|
|
@@ -1741,7 +3484,7 @@ var hTree = function(d, mb) {
|
|
|
1741
3484
|
}
|
|
1742
3485
|
mbt = mb;
|
|
1743
3486
|
}
|
|
1744
|
-
return { t: new
|
|
3487
|
+
return { t: new u82(tr), l: mbt };
|
|
1745
3488
|
};
|
|
1746
3489
|
var ln = function(n, l, d) {
|
|
1747
3490
|
return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
|
|
@@ -1750,13 +3493,13 @@ var lc = function(c) {
|
|
|
1750
3493
|
var s = c.length;
|
|
1751
3494
|
while (s && !c[--s])
|
|
1752
3495
|
;
|
|
1753
|
-
var cl = new
|
|
3496
|
+
var cl = new u162(++s);
|
|
1754
3497
|
var cli = 0, cln = c[0], cls = 1;
|
|
1755
3498
|
var w = function(v) {
|
|
1756
3499
|
cl[cli++] = v;
|
|
1757
3500
|
};
|
|
1758
|
-
for (var
|
|
1759
|
-
if (c[
|
|
3501
|
+
for (var i3 = 1; i3 <= s; ++i3) {
|
|
3502
|
+
if (c[i3] == cln && i3 != s)
|
|
1760
3503
|
++cls;
|
|
1761
3504
|
else {
|
|
1762
3505
|
if (!cln && cls > 2) {
|
|
@@ -1776,85 +3519,85 @@ var lc = function(c) {
|
|
|
1776
3519
|
while (cls--)
|
|
1777
3520
|
w(cln);
|
|
1778
3521
|
cls = 1;
|
|
1779
|
-
cln = c[
|
|
3522
|
+
cln = c[i3];
|
|
1780
3523
|
}
|
|
1781
3524
|
}
|
|
1782
3525
|
return { c: cl.subarray(0, cli), n: s };
|
|
1783
3526
|
};
|
|
1784
3527
|
var clen = function(cf, cl) {
|
|
1785
3528
|
var l = 0;
|
|
1786
|
-
for (var
|
|
1787
|
-
l += cf[
|
|
3529
|
+
for (var i3 = 0; i3 < cl.length; ++i3)
|
|
3530
|
+
l += cf[i3] * cl[i3];
|
|
1788
3531
|
return l;
|
|
1789
3532
|
};
|
|
1790
3533
|
var wfblk = function(out, pos, dat) {
|
|
1791
3534
|
var s = dat.length;
|
|
1792
|
-
var o =
|
|
3535
|
+
var o = shft2(pos + 2);
|
|
1793
3536
|
out[o] = s & 255;
|
|
1794
3537
|
out[o + 1] = s >> 8;
|
|
1795
3538
|
out[o + 2] = out[o] ^ 255;
|
|
1796
3539
|
out[o + 3] = out[o + 1] ^ 255;
|
|
1797
|
-
for (var
|
|
1798
|
-
out[o +
|
|
3540
|
+
for (var i3 = 0; i3 < s; ++i3)
|
|
3541
|
+
out[o + i3 + 4] = dat[i3];
|
|
1799
3542
|
return (o + 4 + s) * 8;
|
|
1800
3543
|
};
|
|
1801
3544
|
var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
|
|
1802
3545
|
wbits(out, p++, final);
|
|
1803
3546
|
++lf[256];
|
|
1804
|
-
var
|
|
1805
|
-
var
|
|
3547
|
+
var _a3 = hTree(lf, 15), dlt = _a3.t, mlb = _a3.l;
|
|
3548
|
+
var _b3 = hTree(df, 15), ddt = _b3.t, mdb = _b3.l;
|
|
1806
3549
|
var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
|
|
1807
3550
|
var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
|
|
1808
|
-
var lcfreq = new
|
|
1809
|
-
for (var
|
|
1810
|
-
++lcfreq[lclt[
|
|
1811
|
-
for (var
|
|
1812
|
-
++lcfreq[lcdt[
|
|
3551
|
+
var lcfreq = new u162(19);
|
|
3552
|
+
for (var i3 = 0; i3 < lclt.length; ++i3)
|
|
3553
|
+
++lcfreq[lclt[i3] & 31];
|
|
3554
|
+
for (var i3 = 0; i3 < lcdt.length; ++i3)
|
|
3555
|
+
++lcfreq[lcdt[i3] & 31];
|
|
1813
3556
|
var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
|
|
1814
3557
|
var nlcc = 19;
|
|
1815
|
-
for (; nlcc > 4 && !lct[
|
|
3558
|
+
for (; nlcc > 4 && !lct[clim2[nlcc - 1]]; --nlcc)
|
|
1816
3559
|
;
|
|
1817
3560
|
var flen = bl + 5 << 3;
|
|
1818
|
-
var ftlen = clen(lf,
|
|
3561
|
+
var ftlen = clen(lf, flt2) + clen(df, fdt2) + eb;
|
|
1819
3562
|
var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
|
|
1820
3563
|
if (bs >= 0 && flen <= ftlen && flen <= dtlen)
|
|
1821
3564
|
return wfblk(out, p, dat.subarray(bs, bs + bl));
|
|
1822
3565
|
var lm, ll, dm, dl;
|
|
1823
3566
|
wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
|
|
1824
3567
|
if (dtlen < ftlen) {
|
|
1825
|
-
lm =
|
|
1826
|
-
var llm =
|
|
3568
|
+
lm = hMap2(dlt, mlb, 0), ll = dlt, dm = hMap2(ddt, mdb, 0), dl = ddt;
|
|
3569
|
+
var llm = hMap2(lct, mlcb, 0);
|
|
1827
3570
|
wbits(out, p, nlc - 257);
|
|
1828
3571
|
wbits(out, p + 5, ndc - 1);
|
|
1829
3572
|
wbits(out, p + 10, nlcc - 4);
|
|
1830
3573
|
p += 14;
|
|
1831
|
-
for (var
|
|
1832
|
-
wbits(out, p + 3 *
|
|
3574
|
+
for (var i3 = 0; i3 < nlcc; ++i3)
|
|
3575
|
+
wbits(out, p + 3 * i3, lct[clim2[i3]]);
|
|
1833
3576
|
p += 3 * nlcc;
|
|
1834
3577
|
var lcts = [lclt, lcdt];
|
|
1835
3578
|
for (var it = 0; it < 2; ++it) {
|
|
1836
3579
|
var clct = lcts[it];
|
|
1837
|
-
for (var
|
|
1838
|
-
var len = clct[
|
|
3580
|
+
for (var i3 = 0; i3 < clct.length; ++i3) {
|
|
3581
|
+
var len = clct[i3] & 31;
|
|
1839
3582
|
wbits(out, p, llm[len]), p += lct[len];
|
|
1840
3583
|
if (len > 15)
|
|
1841
|
-
wbits(out, p, clct[
|
|
3584
|
+
wbits(out, p, clct[i3] >> 5 & 127), p += clct[i3] >> 12;
|
|
1842
3585
|
}
|
|
1843
3586
|
}
|
|
1844
3587
|
} else {
|
|
1845
|
-
lm = flm, ll =
|
|
3588
|
+
lm = flm, ll = flt2, dm = fdm, dl = fdt2;
|
|
1846
3589
|
}
|
|
1847
|
-
for (var
|
|
1848
|
-
var sym = syms[
|
|
3590
|
+
for (var i3 = 0; i3 < li; ++i3) {
|
|
3591
|
+
var sym = syms[i3];
|
|
1849
3592
|
if (sym > 255) {
|
|
1850
3593
|
var len = sym >> 18 & 31;
|
|
1851
3594
|
wbits16(out, p, lm[len + 257]), p += ll[len + 257];
|
|
1852
3595
|
if (len > 7)
|
|
1853
|
-
wbits(out, p, sym >> 23 & 31), p +=
|
|
3596
|
+
wbits(out, p, sym >> 23 & 31), p += fleb2[len];
|
|
1854
3597
|
var dst = sym & 31;
|
|
1855
3598
|
wbits16(out, p, dm[dst]), p += dl[dst];
|
|
1856
3599
|
if (dst > 3)
|
|
1857
|
-
wbits16(out, p, sym >> 5 & 8191), p +=
|
|
3600
|
+
wbits16(out, p, sym >> 5 & 8191), p += fdeb2[dst];
|
|
1858
3601
|
} else {
|
|
1859
3602
|
wbits16(out, p, lm[sym]), p += ll[sym];
|
|
1860
3603
|
}
|
|
@@ -1862,11 +3605,11 @@ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
|
|
|
1862
3605
|
wbits16(out, p, lm[256]);
|
|
1863
3606
|
return p + ll[256];
|
|
1864
3607
|
};
|
|
1865
|
-
var deo = /* @__PURE__ */ new
|
|
1866
|
-
var
|
|
3608
|
+
var deo = /* @__PURE__ */ new i322([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
|
|
3609
|
+
var et2 = /* @__PURE__ */ new u82(0);
|
|
1867
3610
|
var dflt = function(dat, lvl, plvl, pre, post, st) {
|
|
1868
3611
|
var s = st.z || dat.length;
|
|
1869
|
-
var o = new
|
|
3612
|
+
var o = new u82(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
|
|
1870
3613
|
var w = o.subarray(pre, o.length - post);
|
|
1871
3614
|
var lst = st.l;
|
|
1872
3615
|
var pos = (st.r || 0) & 7;
|
|
@@ -1876,38 +3619,38 @@ var dflt = function(dat, lvl, plvl, pre, post, st) {
|
|
|
1876
3619
|
var opt = deo[lvl - 1];
|
|
1877
3620
|
var n = opt >> 13, c = opt & 8191;
|
|
1878
3621
|
var msk_1 = (1 << plvl) - 1;
|
|
1879
|
-
var prev = st.p || new
|
|
3622
|
+
var prev = st.p || new u162(32768), head = st.h || new u162(msk_1 + 1);
|
|
1880
3623
|
var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
|
|
1881
|
-
var hsh = function(
|
|
1882
|
-
return (dat[
|
|
3624
|
+
var hsh = function(i4) {
|
|
3625
|
+
return (dat[i4] ^ dat[i4 + 1] << bs1_1 ^ dat[i4 + 2] << bs2_1) & msk_1;
|
|
1883
3626
|
};
|
|
1884
|
-
var syms = new
|
|
1885
|
-
var lf = new
|
|
1886
|
-
var lc_1 = 0, eb = 0,
|
|
1887
|
-
for (;
|
|
1888
|
-
var hv = hsh(
|
|
1889
|
-
var imod =
|
|
3627
|
+
var syms = new i322(25e3);
|
|
3628
|
+
var lf = new u162(288), df = new u162(32);
|
|
3629
|
+
var lc_1 = 0, eb = 0, i3 = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
|
|
3630
|
+
for (; i3 + 2 < s; ++i3) {
|
|
3631
|
+
var hv = hsh(i3);
|
|
3632
|
+
var imod = i3 & 32767, pimod = head[hv];
|
|
1890
3633
|
prev[imod] = pimod;
|
|
1891
3634
|
head[hv] = imod;
|
|
1892
|
-
if (wi <=
|
|
1893
|
-
var rem = s -
|
|
3635
|
+
if (wi <= i3) {
|
|
3636
|
+
var rem = s - i3;
|
|
1894
3637
|
if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
|
|
1895
|
-
pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs,
|
|
1896
|
-
li = lc_1 = eb = 0, bs =
|
|
3638
|
+
pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i3 - bs, pos);
|
|
3639
|
+
li = lc_1 = eb = 0, bs = i3;
|
|
1897
3640
|
for (var j = 0; j < 286; ++j)
|
|
1898
3641
|
lf[j] = 0;
|
|
1899
3642
|
for (var j = 0; j < 30; ++j)
|
|
1900
3643
|
df[j] = 0;
|
|
1901
3644
|
}
|
|
1902
3645
|
var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
|
|
1903
|
-
if (rem > 2 && hv == hsh(
|
|
3646
|
+
if (rem > 2 && hv == hsh(i3 - dif)) {
|
|
1904
3647
|
var maxn = Math.min(n, rem) - 1;
|
|
1905
|
-
var maxd = Math.min(32767,
|
|
3648
|
+
var maxd = Math.min(32767, i3);
|
|
1906
3649
|
var ml = Math.min(258, rem);
|
|
1907
3650
|
while (dif <= maxd && --ch_1 && imod != pimod) {
|
|
1908
|
-
if (dat[
|
|
3651
|
+
if (dat[i3 + l] == dat[i3 + l - dif]) {
|
|
1909
3652
|
var nl = 0;
|
|
1910
|
-
for (; nl < ml && dat[
|
|
3653
|
+
for (; nl < ml && dat[i3 + nl] == dat[i3 + nl - dif]; ++nl)
|
|
1911
3654
|
;
|
|
1912
3655
|
if (nl > l) {
|
|
1913
3656
|
l = nl, d = dif;
|
|
@@ -1916,7 +3659,7 @@ var dflt = function(dat, lvl, plvl, pre, post, st) {
|
|
|
1916
3659
|
var mmd = Math.min(dif, nl - 2);
|
|
1917
3660
|
var md = 0;
|
|
1918
3661
|
for (var j = 0; j < mmd; ++j) {
|
|
1919
|
-
var ti =
|
|
3662
|
+
var ti = i3 - dif + j & 32767;
|
|
1920
3663
|
var pti = prev[ti];
|
|
1921
3664
|
var cd = ti - pti & 32767;
|
|
1922
3665
|
if (cd > md)
|
|
@@ -1929,49 +3672,49 @@ var dflt = function(dat, lvl, plvl, pre, post, st) {
|
|
|
1929
3672
|
}
|
|
1930
3673
|
}
|
|
1931
3674
|
if (d) {
|
|
1932
|
-
syms[li++] = 268435456 |
|
|
1933
|
-
var lin =
|
|
1934
|
-
eb +=
|
|
3675
|
+
syms[li++] = 268435456 | revfl2[l] << 18 | revfd2[d];
|
|
3676
|
+
var lin = revfl2[l] & 31, din = revfd2[d] & 31;
|
|
3677
|
+
eb += fleb2[lin] + fdeb2[din];
|
|
1935
3678
|
++lf[257 + lin];
|
|
1936
3679
|
++df[din];
|
|
1937
|
-
wi =
|
|
3680
|
+
wi = i3 + l;
|
|
1938
3681
|
++lc_1;
|
|
1939
3682
|
} else {
|
|
1940
|
-
syms[li++] = dat[
|
|
1941
|
-
++lf[dat[
|
|
3683
|
+
syms[li++] = dat[i3];
|
|
3684
|
+
++lf[dat[i3]];
|
|
1942
3685
|
}
|
|
1943
3686
|
}
|
|
1944
3687
|
}
|
|
1945
|
-
for (
|
|
1946
|
-
syms[li++] = dat[
|
|
1947
|
-
++lf[dat[
|
|
3688
|
+
for (i3 = Math.max(i3, wi); i3 < s; ++i3) {
|
|
3689
|
+
syms[li++] = dat[i3];
|
|
3690
|
+
++lf[dat[i3]];
|
|
1948
3691
|
}
|
|
1949
|
-
pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs,
|
|
3692
|
+
pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i3 - bs, pos);
|
|
1950
3693
|
if (!lst) {
|
|
1951
3694
|
st.r = pos & 7 | w[pos / 8 | 0] << 3;
|
|
1952
3695
|
pos -= 7;
|
|
1953
|
-
st.h = head, st.p = prev, st.i =
|
|
3696
|
+
st.h = head, st.p = prev, st.i = i3, st.w = wi;
|
|
1954
3697
|
}
|
|
1955
3698
|
} else {
|
|
1956
|
-
for (var
|
|
1957
|
-
var e =
|
|
3699
|
+
for (var i3 = st.w || 0; i3 < s + lst; i3 += 65535) {
|
|
3700
|
+
var e = i3 + 65535;
|
|
1958
3701
|
if (e >= s) {
|
|
1959
3702
|
w[pos / 8 | 0] = lst;
|
|
1960
3703
|
e = s;
|
|
1961
3704
|
}
|
|
1962
|
-
pos = wfblk(w, pos + 1, dat.subarray(
|
|
3705
|
+
pos = wfblk(w, pos + 1, dat.subarray(i3, e));
|
|
1963
3706
|
}
|
|
1964
3707
|
st.i = s;
|
|
1965
3708
|
}
|
|
1966
|
-
return
|
|
3709
|
+
return slc2(o, 0, pre + shft2(pos) + post);
|
|
1967
3710
|
};
|
|
1968
3711
|
var crct = /* @__PURE__ */ (function() {
|
|
1969
3712
|
var t = new Int32Array(256);
|
|
1970
|
-
for (var
|
|
1971
|
-
var c =
|
|
3713
|
+
for (var i3 = 0; i3 < 256; ++i3) {
|
|
3714
|
+
var c = i3, k = 9;
|
|
1972
3715
|
while (--k)
|
|
1973
3716
|
c = (c & 1 && -306674912) ^ c >>> 1;
|
|
1974
|
-
t[
|
|
3717
|
+
t[i3] = c;
|
|
1975
3718
|
}
|
|
1976
3719
|
return t;
|
|
1977
3720
|
})();
|
|
@@ -1980,8 +3723,8 @@ var crc = function() {
|
|
|
1980
3723
|
return {
|
|
1981
3724
|
p: function(d) {
|
|
1982
3725
|
var cr = c;
|
|
1983
|
-
for (var
|
|
1984
|
-
cr = crct[cr & 255 ^ d[
|
|
3726
|
+
for (var i3 = 0; i3 < d.length; ++i3)
|
|
3727
|
+
cr = crct[cr & 255 ^ d[i3]] ^ cr >>> 8;
|
|
1985
3728
|
c = cr;
|
|
1986
3729
|
},
|
|
1987
3730
|
d: function() {
|
|
@@ -1994,7 +3737,7 @@ var dopt = function(dat, opt, pre, post, st) {
|
|
|
1994
3737
|
st = { l: 1 };
|
|
1995
3738
|
if (opt.dictionary) {
|
|
1996
3739
|
var dict = opt.dictionary.subarray(-32768);
|
|
1997
|
-
var newDat = new
|
|
3740
|
+
var newDat = new u82(dict.length + dat.length);
|
|
1998
3741
|
newDat.set(dict);
|
|
1999
3742
|
newDat.set(dat, dict.length);
|
|
2000
3743
|
dat = newDat;
|
|
@@ -2026,51 +3769,51 @@ var fltn = function(d, p, t, o) {
|
|
|
2026
3769
|
if (ArrayBuffer.isView(val))
|
|
2027
3770
|
t[n] = [val, op];
|
|
2028
3771
|
else {
|
|
2029
|
-
t[n += "/"] = [new
|
|
3772
|
+
t[n += "/"] = [new u82(0), op];
|
|
2030
3773
|
fltn(val, n, t, o);
|
|
2031
3774
|
}
|
|
2032
3775
|
}
|
|
2033
3776
|
};
|
|
2034
3777
|
var te = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder();
|
|
2035
|
-
var
|
|
2036
|
-
var
|
|
3778
|
+
var td2 = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
3779
|
+
var tds2 = 0;
|
|
2037
3780
|
try {
|
|
2038
|
-
|
|
2039
|
-
|
|
3781
|
+
td2.decode(et2, { stream: true });
|
|
3782
|
+
tds2 = 1;
|
|
2040
3783
|
} catch (e) {
|
|
2041
3784
|
}
|
|
2042
3785
|
function strToU8(str, latin1) {
|
|
2043
3786
|
if (latin1) {
|
|
2044
|
-
var ar_1 = new
|
|
2045
|
-
for (var
|
|
2046
|
-
ar_1[
|
|
3787
|
+
var ar_1 = new u82(str.length);
|
|
3788
|
+
for (var i3 = 0; i3 < str.length; ++i3)
|
|
3789
|
+
ar_1[i3] = str.charCodeAt(i3);
|
|
2047
3790
|
return ar_1;
|
|
2048
3791
|
}
|
|
2049
3792
|
if (te)
|
|
2050
3793
|
return te.encode(str);
|
|
2051
3794
|
var l = str.length;
|
|
2052
|
-
var ar = new
|
|
3795
|
+
var ar = new u82(str.length + (str.length >> 1));
|
|
2053
3796
|
var ai = 0;
|
|
2054
3797
|
var w = function(v) {
|
|
2055
3798
|
ar[ai++] = v;
|
|
2056
3799
|
};
|
|
2057
|
-
for (var
|
|
3800
|
+
for (var i3 = 0; i3 < l; ++i3) {
|
|
2058
3801
|
if (ai + 5 > ar.length) {
|
|
2059
|
-
var n = new
|
|
3802
|
+
var n = new u82(ai + 8 + (l - i3 << 1));
|
|
2060
3803
|
n.set(ar);
|
|
2061
3804
|
ar = n;
|
|
2062
3805
|
}
|
|
2063
|
-
var c = str.charCodeAt(
|
|
3806
|
+
var c = str.charCodeAt(i3);
|
|
2064
3807
|
if (c < 128 || latin1)
|
|
2065
3808
|
w(c);
|
|
2066
3809
|
else if (c < 2048)
|
|
2067
3810
|
w(192 | c >> 6), w(128 | c & 63);
|
|
2068
3811
|
else if (c > 55295 && c < 57344)
|
|
2069
|
-
c = 65536 + (c & 1023 << 10) | str.charCodeAt(++
|
|
3812
|
+
c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i3) & 1023, w(240 | c >> 18), w(128 | c >> 12 & 63), w(128 | c >> 6 & 63), w(128 | c & 63);
|
|
2070
3813
|
else
|
|
2071
3814
|
w(224 | c >> 12), w(128 | c >> 6 & 63), w(128 | c & 63);
|
|
2072
3815
|
}
|
|
2073
|
-
return
|
|
3816
|
+
return slc2(ar, 0, ai);
|
|
2074
3817
|
}
|
|
2075
3818
|
var exfl = function(ex) {
|
|
2076
3819
|
var le = 0;
|
|
@@ -2078,14 +3821,14 @@ var exfl = function(ex) {
|
|
|
2078
3821
|
for (var k in ex) {
|
|
2079
3822
|
var l = ex[k].length;
|
|
2080
3823
|
if (l > 65535)
|
|
2081
|
-
|
|
3824
|
+
err2(9);
|
|
2082
3825
|
le += l + 4;
|
|
2083
3826
|
}
|
|
2084
3827
|
}
|
|
2085
3828
|
return le;
|
|
2086
3829
|
};
|
|
2087
3830
|
var wzh = function(d, b, f, fn, u, c, ce, co) {
|
|
2088
|
-
var
|
|
3831
|
+
var fl3 = fn.length, ex = f.extra, col = co && co.length;
|
|
2089
3832
|
var exl = exfl(ex);
|
|
2090
3833
|
wbytes(d, b, ce != null ? 33639248 : 67324752), b += 4;
|
|
2091
3834
|
if (ce != null)
|
|
@@ -2095,14 +3838,14 @@ var wzh = function(d, b, f, fn, u, c, ce, co) {
|
|
|
2095
3838
|
d[b++] = f.compression & 255, d[b++] = f.compression >> 8;
|
|
2096
3839
|
var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;
|
|
2097
3840
|
if (y < 0 || y > 119)
|
|
2098
|
-
|
|
3841
|
+
err2(10);
|
|
2099
3842
|
wbytes(d, b, y << 25 | dt.getMonth() + 1 << 21 | dt.getDate() << 16 | dt.getHours() << 11 | dt.getMinutes() << 5 | dt.getSeconds() >> 1), b += 4;
|
|
2100
3843
|
if (c != -1) {
|
|
2101
3844
|
wbytes(d, b, f.crc);
|
|
2102
3845
|
wbytes(d, b + 4, c < 0 ? -c - 2 : c);
|
|
2103
3846
|
wbytes(d, b + 8, f.size);
|
|
2104
3847
|
}
|
|
2105
|
-
wbytes(d, b + 12,
|
|
3848
|
+
wbytes(d, b + 12, fl3);
|
|
2106
3849
|
wbytes(d, b + 14, exl), b += 16;
|
|
2107
3850
|
if (ce != null) {
|
|
2108
3851
|
wbytes(d, b, col);
|
|
@@ -2110,7 +3853,7 @@ var wzh = function(d, b, f, fn, u, c, ce, co) {
|
|
|
2110
3853
|
wbytes(d, b + 10, ce), b += 14;
|
|
2111
3854
|
}
|
|
2112
3855
|
d.set(fn, b);
|
|
2113
|
-
b +=
|
|
3856
|
+
b += fl3;
|
|
2114
3857
|
if (exl) {
|
|
2115
3858
|
for (var k in ex) {
|
|
2116
3859
|
var exf = ex[k], l = exf.length;
|
|
@@ -2139,13 +3882,13 @@ function zipSync(data, opts) {
|
|
|
2139
3882
|
var o = 0;
|
|
2140
3883
|
var tot = 0;
|
|
2141
3884
|
for (var fn in r) {
|
|
2142
|
-
var
|
|
3885
|
+
var _a3 = r[fn], file = _a3[0], p = _a3[1];
|
|
2143
3886
|
var compression = p.level == 0 ? 0 : 8;
|
|
2144
3887
|
var f = strToU8(fn), s = f.length;
|
|
2145
3888
|
var com = p.comment, m = com && strToU8(com), ms = m && m.length;
|
|
2146
3889
|
var exl = exfl(p.extra);
|
|
2147
3890
|
if (s > 65535)
|
|
2148
|
-
|
|
3891
|
+
err2(11);
|
|
2149
3892
|
var d = compression ? deflateSync(file, p) : file, l = d.length;
|
|
2150
3893
|
var c = crc();
|
|
2151
3894
|
c.p(file);
|
|
@@ -2162,9 +3905,9 @@ function zipSync(data, opts) {
|
|
|
2162
3905
|
o += 30 + s + exl + l;
|
|
2163
3906
|
tot += 76 + 2 * (s + exl) + (ms || 0) + l;
|
|
2164
3907
|
}
|
|
2165
|
-
var out = new
|
|
2166
|
-
for (var
|
|
2167
|
-
var f = files[
|
|
3908
|
+
var out = new u82(tot + 22), oe = o, cdl = tot - o;
|
|
3909
|
+
for (var i3 = 0; i3 < files.length; ++i3) {
|
|
3910
|
+
var f = files[i3];
|
|
2168
3911
|
wzh(out, f.o, f, f.f, f.u, f.c.length);
|
|
2169
3912
|
var badd = 30 + f.f.length + exfl(f.extra);
|
|
2170
3913
|
out.set(f.c, f.o + badd);
|
|
@@ -3574,8 +5317,8 @@ async function runDoctor(options, dependencies = actualDependencies) {
|
|
|
3574
5317
|
var args = process.argv.slice(2);
|
|
3575
5318
|
var runCommand = promisify2(execFile2);
|
|
3576
5319
|
var option = (name, fallback) => {
|
|
3577
|
-
const
|
|
3578
|
-
return
|
|
5320
|
+
const i3 = args.indexOf(name);
|
|
5321
|
+
return i3 >= 0 ? args[i3 + 1] : fallback;
|
|
3579
5322
|
};
|
|
3580
5323
|
async function installedPackageVersion() {
|
|
3581
5324
|
const packageManifest = JSON.parse(
|