@c4a/extract-ts 0.6.18 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -5
- package/README.zh-CN.md +30 -6
- package/index.js +1813 -123
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -11375,6 +11375,416 @@ var factSchema = exports_external.union([
|
|
|
11375
11375
|
activeFactSchema,
|
|
11376
11376
|
deprecatedFactSchema
|
|
11377
11377
|
]);
|
|
11378
|
+
// ../core/src/schemas/indexerEvidenceAdapterSchema.ts
|
|
11379
|
+
import { createHash } from "node:crypto";
|
|
11380
|
+
|
|
11381
|
+
// ../core/src/indexerOutputRedaction.ts
|
|
11382
|
+
var INDEXER_OUTPUT_REDACTION_MARKER = "[REDACTED:indexer-output]";
|
|
11383
|
+
var SECRET_TOKEN = /^(?:password|passwd|pwd|secret|token|credential|credentials|cookie)$/u;
|
|
11384
|
+
var SECRET_COMPOUND = /^(?:api-key|access-key|private-key|client-secret|access-token|refresh-token)$/u;
|
|
11385
|
+
var NON_SECRET_SUFFIX = new Set([
|
|
11386
|
+
"budget",
|
|
11387
|
+
"count",
|
|
11388
|
+
"digest",
|
|
11389
|
+
"fingerprint",
|
|
11390
|
+
"hash",
|
|
11391
|
+
"index",
|
|
11392
|
+
"kind",
|
|
11393
|
+
"length",
|
|
11394
|
+
"limit",
|
|
11395
|
+
"name",
|
|
11396
|
+
"ref",
|
|
11397
|
+
"reference",
|
|
11398
|
+
"references",
|
|
11399
|
+
"refs",
|
|
11400
|
+
"status",
|
|
11401
|
+
"type"
|
|
11402
|
+
]);
|
|
11403
|
+
function keyTokens(key) {
|
|
11404
|
+
return key.replace(/([a-z0-9])([A-Z])/gu, "$1-$2").replace(/[^A-Za-z0-9]+/gu, "-").toLowerCase().split("-").filter(Boolean);
|
|
11405
|
+
}
|
|
11406
|
+
function sensitiveKey(key, value) {
|
|
11407
|
+
const tokens = keyTokens(key);
|
|
11408
|
+
if (tokens.length === 0)
|
|
11409
|
+
return false;
|
|
11410
|
+
const normalized = tokens.join("-");
|
|
11411
|
+
if (normalized === "authorization" && value !== null && typeof value === "object") {
|
|
11412
|
+
return false;
|
|
11413
|
+
}
|
|
11414
|
+
if (NON_SECRET_SUFFIX.has(tokens.at(-1)))
|
|
11415
|
+
return false;
|
|
11416
|
+
return SECRET_COMPOUND.test(normalized) || tokens.some((token) => SECRET_TOKEN.test(token)) || normalized === "authorization";
|
|
11417
|
+
}
|
|
11418
|
+
function escapeRegExp(value) {
|
|
11419
|
+
return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
11420
|
+
}
|
|
11421
|
+
function normalizedBlockedScalars(policy) {
|
|
11422
|
+
const identities = new Set;
|
|
11423
|
+
const values = [];
|
|
11424
|
+
for (const value of policy.blocked_scalars ?? []) {
|
|
11425
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
11426
|
+
continue;
|
|
11427
|
+
if (typeof value === "string" && value.length === 0)
|
|
11428
|
+
continue;
|
|
11429
|
+
const identity = `${typeof value}:${String(value)}`;
|
|
11430
|
+
if (identities.has(identity))
|
|
11431
|
+
continue;
|
|
11432
|
+
identities.add(identity);
|
|
11433
|
+
values.push(value);
|
|
11434
|
+
}
|
|
11435
|
+
return values.sort((left, right) => String(right).length - String(left).length);
|
|
11436
|
+
}
|
|
11437
|
+
function replaceWithCount(value, pattern, replacement, count) {
|
|
11438
|
+
return value.replace(pattern, (...args) => {
|
|
11439
|
+
count.replacements += 1;
|
|
11440
|
+
if (typeof replacement === "string")
|
|
11441
|
+
return replacement;
|
|
11442
|
+
return replacement(...args.slice(0, -2));
|
|
11443
|
+
});
|
|
11444
|
+
}
|
|
11445
|
+
function redactKnownText(value, count) {
|
|
11446
|
+
let output = value;
|
|
11447
|
+
output = replaceWithCount(output, /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/gu, INDEXER_OUTPUT_REDACTION_MARKER, count);
|
|
11448
|
+
output = replaceWithCount(output, /(\bauthorization\s*:\s*(?:bearer|basic)\s+)[^\s,;]+/giu, (_match, prefix) => `${prefix}${INDEXER_OUTPUT_REDACTION_MARKER}`, count);
|
|
11449
|
+
output = replaceWithCount(output, /([a-z][a-z0-9+.-]*:\/\/)[^\s/@:]+:[^\s/@]+@/giu, (_match, prefix) => `${prefix}${INDEXER_OUTPUT_REDACTION_MARKER}@`, count);
|
|
11450
|
+
output = replaceWithCount(output, /([?&](?:access_token|refresh_token|api_key|password|secret)=)[^&#\s]+/giu, (_match, prefix) => `${prefix}${INDEXER_OUTPUT_REDACTION_MARKER}`, count);
|
|
11451
|
+
const key = "(?:[A-Za-z0-9_.-]*(?:password|passwd|pwd|secret|token|credential|cookie)[A-Za-z0-9_.-]*|api[-_]?key|access[-_]?(?:key|token)|private[-_]?key|client[-_]?secret|authorization)";
|
|
11452
|
+
const assignment = `(?:=\\s*|:\\s+(?=\\S)|:\\s*(?=["']))`;
|
|
11453
|
+
output = replaceWithCount(output, new RegExp(`((?:["']?${key}["']?)\\s*${assignment})(?:"(?:\\\\.|[^"])*"|'(?:\\\\.|[^'])*'|[^\\s,;}\\]]+)`, "giu"), (_match, prefix) => `${prefix}"${INDEXER_OUTPUT_REDACTION_MARKER}"`, count);
|
|
11454
|
+
return output;
|
|
11455
|
+
}
|
|
11456
|
+
function redactBlockedText(value, blocked, count) {
|
|
11457
|
+
let output = value;
|
|
11458
|
+
for (const scalar of blocked) {
|
|
11459
|
+
const pattern = typeof scalar === "number" ? new RegExp(`(?<![0-9.])${escapeRegExp(String(scalar))}(?![0-9.])`, "gu") : new RegExp(escapeRegExp(scalar), "gu");
|
|
11460
|
+
output = replaceWithCount(output, pattern, INDEXER_OUTPUT_REDACTION_MARKER, count);
|
|
11461
|
+
}
|
|
11462
|
+
return output;
|
|
11463
|
+
}
|
|
11464
|
+
function redactText(value, blocked, count) {
|
|
11465
|
+
return redactBlockedText(redactKnownText(value, count), blocked, count);
|
|
11466
|
+
}
|
|
11467
|
+
function blockedScalar(value, blocked) {
|
|
11468
|
+
return blocked.some((candidate) => typeof candidate === typeof value && Object.is(candidate, value));
|
|
11469
|
+
}
|
|
11470
|
+
function redactStructured(value, blocked, count, seen) {
|
|
11471
|
+
if (blockedScalar(value, blocked)) {
|
|
11472
|
+
count.replacements += 1;
|
|
11473
|
+
return INDEXER_OUTPUT_REDACTION_MARKER;
|
|
11474
|
+
}
|
|
11475
|
+
if (typeof value === "string")
|
|
11476
|
+
return redactText(value, blocked, count);
|
|
11477
|
+
if (value === null || typeof value !== "object")
|
|
11478
|
+
return value;
|
|
11479
|
+
if (seen.has(value))
|
|
11480
|
+
throw new TypeError("Indexer output redaction requires an acyclic value");
|
|
11481
|
+
seen.add(value);
|
|
11482
|
+
if (value instanceof Date) {
|
|
11483
|
+
const redacted2 = redactText(value.toISOString(), blocked, count);
|
|
11484
|
+
seen.delete(value);
|
|
11485
|
+
return redacted2;
|
|
11486
|
+
}
|
|
11487
|
+
if (value instanceof Error) {
|
|
11488
|
+
const redacted2 = {
|
|
11489
|
+
name: redactText(value.name, blocked, count),
|
|
11490
|
+
message: redactText(value.message, blocked, count)
|
|
11491
|
+
};
|
|
11492
|
+
seen.delete(value);
|
|
11493
|
+
return redacted2;
|
|
11494
|
+
}
|
|
11495
|
+
if (Array.isArray(value)) {
|
|
11496
|
+
const redacted2 = value.map((item) => redactStructured(item, blocked, count, seen));
|
|
11497
|
+
seen.delete(value);
|
|
11498
|
+
return redacted2;
|
|
11499
|
+
}
|
|
11500
|
+
const redacted = {};
|
|
11501
|
+
for (const [key, item] of Object.entries(value)) {
|
|
11502
|
+
const safeKey = redactText(key, blocked, count);
|
|
11503
|
+
if (sensitiveKey(key, item)) {
|
|
11504
|
+
count.replacements += 1;
|
|
11505
|
+
redacted[safeKey] = INDEXER_OUTPUT_REDACTION_MARKER;
|
|
11506
|
+
} else {
|
|
11507
|
+
redacted[safeKey] = redactStructured(item, blocked, count, seen);
|
|
11508
|
+
}
|
|
11509
|
+
}
|
|
11510
|
+
seen.delete(value);
|
|
11511
|
+
return redacted;
|
|
11512
|
+
}
|
|
11513
|
+
function redactIndexerOutput(input) {
|
|
11514
|
+
const count = { replacements: 0 };
|
|
11515
|
+
const blocked = normalizedBlockedScalars(input.policy ?? {});
|
|
11516
|
+
const value = typeof input.value === "string" ? redactText(input.value, blocked, count) : redactStructured(input.value, blocked, count, new WeakSet);
|
|
11517
|
+
return {
|
|
11518
|
+
value,
|
|
11519
|
+
redacted: count.replacements > 0,
|
|
11520
|
+
replacement_count: count.replacements
|
|
11521
|
+
};
|
|
11522
|
+
}
|
|
11523
|
+
function assertIndexerOutputSafe(input) {
|
|
11524
|
+
const result = redactIndexerOutput(input);
|
|
11525
|
+
if (result.redacted) {
|
|
11526
|
+
throw new TypeError(`Indexer ${input.channel} was blocked by the common output redaction boundary`);
|
|
11527
|
+
}
|
|
11528
|
+
return input.value;
|
|
11529
|
+
}
|
|
11530
|
+
|
|
11531
|
+
// ../core/src/schemas/indexerEvidenceAdapterSchema.ts
|
|
11532
|
+
var digestSchema = exports_external.string().regex(/^sha256:[a-f0-9]{64}$/u);
|
|
11533
|
+
var idSchema = exports_external.string().regex(/^[a-z0-9][a-z0-9._/-]*$/u).superRefine((value, context) => {
|
|
11534
|
+
if (value.split("/").some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
|
|
11535
|
+
context.addIssue({
|
|
11536
|
+
code: exports_external.ZodIssueCode.custom,
|
|
11537
|
+
message: "must not contain empty, current-directory, or parent-directory segments"
|
|
11538
|
+
});
|
|
11539
|
+
}
|
|
11540
|
+
});
|
|
11541
|
+
var semverSchema = exports_external.string().regex(/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u);
|
|
11542
|
+
var canonicalRefSchema = exports_external.string().regex(/^[a-z][a-z0-9.-]*:[A-Za-z0-9][A-Za-z0-9._~:/#@+-]*$/u);
|
|
11543
|
+
var packageCoordinateSchema = exports_external.string().regex(/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/u);
|
|
11544
|
+
var portablePathSchema = exports_external.string().superRefine((value, context) => {
|
|
11545
|
+
const segments = value.split("/");
|
|
11546
|
+
if (value.length === 0 || value.includes("\x00") || value.includes("\\") || value.startsWith("/") || /^[A-Za-z]:\//u.test(value) || segments.some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
|
|
11547
|
+
context.addIssue({
|
|
11548
|
+
code: exports_external.ZodIssueCode.custom,
|
|
11549
|
+
message: "must be a portable relative path"
|
|
11550
|
+
});
|
|
11551
|
+
}
|
|
11552
|
+
});
|
|
11553
|
+
function addDuplicateIssues(values, context, field) {
|
|
11554
|
+
const seen = new Set;
|
|
11555
|
+
values.forEach((value, index) => {
|
|
11556
|
+
if (seen.has(value)) {
|
|
11557
|
+
context.addIssue({
|
|
11558
|
+
code: exports_external.ZodIssueCode.custom,
|
|
11559
|
+
message: `${field} must not contain duplicate value ${value}`,
|
|
11560
|
+
path: [index]
|
|
11561
|
+
});
|
|
11562
|
+
}
|
|
11563
|
+
seen.add(value);
|
|
11564
|
+
});
|
|
11565
|
+
}
|
|
11566
|
+
var adapterIdentitySchema = exports_external.object({
|
|
11567
|
+
id: idSchema,
|
|
11568
|
+
package: packageCoordinateSchema,
|
|
11569
|
+
export: exports_external.string().regex(/^[A-Za-z_$][A-Za-z0-9_$.-]*$/u),
|
|
11570
|
+
version: semverSchema,
|
|
11571
|
+
digest: digestSchema
|
|
11572
|
+
}).strict();
|
|
11573
|
+
var adapterLocatorSchema = exports_external.object({
|
|
11574
|
+
source_ref: canonicalRefSchema,
|
|
11575
|
+
module_ref: canonicalRefSchema.nullable(),
|
|
11576
|
+
normalized_path: portablePathSchema,
|
|
11577
|
+
qualified_item_path: exports_external.string().min(1).max(1024),
|
|
11578
|
+
signature_digest: digestSchema
|
|
11579
|
+
}).strict();
|
|
11580
|
+
var indexerEvidenceAdapterFactSchema = exports_external.object({
|
|
11581
|
+
fact_ref: canonicalRefSchema,
|
|
11582
|
+
kind: idSchema,
|
|
11583
|
+
locator: adapterLocatorSchema,
|
|
11584
|
+
payload_digest: digestSchema,
|
|
11585
|
+
denominator: exports_external.enum(["none", "eligible-file", "loc", "symbol", "protocol-item"])
|
|
11586
|
+
}).strict();
|
|
11587
|
+
var indexerEvidenceAdapterFileSchema = exports_external.object({
|
|
11588
|
+
file_ref: canonicalRefSchema,
|
|
11589
|
+
source_ref: canonicalRefSchema,
|
|
11590
|
+
module_ref: canonicalRefSchema.nullable(),
|
|
11591
|
+
normalized_path: portablePathSchema,
|
|
11592
|
+
role: exports_external.enum(["primary-owner", "enricher"]),
|
|
11593
|
+
coverage_tier: exports_external.enum(["ast-catalog", "lightweight-evidence"]),
|
|
11594
|
+
disposition: exports_external.enum(["analyzed", "unsupported", "excluded"]),
|
|
11595
|
+
facts: exports_external.array(indexerEvidenceAdapterFactSchema)
|
|
11596
|
+
}).strict().superRefine((value, context) => {
|
|
11597
|
+
addDuplicateIssues(value.facts.map((fact2) => fact2.fact_ref), context, "facts");
|
|
11598
|
+
if (value.disposition !== "analyzed" && value.facts.length > 0) {
|
|
11599
|
+
context.addIssue({
|
|
11600
|
+
code: exports_external.ZodIssueCode.custom,
|
|
11601
|
+
message: "unsupported or excluded files cannot publish facts",
|
|
11602
|
+
path: ["facts"]
|
|
11603
|
+
});
|
|
11604
|
+
}
|
|
11605
|
+
if ((value.role === "enricher" || value.coverage_tier === "lightweight-evidence") && value.facts.some((fact2) => fact2.denominator !== "none")) {
|
|
11606
|
+
context.addIssue({
|
|
11607
|
+
code: exports_external.ZodIssueCode.custom,
|
|
11608
|
+
message: "enricher and lightweight evidence facts cannot contribute denominators",
|
|
11609
|
+
path: ["facts"]
|
|
11610
|
+
});
|
|
11611
|
+
}
|
|
11612
|
+
});
|
|
11613
|
+
var toolchainStepSchema = exports_external.object({
|
|
11614
|
+
step: idSchema,
|
|
11615
|
+
package: packageCoordinateSchema,
|
|
11616
|
+
export: exports_external.string().regex(/^[A-Za-z_$][A-Za-z0-9_$.-]*$/u),
|
|
11617
|
+
version: semverSchema,
|
|
11618
|
+
digest: digestSchema,
|
|
11619
|
+
capabilities: exports_external.array(idSchema).min(1),
|
|
11620
|
+
input_digest: digestSchema,
|
|
11621
|
+
output_digest: digestSchema
|
|
11622
|
+
}).strict().superRefine((value, context) => {
|
|
11623
|
+
addDuplicateIssues(value.capabilities, context, "capabilities");
|
|
11624
|
+
});
|
|
11625
|
+
var adapterDiagnosticSchema = exports_external.object({
|
|
11626
|
+
code: idSchema,
|
|
11627
|
+
fact_ref: canonicalRefSchema.optional(),
|
|
11628
|
+
severity: exports_external.enum(["info", "warning", "error"]),
|
|
11629
|
+
detail_digest: digestSchema
|
|
11630
|
+
}).strict();
|
|
11631
|
+
var indexerEvidenceAdapterResultSchema = exports_external.object({
|
|
11632
|
+
protocol: exports_external.literal("context.indexer.evidence-adapter-result/v1"),
|
|
11633
|
+
adapter: adapterIdentitySchema,
|
|
11634
|
+
authorized_scope: exports_external.object({
|
|
11635
|
+
source_ref: canonicalRefSchema,
|
|
11636
|
+
module_refs: exports_external.array(canonicalRefSchema),
|
|
11637
|
+
scope_digest: digestSchema
|
|
11638
|
+
}).strict(),
|
|
11639
|
+
input_digest: digestSchema,
|
|
11640
|
+
precedence: exports_external.number().int().nonnegative(),
|
|
11641
|
+
files: exports_external.array(indexerEvidenceAdapterFileSchema).min(1),
|
|
11642
|
+
diagnostics: exports_external.array(adapterDiagnosticSchema),
|
|
11643
|
+
toolchain: exports_external.array(toolchainStepSchema).min(1),
|
|
11644
|
+
output_digest: digestSchema
|
|
11645
|
+
}).strict().superRefine((value, context) => {
|
|
11646
|
+
addDuplicateIssues(value.authorized_scope.module_refs, context, "authorized_scope.module_refs");
|
|
11647
|
+
addDuplicateIssues(value.files.map((file) => file.file_ref), context, "files");
|
|
11648
|
+
addDuplicateIssues(value.toolchain.map((step) => step.step), context, "toolchain");
|
|
11649
|
+
});
|
|
11650
|
+
var FACT_PAYLOADS = new WeakMap;
|
|
11651
|
+
function canonicalFactPayload(value, seen = new WeakSet, path = "$") {
|
|
11652
|
+
if (value === null || typeof value === "boolean" || typeof value === "string") {
|
|
11653
|
+
return value;
|
|
11654
|
+
}
|
|
11655
|
+
if (typeof value === "number") {
|
|
11656
|
+
if (!Number.isFinite(value)) {
|
|
11657
|
+
throw new TypeError("Indexer Evidence Adapter fact payload numbers must be finite");
|
|
11658
|
+
}
|
|
11659
|
+
return value;
|
|
11660
|
+
}
|
|
11661
|
+
if (typeof value !== "object") {
|
|
11662
|
+
throw new TypeError(`Indexer Evidence Adapter fact payload ${path} must contain only JSON values`);
|
|
11663
|
+
}
|
|
11664
|
+
if (seen.has(value)) {
|
|
11665
|
+
throw new TypeError(`Indexer Evidence Adapter fact payload ${path} must be acyclic`);
|
|
11666
|
+
}
|
|
11667
|
+
seen.add(value);
|
|
11668
|
+
if (Array.isArray(value)) {
|
|
11669
|
+
const output2 = value.map((item, index) => canonicalFactPayload(item, seen, `${path}[${index}]`));
|
|
11670
|
+
seen.delete(value);
|
|
11671
|
+
return output2;
|
|
11672
|
+
}
|
|
11673
|
+
if (Object.prototype.toString.call(value) !== "[object Object]") {
|
|
11674
|
+
throw new TypeError(`Indexer Evidence Adapter fact payload ${path} must use plain JSON objects; received ${Object.prototype.toString.call(value)}`);
|
|
11675
|
+
}
|
|
11676
|
+
const output = {};
|
|
11677
|
+
for (const [key, item] of Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)) {
|
|
11678
|
+
output[key] = canonicalFactPayload(item, seen, `${path}.${key}`);
|
|
11679
|
+
}
|
|
11680
|
+
seen.delete(value);
|
|
11681
|
+
return output;
|
|
11682
|
+
}
|
|
11683
|
+
function canonicalize(value) {
|
|
11684
|
+
if (Array.isArray(value))
|
|
11685
|
+
return value.map(canonicalize);
|
|
11686
|
+
if (value !== null && typeof value === "object") {
|
|
11687
|
+
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, item]) => [key, canonicalize(item)]));
|
|
11688
|
+
}
|
|
11689
|
+
return value;
|
|
11690
|
+
}
|
|
11691
|
+
function indexerEvidenceAdapterProtocolDigest(value) {
|
|
11692
|
+
const canonical = JSON.stringify(canonicalize(value));
|
|
11693
|
+
return `sha256:${createHash("sha256").update(canonical).digest("hex")}`;
|
|
11694
|
+
}
|
|
11695
|
+
function indexerEvidenceAdapterFileRef(input) {
|
|
11696
|
+
return `adapter-file:${indexerEvidenceAdapterProtocolDigest(input)}`;
|
|
11697
|
+
}
|
|
11698
|
+
function indexerEvidenceAdapterFactRef(input) {
|
|
11699
|
+
return `adapter-fact:${indexerEvidenceAdapterProtocolDigest(input)}`;
|
|
11700
|
+
}
|
|
11701
|
+
function createIndexerEvidenceAdapterFact(input) {
|
|
11702
|
+
const payload = canonicalFactPayload(input.payload);
|
|
11703
|
+
const qualifiedItemPath = input.qualified_item_path.length <= 1024 ? input.qualified_item_path : `${input.qualified_item_path.slice(0, 950)}#${indexerEvidenceAdapterProtocolDigest(input.qualified_item_path)}`;
|
|
11704
|
+
const locator = {
|
|
11705
|
+
source_ref: input.source_ref,
|
|
11706
|
+
module_ref: input.module_ref,
|
|
11707
|
+
normalized_path: input.normalized_path,
|
|
11708
|
+
qualified_item_path: qualifiedItemPath,
|
|
11709
|
+
signature_digest: indexerEvidenceAdapterProtocolDigest(input.signature)
|
|
11710
|
+
};
|
|
11711
|
+
const fact2 = {
|
|
11712
|
+
fact_ref: indexerEvidenceAdapterFactRef({ ...locator, kind: input.kind }),
|
|
11713
|
+
kind: input.kind,
|
|
11714
|
+
locator,
|
|
11715
|
+
payload_digest: indexerEvidenceAdapterProtocolDigest(payload),
|
|
11716
|
+
denominator: input.denominator
|
|
11717
|
+
};
|
|
11718
|
+
FACT_PAYLOADS.set(fact2, payload);
|
|
11719
|
+
return fact2;
|
|
11720
|
+
}
|
|
11721
|
+
function indexerEvidenceAdapterFactPayloads(result) {
|
|
11722
|
+
const payloads = result.files.flatMap((file) => file.facts.map((fact2) => {
|
|
11723
|
+
const payload = FACT_PAYLOADS.get(fact2);
|
|
11724
|
+
if (payload === undefined) {
|
|
11725
|
+
throw new TypeError(`Evidence Adapter fact payload ${fact2.fact_ref} is no longer materialized in this process`);
|
|
11726
|
+
}
|
|
11727
|
+
if (indexerEvidenceAdapterProtocolDigest(payload) !== fact2.payload_digest) {
|
|
11728
|
+
throw new TypeError(`Evidence Adapter fact payload ${fact2.fact_ref} is stale`);
|
|
11729
|
+
}
|
|
11730
|
+
return { fact_ref: fact2.fact_ref, payload };
|
|
11731
|
+
})).sort((left, right) => compareCanonicalText(left.fact_ref, right.fact_ref));
|
|
11732
|
+
return assertIndexerOutputSafe({ channel: "ipc-envelope", value: payloads });
|
|
11733
|
+
}
|
|
11734
|
+
function materializeIndexerEvidenceAdapterResult(result) {
|
|
11735
|
+
return {
|
|
11736
|
+
result,
|
|
11737
|
+
fact_payloads: indexerEvidenceAdapterFactPayloads(result)
|
|
11738
|
+
};
|
|
11739
|
+
}
|
|
11740
|
+
function indexerEvidenceAdapterOutputDigest(value) {
|
|
11741
|
+
return indexerEvidenceAdapterProtocolDigest(value);
|
|
11742
|
+
}
|
|
11743
|
+
function compareCanonicalText(left, right) {
|
|
11744
|
+
if (left < right)
|
|
11745
|
+
return -1;
|
|
11746
|
+
if (left > right)
|
|
11747
|
+
return 1;
|
|
11748
|
+
return 0;
|
|
11749
|
+
}
|
|
11750
|
+
function buildIndexerEvidenceAdapterResult(input) {
|
|
11751
|
+
const canonical = {
|
|
11752
|
+
...input,
|
|
11753
|
+
authorized_scope: {
|
|
11754
|
+
...input.authorized_scope,
|
|
11755
|
+
module_refs: [...input.authorized_scope.module_refs].sort(compareCanonicalText)
|
|
11756
|
+
},
|
|
11757
|
+
files: input.files.map((file) => ({
|
|
11758
|
+
...file,
|
|
11759
|
+
facts: [...file.facts].sort((left, right) => compareCanonicalText(left.fact_ref, right.fact_ref))
|
|
11760
|
+
})).sort((left, right) => compareCanonicalText(left.file_ref, right.file_ref)),
|
|
11761
|
+
diagnostics: [...input.diagnostics].sort((left, right) => compareCanonicalText(left.fact_ref ?? "", right.fact_ref ?? "") || compareCanonicalText(left.code, right.code) || compareCanonicalText(left.severity, right.severity) || compareCanonicalText(left.detail_digest, right.detail_digest)),
|
|
11762
|
+
toolchain: input.toolchain.map((step) => ({
|
|
11763
|
+
...step,
|
|
11764
|
+
capabilities: [...step.capabilities].sort(compareCanonicalText)
|
|
11765
|
+
}))
|
|
11766
|
+
};
|
|
11767
|
+
const payloads = new Map;
|
|
11768
|
+
for (const file of canonical.files) {
|
|
11769
|
+
for (const fact2 of file.facts) {
|
|
11770
|
+
const payload = FACT_PAYLOADS.get(fact2);
|
|
11771
|
+
if (payload !== undefined)
|
|
11772
|
+
payloads.set(fact2.fact_ref, payload);
|
|
11773
|
+
}
|
|
11774
|
+
}
|
|
11775
|
+
const parsed = indexerEvidenceAdapterResultSchema.parse({
|
|
11776
|
+
...canonical,
|
|
11777
|
+
output_digest: indexerEvidenceAdapterOutputDigest(canonical)
|
|
11778
|
+
});
|
|
11779
|
+
for (const file of parsed.files) {
|
|
11780
|
+
for (const fact2 of file.facts) {
|
|
11781
|
+
const payload = payloads.get(fact2.fact_ref);
|
|
11782
|
+
if (payload !== undefined)
|
|
11783
|
+
FACT_PAYLOADS.set(fact2, payload);
|
|
11784
|
+
}
|
|
11785
|
+
}
|
|
11786
|
+
return assertIndexerOutputSafe({ channel: "success-payload", value: parsed });
|
|
11787
|
+
}
|
|
11378
11788
|
// ../core/src/errors/httpStatus.ts
|
|
11379
11789
|
var ERROR_CODE_HTTP_STATUS = {
|
|
11380
11790
|
["VALIDATION_FAILED" /* VALIDATION_FAILED */]: 400,
|
|
@@ -11490,7 +11900,15 @@ var DEFAULT_CONTENT_TYPES = [
|
|
|
11490
11900
|
{
|
|
11491
11901
|
id: "typescript",
|
|
11492
11902
|
category: "code",
|
|
11493
|
-
match: { extensions: [".ts", ".tsx"] },
|
|
11903
|
+
match: { extensions: [".ts", ".tsx", ".mts", ".cts"] },
|
|
11904
|
+
cas: { encoding: "utf8", hashInput: "content" },
|
|
11905
|
+
pipeline: { digest: ["ast", "summary"], extraction: ["entities", "relations"] },
|
|
11906
|
+
display: { icon: "\uD83D\uDCDC", renderer: "code" }
|
|
11907
|
+
},
|
|
11908
|
+
{
|
|
11909
|
+
id: "javascript",
|
|
11910
|
+
category: "code",
|
|
11911
|
+
match: { extensions: [".js", ".jsx", ".mjs", ".cjs"] },
|
|
11494
11912
|
cas: { encoding: "utf8", hashInput: "content" },
|
|
11495
11913
|
pipeline: { digest: ["ast", "summary"], extraction: ["entities", "relations"] },
|
|
11496
11914
|
display: { icon: "\uD83D\uDCDC", renderer: "code" }
|
|
@@ -11598,6 +12016,50 @@ var INDEXABLE_EXTENSIONS = new Set([
|
|
|
11598
12016
|
var UPLOAD_ALLOWED_EXTENSIONS = collectExtensions(() => true);
|
|
11599
12017
|
var TEXT_EXTENSIONS = collectExtensions((definition) => definition.cas.encoding === "utf8");
|
|
11600
12018
|
var UPLOAD_MAX_FILE_SIZE = 5 * 1024 * 1024;
|
|
12019
|
+
// src/ecmaScriptLanguage.ts
|
|
12020
|
+
var LANGUAGE_BY_EXTENSION = {
|
|
12021
|
+
".ts": "typescript",
|
|
12022
|
+
".tsx": "tsx",
|
|
12023
|
+
".mts": "typescript",
|
|
12024
|
+
".cts": "typescript",
|
|
12025
|
+
".js": "javascript",
|
|
12026
|
+
".jsx": "jsx",
|
|
12027
|
+
".mjs": "javascript",
|
|
12028
|
+
".cjs": "javascript"
|
|
12029
|
+
};
|
|
12030
|
+
var EXTRACT_TS_CAPABILITIES = [
|
|
12031
|
+
"commonjs-module",
|
|
12032
|
+
"esm-module",
|
|
12033
|
+
"javascript-ast",
|
|
12034
|
+
"jsx-ast",
|
|
12035
|
+
"parser.javascript",
|
|
12036
|
+
"parser.typescript",
|
|
12037
|
+
"static-call-relations",
|
|
12038
|
+
"tsx-ast",
|
|
12039
|
+
"typescript-ast"
|
|
12040
|
+
];
|
|
12041
|
+
var EXTRACT_TS_COVERAGE_TIER = "ast-catalog";
|
|
12042
|
+
var ecmaScriptLanguage = (filePath) => {
|
|
12043
|
+
const lower = filePath.toLowerCase();
|
|
12044
|
+
const extension = Object.keys(LANGUAGE_BY_EXTENSION).find((candidate) => lower.endsWith(candidate));
|
|
12045
|
+
return extension ? LANGUAGE_BY_EXTENSION[extension] : "typescript";
|
|
12046
|
+
};
|
|
12047
|
+
var isJsxLikePath = (filePath) => {
|
|
12048
|
+
const language = ecmaScriptLanguage(filePath);
|
|
12049
|
+
return language === "tsx" || language === "jsx";
|
|
12050
|
+
};
|
|
12051
|
+
var isJavaScriptPath = (filePath) => {
|
|
12052
|
+
const language = ecmaScriptLanguage(filePath);
|
|
12053
|
+
return language === "javascript" || language === "jsx";
|
|
12054
|
+
};
|
|
12055
|
+
var packageLanguage = (filePaths) => {
|
|
12056
|
+
const hasJavaScript = filePaths.some(isJavaScriptPath);
|
|
12057
|
+
const hasTypeScript = filePaths.some((filePath) => !isJavaScriptPath(filePath));
|
|
12058
|
+
if (hasJavaScript && hasTypeScript)
|
|
12059
|
+
return "ecmascript";
|
|
12060
|
+
return hasJavaScript ? "javascript" : "typescript";
|
|
12061
|
+
};
|
|
12062
|
+
|
|
11601
12063
|
// src/pathUtils.ts
|
|
11602
12064
|
import { posix as posix2 } from "node:path";
|
|
11603
12065
|
|
|
@@ -11781,8 +12243,9 @@ function resolveTsConfigCandidates(specifier, resolver) {
|
|
|
11781
12243
|
}
|
|
11782
12244
|
|
|
11783
12245
|
// src/pathUtils.ts
|
|
11784
|
-
var
|
|
11785
|
-
var
|
|
12246
|
+
var TYPESCRIPT_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts"];
|
|
12247
|
+
var JAVASCRIPT_EXTENSIONS = [".js", ".jsx", ".mjs", ".cjs"];
|
|
12248
|
+
var SOURCE_EXTENSIONS = [...TYPESCRIPT_EXTENSIONS, ...JAVASCRIPT_EXTENSIONS];
|
|
11786
12249
|
var DECLARATION_EXTENSIONS = [".d.ts", ".d.mts", ".d.cts"];
|
|
11787
12250
|
var KNOWN_CODE_SUFFIXES = [
|
|
11788
12251
|
...DECLARATION_EXTENSIONS,
|
|
@@ -11794,7 +12257,7 @@ var KNOWN_CODE_SUFFIXES = [
|
|
|
11794
12257
|
".system.js",
|
|
11795
12258
|
".min.js",
|
|
11796
12259
|
...SOURCE_EXTENSIONS,
|
|
11797
|
-
...
|
|
12260
|
+
...JAVASCRIPT_EXTENSIONS
|
|
11798
12261
|
];
|
|
11799
12262
|
var BUILD_OUTPUT_ROOTS = new Set(["dist", "lib", "build", "output", "out"]);
|
|
11800
12263
|
var BUILD_FORMAT_DIRS = new Set([
|
|
@@ -11857,25 +12320,27 @@ var createCandidatePaths = (value, options = {}) => {
|
|
|
11857
12320
|
return [];
|
|
11858
12321
|
const withoutExtension = removeKnownExtension(normalized);
|
|
11859
12322
|
const mappedSourcePaths = buildToSourcePaths(withoutExtension);
|
|
11860
|
-
const
|
|
12323
|
+
const isBuildOutput = buildToSourcePaths(withoutExtension).length > 0;
|
|
12324
|
+
const directFirst = SOURCE_EXTENSIONS.some((extension) => normalized.endsWith(extension)) && !isBuildOutput;
|
|
12325
|
+
const preferredExtensions = options.preferJavaScript ? [...JAVASCRIPT_EXTENSIONS, ...TYPESCRIPT_EXTENSIONS] : [...TYPESCRIPT_EXTENSIONS, ...JAVASCRIPT_EXTENSIONS];
|
|
11861
12326
|
const bases = directFirst ? unique([normalized, withoutExtension, ...mappedSourcePaths]) : unique([...mappedSourcePaths, normalized, withoutExtension]);
|
|
11862
12327
|
const candidates = new Set;
|
|
11863
12328
|
for (const base of bases) {
|
|
11864
12329
|
if (SOURCE_EXTENSIONS.some((ext) => base.endsWith(ext))) {
|
|
11865
12330
|
candidates.add(base);
|
|
11866
12331
|
}
|
|
11867
|
-
for (const extension of
|
|
12332
|
+
for (const extension of preferredExtensions) {
|
|
11868
12333
|
candidates.add(`${base}${extension}`);
|
|
11869
12334
|
candidates.add(posix2.join(base, `index${extension}`));
|
|
11870
12335
|
}
|
|
11871
|
-
if (
|
|
11872
|
-
for (const extension of
|
|
12336
|
+
if (JAVASCRIPT_EXTENSIONS.some((extension) => normalized.endsWith(extension))) {
|
|
12337
|
+
for (const extension of preferredExtensions) {
|
|
11873
12338
|
candidates.add(removeKnownExtension(normalized) + extension);
|
|
11874
12339
|
}
|
|
11875
12340
|
}
|
|
11876
12341
|
}
|
|
11877
12342
|
if (options.allowIndexFallback ?? true) {
|
|
11878
|
-
for (const extension of
|
|
12343
|
+
for (const extension of preferredExtensions) {
|
|
11879
12344
|
candidates.add(`src/index${extension}`);
|
|
11880
12345
|
}
|
|
11881
12346
|
}
|
|
@@ -11896,7 +12361,10 @@ var resolveImportSourcePath = async (fromFile, specifier, fs, resolver) => {
|
|
|
11896
12361
|
if (resolver === undefined)
|
|
11897
12362
|
return null;
|
|
11898
12363
|
for (const target of resolveTsConfigCandidates(specifier, resolver)) {
|
|
11899
|
-
for (const candidate of createCandidatePaths(target, {
|
|
12364
|
+
for (const candidate of createCandidatePaths(target, {
|
|
12365
|
+
allowIndexFallback: false,
|
|
12366
|
+
preferJavaScript: isJavaScriptPath(fromFile)
|
|
12367
|
+
})) {
|
|
11900
12368
|
if (await fs.exists(candidate))
|
|
11901
12369
|
return normalizeRelativePath(candidate);
|
|
11902
12370
|
}
|
|
@@ -11904,7 +12372,7 @@ var resolveImportSourcePath = async (fromFile, specifier, fs, resolver) => {
|
|
|
11904
12372
|
return null;
|
|
11905
12373
|
}
|
|
11906
12374
|
const baseDir = posix2.dirname(fromFile);
|
|
11907
|
-
for (const candidate of createCandidatePaths(specifier)) {
|
|
12375
|
+
for (const candidate of createCandidatePaths(specifier, { preferJavaScript: isJavaScriptPath(fromFile) })) {
|
|
11908
12376
|
const fullPath = baseDir === "." ? candidate : posix2.join(baseDir, candidate);
|
|
11909
12377
|
if (await fs.exists(fullPath)) {
|
|
11910
12378
|
return normalizeRelativePath(fullPath);
|
|
@@ -12053,7 +12521,7 @@ var detectEntries = async (manifest, fs) => {
|
|
|
12053
12521
|
package: {
|
|
12054
12522
|
name: readString(pkg.name) ?? "unknown-package",
|
|
12055
12523
|
kind: detectPackageKind(pkg),
|
|
12056
|
-
language:
|
|
12524
|
+
language: packageLanguage(entries.map((entry) => entry.path)),
|
|
12057
12525
|
version: readString(pkg.version) ?? undefined
|
|
12058
12526
|
},
|
|
12059
12527
|
entries,
|
|
@@ -12120,6 +12588,23 @@ var fileInfoSchema = exports_external.object({
|
|
|
12120
12588
|
language: exports_external.string().min(1),
|
|
12121
12589
|
lines: exports_external.number().int().nonnegative()
|
|
12122
12590
|
});
|
|
12591
|
+
var extractionDiagnosticSchema = exports_external.object({
|
|
12592
|
+
code: exports_external.string().min(1),
|
|
12593
|
+
severity: exports_external.enum(["info", "warning", "error"]),
|
|
12594
|
+
file: exports_external.string().min(1),
|
|
12595
|
+
line: exports_external.number().int().positive(),
|
|
12596
|
+
column: exports_external.number().int().positive()
|
|
12597
|
+
});
|
|
12598
|
+
var extractionCoverageSchema = exports_external.object({
|
|
12599
|
+
tier: exports_external.enum(["ast-catalog", "lightweight-evidence"]),
|
|
12600
|
+
capabilities: exports_external.array(exports_external.string().min(1)),
|
|
12601
|
+
files: exports_external.array(exports_external.object({
|
|
12602
|
+
path: exports_external.string().min(1),
|
|
12603
|
+
disposition: exports_external.enum(["analyzed", "unsupported", "excluded"]),
|
|
12604
|
+
diagnosticCodes: exports_external.array(exports_external.string().min(1))
|
|
12605
|
+
})),
|
|
12606
|
+
diagnostics: exports_external.array(extractionDiagnosticSchema)
|
|
12607
|
+
});
|
|
12123
12608
|
var extractionMetaSchema = exports_external.object({
|
|
12124
12609
|
extractedAt: exports_external.string().datetime(),
|
|
12125
12610
|
pluginId: exports_external.string().min(1),
|
|
@@ -12146,6 +12631,7 @@ var extractionResultSchema = exports_external.object({
|
|
|
12146
12631
|
files: exports_external.array(fileInfoSchema),
|
|
12147
12632
|
symbols: exports_external.array(symbolInfoSchema),
|
|
12148
12633
|
relations: exports_external.array(relationInfoSchema),
|
|
12634
|
+
coverage: extractionCoverageSchema.optional(),
|
|
12149
12635
|
stats: extractionStatsSchema
|
|
12150
12636
|
});
|
|
12151
12637
|
var digestStatsSchema = exports_external.object({
|
|
@@ -12162,6 +12648,7 @@ var digestDataSchema = exports_external.object({
|
|
|
12162
12648
|
files: exports_external.array(fileInfoSchema),
|
|
12163
12649
|
symbols: exports_external.array(symbolInfoSchema),
|
|
12164
12650
|
relations: exports_external.array(relationInfoSchema),
|
|
12651
|
+
coverage: extractionCoverageSchema.optional(),
|
|
12165
12652
|
stats: digestStatsSchema
|
|
12166
12653
|
});
|
|
12167
12654
|
var symbolDiffSchema = exports_external.object({
|
|
@@ -12264,7 +12751,16 @@ class ExtractionPluginRegistry {
|
|
|
12264
12751
|
import { execFile } from "node:child_process";
|
|
12265
12752
|
import { promisify } from "node:util";
|
|
12266
12753
|
var execFileAsync = promisify(execFile);
|
|
12267
|
-
var SUPPORTED_EXTENSIONS = new Set([
|
|
12754
|
+
var SUPPORTED_EXTENSIONS = new Set([
|
|
12755
|
+
".ts",
|
|
12756
|
+
".tsx",
|
|
12757
|
+
".mts",
|
|
12758
|
+
".cts",
|
|
12759
|
+
".js",
|
|
12760
|
+
".jsx",
|
|
12761
|
+
".mjs",
|
|
12762
|
+
".cjs"
|
|
12763
|
+
]);
|
|
12268
12764
|
var MANIFEST_FILES = [
|
|
12269
12765
|
"package.json",
|
|
12270
12766
|
"pyproject.toml",
|
|
@@ -12316,10 +12812,613 @@ var codeExtractRunnerInputSchema = exports_external.object({
|
|
|
12316
12812
|
worktreeContentHash: exports_external.string().min(1).optional()
|
|
12317
12813
|
}).optional()
|
|
12318
12814
|
});
|
|
12815
|
+
// ../extract/src/evidenceAdapter.ts
|
|
12816
|
+
function fact2(input) {
|
|
12817
|
+
return createIndexerEvidenceAdapterFact({
|
|
12818
|
+
source_ref: input.sourceRef,
|
|
12819
|
+
module_ref: input.moduleRef,
|
|
12820
|
+
normalized_path: input.normalizedPath,
|
|
12821
|
+
qualified_item_path: input.qualifiedItemPath,
|
|
12822
|
+
kind: input.kind,
|
|
12823
|
+
signature: input.signature,
|
|
12824
|
+
payload: input.payload,
|
|
12825
|
+
denominator: input.denominator
|
|
12826
|
+
});
|
|
12827
|
+
}
|
|
12828
|
+
function semanticExtractionPayload(extraction) {
|
|
12829
|
+
return {
|
|
12830
|
+
version: extraction.version,
|
|
12831
|
+
meta: {
|
|
12832
|
+
pluginId: extraction.meta.pluginId,
|
|
12833
|
+
commitHash: extraction.meta.commitHash,
|
|
12834
|
+
language: extraction.meta.language
|
|
12835
|
+
},
|
|
12836
|
+
package: extraction.package,
|
|
12837
|
+
files: extraction.files,
|
|
12838
|
+
symbols: extraction.symbols,
|
|
12839
|
+
relations: extraction.relations,
|
|
12840
|
+
coverage: extraction.coverage,
|
|
12841
|
+
stats: extraction.stats
|
|
12842
|
+
};
|
|
12843
|
+
}
|
|
12844
|
+
function relationSourceFile(relation, symbols) {
|
|
12845
|
+
const candidates = symbols.filter((symbol) => symbol.name === relation.from);
|
|
12846
|
+
if (candidates.length === 1)
|
|
12847
|
+
return candidates[0].file;
|
|
12848
|
+
if (relation.line !== undefined) {
|
|
12849
|
+
const containing = candidates.filter((symbol) => symbol.line <= relation.line && symbol.endLine >= relation.line);
|
|
12850
|
+
if (containing.length === 1)
|
|
12851
|
+
return containing[0].file;
|
|
12852
|
+
}
|
|
12853
|
+
return null;
|
|
12854
|
+
}
|
|
12855
|
+
function diagnosticPayload(diagnostic) {
|
|
12856
|
+
return {
|
|
12857
|
+
code: diagnostic.code,
|
|
12858
|
+
severity: diagnostic.severity,
|
|
12859
|
+
file: diagnostic.file,
|
|
12860
|
+
line: diagnostic.line,
|
|
12861
|
+
column: diagnostic.column
|
|
12862
|
+
};
|
|
12863
|
+
}
|
|
12864
|
+
function extractionResultToEvidenceAdapterResult(extraction, invocation) {
|
|
12865
|
+
const coverage = extraction.coverage;
|
|
12866
|
+
if (!coverage) {
|
|
12867
|
+
throw new TypeError("ExtractionResult coverage is required for Evidence Adapter Result conversion");
|
|
12868
|
+
}
|
|
12869
|
+
if (coverage.capabilities.length === 0) {
|
|
12870
|
+
throw new TypeError("ExtractionResult coverage must declare at least one parser capability");
|
|
12871
|
+
}
|
|
12872
|
+
const coverageByPath = new Map(coverage.files.map((file) => [file.path, file]));
|
|
12873
|
+
const fileInfoByPath = new Map(extraction.files.map((file) => [file.path, file]));
|
|
12874
|
+
for (const file of extraction.files) {
|
|
12875
|
+
if (!coverageByPath.has(file.path)) {
|
|
12876
|
+
throw new TypeError(`ExtractionResult file ${file.path} has no coverage disposition`);
|
|
12877
|
+
}
|
|
12878
|
+
}
|
|
12879
|
+
for (const symbol of extraction.symbols) {
|
|
12880
|
+
const disposition = coverageByPath.get(symbol.file)?.disposition;
|
|
12881
|
+
if (disposition !== "analyzed") {
|
|
12882
|
+
throw new TypeError(`ExtractionResult symbol ${symbol.name} belongs to a file without analyzed disposition`);
|
|
12883
|
+
}
|
|
12884
|
+
}
|
|
12885
|
+
const role = invocation.role ?? "primary-owner";
|
|
12886
|
+
const ownsDenominators = role === "primary-owner" && coverage.tier === "ast-catalog";
|
|
12887
|
+
const generatedDiagnostics = [];
|
|
12888
|
+
const relationsByFile = new Map;
|
|
12889
|
+
for (const relation of extraction.relations) {
|
|
12890
|
+
const file = relationSourceFile(relation, extraction.symbols);
|
|
12891
|
+
if (file === null || coverageByPath.get(file)?.disposition !== "analyzed") {
|
|
12892
|
+
generatedDiagnostics.push({
|
|
12893
|
+
code: "relation-locator-unresolved",
|
|
12894
|
+
severity: "warning",
|
|
12895
|
+
detail_digest: indexerEvidenceAdapterProtocolDigest(relation)
|
|
12896
|
+
});
|
|
12897
|
+
continue;
|
|
12898
|
+
}
|
|
12899
|
+
const current = relationsByFile.get(file) ?? [];
|
|
12900
|
+
current.push(relation);
|
|
12901
|
+
relationsByFile.set(file, current);
|
|
12902
|
+
}
|
|
12903
|
+
const files = coverage.files.map((coverageFile) => {
|
|
12904
|
+
const normalizedPath2 = coverageFile.path;
|
|
12905
|
+
const fileRef = indexerEvidenceAdapterFileRef({
|
|
12906
|
+
source_ref: invocation.authorized_scope.source_ref,
|
|
12907
|
+
module_ref: invocation.module_ref,
|
|
12908
|
+
normalized_path: normalizedPath2
|
|
12909
|
+
});
|
|
12910
|
+
const fileInfo = fileInfoByPath.get(normalizedPath2);
|
|
12911
|
+
if (coverageFile.disposition === "analyzed" && !fileInfo) {
|
|
12912
|
+
throw new TypeError(`Analyzed file ${normalizedPath2} has no ExtractionResult file metadata`);
|
|
12913
|
+
}
|
|
12914
|
+
const facts = [];
|
|
12915
|
+
if (coverageFile.disposition === "analyzed" && fileInfo) {
|
|
12916
|
+
facts.push(fact2({
|
|
12917
|
+
sourceRef: invocation.authorized_scope.source_ref,
|
|
12918
|
+
moduleRef: invocation.module_ref,
|
|
12919
|
+
normalizedPath: normalizedPath2,
|
|
12920
|
+
qualifiedItemPath: "file",
|
|
12921
|
+
kind: "source-file",
|
|
12922
|
+
signature: { path: normalizedPath2, language: fileInfo.language },
|
|
12923
|
+
payload: fileInfo,
|
|
12924
|
+
denominator: ownsDenominators ? "eligible-file" : "none"
|
|
12925
|
+
}));
|
|
12926
|
+
facts.push(fact2({
|
|
12927
|
+
sourceRef: invocation.authorized_scope.source_ref,
|
|
12928
|
+
moduleRef: invocation.module_ref,
|
|
12929
|
+
normalizedPath: normalizedPath2,
|
|
12930
|
+
qualifiedItemPath: "loc",
|
|
12931
|
+
kind: "source-loc",
|
|
12932
|
+
signature: { path: normalizedPath2 },
|
|
12933
|
+
payload: { lines: fileInfo.lines },
|
|
12934
|
+
denominator: ownsDenominators ? "loc" : "none"
|
|
12935
|
+
}));
|
|
12936
|
+
for (const symbol of extraction.symbols.filter((item) => item.file === normalizedPath2)) {
|
|
12937
|
+
facts.push(fact2({
|
|
12938
|
+
sourceRef: invocation.authorized_scope.source_ref,
|
|
12939
|
+
moduleRef: invocation.module_ref,
|
|
12940
|
+
normalizedPath: normalizedPath2,
|
|
12941
|
+
qualifiedItemPath: `symbol:${symbol.kind}:${symbol.name}@${symbol.line}`,
|
|
12942
|
+
kind: "code-symbol",
|
|
12943
|
+
signature: {
|
|
12944
|
+
name: symbol.name,
|
|
12945
|
+
kind: symbol.kind,
|
|
12946
|
+
signature: symbol.signature ?? null,
|
|
12947
|
+
params: symbol.params ?? null,
|
|
12948
|
+
returnType: symbol.returnType ?? null,
|
|
12949
|
+
typeAnnotation: symbol.typeAnnotation ?? null
|
|
12950
|
+
},
|
|
12951
|
+
payload: symbol,
|
|
12952
|
+
denominator: ownsDenominators ? "symbol" : "none"
|
|
12953
|
+
}));
|
|
12954
|
+
}
|
|
12955
|
+
for (const relation of relationsByFile.get(normalizedPath2) ?? []) {
|
|
12956
|
+
facts.push(fact2({
|
|
12957
|
+
sourceRef: invocation.authorized_scope.source_ref,
|
|
12958
|
+
moduleRef: invocation.module_ref,
|
|
12959
|
+
normalizedPath: normalizedPath2,
|
|
12960
|
+
qualifiedItemPath: `relation:${relation.type}:${relation.from}->${relation.to}@${relation.line ?? 0}`,
|
|
12961
|
+
kind: "code-relation",
|
|
12962
|
+
signature: relation,
|
|
12963
|
+
payload: relation,
|
|
12964
|
+
denominator: "none"
|
|
12965
|
+
}));
|
|
12966
|
+
}
|
|
12967
|
+
}
|
|
12968
|
+
return {
|
|
12969
|
+
file_ref: fileRef,
|
|
12970
|
+
source_ref: invocation.authorized_scope.source_ref,
|
|
12971
|
+
module_ref: invocation.module_ref,
|
|
12972
|
+
normalized_path: normalizedPath2,
|
|
12973
|
+
role,
|
|
12974
|
+
coverage_tier: coverage.tier,
|
|
12975
|
+
disposition: coverageFile.disposition,
|
|
12976
|
+
facts
|
|
12977
|
+
};
|
|
12978
|
+
});
|
|
12979
|
+
const diagnostics = [
|
|
12980
|
+
...coverage.diagnostics.map((diagnostic) => {
|
|
12981
|
+
const coverageFile = coverageByPath.get(diagnostic.file);
|
|
12982
|
+
const fileRef = coverageFile ? indexerEvidenceAdapterFileRef({
|
|
12983
|
+
source_ref: invocation.authorized_scope.source_ref,
|
|
12984
|
+
module_ref: invocation.module_ref,
|
|
12985
|
+
normalized_path: diagnostic.file
|
|
12986
|
+
}) : undefined;
|
|
12987
|
+
return {
|
|
12988
|
+
code: diagnostic.code,
|
|
12989
|
+
severity: diagnostic.severity,
|
|
12990
|
+
detail_digest: indexerEvidenceAdapterProtocolDigest(diagnosticPayload(diagnostic)),
|
|
12991
|
+
...fileRef ? { fact_ref: fileRef } : {}
|
|
12992
|
+
};
|
|
12993
|
+
}),
|
|
12994
|
+
...generatedDiagnostics
|
|
12995
|
+
];
|
|
12996
|
+
const parserOutputDigest = indexerEvidenceAdapterProtocolDigest(semanticExtractionPayload(extraction));
|
|
12997
|
+
return buildIndexerEvidenceAdapterResult({
|
|
12998
|
+
protocol: "context.indexer.evidence-adapter-result/v1",
|
|
12999
|
+
adapter: invocation.adapter,
|
|
13000
|
+
authorized_scope: invocation.authorized_scope,
|
|
13001
|
+
input_digest: invocation.input_digest,
|
|
13002
|
+
precedence: invocation.precedence,
|
|
13003
|
+
files,
|
|
13004
|
+
diagnostics,
|
|
13005
|
+
toolchain: [{
|
|
13006
|
+
step: "parse-source",
|
|
13007
|
+
package: invocation.adapter.package,
|
|
13008
|
+
export: invocation.adapter.export,
|
|
13009
|
+
version: invocation.adapter.version,
|
|
13010
|
+
digest: invocation.adapter.digest,
|
|
13011
|
+
capabilities: coverage.capabilities,
|
|
13012
|
+
input_digest: invocation.input_digest,
|
|
13013
|
+
output_digest: parserOutputDigest
|
|
13014
|
+
}]
|
|
13015
|
+
});
|
|
13016
|
+
}
|
|
13017
|
+
// ../../node_modules/.bun/eslint-visitor-keys@5.0.1/node_modules/eslint-visitor-keys/lib/visitor-keys.js
|
|
13018
|
+
var KEYS = {
|
|
13019
|
+
ArrayExpression: ["elements"],
|
|
13020
|
+
ArrayPattern: ["elements"],
|
|
13021
|
+
ArrowFunctionExpression: ["params", "body"],
|
|
13022
|
+
AssignmentExpression: ["left", "right"],
|
|
13023
|
+
AssignmentPattern: ["left", "right"],
|
|
13024
|
+
AwaitExpression: ["argument"],
|
|
13025
|
+
BinaryExpression: ["left", "right"],
|
|
13026
|
+
BlockStatement: ["body"],
|
|
13027
|
+
BreakStatement: ["label"],
|
|
13028
|
+
CallExpression: ["callee", "arguments"],
|
|
13029
|
+
CatchClause: ["param", "body"],
|
|
13030
|
+
ChainExpression: ["expression"],
|
|
13031
|
+
ClassBody: ["body"],
|
|
13032
|
+
ClassDeclaration: ["id", "superClass", "body"],
|
|
13033
|
+
ClassExpression: ["id", "superClass", "body"],
|
|
13034
|
+
ConditionalExpression: ["test", "consequent", "alternate"],
|
|
13035
|
+
ContinueStatement: ["label"],
|
|
13036
|
+
DebuggerStatement: [],
|
|
13037
|
+
DoWhileStatement: ["body", "test"],
|
|
13038
|
+
EmptyStatement: [],
|
|
13039
|
+
ExperimentalRestProperty: ["argument"],
|
|
13040
|
+
ExperimentalSpreadProperty: ["argument"],
|
|
13041
|
+
ExportAllDeclaration: ["exported", "source", "attributes"],
|
|
13042
|
+
ExportDefaultDeclaration: ["declaration"],
|
|
13043
|
+
ExportNamedDeclaration: [
|
|
13044
|
+
"declaration",
|
|
13045
|
+
"specifiers",
|
|
13046
|
+
"source",
|
|
13047
|
+
"attributes"
|
|
13048
|
+
],
|
|
13049
|
+
ExportSpecifier: ["local", "exported"],
|
|
13050
|
+
ExpressionStatement: ["expression"],
|
|
13051
|
+
ForInStatement: ["left", "right", "body"],
|
|
13052
|
+
ForOfStatement: ["left", "right", "body"],
|
|
13053
|
+
ForStatement: ["init", "test", "update", "body"],
|
|
13054
|
+
FunctionDeclaration: ["id", "params", "body"],
|
|
13055
|
+
FunctionExpression: ["id", "params", "body"],
|
|
13056
|
+
Identifier: [],
|
|
13057
|
+
IfStatement: ["test", "consequent", "alternate"],
|
|
13058
|
+
ImportAttribute: ["key", "value"],
|
|
13059
|
+
ImportDeclaration: ["specifiers", "source", "attributes"],
|
|
13060
|
+
ImportDefaultSpecifier: ["local"],
|
|
13061
|
+
ImportExpression: ["source", "options"],
|
|
13062
|
+
ImportNamespaceSpecifier: ["local"],
|
|
13063
|
+
ImportSpecifier: ["imported", "local"],
|
|
13064
|
+
JSXAttribute: ["name", "value"],
|
|
13065
|
+
JSXClosingElement: ["name"],
|
|
13066
|
+
JSXClosingFragment: [],
|
|
13067
|
+
JSXElement: ["openingElement", "children", "closingElement"],
|
|
13068
|
+
JSXEmptyExpression: [],
|
|
13069
|
+
JSXExpressionContainer: ["expression"],
|
|
13070
|
+
JSXFragment: ["openingFragment", "children", "closingFragment"],
|
|
13071
|
+
JSXIdentifier: [],
|
|
13072
|
+
JSXMemberExpression: ["object", "property"],
|
|
13073
|
+
JSXNamespacedName: ["namespace", "name"],
|
|
13074
|
+
JSXOpeningElement: ["name", "attributes"],
|
|
13075
|
+
JSXOpeningFragment: [],
|
|
13076
|
+
JSXSpreadAttribute: ["argument"],
|
|
13077
|
+
JSXSpreadChild: ["expression"],
|
|
13078
|
+
JSXText: [],
|
|
13079
|
+
LabeledStatement: ["label", "body"],
|
|
13080
|
+
Literal: [],
|
|
13081
|
+
LogicalExpression: ["left", "right"],
|
|
13082
|
+
MemberExpression: ["object", "property"],
|
|
13083
|
+
MetaProperty: ["meta", "property"],
|
|
13084
|
+
MethodDefinition: ["key", "value"],
|
|
13085
|
+
NewExpression: ["callee", "arguments"],
|
|
13086
|
+
ObjectExpression: ["properties"],
|
|
13087
|
+
ObjectPattern: ["properties"],
|
|
13088
|
+
PrivateIdentifier: [],
|
|
13089
|
+
Program: ["body"],
|
|
13090
|
+
Property: ["key", "value"],
|
|
13091
|
+
PropertyDefinition: ["key", "value"],
|
|
13092
|
+
RestElement: ["argument"],
|
|
13093
|
+
ReturnStatement: ["argument"],
|
|
13094
|
+
SequenceExpression: ["expressions"],
|
|
13095
|
+
SpreadElement: ["argument"],
|
|
13096
|
+
StaticBlock: ["body"],
|
|
13097
|
+
Super: [],
|
|
13098
|
+
SwitchCase: ["test", "consequent"],
|
|
13099
|
+
SwitchStatement: ["discriminant", "cases"],
|
|
13100
|
+
TaggedTemplateExpression: ["tag", "quasi"],
|
|
13101
|
+
TemplateElement: [],
|
|
13102
|
+
TemplateLiteral: ["quasis", "expressions"],
|
|
13103
|
+
ThisExpression: [],
|
|
13104
|
+
ThrowStatement: ["argument"],
|
|
13105
|
+
TryStatement: ["block", "handler", "finalizer"],
|
|
13106
|
+
UnaryExpression: ["argument"],
|
|
13107
|
+
UpdateExpression: ["argument"],
|
|
13108
|
+
VariableDeclaration: ["declarations"],
|
|
13109
|
+
VariableDeclarator: ["id", "init"],
|
|
13110
|
+
WhileStatement: ["test", "body"],
|
|
13111
|
+
WithStatement: ["object", "body"],
|
|
13112
|
+
YieldExpression: ["argument"]
|
|
13113
|
+
};
|
|
13114
|
+
var NODE_TYPES = Object.keys(KEYS);
|
|
13115
|
+
for (const type of NODE_TYPES) {
|
|
13116
|
+
Object.freeze(KEYS[type]);
|
|
13117
|
+
}
|
|
13118
|
+
Object.freeze(KEYS);
|
|
13119
|
+
var visitor_keys_default = KEYS;
|
|
13120
|
+
|
|
13121
|
+
// ../../node_modules/.bun/eslint-visitor-keys@5.0.1/node_modules/eslint-visitor-keys/lib/index.js
|
|
13122
|
+
var KEY_BLACKLIST = new Set([
|
|
13123
|
+
"parent",
|
|
13124
|
+
"leadingComments",
|
|
13125
|
+
"trailingComments"
|
|
13126
|
+
]);
|
|
13127
|
+
function unionWith(additionalKeys) {
|
|
13128
|
+
const retv = Object.assign({}, visitor_keys_default);
|
|
13129
|
+
for (const type of Object.keys(additionalKeys)) {
|
|
13130
|
+
if (Object.hasOwn(retv, type)) {
|
|
13131
|
+
const keys = new Set(additionalKeys[type]);
|
|
13132
|
+
for (const key of retv[type]) {
|
|
13133
|
+
keys.add(key);
|
|
13134
|
+
}
|
|
13135
|
+
retv[type] = Object.freeze(Array.from(keys));
|
|
13136
|
+
} else {
|
|
13137
|
+
retv[type] = Object.freeze(Array.from(additionalKeys[type]));
|
|
13138
|
+
}
|
|
13139
|
+
}
|
|
13140
|
+
return Object.freeze(retv);
|
|
13141
|
+
}
|
|
13142
|
+
|
|
13143
|
+
// ../../node_modules/.bun/toml-eslint-parser@1.0.3/node_modules/toml-eslint-parser/lib/index.mjs
|
|
13144
|
+
function last(arr) {
|
|
13145
|
+
return arr[arr.length - 1] ?? null;
|
|
13146
|
+
}
|
|
13147
|
+
var TOMLVerImpl = class {
|
|
13148
|
+
constructor(major, minor) {
|
|
13149
|
+
this.major = major;
|
|
13150
|
+
this.minor = minor;
|
|
13151
|
+
}
|
|
13152
|
+
lt(major, minor) {
|
|
13153
|
+
return this.major < major || this.major === major && this.minor < minor;
|
|
13154
|
+
}
|
|
13155
|
+
gte(major, minor) {
|
|
13156
|
+
return this.major > major || this.major === major && this.minor >= minor;
|
|
13157
|
+
}
|
|
13158
|
+
};
|
|
13159
|
+
var TOML_VERSION_1_0 = new TOMLVerImpl(1, 0);
|
|
13160
|
+
var TOML_VERSION_1_1 = new TOMLVerImpl(1, 1);
|
|
13161
|
+
var CodePoint = {
|
|
13162
|
+
EOF: -1,
|
|
13163
|
+
NULL: 0,
|
|
13164
|
+
SOH: 1,
|
|
13165
|
+
BACKSPACE: 8,
|
|
13166
|
+
TABULATION: 9,
|
|
13167
|
+
LINE_FEED: 10,
|
|
13168
|
+
FORM_FEED: 12,
|
|
13169
|
+
CARRIAGE_RETURN: 13,
|
|
13170
|
+
ESCAPE: 27,
|
|
13171
|
+
SO: 14,
|
|
13172
|
+
US: 31,
|
|
13173
|
+
SPACE: 32,
|
|
13174
|
+
QUOTATION_MARK: 34,
|
|
13175
|
+
HASH: 35,
|
|
13176
|
+
SINGLE_QUOTE: 39,
|
|
13177
|
+
PLUS_SIGN: 43,
|
|
13178
|
+
COMMA: 44,
|
|
13179
|
+
DASH: 45,
|
|
13180
|
+
DOT: 46,
|
|
13181
|
+
DIGIT_0: 48,
|
|
13182
|
+
DIGIT_1: 49,
|
|
13183
|
+
DIGIT_2: 50,
|
|
13184
|
+
DIGIT_3: 51,
|
|
13185
|
+
DIGIT_7: 55,
|
|
13186
|
+
DIGIT_9: 57,
|
|
13187
|
+
COLON: 58,
|
|
13188
|
+
EQUALS_SIGN: 61,
|
|
13189
|
+
LATIN_CAPITAL_A: 65,
|
|
13190
|
+
LATIN_CAPITAL_E: 69,
|
|
13191
|
+
LATIN_CAPITAL_F: 70,
|
|
13192
|
+
LATIN_CAPITAL_T: 84,
|
|
13193
|
+
LATIN_CAPITAL_U: 85,
|
|
13194
|
+
LATIN_CAPITAL_Z: 90,
|
|
13195
|
+
LEFT_BRACKET: 91,
|
|
13196
|
+
BACKSLASH: 92,
|
|
13197
|
+
RIGHT_BRACKET: 93,
|
|
13198
|
+
UNDERSCORE: 95,
|
|
13199
|
+
LATIN_SMALL_A: 97,
|
|
13200
|
+
LATIN_SMALL_B: 98,
|
|
13201
|
+
LATIN_SMALL_E: 101,
|
|
13202
|
+
LATIN_SMALL_F: 102,
|
|
13203
|
+
LATIN_SMALL_I: 105,
|
|
13204
|
+
LATIN_SMALL_L: 108,
|
|
13205
|
+
LATIN_SMALL_N: 110,
|
|
13206
|
+
LATIN_SMALL_O: 111,
|
|
13207
|
+
LATIN_SMALL_R: 114,
|
|
13208
|
+
LATIN_SMALL_S: 115,
|
|
13209
|
+
LATIN_SMALL_T: 116,
|
|
13210
|
+
LATIN_SMALL_U: 117,
|
|
13211
|
+
LATIN_SMALL_X: 120,
|
|
13212
|
+
LATIN_SMALL_Z: 122,
|
|
13213
|
+
LEFT_BRACE: 123,
|
|
13214
|
+
RIGHT_BRACE: 125,
|
|
13215
|
+
TILDE: 126,
|
|
13216
|
+
DELETE: 127,
|
|
13217
|
+
PAD: 128,
|
|
13218
|
+
SUPERSCRIPT_TWO: 178,
|
|
13219
|
+
SUPERSCRIPT_THREE: 179,
|
|
13220
|
+
SUPERSCRIPT_ONE: 185,
|
|
13221
|
+
VULGAR_FRACTION_ONE_QUARTER: 188,
|
|
13222
|
+
VULGAR_FRACTION_THREE_QUARTERS: 190,
|
|
13223
|
+
LATIN_CAPITAL_LETTER_A_WITH_GRAVE: 192,
|
|
13224
|
+
LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS: 214,
|
|
13225
|
+
LATIN_CAPITAL_LETTER_O_WITH_STROKE: 216,
|
|
13226
|
+
LATIN_SMALL_LETTER_O_WITH_DIAERESIS: 246,
|
|
13227
|
+
LATIN_SMALL_LETTER_O_WITH_STROKE: 248,
|
|
13228
|
+
GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL: 891,
|
|
13229
|
+
GREEK_CAPITAL_LETTER_YOT: 895,
|
|
13230
|
+
CP_1FFF: 8191,
|
|
13231
|
+
ZERO_WIDTH_NON_JOINER: 8204,
|
|
13232
|
+
ZERO_WIDTH_JOINER: 8205,
|
|
13233
|
+
UNDERTIE: 8255,
|
|
13234
|
+
CHARACTER_TIE: 8256,
|
|
13235
|
+
SUPERSCRIPT_ZERO: 8304,
|
|
13236
|
+
CP_218F: 8591,
|
|
13237
|
+
CIRCLED_DIGIT_ONE: 9312,
|
|
13238
|
+
NEGATIVE_CIRCLED_DIGIT_ZERO: 9471,
|
|
13239
|
+
GLAGOLITIC_CAPITAL_LETTER_AZU: 11264,
|
|
13240
|
+
CP_2FEF: 12271,
|
|
13241
|
+
IDEOGRAPHIC_COMMA: 12289,
|
|
13242
|
+
CP_D7FF: 55295,
|
|
13243
|
+
CP_E000: 57344,
|
|
13244
|
+
CJK_COMPATIBILITY_IDEOGRAPH_F900: 63744,
|
|
13245
|
+
ARABIC_LIGATURE_SALAAMUHU_ALAYNAA: 64975,
|
|
13246
|
+
ARABIC_LIGATURE_SALLA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM: 65008,
|
|
13247
|
+
REPLACEMENT_CHARACTER: 65533,
|
|
13248
|
+
LINEAR_B_SYLLABLE_B008_A: 65536,
|
|
13249
|
+
CP_EFFFF: 983039,
|
|
13250
|
+
CP_10FFFF: 1114111
|
|
13251
|
+
};
|
|
13252
|
+
var ESCAPES_1_0 = {
|
|
13253
|
+
[CodePoint.QUOTATION_MARK]: CodePoint.QUOTATION_MARK,
|
|
13254
|
+
[CodePoint.BACKSLASH]: CodePoint.BACKSLASH,
|
|
13255
|
+
[CodePoint.LATIN_SMALL_B]: CodePoint.BACKSPACE,
|
|
13256
|
+
[CodePoint.LATIN_SMALL_F]: CodePoint.FORM_FEED,
|
|
13257
|
+
[CodePoint.LATIN_SMALL_N]: CodePoint.LINE_FEED,
|
|
13258
|
+
[CodePoint.LATIN_SMALL_R]: CodePoint.CARRIAGE_RETURN,
|
|
13259
|
+
[CodePoint.LATIN_SMALL_T]: CodePoint.TABULATION
|
|
13260
|
+
};
|
|
13261
|
+
var ESCAPES_LATEST = {
|
|
13262
|
+
...ESCAPES_1_0,
|
|
13263
|
+
[CodePoint.LATIN_SMALL_E]: CodePoint.ESCAPE
|
|
13264
|
+
};
|
|
13265
|
+
var VALUE_KIND_VALUE = Symbol("VALUE_KIND_VALUE");
|
|
13266
|
+
var VALUE_KIND_INTERMEDIATE = Symbol("VALUE_KIND_INTERMEDIATE");
|
|
13267
|
+
var tomlKeys = {
|
|
13268
|
+
Program: ["body"],
|
|
13269
|
+
TOMLTopLevelTable: ["body"],
|
|
13270
|
+
TOMLTable: ["key", "body"],
|
|
13271
|
+
TOMLKeyValue: ["key", "value"],
|
|
13272
|
+
TOMLKey: ["keys"],
|
|
13273
|
+
TOMLArray: ["elements"],
|
|
13274
|
+
TOMLInlineTable: ["body"],
|
|
13275
|
+
TOMLBare: [],
|
|
13276
|
+
TOMLQuoted: [],
|
|
13277
|
+
TOMLValue: []
|
|
13278
|
+
};
|
|
13279
|
+
var KEYS2 = unionWith(tomlKeys);
|
|
13280
|
+
var getStaticTOMLValue = generateConvertTOMLValue((node2) => node2.value);
|
|
13281
|
+
function generateConvertTOMLValue(convertValue) {
|
|
13282
|
+
function resolveValue(node2, baseTable) {
|
|
13283
|
+
return resolver[node2.type](node2, baseTable);
|
|
13284
|
+
}
|
|
13285
|
+
const resolver = {
|
|
13286
|
+
Program(node2, baseTable = {}) {
|
|
13287
|
+
return resolveValue(node2.body[0], baseTable);
|
|
13288
|
+
},
|
|
13289
|
+
TOMLTopLevelTable(node2, baseTable = {}) {
|
|
13290
|
+
for (const body of node2.body)
|
|
13291
|
+
resolveValue(body, baseTable);
|
|
13292
|
+
return baseTable;
|
|
13293
|
+
},
|
|
13294
|
+
TOMLKeyValue(node2, baseTable = {}) {
|
|
13295
|
+
const value = resolveValue(node2.value);
|
|
13296
|
+
set(baseTable, resolveValue(node2.key), value);
|
|
13297
|
+
return baseTable;
|
|
13298
|
+
},
|
|
13299
|
+
TOMLTable(node2, baseTable = {}) {
|
|
13300
|
+
const table = getTable(baseTable, resolveValue(node2.key), node2.kind === "array");
|
|
13301
|
+
for (const body of node2.body)
|
|
13302
|
+
resolveValue(body, table);
|
|
13303
|
+
return baseTable;
|
|
13304
|
+
},
|
|
13305
|
+
TOMLArray(node2) {
|
|
13306
|
+
return node2.elements.map((e) => resolveValue(e));
|
|
13307
|
+
},
|
|
13308
|
+
TOMLInlineTable(node2) {
|
|
13309
|
+
const table = {};
|
|
13310
|
+
for (const body of node2.body)
|
|
13311
|
+
resolveValue(body, table);
|
|
13312
|
+
return table;
|
|
13313
|
+
},
|
|
13314
|
+
TOMLKey(node2) {
|
|
13315
|
+
return node2.keys.map((key) => resolveValue(key));
|
|
13316
|
+
},
|
|
13317
|
+
TOMLBare(node2) {
|
|
13318
|
+
return node2.name;
|
|
13319
|
+
},
|
|
13320
|
+
TOMLQuoted(node2) {
|
|
13321
|
+
return node2.value;
|
|
13322
|
+
},
|
|
13323
|
+
TOMLValue(node2) {
|
|
13324
|
+
return convertValue(node2);
|
|
13325
|
+
}
|
|
13326
|
+
};
|
|
13327
|
+
return (node2) => resolveValue(node2);
|
|
13328
|
+
}
|
|
13329
|
+
function getTable(baseTable, keys, array) {
|
|
13330
|
+
let target = baseTable;
|
|
13331
|
+
for (let index = 0;index < keys.length - 1; index++) {
|
|
13332
|
+
const key = keys[index];
|
|
13333
|
+
target = getNextTargetFromKey(target, key);
|
|
13334
|
+
}
|
|
13335
|
+
const lastKey = last(keys);
|
|
13336
|
+
const lastTarget = target[lastKey];
|
|
13337
|
+
if (lastTarget == null) {
|
|
13338
|
+
const tableValue$1 = {};
|
|
13339
|
+
target[lastKey] = array ? [tableValue$1] : tableValue$1;
|
|
13340
|
+
return tableValue$1;
|
|
13341
|
+
}
|
|
13342
|
+
if (isValue(lastTarget)) {
|
|
13343
|
+
const tableValue$1 = {};
|
|
13344
|
+
target[lastKey] = array ? [tableValue$1] : tableValue$1;
|
|
13345
|
+
return tableValue$1;
|
|
13346
|
+
}
|
|
13347
|
+
if (!array) {
|
|
13348
|
+
if (Array.isArray(lastTarget)) {
|
|
13349
|
+
const tableValue$1 = {};
|
|
13350
|
+
target[lastKey] = tableValue$1;
|
|
13351
|
+
return tableValue$1;
|
|
13352
|
+
}
|
|
13353
|
+
return lastTarget;
|
|
13354
|
+
}
|
|
13355
|
+
if (Array.isArray(lastTarget)) {
|
|
13356
|
+
const tableValue$1 = {};
|
|
13357
|
+
lastTarget.push(tableValue$1);
|
|
13358
|
+
return tableValue$1;
|
|
13359
|
+
}
|
|
13360
|
+
const tableValue = {};
|
|
13361
|
+
target[lastKey] = [tableValue];
|
|
13362
|
+
return tableValue;
|
|
13363
|
+
function getNextTargetFromKey(currTarget, key) {
|
|
13364
|
+
const nextTarget = currTarget[key];
|
|
13365
|
+
if (nextTarget == null) {
|
|
13366
|
+
const val = {};
|
|
13367
|
+
currTarget[key] = val;
|
|
13368
|
+
return val;
|
|
13369
|
+
}
|
|
13370
|
+
if (isValue(nextTarget)) {
|
|
13371
|
+
const val = {};
|
|
13372
|
+
currTarget[key] = val;
|
|
13373
|
+
return val;
|
|
13374
|
+
}
|
|
13375
|
+
let resultTarget = nextTarget;
|
|
13376
|
+
while (Array.isArray(resultTarget)) {
|
|
13377
|
+
const lastIndex = resultTarget.length - 1;
|
|
13378
|
+
const nextElement = resultTarget[lastIndex];
|
|
13379
|
+
if (isValue(nextElement)) {
|
|
13380
|
+
const val = {};
|
|
13381
|
+
resultTarget[lastIndex] = val;
|
|
13382
|
+
return val;
|
|
13383
|
+
}
|
|
13384
|
+
resultTarget = nextElement;
|
|
13385
|
+
}
|
|
13386
|
+
return resultTarget;
|
|
13387
|
+
}
|
|
13388
|
+
}
|
|
13389
|
+
function set(baseTable, keys, value) {
|
|
13390
|
+
let target = baseTable;
|
|
13391
|
+
for (let index = 0;index < keys.length - 1; index++) {
|
|
13392
|
+
const key = keys[index];
|
|
13393
|
+
const nextTarget = target[key];
|
|
13394
|
+
if (nextTarget == null) {
|
|
13395
|
+
const val = {};
|
|
13396
|
+
target[key] = val;
|
|
13397
|
+
target = val;
|
|
13398
|
+
} else if (isValue(nextTarget) || Array.isArray(nextTarget)) {
|
|
13399
|
+
const val = {};
|
|
13400
|
+
target[key] = val;
|
|
13401
|
+
target = val;
|
|
13402
|
+
} else
|
|
13403
|
+
target = nextTarget;
|
|
13404
|
+
}
|
|
13405
|
+
target[last(keys)] = value;
|
|
13406
|
+
}
|
|
13407
|
+
function isValue(value) {
|
|
13408
|
+
return typeof value !== "object" || value instanceof Date;
|
|
13409
|
+
}
|
|
13410
|
+
|
|
13411
|
+
// ../extract/src/configEvidenceParser.ts
|
|
13412
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
12319
13413
|
// ../extract/src/parser.ts
|
|
12320
|
-
import
|
|
13414
|
+
import * as WebTreeSitter from "web-tree-sitter";
|
|
12321
13415
|
import { existsSync } from "node:fs";
|
|
12322
13416
|
import { fileURLToPath } from "node:url";
|
|
13417
|
+
var treeSitterRuntime = WebTreeSitter;
|
|
13418
|
+
var Parser = treeSitterRuntime.default ?? treeSitterRuntime.Parser;
|
|
13419
|
+
if (!Parser) {
|
|
13420
|
+
throw new TypeError("web-tree-sitter runtime does not expose Parser");
|
|
13421
|
+
}
|
|
12323
13422
|
var parserInitPromise = null;
|
|
12324
13423
|
var parsedBytesSinceReset = 0;
|
|
12325
13424
|
var parserDead = false;
|
|
@@ -12329,9 +13428,13 @@ var createParserInstance = async () => {
|
|
|
12329
13428
|
const localWasm = resolveWasmPath("./wasm/tree-sitter.wasm");
|
|
12330
13429
|
const initOptions = existsSync(localWasm) ? { locateFile: (scriptName) => resolveWasmPath(`./wasm/${scriptName}`) } : undefined;
|
|
12331
13430
|
await Parser.init(initOptions);
|
|
13431
|
+
const LanguageRuntime = treeSitterRuntime.default?.Language ?? treeSitterRuntime.Language;
|
|
13432
|
+
if (!LanguageRuntime) {
|
|
13433
|
+
throw new TypeError("web-tree-sitter runtime does not expose Language after initialization");
|
|
13434
|
+
}
|
|
12332
13435
|
const parser = new Parser;
|
|
12333
|
-
const tsLanguage = await
|
|
12334
|
-
const tsxLanguage = await
|
|
13436
|
+
const tsLanguage = await LanguageRuntime.load(resolveWasmPath("./wasm/tree-sitter-typescript.wasm"));
|
|
13437
|
+
const tsxLanguage = await LanguageRuntime.load(resolveWasmPath("./wasm/tree-sitter-tsx.wasm"));
|
|
12335
13438
|
return { parser, tsLanguage, tsxLanguage };
|
|
12336
13439
|
};
|
|
12337
13440
|
var initParser = async () => {
|
|
@@ -12382,6 +13485,363 @@ var parseFile = async (source, isTsx) => {
|
|
|
12382
13485
|
return null;
|
|
12383
13486
|
}
|
|
12384
13487
|
};
|
|
13488
|
+
// src/commonJsModule.ts
|
|
13489
|
+
import ts2 from "typescript";
|
|
13490
|
+
|
|
13491
|
+
// src/typescriptAst.ts
|
|
13492
|
+
import ts from "typescript";
|
|
13493
|
+
var scriptKind = (filePath) => {
|
|
13494
|
+
const lower = filePath.toLowerCase();
|
|
13495
|
+
if (lower.endsWith(".tsx"))
|
|
13496
|
+
return ts.ScriptKind.TSX;
|
|
13497
|
+
if (lower.endsWith(".jsx"))
|
|
13498
|
+
return ts.ScriptKind.JSX;
|
|
13499
|
+
if (lower.endsWith(".js") || lower.endsWith(".mjs") || lower.endsWith(".cjs")) {
|
|
13500
|
+
return ts.ScriptKind.JS;
|
|
13501
|
+
}
|
|
13502
|
+
return ts.ScriptKind.TS;
|
|
13503
|
+
};
|
|
13504
|
+
var createEcmaScriptSourceFile = (source, filePath) => ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true, scriptKind(filePath));
|
|
13505
|
+
var syntaxDiagnostics = (sourceFile) => {
|
|
13506
|
+
const diagnostics = sourceFile.parseDiagnostics ?? [];
|
|
13507
|
+
return diagnostics.map((diagnostic) => {
|
|
13508
|
+
const start = diagnostic.start ?? 0;
|
|
13509
|
+
const position = sourceFile.getLineAndCharacterOfPosition(start);
|
|
13510
|
+
return {
|
|
13511
|
+
code: "ecmascript-syntax-error",
|
|
13512
|
+
severity: "error",
|
|
13513
|
+
file: sourceFile.fileName,
|
|
13514
|
+
line: position.line + 1,
|
|
13515
|
+
column: position.character + 1
|
|
13516
|
+
};
|
|
13517
|
+
});
|
|
13518
|
+
};
|
|
13519
|
+
var nodeLocation = (sourceFile, node2) => {
|
|
13520
|
+
const start = sourceFile.getLineAndCharacterOfPosition(node2.getStart(sourceFile));
|
|
13521
|
+
const end = sourceFile.getLineAndCharacterOfPosition(node2.getEnd());
|
|
13522
|
+
return {
|
|
13523
|
+
line: start.line + 1,
|
|
13524
|
+
column: start.character + 1,
|
|
13525
|
+
endLine: end.line + 1
|
|
13526
|
+
};
|
|
13527
|
+
};
|
|
13528
|
+
var staticStringValue = (node2) => {
|
|
13529
|
+
if (!node2)
|
|
13530
|
+
return null;
|
|
13531
|
+
if (ts.isStringLiteral(node2) || ts.isNoSubstitutionTemplateLiteral(node2))
|
|
13532
|
+
return node2.text;
|
|
13533
|
+
return null;
|
|
13534
|
+
};
|
|
13535
|
+
|
|
13536
|
+
// src/commonJsModule.ts
|
|
13537
|
+
var requireCall = (node2) => ts2.isCallExpression(node2) && ts2.isIdentifier(node2.expression) && node2.expression.text === "require" ? node2 : null;
|
|
13538
|
+
var requireReference = (node2) => {
|
|
13539
|
+
const direct = requireCall(node2);
|
|
13540
|
+
if (direct) {
|
|
13541
|
+
const source = staticStringValue(direct.arguments[0]);
|
|
13542
|
+
return source ? { source, importedName: "*" } : null;
|
|
13543
|
+
}
|
|
13544
|
+
if (ts2.isPropertyAccessExpression(node2)) {
|
|
13545
|
+
const call = requireCall(node2.expression);
|
|
13546
|
+
const source = call ? staticStringValue(call.arguments[0]) : null;
|
|
13547
|
+
return source ? { source, importedName: node2.name.text } : null;
|
|
13548
|
+
}
|
|
13549
|
+
if (ts2.isElementAccessExpression(node2)) {
|
|
13550
|
+
const call = requireCall(node2.expression);
|
|
13551
|
+
const source = call ? staticStringValue(call.arguments[0]) : null;
|
|
13552
|
+
const importedName = staticStringValue(node2.argumentExpression);
|
|
13553
|
+
return source && importedName ? { source, importedName } : null;
|
|
13554
|
+
}
|
|
13555
|
+
return null;
|
|
13556
|
+
};
|
|
13557
|
+
var isModuleExports = (node2) => {
|
|
13558
|
+
if (ts2.isPropertyAccessExpression(node2) && ts2.isIdentifier(node2.expression) && node2.expression.text === "module" && node2.name.text === "exports")
|
|
13559
|
+
return true;
|
|
13560
|
+
return ts2.isElementAccessExpression(node2) && ts2.isIdentifier(node2.expression) && node2.expression.text === "module" && staticStringValue(node2.argumentExpression) === "exports";
|
|
13561
|
+
};
|
|
13562
|
+
var isExportsObject = (node2) => ts2.isIdentifier(node2) && node2.text === "exports" || isModuleExports(node2);
|
|
13563
|
+
var isUnsupportedExportMutationCall = (node2) => {
|
|
13564
|
+
if (ts2.isPropertyAccessExpression(node2.expression) && ts2.isIdentifier(node2.expression.expression) && node2.expression.expression.text === "Object" && ["assign", "defineProperties", "defineProperty"].includes(node2.expression.name.text) && node2.arguments[0] && isExportsObject(node2.arguments[0])) {
|
|
13565
|
+
return !(node2.expression.name.text === "defineProperty" && staticStringValue(node2.arguments[1]) === "__esModule");
|
|
13566
|
+
}
|
|
13567
|
+
return ts2.isIdentifier(node2.expression) && ["__createBinding", "__export", "__exportStar"].includes(node2.expression.text) && node2.arguments.some(isExportsObject);
|
|
13568
|
+
};
|
|
13569
|
+
var commonJsExportTarget = (node2) => {
|
|
13570
|
+
if (ts2.isPropertyAccessExpression(node2)) {
|
|
13571
|
+
if (ts2.isIdentifier(node2.expression) && node2.expression.text === "exports") {
|
|
13572
|
+
return { kind: "named", exportedName: node2.name.text };
|
|
13573
|
+
}
|
|
13574
|
+
if (isModuleExports(node2.expression)) {
|
|
13575
|
+
return { kind: "named", exportedName: node2.name.text };
|
|
13576
|
+
}
|
|
13577
|
+
if (isModuleExports(node2))
|
|
13578
|
+
return { kind: "whole" };
|
|
13579
|
+
}
|
|
13580
|
+
if (ts2.isElementAccessExpression(node2)) {
|
|
13581
|
+
const property = staticStringValue(node2.argumentExpression);
|
|
13582
|
+
if (ts2.isIdentifier(node2.expression) && node2.expression.text === "exports" && property) {
|
|
13583
|
+
return { kind: "named", exportedName: property };
|
|
13584
|
+
}
|
|
13585
|
+
if (isModuleExports(node2.expression) && property) {
|
|
13586
|
+
return { kind: "named", exportedName: property };
|
|
13587
|
+
}
|
|
13588
|
+
if (isModuleExports(node2))
|
|
13589
|
+
return { kind: "whole" };
|
|
13590
|
+
}
|
|
13591
|
+
return null;
|
|
13592
|
+
};
|
|
13593
|
+
var localReference = (expression, bindings) => {
|
|
13594
|
+
if (ts2.isIdentifier(expression)) {
|
|
13595
|
+
const binding = bindings.get(expression.text);
|
|
13596
|
+
if (binding) {
|
|
13597
|
+
return {
|
|
13598
|
+
source: binding.source,
|
|
13599
|
+
importedName: binding.importedName
|
|
13600
|
+
};
|
|
13601
|
+
}
|
|
13602
|
+
return { localName: expression.text };
|
|
13603
|
+
}
|
|
13604
|
+
if (ts2.isPropertyAccessExpression(expression) && ts2.isIdentifier(expression.expression)) {
|
|
13605
|
+
const binding = bindings.get(expression.expression.text);
|
|
13606
|
+
if (binding)
|
|
13607
|
+
return { source: binding.source, importedName: expression.name.text };
|
|
13608
|
+
}
|
|
13609
|
+
const required = requireReference(expression);
|
|
13610
|
+
return required ? { source: required.source, importedName: required.importedName } : null;
|
|
13611
|
+
};
|
|
13612
|
+
var syntheticDeclaration = (name, expression, sourceFile) => {
|
|
13613
|
+
const location = nodeLocation(sourceFile, expression);
|
|
13614
|
+
if (ts2.isFunctionExpression(expression) || ts2.isArrowFunction(expression)) {
|
|
13615
|
+
return {
|
|
13616
|
+
name,
|
|
13617
|
+
kind: "function",
|
|
13618
|
+
line: location.line,
|
|
13619
|
+
endLine: location.endLine,
|
|
13620
|
+
params: expression.parameters.map((parameter) => parameter.name.getText(sourceFile))
|
|
13621
|
+
};
|
|
13622
|
+
}
|
|
13623
|
+
if (ts2.isClassExpression(expression)) {
|
|
13624
|
+
return { name, kind: "class", line: location.line, endLine: location.endLine, params: [] };
|
|
13625
|
+
}
|
|
13626
|
+
if (ts2.isObjectLiteralExpression(expression) || ts2.isArrayLiteralExpression(expression) || ts2.isLiteralExpression(expression)) {
|
|
13627
|
+
return { name, kind: "variable", line: location.line, endLine: location.endLine, params: [] };
|
|
13628
|
+
}
|
|
13629
|
+
return null;
|
|
13630
|
+
};
|
|
13631
|
+
var pushExport = (result, exportedName, expression, line, bindings, sourceFile) => {
|
|
13632
|
+
const reference = localReference(expression, bindings);
|
|
13633
|
+
if (reference) {
|
|
13634
|
+
result.exports.push({ exportedName, ...reference, line });
|
|
13635
|
+
return true;
|
|
13636
|
+
}
|
|
13637
|
+
const synthetic = syntheticDeclaration(exportedName, expression, sourceFile);
|
|
13638
|
+
if (synthetic) {
|
|
13639
|
+
result.syntheticDeclarations.push(synthetic);
|
|
13640
|
+
result.exports.push({ exportedName, localName: exportedName, line });
|
|
13641
|
+
return true;
|
|
13642
|
+
}
|
|
13643
|
+
return false;
|
|
13644
|
+
};
|
|
13645
|
+
var appendUnsupportedExportDiagnostic = (result, sourceFile, node2) => {
|
|
13646
|
+
const location = nodeLocation(sourceFile, node2);
|
|
13647
|
+
if (result.diagnostics.some((diagnostic) => diagnostic.code === "dynamic-commonjs-require" && diagnostic.line === location.line && diagnostic.column === location.column))
|
|
13648
|
+
return;
|
|
13649
|
+
result.diagnostics.push({
|
|
13650
|
+
code: "unsupported-commonjs-export-expression",
|
|
13651
|
+
severity: "error",
|
|
13652
|
+
file: sourceFile.fileName,
|
|
13653
|
+
line: location.line,
|
|
13654
|
+
column: location.column
|
|
13655
|
+
});
|
|
13656
|
+
};
|
|
13657
|
+
var collectBindings = (sourceFile) => {
|
|
13658
|
+
const bindings = [];
|
|
13659
|
+
for (const statement of sourceFile.statements) {
|
|
13660
|
+
if (!ts2.isVariableStatement(statement))
|
|
13661
|
+
continue;
|
|
13662
|
+
for (const declaration of statement.declarationList.declarations) {
|
|
13663
|
+
if (!declaration.initializer)
|
|
13664
|
+
continue;
|
|
13665
|
+
const line = nodeLocation(sourceFile, declaration).line;
|
|
13666
|
+
if (ts2.isIdentifier(declaration.name)) {
|
|
13667
|
+
const reference = requireReference(declaration.initializer);
|
|
13668
|
+
if (reference)
|
|
13669
|
+
bindings.push({ localName: declaration.name.text, ...reference, line });
|
|
13670
|
+
continue;
|
|
13671
|
+
}
|
|
13672
|
+
const direct = requireCall(declaration.initializer);
|
|
13673
|
+
const source = direct ? staticStringValue(direct.arguments[0]) : null;
|
|
13674
|
+
if (!source || !ts2.isObjectBindingPattern(declaration.name))
|
|
13675
|
+
continue;
|
|
13676
|
+
for (const element of declaration.name.elements) {
|
|
13677
|
+
if (!ts2.isIdentifier(element.name))
|
|
13678
|
+
continue;
|
|
13679
|
+
const importedName = element.propertyName?.getText(sourceFile) ?? element.name.text;
|
|
13680
|
+
bindings.push({ localName: element.name.text, source, importedName, line });
|
|
13681
|
+
}
|
|
13682
|
+
}
|
|
13683
|
+
}
|
|
13684
|
+
return bindings;
|
|
13685
|
+
};
|
|
13686
|
+
var collectDynamicDiagnostics = (sourceFile) => {
|
|
13687
|
+
const diagnostics = [];
|
|
13688
|
+
const visit = (node2) => {
|
|
13689
|
+
if (ts2.isCallExpression(node2) && ts2.isIdentifier(node2.expression) && node2.expression.text === "require") {
|
|
13690
|
+
if (staticStringValue(node2.arguments[0]) === null) {
|
|
13691
|
+
const location = nodeLocation(sourceFile, node2);
|
|
13692
|
+
diagnostics.push({
|
|
13693
|
+
code: "dynamic-commonjs-require",
|
|
13694
|
+
severity: "error",
|
|
13695
|
+
file: sourceFile.fileName,
|
|
13696
|
+
line: location.line,
|
|
13697
|
+
column: location.column
|
|
13698
|
+
});
|
|
13699
|
+
}
|
|
13700
|
+
}
|
|
13701
|
+
if (ts2.isCallExpression(node2) && isUnsupportedExportMutationCall(node2)) {
|
|
13702
|
+
const location = nodeLocation(sourceFile, node2);
|
|
13703
|
+
diagnostics.push({
|
|
13704
|
+
code: "unsupported-commonjs-export-form",
|
|
13705
|
+
severity: "error",
|
|
13706
|
+
file: sourceFile.fileName,
|
|
13707
|
+
line: location.line,
|
|
13708
|
+
column: location.column
|
|
13709
|
+
});
|
|
13710
|
+
}
|
|
13711
|
+
if (ts2.isBinaryExpression(node2) && node2.operatorToken.kind === ts2.SyntaxKind.EqualsToken) {
|
|
13712
|
+
if (ts2.isElementAccessExpression(node2.left)) {
|
|
13713
|
+
const isCommonJsTarget = ts2.isIdentifier(node2.left.expression) && node2.left.expression.text === "exports" || isModuleExports(node2.left.expression) || isModuleExports(node2.left);
|
|
13714
|
+
if (isCommonJsTarget && commonJsExportTarget(node2.left) === null) {
|
|
13715
|
+
const location = nodeLocation(sourceFile, node2.left);
|
|
13716
|
+
diagnostics.push({
|
|
13717
|
+
code: "dynamic-commonjs-export",
|
|
13718
|
+
severity: "error",
|
|
13719
|
+
file: sourceFile.fileName,
|
|
13720
|
+
line: location.line,
|
|
13721
|
+
column: location.column
|
|
13722
|
+
});
|
|
13723
|
+
}
|
|
13724
|
+
}
|
|
13725
|
+
}
|
|
13726
|
+
ts2.forEachChild(node2, visit);
|
|
13727
|
+
};
|
|
13728
|
+
visit(sourceFile);
|
|
13729
|
+
return diagnostics;
|
|
13730
|
+
};
|
|
13731
|
+
var analyzeCommonJsModule = (source, filePath) => {
|
|
13732
|
+
const sourceFile = createEcmaScriptSourceFile(source, filePath);
|
|
13733
|
+
const bindings = collectBindings(sourceFile);
|
|
13734
|
+
const bindingMap = new Map(bindings.map((binding) => [binding.localName, binding]));
|
|
13735
|
+
const result = {
|
|
13736
|
+
bindings,
|
|
13737
|
+
exports: [],
|
|
13738
|
+
wildcardSources: [],
|
|
13739
|
+
syntheticDeclarations: [],
|
|
13740
|
+
diagnostics: collectDynamicDiagnostics(sourceFile)
|
|
13741
|
+
};
|
|
13742
|
+
for (const statement of sourceFile.statements) {
|
|
13743
|
+
if (!ts2.isExpressionStatement(statement) || !ts2.isBinaryExpression(statement.expression))
|
|
13744
|
+
continue;
|
|
13745
|
+
const assignment = statement.expression;
|
|
13746
|
+
if (assignment.operatorToken.kind !== ts2.SyntaxKind.EqualsToken)
|
|
13747
|
+
continue;
|
|
13748
|
+
const target = commonJsExportTarget(assignment.left);
|
|
13749
|
+
if (!target)
|
|
13750
|
+
continue;
|
|
13751
|
+
const line = nodeLocation(sourceFile, assignment).line;
|
|
13752
|
+
if (target.kind === "named") {
|
|
13753
|
+
if (!pushExport(result, target.exportedName, assignment.right, line, bindingMap, sourceFile)) {
|
|
13754
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, assignment.right);
|
|
13755
|
+
}
|
|
13756
|
+
continue;
|
|
13757
|
+
}
|
|
13758
|
+
const directRequire = requireReference(assignment.right);
|
|
13759
|
+
if (directRequire?.importedName === "*") {
|
|
13760
|
+
result.wildcardSources.push(directRequire.source);
|
|
13761
|
+
continue;
|
|
13762
|
+
}
|
|
13763
|
+
if (ts2.isObjectLiteralExpression(assignment.right)) {
|
|
13764
|
+
for (const property of assignment.right.properties) {
|
|
13765
|
+
if (ts2.isShorthandPropertyAssignment(property)) {
|
|
13766
|
+
pushExport(result, property.name.text, property.name, line, bindingMap, sourceFile);
|
|
13767
|
+
continue;
|
|
13768
|
+
}
|
|
13769
|
+
if (ts2.isPropertyAssignment(property)) {
|
|
13770
|
+
const name = property.name && (ts2.isIdentifier(property.name) || ts2.isStringLiteral(property.name)) ? property.name.text : null;
|
|
13771
|
+
if (name) {
|
|
13772
|
+
if (!pushExport(result, name, property.initializer, line, bindingMap, sourceFile)) {
|
|
13773
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, property.initializer);
|
|
13774
|
+
}
|
|
13775
|
+
} else {
|
|
13776
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, property);
|
|
13777
|
+
}
|
|
13778
|
+
continue;
|
|
13779
|
+
}
|
|
13780
|
+
if (ts2.isMethodDeclaration(property) && property.name && ts2.isIdentifier(property.name)) {
|
|
13781
|
+
const location = nodeLocation(sourceFile, property);
|
|
13782
|
+
result.syntheticDeclarations.push({
|
|
13783
|
+
name: property.name.text,
|
|
13784
|
+
kind: "function",
|
|
13785
|
+
line: location.line,
|
|
13786
|
+
endLine: location.endLine,
|
|
13787
|
+
params: property.parameters.map((parameter) => parameter.name.getText(sourceFile))
|
|
13788
|
+
});
|
|
13789
|
+
result.exports.push({
|
|
13790
|
+
exportedName: property.name.text,
|
|
13791
|
+
localName: property.name.text,
|
|
13792
|
+
line
|
|
13793
|
+
});
|
|
13794
|
+
continue;
|
|
13795
|
+
}
|
|
13796
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, property);
|
|
13797
|
+
}
|
|
13798
|
+
continue;
|
|
13799
|
+
}
|
|
13800
|
+
if (ts2.isIdentifier(assignment.right)) {
|
|
13801
|
+
const binding = bindingMap.get(assignment.right.text);
|
|
13802
|
+
if (binding?.importedName === "*") {
|
|
13803
|
+
result.wildcardSources.push(binding.source);
|
|
13804
|
+
continue;
|
|
13805
|
+
}
|
|
13806
|
+
if (!pushExport(result, assignment.right.text, assignment.right, line, bindingMap, sourceFile)) {
|
|
13807
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, assignment.right);
|
|
13808
|
+
}
|
|
13809
|
+
continue;
|
|
13810
|
+
}
|
|
13811
|
+
if (!pushExport(result, "default", assignment.right, line, bindingMap, sourceFile)) {
|
|
13812
|
+
appendUnsupportedExportDiagnostic(result, sourceFile, assignment.right);
|
|
13813
|
+
}
|
|
13814
|
+
}
|
|
13815
|
+
result.bindings.sort((left, right) => left.localName.localeCompare(right.localName));
|
|
13816
|
+
result.exports.sort((left, right) => left.exportedName.localeCompare(right.exportedName) || left.line - right.line);
|
|
13817
|
+
result.wildcardSources = [...new Set(result.wildcardSources)].sort();
|
|
13818
|
+
result.syntheticDeclarations.sort((left, right) => left.name.localeCompare(right.name));
|
|
13819
|
+
result.diagnostics.sort((left, right) => left.line - right.line || left.column - right.column);
|
|
13820
|
+
return result;
|
|
13821
|
+
};
|
|
13822
|
+
|
|
13823
|
+
// src/commonJsExportTrace.ts
|
|
13824
|
+
var traceCommonJsExports = async (input) => {
|
|
13825
|
+
const traced = [];
|
|
13826
|
+
for (const item of input.analysis.exports) {
|
|
13827
|
+
if (item.localName && input.localDeclarations.has(item.localName)) {
|
|
13828
|
+
traced.push({
|
|
13829
|
+
exportedName: item.exportedName,
|
|
13830
|
+
localName: item.localName,
|
|
13831
|
+
declarationFile: input.filePath
|
|
13832
|
+
});
|
|
13833
|
+
continue;
|
|
13834
|
+
}
|
|
13835
|
+
if (item.source && item.importedName) {
|
|
13836
|
+
traced.push(...await input.traceImported(item.source, item.importedName, item.exportedName));
|
|
13837
|
+
}
|
|
13838
|
+
}
|
|
13839
|
+
for (const source of input.analysis.wildcardSources) {
|
|
13840
|
+
traced.push(...await input.traceWildcard(source));
|
|
13841
|
+
}
|
|
13842
|
+
return traced;
|
|
13843
|
+
};
|
|
13844
|
+
|
|
12385
13845
|
// src/exportTracer.ts
|
|
12386
13846
|
var DECLARATION_TYPES = new Set([
|
|
12387
13847
|
"function_declaration",
|
|
@@ -12499,12 +13959,24 @@ var traceFile = async (filePath, fs, state) => {
|
|
|
12499
13959
|
state.inFlight.add(filePath);
|
|
12500
13960
|
state.files.add(filePath);
|
|
12501
13961
|
const source = await fs.readFile(filePath);
|
|
12502
|
-
const
|
|
13962
|
+
const commonJs = analyzeCommonJsModule(source, filePath);
|
|
13963
|
+
if (commonJs.diagnostics.length > 0)
|
|
13964
|
+
return [];
|
|
13965
|
+
const tree = await parseFile(source, isJsxLikePath(filePath));
|
|
12503
13966
|
if (!tree)
|
|
12504
13967
|
return [];
|
|
12505
13968
|
const root = tree.rootNode;
|
|
12506
13969
|
const localDeclarations = collectLocalDeclarations(root);
|
|
12507
13970
|
const importBindings = collectImportBindings(root);
|
|
13971
|
+
for (const declaration of commonJs.syntheticDeclarations) {
|
|
13972
|
+
localDeclarations.set(declaration.name, declaration.name);
|
|
13973
|
+
}
|
|
13974
|
+
for (const binding of commonJs.bindings) {
|
|
13975
|
+
importBindings.set(binding.localName, {
|
|
13976
|
+
source: binding.source,
|
|
13977
|
+
importedName: binding.importedName
|
|
13978
|
+
});
|
|
13979
|
+
}
|
|
12508
13980
|
const exportsList = [];
|
|
12509
13981
|
for (const node2 of root.namedChildren) {
|
|
12510
13982
|
if (node2.type !== "export_statement")
|
|
@@ -12576,6 +14048,16 @@ var traceFile = async (filePath, fs, state) => {
|
|
|
12576
14048
|
});
|
|
12577
14049
|
}
|
|
12578
14050
|
}
|
|
14051
|
+
exportsList.push(...await traceCommonJsExports({
|
|
14052
|
+
analysis: commonJs,
|
|
14053
|
+
filePath,
|
|
14054
|
+
localDeclarations,
|
|
14055
|
+
traceImported: (source2, importedName, exportedName) => traceImportedBinding(filePath, { source: source2, importedName }, exportedName, fs, state),
|
|
14056
|
+
traceWildcard: async (source2) => {
|
|
14057
|
+
const targetPath = await resolveImportSourcePath(filePath, source2, fs, state.resolver);
|
|
14058
|
+
return targetPath ? traceFile(targetPath, fs, state) : [];
|
|
14059
|
+
}
|
|
14060
|
+
}));
|
|
12579
14061
|
state.inFlight.delete(filePath);
|
|
12580
14062
|
return uniqueExports(exportsList);
|
|
12581
14063
|
})();
|
|
@@ -12631,8 +14113,7 @@ var BUILTIN_TYPES = new Set([
|
|
|
12631
14113
|
var countLines = (source) => {
|
|
12632
14114
|
if (!source)
|
|
12633
14115
|
return 0;
|
|
12634
|
-
|
|
12635
|
-
return parts[parts.length - 1] === "" ? parts.length - 1 : parts.length;
|
|
14116
|
+
return source.split(/\r\n|\r|\n/).filter((line) => line.trim().length > 0).length;
|
|
12636
14117
|
};
|
|
12637
14118
|
var createRelation = (type, from, to, isExternal, line) => ({
|
|
12638
14119
|
type,
|
|
@@ -12728,7 +14209,7 @@ var appendTypeRelations = (relations, relationType, from, typeText, importBindin
|
|
|
12728
14209
|
}
|
|
12729
14210
|
};
|
|
12730
14211
|
var classifyVariable = (name, filePath) => {
|
|
12731
|
-
if (filePath.endsWith(".tsx") && /^[A-Z]/.test(name)) {
|
|
14212
|
+
if ((filePath.endsWith(".tsx") || filePath.endsWith(".jsx")) && /^[A-Z]/.test(name)) {
|
|
12732
14213
|
return "component" /* Component */;
|
|
12733
14214
|
}
|
|
12734
14215
|
return "variable" /* Variable */;
|
|
@@ -12888,6 +14369,146 @@ var findObjectTypeNodes = (node2) => {
|
|
|
12888
14369
|
return [];
|
|
12889
14370
|
};
|
|
12890
14371
|
|
|
14372
|
+
// src/staticCallRelations.ts
|
|
14373
|
+
import ts3 from "typescript";
|
|
14374
|
+
var callTarget = (expression, sourceFile) => {
|
|
14375
|
+
if (ts3.isIdentifier(expression))
|
|
14376
|
+
return expression.text === "require" ? null : expression.text;
|
|
14377
|
+
if (ts3.isPropertyAccessExpression(expression))
|
|
14378
|
+
return expression.getText(sourceFile).replace(/\s+/gu, "");
|
|
14379
|
+
if (ts3.isElementAccessExpression(expression)) {
|
|
14380
|
+
const property = staticStringValue(expression.argumentExpression);
|
|
14381
|
+
return property ? `${expression.expression.getText(sourceFile).replace(/\s+/gu, "")}.${property}` : null;
|
|
14382
|
+
}
|
|
14383
|
+
return null;
|
|
14384
|
+
};
|
|
14385
|
+
var rootIdentifier = (expression) => {
|
|
14386
|
+
let current = expression;
|
|
14387
|
+
while (ts3.isPropertyAccessExpression(current) || ts3.isElementAccessExpression(current)) {
|
|
14388
|
+
current = current.expression;
|
|
14389
|
+
}
|
|
14390
|
+
return ts3.isIdentifier(current) ? current.text : null;
|
|
14391
|
+
};
|
|
14392
|
+
var declarationName = (node2, sourceFile) => {
|
|
14393
|
+
if (ts3.isFunctionDeclaration(node2) && node2.name)
|
|
14394
|
+
return node2.name.text;
|
|
14395
|
+
if (ts3.isClassDeclaration(node2) && node2.name)
|
|
14396
|
+
return node2.name.text;
|
|
14397
|
+
if (ts3.isVariableDeclaration(node2) && ts3.isIdentifier(node2.name))
|
|
14398
|
+
return node2.name.text;
|
|
14399
|
+
if (ts3.isMethodDeclaration(node2) || ts3.isGetAccessorDeclaration(node2) || ts3.isSetAccessorDeclaration(node2)) {
|
|
14400
|
+
const parent = node2.parent;
|
|
14401
|
+
if (parent && ts3.isClassDeclaration(parent) && parent.name)
|
|
14402
|
+
return parent.name.text;
|
|
14403
|
+
return node2.name?.getText(sourceFile) ?? null;
|
|
14404
|
+
}
|
|
14405
|
+
return null;
|
|
14406
|
+
};
|
|
14407
|
+
var collectStaticCallRelations = (source, filePath, importBindings) => {
|
|
14408
|
+
const sourceFile = createEcmaScriptSourceFile(source, filePath);
|
|
14409
|
+
const relations = [];
|
|
14410
|
+
const visit = (node2, owner) => {
|
|
14411
|
+
const namedOwner = declarationName(node2, sourceFile) ?? owner;
|
|
14412
|
+
if (ts3.isCallExpression(node2) || ts3.isNewExpression(node2)) {
|
|
14413
|
+
const target = callTarget(node2.expression, sourceFile);
|
|
14414
|
+
if (target) {
|
|
14415
|
+
const root = rootIdentifier(node2.expression);
|
|
14416
|
+
const isExternal = root ? importBindings.get(root)?.isExternal ?? false : false;
|
|
14417
|
+
relations.push(createRelation("calls" /* Calls */, namedOwner, target, isExternal, nodeLocation(sourceFile, node2).line));
|
|
14418
|
+
}
|
|
14419
|
+
}
|
|
14420
|
+
ts3.forEachChild(node2, (child) => visit(child, namedOwner));
|
|
14421
|
+
};
|
|
14422
|
+
visit(sourceFile, filePath);
|
|
14423
|
+
const seen = new Set;
|
|
14424
|
+
return relations.sort((left, right) => (left.line ?? 0) - (right.line ?? 0) || left.from.localeCompare(right.from) || left.to.localeCompare(right.to)).filter((relation) => {
|
|
14425
|
+
const key = `${relation.from}\x00${relation.to}\x00${relation.line ?? 0}`;
|
|
14426
|
+
if (seen.has(key))
|
|
14427
|
+
return false;
|
|
14428
|
+
seen.add(key);
|
|
14429
|
+
return true;
|
|
14430
|
+
});
|
|
14431
|
+
};
|
|
14432
|
+
|
|
14433
|
+
// src/symbolExtractorImports.ts
|
|
14434
|
+
var esmImportParts = (node2, bindings, isExternal, statementTypeOnly) => {
|
|
14435
|
+
let hasValueImport = !statementTypeOnly;
|
|
14436
|
+
let hasTypeImport = statementTypeOnly;
|
|
14437
|
+
const clause = node2.namedChildren.find((child) => child.type === "import_clause");
|
|
14438
|
+
for (const part of clause?.namedChildren ?? []) {
|
|
14439
|
+
if (part.type === "identifier") {
|
|
14440
|
+
bindings.set(part.text, { isExternal, typeOnly: statementTypeOnly });
|
|
14441
|
+
continue;
|
|
14442
|
+
}
|
|
14443
|
+
if (part.type === "namespace_import") {
|
|
14444
|
+
const identifier = part.namedChildren.find((child) => child.type === "identifier");
|
|
14445
|
+
if (identifier)
|
|
14446
|
+
bindings.set(identifier.text, { isExternal, typeOnly: statementTypeOnly });
|
|
14447
|
+
continue;
|
|
14448
|
+
}
|
|
14449
|
+
if (part.type !== "named_imports")
|
|
14450
|
+
continue;
|
|
14451
|
+
for (const specifierNode of part.namedChildren.filter((child) => child.type === "import_specifier")) {
|
|
14452
|
+
const identifiers = specifierNode.namedChildren.filter((child) => child.type === "identifier" || child.type === "type_identifier").map((child) => child.text);
|
|
14453
|
+
const localName = identifiers[1] ?? identifiers[0];
|
|
14454
|
+
if (!localName)
|
|
14455
|
+
continue;
|
|
14456
|
+
const typeOnly = statementTypeOnly || specifierNode.text.trim().startsWith("type ");
|
|
14457
|
+
bindings.set(localName, { isExternal, typeOnly });
|
|
14458
|
+
hasValueImport ||= !typeOnly;
|
|
14459
|
+
hasTypeImport ||= typeOnly;
|
|
14460
|
+
}
|
|
14461
|
+
}
|
|
14462
|
+
return { hasValueImport, hasTypeImport };
|
|
14463
|
+
};
|
|
14464
|
+
var appendEsmImport = async (input) => {
|
|
14465
|
+
const specifierNode = input.node.namedChildren.find((child) => child.type === "string");
|
|
14466
|
+
if (!specifierNode)
|
|
14467
|
+
return;
|
|
14468
|
+
const specifier = specifierNode.text.replace(/^['"]/, "").replace(/['"]$/, "");
|
|
14469
|
+
const resolvedAlias = isRelativeModuleSpecifier(specifier) ? null : await resolveImportSourcePath(input.filePath, specifier, input.fs, input.resolver);
|
|
14470
|
+
const isExternal = !isRelativeModuleSpecifier(specifier) && resolvedAlias === null;
|
|
14471
|
+
const statementTypeOnly = input.node.text.startsWith("import type ");
|
|
14472
|
+
const parts = esmImportParts(input.node, input.bindings, isExternal, statementTypeOnly);
|
|
14473
|
+
if (parts.hasValueImport) {
|
|
14474
|
+
input.relations.push(createRelation("imports" /* Imports */, "", resolvedAlias ?? specifier, isExternal, getLine(input.node)));
|
|
14475
|
+
}
|
|
14476
|
+
if (parts.hasTypeImport) {
|
|
14477
|
+
input.relations.push(createRelation("imports_type" /* ImportsType */, "", resolvedAlias ?? specifier, isExternal, getLine(input.node)));
|
|
14478
|
+
}
|
|
14479
|
+
};
|
|
14480
|
+
var appendCommonJsImports = async (input) => {
|
|
14481
|
+
const recordedSources = new Set;
|
|
14482
|
+
for (const binding of input.commonJs.bindings) {
|
|
14483
|
+
const resolved = await resolveImportSourcePath(input.filePath, binding.source, input.fs, input.resolver);
|
|
14484
|
+
const isExternal = !isRelativeModuleSpecifier(binding.source) && resolved === null;
|
|
14485
|
+
input.bindings.set(binding.localName, { isExternal, typeOnly: false });
|
|
14486
|
+
if (recordedSources.has(binding.source))
|
|
14487
|
+
continue;
|
|
14488
|
+
recordedSources.add(binding.source);
|
|
14489
|
+
input.relations.push(createRelation("imports" /* Imports */, "", resolved ?? binding.source, isExternal, binding.line));
|
|
14490
|
+
}
|
|
14491
|
+
const remainingSources = [...new Set([
|
|
14492
|
+
...input.commonJs.wildcardSources,
|
|
14493
|
+
...input.commonJs.exports.flatMap((item) => item.source ? [item.source] : [])
|
|
14494
|
+
])].sort();
|
|
14495
|
+
for (const source of remainingSources) {
|
|
14496
|
+
if (recordedSources.has(source))
|
|
14497
|
+
continue;
|
|
14498
|
+
const resolved = await resolveImportSourcePath(input.filePath, source, input.fs, input.resolver);
|
|
14499
|
+
const isExternal = !isRelativeModuleSpecifier(source) && resolved === null;
|
|
14500
|
+
input.relations.push(createRelation("imports" /* Imports */, "", resolved ?? source, isExternal, input.commonJs.exports.find((item) => item.source === source)?.line ?? 1));
|
|
14501
|
+
}
|
|
14502
|
+
};
|
|
14503
|
+
var collectImportBindings2 = async (root, filePath, fs, resolver, relations, commonJs) => {
|
|
14504
|
+
const bindings = new Map;
|
|
14505
|
+
for (const node2 of root.namedChildren.filter((child) => child.type === "import_statement")) {
|
|
14506
|
+
await appendEsmImport({ node: node2, filePath, fs, resolver, bindings, relations });
|
|
14507
|
+
}
|
|
14508
|
+
await appendCommonJsImports({ commonJs, filePath, fs, resolver, bindings, relations });
|
|
14509
|
+
return bindings;
|
|
14510
|
+
};
|
|
14511
|
+
|
|
12891
14512
|
// src/symbolExtractorAnalyze.ts
|
|
12892
14513
|
var analyzeDeclaration = (node2, filePath, declarations, importBindings, relations) => {
|
|
12893
14514
|
if (node2.type === "lexical_declaration") {
|
|
@@ -12972,7 +14593,7 @@ var analyzeFunctionDeclaration = (node2, name, filePath, declarations, importBin
|
|
|
12972
14593
|
declarations.set(name, {
|
|
12973
14594
|
info: {
|
|
12974
14595
|
name,
|
|
12975
|
-
kind: "function" /* Function */,
|
|
14596
|
+
kind: isJsxLikePath(filePath) && /^[A-Z]/u.test(name) && containsJsx(node2) ? "component" /* Component */ : "function" /* Function */,
|
|
12976
14597
|
visibility: "internal" /* Internal */,
|
|
12977
14598
|
file: filePath,
|
|
12978
14599
|
line: getLine(node2),
|
|
@@ -13079,68 +14700,61 @@ var analyzeEnumDeclaration = (node2, name, symbolDoc, filePath, declarations) =>
|
|
|
13079
14700
|
}
|
|
13080
14701
|
});
|
|
13081
14702
|
};
|
|
13082
|
-
var
|
|
13083
|
-
const
|
|
13084
|
-
|
|
13085
|
-
const specifierNode = node2.namedChildren.find((child) => child.type === "string");
|
|
13086
|
-
if (!specifierNode)
|
|
14703
|
+
var appendCommonJsSyntheticDeclarations = (commonJs, filePath, declarations) => {
|
|
14704
|
+
for (const declaration of commonJs.syntheticDeclarations) {
|
|
14705
|
+
if (declarations.has(declaration.name))
|
|
13087
14706
|
continue;
|
|
13088
|
-
|
|
13089
|
-
|
|
13090
|
-
|
|
13091
|
-
|
|
13092
|
-
|
|
13093
|
-
|
|
13094
|
-
|
|
13095
|
-
|
|
13096
|
-
|
|
13097
|
-
if (part.type === "identifier") {
|
|
13098
|
-
bindings.set(part.text, { isExternal, typeOnly: statementTypeOnly });
|
|
13099
|
-
continue;
|
|
13100
|
-
}
|
|
13101
|
-
if (part.type === "namespace_import") {
|
|
13102
|
-
const identifier = part.namedChildren.find((child) => child.type === "identifier");
|
|
13103
|
-
if (identifier) {
|
|
13104
|
-
bindings.set(identifier.text, { isExternal, typeOnly: statementTypeOnly });
|
|
13105
|
-
}
|
|
13106
|
-
continue;
|
|
13107
|
-
}
|
|
13108
|
-
if (part.type !== "named_imports")
|
|
13109
|
-
continue;
|
|
13110
|
-
for (const specifierNode2 of part.namedChildren.filter((child) => child.type === "import_specifier")) {
|
|
13111
|
-
const identifiers = specifierNode2.namedChildren.filter((child) => child.type === "identifier" || child.type === "type_identifier").map((child) => child.text);
|
|
13112
|
-
const localName = identifiers[1] ?? identifiers[0];
|
|
13113
|
-
if (!localName)
|
|
13114
|
-
continue;
|
|
13115
|
-
const typeOnly = statementTypeOnly || specifierNode2.text.trim().startsWith("type ");
|
|
13116
|
-
bindings.set(localName, { isExternal, typeOnly });
|
|
13117
|
-
hasValueImport ||= !typeOnly;
|
|
13118
|
-
hasTypeImport ||= typeOnly;
|
|
14707
|
+
declarations.set(declaration.name, {
|
|
14708
|
+
info: {
|
|
14709
|
+
name: declaration.name,
|
|
14710
|
+
kind: declaration.kind === "function" ? isJsxLikePath(filePath) && /^[A-Z]/u.test(declaration.name) ? "component" /* Component */ : "function" /* Function */ : declaration.kind === "class" ? "class" /* Class */ : "variable" /* Variable */,
|
|
14711
|
+
visibility: "internal" /* Internal */,
|
|
14712
|
+
file: filePath,
|
|
14713
|
+
line: declaration.line,
|
|
14714
|
+
endLine: declaration.endLine,
|
|
14715
|
+
...declaration.params.length > 0 ? { params: declaration.params.map((name) => ({ name, type: null })) } : {}
|
|
13119
14716
|
}
|
|
13120
|
-
}
|
|
13121
|
-
if (hasValueImport) {
|
|
13122
|
-
relations.push(createRelation("imports" /* Imports */, "", relationTarget, isExternal, getLine(node2)));
|
|
13123
|
-
}
|
|
13124
|
-
if (hasTypeImport) {
|
|
13125
|
-
relations.push(createRelation("imports_type" /* ImportsType */, "", relationTarget, isExternal, getLine(node2)));
|
|
13126
|
-
}
|
|
14717
|
+
});
|
|
13127
14718
|
}
|
|
13128
|
-
return bindings;
|
|
13129
14719
|
};
|
|
13130
14720
|
var analyzeFile = async (filePath, fs, resolver = { mappings: [] }) => {
|
|
13131
14721
|
const source = await fs.readFile(filePath);
|
|
13132
|
-
const
|
|
14722
|
+
const sourceFile = createEcmaScriptSourceFile(source, filePath);
|
|
14723
|
+
const commonJs = analyzeCommonJsModule(source, filePath);
|
|
14724
|
+
const tree = await parseFile(source, isJsxLikePath(filePath));
|
|
13133
14725
|
if (!tree) {
|
|
14726
|
+
const diagnostics = syntaxDiagnostics(sourceFile);
|
|
14727
|
+
if (diagnostics.length === 0) {
|
|
14728
|
+
diagnostics.push({
|
|
14729
|
+
code: "ecmascript-parser-unsupported",
|
|
14730
|
+
severity: "error",
|
|
14731
|
+
file: filePath,
|
|
14732
|
+
line: 1,
|
|
14733
|
+
column: 1
|
|
14734
|
+
});
|
|
14735
|
+
}
|
|
14736
|
+
return {
|
|
14737
|
+
declarations: new Map,
|
|
14738
|
+
importBindings: new Map,
|
|
14739
|
+
relations: [],
|
|
14740
|
+
lines: countLines(source),
|
|
14741
|
+
disposition: "unsupported",
|
|
14742
|
+
diagnostics
|
|
14743
|
+
};
|
|
14744
|
+
}
|
|
14745
|
+
if (commonJs.diagnostics.length > 0) {
|
|
13134
14746
|
return {
|
|
13135
14747
|
declarations: new Map,
|
|
13136
14748
|
importBindings: new Map,
|
|
13137
14749
|
relations: [],
|
|
13138
|
-
lines: countLines(source)
|
|
14750
|
+
lines: countLines(source),
|
|
14751
|
+
disposition: "unsupported",
|
|
14752
|
+
diagnostics: commonJs.diagnostics
|
|
13139
14753
|
};
|
|
13140
14754
|
}
|
|
13141
14755
|
const root = tree.rootNode;
|
|
13142
14756
|
const relations = [];
|
|
13143
|
-
const importBindings = await collectImportBindings2(root, filePath, fs, resolver, relations);
|
|
14757
|
+
const importBindings = await collectImportBindings2(root, filePath, fs, resolver, relations, commonJs);
|
|
13144
14758
|
const declarations = new Map;
|
|
13145
14759
|
for (const relation of relations) {
|
|
13146
14760
|
if (relation.from === "") {
|
|
@@ -13159,11 +14773,15 @@ var analyzeFile = async (filePath, fs, resolver = { mappings: [] }) => {
|
|
|
13159
14773
|
analyzeDeclaration(declaration, filePath, declarations, importBindings, relations);
|
|
13160
14774
|
}
|
|
13161
14775
|
}
|
|
14776
|
+
appendCommonJsSyntheticDeclarations(commonJs, filePath, declarations);
|
|
14777
|
+
relations.push(...collectStaticCallRelations(source, filePath, importBindings));
|
|
13162
14778
|
return {
|
|
13163
14779
|
declarations,
|
|
13164
14780
|
importBindings,
|
|
13165
14781
|
relations,
|
|
13166
|
-
lines: countLines(source)
|
|
14782
|
+
lines: countLines(source),
|
|
14783
|
+
disposition: "analyzed",
|
|
14784
|
+
diagnostics: []
|
|
13167
14785
|
};
|
|
13168
14786
|
};
|
|
13169
14787
|
|
|
@@ -13244,21 +14862,38 @@ var extractSymbols = async (entries, fs, options) => {
|
|
|
13244
14862
|
}
|
|
13245
14863
|
const files = [...filePaths].sort().map((filePath) => ({
|
|
13246
14864
|
path: filePath,
|
|
13247
|
-
language: filePath
|
|
14865
|
+
language: ecmaScriptLanguage(filePath),
|
|
13248
14866
|
lines: analyses.get(filePath)?.lines ?? 0
|
|
13249
14867
|
}));
|
|
14868
|
+
const coverageFiles = files.map((file) => {
|
|
14869
|
+
const analysis = analyses.get(file.path);
|
|
14870
|
+
return {
|
|
14871
|
+
path: file.path,
|
|
14872
|
+
disposition: analysis?.disposition ?? "unsupported",
|
|
14873
|
+
diagnosticCodes: analysis?.diagnostics.map((diagnostic) => diagnostic.code) ?? [
|
|
14874
|
+
"ecmascript-analysis-missing"
|
|
14875
|
+
]
|
|
14876
|
+
};
|
|
14877
|
+
});
|
|
14878
|
+
const diagnostics = [...analyses.values()].flatMap((analysis) => analysis.diagnostics).sort((left, right) => left.file.localeCompare(right.file) || left.line - right.line || left.column - right.column);
|
|
13250
14879
|
return {
|
|
13251
14880
|
version: "2",
|
|
13252
14881
|
meta: {
|
|
13253
14882
|
extractedAt: new Date().toISOString(),
|
|
13254
14883
|
pluginId: options.pluginId,
|
|
13255
14884
|
commitHash: null,
|
|
13256
|
-
language:
|
|
14885
|
+
language: options.packageInfo.language
|
|
13257
14886
|
},
|
|
13258
14887
|
package: options.packageInfo,
|
|
13259
14888
|
files,
|
|
13260
14889
|
symbols,
|
|
13261
14890
|
relations,
|
|
14891
|
+
coverage: {
|
|
14892
|
+
tier: EXTRACT_TS_COVERAGE_TIER,
|
|
14893
|
+
capabilities: [...EXTRACT_TS_CAPABILITIES],
|
|
14894
|
+
files: coverageFiles,
|
|
14895
|
+
diagnostics
|
|
14896
|
+
},
|
|
13262
14897
|
stats: {
|
|
13263
14898
|
files: files.length,
|
|
13264
14899
|
lines: files.reduce((sum, file) => sum + file.lines, 0),
|
|
@@ -13272,8 +14907,10 @@ var extractSymbols = async (entries, fs, options) => {
|
|
|
13272
14907
|
// src/plugin.ts
|
|
13273
14908
|
class TypeScriptPlugin {
|
|
13274
14909
|
id = "c4a-extract-ts";
|
|
13275
|
-
languages = ["typescript", "tsx"];
|
|
14910
|
+
languages = ["typescript", "tsx", "javascript", "jsx"];
|
|
13276
14911
|
packageManagers = ["npm"];
|
|
14912
|
+
capabilities = [...EXTRACT_TS_CAPABILITIES];
|
|
14913
|
+
coverageTier = EXTRACT_TS_COVERAGE_TIER;
|
|
13277
14914
|
manifestTypes = ["package.json"];
|
|
13278
14915
|
#lastDetection = null;
|
|
13279
14916
|
canHandle(source) {
|
|
@@ -13298,20 +14935,20 @@ class TypeScriptPlugin {
|
|
|
13298
14935
|
}
|
|
13299
14936
|
}
|
|
13300
14937
|
// src/reactRouter.ts
|
|
13301
|
-
import * as
|
|
14938
|
+
import * as ts4 from "typescript";
|
|
13302
14939
|
function compact(value) {
|
|
13303
14940
|
return value.replace(/\s+/gu, " ").trim();
|
|
13304
14941
|
}
|
|
13305
14942
|
function scalarValue(node2) {
|
|
13306
14943
|
if (!node2)
|
|
13307
14944
|
return;
|
|
13308
|
-
if (
|
|
14945
|
+
if (ts4.isStringLiteralLike(node2) || ts4.isNoSubstitutionTemplateLiteral(node2))
|
|
13309
14946
|
return node2.text;
|
|
13310
|
-
if (
|
|
14947
|
+
if (ts4.isNumericLiteral(node2))
|
|
13311
14948
|
return Number(node2.text);
|
|
13312
|
-
if (node2.kind ===
|
|
14949
|
+
if (node2.kind === ts4.SyntaxKind.TrueKeyword)
|
|
13313
14950
|
return true;
|
|
13314
|
-
if (node2.kind ===
|
|
14951
|
+
if (node2.kind === ts4.SyntaxKind.FalseKeyword)
|
|
13315
14952
|
return false;
|
|
13316
14953
|
return;
|
|
13317
14954
|
}
|
|
@@ -13320,37 +14957,37 @@ function findDynamicImport(node2) {
|
|
|
13320
14957
|
const visit = (child) => {
|
|
13321
14958
|
if (result)
|
|
13322
14959
|
return;
|
|
13323
|
-
if (
|
|
14960
|
+
if (ts4.isCallExpression(child) && child.expression.kind === ts4.SyntaxKind.ImportKeyword && child.arguments[0] && ts4.isStringLiteralLike(child.arguments[0])) {
|
|
13324
14961
|
result = child.arguments[0].text;
|
|
13325
14962
|
return;
|
|
13326
14963
|
}
|
|
13327
|
-
|
|
14964
|
+
ts4.forEachChild(child, visit);
|
|
13328
14965
|
};
|
|
13329
14966
|
visit(node2);
|
|
13330
14967
|
return result;
|
|
13331
14968
|
}
|
|
13332
14969
|
function parseSource(source, filePath) {
|
|
13333
|
-
const sourceFile =
|
|
14970
|
+
const sourceFile = ts4.createSourceFile(filePath, source, ts4.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts4.ScriptKind.TSX : ts4.ScriptKind.TS);
|
|
13334
14971
|
const imports = new Map;
|
|
13335
14972
|
const constants2 = new Map;
|
|
13336
14973
|
for (const statement of sourceFile.statements) {
|
|
13337
|
-
if (
|
|
14974
|
+
if (ts4.isImportDeclaration(statement) && ts4.isStringLiteral(statement.moduleSpecifier)) {
|
|
13338
14975
|
const moduleSource = statement.moduleSpecifier.text;
|
|
13339
14976
|
const clause = statement.importClause;
|
|
13340
14977
|
if (clause?.name)
|
|
13341
14978
|
imports.set(clause.name.text, moduleSource);
|
|
13342
14979
|
const bindings = clause?.namedBindings;
|
|
13343
|
-
if (bindings &&
|
|
14980
|
+
if (bindings && ts4.isNamedImports(bindings)) {
|
|
13344
14981
|
for (const element of bindings.elements)
|
|
13345
14982
|
imports.set(element.name.text, moduleSource);
|
|
13346
14983
|
}
|
|
13347
|
-
if (bindings &&
|
|
14984
|
+
if (bindings && ts4.isNamespaceImport(bindings))
|
|
13348
14985
|
imports.set(bindings.name.text, moduleSource);
|
|
13349
14986
|
}
|
|
13350
|
-
if (!
|
|
14987
|
+
if (!ts4.isVariableStatement(statement))
|
|
13351
14988
|
continue;
|
|
13352
14989
|
for (const declaration of statement.declarationList.declarations) {
|
|
13353
|
-
if (!
|
|
14990
|
+
if (!ts4.isIdentifier(declaration.name) || !declaration.initializer)
|
|
13354
14991
|
continue;
|
|
13355
14992
|
const scalar = scalarValue(declaration.initializer);
|
|
13356
14993
|
if (scalar !== undefined)
|
|
@@ -13379,13 +15016,13 @@ function routeConditions(node2, sourceFile) {
|
|
|
13379
15016
|
let current = node2;
|
|
13380
15017
|
while (current?.parent) {
|
|
13381
15018
|
const parent = current.parent;
|
|
13382
|
-
if (
|
|
15019
|
+
if (ts4.isConditionalExpression(parent)) {
|
|
13383
15020
|
const condition = compact(parent.condition.getText(sourceFile));
|
|
13384
15021
|
conditions.push(current === parent.whenTrue ? condition : `!(${condition})`);
|
|
13385
|
-
} else if (
|
|
15022
|
+
} else if (ts4.isBinaryExpression(parent) && parent.operatorToken.kind === ts4.SyntaxKind.AmpersandAmpersandToken && current === parent.right) {
|
|
13386
15023
|
conditions.push(compact(parent.left.getText(sourceFile)));
|
|
13387
15024
|
}
|
|
13388
|
-
if (
|
|
15025
|
+
if (ts4.isFunctionLike(parent))
|
|
13389
15026
|
break;
|
|
13390
15027
|
current = parent;
|
|
13391
15028
|
}
|
|
@@ -13394,36 +15031,36 @@ function routeConditions(node2, sourceFile) {
|
|
|
13394
15031
|
function jsxAttributes(node2) {
|
|
13395
15032
|
const result = new Map;
|
|
13396
15033
|
for (const property of node2.attributes.properties)
|
|
13397
|
-
if (
|
|
15034
|
+
if (ts4.isJsxAttribute(property))
|
|
13398
15035
|
result.set(property.name.getText(), property);
|
|
13399
15036
|
return result;
|
|
13400
15037
|
}
|
|
13401
15038
|
function jsxExpression(attribute) {
|
|
13402
15039
|
const initializer = attribute?.initializer;
|
|
13403
|
-
return initializer &&
|
|
15040
|
+
return initializer && ts4.isJsxExpression(initializer) ? initializer.expression : undefined;
|
|
13404
15041
|
}
|
|
13405
15042
|
function jsxScalar(attribute, constants2) {
|
|
13406
15043
|
if (!attribute)
|
|
13407
15044
|
return;
|
|
13408
15045
|
if (!attribute.initializer)
|
|
13409
15046
|
return true;
|
|
13410
|
-
if (
|
|
15047
|
+
if (ts4.isStringLiteral(attribute.initializer))
|
|
13411
15048
|
return attribute.initializer.text;
|
|
13412
15049
|
const expression = jsxExpression(attribute);
|
|
13413
|
-
return scalarValue(expression) ?? (expression &&
|
|
15050
|
+
return scalarValue(expression) ?? (expression && ts4.isIdentifier(expression) ? constants2.get(expression.text) : undefined);
|
|
13414
15051
|
}
|
|
13415
15052
|
function descendantTags(node2) {
|
|
13416
15053
|
const tags = new Set;
|
|
13417
15054
|
const visit = (child) => {
|
|
13418
|
-
if (
|
|
13419
|
-
const opening =
|
|
15055
|
+
if (ts4.isJsxElement(child) || ts4.isJsxSelfClosingElement(child)) {
|
|
15056
|
+
const opening = ts4.isJsxElement(child) ? child.openingElement : child;
|
|
13420
15057
|
const tag = opening.tagName.getText();
|
|
13421
15058
|
if (child !== node2 && tag === "Route")
|
|
13422
15059
|
return;
|
|
13423
15060
|
if (!["Route", "Routes", "Suspense", "Fragment", "React.Fragment", "Navigate"].includes(tag))
|
|
13424
15061
|
tags.add(tag);
|
|
13425
15062
|
}
|
|
13426
|
-
|
|
15063
|
+
ts4.forEachChild(child, visit);
|
|
13427
15064
|
};
|
|
13428
15065
|
visit(node2);
|
|
13429
15066
|
return [...tags];
|
|
@@ -13433,8 +15070,8 @@ function navigateTarget(node2, sourceFile) {
|
|
|
13433
15070
|
const visit = (child) => {
|
|
13434
15071
|
if (target)
|
|
13435
15072
|
return;
|
|
13436
|
-
if (
|
|
13437
|
-
const opening =
|
|
15073
|
+
if (ts4.isJsxElement(child) || ts4.isJsxSelfClosingElement(child)) {
|
|
15074
|
+
const opening = ts4.isJsxElement(child) ? child.openingElement : child;
|
|
13438
15075
|
if (child !== node2 && opening.tagName.getText() === "Route")
|
|
13439
15076
|
return;
|
|
13440
15077
|
if (opening.tagName.getText() === "Navigate") {
|
|
@@ -13449,7 +15086,7 @@ function navigateTarget(node2, sourceFile) {
|
|
|
13449
15086
|
}
|
|
13450
15087
|
}
|
|
13451
15088
|
}
|
|
13452
|
-
|
|
15089
|
+
ts4.forEachChild(child, visit);
|
|
13453
15090
|
};
|
|
13454
15091
|
visit(node2);
|
|
13455
15092
|
return target;
|
|
@@ -13466,12 +15103,12 @@ function componentSource(component, imports) {
|
|
|
13466
15103
|
}
|
|
13467
15104
|
function objectProperty(object2, name) {
|
|
13468
15105
|
for (const property of object2.properties) {
|
|
13469
|
-
if (!
|
|
15106
|
+
if (!ts4.isPropertyAssignment(property) && !ts4.isShorthandPropertyAssignment(property))
|
|
13470
15107
|
continue;
|
|
13471
|
-
const key = property.name && (
|
|
15108
|
+
const key = property.name && (ts4.isIdentifier(property.name) || ts4.isStringLiteralLike(property.name)) ? property.name.text : undefined;
|
|
13472
15109
|
if (key !== name)
|
|
13473
15110
|
continue;
|
|
13474
|
-
return
|
|
15111
|
+
return ts4.isPropertyAssignment(property) ? property.initializer : property.name;
|
|
13475
15112
|
}
|
|
13476
15113
|
return;
|
|
13477
15114
|
}
|
|
@@ -13513,7 +15150,7 @@ function extractReactRouterRoutes(source, filePath, options = {}) {
|
|
|
13513
15150
|
};
|
|
13514
15151
|
const visitRouteObjects = (array, parentPath) => {
|
|
13515
15152
|
for (const element of array.elements) {
|
|
13516
|
-
if (!
|
|
15153
|
+
if (!ts4.isObjectLiteralExpression(element))
|
|
13517
15154
|
continue;
|
|
13518
15155
|
const index = scalarValue(objectProperty(element, "index")) === true;
|
|
13519
15156
|
const pathValue = scalarValue(objectProperty(element, "path"));
|
|
@@ -13529,13 +15166,13 @@ function extractReactRouterRoutes(source, filePath, options = {}) {
|
|
|
13529
15166
|
index,
|
|
13530
15167
|
...component ? { component } : {},
|
|
13531
15168
|
...typeof redirect === "string" ? { redirectTo: redirect } : {},
|
|
13532
|
-
...children &&
|
|
15169
|
+
...children && ts4.isArrayLiteralExpression(children) ? { children } : {}
|
|
13533
15170
|
});
|
|
13534
15171
|
}
|
|
13535
15172
|
};
|
|
13536
15173
|
const visit = (node2, parentPath) => {
|
|
13537
|
-
if (
|
|
13538
|
-
const opening =
|
|
15174
|
+
if (ts4.isJsxElement(node2) || ts4.isJsxSelfClosingElement(node2)) {
|
|
15175
|
+
const opening = ts4.isJsxElement(node2) ? node2.openingElement : node2;
|
|
13539
15176
|
if (opening.tagName.getText() === "Route") {
|
|
13540
15177
|
const attributes = jsxAttributes(opening);
|
|
13541
15178
|
const index = jsxScalar(attributes.get("index"), parsed.constants) === true;
|
|
@@ -13548,61 +15185,61 @@ function extractReactRouterRoutes(source, filePath, options = {}) {
|
|
|
13548
15185
|
const fullPath = joinRoutePath(parentPath, typeof pathValue === "string" ? pathValue : "", index);
|
|
13549
15186
|
const redirectTo = navigateTarget(candidateNode, parsed.sourceFile);
|
|
13550
15187
|
pushRoute({ node: node2, parentPath, path: typeof pathValue === "string" ? pathValue : "", index, ...component ? { component } : {}, candidates, ...redirectTo ? { redirectTo } : {} });
|
|
13551
|
-
if (
|
|
15188
|
+
if (ts4.isJsxElement(node2))
|
|
13552
15189
|
for (const child of node2.children)
|
|
13553
15190
|
visit(child, fullPath);
|
|
13554
15191
|
return;
|
|
13555
15192
|
}
|
|
13556
15193
|
}
|
|
13557
|
-
if (
|
|
15194
|
+
if (ts4.isCallExpression(node2)) {
|
|
13558
15195
|
const callee = node2.expression.getText(parsed.sourceFile);
|
|
13559
|
-
if ((callee === "createBrowserRouter" || callee === "createHashRouter" || callee === "useRoutes") && node2.arguments[0] &&
|
|
15196
|
+
if ((callee === "createBrowserRouter" || callee === "createHashRouter" || callee === "useRoutes") && node2.arguments[0] && ts4.isArrayLiteralExpression(node2.arguments[0])) {
|
|
13560
15197
|
visitRouteObjects(node2.arguments[0], mountPath);
|
|
13561
15198
|
}
|
|
13562
15199
|
}
|
|
13563
|
-
|
|
15200
|
+
ts4.forEachChild(node2, (child) => visit(child, parentPath));
|
|
13564
15201
|
};
|
|
13565
15202
|
visit(parsed.sourceFile, mountPath);
|
|
13566
15203
|
return routes.sort((left, right) => left.fullPath.localeCompare(right.fullPath) || left.location.startLine - right.location.startLine || left.location.startColumn - right.location.startColumn);
|
|
13567
15204
|
}
|
|
13568
15205
|
// src/moduleExports.ts
|
|
13569
|
-
import * as
|
|
15206
|
+
import * as ts5 from "typescript";
|
|
13570
15207
|
function exportedDeclarationName(statement) {
|
|
13571
|
-
const exported =
|
|
15208
|
+
const exported = ts5.canHaveModifiers(statement) && ts5.getModifiers(statement)?.some((modifier) => modifier.kind === ts5.SyntaxKind.ExportKeyword);
|
|
13572
15209
|
if (!exported)
|
|
13573
15210
|
return;
|
|
13574
|
-
if ((
|
|
15211
|
+
if ((ts5.isFunctionDeclaration(statement) || ts5.isClassDeclaration(statement) || ts5.isInterfaceDeclaration(statement) || ts5.isTypeAliasDeclaration(statement) || ts5.isEnumDeclaration(statement)) && statement.name) {
|
|
13575
15212
|
return statement.name.text;
|
|
13576
15213
|
}
|
|
13577
15214
|
return;
|
|
13578
15215
|
}
|
|
13579
15216
|
function extractTypeScriptModuleExports(source, filePath = "module.ts") {
|
|
13580
|
-
const sourceFile =
|
|
15217
|
+
const sourceFile = createEcmaScriptSourceFile(source, filePath);
|
|
13581
15218
|
const named = new Set;
|
|
13582
15219
|
const wildcard = new Set;
|
|
13583
15220
|
const targets = new Set;
|
|
13584
15221
|
for (const statement of sourceFile.statements) {
|
|
13585
|
-
if (
|
|
13586
|
-
const target = statement.moduleSpecifier &&
|
|
15222
|
+
if (ts5.isExportDeclaration(statement)) {
|
|
15223
|
+
const target = statement.moduleSpecifier && ts5.isStringLiteral(statement.moduleSpecifier) ? statement.moduleSpecifier.text : undefined;
|
|
13587
15224
|
if (target)
|
|
13588
15225
|
targets.add(target);
|
|
13589
15226
|
if (!statement.exportClause) {
|
|
13590
15227
|
if (target)
|
|
13591
15228
|
wildcard.add(target);
|
|
13592
|
-
} else if (
|
|
15229
|
+
} else if (ts5.isNamedExports(statement.exportClause)) {
|
|
13593
15230
|
for (const element of statement.exportClause.elements)
|
|
13594
15231
|
named.add(element.name.text);
|
|
13595
|
-
} else if (
|
|
15232
|
+
} else if (ts5.isNamespaceExport(statement.exportClause)) {
|
|
13596
15233
|
named.add(statement.exportClause.name.text);
|
|
13597
15234
|
}
|
|
13598
15235
|
continue;
|
|
13599
15236
|
}
|
|
13600
|
-
const
|
|
13601
|
-
if (
|
|
13602
|
-
named.add(
|
|
13603
|
-
if (
|
|
15237
|
+
const declarationName2 = exportedDeclarationName(statement);
|
|
15238
|
+
if (declarationName2)
|
|
15239
|
+
named.add(declarationName2);
|
|
15240
|
+
if (ts5.isVariableStatement(statement) && ts5.getModifiers(statement)?.some((modifier) => modifier.kind === ts5.SyntaxKind.ExportKeyword)) {
|
|
13604
15241
|
for (const declaration of statement.declarationList.declarations) {
|
|
13605
|
-
if (
|
|
15242
|
+
if (ts5.isIdentifier(declaration.name))
|
|
13606
15243
|
named.add(declaration.name.text);
|
|
13607
15244
|
}
|
|
13608
15245
|
}
|
|
@@ -13613,8 +15250,61 @@ function extractTypeScriptModuleExports(source, filePath = "module.ts") {
|
|
|
13613
15250
|
targets: [...targets].sort()
|
|
13614
15251
|
};
|
|
13615
15252
|
}
|
|
15253
|
+
function extractEcmaScriptModuleExports(source, filePath = "module.ts") {
|
|
15254
|
+
const esm = extractTypeScriptModuleExports(source, filePath);
|
|
15255
|
+
const sourceFile = createEcmaScriptSourceFile(source, filePath);
|
|
15256
|
+
const commonJs = analyzeCommonJsModule(source, filePath);
|
|
15257
|
+
const diagnostics = [
|
|
15258
|
+
...syntaxDiagnostics(sourceFile),
|
|
15259
|
+
...commonJs.diagnostics
|
|
15260
|
+
].map(({ code, line, column }) => ({ code, line, column }));
|
|
15261
|
+
if (diagnostics.length > 0) {
|
|
15262
|
+
return {
|
|
15263
|
+
named: [],
|
|
15264
|
+
wildcard: [],
|
|
15265
|
+
targets: [],
|
|
15266
|
+
coverageTier: EXTRACT_TS_COVERAGE_TIER,
|
|
15267
|
+
capabilities: [...EXTRACT_TS_CAPABILITIES],
|
|
15268
|
+
disposition: "unsupported",
|
|
15269
|
+
diagnostics
|
|
15270
|
+
};
|
|
15271
|
+
}
|
|
15272
|
+
return {
|
|
15273
|
+
named: [...new Set([
|
|
15274
|
+
...esm.named,
|
|
15275
|
+
...commonJs.exports.map((item) => item.exportedName)
|
|
15276
|
+
])].sort(),
|
|
15277
|
+
wildcard: [...new Set([...esm.wildcard, ...commonJs.wildcardSources])].sort(),
|
|
15278
|
+
targets: [...new Set([
|
|
15279
|
+
...esm.targets,
|
|
15280
|
+
...commonJs.bindings.map((binding) => binding.source),
|
|
15281
|
+
...commonJs.exports.flatMap((item) => item.source ? [item.source] : []),
|
|
15282
|
+
...commonJs.wildcardSources
|
|
15283
|
+
])].sort(),
|
|
15284
|
+
coverageTier: EXTRACT_TS_COVERAGE_TIER,
|
|
15285
|
+
capabilities: [...EXTRACT_TS_CAPABILITIES],
|
|
15286
|
+
disposition: "analyzed",
|
|
15287
|
+
diagnostics
|
|
15288
|
+
};
|
|
15289
|
+
}
|
|
15290
|
+
// src/evidenceAdapter.ts
|
|
15291
|
+
function typeScriptExtractionToEvidenceAdapterResult(extraction, invocation) {
|
|
15292
|
+
if (extraction.meta.pluginId !== "c4a-extract-ts") {
|
|
15293
|
+
throw new TypeError("TypeScript evidence adapter requires c4a-extract-ts output");
|
|
15294
|
+
}
|
|
15295
|
+
return extractionResultToEvidenceAdapterResult(extraction, invocation);
|
|
15296
|
+
}
|
|
15297
|
+
function typeScriptExtractionToEvidenceAdapterMaterialization(extraction, invocation) {
|
|
15298
|
+
return materializeIndexerEvidenceAdapterResult(typeScriptExtractionToEvidenceAdapterResult(extraction, invocation));
|
|
15299
|
+
}
|
|
13616
15300
|
export {
|
|
15301
|
+
typeScriptExtractionToEvidenceAdapterResult,
|
|
15302
|
+
typeScriptExtractionToEvidenceAdapterMaterialization,
|
|
13617
15303
|
extractTypeScriptModuleExports,
|
|
13618
15304
|
extractReactRouterRoutes,
|
|
13619
|
-
|
|
15305
|
+
extractEcmaScriptModuleExports,
|
|
15306
|
+
ecmaScriptLanguage,
|
|
15307
|
+
TypeScriptPlugin,
|
|
15308
|
+
EXTRACT_TS_COVERAGE_TIER,
|
|
15309
|
+
EXTRACT_TS_CAPABILITIES
|
|
13620
15310
|
};
|