@lucasacoutinho/archer 0.2.1 → 0.3.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 +144 -387
- package/dist/analyzer/Analyzer.d.ts +17 -0
- package/dist/analyzer/Analyzer.d.ts.map +1 -0
- package/dist/analyzer/Analyzer.js +15 -0
- package/dist/analyzer/Analyzer.js.map +1 -0
- package/dist/analyzer/bindings.d.ts +26 -0
- package/dist/analyzer/bindings.d.ts.map +1 -0
- package/dist/analyzer/bindings.js +61 -0
- package/dist/analyzer/bindings.js.map +1 -0
- package/dist/analyzer/errors.d.ts +34 -0
- package/dist/analyzer/errors.d.ts.map +1 -0
- package/dist/analyzer/errors.js +20 -0
- package/dist/analyzer/errors.js.map +1 -0
- package/dist/analyzer/graph-file.d.ts +13 -0
- package/dist/analyzer/graph-file.d.ts.map +1 -0
- package/dist/analyzer/graph-file.js +22 -0
- package/dist/analyzer/graph-file.js.map +1 -0
- package/dist/analyzer/paths.d.ts +12 -0
- package/dist/analyzer/paths.d.ts.map +1 -0
- package/dist/analyzer/paths.js +26 -0
- package/dist/analyzer/paths.js.map +1 -0
- package/dist/analyzer/server-exit.d.ts +19 -0
- package/dist/analyzer/server-exit.d.ts.map +1 -0
- package/dist/analyzer/server-exit.js +70 -0
- package/dist/analyzer/server-exit.js.map +1 -0
- package/dist/analyzer/source.d.ts +29 -0
- package/dist/analyzer/source.d.ts.map +1 -0
- package/dist/analyzer/source.js +58 -0
- package/dist/analyzer/source.js.map +1 -0
- package/dist/analyzer/syntax.d.ts +29 -0
- package/dist/analyzer/syntax.d.ts.map +1 -0
- package/dist/analyzer/syntax.js +226 -0
- package/dist/analyzer/syntax.js.map +1 -0
- package/dist/analyzer/targets.d.ts +26 -0
- package/dist/analyzer/targets.d.ts.map +1 -0
- package/dist/analyzer/targets.js +84 -0
- package/dist/analyzer/targets.js.map +1 -0
- package/dist/analyzer/typescript.d.ts +5 -0
- package/dist/analyzer/typescript.d.ts.map +1 -0
- package/dist/analyzer/typescript.js +221 -0
- package/dist/analyzer/typescript.js.map +1 -0
- package/dist/analyzer/workspace.d.ts +24 -0
- package/dist/analyzer/workspace.d.ts.map +1 -0
- package/dist/analyzer/workspace.js +9 -0
- package/dist/analyzer/workspace.js.map +1 -0
- package/dist/cli/explain.d.ts +3 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +21 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +159 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/config/input.d.ts +59 -0
- package/dist/config/input.d.ts.map +1 -0
- package/dist/config/input.js +115 -0
- package/dist/config/input.js.map +1 -0
- package/dist/config/rules.d.ts +94 -0
- package/dist/config/rules.d.ts.map +1 -0
- package/dist/config/rules.js +130 -0
- package/dist/config/rules.js.map +1 -0
- package/dist/core/baseline.d.ts +16 -0
- package/dist/core/baseline.d.ts.map +1 -0
- package/dist/core/baseline.js +25 -0
- package/dist/core/baseline.js.map +1 -0
- package/dist/core/check.d.ts +16 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +271 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/config.d.ts +72 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +78 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/fingerprint.d.ts +54 -0
- package/dist/core/fingerprint.d.ts.map +1 -0
- package/dist/core/fingerprint.js +182 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/keys.d.ts +10 -0
- package/dist/core/keys.d.ts.map +1 -0
- package/dist/core/keys.js +16 -0
- package/dist/core/keys.js.map +1 -0
- package/dist/core/lower.d.ts +13 -0
- package/dist/core/lower.d.ts.map +1 -0
- package/dist/core/lower.js +82 -0
- package/dist/core/lower.js.map +1 -0
- package/dist/core/model.d.ts +155 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +116 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/pattern.d.ts +13 -0
- package/dist/core/pattern.d.ts.map +1 -0
- package/dist/core/pattern.js +29 -0
- package/dist/core/pattern.js.map +1 -0
- package/dist/core/reach.d.ts +10 -0
- package/dist/core/reach.d.ts.map +1 -0
- package/dist/core/reach.js +81 -0
- package/dist/core/reach.js.map +1 -0
- package/dist/core/rule.d.ts +200 -0
- package/dist/core/rule.d.ts.map +1 -0
- package/dist/core/rule.js +162 -0
- package/dist/core/rule.js.map +1 -0
- package/dist/core/selector.d.ts +7 -0
- package/dist/core/selector.d.ts.map +1 -0
- package/dist/core/selector.js +27 -0
- package/dist/core/selector.js.map +1 -0
- package/dist/core/structural.d.ts +10 -0
- package/dist/core/structural.d.ts.map +1 -0
- package/dist/core/structural.js +24 -0
- package/dist/core/structural.js.map +1 -0
- package/dist/core/text.d.ts +26 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +144 -0
- package/dist/core/text.js.map +1 -0
- package/dist/effect.d.ts +19 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +21 -0
- package/dist/effect.js.map +1 -0
- package/dist/index.d.ts +24 -44
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -52
- package/dist/index.js.map +1 -0
- package/dist/report/agent.d.ts +3 -0
- package/dist/report/agent.d.ts.map +1 -0
- package/dist/report/agent.js +35 -0
- package/dist/report/agent.js.map +1 -0
- package/dist/report/dot.d.ts +4 -0
- package/dist/report/dot.d.ts.map +1 -0
- package/dist/report/dot.js +15 -0
- package/dist/report/dot.js.map +1 -0
- package/dist/report/github.d.ts +3 -0
- package/dist/report/github.d.ts.map +1 -0
- package/dist/report/github.js +18 -0
- package/dist/report/github.js.map +1 -0
- package/dist/report/json.d.ts +3 -0
- package/dist/report/json.d.ts.map +1 -0
- package/dist/report/json.js +4 -0
- package/dist/report/json.js.map +1 -0
- package/dist/report/message.d.ts +20 -0
- package/dist/report/message.d.ts.map +1 -0
- package/dist/report/message.js +73 -0
- package/dist/report/message.js.map +1 -0
- package/dist/report/pretty.d.ts +8 -0
- package/dist/report/pretty.d.ts.map +1 -0
- package/dist/report/pretty.js +89 -0
- package/dist/report/pretty.js.map +1 -0
- package/dist/report/render.d.ts +9 -0
- package/dist/report/render.d.ts.map +1 -0
- package/dist/report/render.js +10 -0
- package/dist/report/render.js.map +1 -0
- package/dist/report/report.d.ts +44 -0
- package/dist/report/report.d.ts.map +1 -0
- package/dist/report/report.js +49 -0
- package/dist/report/report.js.map +1 -0
- package/dist/report/sarif.d.ts +3 -0
- package/dist/report/sarif.d.ts.map +1 -0
- package/dist/report/sarif.js +68 -0
- package/dist/report/sarif.js.map +1 -0
- package/dist/run.d.ts +49 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +87 -0
- package/dist/run.js.map +1 -0
- package/dist/shell/baseline-file.d.ts +20 -0
- package/dist/shell/baseline-file.d.ts.map +1 -0
- package/dist/shell/baseline-file.js +46 -0
- package/dist/shell/baseline-file.js.map +1 -0
- package/dist/shell/load-config.d.ts +19 -0
- package/dist/shell/load-config.d.ts.map +1 -0
- package/dist/shell/load-config.js +39 -0
- package/dist/shell/load-config.js.map +1 -0
- package/package.json +29 -177
- package/skills/archer/SKILL.md +127 -45
- package/skills/archer/agents/openai.yaml +2 -2
- package/skills/archer/references/rules.md +267 -54
- package/dist/bun/plugin.cjs +0 -85
- package/dist/bun/plugin.d.cts +0 -7
- package/dist/bun/plugin.d.ts +0 -7
- package/dist/bun/plugin.js +0 -11
- package/dist/bun.cjs +0 -2238
- package/dist/bun.d.cts +0 -13
- package/dist/bun.d.ts +0 -13
- package/dist/bun.js +0 -28
- package/dist/chunk-2AKMBLHG.js +0 -2165
- package/dist/chunk-67YEOTXP.js +0 -25
- package/dist/chunk-IDVLHNL2.js +0 -46
- package/dist/chunk-ZZ6TR4PO.js +0 -201
- package/dist/cli.js +0 -2643
- package/dist/index.cjs +0 -2484
- package/dist/index.d.cts +0 -45
- package/dist/jest/plugin.cjs +0 -85
- package/dist/jest/plugin.d.cts +0 -7
- package/dist/jest/plugin.d.ts +0 -7
- package/dist/jest/plugin.js +0 -11
- package/dist/jest.cjs +0 -2237
- package/dist/jest.d.cts +0 -13
- package/dist/jest.d.ts +0 -13
- package/dist/jest.js +0 -27
- package/dist/matchers-Cqnbsyxe.d.cts +0 -11
- package/dist/matchers-Cqnbsyxe.d.ts +0 -11
- package/dist/node.cjs +0 -2237
- package/dist/node.d.cts +0 -13
- package/dist/node.d.ts +0 -13
- package/dist/node.js +0 -27
- package/dist/reporters-BbAXMpuW.d.cts +0 -6
- package/dist/reporters-xh-HQneS.d.ts +0 -6
- package/dist/suite-BwnPDCvU.d.cts +0 -337
- package/dist/suite-BwnPDCvU.d.ts +0 -337
- package/dist/vitest/plugin.cjs +0 -85
- package/dist/vitest/plugin.d.cts +0 -7
- package/dist/vitest/plugin.d.ts +0 -7
- package/dist/vitest/plugin.js +0 -11
- package/dist/vitest.cjs +0 -2531
- package/dist/vitest.d.cts +0 -37
- package/dist/vitest.d.ts +0 -37
- package/dist/vitest.js +0 -139
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Project, Symbol as TsSymbol } from "typescript/unstable/async";
|
|
2
|
+
import type { Binding } from "../core/model.ts";
|
|
3
|
+
export interface ImportOrigin {
|
|
4
|
+
readonly source: string;
|
|
5
|
+
/** `default` for a default import, `*` for the whole module. */
|
|
6
|
+
readonly name: string;
|
|
7
|
+
/** `name.member()` calls `member` on the module. */
|
|
8
|
+
readonly namespace: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type SymbolKind = {
|
|
11
|
+
readonly _tag: "Global";
|
|
12
|
+
} | {
|
|
13
|
+
readonly _tag: "Local";
|
|
14
|
+
} | {
|
|
15
|
+
readonly _tag: "Import";
|
|
16
|
+
readonly origin: ImportOrigin;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* No declaration in this file is a global, whether a library declares it or nothing does.
|
|
20
|
+
* Only declarations in this file are resolved, so a lookup never fetches a library file.
|
|
21
|
+
*/
|
|
22
|
+
export declare const classifySymbol: (project: Project, filePath: string, symbol: TsSymbol | undefined) => Promise<SymbolKind>;
|
|
23
|
+
export declare const bindingOfName: (kind: SymbolKind) => Binding;
|
|
24
|
+
/** Only calls on a namespace or default import are uses of the module. */
|
|
25
|
+
export declare const bindingOfMember: (kind: SymbolKind, member: string) => Binding | undefined;
|
|
26
|
+
//# sourceMappingURL=bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/analyzer/bindings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAe5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAA;AA+C9D;;;GAGG;AACH,eAAO,MAAM,cAAc,YAAmB,OAAO,YAAY,MAAM,UAAU,QAAQ,GAAG,SAAS,KAAG,OAAO,CAAC,UAAU,CAUzH,CAAA;AAED,eAAO,MAAM,aAAa,SAAU,UAAU,KAAG,OAK7C,CAAA;AAEJ,0EAA0E;AAC1E,eAAO,MAAM,eAAe,SAAU,UAAU,UAAU,MAAM,KAAG,OAAO,GAAG,SAMzE,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Match } from "effect";
|
|
2
|
+
import { isBindingElement, isExternalModuleReference, isIdentifier, isImportClause, isImportDeclaration, isImportEqualsDeclaration, isImportSpecifier, isNamespaceImport, isObjectBindingPattern, isStringLiteralLikeNode, isVariableDeclaration, } from "typescript/unstable/ast";
|
|
3
|
+
import { requiredModule } from "./syntax.js";
|
|
4
|
+
const GLOBAL = { _tag: "Global" };
|
|
5
|
+
const LOCAL = { _tag: "Local" };
|
|
6
|
+
const importedFrom = (node) => isImportDeclaration(node) && isStringLiteralLikeNode(node.moduleSpecifier) ? node.moduleSpecifier.text : undefined;
|
|
7
|
+
const originOf = Match.type().pipe(Match.when(isImportSpecifier, (specifier) => {
|
|
8
|
+
const source = importedFrom(specifier.parent.parent.parent);
|
|
9
|
+
return source === undefined
|
|
10
|
+
? undefined
|
|
11
|
+
: { source, name: (specifier.propertyName ?? specifier.name).text, namespace: false };
|
|
12
|
+
}), Match.when(isImportClause, (clause) => {
|
|
13
|
+
const source = importedFrom(clause.parent);
|
|
14
|
+
return source === undefined ? undefined : { source, name: "default", namespace: true };
|
|
15
|
+
}), Match.when(isNamespaceImport, (namespace) => {
|
|
16
|
+
const source = importedFrom(namespace.parent.parent);
|
|
17
|
+
return source === undefined ? undefined : { source, name: "*", namespace: true };
|
|
18
|
+
}), Match.when(isImportEqualsDeclaration, (declaration) => isExternalModuleReference(declaration.moduleReference) && isStringLiteralLikeNode(declaration.moduleReference.expression)
|
|
19
|
+
? { source: declaration.moduleReference.expression.text, name: "*", namespace: true }
|
|
20
|
+
: undefined), Match.when(isVariableDeclaration, (declaration) => {
|
|
21
|
+
const source = requiredModule(declaration.initializer);
|
|
22
|
+
return source !== undefined && isIdentifier(declaration.name) ? { source, name: "*", namespace: true } : undefined;
|
|
23
|
+
}), Match.when(isBindingElement, (element) => {
|
|
24
|
+
const pattern = element.parent;
|
|
25
|
+
const declaration = pattern.parent;
|
|
26
|
+
const source = isObjectBindingPattern(pattern) && isVariableDeclaration(declaration) ? requiredModule(declaration.initializer) : undefined;
|
|
27
|
+
const property = element.propertyName ?? element.name;
|
|
28
|
+
return source !== undefined &&
|
|
29
|
+
element.dotDotDotToken === undefined &&
|
|
30
|
+
property !== undefined &&
|
|
31
|
+
(isIdentifier(property) || isStringLiteralLikeNode(property))
|
|
32
|
+
? { source, name: property.text, namespace: false }
|
|
33
|
+
: undefined;
|
|
34
|
+
}), Match.orElse(() => undefined));
|
|
35
|
+
/**
|
|
36
|
+
* No declaration in this file is a global, whether a library declares it or nothing does.
|
|
37
|
+
* Only declarations in this file are resolved, so a lookup never fetches a library file.
|
|
38
|
+
*/
|
|
39
|
+
export const classifySymbol = async (project, filePath, symbol) => {
|
|
40
|
+
const here = (symbol?.declarations ?? []).filter((declaration) => declaration.path === filePath);
|
|
41
|
+
for (const declaration of here) {
|
|
42
|
+
const node = await declaration.resolve(project);
|
|
43
|
+
const origin = node === undefined ? undefined : originOf(node);
|
|
44
|
+
if (origin !== undefined) {
|
|
45
|
+
return { _tag: "Import", origin };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return here.length === 0 ? GLOBAL : LOCAL;
|
|
49
|
+
};
|
|
50
|
+
export const bindingOfName = (kind) => Match.valueTags(kind, {
|
|
51
|
+
Global: () => ({ _tag: "Global" }),
|
|
52
|
+
Local: () => ({ _tag: "Local" }),
|
|
53
|
+
Import: ({ origin }) => ({ _tag: "Imported", name: { source: origin.source, name: origin.name } }),
|
|
54
|
+
});
|
|
55
|
+
/** Only calls on a namespace or default import are uses of the module. */
|
|
56
|
+
export const bindingOfMember = (kind, member) => Match.valueTags(kind, {
|
|
57
|
+
Global: () => undefined,
|
|
58
|
+
Local: () => undefined,
|
|
59
|
+
Import: ({ origin }) => origin.namespace ? { _tag: "Imported", name: { source: origin.source, name: member } } : undefined,
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/analyzer/bindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
declare const ProjectNotFound_base: Schema.Class<ProjectNotFound, Schema.TaggedStruct<"ProjectNotFound", {
|
|
3
|
+
readonly tsconfig: Schema.String;
|
|
4
|
+
}>, import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly brand: unique symbol;
|
|
6
|
+
}>;
|
|
7
|
+
export declare class ProjectNotFound extends ProjectNotFound_base {
|
|
8
|
+
}
|
|
9
|
+
declare const ProjectParseFailed_base: Schema.Class<ProjectParseFailed, Schema.TaggedStruct<"ProjectParseFailed", {
|
|
10
|
+
readonly tsconfig: Schema.String;
|
|
11
|
+
readonly diagnostics: Schema.$Array<Schema.String>;
|
|
12
|
+
}>, import("effect/Cause").YieldableError & {
|
|
13
|
+
readonly brand: unique symbol;
|
|
14
|
+
}>;
|
|
15
|
+
export declare class ProjectParseFailed extends ProjectParseFailed_base {
|
|
16
|
+
}
|
|
17
|
+
declare const AnalyzerUnavailable_base: Schema.Class<AnalyzerUnavailable, Schema.TaggedStruct<"AnalyzerUnavailable", {
|
|
18
|
+
readonly cause: Schema.Defect;
|
|
19
|
+
}>, import("effect/Cause").YieldableError & {
|
|
20
|
+
readonly brand: unique symbol;
|
|
21
|
+
}>;
|
|
22
|
+
export declare class AnalyzerUnavailable extends AnalyzerUnavailable_base {
|
|
23
|
+
}
|
|
24
|
+
export type AnalysisError = ProjectNotFound | ProjectParseFailed | AnalyzerUnavailable | GraphFileInvalid;
|
|
25
|
+
declare const GraphFileInvalid_base: Schema.Class<GraphFileInvalid, Schema.TaggedStruct<"GraphFileInvalid", {
|
|
26
|
+
readonly path: Schema.String;
|
|
27
|
+
readonly issue: Schema.String;
|
|
28
|
+
}>, import("effect/Cause").YieldableError & {
|
|
29
|
+
readonly brand: unique symbol;
|
|
30
|
+
}>;
|
|
31
|
+
export declare class GraphFileInvalid extends GraphFileInvalid_base {
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/analyzer/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;oBAE4D,OAAO,MAAM;;AAAxG,qBAAa,eAAgB,SAAQ,oBAEnC;CAAG;;;;;oBAE4F,OAAO,MAAM;;AAA9G,qBAAa,kBAAmB,SAAQ,uBAGtC;CAAG;;;;oBAE8F,OAAO,MAAM;;AAAhH,qBAAa,mBAAoB,SAAQ,wBAEvC;CAAG;AAEL,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,gBAAgB,CAAA;;;;;oBAEZ,OAAO,MAAM;;AAA1G,qBAAa,gBAAiB,SAAQ,qBAGpC;CAAG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
export class ProjectNotFound extends Schema.TaggedError()("ProjectNotFound", {
|
|
3
|
+
tsconfig: Schema.String,
|
|
4
|
+
}) {
|
|
5
|
+
}
|
|
6
|
+
export class ProjectParseFailed extends Schema.TaggedError()("ProjectParseFailed", {
|
|
7
|
+
tsconfig: Schema.String,
|
|
8
|
+
diagnostics: Schema.Array(Schema.String),
|
|
9
|
+
}) {
|
|
10
|
+
}
|
|
11
|
+
export class AnalyzerUnavailable extends Schema.TaggedError()("AnalyzerUnavailable", {
|
|
12
|
+
cause: Schema.Defect(),
|
|
13
|
+
}) {
|
|
14
|
+
}
|
|
15
|
+
export class GraphFileInvalid extends Schema.TaggedError()("GraphFileInvalid", {
|
|
16
|
+
path: Schema.String,
|
|
17
|
+
issue: Schema.String,
|
|
18
|
+
}) {
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/analyzer/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAsD,CAAC,iBAAiB,EAAE;IAC/H,QAAQ,EAAE,MAAM,CAAC,MAAM;CACxB,CAAC;CAAG;AAEL,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAyD,CAAC,oBAAoB,EAAE;IACxI,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CACzC,CAAC;CAAG;AAEL,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,WAAW,EAA0D,CAAC,qBAAqB,EAAE;IAC3I,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;CACvB,CAAC;CAAG;AAIL,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,EAAuD,CAAC,kBAAkB,EAAE;IAClI,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM;CACrB,CAAC;CAAG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Effect, FileSystem, Schema } from "effect";
|
|
2
|
+
import { Graph } from "../core/model.ts";
|
|
3
|
+
import { GraphFileInvalid } from "./errors.ts";
|
|
4
|
+
/** A saved analysis. The version changes whenever the Graph schema does. */
|
|
5
|
+
export interface GraphFile {
|
|
6
|
+
readonly format: "archer-graph";
|
|
7
|
+
readonly version: 1;
|
|
8
|
+
readonly graph: Graph;
|
|
9
|
+
}
|
|
10
|
+
export declare const GraphFile: Schema.Codec<GraphFile>;
|
|
11
|
+
export declare const formatGraphFile: (graph: Graph) => string;
|
|
12
|
+
export declare const readGraphFile: (path: string) => Effect.Effect<Graph, GraphFileInvalid, FileSystem.FileSystem>;
|
|
13
|
+
//# sourceMappingURL=graph-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-file.d.ts","sourceRoot":"","sources":["../../src/analyzer/graph-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,4EAA4E;AAC5E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACtB;AAED,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAI5C,CAAA;AAEF,eAAO,MAAM,eAAe,UAAW,KAAK,KAAG,MACqD,CAAA;AAEpG,eAAO,MAAM,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,CAAC,UAAU,CAaxG,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Effect, FileSystem, Schema } from "effect";
|
|
2
|
+
import { Graph } from "../core/model.js";
|
|
3
|
+
import { GraphFileInvalid } from "./errors.js";
|
|
4
|
+
export const GraphFile = Schema.Struct({
|
|
5
|
+
format: Schema.Literal("archer-graph"),
|
|
6
|
+
version: Schema.Literal(1),
|
|
7
|
+
graph: Graph,
|
|
8
|
+
});
|
|
9
|
+
export const formatGraphFile = (graph) => `${JSON.stringify(Schema.encodeSync(GraphFile)({ format: "archer-graph", version: 1, graph }))}\n`;
|
|
10
|
+
export const readGraphFile = Effect.fn("readGraphFile")(function* (path) {
|
|
11
|
+
const fs = yield* FileSystem.FileSystem;
|
|
12
|
+
const text = yield* fs
|
|
13
|
+
.readFileString(path)
|
|
14
|
+
.pipe(Effect.mapError((error) => new GraphFileInvalid({ path, issue: error.message })));
|
|
15
|
+
const json = yield* Effect.try({
|
|
16
|
+
try: () => JSON.parse(text),
|
|
17
|
+
catch: () => new GraphFileInvalid({ path, issue: "not JSON" }),
|
|
18
|
+
});
|
|
19
|
+
const file = yield* Schema.decodeUnknownEffect(GraphFile)(json).pipe(Effect.mapError((error) => new GraphFileInvalid({ path, issue: error.message })));
|
|
20
|
+
return file.graph;
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=graph-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-file.js","sourceRoot":"","sources":["../../src/analyzer/graph-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAS9C,MAAM,CAAC,MAAM,SAAS,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC9D,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,KAAK;CACb,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAAU,EAAE,CACtD,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAA;AAEpG,MAAM,CAAC,MAAM,aAAa,GAAoF,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAY;IAC9J,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;SACnB,cAAc,CAAC,IAAI,CAAC;SACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACzF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC7B,GAAG,EAAE,GAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;KAC/D,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CACjF,CAAA;IACD,OAAO,IAAI,CAAC,KAAK,CAAA;AACnB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orders strings by UTF-16 code unit, never by locale: JavaScript's `<` on
|
|
3
|
+
* strings. Every ordering in a Graph uses it, so two runs produce the same
|
|
4
|
+
* bytes on every machine.
|
|
5
|
+
*/
|
|
6
|
+
export declare const compareCodeUnits: (left: string, right: string) => number;
|
|
7
|
+
export declare const splitPath: (path: string) => ReadonlyArray<string>;
|
|
8
|
+
export declare const NODE_MODULES: string;
|
|
9
|
+
/** `.d.ts`, `.d.mts`, `.d.cts`, and `.d.<ext>.ts` for an arbitrary extension, as TypeScript names them. */
|
|
10
|
+
export declare const isDeclarationFileName: (fileName: string) => boolean;
|
|
11
|
+
export declare const isJsonFileName: (fileName: string) => boolean;
|
|
12
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/analyzer/paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,SAAU,MAAM,SAAS,MAAM,KAAG,MAAoD,CAAA;AAEnH,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAI3B,CAAA;AAElC,eAAO,MAAM,YAAY,EAAE,MAAuB,CAAA;AAIlD,2GAA2G;AAC3G,eAAO,MAAM,qBAAqB,aAAc,MAAM,KAAG,OAUxD,CAAA;AAED,eAAO,MAAM,cAAc,aAAc,MAAM,KAAG,OAAqC,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orders strings by UTF-16 code unit, never by locale: JavaScript's `<` on
|
|
3
|
+
* strings. Every ordering in a Graph uses it, so two runs produce the same
|
|
4
|
+
* bytes on every machine.
|
|
5
|
+
*/
|
|
6
|
+
export const compareCodeUnits = (left, right) => (left < right ? -1 : left > right ? 1 : 0);
|
|
7
|
+
export const splitPath = (path) => path
|
|
8
|
+
.replaceAll("\\", "/")
|
|
9
|
+
.split("/")
|
|
10
|
+
.filter((part) => part !== "");
|
|
11
|
+
export const NODE_MODULES = "node_modules";
|
|
12
|
+
const declarationSuffixes = [".d.ts", ".d.mts", ".d.cts"];
|
|
13
|
+
/** `.d.ts`, `.d.mts`, `.d.cts`, and `.d.<ext>.ts` for an arbitrary extension, as TypeScript names them. */
|
|
14
|
+
export const isDeclarationFileName = (fileName) => {
|
|
15
|
+
if (declarationSuffixes.some((suffix) => fileName.endsWith(suffix))) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (!fileName.endsWith(".ts")) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const withoutTs = fileName.slice(0, -".ts".length);
|
|
22
|
+
const extensionStart = withoutTs.lastIndexOf(".");
|
|
23
|
+
return extensionStart > 0 && withoutTs.slice(0, extensionStart).endsWith(".d");
|
|
24
|
+
};
|
|
25
|
+
export const isJsonFileName = (fileName) => fileName.endsWith(".json");
|
|
26
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/analyzer/paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEnH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAyB,EAAE,CAC/D,IAAI;KACD,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;KACrB,KAAK,CAAC,GAAG,CAAC;KACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;AAElC,MAAM,CAAC,MAAM,YAAY,GAAW,cAAc,CAAA;AAElD,MAAM,mBAAmB,GAA0B,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAEhF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAW,EAAE;IACjE,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAClD,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjD,OAAO,cAAc,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { API } from "typescript/unstable/async";
|
|
2
|
+
/** Resolves when the server process has exited; never resolves when it cannot be found. */
|
|
3
|
+
export declare const serverExit: (api: API) => Promise<void>;
|
|
4
|
+
/**
|
|
5
|
+
* Releases a client whose server has died without writing to it: `close()`
|
|
6
|
+
* would first send a `release` request per snapshot, and a write to a dead
|
|
7
|
+
* process fails with EPIPE outside any promise the adapter can observe.
|
|
8
|
+
*/
|
|
9
|
+
export declare const abandon: (api: API) => void;
|
|
10
|
+
/**
|
|
11
|
+
* vscode-jsonrpc, bundled in TypeScript, runs `sendRequest` in an async
|
|
12
|
+
* Promise executor that rethrows a failed write after rejecting the request.
|
|
13
|
+
* The rethrow rejects a promise nobody holds, so a write to a server that has
|
|
14
|
+
* just died becomes an unhandled rejection. A failed write means the server is
|
|
15
|
+
* gone, and `serverExit` already fails the request, so the write's error is
|
|
16
|
+
* not passed back to the library.
|
|
17
|
+
*/
|
|
18
|
+
export declare const muteFailedWrites: (api: API) => void;
|
|
19
|
+
//# sourceMappingURL=server-exit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-exit.d.ts","sourceRoot":"","sources":["../../src/analyzer/server-exit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAgBpD,2FAA2F;AAC3F,eAAO,MAAM,UAAU,QAAS,GAAG,KAAG,OAAO,CAAC,IAAI,CAWjD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,QAAS,GAAG,KAAG,IAUlC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAAS,GAAG,KAAG,IAc3C,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ChildProcess } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript's async client never rejects a request to a server that has
|
|
4
|
+
* died, so the adapter watches the server process itself. The client keeps
|
|
5
|
+
* it in a private field; `test/analyzer/server-exit.test.ts` fails when that
|
|
6
|
+
* changes.
|
|
7
|
+
*/
|
|
8
|
+
const serverProcess = (api) => {
|
|
9
|
+
const client = Reflect.get(api, "client");
|
|
10
|
+
const child = typeof client === "object" && client !== null ? Reflect.get(client, "process") : undefined;
|
|
11
|
+
return child instanceof ChildProcess ? child : undefined;
|
|
12
|
+
};
|
|
13
|
+
const NEVER = new Promise(() => undefined);
|
|
14
|
+
/** Resolves when the server process has exited; never resolves when it cannot be found. */
|
|
15
|
+
export const serverExit = (api) => {
|
|
16
|
+
const child = serverProcess(api);
|
|
17
|
+
if (child === undefined) {
|
|
18
|
+
return NEVER;
|
|
19
|
+
}
|
|
20
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
21
|
+
return Promise.resolve();
|
|
22
|
+
}
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
child.once("exit", () => resolve());
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Releases a client whose server has died without writing to it: `close()`
|
|
29
|
+
* would first send a `release` request per snapshot, and a write to a dead
|
|
30
|
+
* process fails with EPIPE outside any promise the adapter can observe.
|
|
31
|
+
*/
|
|
32
|
+
export const abandon = (api) => {
|
|
33
|
+
const client = Reflect.get(api, "client");
|
|
34
|
+
const connection = typeof client === "object" && client !== null ? Reflect.get(client, "connection") : undefined;
|
|
35
|
+
if (typeof connection === "object" && connection !== null) {
|
|
36
|
+
const dispose = Reflect.get(connection, "dispose");
|
|
37
|
+
if (typeof dispose === "function")
|
|
38
|
+
Reflect.apply(dispose, connection, []);
|
|
39
|
+
}
|
|
40
|
+
const child = serverProcess(api);
|
|
41
|
+
child?.stdin?.destroy();
|
|
42
|
+
child?.stdout?.destroy();
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* vscode-jsonrpc, bundled in TypeScript, runs `sendRequest` in an async
|
|
46
|
+
* Promise executor that rethrows a failed write after rejecting the request.
|
|
47
|
+
* The rethrow rejects a promise nobody holds, so a write to a server that has
|
|
48
|
+
* just died becomes an unhandled rejection. A failed write means the server is
|
|
49
|
+
* gone, and `serverExit` already fails the request, so the write's error is
|
|
50
|
+
* not passed back to the library.
|
|
51
|
+
*/
|
|
52
|
+
export const muteFailedWrites = (api) => {
|
|
53
|
+
const stdin = serverProcess(api)?.stdin;
|
|
54
|
+
if (stdin === undefined || stdin === null)
|
|
55
|
+
return;
|
|
56
|
+
const write = Reflect.get(stdin, "write");
|
|
57
|
+
if (typeof write !== "function")
|
|
58
|
+
return;
|
|
59
|
+
Reflect.set(stdin, "write", (...args) => {
|
|
60
|
+
const last = args.at(-1);
|
|
61
|
+
if (typeof last === "function") {
|
|
62
|
+
args[args.length - 1] = (error) => {
|
|
63
|
+
if (error === undefined || error === null)
|
|
64
|
+
Reflect.apply(last, undefined, []);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return Reflect.apply(write, stdin, args);
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=server-exit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-exit.js","sourceRoot":"","sources":["../../src/analyzer/server-exit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Project } from "typescript/unstable/async";
|
|
2
|
+
import { type SourceFile } from "typescript/unstable/ast";
|
|
3
|
+
import type { Declaration, DependencyKind, Location, Use } from "../core/model.ts";
|
|
4
|
+
export type Resolution = {
|
|
5
|
+
readonly _tag: "Computed";
|
|
6
|
+
} | {
|
|
7
|
+
readonly _tag: "Module";
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly isFile: boolean;
|
|
10
|
+
} | {
|
|
11
|
+
readonly _tag: "Missing";
|
|
12
|
+
} | {
|
|
13
|
+
readonly _tag: "Unchecked";
|
|
14
|
+
};
|
|
15
|
+
export interface RawDependency {
|
|
16
|
+
readonly kind: DependencyKind;
|
|
17
|
+
readonly specifier: string;
|
|
18
|
+
readonly location: Location;
|
|
19
|
+
readonly resolution: Resolution;
|
|
20
|
+
}
|
|
21
|
+
export interface RawSource {
|
|
22
|
+
readonly dependencies: ReadonlyArray<RawDependency>;
|
|
23
|
+
readonly declarations: ReadonlyArray<Declaration>;
|
|
24
|
+
readonly exports: ReadonlyArray<string>;
|
|
25
|
+
readonly uses: ReadonlyArray<Use>;
|
|
26
|
+
readonly lines: number;
|
|
27
|
+
}
|
|
28
|
+
export declare const readSource: (project: Project, sourceFile: SourceFile) => Promise<RawSource>;
|
|
29
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/analyzer/source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAKlF,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAElC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACnD,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAWD,eAAO,MAAM,UAAU,YAAmB,OAAO,cAAc,UAAU,KAAG,OAAO,CAAC,SAAS,CAgE5F,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Match } from "effect";
|
|
2
|
+
import { SyntaxKind } from "typescript/unstable/ast";
|
|
3
|
+
import { bindingOfMember, bindingOfName, classifySymbol } from "./bindings.js";
|
|
4
|
+
import { compareCodeUnits } from "./paths.js";
|
|
5
|
+
import { countLines, declarationsOf, locationOf, scanSource } from "./syntax.js";
|
|
6
|
+
const byLocation = (left, right) => left.location.line - right.location.line || left.location.column - right.location.column;
|
|
7
|
+
const compareUses = (left, right) => byLocation(left, right) || compareCodeUnits(left.kind, right.kind) || compareCodeUnits(left.name, right.name);
|
|
8
|
+
const compareDependencies = (left, right) => byLocation(left, right) || compareCodeUnits(left.specifier, right.specifier) || compareCodeUnits(left.kind, right.kind);
|
|
9
|
+
export const readSource = async (project, sourceFile) => {
|
|
10
|
+
const scan = scanSource(sourceFile);
|
|
11
|
+
const checkable = scan.sites.filter((site) => site.checkable);
|
|
12
|
+
const isModule = sourceFile.externalModuleIndicator !== undefined;
|
|
13
|
+
// One checker request per file: specifier literals, then callee roots, then the file itself.
|
|
14
|
+
const nodes = [...checkable.map((site) => site.node), ...scan.calls.map((call) => call.root), ...(isModule ? [sourceFile] : [])];
|
|
15
|
+
const symbols = nodes.length === 0 ? [] : await project.checker.getSymbolAtLocation(nodes);
|
|
16
|
+
const moduleSymbols = new Map(checkable.map((site, index) => [site, symbols[index]]));
|
|
17
|
+
const callSymbols = symbols.slice(checkable.length, checkable.length + scan.calls.length);
|
|
18
|
+
const fileSymbol = isModule ? symbols[nodes.length - 1] : undefined;
|
|
19
|
+
const dependencies = scan.sites
|
|
20
|
+
.map((site) => {
|
|
21
|
+
const symbol = moduleSymbols.get(site);
|
|
22
|
+
const declaration = symbol?.declarations.find((candidate) => candidate.kind === SyntaxKind.SourceFile) ?? symbol?.declarations[0];
|
|
23
|
+
const resolution = Match.value(site).pipe(Match.when({ computed: true }, () => ({ _tag: "Computed" })), Match.when({ checkable: false }, () => ({ _tag: "Unchecked" })), Match.orElse(() => declaration === undefined
|
|
24
|
+
? { _tag: "Missing" }
|
|
25
|
+
: { _tag: "Module", path: declaration.path, isFile: declaration.kind === SyntaxKind.SourceFile }));
|
|
26
|
+
return { kind: site.kind, specifier: site.specifier, location: locationOf(sourceFile, site.node), resolution };
|
|
27
|
+
})
|
|
28
|
+
.toSorted(compareDependencies);
|
|
29
|
+
const kinds = new Map();
|
|
30
|
+
const kindOf = (index) => {
|
|
31
|
+
const symbol = callSymbols[index];
|
|
32
|
+
const cached = symbol === undefined ? undefined : kinds.get(symbol.id);
|
|
33
|
+
const kind = cached ?? classifySymbol(project, sourceFile.path, symbol);
|
|
34
|
+
if (symbol !== undefined) {
|
|
35
|
+
kinds.set(symbol.id, kind);
|
|
36
|
+
}
|
|
37
|
+
return kind;
|
|
38
|
+
};
|
|
39
|
+
const [callKinds, exportSymbols] = await Promise.all([
|
|
40
|
+
Promise.all(scan.calls.map((_, index) => kindOf(index))),
|
|
41
|
+
fileSymbol === undefined ? Promise.resolve([]) : project.checker.getExportsOfModule(fileSymbol),
|
|
42
|
+
]);
|
|
43
|
+
const calls = scan.calls.flatMap((call, index) => {
|
|
44
|
+
const kind = callKinds[index];
|
|
45
|
+
const binding = kind === undefined ? undefined : call.member === undefined ? bindingOfName(kind) : bindingOfMember(kind, call.member);
|
|
46
|
+
return binding === undefined ? [] : [{ kind: "call", name: call.name, binding, location: locationOf(sourceFile, call.callee) }];
|
|
47
|
+
});
|
|
48
|
+
const equalities = scan.looseEqualities.map((token) => ({ kind: "looseEquality", name: token.getText(sourceFile), binding: { _tag: "Local" }, location: locationOf(sourceFile, token) }));
|
|
49
|
+
const exports = [...new Set(exportSymbols.map((symbol) => symbol.name))].toSorted(compareCodeUnits);
|
|
50
|
+
return {
|
|
51
|
+
dependencies,
|
|
52
|
+
declarations: declarationsOf(sourceFile),
|
|
53
|
+
exports,
|
|
54
|
+
uses: [...calls, ...equalities].toSorted(compareUses),
|
|
55
|
+
lines: countLines(sourceFile.text),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/analyzer/source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Identifier, type Node, type SourceFile } from "typescript/unstable/ast";
|
|
2
|
+
import type { Declaration, DependencyKind, Location } from "../core/model.ts";
|
|
3
|
+
export declare const locationOf: (sourceFile: SourceFile, node: Node) => Location;
|
|
4
|
+
/** A trailing newline ends the last line instead of starting another; an empty file has no lines. */
|
|
5
|
+
export declare const countLines: (text: string) => number;
|
|
6
|
+
export interface ImportSite {
|
|
7
|
+
readonly kind: DependencyKind;
|
|
8
|
+
readonly node: Node;
|
|
9
|
+
readonly specifier: string;
|
|
10
|
+
readonly computed: boolean;
|
|
11
|
+
/** The checker does not resolve `require()` in a TypeScript file. */
|
|
12
|
+
readonly checkable: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface CallSite {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly root: Identifier;
|
|
17
|
+
readonly member: string | undefined;
|
|
18
|
+
readonly callee: Node;
|
|
19
|
+
}
|
|
20
|
+
export interface Scan {
|
|
21
|
+
readonly sites: ReadonlyArray<ImportSite>;
|
|
22
|
+
readonly calls: ReadonlyArray<CallSite>;
|
|
23
|
+
readonly looseEqualities: ReadonlyArray<Node>;
|
|
24
|
+
}
|
|
25
|
+
export declare const scanSource: (sourceFile: SourceFile) => Scan;
|
|
26
|
+
export declare const requiredModule: (node: Node | undefined) => string | undefined;
|
|
27
|
+
/** A variable statement gives one declaration per bound name, all at the statement's location. */
|
|
28
|
+
export declare const declarationsOf: (sourceFile: SourceFile) => ReadonlyArray<Declaration>;
|
|
29
|
+
//# sourceMappingURL=syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/analyzer/syntax.ts"],"names":[],"mappings":"AACA,OAAO,EAsCL,KAAK,UAAU,EAGf,KAAK,IAAI,EAET,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAsB,MAAM,kBAAkB,CAAA;AAEjG,eAAO,MAAM,UAAU,eAAgB,UAAU,QAAQ,IAAI,KAAG,QAG/D,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MASzC,CAAA;AAKD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACvC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;CAC9C;AAyDD,eAAO,MAAM,UAAU,eAAgB,UAAU,KAAG,IAiFnD,CAAA;AAED,eAAO,MAAM,cAAc,SAAU,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,SASlD,CAAA;AA+Ff,kGAAkG;AAClG,eAAO,MAAM,cAAc,eAAgB,UAAU,KAAG,aAAa,CAAC,WAAW,CA0DhF,CAAA"}
|