@r_masseater/msch 0.3.0 → 0.5.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 +3 -1
- package/dist/cli.mjs +20 -11
- package/dist/cli.mjs.map +1 -1
- package/package.json +8 -2
- package/src/vite.d.ts +11 -0
package/README.md
CHANGED
|
@@ -42,5 +42,7 @@ oxlint のバージョンは、@effect/tsgo が対応するものに合わせる
|
|
|
42
42
|
外部から読んだ値を Effect Schema で確かめるときは、`satisfies Schema.Decoder<ライブラリの型>` か変数の型注釈でライブラリの型に結びつける。結びつけた Schema は、ライブラリの形の写しとして指摘しない。
|
|
43
43
|
見えない文字は、ゼロ幅の文字・書字方向を変える制御文字・タグ文字のように、エディタやレビューで見えずに意味を変えうる文字で、`git ls-files` に載るテキストのファイルから探す。ファイル先頭の BOM と、NUL を含むバイナリは対象にしない。
|
|
44
44
|
Python は使わない方針なので、`.py`・`pyproject.toml`・`uv.lock` などのファイルを指摘する。スクリプト・CI・設定の中で `python3`・`pip`・`uv`・`poetry` を呼ぶ箇所と、`actions/setup-python` などの action、`mise.toml` に書いた Python の道具も指摘する。
|
|
45
|
-
案内文書は、`AGENTS.md`・`CLAUDE.md`
|
|
45
|
+
案内文書は、`AGENTS.md`・`CLAUDE.md` をルートにだけ置かせる。
|
|
46
|
+
README は、ルートか、npm に出すワークスペース(`vite.config.ts` に `msch: { publish: true }` と書いたもの)にだけ置かせる。
|
|
47
|
+
`tsconfig.json` の `types` に `@r_masseater/msch/vite` を足すと、`defineConfig` の `msch` に型が付く。
|
|
46
48
|
指摘があれば終了コードは 1 になる。`--json` を付けると結果を JSON で出す。
|
package/dist/cli.mjs
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $ as isSatisfiesExpression, A as API, B as isCallExpression, C as MANIFEST_FILE
|
|
2
|
+
import { $ as isSatisfiesExpression, A as API, B as isCallExpression, C as MANIFEST_FILE, D as workspaceDependencies, E as readManifest, F as getLeadingCommentRanges, G as isInterfaceDeclaration, H as isElementAccessExpression, I as getNameOfDeclaration, J as isNewExpression, K as isModuleBlock, L as getTextOfJSDocComment, M as InternalSymbolName, N as SyntaxKind, O as RepositoryFiles, P as getJSDocTags, Q as isPropertyAssignment, R as isArrayLiteralExpression, S as uniqueByReference, T as dependencyEntries, U as isEnumDeclaration, V as isClassDeclaration, W as isIdentifier, X as isObjectLiteralExpression, Y as isNumericLiteral, Z as isPropertyAccessExpression, _ as lineOf, a as problemAt, at as isTypeLiteralNode, b as resolvedSymbol, c as childrenOf, ct as isVariableDeclaration, d as declarationsOf, et as isSignatureDeclaration, f as descendantsOf, g as isTypeDeclaration, h as isGenericDeclaration, i as formatProblem, it as isTypeAliasDeclaration, j as IndexKind, k as nodeRepositoryFiles, l as columnOf, lt as isVariableDeclarationList, m as isExternalDeclaration, n as ProblemList, nt as isSpreadElement, o as sortProblems, ot as isTypeReferenceNode, p as importedModulesOf, q as isModuleDeclaration, rt as isStringLiteral, s as NODE_MODULES_SEGMENT, st as isUnionTypeNode, tt as isSourceFile, u as contains, ut as isVariableStatement, v as propertyNamesOf, w as NODE_MODULES, x as symbolAt, y as referencedSymbols, z as isBinaryExpression } from "./cli-contract-CkYucdU4.mjs";
|
|
3
3
|
import { Array, Cause, Effect, FileSystem, Function, Layer, Number as Number$1, Option, Order, Path, Record, Schema, Stdio, Stream, String as String$1, pipe } from "effect";
|
|
4
4
|
import { layer } from "@effect/platform-node/NodeServices";
|
|
5
5
|
import { ChildProcess } from "effect/process";
|
|
6
|
+
import { resolveConfigFromFile } from "vite-plus";
|
|
6
7
|
import { LineCounter, isMap, isScalar, parseAllDocuments, parseDocument } from "yaml";
|
|
7
8
|
import { runMain } from "@effect/platform-node/NodeRuntime";
|
|
8
9
|
import { FetchHttpClient } from "effect/http";
|
|
@@ -659,7 +660,7 @@ const annotateResources = (api) => Effect.gen(function* annotateCompiler() {
|
|
|
659
660
|
});
|
|
660
661
|
});
|
|
661
662
|
// src/project.ts
|
|
662
|
-
const CONFIG_FILE = "tsconfig.json";
|
|
663
|
+
const CONFIG_FILE$1 = "tsconfig.json";
|
|
663
664
|
const HIDDEN_PREFIX = ".";
|
|
664
665
|
const SKIPPED_DIRECTORIES = /* @__PURE__ */ new Set([
|
|
665
666
|
NODE_MODULES,
|
|
@@ -674,7 +675,7 @@ const listConfigFiles = (directory) => Effect.gen(function* configFilesUnder() {
|
|
|
674
675
|
onNone: () => Effect.succeed([]),
|
|
675
676
|
onSome: (directoryEntry) => {
|
|
676
677
|
if (directoryEntry) return listConfigFiles(entryPath);
|
|
677
|
-
return Effect.succeed(Array.filter([entryPath], () => files.basename(entryPath) === CONFIG_FILE));
|
|
678
|
+
return Effect.succeed(Array.filter([entryPath], () => files.basename(entryPath) === CONFIG_FILE$1));
|
|
678
679
|
}
|
|
679
680
|
})))));
|
|
680
681
|
return Array.sort(nested.flat(), Order.String);
|
|
@@ -682,7 +683,7 @@ const listConfigFiles = (directory) => Effect.gen(function* configFilesUnder() {
|
|
|
682
683
|
const parseConfig = (api) => (configPath) => Option.some(api.parseConfigFile(configPath)).pipe(Option.filter((parsed) => Array.isReadonlyArrayNonEmpty(parsed.fileNames)));
|
|
683
684
|
const nearestPackageDirectory = (directory, root) => Effect.gen(function* nearestPackage() {
|
|
684
685
|
const files = yield* RepositoryFiles;
|
|
685
|
-
const hasManifest = yield* files.exists(files.join(directory, MANIFEST_FILE
|
|
686
|
+
const hasManifest = yield* files.exists(files.join(directory, MANIFEST_FILE));
|
|
686
687
|
const parent = files.dirname(directory);
|
|
687
688
|
if (hasManifest || directory === root || parent === directory) return directory;
|
|
688
689
|
return yield* nearestPackageDirectory(parent, root);
|
|
@@ -845,17 +846,25 @@ const checkHiddenUnicode = Effect.fn("checkHiddenUnicode")(function* checkHidden
|
|
|
845
846
|
// src/nested-docs.ts
|
|
846
847
|
const RULE = "nested-docs";
|
|
847
848
|
const SEPARATOR = "/";
|
|
848
|
-
const
|
|
849
|
+
const CONFIG_FILE = "vite.config.ts";
|
|
849
850
|
const FIRST = 1;
|
|
850
851
|
const READ_CONCURRENCY$1 = 64;
|
|
851
852
|
const AGENT_DOCS = /^(?:AGENTS|CLAUDE)(?:\.[^/]+)?\.md$/iu;
|
|
852
853
|
const README = /^README(?:\.[^/]+)?$/iu;
|
|
853
|
-
const
|
|
854
|
+
const Published = Schema.Struct({ publish: Schema.Literal(true) });
|
|
855
|
+
const WorkspaceConfig = Schema.Struct({ msch: Published });
|
|
856
|
+
const taggedError$2 = Schema.TaggedError;
|
|
857
|
+
var WorkspaceConfigUnreadable = class extends taggedError$2()("WorkspaceConfigUnreadable", { file: Schema.String }) {};
|
|
854
858
|
const isNested = (name) => String$1.includes(SEPARATOR)(name);
|
|
855
|
-
const
|
|
859
|
+
const isPublished = Effect.fn("isPublished")(function* isPublished(root, directory) {
|
|
856
860
|
const files = yield* RepositoryFiles;
|
|
857
|
-
const
|
|
858
|
-
|
|
861
|
+
const file = files.join(root, directory, CONFIG_FILE);
|
|
862
|
+
if (!(yield* files.exists(file))) return false;
|
|
863
|
+
const config = yield* Effect.tryPromise({
|
|
864
|
+
try: () => resolveConfigFromFile(file),
|
|
865
|
+
catch: () => WorkspaceConfigUnreadable.make({ file })
|
|
866
|
+
}).pipe(Effect.option);
|
|
867
|
+
return pipe(config, Option.flatMap(Schema.decodeUnknownOption(WorkspaceConfig)), Option.isSome);
|
|
859
868
|
});
|
|
860
869
|
const problemFor = (file, message) => ({
|
|
861
870
|
file,
|
|
@@ -865,14 +874,14 @@ const problemFor = (file, message) => ({
|
|
|
865
874
|
message
|
|
866
875
|
});
|
|
867
876
|
const AGENT_DOCS_MESSAGE = "belongs only at the repository root. Move what agents need into the root AGENTS.md and delete this file.";
|
|
868
|
-
const README_MESSAGE = "
|
|
877
|
+
const README_MESSAGE = "is allowed below the root only in a workspace published to npm, marked by msch: { publish: true } in its vite.config.ts. Set it there if the workspace is published, or move the content into the root README.md and delete this file.";
|
|
869
878
|
const problemIn = Effect.fn("problemIn")(function* problemIn(root, name) {
|
|
870
879
|
const files = yield* RepositoryFiles;
|
|
871
880
|
const base = files.basename(name);
|
|
872
881
|
const file = files.join(root, name);
|
|
873
882
|
if (AGENT_DOCS.test(base)) return Option.some(problemFor(file, `${base} ${AGENT_DOCS_MESSAGE}`));
|
|
874
883
|
if (!README.test(base)) return Option.none();
|
|
875
|
-
if (yield*
|
|
884
|
+
if (yield* isPublished(root, files.dirname(name))) return Option.none();
|
|
876
885
|
return Option.some(problemFor(file, `${base} ${README_MESSAGE}`));
|
|
877
886
|
});
|
|
878
887
|
/** @internal */
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["Arr","Arr","Fn","SCOPE_PREFIX","packageOf","Str","Arr","Arr","Str","Arr","Arr","Arr","Arr","Arr","Arr","Arr","Rec","Num","Str","Arr","Arr","Str","Fn","MANIFEST_FILE","Arr","START","FIRST_COLUMN","Str","Arr","READ_CONCURRENCY","RULE","Str","Arr","READ_CONCURRENCY","Str","Arr","Arr","Arr","Rec","Str","LOCKFILE","taggedError","Str","Arr","Str","Arr","Arr","nodeServicesLayer","Arr"],"sources":["../src/slots.ts","../src/values.ts","../src/flows.ts","../src/owners.ts","../src/library.ts","../src/derivation.ts","../src/shapes.ts","../src/sites.ts","../src/value-checks.ts","../src/analysis.ts","../src/duplicates.ts","../src/telemetry.ts","../src/project.ts","../src/check.ts","../src/text-position.ts","../src/hidden-unicode.ts","../src/nested-docs.ts","../src/override-findings.ts","../src/override-resolution.ts","../src/overrides.ts","../src/python.ts","../src/all-checks.ts","../src/output.ts","../src/runtime.ts","../src/cli.ts"],"sourcesContent":["import { Array as Arr, Option } from \"effect\";\n\nimport {\n isCallExpression,\n isNewExpression,\n isObjectLiteralExpression,\n isPropertyAssignment,\n isSignatureDeclaration,\n isVariableDeclaration,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Expression,\n ParameterDeclaration,\n PropertyDeclaration,\n PropertySignatureDeclaration,\n TypeSymbol,\n TypeNode,\n VariableDeclaration,\n} from \"./compiler.ts\";\nimport { declarationsOf, referencedSymbols } from \"./syntax.ts\";\n\ntype AnnotatedDeclaration =\n | ParameterDeclaration\n | VariableDeclaration\n | PropertySignatureDeclaration\n | PropertyDeclaration;\n\nconst ANNOTATED_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.Parameter,\n SyntaxKind.VariableDeclaration,\n SyntaxKind.PropertySignature,\n SyntaxKind.PropertyDeclaration,\n]);\n\nconst isAnnotated = (declaration: Declaration): declaration is AnnotatedDeclaration =>\n ANNOTATED_KINDS.has(declaration.kind);\n\nconst annotationOf = (declaration: Declaration): Option.Option<TypeNode> =>\n Option.liftPredicate(declaration, isAnnotated).pipe(\n Option.flatMap((annotated) => Option.fromUndefinedOr(annotated.type)),\n );\n\nconst argumentSlot =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> => {\n const call = expression.parent;\n if (!isCallExpression(call) && !isNewExpression(call)) {\n return Option.none();\n }\n const { arguments: listed } = call;\n const callArguments: readonly Expression[] = listed ?? [];\n const index = callArguments.indexOf(expression);\n return Option.fromUndefinedOr(checker.getResolvedSignature(call).declaration).pipe(\n Option.flatMap((handle) => Option.fromUndefinedOr(handle.resolve())),\n Option.filter(isSignatureDeclaration),\n Option.flatMap((declaration) => Arr.get(declaration.parameters, index)),\n );\n };\n\nconst propertySlot =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> => {\n const assignment = expression.parent;\n if (!isPropertyAssignment(assignment) || !isObjectLiteralExpression(assignment.parent)) {\n return Option.none();\n }\n return Option.fromUndefinedOr(checker.getContextualType(assignment.parent)).pipe(\n Option.flatMap((objectType) =>\n Option.fromUndefinedOr(objectType.getProperty(assignment.name.getText())),\n ),\n Option.flatMap((property) => Arr.head(declarationsOf(property))),\n );\n };\n\nconst variableSlot = (expression: Expression): Option.Option<Declaration> => {\n const declaration = expression.parent;\n if (!isVariableDeclaration(declaration) || declaration.initializer !== expression) {\n return Option.none();\n }\n return Option.some(declaration);\n};\n\nconst slotOf =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> =>\n argumentSlot(checker)(expression).pipe(\n Option.orElse(() => propertySlot(checker)(expression)),\n Option.orElse(() => variableSlot(expression)),\n );\n\nconst contextSymbolsOf =\n (checker: Checker) =>\n (expression: Expression): readonly TypeSymbol[] => {\n const alias = Option.fromUndefinedOr(checker.getContextualType(expression)).pipe(\n Option.flatMap((contextual) => Option.fromUndefinedOr(contextual.getAliasSymbol())),\n );\n if (Option.isSome(alias)) {\n return [alias.value];\n }\n return slotOf(checker)(expression).pipe(\n Option.flatMap(annotationOf),\n Option.map((annotation) => referencedSymbols(checker)(annotation)),\n Option.getOrElse(() => []),\n );\n };\n\nexport { annotationOf, contextSymbolsOf, slotOf };\n","import { Array as Arr, Function as Fn, Option, pipe } from \"effect\";\n\nimport { IndexKind } from \"./compiler.ts\";\nimport type { Checker, Type } from \"./compiler.ts\";\n\ntype Value = string | number;\n\ninterface Vocabulary {\n readonly values: readonly Value[];\n readonly admitsUnnamedValues: boolean;\n}\n\nconst SCHEMA_TYPE_PROPERTIES = [\"Type\", \"_output\"] as const;\n\nconst MINIMUM_SET_SIZE = 2;\n\nconst DATA_FIRST_ARITY = 2;\n\nconst valueKey = (value: Value): string => `${typeof value}:${String(value)}`;\n\nconst literalValueOf = (type: Type): Option.Option<Value> => {\n if (type.isStringLiteralType() || type.isNumberLiteralType()) {\n return Option.some(type.value);\n }\n return Option.none();\n};\n\nconst literalValuesOf = (types: readonly Type[]): Option.Option<readonly Value[]> => {\n const values = pipe(\n types,\n Arr.map((member) => literalValueOf(member)),\n Arr.getSomes,\n Arr.dedupeWith((left, right) => valueKey(left) === valueKey(right)),\n );\n if (values.length !== types.length || values.length < MINIMUM_SET_SIZE) {\n return Option.none();\n }\n return Option.some(values);\n};\n\nconst literalUnionOf = (type: Type): Option.Option<readonly Value[]> => {\n if (!type.isUnionType()) {\n return Option.none();\n }\n return literalValuesOf(type.getTypes());\n};\n\nconst elementTypeOf = (checker: Checker, type: Type): Option.Option<Type> => {\n if (!checker.isArrayLikeType(type)) {\n return Option.none();\n }\n return Option.fromUndefinedOr(checker.getIndexTypeOfType(type, IndexKind.Number));\n};\n\nconst schemaTypeOf =\n (checker: Checker) =>\n (type: Type): Option.Option<Type> =>\n Arr.findFirst(SCHEMA_TYPE_PROPERTIES, (name) =>\n Option.fromUndefinedOr(checker.getPropertyOfType(type, name)),\n ).pipe(Option.map((property) => checker.getTypeOfSymbol(property)));\n\nconst finiteValuesOf =\n (checker: Checker) =>\n (type: Type): Option.Option<readonly Value[]> =>\n literalUnionOf(type).pipe(\n Option.orElse(() => elementTypeOf(checker, type).pipe(Option.flatMap(literalUnionOf))),\n Option.orElse(() => schemaTypeOf(checker)(type).pipe(Option.flatMap(literalUnionOf))),\n );\n\nconst vocabularyOf =\n (checker: Checker) =>\n (type: Type): Option.Option<Vocabulary> => {\n if (!type.isUnionType()) {\n return Option.none();\n }\n const optionalIds = new Set([checker.getUndefinedType().id, checker.getNullType().id]);\n const members = pipe(\n type.getTypes(),\n Arr.filter((member) => !optionalIds.has(member.id)),\n );\n const values = Arr.getSomes(\n pipe(\n members,\n Arr.map((member) => literalValueOf(member)),\n ),\n );\n if (values.length < MINIMUM_SET_SIZE) {\n return Option.none();\n }\n return Option.some({ values, admitsUnnamedValues: values.length !== members.length });\n };\n\nconst isSubsetOf: {\n (superset: readonly Value[]): (subset: readonly Value[]) => boolean;\n (subset: readonly Value[], superset: readonly Value[]): boolean;\n} = Fn.dual(DATA_FIRST_ARITY, (subset: readonly Value[], superset: readonly Value[]): boolean => {\n const held = new Set(\n pipe(\n superset,\n Arr.map((value) => valueKey(value)),\n ),\n );\n return pipe(\n subset,\n Arr.every((value) => held.has(valueKey(value))),\n );\n});\n\nconst sameValues: {\n (right: readonly Value[]): (left: readonly Value[]) => boolean;\n (left: readonly Value[], right: readonly Value[]): boolean;\n} = Fn.dual(\n DATA_FIRST_ARITY,\n (left: readonly Value[], right: readonly Value[]): boolean =>\n left.length === right.length && isSubsetOf(left, right),\n);\n\nconst valueText = (value: Value): string => {\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n return String(value);\n};\n\nconst formatValues = (values: readonly Value[]): string =>\n pipe(values, Arr.map(valueText), Arr.join(\" | \"));\n\nexport {\n finiteValuesOf,\n formatValues,\n isSubsetOf,\n literalUnionOf,\n literalValuesOf,\n sameValues,\n schemaTypeOf,\n valueKey,\n vocabularyOf,\n};\nexport type { Value, Vocabulary };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport {\n getNameOfDeclaration,\n isClassDeclaration,\n isElementAccessExpression,\n isIdentifier,\n isInterfaceDeclaration,\n isPropertyAccessExpression,\n isSignatureDeclaration,\n isTypeAliasDeclaration,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n ClassDeclaration,\n Declaration,\n Expression,\n InterfaceDeclaration,\n Node,\n Program,\n SignatureDeclaration,\n SourceFile,\n TypeSymbol,\n Type,\n} from \"./compiler.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { annotationOf, slotOf } from \"./slots.ts\";\nimport {\n contains,\n declarationsOf,\n descendantsOf,\n isExternalDeclaration,\n NODE_MODULES_SEGMENT,\n symbolAt,\n} from \"./syntax.ts\";\nimport { isSubsetOf, vocabularyOf } from \"./values.ts\";\n\ninterface Flow {\n readonly site: ValueSite;\n readonly target: string;\n}\n\ninterface FlowContext {\n readonly checker: Checker;\n readonly program: Program;\n readonly sites: readonly ValueSite[];\n}\n\nconst SCOPE_PREFIX = \"@\";\nconst SCOPED_SEGMENTS = 2;\nconst UNSCOPED_SEGMENTS = 1;\nconst MODULE_PREFIX = /^\".*?\"\\./u;\n\nconst packageOf = (fileName: string): string => {\n const afterModules = pipe(\n fileName,\n Str.lastIndexOf(NODE_MODULES_SEGMENT),\n Option.match({\n onNone: () => fileName,\n onSome: (index) => Str.slice(index + NODE_MODULES_SEGMENT.length)(fileName),\n }),\n );\n const segments = Str.split(\"/\")(afterModules);\n if (Str.startsWith(SCOPE_PREFIX)(afterModules)) {\n return pipe(Arr.take(segments, SCOPED_SEGMENTS), Arr.join(\"/\"));\n }\n return pipe(Arr.take(segments, UNSCOPED_SEGMENTS), Arr.join(\"/\"));\n};\n\nconst externalDeclarationOf =\n (context: FlowContext) =>\n (symbol: TypeSymbol): Option.Option<Declaration> =>\n Arr.findFirst(declarationsOf(symbol), (declaration) =>\n isExternalDeclaration(context.program)(declaration),\n );\n\nconst aliasTarget =\n (context: FlowContext) =>\n (type: Type): Option.Option<string> =>\n Option.fromUndefinedOr(type.getAliasSymbol()).pipe(\n Option.flatMap((alias) =>\n externalDeclarationOf(context)(alias).pipe(\n Option.map(\n (declaration) =>\n `${Str.replace(MODULE_PREFIX, \"\")(context.checker.getFullyQualifiedName(alias))} from ${packageOf(declaration.getSourceFile().fileName)}`,\n ),\n ),\n ),\n );\n\nconst isNamedContainer = (\n node: Node,\n): node is SignatureDeclaration | InterfaceDeclaration | ClassDeclaration =>\n isSignatureDeclaration(node) || isInterfaceDeclaration(node) || isClassDeclaration(node);\n\nconst slotTarget =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<string> =>\n slotOf(context.checker)(expression).pipe(\n Option.filter((slot) => isExternalDeclaration(context.program)(slot)),\n Option.filter((slot) =>\n Option.isSome(vocabularyOf(context.checker)(context.checker.getTypeAtLocation(slot))),\n ),\n Option.map((slot) => {\n const owner = Option.liftPredicate(slot.parent, isNamedContainer).pipe(\n Option.flatMap((container) => Option.fromUndefinedOr(getNameOfDeclaration(container))),\n Option.map((name) => ` of ${name.getText()}`),\n Option.getOrElse(() => \"\"),\n );\n const name = Option.fromUndefinedOr(getNameOfDeclaration(slot)).pipe(\n Option.map((found) => found.getText()),\n Option.getOrElse(() => \"value\"),\n );\n return `${name}${owner} from ${packageOf(slot.getSourceFile().fileName)}`;\n }),\n );\n\nconst libraryTargetOf =\n (context: FlowContext) =>\n (expression: Expression, contextual: Type): Option.Option<string> =>\n aliasTarget(context)(contextual).pipe(Option.orElse(() => slotTarget(context)(expression)));\n\nconst siteWithin =\n (context: FlowContext) =>\n (node: Node): Option.Option<ValueSite> =>\n Arr.findFirst(context.sites, (site) => contains(node)(site.node));\n\nconst aliasSite =\n (context: FlowContext) =>\n (type: Type): Option.Option<ValueSite> =>\n Option.fromUndefinedOr(type.getAliasSymbol()).pipe(\n Option.flatMap((alias) => Arr.findFirst(declarationsOf(alias), isTypeAliasDeclaration)),\n Option.flatMap(siteWithin(context)),\n );\n\nconst annotationSite =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<ValueSite> =>\n symbolAt(context.checker)(expression).pipe(\n Option.flatMap((symbol) => Option.fromUndefinedOr(symbol.valueDeclaration)),\n Option.flatMap((handle) => Option.fromUndefinedOr(handle.resolve())),\n Option.flatMap(annotationOf),\n Option.flatMap((annotation) =>\n siteWithin(context)(annotation).pipe(\n Option.orElse(() => aliasSite(context)(context.checker.getTypeFromTypeNode(annotation))),\n ),\n ),\n );\n\nconst siteBehind =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<ValueSite> =>\n aliasSite(context)(context.checker.getTypeAtLocation(expression)).pipe(\n Option.orElse(() => annotationSite(context)(expression)),\n );\n\nconst isFlowSource = (node: Node): node is Expression =>\n isIdentifier(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node);\n\nconst flowOf =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<Flow> =>\n Option.fromUndefinedOr(context.checker.getContextualType(expression)).pipe(\n Option.flatMap((contextual) =>\n Option.all([\n vocabularyOf(context.checker)(contextual),\n libraryTargetOf(context)(expression, contextual),\n ]),\n ),\n Option.flatMap(([vocabulary, target]) =>\n siteBehind(context)(expression).pipe(\n Option.filter((site) => isSubsetOf(site.values, vocabulary.values)),\n Option.map((site) => ({ site, target })),\n ),\n ),\n );\n\nconst flowsIn =\n (context: FlowContext) =>\n (sourceFile: SourceFile): readonly Flow[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isFlowSource(node)),\n Arr.map((node) => flowOf(context)(node)),\n ),\n );\n\nexport { flowsIn };\nexport type { Flow, FlowContext };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport {\n getJSDocTags,\n getTextOfJSDocComment,\n isIdentifier,\n isSourceFile,\n isVariableDeclaration,\n isVariableDeclarationList,\n isVariableStatement,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Node,\n SourceFile,\n Type,\n VariableDeclaration,\n VariableDeclarationList,\n} from \"./compiler.ts\";\nimport { problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { Project } from \"./project.ts\";\nimport { columnOf, descendantsOf, lineOf } from \"./syntax.ts\";\nimport { finiteValuesOf, formatValues, literalValuesOf, sameValues } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface Owner {\n readonly conceptId: string;\n readonly key: string;\n readonly name: string;\n readonly file: string;\n readonly line: number;\n readonly column: number;\n readonly packageName: Option.Option<string>;\n readonly values: readonly Value[];\n}\n\ninterface OwnerScan {\n readonly owners: readonly Owner[];\n readonly problems: readonly Problem[];\n}\n\ninterface Annotated {\n readonly node: Node;\n readonly conceptId: string;\n}\n\nconst OWNER_TAG = \"msch\";\nconst FIRST_OWNER_COUNT = 1;\n\nconst ownerKeyOf = (declaration: Declaration): Option.Option<string> => {\n if (!isVariableDeclaration(declaration) || !isIdentifier(declaration.name)) {\n return Option.none();\n }\n return Option.some(`${declaration.getSourceFile().fileName}#${declaration.name.text}`);\n};\n\nconst annotationsOf = (node: Node): readonly Annotated[] =>\n pipe(\n getJSDocTags(node),\n Arr.filter((tag) => tag.tagName.text === OWNER_TAG),\n Arr.map((tag) => ({ node, conceptId: Str.trim(getTextOfJSDocComment(tag.comment) ?? \"\") })),\n );\n\nconst ANNOTATABLE_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.VariableDeclaration,\n SyntaxKind.FunctionDeclaration,\n SyntaxKind.ClassDeclaration,\n SyntaxKind.InterfaceDeclaration,\n SyntaxKind.TypeAliasDeclaration,\n SyntaxKind.EnumDeclaration,\n SyntaxKind.PropertySignature,\n SyntaxKind.PropertyAssignment,\n SyntaxKind.PropertyDeclaration,\n]);\n\nconst isAnnotatable = (node: Node): boolean => ANNOTATABLE_KINDS.has(node.kind);\n\nconst isConstList = (list: VariableDeclarationList): boolean =>\n Option.fromUndefinedOr(list.getFirstToken()).pipe(\n Option.exists((token) => token.kind === SyntaxKind.ConstKeyword),\n );\n\nconst isModuleStatementList = (list: VariableDeclarationList): boolean =>\n isVariableStatement(list.parent) && isSourceFile(list.parent.parent);\n\nconst isModuleConstList = (node: Node): node is VariableDeclarationList =>\n isVariableDeclarationList(node) && isModuleStatementList(node) && isConstList(node);\n\nconst isModuleConst = (node: Node): node is VariableDeclaration =>\n isVariableDeclaration(node) && isIdentifier(node.name) && isModuleConstList(node.parent);\n\nconst objectValuesOf =\n (checker: Checker) =>\n (type: Type): Option.Option<readonly Value[]> =>\n literalValuesOf(\n pipe(\n checker.getPropertiesOfType(type),\n Arr.map((property) => checker.getTypeOfSymbol(property)),\n ),\n );\n\nconst ownerValuesOf =\n (checker: Checker) =>\n (declaration: VariableDeclaration): Option.Option<readonly Value[]> => {\n const type = checker.getTypeAtLocation(declaration.name);\n return finiteValuesOf(checker)(type).pipe(Option.orElse(() => objectValuesOf(checker)(type)));\n };\n\nconst annotationProblem = (message: string): ((node: Node) => Problem) =>\n problemAt({ rule: \"owner-annotation\", message });\n\nconst scanned = (owners: readonly Owner[], problems: readonly Problem[]): OwnerScan => ({\n owners,\n problems,\n});\n\nconst ownerOf =\n (project: Project) =>\n (annotated: Annotated): OwnerScan => {\n const { node, conceptId } = annotated;\n if (!isModuleConst(node)) {\n return scanned(\n [],\n [annotationProblem(`@${OWNER_TAG} registers an owner only on a module-scope const.`)(node)],\n );\n }\n if (conceptId === \"\") {\n return scanned([], [annotationProblem(`@${OWNER_TAG} needs a concept id.`)(node)]);\n }\n const values = ownerValuesOf(project.checker)(node);\n return Option.match(Option.all([values, ownerKeyOf(node)]), {\n onNone: () =>\n scanned(\n [],\n [annotationProblem(`The owner of ${conceptId} holds no finite value set.`)(node)],\n ),\n onSome: ([ownedValues, key]) =>\n scanned(\n [\n {\n conceptId,\n key,\n name: node.name.getText(),\n file: node.getSourceFile().fileName,\n line: lineOf(node),\n column: columnOf(node),\n packageName: project.packageName,\n values: ownedValues,\n },\n ],\n [],\n ),\n });\n };\n\nconst annotatedIn = (sourceFile: SourceFile): readonly Annotated[] =>\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isAnnotatable(node)),\n Arr.flatMap((node) => annotationsOf(node)),\n );\n\nconst ownerProblem =\n (message: string) =>\n (owner: Owner): Problem => ({\n file: owner.file,\n line: owner.line,\n column: owner.column,\n rule: \"owner-annotation\",\n message,\n });\n\nconst conflictProblems = (owners: readonly Owner[]): readonly Problem[] =>\n pipe(\n owners,\n Arr.flatMap((owner, index) => {\n const earlier = Arr.take(owners, index);\n const sameConcept = pipe(\n earlier,\n Arr.filter((other) => other.conceptId === owner.conceptId),\n );\n const sameSet = pipe(\n earlier,\n Arr.filter(\n (other) => other.conceptId !== owner.conceptId && sameValues(other.values, owner.values),\n ),\n );\n return [\n ...pipe(\n Arr.take(sameConcept, FIRST_OWNER_COUNT),\n Arr.map(() =>\n ownerProblem(`The concept ${owner.conceptId} already has an owner.`)(owner),\n ),\n ),\n ...pipe(\n Arr.take(sameSet, FIRST_OWNER_COUNT),\n Arr.map((other) =>\n ownerProblem(\n `The values ${formatValues(owner.values)} are already owned by ${other.conceptId}.`,\n )(owner),\n ),\n ),\n ];\n }),\n );\n\nconst ownersIn = (project: Project): OwnerScan => {\n const results = pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) =>\n pipe(\n annotatedIn(sourceFile),\n Arr.map((annotated) => ownerOf(project)(annotated)),\n ),\n ),\n );\n return scanned(\n pipe(\n results,\n Arr.flatMap((result) => result.owners),\n ),\n pipe(\n results,\n Arr.flatMap((result) => result.problems),\n ),\n );\n};\n\nconst combineOwnerScans = (scans: readonly OwnerScan[]): OwnerScan => {\n const owners = Arr.dedupeWith(\n pipe(\n scans,\n Arr.flatMap((scan) => scan.owners),\n ),\n (left, right) => left.key === right.key,\n );\n const problems = [\n ...pipe(\n scans,\n Arr.flatMap((scan) => scan.problems),\n ),\n ...conflictProblems(owners),\n ];\n return { owners, problems };\n};\n\nexport { OWNER_TAG, combineOwnerScans, ownerKeyOf, ownersIn };\nexport type { Owner, OwnerScan };\n","import { Array as Arr, Effect, Option, pipe } from \"effect\";\n\nimport { InternalSymbolName, isModuleDeclaration, isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Declaration, Node, SyntaxKind, TypeSymbol, Type } from \"./compiler.ts\";\nimport type { DependencyEntry } from \"./dependencies.ts\";\nimport {\n declarationsOf,\n isGenericDeclaration,\n isTypeDeclaration,\n propertyNamesOf,\n resolvedSymbol,\n} from \"./syntax.ts\";\nimport { schemaTypeOf, vocabularyOf } from \"./values.ts\";\nimport type { Vocabulary } from \"./values.ts\";\n\ninterface LibraryType {\n readonly specifier: string;\n readonly typeName: string;\n}\n\ninterface LibraryVocabulary extends LibraryType {\n readonly vocabulary: Vocabulary;\n}\n\ninterface DeclarationLocation {\n readonly file: string;\n readonly pos: number;\n readonly kind: SyntaxKind;\n}\n\ninterface LibraryShape extends LibraryType {\n readonly form: \"declared\" | \"schema\";\n readonly declaration: DeclarationLocation;\n readonly propertyNames: readonly string[];\n}\n\ninterface LibraryIndex {\n readonly vocabularies: readonly LibraryVocabulary[];\n readonly shapes: readonly LibraryShape[];\n}\n\ninterface Walk {\n readonly checker: Checker;\n readonly entry: DependencyEntry;\n}\n\ninterface Visit {\n readonly exported: TypeSymbol;\n readonly qualifier: string;\n readonly ancestors: readonly TypeSymbol[];\n}\n\ninterface Exported {\n readonly symbol: TypeSymbol;\n readonly typeName: string;\n}\n\nconst NAMESPACE_DEPTH_LIMIT = 8;\nconst EMPTY_INDEX: LibraryIndex = { vocabularies: [], shapes: [] };\n\nconst isObjectType =\n (checker: Checker) =>\n (type: Type): boolean =>\n !type.isUnionType() &&\n !type.isLiteralType() &&\n checker.getApparentType(type).id === type.id &&\n Arr.isReadonlyArrayNonEmpty(checker.getPropertiesOfType(type));\n\nconst describeLibraryType = (type: LibraryType): string =>\n `${type.typeName} from ${type.specifier}`;\n\nconst locationOf = (declaration: Node): DeclarationLocation => ({\n file: declaration.getSourceFile().fileName,\n pos: declaration.pos,\n kind: declaration.kind,\n});\n\nconst declarationKey = (location: DeclarationLocation): string =>\n `${location.file}#${String(location.pos)}#${String(location.kind)}`;\n\ntype ShapeSource = LibraryType & Pick<LibraryShape, \"form\">;\n\nconst shapeOf =\n (checker: Checker) =>\n (source: ShapeSource, declaration: Declaration, type: Type): readonly LibraryShape[] =>\n Arr.filter(\n [\n {\n ...source,\n declaration: locationOf(declaration),\n propertyNames: propertyNamesOf(checker)(type),\n },\n ],\n () => isObjectType(checker)(type),\n );\n\nconst declaredTypeIndex = (walk: Walk, exported: Exported): LibraryIndex => {\n const declaration = Arr.findFirst(declarationsOf(exported.symbol), isTypeDeclaration);\n if (Option.isNone(declaration) || isGenericDeclaration(declaration.value)) {\n return EMPTY_INDEX;\n }\n const located = { specifier: walk.entry.specifier, typeName: exported.typeName };\n const type = walk.checker.getDeclaredTypeOfSymbol(exported.symbol);\n const vocabularies = vocabularyOf(walk.checker)(type).pipe(\n Option.map((vocabulary) => ({ ...located, vocabulary })),\n Option.toArray,\n );\n const shapes = shapeOf(walk.checker)({ ...located, form: \"declared\" }, declaration.value, type);\n return { vocabularies, shapes };\n};\n\nconst schemaTypeIndex =\n (walk: Walk, located: LibraryType) =>\n (declaration: Declaration, schemaType: Type): LibraryIndex => ({\n vocabularies: vocabularyOf(walk.checker)(schemaType).pipe(\n Option.map((vocabulary) => ({ ...located, vocabulary })),\n Option.toArray,\n ),\n shapes: shapeOf(walk.checker)({ ...located, form: \"schema\" }, declaration, schemaType),\n });\n\nconst schemaValueIndex = (walk: Walk, exported: Exported): LibraryIndex => {\n const declaration = Arr.findFirst(declarationsOf(exported.symbol), isVariableDeclaration);\n if (Option.isNone(declaration)) {\n return EMPTY_INDEX;\n }\n const valueType = walk.checker.getTypeOfSymbolAtLocation(exported.symbol, declaration.value);\n const located = {\n specifier: walk.entry.specifier,\n typeName: `(typeof ${exported.typeName})[\"Type\"]`,\n };\n return Option.match(schemaTypeOf(walk.checker)(valueType), {\n onNone: () => EMPTY_INDEX,\n onSome: (schemaType) => schemaTypeIndex(walk, located)(declaration.value, schemaType),\n });\n};\n\nconst mergeIndexes = (indexes: readonly LibraryIndex[]): LibraryIndex => ({\n vocabularies: pipe(\n indexes,\n Arr.flatMap((index) => index.vocabularies),\n ),\n shapes: pipe(\n indexes,\n Arr.flatMap((index) => index.shapes),\n ),\n});\n\nconst isNamespace = (symbol: TypeSymbol): boolean =>\n pipe(\n declarationsOf(symbol),\n Arr.some((declaration) => isModuleDeclaration(declaration)),\n );\n\nconst indexUnder = (walk: Walk, visit: Visit): LibraryIndex => {\n const symbol = resolvedSymbol(walk.checker)(visit.exported);\n const named = { symbol, typeName: `${visit.qualifier}${visit.exported.name}` };\n const own = mergeIndexes([declaredTypeIndex(walk, named), schemaValueIndex(walk, named)]);\n if (\n !isNamespace(symbol) ||\n visit.ancestors.length >= NAMESPACE_DEPTH_LIMIT ||\n visit.ancestors.includes(symbol)\n ) {\n return own;\n }\n const nested = pipe(\n walk.checker.getExportsOfModule(symbol),\n Arr.map((member) =>\n indexUnder(walk, {\n exported: member,\n qualifier: `${named.typeName}.`,\n ancestors: [...visit.ancestors, symbol],\n }),\n ),\n );\n return mergeIndexes([own, ...nested]);\n};\n\nconst exportAssignmentOf = (moduleSymbol: TypeSymbol): Option.Option<TypeSymbol> =>\n Option.fromUndefinedOr(moduleSymbol.getExports().get(InternalSymbolName.ExportEquals));\n\nconst indexOfEntry =\n (checker: Checker) =>\n (entry: DependencyEntry): LibraryIndex => {\n const moduleSymbol = Option.fromUndefinedOr(\n checker.getSymbolOfSourceFile(entry.declarationsPath),\n );\n if (Option.isNone(moduleSymbol)) {\n return EMPTY_INDEX;\n }\n const walk: Walk = { checker, entry };\n const roots = Option.match(exportAssignmentOf(moduleSymbol.value), {\n onNone: () => checker.getExportsOfModule(moduleSymbol.value),\n onSome: (assigned) => [resolvedSymbol(checker)(assigned)],\n });\n return mergeIndexes(\n pipe(\n roots,\n Arr.map((exported) => indexUnder(walk, { exported, qualifier: \"\", ancestors: [] })),\n ),\n );\n };\n\ninterface CachedIndex {\n readonly index: LibraryIndex;\n readonly cached: boolean;\n}\n\ninterface LibraryCache {\n readonly indexOf: (entry: DependencyEntry, compute: () => LibraryIndex) => CachedIndex;\n}\n\nconst libraryCache = (): LibraryCache => {\n const indexes = new Map<string, LibraryIndex>();\n return {\n indexOf: (entry, compute) =>\n Option.match(Option.fromUndefinedOr(indexes.get(entry.declarationsPath)), {\n onSome: (index) => ({ index, cached: true }),\n onNone: () => {\n const index = compute();\n indexes.set(entry.declarationsPath, index);\n return { index, cached: false };\n },\n }),\n };\n};\n\nconst indexEntry =\n (cache: LibraryCache) =>\n (checker: Checker) =>\n (entry: DependencyEntry): Effect.Effect<LibraryIndex> =>\n Effect.sync(() => cache.indexOf(entry, () => indexOfEntry(checker)(entry))).pipe(\n Effect.tap(({ index, cached }) =>\n Effect.annotateCurrentSpan({\n \"msch.library.cached\": cached,\n \"msch.library.vocabularies\": index.vocabularies.length,\n \"msch.library.shapes\": index.shapes.length,\n }),\n ),\n Effect.map(({ index }) => index),\n Effect.withSpan(\"indexLibraryEntry\", {\n attributes: { \"msch.library.specifier\": entry.specifier },\n }),\n );\n\nconst libraryIndex =\n (cache: LibraryCache) =>\n (checker: Checker) =>\n (entries: readonly DependencyEntry[]): Effect.Effect<LibraryIndex> =>\n pipe(\n entries,\n Effect.forEach(indexEntry(cache)(checker)),\n Effect.map(mergeIndexes),\n Effect.withSpan(\"libraryIndex\"),\n );\n\nexport {\n declarationKey,\n describeLibraryType,\n isObjectType,\n libraryCache,\n libraryIndex,\n locationOf,\n};\nexport type {\n CachedIndex,\n DeclarationLocation,\n LibraryCache,\n LibraryIndex,\n LibraryShape,\n LibraryType,\n LibraryVocabulary,\n};\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport { isSatisfiesExpression, isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Node } from \"./compiler.ts\";\nimport { declarationKey, locationOf } from \"./library.ts\";\nimport { declarationsOf, referencedSymbols } from \"./syntax.ts\";\n\nconst contractOf = (node: Node): readonly Node[] => {\n const { parent } = node;\n if (isSatisfiesExpression(parent) && parent.expression === node) {\n return [parent.type];\n }\n if (isVariableDeclaration(parent) && parent.initializer === node) {\n return Option.toArray(Option.fromUndefinedOr(parent.type));\n }\n return [];\n};\n\nconst derivedDeclarationsOf =\n (checker: Checker) =>\n (node: Node): ReadonlySet<string> => {\n const scopes = Arr.prepend(contractOf(node), node);\n return new Set(\n pipe(\n scopes,\n Arr.flatMap((scope) => referencedSymbols(checker)(scope)),\n Arr.flatMap((symbol) => declarationsOf(symbol)),\n Arr.map((declaration) => declarationKey(locationOf(declaration))),\n ),\n );\n };\n\nexport { derivedDeclarationsOf };\n","import { Array as Arr, Option, Order, pipe } from \"effect\";\n\nimport {\n isCallExpression,\n isInterfaceDeclaration,\n isModuleBlock,\n isModuleDeclaration,\n isObjectLiteralExpression,\n isStringLiteral,\n isTypeAliasDeclaration,\n isTypeLiteralNode,\n isVariableDeclaration,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n EnumDeclaration,\n InterfaceDeclaration,\n Node,\n Program,\n SourceFile,\n TypeSymbol,\n Type,\n TypeAliasDeclaration,\n VariableDeclaration,\n} from \"./compiler.ts\";\nimport { derivedDeclarationsOf } from \"./derivation.ts\";\nimport { declarationKey, describeLibraryType, isObjectType } from \"./library.ts\";\nimport type { DeclarationLocation, LibraryShape } from \"./library.ts\";\nimport { CANDIDATE_LIMIT, problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { descendantsOf, isGenericDeclaration, isTypeDeclaration } from \"./syntax.ts\";\nimport { schemaTypeOf } from \"./values.ts\";\n\ninterface ShapeContext {\n readonly checker: Checker;\n readonly program: Program;\n readonly shapes: readonly LibraryShape[];\n}\n\ninterface ShapeSite {\n readonly node: Node;\n readonly type: Type;\n}\n\ninterface ShapeMatch {\n readonly shape: LibraryShape;\n readonly extra: number;\n}\n\nconst MINIMUM_SHAPE_PROPERTIES = 3;\nconst EXACT = 0;\n\nconst augmentsAModule = (node: Node): boolean => {\n const block = node.parent;\n return (\n isModuleBlock(block) && isModuleDeclaration(block.parent) && isStringLiteral(block.parent.name)\n );\n};\n\nconst isPlainInterface = (node: Node): node is InterfaceDeclaration =>\n isInterfaceDeclaration(node) && !isGenericDeclaration(node) && !augmentsAModule(node);\n\nconst isPlainTypeLiteral = (node: Node): node is TypeAliasDeclaration =>\n isTypeAliasDeclaration(node) && !isGenericDeclaration(node) && isTypeLiteralNode(node.type);\n\nconst isDeclaredShape = (node: Node): node is InterfaceDeclaration | TypeAliasDeclaration =>\n isPlainInterface(node) || isPlainTypeLiteral(node);\n\nconst declaredShapeOf =\n (checker: Checker) =>\n (node: Node): Option.Option<Type> =>\n Option.liftPredicate(node, isDeclaredShape).pipe(\n Option.map((declaration) => checker.getTypeAtLocation(declaration.name)),\n );\n\nconst schemaShapeOf =\n (checker: Checker) =>\n (node: Node): Option.Option<Type> => {\n if (!isCallExpression(node)) {\n return Option.none();\n }\n const { arguments: callArguments } = node;\n if (\n !pipe(\n callArguments,\n Arr.some((argument) => isObjectLiteralExpression(argument)),\n )\n ) {\n return Option.none();\n }\n return schemaTypeOf(checker)(checker.getTypeAtLocation(node)).pipe(\n Option.filter((type) => isObjectType(checker)(type)),\n );\n };\n\nconst shapeSitesIn =\n (checker: Checker) =>\n (sourceFile: SourceFile): readonly ShapeSite[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.map((node) =>\n declaredShapeOf(checker)(node).pipe(\n Option.orElse(() => schemaShapeOf(checker)(node)),\n Option.map((type) => ({ node, type })),\n ),\n ),\n ),\n );\n\ninterface LocalProperty {\n readonly name: string;\n readonly type: Type;\n}\n\ninterface OpenTypeIds {\n readonly any: number;\n readonly unknown: number;\n}\n\nconst openTypeIdsOf = (checker: Checker): OpenTypeIds => ({\n any: checker.getAnyType().id,\n unknown: checker.getUnknownType().id,\n});\n\ntype IndexedDeclaration =\n | TypeAliasDeclaration\n | InterfaceDeclaration\n | EnumDeclaration\n | VariableDeclaration;\n\nconst isIndexedDeclaration = (node: Node): node is IndexedDeclaration =>\n isTypeDeclaration(node) || isVariableDeclaration(node);\n\nconst declarationAt =\n (program: Program) =>\n (location: DeclarationLocation): Option.Option<IndexedDeclaration> =>\n Option.fromUndefinedOr(program.getSourceFile(location.file)).pipe(\n Option.flatMap((sourceFile) =>\n Arr.findFirst(\n descendantsOf(sourceFile),\n (node): node is IndexedDeclaration =>\n node.pos === location.pos && node.kind === location.kind && isIndexedDeclaration(node),\n ),\n ),\n );\n\nconst symbolOfDeclaration =\n (checker: Checker) =>\n (declaration: IndexedDeclaration): Option.Option<TypeSymbol> =>\n Option.fromUndefinedOr(checker.getSymbolAtLocation(declaration.name));\n\nconst shapeTypeOf =\n (context: ShapeContext) =>\n (shape: LibraryShape): Option.Option<Type> => {\n const { checker } = context;\n return declarationAt(context.program)(shape.declaration).pipe(\n Option.flatMap((declaration) =>\n symbolOfDeclaration(checker)(declaration).pipe(\n Option.flatMap((symbol) => {\n if (shape.form === \"declared\") {\n return Option.some(checker.getDeclaredTypeOfSymbol(symbol));\n }\n return schemaTypeOf(checker)(checker.getTypeOfSymbolAtLocation(symbol, declaration));\n }),\n ),\n ),\n );\n };\n\nconst hasEveryName =\n (locals: readonly LocalProperty[]) =>\n (shape: LibraryShape): boolean => {\n const names: ReadonlySet<string> = new Set(shape.propertyNames);\n return pipe(\n locals,\n Arr.every((local) => names.has(local.name)),\n );\n };\n\nconst sameProperty =\n (checker: Checker, open: OpenTypeIds) =>\n (localType: Type, library: TypeSymbol): boolean => {\n const libraryType = checker.getTypeOfSymbol(library);\n return (\n libraryType.id !== open.any &&\n libraryType.id !== open.unknown &&\n checker.isTypeAssignableTo(localType, libraryType) &&\n checker.isTypeAssignableTo(libraryType, localType)\n );\n };\n\nconst matchOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (locals: readonly LocalProperty[], shape: LibraryShape): Option.Option<ShapeMatch> => {\n const { checker } = context;\n const matches = shapeTypeOf(context)(shape).pipe(\n Option.exists((shapeType) =>\n pipe(\n locals,\n Arr.every((local) =>\n Option.fromUndefinedOr(checker.getPropertyOfType(shapeType, local.name)).pipe(\n Option.exists((library) => sameProperty(checker, open)(local.type, library)),\n ),\n ),\n ),\n ),\n );\n if (!matches) {\n return Option.none();\n }\n return Option.some({ shape, extra: shape.propertyNames.length - locals.length });\n };\n\nconst localPropertiesOf =\n (checker: Checker) =>\n (symbols: readonly TypeSymbol[]): readonly LocalProperty[] =>\n pipe(\n Arr.zip(symbols, checker.getTypeOfSymbol(symbols)),\n Arr.map(([symbol, type]) => ({ name: symbol.name, type })),\n );\n\nconst matchOrder = Order.mapInput(Order.Number, (match: ShapeMatch) => match.extra);\n\nconst shapeProblem = (site: ShapeSite, matches: readonly ShapeMatch[]): Problem => {\n const shown = pipe(\n Arr.take(matches, CANDIDATE_LIMIT),\n Arr.map((match) => describeLibraryType(match.shape)),\n Arr.join(\", \"),\n );\n const advice = Option.match(\n Arr.findFirst(matches, (match) => match.extra === EXACT),\n {\n onNone: () =>\n \"Derive it from the library type, for example with Pick, instead of copying its properties.\",\n onSome: () => \"Use the library type instead of copying it.\",\n },\n );\n return problemAt({ rule: \"library-shape\", message: `This shape copies ${shown}. ${advice}` })(\n site.node,\n );\n};\n\nconst candidatesOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (site: ShapeSite, locals: readonly LocalProperty[]): readonly ShapeMatch[] => {\n const derived = derivedDeclarationsOf(context.checker)(site.node);\n const named = pipe(context.shapes, Arr.filter(hasEveryName(locals)));\n if (\n pipe(\n named,\n Arr.some((shape) => derived.has(declarationKey(shape.declaration))),\n )\n ) {\n return [];\n }\n const candidates = pipe(\n named,\n Arr.map((shape) => matchOf(context, open)(locals, shape)),\n Arr.getSomes,\n );\n return Arr.sort(candidates, matchOrder);\n };\n\nconst shapeProblemOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (site: ShapeSite): Option.Option<Problem> => {\n const symbols = context.checker.getPropertiesOfType(site.type);\n if (symbols.length < MINIMUM_SHAPE_PROPERTIES) {\n return Option.none();\n }\n const locals = localPropertiesOf(context.checker)(symbols);\n return Option.liftPredicate(\n candidatesOf(context, open)(site, locals),\n Arr.isReadonlyArrayNonEmpty,\n ).pipe(Option.map((found) => shapeProblem(site, found)));\n };\n\nconst shapeProblemsIn =\n (context: ShapeContext) =>\n (sourceFile: SourceFile): readonly Problem[] => {\n const sites = shapeSitesIn(context.checker)(sourceFile);\n if (!Arr.isReadonlyArrayNonEmpty(sites)) {\n return [];\n }\n const open = openTypeIdsOf(context.checker);\n return Arr.getSomes(\n pipe(\n sites,\n Arr.map((site) => shapeProblemOf(context, open)(site)),\n ),\n );\n };\n\nexport { shapeProblemsIn };\nexport type { ShapeContext };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport {\n isArrayLiteralExpression,\n isCallExpression,\n isElementAccessExpression,\n isEnumDeclaration,\n isIdentifier,\n isPropertyAccessExpression,\n isSpreadElement,\n isTypeReferenceNode,\n isUnionTypeNode,\n} from \"./compiler.ts\";\nimport type {\n ArrayLiteralExpression,\n CallExpression,\n Checker,\n Expression,\n Node,\n TypeSymbol,\n TypeNode,\n UnionTypeNode,\n} from \"./compiler.ts\";\nimport {\n childrenOf,\n declarationsOf,\n isTypeDeclaration,\n propertyNamesOf,\n referencedSymbols,\n} from \"./syntax.ts\";\nimport { finiteValuesOf, isSubsetOf, literalUnionOf, schemaTypeOf } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface ValueSite {\n readonly node: Node;\n readonly values: readonly Value[];\n readonly sources: readonly TypeSymbol[];\n}\n\nconst namedValuesOf =\n (checker: Checker) =>\n (symbol: TypeSymbol): Option.Option<readonly Value[]> => {\n if (\n pipe(\n declarationsOf(symbol),\n Arr.some((declaration) => isTypeDeclaration(declaration)),\n )\n ) {\n return finiteValuesOf(checker)(checker.getDeclaredTypeOfSymbol(symbol));\n }\n return finiteValuesOf(checker)(checker.getTypeOfSymbol(symbol));\n };\n\nconst hasFiniteContext =\n (checker: Checker) =>\n (node: Expression): boolean =>\n Option.fromUndefinedOr(checker.getContextualType(node)).pipe(\n Option.flatMap(finiteValuesOf(checker)),\n Option.isSome,\n );\n\nconst isNamedValue = (element: Expression): boolean => {\n if (isSpreadElement(element)) {\n return isNamedValue(element.expression);\n }\n return (\n isIdentifier(element) ||\n isPropertyAccessExpression(element) ||\n isElementAccessExpression(element)\n );\n};\n\nconst namesEveryElement = (array: ArrayLiteralExpression): boolean =>\n pipe(\n array.elements,\n Arr.every((element) => isNamedValue(element)),\n );\n\nconst expressionValuesOf =\n (checker: Checker) =>\n (node: Expression): Option.Option<readonly Value[]> => {\n if (hasFiniteContext(checker)(node)) {\n return Option.none();\n }\n const type = checker.getTypeAtLocation(node);\n if (isArrayLiteralExpression(node)) {\n return Option.liftPredicate(node, (array) => !namesEveryElement(array)).pipe(\n Option.flatMap(() => finiteValuesOf(checker)(type)),\n );\n }\n return schemaTypeOf(checker)(type).pipe(Option.flatMap(literalUnionOf));\n };\n\nconst selectsKeys =\n (checker: Checker) =>\n (node: UnionTypeNode, values: readonly Value[]): boolean => {\n const { parent } = node;\n if (!isTypeReferenceNode(parent)) {\n return false;\n }\n const typeArguments: readonly TypeNode[] = parent.typeArguments ?? [];\n return pipe(\n typeArguments,\n Arr.filter((argument) => argument !== node),\n Arr.some((argument) =>\n isSubsetOf(values, propertyNamesOf(checker)(checker.getTypeFromTypeNode(argument))),\n ),\n );\n };\n\nconst unionValuesOf =\n (checker: Checker) =>\n (node: UnionTypeNode): Option.Option<readonly Value[]> =>\n literalUnionOf(checker.getTypeFromTypeNode(node)).pipe(\n Option.filter((values) => !selectsKeys(checker)(node, values)),\n );\n\nconst isExpressionSite = (node: Node): node is ArrayLiteralExpression | CallExpression =>\n isArrayLiteralExpression(node) || isCallExpression(node);\n\nconst expressionSiteValuesOf =\n (checker: Checker) =>\n (node: Node): Option.Option<readonly Value[]> =>\n Option.liftPredicate(node, isExpressionSite).pipe(Option.flatMap(expressionValuesOf(checker)));\n\nconst siteValuesOf =\n (checker: Checker) =>\n (node: Node): Option.Option<readonly Value[]> => {\n if (isUnionTypeNode(node)) {\n return unionValuesOf(checker)(node);\n }\n if (isEnumDeclaration(node)) {\n return literalUnionOf(checker.getTypeAtLocation(node.name));\n }\n return expressionSiteValuesOf(checker)(node);\n };\n\nconst derivationScopeOf = (node: Node): Node => {\n if (isTypeReferenceNode(node.parent)) {\n return node.parent;\n }\n return node;\n};\n\nconst sourcesOf =\n (checker: Checker) =>\n (node: Node): readonly TypeSymbol[] =>\n pipe(\n referencedSymbols(checker)(derivationScopeOf(node)),\n Arr.filter((symbol) => Option.isSome(namedValuesOf(checker)(symbol))),\n );\n\nconst sitesUnder =\n (checker: Checker) =>\n (node: Node): readonly ValueSite[] => {\n const nested = pipe(\n childrenOf(node),\n Arr.flatMap((child) => sitesUnder(checker)(child)),\n );\n if (Arr.isReadonlyArrayNonEmpty(nested)) {\n return nested;\n }\n return siteValuesOf(checker)(node).pipe(\n Option.map((values) => ({ node, values, sources: sourcesOf(checker)(node) })),\n Option.toArray,\n );\n };\n\nexport { sitesUnder };\nexport type { ValueSite };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport {\n isBinaryExpression,\n isCallExpression,\n isNewExpression,\n isNumericLiteral,\n isPropertyAssignment,\n isStringLiteral,\n isTypeAliasDeclaration,\n isVariableDeclaration,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Node,\n NumericLiteral,\n SourceFile,\n StringLiteral,\n TypeSymbol,\n} from \"./compiler.ts\";\nimport type { Flow } from \"./flows.ts\";\nimport { describeLibraryType } from \"./library.ts\";\nimport type { LibraryVocabulary } from \"./library.ts\";\nimport { ownerKeyOf } from \"./owners.ts\";\nimport type { Owner } from \"./owners.ts\";\nimport { CANDIDATE_LIMIT, problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { contextSymbolsOf } from \"./slots.ts\";\nimport {\n contains,\n declarationsOf,\n descendantsOf,\n importedModulesOf,\n referencedSymbols,\n uniqueByReference,\n} from \"./syntax.ts\";\nimport { formatValues, isSubsetOf, vocabularyOf } from \"./values.ts\";\n\ninterface ValueContext {\n readonly checker: Checker;\n readonly owners: readonly Owner[];\n readonly vocabularies: readonly LibraryVocabulary[];\n readonly flows: readonly Flow[];\n}\n\ninterface SiteVerdict {\n readonly problems: readonly Problem[];\n readonly unowned: readonly ValueSite[];\n}\n\nconst OWNER_SEARCH_DEPTH = 4;\nconst NOTHING_HIDDEN = 0;\n\nconst directOwners =\n (context: ValueContext) =>\n (symbol: TypeSymbol): readonly Owner[] => {\n const keys = Arr.getSomes(\n pipe(\n declarationsOf(symbol),\n Arr.map((declaration) => ownerKeyOf(declaration)),\n ),\n );\n return pipe(\n context.owners,\n Arr.filter((owner) => keys.includes(owner.key)),\n );\n };\n\nconst isFollowable = (declaration: Declaration): boolean =>\n !declaration.getSourceFile().isDeclarationFile &&\n (isTypeAliasDeclaration(declaration) || isVariableDeclaration(declaration));\n\nconst ownersBehind =\n (context: ValueContext) =>\n (symbol: TypeSymbol, ancestors: readonly TypeSymbol[]): readonly Owner[] => {\n const direct = directOwners(context)(symbol);\n if (Arr.isReadonlyArrayNonEmpty(direct) || ancestors.length >= OWNER_SEARCH_DEPTH) {\n return direct;\n }\n const visited = [...ancestors, symbol];\n return uniqueByReference(\n pipe(\n declarationsOf(symbol),\n Arr.filter((declaration) => isFollowable(declaration)),\n Arr.flatMap((declaration) => referencedSymbols(context.checker)(declaration)),\n Arr.filter((referenced) => !visited.includes(referenced)),\n Arr.flatMap((referenced) => ownersBehind(context)(referenced, visited)),\n ),\n );\n };\n\nconst describeOwners = (owners: readonly Owner[]): string =>\n pipe(\n owners,\n Arr.map((owner) => `${owner.conceptId} (${owner.name})`),\n Arr.join(\", \"),\n );\n\nconst verdict = (problems: readonly Problem[], unowned: readonly ValueSite[]): SiteVerdict => ({\n problems,\n unowned,\n});\n\nconst derivedVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n const owners = uniqueByReference(\n pipe(\n site.sources,\n Arr.flatMap((source) => ownersBehind(context)(source, [])),\n ),\n );\n const held = pipe(\n owners,\n Arr.flatMap((owner) => owner.values),\n );\n const added = pipe(\n site.values,\n Arr.filter((value) => !isSubsetOf([value], held)),\n );\n if (!Arr.isReadonlyArrayNonEmpty(owners) || !Arr.isReadonlyArrayNonEmpty(added)) {\n return verdict([], []);\n }\n const message = `This set adds ${formatValues(added)} to ${describeOwners(owners)}. Add the values to the owner, or register the wider set as its own concept.`;\n return verdict([problemAt({ rule: \"owner-extension\", message })(site.node)], []);\n };\n\nconst libraryCandidates =\n (context: ValueContext) =>\n (site: ValueSite): readonly string[] => {\n const flowing = Arr.dedupe(\n pipe(\n context.flows,\n Arr.filter((flow) => flow.site.node === site.node),\n Arr.map((flow) => flow.target),\n ),\n );\n if (Arr.isReadonlyArrayNonEmpty(flowing)) {\n return flowing;\n }\n if (\n !pipe(\n site.values,\n Arr.some((value) => typeof value === \"string\"),\n )\n ) {\n return [];\n }\n const imported = importedModulesOf(site.node.getSourceFile());\n return Arr.dedupe(\n pipe(\n context.vocabularies,\n Arr.filter((library) => imported.includes(library.specifier)),\n Arr.filter((library) => isSubsetOf(site.values, library.vocabulary.values)),\n Arr.map((library) => describeLibraryType(library)),\n ),\n );\n };\n\nconst listCandidates = (candidates: readonly string[]): string => {\n const shown = pipe(Arr.take(candidates, CANDIDATE_LIMIT), Arr.join(\", \"));\n const hidden = candidates.length - CANDIDATE_LIMIT;\n if (hidden > NOTHING_HIDDEN) {\n return `${shown} and ${String(hidden)} more`;\n }\n return shown;\n};\n\nconst originalVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n const owners = pipe(\n context.owners,\n Arr.filter((owner) => isSubsetOf(site.values, owner.values)),\n );\n if (Arr.isReadonlyArrayNonEmpty(owners)) {\n const message = `The values ${formatValues(site.values)} are owned by ${describeOwners(owners)}. Derive this set from the owner instead of restating it.`;\n return verdict([problemAt({ rule: \"owner-value-set\", message })(site.node)], []);\n }\n const candidates = libraryCandidates(context)(site);\n if (Arr.isReadonlyArrayNonEmpty(candidates)) {\n const message = `The values ${formatValues(site.values)} restate a dependency type: ${listCandidates(candidates)}. Derive this set from the library type.`;\n return verdict([problemAt({ rule: \"library-value-set\", message })(site.node)], []);\n }\n return verdict([], [site]);\n };\n\nconst siteVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n if (Arr.isReadonlyArrayNonEmpty(site.sources)) {\n return derivedVerdict(context)(site);\n }\n return originalVerdict(context)(site);\n };\n\nconst VALUE_PARENT_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.ReturnStatement,\n SyntaxKind.ArrayLiteralExpression,\n SyntaxKind.ConditionalExpression,\n SyntaxKind.ParenthesizedExpression,\n SyntaxKind.ArrowFunction,\n SyntaxKind.JsxExpression,\n]);\n\nconst isCallArgument = (node: Node, parent: Node): boolean =>\n (isCallExpression(parent) || isNewExpression(parent)) && parent.expression !== node;\n\nconst isInitializer = (node: Node, parent: Node): boolean =>\n (isPropertyAssignment(parent) || isVariableDeclaration(parent)) && parent.initializer === node;\n\nconst isRightOperand = (node: Node, parent: Node): boolean =>\n isBinaryExpression(parent) && parent.right === node;\n\nconst VALUE_SLOTS = [isCallArgument, isInitializer, isRightOperand];\n\nconst isValuePosition = (node: Node): boolean => {\n const { parent } = node;\n return (\n VALUE_PARENT_KINDS.has(parent.kind) ||\n pipe(\n VALUE_SLOTS,\n Arr.some((isSlot) => isSlot(node, parent)),\n )\n );\n};\n\nconst ownedLiteralProblem =\n (context: ValueContext) =>\n (literal: StringLiteral | NumericLiteral): Option.Option<Problem> =>\n Option.fromUndefinedOr(context.checker.getContextualType(literal)).pipe(\n Option.filter((contextual) =>\n vocabularyOf(context.checker)(contextual).pipe(\n Option.exists((vocabulary) => !vocabulary.admitsUnnamedValues),\n ),\n ),\n Option.map(() =>\n pipe(\n contextSymbolsOf(context.checker)(literal),\n Arr.flatMap((symbol) => ownersBehind(context)(symbol, [])),\n uniqueByReference,\n Arr.filter((owner) => isSubsetOf([literal.text], pipe(owner.values, Arr.map(String)))),\n ),\n ),\n Option.filter((owners) => Arr.isReadonlyArrayNonEmpty(owners)),\n Option.map((owners) =>\n problemAt({\n rule: \"owned-literal\",\n message: `${literal.getText()} is a value of ${describeOwners(owners)}. Write it through the owner's binding instead of as a literal.`,\n })(literal),\n ),\n );\n\nconst ownedLiteralProblems =\n (context: ValueContext) =>\n (sourceFile: SourceFile, excluded: readonly Node[]): readonly Problem[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isStringLiteral(node) || isNumericLiteral(node)),\n Arr.filter((node) => isValuePosition(node)),\n Arr.filter(\n (node) =>\n !pipe(\n excluded,\n Arr.some((outer) => contains(outer)(node)),\n ),\n ),\n Arr.map((node) => ownedLiteralProblem(context)(node)),\n ),\n );\n\nexport { ownedLiteralProblems, siteVerdict };\nexport type { SiteVerdict, ValueContext };\n","import { Option, Array as Arr, pipe } from \"effect\";\n\nimport { isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Node, VariableDeclaration } from \"./compiler.ts\";\nimport { flowsIn } from \"./flows.ts\";\nimport { ownerKeyOf } from \"./owners.ts\";\nimport type { Owner } from \"./owners.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { Project } from \"./project.ts\";\nimport { shapeProblemsIn } from \"./shapes.ts\";\nimport { sitesUnder } from \"./sites.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { contains, descendantsOf } from \"./syntax.ts\";\nimport { ownedLiteralProblems, siteVerdict } from \"./value-checks.ts\";\n\ninterface ProjectAnalysis {\n readonly problems: readonly Problem[];\n readonly unowned: readonly ValueSite[];\n}\n\nconst isVisibleTo =\n (project: Project) =>\n (owner: Owner): boolean =>\n pipe(\n project.sourceFiles,\n Arr.some((sourceFile) => sourceFile.fileName === owner.file),\n ) ||\n Option.exists(\n owner.packageName,\n (name) =>\n Option.contains(project.packageName, name) || project.workspaceDependencies.includes(name),\n );\n\nconst ownerDeclarationsIn = (\n project: Project,\n owners: readonly Owner[],\n): readonly VariableDeclaration[] => {\n const keys = new Set(\n pipe(\n owners,\n Arr.map((owner) => owner.key),\n ),\n );\n return pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) =>\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isVariableDeclaration(node)),\n Arr.filter((declaration) => Option.exists(ownerKeyOf(declaration), (key) => keys.has(key))),\n ),\n ),\n );\n};\n\nconst isInside =\n (outers: readonly Node[]) =>\n (node: Node): boolean =>\n pipe(\n outers,\n Arr.some((outer) => contains(outer)(node)),\n );\n\nconst sitesOutside =\n (checker: Checker) =>\n (project: Project, outers: readonly Node[]): readonly ValueSite[] =>\n pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => sitesUnder(checker)(sourceFile)),\n Arr.filter((site) => !isInside(outers)(site.node)),\n );\n\nconst nodesOf = (sites: readonly ValueSite[]): readonly Node[] =>\n pipe(\n sites,\n Arr.map((site) => site.node),\n );\n\nconst analyzeProject =\n (owners: readonly Owner[]) =>\n (project: Project): ProjectAnalysis => {\n const { checker } = project;\n const ownerDeclarations = ownerDeclarationsIn(project, owners);\n const sites = sitesOutside(checker)(project, ownerDeclarations);\n const flowContext = { checker, program: project.program, sites };\n const context = {\n checker,\n owners: pipe(\n owners,\n Arr.filter((owner) => isVisibleTo(project)(owner)),\n ),\n vocabularies: project.library.vocabularies,\n flows: pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => flowsIn(flowContext)(sourceFile)),\n ),\n };\n const verdicts = pipe(\n sites,\n Arr.map((site) => siteVerdict(context)(site)),\n );\n const excluded = [...ownerDeclarations, ...nodesOf(sites)];\n const shapeContext = { checker, program: project.program, shapes: project.library.shapes };\n return {\n problems: [\n ...pipe(\n verdicts,\n Arr.flatMap((found) => found.problems),\n ),\n ...pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => [\n ...ownedLiteralProblems(context)(sourceFile, excluded),\n ...shapeProblemsIn(shapeContext)(sourceFile),\n ]),\n ),\n ],\n unowned: pipe(\n verdicts,\n Arr.flatMap((found) => found.unowned),\n ),\n };\n };\n\nexport { analyzeProject };\nexport type { ProjectAnalysis };\n","import { Array as Arr, Order, Record as Rec, pipe } from \"effect\";\n\nimport { OWNER_TAG } from \"./owners.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { columnOf, lineOf } from \"./syntax.ts\";\nimport { formatValues, valueKey } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface PackageScope {\n readonly name: string;\n readonly dependencies: readonly string[];\n}\n\ninterface UnownedSite {\n readonly scope: PackageScope;\n readonly file: string;\n readonly start: number;\n readonly line: number;\n readonly column: number;\n readonly values: readonly Value[];\n}\n\nconst DUPLICATE_THRESHOLD = 1;\n\nconst unownedSiteOf =\n (scope: PackageScope) =>\n (site: ValueSite): UnownedSite => ({\n scope,\n file: site.node.getSourceFile().fileName,\n start: site.node.getStart(),\n line: lineOf(site.node),\n column: columnOf(site.node),\n values: site.values,\n });\n\nconst canDerive = (left: UnownedSite, right: UnownedSite): boolean =>\n left.scope.name === right.scope.name ||\n left.scope.dependencies.includes(right.scope.name) ||\n right.scope.dependencies.includes(left.scope.name);\n\nconst siteKey = (site: UnownedSite): string => `${site.file}#${String(site.start)}`;\n\nconst valueSetKey = (site: UnownedSite): string => {\n const keys = pipe(\n site.values,\n Arr.map((value) => valueKey(value)),\n );\n return pipe(Arr.sort(keys, Order.String), Arr.join(\"\\0\"));\n};\n\nconst duplicateProblems =\n (relative: (file: string) => string) =>\n (sites: readonly UnownedSite[]): readonly Problem[] => {\n const unique = Arr.dedupeWith(sites, (left, right) => siteKey(left) === siteKey(right));\n const groups = Rec.values(Arr.groupBy(unique, (site) => valueSetKey(site)));\n return pipe(\n groups,\n Arr.filter((group) => group.length > DUPLICATE_THRESHOLD),\n Arr.flatMap((group) =>\n pipe(\n group,\n Arr.flatMap((site): readonly Problem[] => {\n const related = pipe(\n group,\n Arr.filter((other) => other !== site && canDerive(site, other)),\n );\n if (!Arr.isReadonlyArrayNonEmpty(related)) {\n return [];\n }\n const others = pipe(\n related,\n Arr.map((other) => `${relative(other.file)}:${String(other.line)}`),\n Arr.join(\", \"),\n );\n return [\n {\n file: site.file,\n line: site.line,\n column: site.column,\n rule: \"duplicate-value-set\",\n message: `The values ${formatValues(site.values)} are also declared at ${others}. Register one owner with /** @${OWNER_TAG} <concept> */ and derive the others from it.`,\n },\n ];\n }),\n ),\n ),\n );\n };\n\nexport { duplicateProblems, unownedSiteOf };\nexport type { PackageScope, UnownedSite };\n","import { Array as Arr, Effect, Number as Num, Option, String as Str, pipe } from \"effect\";\n\nimport type { API } from \"./compiler.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst RSS_LINE = /^VmRSS:\\s+(?<kib>\\d+) kB$/mu;\nconst BYTES_PER_KIB = 1024;\nconst UNKNOWN_RSS = 0;\n\nconst kibibytesIn = (status: string): Option.Option<string> =>\n Option.fromNullishOr(RSS_LINE.exec(status)).pipe(\n Option.flatMap((match) => Option.fromUndefinedOr(match.groups)),\n Option.flatMap((groups) => Option.fromUndefinedOr(groups[\"kib\"])),\n );\n\nconst residentBytesOf = (pid: string): Effect.Effect<number, never, RepositoryFiles> =>\n Effect.gen(function* residentBytes() {\n const files = yield* RepositoryFiles;\n const status = yield* files.readFile(`/proc/${pid}/status`);\n return pipe(\n status,\n Option.flatMap(kibibytesIn),\n Option.flatMap(Num.parse),\n Option.map((kib) => kib * BYTES_PER_KIB),\n Option.getOrElse(() => UNKNOWN_RSS),\n );\n });\n\nconst childPids = Effect.gen(function* childPids() {\n const files = yield* RepositoryFiles;\n const pid = String(process.pid);\n const children = yield* files.readFile(`/proc/${pid}/task/${pid}/children`);\n return pipe(\n children,\n Option.map((text) => pipe(Str.trim(text), Str.split(\" \"), Arr.filter(Str.isNonEmpty))),\n Option.getOrElse((): readonly string[] => []),\n );\n});\n\nconst annotateMemory = Effect.gen(function* annotateMemory() {\n const own = yield* residentBytesOf(String(process.pid));\n const pids = yield* childPids;\n const children = yield* pipe(\n pids,\n Effect.forEach((pid) => residentBytesOf(pid)),\n );\n const { heapUsed } = process.memoryUsage();\n yield* Effect.annotateCurrentSpan({\n \"process.memory.rss\": own,\n \"process.memory.heap_used\": heapUsed,\n \"msch.compiler.memory.rss\": Num.sumAll(children),\n });\n});\n\nconst annotateResources = (api: API): Effect.Effect<void, never, RepositoryFiles> =>\n Effect.gen(function* annotateCompiler() {\n yield* annotateMemory;\n const { totals } = api.getTimingInfo();\n yield* Effect.annotateCurrentSpan({\n \"msch.compiler.requests\": totals.requestCount,\n \"msch.compiler.round_trip_ms\": totals.roundTripMs,\n \"msch.compiler.server_ms\": totals.serverTimeMs,\n });\n });\n\nexport { annotateResources };\n","import { Array as Arr, Effect, Function as Fn, Option, Order, String as Str, pipe } from \"effect\";\n\nimport { API, getLeadingCommentRanges } from \"./compiler.ts\";\nimport type { Checker, ParsedCommandLine, Program, SourceFile } from \"./compiler.ts\";\nimport {\n MANIFEST_FILE,\n NODE_MODULES,\n dependencyEntries,\n readManifest,\n workspaceDependencies,\n} from \"./dependencies.ts\";\nimport { libraryCache, libraryIndex } from \"./library.ts\";\nimport type { LibraryCache, LibraryIndex } from \"./library.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { annotateResources } from \"./telemetry.ts\";\n\ninterface Project {\n readonly packageName: Option.Option<string>;\n readonly workspaceDependencies: readonly string[];\n readonly program: Program;\n readonly checker: Checker;\n readonly sourceFiles: readonly SourceFile[];\n readonly library: LibraryIndex;\n}\n\ninterface PackageInfo {\n readonly directory: string;\n readonly name: Option.Option<string>;\n readonly workspaceDependencies: readonly string[];\n}\n\nconst CONFIG_FILE = \"tsconfig.json\";\nconst HIDDEN_PREFIX = \".\";\nconst SKIPPED_DIRECTORIES: ReadonlySet<string> = new Set([NODE_MODULES, \"dist\", \"coverage\"]);\n\nconst listConfigFiles = (\n directory: string,\n): Effect.Effect<readonly string[], never, RepositoryFiles> =>\n Effect.gen(function* configFilesUnder() {\n const files = yield* RepositoryFiles;\n const names = yield* files.readDirectory(directory);\n const visible = pipe(\n names,\n Arr.filter((name) => !Str.startsWith(HIDDEN_PREFIX)(name) && !SKIPPED_DIRECTORIES.has(name)),\n Arr.map((name) => files.join(directory, name)),\n );\n const nested = yield* Fn.pipe(\n visible,\n Effect.forEach((entryPath) =>\n files.isDirectory(entryPath).pipe(\n Effect.flatMap(\n Option.match({\n onNone: (): Effect.Effect<readonly string[], never, RepositoryFiles> =>\n Effect.succeed([]),\n onSome: (\n directoryEntry,\n ): Effect.Effect<readonly string[], never, RepositoryFiles> => {\n if (directoryEntry) {\n return listConfigFiles(entryPath);\n }\n return Effect.succeed(\n Arr.filter([entryPath], () => files.basename(entryPath) === CONFIG_FILE),\n );\n },\n }),\n ),\n ),\n ),\n );\n return Arr.sort(nested.flat(), Order.String);\n });\n\nconst parseConfig =\n (api: API) =>\n (configPath: string): Option.Option<ParsedCommandLine> =>\n Option.some(api.parseConfigFile(configPath)).pipe(\n Option.filter((parsed) => Arr.isReadonlyArrayNonEmpty(parsed.fileNames)),\n );\n\nconst nearestPackageDirectory = (\n directory: string,\n root: string,\n): Effect.Effect<string, never, RepositoryFiles> =>\n Effect.gen(function* nearestPackage() {\n const files = yield* RepositoryFiles;\n const hasManifest = yield* files.exists(files.join(directory, MANIFEST_FILE));\n const parent = files.dirname(directory);\n if (hasManifest || directory === root || parent === directory) {\n return directory;\n }\n return yield* nearestPackageDirectory(parent, root);\n });\n\nconst packageInfoOf = Effect.fn(\"packageInfoOf\")(function* packageInfoOf(\n configPath: string,\n root: string,\n) {\n const files = yield* RepositoryFiles;\n const directory = yield* nearestPackageDirectory(files.dirname(configPath), root);\n const manifest = yield* readManifest(directory);\n return {\n directory,\n name: manifest.pipe(Option.flatMap((found) => Option.fromUndefinedOr(found.name))),\n workspaceDependencies: manifest.pipe(\n Option.map(workspaceDependencies),\n Option.getOrElse(() => []),\n ),\n } satisfies PackageInfo;\n});\n\nconst NO_CHECK_PRAGMA = /^\\/\\/\\s*@ts-nocheck/u;\nconst FILE_START = 0;\n\nconst skipsTypeChecking = (sourceFile: SourceFile): boolean =>\n pipe(\n getLeadingCommentRanges(sourceFile.text, FILE_START) ?? [],\n Arr.some((range) => NO_CHECK_PRAGMA.test(Str.slice(range.pos, range.end)(sourceFile.text))),\n );\n\nconst buildProject = Effect.fn(\"buildProject\")(function* buildProject(\n { compiler: { api, libraries }, generated }: Workspace,\n parsed: ParsedCommandLine,\n info: PackageInfo,\n) {\n const entries = yield* dependencyEntries(info.directory);\n const program = yield* Effect.sync(() =>\n api.createProgram(\n [\n ...parsed.fileNames,\n ...pipe(\n entries,\n Arr.map((entry) => entry.declarationsPath),\n ),\n ],\n { ...parsed.options, noEmit: true },\n ),\n ).pipe(Effect.withSpan(\"createProgram\"));\n const { checker } = program.getProject();\n const library = yield* libraryIndex(libraries)(checker)(entries);\n const projectFiles: ReadonlySet<string> = new Set(\n pipe(\n parsed.fileNames,\n Arr.filter((fileName) => !generated.includes(fileName)),\n ),\n );\n return {\n packageName: info.name,\n workspaceDependencies: info.workspaceDependencies,\n program,\n checker,\n sourceFiles: pipe(\n program.getSourceFileNames(),\n Arr.filter((fileName) => projectFiles.has(fileName)),\n Arr.flatMap((fileName) =>\n Option.toArray(Option.fromUndefinedOr(program.getSourceFile(fileName))),\n ),\n Arr.filter((sourceFile) => !sourceFile.isDeclarationFile && !skipsTypeChecking(sourceFile)),\n ),\n library,\n } satisfies Project;\n});\n\ninterface Compiler {\n readonly api: API;\n readonly libraries: LibraryCache;\n}\n\ninterface Workspace {\n readonly compiler: Compiler;\n readonly root: string;\n readonly generated: readonly string[];\n}\n\nconst typeScriptCompiler = Effect.acquireRelease(\n Effect.sync((): Compiler => ({\n api: new API({ collectTiming: true }),\n libraries: libraryCache(),\n })),\n ({ api }) =>\n Effect.sync(() => {\n api.close();\n }),\n);\n\nconst loadProject = Effect.fn(\"loadProject\")(function* loadProject(\n workspace: Workspace,\n configPath: string,\n) {\n const { compiler, root } = workspace;\n const parsed = parseConfig(compiler.api)(configPath);\n if (Option.isNone(parsed)) {\n return Option.none<Project>();\n }\n const info = yield* packageInfoOf(configPath, root);\n const project = yield* buildProject(workspace, parsed.value, info);\n yield* Effect.annotateCurrentSpan({\n \"msch.project.config\": configPath,\n \"msch.project.program_files\": project.program.getSourceFileNames().length,\n \"msch.project.source_files\": project.sourceFiles.length,\n });\n yield* annotateResources(compiler.api);\n return Option.some(project);\n});\n\nconst releaseProject = (project: Project): Effect.Effect<void> =>\n Effect.sync(() => {\n project.program.dispose();\n });\n\nconst withProject =\n (workspace: Workspace) =>\n (configPath: string) =>\n <Value, Failure, Requirements>(\n work: (project: Project) => Effect.Effect<Value, Failure, Requirements>,\n ): Effect.Effect<Option.Option<Value>, Failure, Requirements | RepositoryFiles> =>\n Effect.acquireUseRelease(\n loadProject(workspace, configPath),\n (loaded) =>\n Option.match(loaded, {\n onNone: () => Effect.succeedNone,\n onSome: (project) => work(project).pipe(Effect.asSome),\n }),\n (loaded) => Option.match(loaded, { onNone: () => Effect.void, onSome: releaseProject }),\n );\n\nconst mentions =\n (needle: string) =>\n ({ api }: Compiler) =>\n (configPath: string): Effect.Effect<boolean, never, RepositoryFiles> =>\n Effect.gen(function* mentionsNeedle() {\n const files = yield* RepositoryFiles;\n const fileNames = Option.match(parseConfig(api)(configPath), {\n onNone: (): readonly string[] => [],\n onSome: (parsed): readonly string[] => parsed.fileNames,\n });\n const texts = yield* pipe(\n fileNames,\n Effect.forEach((fileName) => files.readFile(fileName)),\n );\n const includesNeedle = Str.includes(needle);\n return pipe(\n texts,\n Arr.some((text) => Option.exists(text, includesNeedle)),\n );\n });\n\nexport { listConfigFiles, mentions, typeScriptCompiler, withProject };\nexport type { Compiler, Project, Workspace };\n","import { Effect, Option, Array as Arr, pipe } from \"effect\";\n\nimport { analyzeProject } from \"./analysis.ts\";\nimport { duplicateProblems, unownedSiteOf } from \"./duplicates.ts\";\nimport type { PackageScope, UnownedSite } from \"./duplicates.ts\";\nimport { OWNER_TAG, combineOwnerScans, ownersIn } from \"./owners.ts\";\nimport type { Owner, OwnerScan } from \"./owners.ts\";\nimport { sortProblems } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { listConfigFiles, mentions, typeScriptCompiler, withProject } from \"./project.ts\";\nimport type { Project, Workspace } from \"./project.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst scanOwners = Effect.fn(\"scanOwners\")(function* scanOwners(\n workspace: Workspace,\n configPaths: readonly string[],\n) {\n const ownerConfigs = yield* pipe(\n configPaths,\n Effect.filter(mentions(`@${OWNER_TAG}`)(workspace.compiler)),\n );\n const scans = yield* pipe(\n ownerConfigs,\n Effect.forEach((configPath) =>\n withProject(workspace)(configPath)((project) => Effect.sync(() => ownersIn(project))),\n ),\n );\n return combineOwnerScans(Arr.getSomes(scans));\n});\n\nconst scopeOf = (project: Project, configPath: string): PackageScope => ({\n name: Option.getOrElse(project.packageName, () => configPath),\n dependencies: project.workspaceDependencies,\n});\n\ninterface Analysis {\n readonly problems: readonly Problem[];\n readonly unowned: readonly UnownedSite[];\n}\n\nconst analyzeProjects =\n (workspace: Workspace, owners: readonly Owner[]) =>\n (configPaths: readonly string[]): Effect.Effect<readonly Analysis[], never, RepositoryFiles> =>\n pipe(\n configPaths,\n Effect.forEach((configPath) =>\n withProject(workspace)(configPath)((project) =>\n Effect.sync(() => {\n const analysis = analyzeProject(owners)(project);\n const scope = scopeOf(project, configPath);\n return {\n problems: analysis.problems,\n unowned: pipe(analysis.unowned, Arr.map(unownedSiteOf(scope))),\n };\n }).pipe(Effect.withSpan(\"analyzeProject\")),\n ),\n ),\n Effect.map(Arr.getSomes),\n );\n\nconst checkRepository = Effect.fn(\"checkRepository\")(function* checkRepository(root: string) {\n const files = yield* RepositoryFiles;\n const compiler = yield* typeScriptCompiler;\n const generated = yield* files.generatedFiles(root);\n const workspace: Workspace = { compiler, root, generated };\n const configPaths = yield* listConfigFiles(root);\n const ownerScan: OwnerScan = yield* scanOwners(workspace, configPaths);\n const analyses = yield* analyzeProjects(workspace, ownerScan.owners)(configPaths);\n const relative = (file: string): string => files.relative(root, file);\n const unowned = pipe(\n analyses,\n Arr.flatMap((analysis) => analysis.unowned),\n );\n return sortProblems([\n ...ownerScan.problems,\n ...pipe(\n analyses,\n Arr.flatMap((analysis) => analysis.problems),\n ),\n ...duplicateProblems(relative)(unowned),\n ]);\n}, Effect.scoped);\n\nexport { checkRepository };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem } from \"./problem.ts\";\n\nconst START = 0;\nconst FIRST_COLUMN = 1;\n\nconst positionOf =\n (source: string) =>\n (index: number): Pick<Problem, \"line\" | \"column\"> => {\n const before = pipe(source, Str.slice(START, index), Str.split(\"\\n\"));\n return {\n line: before.length,\n column: pipe(\n Arr.last(before),\n Option.match({ onNone: () => FIRST_COLUMN, onSome: (last) => last.length + FIRST_COLUMN }),\n ),\n };\n };\n\nexport { positionOf };\n","import { Array as Arr, Effect, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { positionOf } from \"./text-position.ts\";\n\nconst HIDDEN =\n /[\\u00AD\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u2069\\uFEFF]|[\\u{E0000}-\\u{E007F}]/gu;\n\nconst NUL = \"\\0\";\nconst START = 0;\nconst HEX = 16;\nconst CODE_POINT_WIDTH = 4;\nconst READ_CONCURRENCY = 64;\nconst RULE: RuleName = \"hidden-unicode\";\n\nconst hexOf = (character: string): string =>\n pipe(\n Str.codePointAt(START)(character),\n Option.getOrElse(() => START),\n (code) => code.toString(HEX),\n Str.toUpperCase,\n Str.padStart(CODE_POINT_WIDTH, \"0\"),\n );\n\nconst problemOf =\n (file: string, source: string) =>\n (found: RegExpMatchArray): Problem => {\n const hex = hexOf(found[START]);\n return {\n file,\n ...positionOf(source)(found.index ?? START),\n rule: RULE,\n message: `U+${hex} is invisible in editors and reviews and can change what the text means. Remove it, or write it as the escape \\\\u${hex}.`,\n };\n };\n\nconst problemsIn = (file: string, source: string): readonly Problem[] => {\n if (Str.includes(NUL)(source)) {\n return [];\n }\n return pipe(Arr.fromIterable(Str.matchAll(HIDDEN)(source)), Arr.map(problemOf(file, source)));\n};\n\n/** @internal */\nconst checkHiddenUnicode = Effect.fn(\"checkHiddenUnicode\")(function* checkHiddenUnicode(\n root: string,\n) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const found = yield* Effect.forEach(\n names,\n (name) => {\n const file = files.join(root, name);\n return files.readFile(file).pipe(\n Effect.map(\n Option.match({\n onNone: (): readonly Problem[] => [],\n onSome: (source) => problemsIn(file, source),\n }),\n ),\n );\n },\n { concurrency: READ_CONCURRENCY },\n );\n return Arr.flatten(found);\n});\n\nexport { checkHiddenUnicode };\n","import { Array as Arr, Effect, Option, Schema, String as Str, pipe } from \"effect\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst RULE: RuleName = \"nested-docs\";\nconst SEPARATOR = \"/\";\nconst MANIFEST_FILE = \"package.json\";\nconst FIRST = 1;\nconst READ_CONCURRENCY = 64;\nconst AGENT_DOCS = /^(?:AGENTS|CLAUDE)(?:\\.[^/]+)?\\.md$/iu;\nconst README = /^README(?:\\.[^/]+)?$/iu;\n\nconst PublishedManifest = Schema.fromJsonString(\n Schema.Struct({ private: Schema.optional(Schema.Boolean) }),\n);\n\nconst isNested = (name: string): boolean => Str.includes(SEPARATOR)(name);\n\nconst isPublishedPackage = Effect.fn(\"isPublishedPackage\")(function* isPublishedPackage(\n root: string,\n directory: string,\n) {\n const files = yield* RepositoryFiles;\n const text = yield* files.readFile(files.join(root, directory, MANIFEST_FILE));\n return pipe(\n text,\n Option.flatMap(Schema.decodeUnknownOption(PublishedManifest)),\n Option.exists((manifest) => manifest.private !== true),\n );\n});\n\nconst problemFor = (file: string, message: string): Problem => ({\n file,\n line: FIRST,\n column: FIRST,\n rule: RULE,\n message,\n});\n\nconst AGENT_DOCS_MESSAGE =\n \"belongs only at the repository root. Move what agents need into the root AGENTS.md and delete this file.\";\nconst README_MESSAGE =\n \"belongs only at the repository root or next to the package.json of a published package. Move its content into the root README.md and delete this file.\";\n\nconst problemIn = Effect.fn(\"problemIn\")(function* problemIn(root: string, name: string) {\n const files = yield* RepositoryFiles;\n const base = files.basename(name);\n const file = files.join(root, name);\n if (AGENT_DOCS.test(base)) {\n return Option.some(problemFor(file, `${base} ${AGENT_DOCS_MESSAGE}`));\n }\n if (!README.test(base)) {\n return Option.none<Problem>();\n }\n if (yield* isPublishedPackage(root, files.dirname(name))) {\n return Option.none<Problem>();\n }\n return Option.some(problemFor(file, `${base} ${README_MESSAGE}`));\n});\n\n/** @internal */\nconst checkNestedDocs = Effect.fn(\"checkNestedDocs\")(function* checkNestedDocs(root: string) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const nested = pipe(names, Arr.filter(isNested));\n const found = yield* Effect.forEach(nested, (name) => problemIn(root, name), {\n concurrency: READ_CONCURRENCY,\n });\n return Arr.getSomes(found);\n});\n\nexport { checkNestedDocs };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport type { OverrideKey, OverrideReport } from \"./override-resolution.ts\";\nimport type { Problem } from \"./problem.ts\";\n\nconst describeVersions = (versions: readonly string[]): string =>\n Option.getOrElse(\n Option.liftPredicate(Arr.join(versions, \",\"), (joined) => joined !== \"\"),\n () => \"-\",\n );\n\nconst describeChanges = (report: OverrideReport): string => {\n const versions = pipe(\n report.changes,\n Arr.map(\n (change) =>\n `${change.name} ${describeVersions(change.before)} -> ${describeVersions(change.after)}`,\n ),\n );\n const contexts = Arr.filter([\"the peer contexts\"], () => report.peerContextsChanged);\n return Arr.join([...versions, ...contexts], \"; \");\n};\n\ninterface LocatedOverride extends OverrideKey {\n readonly file: string;\n}\n\nconst overrideProblem =\n (located: LocatedOverride) =>\n (report: OverrideReport): Option.Option<Problem> => {\n const at = { file: located.file, line: located.line, column: located.column };\n if (report.verdict === \"unused\") {\n return Option.some({\n ...at,\n rule: \"unused-override\",\n message: `Every package resolves the same way without the override ${report.key}. Remove it.`,\n });\n }\n if (report.verdict === \"verify\") {\n return Option.some({\n ...at,\n rule: \"removable-override\",\n message: `Removing the override ${report.key} changes ${describeChanges(report)} without new peer issues or advisories. Remove it and run verify.`,\n });\n }\n return Option.none();\n };\n\nexport { overrideProblem };\nexport type { LocatedOverride };\n","import { Array as Arr, Option, Order, Record as Rec, Schema, String as Str, pipe } from \"effect\";\nimport { LineCounter, isMap, isScalar, parseAllDocuments, parseDocument } from \"yaml\";\n\nconst VerdictSchema = Schema.Literals([\"unused\", \"keep\", \"verify\"]);\n\nconst PackageChangeSchema = Schema.Struct({\n name: Schema.String,\n before: Schema.Array(Schema.String),\n after: Schema.Array(Schema.String),\n});\n\nconst OverrideReportSchema = Schema.Struct({\n key: Schema.String,\n verdict: VerdictSchema,\n changes: Schema.Array(PackageChangeSchema),\n peerContextsChanged: Schema.Boolean,\n peerIssues: Schema.Array(Schema.String),\n advisories: Schema.Array(Schema.String),\n});\n\ntype OverrideReport = typeof OverrideReportSchema.Type;\ntype PackageChange = typeof PackageChangeSchema.Type;\n\nconst PeerParentSchema = Schema.Struct({ name: Schema.String, version: Schema.String });\n\nconst PeerIssueSchema = Schema.Struct({\n parents: Schema.Array(PeerParentSchema),\n wantedRange: Schema.String,\n foundVersion: Schema.optionalKey(Schema.String),\n});\n\ntype PeerIssue = typeof PeerIssueSchema.Type;\n\nconst ProjectPeerIssuesSchema = Schema.Struct({\n bad: Schema.Record(Schema.String, Schema.Array(PeerIssueSchema)),\n missing: Schema.Record(Schema.String, Schema.Array(PeerIssueSchema)),\n conflicts: Schema.Array(Schema.String),\n});\n\ntype ProjectPeerIssues = typeof ProjectPeerIssuesSchema.Type;\n\nconst PeerIssuesLog = Schema.fromJsonString(\n Schema.Struct({\n name: Schema.Literal(\"pnpm:peer-dependency-issues\"),\n issuesByProjects: Schema.Record(Schema.String, ProjectPeerIssuesSchema),\n }),\n);\n\ninterface Findings {\n readonly peerIssues: readonly string[];\n readonly advisories: readonly string[];\n}\n\ninterface Resolution extends Findings {\n readonly versions: Readonly<Record<string, readonly string[]>>;\n readonly snapshots: readonly string[];\n}\n\nconst AdvisorySchema = Schema.Struct({\n module_name: Schema.String,\n github_advisory_id: Schema.String,\n});\n\nconst AuditReport = Schema.fromJsonString(\n Schema.Struct({ advisories: Schema.Record(Schema.String, AdvisorySchema) }),\n);\n\nconst SCOPE_PREFIX = \"@\";\nconst NAME_START = 0;\nconst SEPARATOR_LENGTH = 1;\nconst PEER_CONTEXT_START = \"(\";\n\nconst sorted = (values: readonly string[]): readonly string[] =>\n Arr.sort(Arr.dedupe(values), Order.String);\n\nconst describeIssue =\n (project: string, kind: string) =>\n ([peer, issues]: readonly [string, readonly PeerIssue[]]): readonly string[] =>\n pipe(\n issues,\n Arr.map((issue) => {\n const dependent = Option.match(Arr.last(issue.parents), {\n onNone: () => project,\n onSome: (parent) => `${parent.name}@${parent.version}`,\n });\n const found = Option.getOrElse(Option.fromUndefinedOr(issue.foundVersion), () => \"none\");\n return `${project}: ${kind} peer ${peer}@${issue.wantedRange} of ${dependent}, found ${found}`;\n }),\n );\n\nconst issuesOfProject = ([project, issues]: readonly [\n string,\n ProjectPeerIssues,\n]): readonly string[] => [\n ...pipe(Rec.toEntries(issues.bad), Arr.flatMap(describeIssue(project, \"unmet\"))),\n ...pipe(Rec.toEntries(issues.missing), Arr.flatMap(describeIssue(project, \"missing\"))),\n ...pipe(\n issues.conflicts,\n Arr.map((peer) => `${project}: conflicting peer ${peer}`),\n ),\n];\n\nconst peerIssuesIn = (output: string): readonly string[] =>\n sorted(\n pipe(\n Str.split(output, \"\\n\"),\n Arr.map((line) => Schema.decodeOption(PeerIssuesLog)(line)),\n Arr.getSomes,\n Arr.flatMap((log) => pipe(Rec.toEntries(log.issuesByProjects), Arr.flatMap(issuesOfProject))),\n ),\n );\n\nconst advisoriesIn = (output: string): readonly string[] =>\n Option.match(Schema.decodeOption(AuditReport)(output), {\n onNone: () => [],\n onSome: (report) =>\n sorted(\n pipe(\n Rec.values(report.advisories),\n Arr.map((advisory) => `${advisory.module_name} ${advisory.github_advisory_id}`),\n ),\n ),\n });\n\nconst separatorOf = (key: string): Option.Option<number> => {\n if (!Str.startsWith(SCOPE_PREFIX)(key)) {\n return Str.indexOf(SCOPE_PREFIX)(key);\n }\n return pipe(\n Str.slice(SEPARATOR_LENGTH)(key),\n Str.indexOf(SCOPE_PREFIX),\n Option.map((index) => index + SEPARATOR_LENGTH),\n );\n};\n\nconst withoutPeerContext = (version: string): string =>\n Option.match(Str.indexOf(PEER_CONTEXT_START)(version), {\n onNone: () => version,\n onSome: (start) => Str.slice(NAME_START, start)(version),\n });\n\nconst packageOf = (key: string): Option.Option<readonly [string, string]> =>\n Option.map(separatorOf(key), (separator) => [\n Str.slice(NAME_START, separator)(key),\n withoutPeerContext(Str.slice(separator + SEPARATOR_LENGTH)(key)),\n ]);\n\nconst keysOf = (node: unknown): readonly string[] => {\n if (!isMap(node)) {\n return [];\n }\n return pipe(\n node.items,\n Arr.flatMap((pair): readonly string[] => {\n if (isScalar(pair.key)) {\n return [String(pair.key.value)];\n }\n return [];\n }),\n );\n};\n\nconst lockfileKeysOf = (lockfile: string, section: string): readonly string[] =>\n pipe(\n parseAllDocuments(lockfile),\n Arr.flatMap((document) => keysOf(document.get(section))),\n );\n\nconst resolutionOf =\n (findings: Findings) =>\n (lockfile: string): Resolution => {\n const snapshots = lockfileKeysOf(lockfile, \"snapshots\");\n const packages = Arr.getSomes(\n pipe(\n [...lockfileKeysOf(lockfile, \"packages\"), ...snapshots],\n Arr.map((key) => packageOf(key)),\n ),\n );\n const versions = Rec.map(\n Arr.groupBy(packages, ([name]) => name),\n (entries) =>\n sorted(\n pipe(\n entries,\n Arr.map(([, version]) => version),\n ),\n ),\n );\n return { ...findings, versions, snapshots: sorted(snapshots) };\n };\n\nconst changesBetween = (baseline: Resolution, candidate: Resolution): readonly PackageChange[] =>\n pipe(\n sorted([...Rec.keys(baseline.versions), ...Rec.keys(candidate.versions)]),\n Arr.map((name) => ({\n name,\n before: baseline.versions[name] ?? [],\n after: candidate.versions[name] ?? [],\n })),\n Arr.filter((change) => Arr.join(change.before, \" \") !== Arr.join(change.after, \" \")),\n );\n\nconst growsThePackageSet = (change: PackageChange): boolean =>\n change.after.length > change.before.length;\n\nconst needsTheOverride = (\n found: Pick<OverrideReport, \"changes\" | \"peerIssues\" | \"advisories\">,\n): boolean =>\n pipe(\n found.changes,\n Arr.some((change) => growsThePackageSet(change)),\n ) ||\n Arr.isReadonlyArrayNonEmpty(found.peerIssues) ||\n Arr.isReadonlyArrayNonEmpty(found.advisories);\n\nconst judge =\n (baseline: Resolution) =>\n (key: string, candidate: Resolution): OverrideReport => {\n const changes = changesBetween(baseline, candidate);\n const peerIssues = Arr.difference(candidate.peerIssues, baseline.peerIssues);\n const advisories = Arr.difference(candidate.advisories, baseline.advisories);\n const peerContextsChanged =\n Arr.join(baseline.snapshots, \" \") !== Arr.join(candidate.snapshots, \" \");\n const found = { key, changes, peerContextsChanged, peerIssues, advisories };\n if (!Arr.isReadonlyArrayNonEmpty(changes) && !peerContextsChanged) {\n return { ...found, verdict: \"unused\" };\n }\n if (needsTheOverride(found)) {\n return { ...found, verdict: \"keep\" };\n }\n return { ...found, verdict: \"verify\" };\n };\n\nconst OVERRIDES = \"overrides\";\nconst BASELINE_PROBE = \"msch-baseline-probe\";\nconst REMOVED_DEPENDENCY = \"-\";\n\ninterface OverrideKey {\n readonly key: string;\n readonly line: number;\n readonly column: number;\n}\n\nconst overrideKeysOf = (manifest: string): readonly OverrideKey[] => {\n const lineCounter = new LineCounter();\n const overrides = parseDocument(manifest, { lineCounter }).get(OVERRIDES);\n if (!isMap(overrides)) {\n return [];\n }\n return pipe(\n overrides.items,\n Arr.flatMap((pair): readonly OverrideKey[] => {\n const { key } = pair;\n if (!isScalar(key)) {\n return [];\n }\n return pipe(\n Option.fromNullishOr(key.range),\n Option.map(([start]) => {\n const { line, col } = lineCounter.linePos(start);\n return { key: String(key.value), line, column: col };\n }),\n Option.toArray,\n );\n }),\n );\n};\n\nconst withoutOverride =\n (key: string) =>\n (manifest: string): string => {\n const document = parseDocument(manifest);\n document.deleteIn([OVERRIDES, key]);\n return document.toString();\n };\n\nconst withBaselineProbe = (manifest: string): string => {\n const document = parseDocument(manifest);\n document.setIn([OVERRIDES, BASELINE_PROBE], REMOVED_DEPENDENCY);\n return document.toString();\n};\n\nexport {\n BASELINE_PROBE,\n advisoriesIn,\n judge,\n overrideKeysOf,\n peerIssuesIn,\n resolutionOf,\n withBaselineProbe,\n withoutOverride,\n};\nexport type { Findings, OverrideKey, OverrideReport, Resolution };\n","import {\n Array as Arr,\n Effect,\n FileSystem,\n Option,\n Path,\n Schema,\n Stream,\n String as Str,\n pipe,\n} from \"effect\";\nimport type { PlatformError } from \"effect\";\nimport { ChildProcess } from \"effect/process\";\nimport type { ChildProcessSpawner } from \"effect/process\";\n\nimport { overrideProblem } from \"./override-findings.ts\";\nimport {\n BASELINE_PROBE,\n advisoriesIn,\n judge,\n overrideKeysOf,\n peerIssuesIn,\n resolutionOf,\n withBaselineProbe,\n withoutOverride,\n} from \"./override-resolution.ts\";\nimport type { OverrideKey } from \"./override-resolution.ts\";\nimport type { Problem } from \"./problem.ts\";\n\nconst WORKSPACE_FILE = \"pnpm-workspace.yaml\";\nconst LOCKFILE = \"pnpm-lock.yaml\";\nconst RESOLUTION_FILES = [\"*package.json\", WORKSPACE_FILE, LOCKFILE, \".npmrc\", \"patches/*\"];\nconst RESOLUTION_CONCURRENCY = 4;\nconst SUCCEEDED = 0;\n\nconst taggedError = Schema.TaggedError;\n\nclass OverrideResolutionFailed extends taggedError<\n OverrideResolutionFailed,\n { readonly brand: unique symbol }\n>()(\"OverrideResolutionFailed\", { override: Schema.String, output: Schema.String }) {}\n\ntype CandidateFailure = OverrideResolutionFailed | PlatformError.PlatformError;\ntype CandidateServices =\n | FileSystem.FileSystem\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner;\n\ninterface Workspace {\n readonly root: string;\n readonly files: readonly string[];\n readonly manifest: string;\n}\n\nconst textOf = <Failure>(\n stream: Stream.Stream<Uint8Array, Failure>,\n): Effect.Effect<string, Failure> => stream.pipe(Stream.decodeText(), Stream.mkString);\n\nconst resolveIn = Effect.fn(\"resolveIn\")(function* resolveIn(directory: string, override: string) {\n const handle = yield* ChildProcess.make(\n \"vp\",\n [\"install\", \"--lockfile-only\", \"--ignore-scripts\", \"--\", \"--reporter=ndjson\"],\n { cwd: directory, env: { CI: \"true\" }, extendEnv: true, stdin: \"ignore\" },\n );\n const [output, status] = yield* Effect.all([textOf(handle.all), handle.exitCode], {\n concurrency: \"unbounded\",\n });\n if (Number(status) !== SUCCEEDED) {\n return yield* OverrideResolutionFailed.make({ override, output });\n }\n return output;\n});\n\nconst auditIn = Effect.fn(\"auditIn\")(function* auditIn(directory: string) {\n const handle = yield* ChildProcess.make(\"vp\", [\"pm\", \"audit\", \"--json\"], {\n cwd: directory,\n extendEnv: true,\n stdin: \"ignore\",\n });\n const [report] = yield* Effect.all([textOf(handle.stdout), handle.exitCode], {\n concurrency: \"unbounded\",\n });\n return advisoriesIn(report);\n}, Effect.scoped);\n\nconst trackedResolutionFiles = Effect.fn(\"trackedResolutionFiles\")(function* trackedFiles(\n root: string,\n) {\n const handle = yield* ChildProcess.make(\"git\", [\"ls-files\", \"-z\", \"--\", ...RESOLUTION_FILES], {\n cwd: root,\n });\n const listed = yield* textOf(handle.stdout);\n return pipe(Str.split(listed, \"\\0\"), Arr.filter(Str.isNonEmpty));\n}, Effect.scoped);\n\nconst copyFiles = Effect.fn(\"copyFiles\")(function* copyFiles(\n workspace: Workspace,\n directory: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const copyOne = (file: string): Effect.Effect<void, PlatformError.PlatformError> => {\n const target = path.join(directory, file);\n const copy = fs.copyFile(path.join(workspace.root, file), target);\n return fs.makeDirectory(path.dirname(target), { recursive: true }).pipe(Effect.andThen(copy));\n };\n yield* Effect.forEach(workspace.files, copyOne, { discard: true });\n});\n\nconst resolutionWith = Effect.fn(\"resolutionWith\")(function* resolutionWith(\n workspace: Workspace,\n override: string,\n manifest: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const directory = yield* fs.makeTempDirectoryScoped({ prefix: \"msch-overrides-\" });\n yield* copyFiles(workspace, directory);\n yield* fs.writeFileString(path.join(directory, WORKSPACE_FILE), manifest);\n const output = yield* resolveIn(directory, override);\n const lockfile = yield* fs.readFileString(path.join(directory, LOCKFILE));\n yield* Effect.annotateCurrentSpan({ \"msch.override\": override });\n const advisories = yield* auditIn(directory);\n return resolutionOf({ peerIssues: peerIssuesIn(output), advisories })(lockfile);\n}, Effect.scoped);\n\nconst problemsFor = Effect.fn(\"problemsFor\")(function* problemsFor(\n root: string,\n manifest: string,\n keys: readonly OverrideKey[],\n) {\n const path = yield* Path.Path;\n const files = yield* trackedResolutionFiles(root);\n const workspace: Workspace = { root, files, manifest };\n const baseline = yield* resolutionWith(workspace, BASELINE_PROBE, withBaselineProbe(manifest));\n const judgeAgainstBaseline = judge(baseline);\n const file = path.join(root, WORKSPACE_FILE);\n const problemOf = (\n located: OverrideKey,\n ): Effect.Effect<Option.Option<Problem>, CandidateFailure, CandidateServices> =>\n resolutionWith(workspace, located.key, withoutOverride(located.key)(manifest)).pipe(\n Effect.map((candidate) =>\n overrideProblem({ ...located, file })(judgeAgainstBaseline(located.key, candidate)),\n ),\n );\n const problems = yield* Effect.forEach(keys, problemOf, {\n concurrency: RESOLUTION_CONCURRENCY,\n });\n return Arr.getSomes(problems);\n});\n\n/** @internal */\nconst checkOverrides = Effect.fn(\"checkOverrides\")(function* checkOverrides(root: string) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const manifest = yield* fs.readFileString(path.join(root, WORKSPACE_FILE)).pipe(Effect.option);\n const keys = Option.match(manifest, { onNone: () => [], onSome: overrideKeysOf });\n if (Option.isNone(manifest) || !Arr.isReadonlyArrayNonEmpty(keys)) {\n return [];\n }\n return yield* problemsFor(root, manifest.value, keys);\n});\n\nexport { checkOverrides };\n","import { Array as Arr, Effect, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { positionOf } from \"./text-position.ts\";\n\nconst PYTHON_FILE =\n /(?:\\.(?:py|pyi|pyw|pyx|ipynb)|(?:^|\\/)(?:pyproject\\.toml|uv\\.lock|uv\\.toml|poetry\\.lock|Pipfile|Pipfile\\.lock|setup\\.cfg|tox\\.ini|pytest\\.ini|\\.python-version|requirements[^/]*\\.txt))$/u;\n\nconst SCANNED_FILE =\n /(?:\\.(?:[cm]?[jt]sx?|jsonc?|toml|ya?ml|sh|bash|zsh|fish|rs|cs|go|mk)|(?:^|\\/)(?:Dockerfile[^/]*|Makefile|justfile|\\.tool-versions|[^./][^./]*))$/u;\n\nconst LOCKFILE = /(?:^|\\/)(?:[^/]*\\.lock|[^/]*-lock\\.(?:json|ya?ml))$/u;\n\nconst TOOL_VERSIONS = /(?:^|\\/)(?:\\.?mise(?:\\.[^/]+)?\\.toml|\\.tool-versions)$/u;\n\nconst COMMAND_PATTERNS: readonly RegExp[] = [\n /(?<![\\w./@-])python[\\d.]*[ \\t]+(?:[-\"'$./]|\\S+\\.py\\b)/gu,\n /(?<![\\w./@-])pip3?[ \\t]+(?:install|uninstall|download|freeze|wheel|compile|sync)\\b/gu,\n /(?<![\\w./@-])pipx[ \\t]+(?:run|install|inject|upgrade)\\b/gu,\n /(?<![\\w./@-])uvx[ \\t]+[^\\s=:,;)|&]/gu,\n /(?<![\\w./@-])uv[ \\t]+(?:run|sync|lock|pip|tool|venv|add|remove|python|export|build|publish|init|tree|cache|self)\\b/gu,\n /(?<![\\w./@-])poetry[ \\t]+(?:run|install|add|lock|build|publish|shell|export)\\b/gu,\n /(?:\\bcommand[\"']?\\s*[:=]\\s*|(?:\\bspawn\\w*|\\bexec\\w*|\\bexeca|Command::new|ChildProcess\\.make|\\$)\\(\\s*)[\"'`](?:python[\\d.]*|pip3?|pipx|uvx?|poetry)[\"'`]/gu,\n /\\buses:\\s*[\"']?(?:actions\\/setup-python|astral-sh\\/setup-uv|astral-sh\\/ruff-action|pypa\\/[\\w.-]+|snok\\/install-poetry|abatilo\\/actions-poetry|conda-incubator\\/setup-miniconda|mamba-org\\/setup-micromamba|pdm-project\\/setup-pdm)\\b/gu,\n];\n\nconst TOOL_PATTERNS: readonly RegExp[] = [\n /^[ \\t]*[\"']?(?:python|uv|pipx|poetry|ruff|pdm|hatch|pipx:[^\"'\\s=]+)[\"']?[ \\t]*(?:=|[ \\t]+\\S)/gmu,\n];\n\nconst READ_CONCURRENCY = 64;\nconst FIRST_LINE = 1;\nconst FIRST_COLUMN = 1;\nconst WHOLE_MATCH = 0;\nconst FILE_RULE: RuleName = \"python-file\";\nconst COMMAND_RULE: RuleName = \"python-command\";\n\ninterface Listed {\n readonly name: string;\n readonly file: string;\n}\n\nconst fileProblem = ({ file }: Listed): Problem => ({\n file,\n line: FIRST_LINE,\n column: FIRST_COLUMN,\n rule: FILE_RULE,\n message: \"Python is not used in this repository. Replace this file with TypeScript or Rust.\",\n});\n\nconst patternsFor = (name: string): readonly RegExp[] => {\n if (TOOL_VERSIONS.test(name)) {\n return [...COMMAND_PATTERNS, ...TOOL_PATTERNS];\n }\n return COMMAND_PATTERNS;\n};\n\nconst commandProblem =\n ({ file }: Listed, source: string) =>\n (found: RegExpMatchArray): Problem => ({\n file,\n ...positionOf(source)(found.index ?? WHOLE_MATCH),\n rule: COMMAND_RULE,\n message: `Python is not used in this repository. Remove \\`${Str.trim(found[WHOLE_MATCH])}\\` and do the work in TypeScript or Rust.`,\n });\n\nconst commandProblems = (entry: Listed, source: string): readonly Problem[] =>\n pipe(\n patternsFor(entry.name),\n Arr.flatMap((pattern) => Arr.fromIterable(Str.matchAll(pattern)(source))),\n Arr.map(commandProblem(entry, source)),\n );\n\nconst isPython = ({ name }: Listed): boolean => PYTHON_FILE.test(name);\n\nconst isScanned = (entry: Listed): boolean =>\n !isPython(entry) && SCANNED_FILE.test(entry.name) && !LOCKFILE.test(entry.name);\n\n/** @internal */\nconst checkPython = Effect.fn(\"checkPython\")(function* checkPython(root: string) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const listed = pipe(\n names,\n Arr.map((name): Listed => ({ name, file: files.join(root, name) })),\n );\n const problemsIn = (entry: Listed): Effect.Effect<readonly Problem[]> =>\n files.readFile(entry.file).pipe(\n Effect.map(\n Option.match({\n onNone: (): readonly Problem[] => [],\n onSome: (source) => commandProblems(entry, source),\n }),\n ),\n );\n const scanned = yield* Effect.forEach(pipe(listed, Arr.filter(isScanned)), problemsIn, {\n concurrency: READ_CONCURRENCY,\n });\n const present = yield* Effect.filter(pipe(listed, Arr.filter(isPython)), ({ file }) =>\n files.exists(file),\n );\n return [...pipe(present, Arr.map(fileProblem)), ...Arr.flatten(scanned)];\n});\n\nexport { checkPython };\n","import { Array as Arr, Effect } from \"effect\";\n\nimport { checkRepository } from \"./check.ts\";\nimport { checkHiddenUnicode } from \"./hidden-unicode.ts\";\nimport { checkNestedDocs } from \"./nested-docs.ts\";\nimport { checkOverrides } from \"./overrides.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { checkPython } from \"./python.ts\";\n\n/** @internal */\nconst checkAll: (\n root: string,\n) => Effect.Effect<\n readonly Problem[],\n Effect.Error<\n | ReturnType<typeof checkRepository>\n | ReturnType<typeof checkOverrides>\n | ReturnType<typeof checkHiddenUnicode>\n >,\n Effect.Services<\n | ReturnType<typeof checkRepository>\n | ReturnType<typeof checkOverrides>\n | ReturnType<typeof checkHiddenUnicode>\n >\n> = Effect.fn(\"checkAll\")(function* checkAll(root: string) {\n const found = yield* Effect.all(\n [\n checkRepository(root),\n checkOverrides(root),\n checkHiddenUnicode(root),\n checkPython(root),\n checkNestedDocs(root),\n ],\n { concurrency: \"unbounded\" },\n );\n return Arr.flatten(found);\n});\n\nexport { checkAll };\n","import { Effect, Schema, Stdio, Stream } from \"effect\";\n\nconst taggedError = Schema.TaggedError;\n\nclass ProblemsFound extends taggedError<ProblemsFound, { readonly brand: unique symbol }>()(\n \"ProblemsFound\",\n {\n count: Schema.Finite,\n },\n) {}\n\n/** @internal */\nconst writeStdout = Effect.fn(\"writeStdout\")(function* writeStdout(text: string) {\n const stdio = yield* Stdio.Stdio;\n yield* Stream.make(text).pipe(Stream.run(stdio.stdout()), Effect.orDie);\n});\n\nexport { ProblemsFound, writeStdout };\n","import { runMain } from \"@effect/platform-node/NodeRuntime\";\nimport { layer as nodeServicesLayer } from \"@effect/platform-node/NodeServices\";\nimport { Cause, Effect, Layer, Option, Schema, Stdio, Stream } from \"effect\";\nimport type { FileSystem, Path } from \"effect\";\nimport { FetchHttpClient } from \"effect/http\";\nimport { Otlp, OtlpSerialization } from \"effect/observability\";\nimport type { ChildProcessSpawner } from \"effect/process\";\n\nimport { ProblemsFound } from \"./output.ts\";\nimport { nodeRepositoryFiles } from \"./repository-files.ts\";\nimport type { RepositoryFiles } from \"./repository-files.ts\";\n\nconst reportFailure = <Failure>(\n cause: Cause.Cause<Failure>,\n): Effect.Effect<void, never, Stdio.Stdio> =>\n Effect.gen(function* report() {\n const stdio = yield* Stdio.Stdio;\n const failed = Cause.findErrorOption(cause).pipe(Option.exists(Schema.is(ProblemsFound)));\n if (failed) {\n return;\n }\n yield* Stream.make(`${Cause.pretty(cause)}\\n`).pipe(Stream.run(stdio.stderr()), Effect.orDie);\n });\n\nconst tracing = Otlp.layerFromConfig({ resource: { serviceName: \"msch\" } }).pipe(\n Layer.provide(OtlpSerialization.layerJson),\n Layer.provide(FetchHttpClient.layer),\n);\n\nconst runCli = <Value, Failure>(\n program: Effect.Effect<\n Value,\n Failure,\n | RepositoryFiles\n | Stdio.Stdio\n | FileSystem.FileSystem\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner\n >,\n): void => {\n const services = Layer.mergeAll(nodeRepositoryFiles, tracing).pipe(\n Layer.provideMerge(nodeServicesLayer),\n );\n const main = Layer.build(services).pipe(\n Effect.flatMap((context) =>\n Effect.provideContext(program.pipe(Effect.tapCause(reportFailure)), context),\n ),\n Effect.scoped,\n );\n runMain(main, { disableErrorReporting: true });\n};\n\n/** @internal */\nexport { runCli };\n","#!/usr/bin/env node\nimport { Effect, Schema, Stdio, Array as Arr, pipe } from \"effect\";\n\nimport { checkAll } from \"./all-checks.ts\";\nimport { JSON_FLAG } from \"./cli-contract.ts\";\nimport { ProblemsFound, writeStdout } from \"./output.ts\";\nimport { ProblemList, formatProblem, sortProblems } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { runCli } from \"./runtime.ts\";\n\nconst NO_PROBLEMS = 0;\n\nconst reportText = (\n root: string,\n problems: readonly Problem[],\n): Effect.Effect<void, ProblemsFound, RepositoryFiles | Stdio.Stdio> =>\n Effect.gen(function* report() {\n const files = yield* RepositoryFiles;\n const format = formatProblem((file) => files.relative(root, file));\n yield* writeStdout(\n pipe(\n problems,\n Arr.map((problem) => `${format(problem)}\\n`),\n Arr.join(\"\"),\n ),\n );\n if (problems.length > NO_PROBLEMS) {\n return yield* ProblemsFound.make({ count: problems.length });\n }\n return yield* Effect.void;\n });\n\nconst msch = Effect.gen(function* msch() {\n const stdio = yield* Stdio.Stdio;\n const files = yield* RepositoryFiles;\n const args = yield* stdio.args;\n const root = files.resolve(\".\");\n const found = yield* checkAll(root);\n const problems = sortProblems(found);\n if (args.includes(JSON_FLAG)) {\n const text = yield* Schema.encodeEffect(Schema.fromJsonString(ProblemList))(problems);\n return yield* writeStdout(text);\n }\n return yield* reportText(root, problems);\n});\n\nrunCli(msch);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["Arr","Arr","Fn","SCOPE_PREFIX","packageOf","Str","Arr","Arr","Str","Arr","Arr","Arr","Arr","Arr","Arr","Arr","Rec","Num","Str","Arr","CONFIG_FILE","Arr","Str","Fn","Arr","START","FIRST_COLUMN","Str","Arr","READ_CONCURRENCY","RULE","Str","Arr","READ_CONCURRENCY","taggedError","Str","Arr","Arr","Arr","Rec","Str","LOCKFILE","taggedError","Str","Arr","Str","Arr","Arr","nodeServicesLayer","Arr"],"sources":["../src/slots.ts","../src/values.ts","../src/flows.ts","../src/owners.ts","../src/library.ts","../src/derivation.ts","../src/shapes.ts","../src/sites.ts","../src/value-checks.ts","../src/analysis.ts","../src/duplicates.ts","../src/telemetry.ts","../src/project.ts","../src/check.ts","../src/text-position.ts","../src/hidden-unicode.ts","../src/nested-docs.ts","../src/override-findings.ts","../src/override-resolution.ts","../src/overrides.ts","../src/python.ts","../src/all-checks.ts","../src/output.ts","../src/runtime.ts","../src/cli.ts"],"sourcesContent":["import { Array as Arr, Option } from \"effect\";\n\nimport {\n isCallExpression,\n isNewExpression,\n isObjectLiteralExpression,\n isPropertyAssignment,\n isSignatureDeclaration,\n isVariableDeclaration,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Expression,\n ParameterDeclaration,\n PropertyDeclaration,\n PropertySignatureDeclaration,\n TypeSymbol,\n TypeNode,\n VariableDeclaration,\n} from \"./compiler.ts\";\nimport { declarationsOf, referencedSymbols } from \"./syntax.ts\";\n\ntype AnnotatedDeclaration =\n | ParameterDeclaration\n | VariableDeclaration\n | PropertySignatureDeclaration\n | PropertyDeclaration;\n\nconst ANNOTATED_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.Parameter,\n SyntaxKind.VariableDeclaration,\n SyntaxKind.PropertySignature,\n SyntaxKind.PropertyDeclaration,\n]);\n\nconst isAnnotated = (declaration: Declaration): declaration is AnnotatedDeclaration =>\n ANNOTATED_KINDS.has(declaration.kind);\n\nconst annotationOf = (declaration: Declaration): Option.Option<TypeNode> =>\n Option.liftPredicate(declaration, isAnnotated).pipe(\n Option.flatMap((annotated) => Option.fromUndefinedOr(annotated.type)),\n );\n\nconst argumentSlot =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> => {\n const call = expression.parent;\n if (!isCallExpression(call) && !isNewExpression(call)) {\n return Option.none();\n }\n const { arguments: listed } = call;\n const callArguments: readonly Expression[] = listed ?? [];\n const index = callArguments.indexOf(expression);\n return Option.fromUndefinedOr(checker.getResolvedSignature(call).declaration).pipe(\n Option.flatMap((handle) => Option.fromUndefinedOr(handle.resolve())),\n Option.filter(isSignatureDeclaration),\n Option.flatMap((declaration) => Arr.get(declaration.parameters, index)),\n );\n };\n\nconst propertySlot =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> => {\n const assignment = expression.parent;\n if (!isPropertyAssignment(assignment) || !isObjectLiteralExpression(assignment.parent)) {\n return Option.none();\n }\n return Option.fromUndefinedOr(checker.getContextualType(assignment.parent)).pipe(\n Option.flatMap((objectType) =>\n Option.fromUndefinedOr(objectType.getProperty(assignment.name.getText())),\n ),\n Option.flatMap((property) => Arr.head(declarationsOf(property))),\n );\n };\n\nconst variableSlot = (expression: Expression): Option.Option<Declaration> => {\n const declaration = expression.parent;\n if (!isVariableDeclaration(declaration) || declaration.initializer !== expression) {\n return Option.none();\n }\n return Option.some(declaration);\n};\n\nconst slotOf =\n (checker: Checker) =>\n (expression: Expression): Option.Option<Declaration> =>\n argumentSlot(checker)(expression).pipe(\n Option.orElse(() => propertySlot(checker)(expression)),\n Option.orElse(() => variableSlot(expression)),\n );\n\nconst contextSymbolsOf =\n (checker: Checker) =>\n (expression: Expression): readonly TypeSymbol[] => {\n const alias = Option.fromUndefinedOr(checker.getContextualType(expression)).pipe(\n Option.flatMap((contextual) => Option.fromUndefinedOr(contextual.getAliasSymbol())),\n );\n if (Option.isSome(alias)) {\n return [alias.value];\n }\n return slotOf(checker)(expression).pipe(\n Option.flatMap(annotationOf),\n Option.map((annotation) => referencedSymbols(checker)(annotation)),\n Option.getOrElse(() => []),\n );\n };\n\nexport { annotationOf, contextSymbolsOf, slotOf };\n","import { Array as Arr, Function as Fn, Option, pipe } from \"effect\";\n\nimport { IndexKind } from \"./compiler.ts\";\nimport type { Checker, Type } from \"./compiler.ts\";\n\ntype Value = string | number;\n\ninterface Vocabulary {\n readonly values: readonly Value[];\n readonly admitsUnnamedValues: boolean;\n}\n\nconst SCHEMA_TYPE_PROPERTIES = [\"Type\", \"_output\"] as const;\n\nconst MINIMUM_SET_SIZE = 2;\n\nconst DATA_FIRST_ARITY = 2;\n\nconst valueKey = (value: Value): string => `${typeof value}:${String(value)}`;\n\nconst literalValueOf = (type: Type): Option.Option<Value> => {\n if (type.isStringLiteralType() || type.isNumberLiteralType()) {\n return Option.some(type.value);\n }\n return Option.none();\n};\n\nconst literalValuesOf = (types: readonly Type[]): Option.Option<readonly Value[]> => {\n const values = pipe(\n types,\n Arr.map((member) => literalValueOf(member)),\n Arr.getSomes,\n Arr.dedupeWith((left, right) => valueKey(left) === valueKey(right)),\n );\n if (values.length !== types.length || values.length < MINIMUM_SET_SIZE) {\n return Option.none();\n }\n return Option.some(values);\n};\n\nconst literalUnionOf = (type: Type): Option.Option<readonly Value[]> => {\n if (!type.isUnionType()) {\n return Option.none();\n }\n return literalValuesOf(type.getTypes());\n};\n\nconst elementTypeOf = (checker: Checker, type: Type): Option.Option<Type> => {\n if (!checker.isArrayLikeType(type)) {\n return Option.none();\n }\n return Option.fromUndefinedOr(checker.getIndexTypeOfType(type, IndexKind.Number));\n};\n\nconst schemaTypeOf =\n (checker: Checker) =>\n (type: Type): Option.Option<Type> =>\n Arr.findFirst(SCHEMA_TYPE_PROPERTIES, (name) =>\n Option.fromUndefinedOr(checker.getPropertyOfType(type, name)),\n ).pipe(Option.map((property) => checker.getTypeOfSymbol(property)));\n\nconst finiteValuesOf =\n (checker: Checker) =>\n (type: Type): Option.Option<readonly Value[]> =>\n literalUnionOf(type).pipe(\n Option.orElse(() => elementTypeOf(checker, type).pipe(Option.flatMap(literalUnionOf))),\n Option.orElse(() => schemaTypeOf(checker)(type).pipe(Option.flatMap(literalUnionOf))),\n );\n\nconst vocabularyOf =\n (checker: Checker) =>\n (type: Type): Option.Option<Vocabulary> => {\n if (!type.isUnionType()) {\n return Option.none();\n }\n const optionalIds = new Set([checker.getUndefinedType().id, checker.getNullType().id]);\n const members = pipe(\n type.getTypes(),\n Arr.filter((member) => !optionalIds.has(member.id)),\n );\n const values = Arr.getSomes(\n pipe(\n members,\n Arr.map((member) => literalValueOf(member)),\n ),\n );\n if (values.length < MINIMUM_SET_SIZE) {\n return Option.none();\n }\n return Option.some({ values, admitsUnnamedValues: values.length !== members.length });\n };\n\nconst isSubsetOf: {\n (superset: readonly Value[]): (subset: readonly Value[]) => boolean;\n (subset: readonly Value[], superset: readonly Value[]): boolean;\n} = Fn.dual(DATA_FIRST_ARITY, (subset: readonly Value[], superset: readonly Value[]): boolean => {\n const held = new Set(\n pipe(\n superset,\n Arr.map((value) => valueKey(value)),\n ),\n );\n return pipe(\n subset,\n Arr.every((value) => held.has(valueKey(value))),\n );\n});\n\nconst sameValues: {\n (right: readonly Value[]): (left: readonly Value[]) => boolean;\n (left: readonly Value[], right: readonly Value[]): boolean;\n} = Fn.dual(\n DATA_FIRST_ARITY,\n (left: readonly Value[], right: readonly Value[]): boolean =>\n left.length === right.length && isSubsetOf(left, right),\n);\n\nconst valueText = (value: Value): string => {\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n return String(value);\n};\n\nconst formatValues = (values: readonly Value[]): string =>\n pipe(values, Arr.map(valueText), Arr.join(\" | \"));\n\nexport {\n finiteValuesOf,\n formatValues,\n isSubsetOf,\n literalUnionOf,\n literalValuesOf,\n sameValues,\n schemaTypeOf,\n valueKey,\n vocabularyOf,\n};\nexport type { Value, Vocabulary };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport {\n getNameOfDeclaration,\n isClassDeclaration,\n isElementAccessExpression,\n isIdentifier,\n isInterfaceDeclaration,\n isPropertyAccessExpression,\n isSignatureDeclaration,\n isTypeAliasDeclaration,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n ClassDeclaration,\n Declaration,\n Expression,\n InterfaceDeclaration,\n Node,\n Program,\n SignatureDeclaration,\n SourceFile,\n TypeSymbol,\n Type,\n} from \"./compiler.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { annotationOf, slotOf } from \"./slots.ts\";\nimport {\n contains,\n declarationsOf,\n descendantsOf,\n isExternalDeclaration,\n NODE_MODULES_SEGMENT,\n symbolAt,\n} from \"./syntax.ts\";\nimport { isSubsetOf, vocabularyOf } from \"./values.ts\";\n\ninterface Flow {\n readonly site: ValueSite;\n readonly target: string;\n}\n\ninterface FlowContext {\n readonly checker: Checker;\n readonly program: Program;\n readonly sites: readonly ValueSite[];\n}\n\nconst SCOPE_PREFIX = \"@\";\nconst SCOPED_SEGMENTS = 2;\nconst UNSCOPED_SEGMENTS = 1;\nconst MODULE_PREFIX = /^\".*?\"\\./u;\n\nconst packageOf = (fileName: string): string => {\n const afterModules = pipe(\n fileName,\n Str.lastIndexOf(NODE_MODULES_SEGMENT),\n Option.match({\n onNone: () => fileName,\n onSome: (index) => Str.slice(index + NODE_MODULES_SEGMENT.length)(fileName),\n }),\n );\n const segments = Str.split(\"/\")(afterModules);\n if (Str.startsWith(SCOPE_PREFIX)(afterModules)) {\n return pipe(Arr.take(segments, SCOPED_SEGMENTS), Arr.join(\"/\"));\n }\n return pipe(Arr.take(segments, UNSCOPED_SEGMENTS), Arr.join(\"/\"));\n};\n\nconst externalDeclarationOf =\n (context: FlowContext) =>\n (symbol: TypeSymbol): Option.Option<Declaration> =>\n Arr.findFirst(declarationsOf(symbol), (declaration) =>\n isExternalDeclaration(context.program)(declaration),\n );\n\nconst aliasTarget =\n (context: FlowContext) =>\n (type: Type): Option.Option<string> =>\n Option.fromUndefinedOr(type.getAliasSymbol()).pipe(\n Option.flatMap((alias) =>\n externalDeclarationOf(context)(alias).pipe(\n Option.map(\n (declaration) =>\n `${Str.replace(MODULE_PREFIX, \"\")(context.checker.getFullyQualifiedName(alias))} from ${packageOf(declaration.getSourceFile().fileName)}`,\n ),\n ),\n ),\n );\n\nconst isNamedContainer = (\n node: Node,\n): node is SignatureDeclaration | InterfaceDeclaration | ClassDeclaration =>\n isSignatureDeclaration(node) || isInterfaceDeclaration(node) || isClassDeclaration(node);\n\nconst slotTarget =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<string> =>\n slotOf(context.checker)(expression).pipe(\n Option.filter((slot) => isExternalDeclaration(context.program)(slot)),\n Option.filter((slot) =>\n Option.isSome(vocabularyOf(context.checker)(context.checker.getTypeAtLocation(slot))),\n ),\n Option.map((slot) => {\n const owner = Option.liftPredicate(slot.parent, isNamedContainer).pipe(\n Option.flatMap((container) => Option.fromUndefinedOr(getNameOfDeclaration(container))),\n Option.map((name) => ` of ${name.getText()}`),\n Option.getOrElse(() => \"\"),\n );\n const name = Option.fromUndefinedOr(getNameOfDeclaration(slot)).pipe(\n Option.map((found) => found.getText()),\n Option.getOrElse(() => \"value\"),\n );\n return `${name}${owner} from ${packageOf(slot.getSourceFile().fileName)}`;\n }),\n );\n\nconst libraryTargetOf =\n (context: FlowContext) =>\n (expression: Expression, contextual: Type): Option.Option<string> =>\n aliasTarget(context)(contextual).pipe(Option.orElse(() => slotTarget(context)(expression)));\n\nconst siteWithin =\n (context: FlowContext) =>\n (node: Node): Option.Option<ValueSite> =>\n Arr.findFirst(context.sites, (site) => contains(node)(site.node));\n\nconst aliasSite =\n (context: FlowContext) =>\n (type: Type): Option.Option<ValueSite> =>\n Option.fromUndefinedOr(type.getAliasSymbol()).pipe(\n Option.flatMap((alias) => Arr.findFirst(declarationsOf(alias), isTypeAliasDeclaration)),\n Option.flatMap(siteWithin(context)),\n );\n\nconst annotationSite =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<ValueSite> =>\n symbolAt(context.checker)(expression).pipe(\n Option.flatMap((symbol) => Option.fromUndefinedOr(symbol.valueDeclaration)),\n Option.flatMap((handle) => Option.fromUndefinedOr(handle.resolve())),\n Option.flatMap(annotationOf),\n Option.flatMap((annotation) =>\n siteWithin(context)(annotation).pipe(\n Option.orElse(() => aliasSite(context)(context.checker.getTypeFromTypeNode(annotation))),\n ),\n ),\n );\n\nconst siteBehind =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<ValueSite> =>\n aliasSite(context)(context.checker.getTypeAtLocation(expression)).pipe(\n Option.orElse(() => annotationSite(context)(expression)),\n );\n\nconst isFlowSource = (node: Node): node is Expression =>\n isIdentifier(node) || isPropertyAccessExpression(node) || isElementAccessExpression(node);\n\nconst flowOf =\n (context: FlowContext) =>\n (expression: Expression): Option.Option<Flow> =>\n Option.fromUndefinedOr(context.checker.getContextualType(expression)).pipe(\n Option.flatMap((contextual) =>\n Option.all([\n vocabularyOf(context.checker)(contextual),\n libraryTargetOf(context)(expression, contextual),\n ]),\n ),\n Option.flatMap(([vocabulary, target]) =>\n siteBehind(context)(expression).pipe(\n Option.filter((site) => isSubsetOf(site.values, vocabulary.values)),\n Option.map((site) => ({ site, target })),\n ),\n ),\n );\n\nconst flowsIn =\n (context: FlowContext) =>\n (sourceFile: SourceFile): readonly Flow[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isFlowSource(node)),\n Arr.map((node) => flowOf(context)(node)),\n ),\n );\n\nexport { flowsIn };\nexport type { Flow, FlowContext };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport {\n getJSDocTags,\n getTextOfJSDocComment,\n isIdentifier,\n isSourceFile,\n isVariableDeclaration,\n isVariableDeclarationList,\n isVariableStatement,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Node,\n SourceFile,\n Type,\n VariableDeclaration,\n VariableDeclarationList,\n} from \"./compiler.ts\";\nimport { problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { Project } from \"./project.ts\";\nimport { columnOf, descendantsOf, lineOf } from \"./syntax.ts\";\nimport { finiteValuesOf, formatValues, literalValuesOf, sameValues } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface Owner {\n readonly conceptId: string;\n readonly key: string;\n readonly name: string;\n readonly file: string;\n readonly line: number;\n readonly column: number;\n readonly packageName: Option.Option<string>;\n readonly values: readonly Value[];\n}\n\ninterface OwnerScan {\n readonly owners: readonly Owner[];\n readonly problems: readonly Problem[];\n}\n\ninterface Annotated {\n readonly node: Node;\n readonly conceptId: string;\n}\n\nconst OWNER_TAG = \"msch\";\nconst FIRST_OWNER_COUNT = 1;\n\nconst ownerKeyOf = (declaration: Declaration): Option.Option<string> => {\n if (!isVariableDeclaration(declaration) || !isIdentifier(declaration.name)) {\n return Option.none();\n }\n return Option.some(`${declaration.getSourceFile().fileName}#${declaration.name.text}`);\n};\n\nconst annotationsOf = (node: Node): readonly Annotated[] =>\n pipe(\n getJSDocTags(node),\n Arr.filter((tag) => tag.tagName.text === OWNER_TAG),\n Arr.map((tag) => ({ node, conceptId: Str.trim(getTextOfJSDocComment(tag.comment) ?? \"\") })),\n );\n\nconst ANNOTATABLE_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.VariableDeclaration,\n SyntaxKind.FunctionDeclaration,\n SyntaxKind.ClassDeclaration,\n SyntaxKind.InterfaceDeclaration,\n SyntaxKind.TypeAliasDeclaration,\n SyntaxKind.EnumDeclaration,\n SyntaxKind.PropertySignature,\n SyntaxKind.PropertyAssignment,\n SyntaxKind.PropertyDeclaration,\n]);\n\nconst isAnnotatable = (node: Node): boolean => ANNOTATABLE_KINDS.has(node.kind);\n\nconst isConstList = (list: VariableDeclarationList): boolean =>\n Option.fromUndefinedOr(list.getFirstToken()).pipe(\n Option.exists((token) => token.kind === SyntaxKind.ConstKeyword),\n );\n\nconst isModuleStatementList = (list: VariableDeclarationList): boolean =>\n isVariableStatement(list.parent) && isSourceFile(list.parent.parent);\n\nconst isModuleConstList = (node: Node): node is VariableDeclarationList =>\n isVariableDeclarationList(node) && isModuleStatementList(node) && isConstList(node);\n\nconst isModuleConst = (node: Node): node is VariableDeclaration =>\n isVariableDeclaration(node) && isIdentifier(node.name) && isModuleConstList(node.parent);\n\nconst objectValuesOf =\n (checker: Checker) =>\n (type: Type): Option.Option<readonly Value[]> =>\n literalValuesOf(\n pipe(\n checker.getPropertiesOfType(type),\n Arr.map((property) => checker.getTypeOfSymbol(property)),\n ),\n );\n\nconst ownerValuesOf =\n (checker: Checker) =>\n (declaration: VariableDeclaration): Option.Option<readonly Value[]> => {\n const type = checker.getTypeAtLocation(declaration.name);\n return finiteValuesOf(checker)(type).pipe(Option.orElse(() => objectValuesOf(checker)(type)));\n };\n\nconst annotationProblem = (message: string): ((node: Node) => Problem) =>\n problemAt({ rule: \"owner-annotation\", message });\n\nconst scanned = (owners: readonly Owner[], problems: readonly Problem[]): OwnerScan => ({\n owners,\n problems,\n});\n\nconst ownerOf =\n (project: Project) =>\n (annotated: Annotated): OwnerScan => {\n const { node, conceptId } = annotated;\n if (!isModuleConst(node)) {\n return scanned(\n [],\n [annotationProblem(`@${OWNER_TAG} registers an owner only on a module-scope const.`)(node)],\n );\n }\n if (conceptId === \"\") {\n return scanned([], [annotationProblem(`@${OWNER_TAG} needs a concept id.`)(node)]);\n }\n const values = ownerValuesOf(project.checker)(node);\n return Option.match(Option.all([values, ownerKeyOf(node)]), {\n onNone: () =>\n scanned(\n [],\n [annotationProblem(`The owner of ${conceptId} holds no finite value set.`)(node)],\n ),\n onSome: ([ownedValues, key]) =>\n scanned(\n [\n {\n conceptId,\n key,\n name: node.name.getText(),\n file: node.getSourceFile().fileName,\n line: lineOf(node),\n column: columnOf(node),\n packageName: project.packageName,\n values: ownedValues,\n },\n ],\n [],\n ),\n });\n };\n\nconst annotatedIn = (sourceFile: SourceFile): readonly Annotated[] =>\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isAnnotatable(node)),\n Arr.flatMap((node) => annotationsOf(node)),\n );\n\nconst ownerProblem =\n (message: string) =>\n (owner: Owner): Problem => ({\n file: owner.file,\n line: owner.line,\n column: owner.column,\n rule: \"owner-annotation\",\n message,\n });\n\nconst conflictProblems = (owners: readonly Owner[]): readonly Problem[] =>\n pipe(\n owners,\n Arr.flatMap((owner, index) => {\n const earlier = Arr.take(owners, index);\n const sameConcept = pipe(\n earlier,\n Arr.filter((other) => other.conceptId === owner.conceptId),\n );\n const sameSet = pipe(\n earlier,\n Arr.filter(\n (other) => other.conceptId !== owner.conceptId && sameValues(other.values, owner.values),\n ),\n );\n return [\n ...pipe(\n Arr.take(sameConcept, FIRST_OWNER_COUNT),\n Arr.map(() =>\n ownerProblem(`The concept ${owner.conceptId} already has an owner.`)(owner),\n ),\n ),\n ...pipe(\n Arr.take(sameSet, FIRST_OWNER_COUNT),\n Arr.map((other) =>\n ownerProblem(\n `The values ${formatValues(owner.values)} are already owned by ${other.conceptId}.`,\n )(owner),\n ),\n ),\n ];\n }),\n );\n\nconst ownersIn = (project: Project): OwnerScan => {\n const results = pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) =>\n pipe(\n annotatedIn(sourceFile),\n Arr.map((annotated) => ownerOf(project)(annotated)),\n ),\n ),\n );\n return scanned(\n pipe(\n results,\n Arr.flatMap((result) => result.owners),\n ),\n pipe(\n results,\n Arr.flatMap((result) => result.problems),\n ),\n );\n};\n\nconst combineOwnerScans = (scans: readonly OwnerScan[]): OwnerScan => {\n const owners = Arr.dedupeWith(\n pipe(\n scans,\n Arr.flatMap((scan) => scan.owners),\n ),\n (left, right) => left.key === right.key,\n );\n const problems = [\n ...pipe(\n scans,\n Arr.flatMap((scan) => scan.problems),\n ),\n ...conflictProblems(owners),\n ];\n return { owners, problems };\n};\n\nexport { OWNER_TAG, combineOwnerScans, ownerKeyOf, ownersIn };\nexport type { Owner, OwnerScan };\n","import { Array as Arr, Effect, Option, pipe } from \"effect\";\n\nimport { InternalSymbolName, isModuleDeclaration, isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Declaration, Node, SyntaxKind, TypeSymbol, Type } from \"./compiler.ts\";\nimport type { DependencyEntry } from \"./dependencies.ts\";\nimport {\n declarationsOf,\n isGenericDeclaration,\n isTypeDeclaration,\n propertyNamesOf,\n resolvedSymbol,\n} from \"./syntax.ts\";\nimport { schemaTypeOf, vocabularyOf } from \"./values.ts\";\nimport type { Vocabulary } from \"./values.ts\";\n\ninterface LibraryType {\n readonly specifier: string;\n readonly typeName: string;\n}\n\ninterface LibraryVocabulary extends LibraryType {\n readonly vocabulary: Vocabulary;\n}\n\ninterface DeclarationLocation {\n readonly file: string;\n readonly pos: number;\n readonly kind: SyntaxKind;\n}\n\ninterface LibraryShape extends LibraryType {\n readonly form: \"declared\" | \"schema\";\n readonly declaration: DeclarationLocation;\n readonly propertyNames: readonly string[];\n}\n\ninterface LibraryIndex {\n readonly vocabularies: readonly LibraryVocabulary[];\n readonly shapes: readonly LibraryShape[];\n}\n\ninterface Walk {\n readonly checker: Checker;\n readonly entry: DependencyEntry;\n}\n\ninterface Visit {\n readonly exported: TypeSymbol;\n readonly qualifier: string;\n readonly ancestors: readonly TypeSymbol[];\n}\n\ninterface Exported {\n readonly symbol: TypeSymbol;\n readonly typeName: string;\n}\n\nconst NAMESPACE_DEPTH_LIMIT = 8;\nconst EMPTY_INDEX: LibraryIndex = { vocabularies: [], shapes: [] };\n\nconst isObjectType =\n (checker: Checker) =>\n (type: Type): boolean =>\n !type.isUnionType() &&\n !type.isLiteralType() &&\n checker.getApparentType(type).id === type.id &&\n Arr.isReadonlyArrayNonEmpty(checker.getPropertiesOfType(type));\n\nconst describeLibraryType = (type: LibraryType): string =>\n `${type.typeName} from ${type.specifier}`;\n\nconst locationOf = (declaration: Node): DeclarationLocation => ({\n file: declaration.getSourceFile().fileName,\n pos: declaration.pos,\n kind: declaration.kind,\n});\n\nconst declarationKey = (location: DeclarationLocation): string =>\n `${location.file}#${String(location.pos)}#${String(location.kind)}`;\n\ntype ShapeSource = LibraryType & Pick<LibraryShape, \"form\">;\n\nconst shapeOf =\n (checker: Checker) =>\n (source: ShapeSource, declaration: Declaration, type: Type): readonly LibraryShape[] =>\n Arr.filter(\n [\n {\n ...source,\n declaration: locationOf(declaration),\n propertyNames: propertyNamesOf(checker)(type),\n },\n ],\n () => isObjectType(checker)(type),\n );\n\nconst declaredTypeIndex = (walk: Walk, exported: Exported): LibraryIndex => {\n const declaration = Arr.findFirst(declarationsOf(exported.symbol), isTypeDeclaration);\n if (Option.isNone(declaration) || isGenericDeclaration(declaration.value)) {\n return EMPTY_INDEX;\n }\n const located = { specifier: walk.entry.specifier, typeName: exported.typeName };\n const type = walk.checker.getDeclaredTypeOfSymbol(exported.symbol);\n const vocabularies = vocabularyOf(walk.checker)(type).pipe(\n Option.map((vocabulary) => ({ ...located, vocabulary })),\n Option.toArray,\n );\n const shapes = shapeOf(walk.checker)({ ...located, form: \"declared\" }, declaration.value, type);\n return { vocabularies, shapes };\n};\n\nconst schemaTypeIndex =\n (walk: Walk, located: LibraryType) =>\n (declaration: Declaration, schemaType: Type): LibraryIndex => ({\n vocabularies: vocabularyOf(walk.checker)(schemaType).pipe(\n Option.map((vocabulary) => ({ ...located, vocabulary })),\n Option.toArray,\n ),\n shapes: shapeOf(walk.checker)({ ...located, form: \"schema\" }, declaration, schemaType),\n });\n\nconst schemaValueIndex = (walk: Walk, exported: Exported): LibraryIndex => {\n const declaration = Arr.findFirst(declarationsOf(exported.symbol), isVariableDeclaration);\n if (Option.isNone(declaration)) {\n return EMPTY_INDEX;\n }\n const valueType = walk.checker.getTypeOfSymbolAtLocation(exported.symbol, declaration.value);\n const located = {\n specifier: walk.entry.specifier,\n typeName: `(typeof ${exported.typeName})[\"Type\"]`,\n };\n return Option.match(schemaTypeOf(walk.checker)(valueType), {\n onNone: () => EMPTY_INDEX,\n onSome: (schemaType) => schemaTypeIndex(walk, located)(declaration.value, schemaType),\n });\n};\n\nconst mergeIndexes = (indexes: readonly LibraryIndex[]): LibraryIndex => ({\n vocabularies: pipe(\n indexes,\n Arr.flatMap((index) => index.vocabularies),\n ),\n shapes: pipe(\n indexes,\n Arr.flatMap((index) => index.shapes),\n ),\n});\n\nconst isNamespace = (symbol: TypeSymbol): boolean =>\n pipe(\n declarationsOf(symbol),\n Arr.some((declaration) => isModuleDeclaration(declaration)),\n );\n\nconst indexUnder = (walk: Walk, visit: Visit): LibraryIndex => {\n const symbol = resolvedSymbol(walk.checker)(visit.exported);\n const named = { symbol, typeName: `${visit.qualifier}${visit.exported.name}` };\n const own = mergeIndexes([declaredTypeIndex(walk, named), schemaValueIndex(walk, named)]);\n if (\n !isNamespace(symbol) ||\n visit.ancestors.length >= NAMESPACE_DEPTH_LIMIT ||\n visit.ancestors.includes(symbol)\n ) {\n return own;\n }\n const nested = pipe(\n walk.checker.getExportsOfModule(symbol),\n Arr.map((member) =>\n indexUnder(walk, {\n exported: member,\n qualifier: `${named.typeName}.`,\n ancestors: [...visit.ancestors, symbol],\n }),\n ),\n );\n return mergeIndexes([own, ...nested]);\n};\n\nconst exportAssignmentOf = (moduleSymbol: TypeSymbol): Option.Option<TypeSymbol> =>\n Option.fromUndefinedOr(moduleSymbol.getExports().get(InternalSymbolName.ExportEquals));\n\nconst indexOfEntry =\n (checker: Checker) =>\n (entry: DependencyEntry): LibraryIndex => {\n const moduleSymbol = Option.fromUndefinedOr(\n checker.getSymbolOfSourceFile(entry.declarationsPath),\n );\n if (Option.isNone(moduleSymbol)) {\n return EMPTY_INDEX;\n }\n const walk: Walk = { checker, entry };\n const roots = Option.match(exportAssignmentOf(moduleSymbol.value), {\n onNone: () => checker.getExportsOfModule(moduleSymbol.value),\n onSome: (assigned) => [resolvedSymbol(checker)(assigned)],\n });\n return mergeIndexes(\n pipe(\n roots,\n Arr.map((exported) => indexUnder(walk, { exported, qualifier: \"\", ancestors: [] })),\n ),\n );\n };\n\ninterface CachedIndex {\n readonly index: LibraryIndex;\n readonly cached: boolean;\n}\n\ninterface LibraryCache {\n readonly indexOf: (entry: DependencyEntry, compute: () => LibraryIndex) => CachedIndex;\n}\n\nconst libraryCache = (): LibraryCache => {\n const indexes = new Map<string, LibraryIndex>();\n return {\n indexOf: (entry, compute) =>\n Option.match(Option.fromUndefinedOr(indexes.get(entry.declarationsPath)), {\n onSome: (index) => ({ index, cached: true }),\n onNone: () => {\n const index = compute();\n indexes.set(entry.declarationsPath, index);\n return { index, cached: false };\n },\n }),\n };\n};\n\nconst indexEntry =\n (cache: LibraryCache) =>\n (checker: Checker) =>\n (entry: DependencyEntry): Effect.Effect<LibraryIndex> =>\n Effect.sync(() => cache.indexOf(entry, () => indexOfEntry(checker)(entry))).pipe(\n Effect.tap(({ index, cached }) =>\n Effect.annotateCurrentSpan({\n \"msch.library.cached\": cached,\n \"msch.library.vocabularies\": index.vocabularies.length,\n \"msch.library.shapes\": index.shapes.length,\n }),\n ),\n Effect.map(({ index }) => index),\n Effect.withSpan(\"indexLibraryEntry\", {\n attributes: { \"msch.library.specifier\": entry.specifier },\n }),\n );\n\nconst libraryIndex =\n (cache: LibraryCache) =>\n (checker: Checker) =>\n (entries: readonly DependencyEntry[]): Effect.Effect<LibraryIndex> =>\n pipe(\n entries,\n Effect.forEach(indexEntry(cache)(checker)),\n Effect.map(mergeIndexes),\n Effect.withSpan(\"libraryIndex\"),\n );\n\nexport {\n declarationKey,\n describeLibraryType,\n isObjectType,\n libraryCache,\n libraryIndex,\n locationOf,\n};\nexport type {\n CachedIndex,\n DeclarationLocation,\n LibraryCache,\n LibraryIndex,\n LibraryShape,\n LibraryType,\n LibraryVocabulary,\n};\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport { isSatisfiesExpression, isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Node } from \"./compiler.ts\";\nimport { declarationKey, locationOf } from \"./library.ts\";\nimport { declarationsOf, referencedSymbols } from \"./syntax.ts\";\n\nconst contractOf = (node: Node): readonly Node[] => {\n const { parent } = node;\n if (isSatisfiesExpression(parent) && parent.expression === node) {\n return [parent.type];\n }\n if (isVariableDeclaration(parent) && parent.initializer === node) {\n return Option.toArray(Option.fromUndefinedOr(parent.type));\n }\n return [];\n};\n\nconst derivedDeclarationsOf =\n (checker: Checker) =>\n (node: Node): ReadonlySet<string> => {\n const scopes = Arr.prepend(contractOf(node), node);\n return new Set(\n pipe(\n scopes,\n Arr.flatMap((scope) => referencedSymbols(checker)(scope)),\n Arr.flatMap((symbol) => declarationsOf(symbol)),\n Arr.map((declaration) => declarationKey(locationOf(declaration))),\n ),\n );\n };\n\nexport { derivedDeclarationsOf };\n","import { Array as Arr, Option, Order, pipe } from \"effect\";\n\nimport {\n isCallExpression,\n isInterfaceDeclaration,\n isModuleBlock,\n isModuleDeclaration,\n isObjectLiteralExpression,\n isStringLiteral,\n isTypeAliasDeclaration,\n isTypeLiteralNode,\n isVariableDeclaration,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n EnumDeclaration,\n InterfaceDeclaration,\n Node,\n Program,\n SourceFile,\n TypeSymbol,\n Type,\n TypeAliasDeclaration,\n VariableDeclaration,\n} from \"./compiler.ts\";\nimport { derivedDeclarationsOf } from \"./derivation.ts\";\nimport { declarationKey, describeLibraryType, isObjectType } from \"./library.ts\";\nimport type { DeclarationLocation, LibraryShape } from \"./library.ts\";\nimport { CANDIDATE_LIMIT, problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { descendantsOf, isGenericDeclaration, isTypeDeclaration } from \"./syntax.ts\";\nimport { schemaTypeOf } from \"./values.ts\";\n\ninterface ShapeContext {\n readonly checker: Checker;\n readonly program: Program;\n readonly shapes: readonly LibraryShape[];\n}\n\ninterface ShapeSite {\n readonly node: Node;\n readonly type: Type;\n}\n\ninterface ShapeMatch {\n readonly shape: LibraryShape;\n readonly extra: number;\n}\n\nconst MINIMUM_SHAPE_PROPERTIES = 3;\nconst EXACT = 0;\n\nconst augmentsAModule = (node: Node): boolean => {\n const block = node.parent;\n return (\n isModuleBlock(block) && isModuleDeclaration(block.parent) && isStringLiteral(block.parent.name)\n );\n};\n\nconst isPlainInterface = (node: Node): node is InterfaceDeclaration =>\n isInterfaceDeclaration(node) && !isGenericDeclaration(node) && !augmentsAModule(node);\n\nconst isPlainTypeLiteral = (node: Node): node is TypeAliasDeclaration =>\n isTypeAliasDeclaration(node) && !isGenericDeclaration(node) && isTypeLiteralNode(node.type);\n\nconst isDeclaredShape = (node: Node): node is InterfaceDeclaration | TypeAliasDeclaration =>\n isPlainInterface(node) || isPlainTypeLiteral(node);\n\nconst declaredShapeOf =\n (checker: Checker) =>\n (node: Node): Option.Option<Type> =>\n Option.liftPredicate(node, isDeclaredShape).pipe(\n Option.map((declaration) => checker.getTypeAtLocation(declaration.name)),\n );\n\nconst schemaShapeOf =\n (checker: Checker) =>\n (node: Node): Option.Option<Type> => {\n if (!isCallExpression(node)) {\n return Option.none();\n }\n const { arguments: callArguments } = node;\n if (\n !pipe(\n callArguments,\n Arr.some((argument) => isObjectLiteralExpression(argument)),\n )\n ) {\n return Option.none();\n }\n return schemaTypeOf(checker)(checker.getTypeAtLocation(node)).pipe(\n Option.filter((type) => isObjectType(checker)(type)),\n );\n };\n\nconst shapeSitesIn =\n (checker: Checker) =>\n (sourceFile: SourceFile): readonly ShapeSite[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.map((node) =>\n declaredShapeOf(checker)(node).pipe(\n Option.orElse(() => schemaShapeOf(checker)(node)),\n Option.map((type) => ({ node, type })),\n ),\n ),\n ),\n );\n\ninterface LocalProperty {\n readonly name: string;\n readonly type: Type;\n}\n\ninterface OpenTypeIds {\n readonly any: number;\n readonly unknown: number;\n}\n\nconst openTypeIdsOf = (checker: Checker): OpenTypeIds => ({\n any: checker.getAnyType().id,\n unknown: checker.getUnknownType().id,\n});\n\ntype IndexedDeclaration =\n | TypeAliasDeclaration\n | InterfaceDeclaration\n | EnumDeclaration\n | VariableDeclaration;\n\nconst isIndexedDeclaration = (node: Node): node is IndexedDeclaration =>\n isTypeDeclaration(node) || isVariableDeclaration(node);\n\nconst declarationAt =\n (program: Program) =>\n (location: DeclarationLocation): Option.Option<IndexedDeclaration> =>\n Option.fromUndefinedOr(program.getSourceFile(location.file)).pipe(\n Option.flatMap((sourceFile) =>\n Arr.findFirst(\n descendantsOf(sourceFile),\n (node): node is IndexedDeclaration =>\n node.pos === location.pos && node.kind === location.kind && isIndexedDeclaration(node),\n ),\n ),\n );\n\nconst symbolOfDeclaration =\n (checker: Checker) =>\n (declaration: IndexedDeclaration): Option.Option<TypeSymbol> =>\n Option.fromUndefinedOr(checker.getSymbolAtLocation(declaration.name));\n\nconst shapeTypeOf =\n (context: ShapeContext) =>\n (shape: LibraryShape): Option.Option<Type> => {\n const { checker } = context;\n return declarationAt(context.program)(shape.declaration).pipe(\n Option.flatMap((declaration) =>\n symbolOfDeclaration(checker)(declaration).pipe(\n Option.flatMap((symbol) => {\n if (shape.form === \"declared\") {\n return Option.some(checker.getDeclaredTypeOfSymbol(symbol));\n }\n return schemaTypeOf(checker)(checker.getTypeOfSymbolAtLocation(symbol, declaration));\n }),\n ),\n ),\n );\n };\n\nconst hasEveryName =\n (locals: readonly LocalProperty[]) =>\n (shape: LibraryShape): boolean => {\n const names: ReadonlySet<string> = new Set(shape.propertyNames);\n return pipe(\n locals,\n Arr.every((local) => names.has(local.name)),\n );\n };\n\nconst sameProperty =\n (checker: Checker, open: OpenTypeIds) =>\n (localType: Type, library: TypeSymbol): boolean => {\n const libraryType = checker.getTypeOfSymbol(library);\n return (\n libraryType.id !== open.any &&\n libraryType.id !== open.unknown &&\n checker.isTypeAssignableTo(localType, libraryType) &&\n checker.isTypeAssignableTo(libraryType, localType)\n );\n };\n\nconst matchOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (locals: readonly LocalProperty[], shape: LibraryShape): Option.Option<ShapeMatch> => {\n const { checker } = context;\n const matches = shapeTypeOf(context)(shape).pipe(\n Option.exists((shapeType) =>\n pipe(\n locals,\n Arr.every((local) =>\n Option.fromUndefinedOr(checker.getPropertyOfType(shapeType, local.name)).pipe(\n Option.exists((library) => sameProperty(checker, open)(local.type, library)),\n ),\n ),\n ),\n ),\n );\n if (!matches) {\n return Option.none();\n }\n return Option.some({ shape, extra: shape.propertyNames.length - locals.length });\n };\n\nconst localPropertiesOf =\n (checker: Checker) =>\n (symbols: readonly TypeSymbol[]): readonly LocalProperty[] =>\n pipe(\n Arr.zip(symbols, checker.getTypeOfSymbol(symbols)),\n Arr.map(([symbol, type]) => ({ name: symbol.name, type })),\n );\n\nconst matchOrder = Order.mapInput(Order.Number, (match: ShapeMatch) => match.extra);\n\nconst shapeProblem = (site: ShapeSite, matches: readonly ShapeMatch[]): Problem => {\n const shown = pipe(\n Arr.take(matches, CANDIDATE_LIMIT),\n Arr.map((match) => describeLibraryType(match.shape)),\n Arr.join(\", \"),\n );\n const advice = Option.match(\n Arr.findFirst(matches, (match) => match.extra === EXACT),\n {\n onNone: () =>\n \"Derive it from the library type, for example with Pick, instead of copying its properties.\",\n onSome: () => \"Use the library type instead of copying it.\",\n },\n );\n return problemAt({ rule: \"library-shape\", message: `This shape copies ${shown}. ${advice}` })(\n site.node,\n );\n};\n\nconst candidatesOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (site: ShapeSite, locals: readonly LocalProperty[]): readonly ShapeMatch[] => {\n const derived = derivedDeclarationsOf(context.checker)(site.node);\n const named = pipe(context.shapes, Arr.filter(hasEveryName(locals)));\n if (\n pipe(\n named,\n Arr.some((shape) => derived.has(declarationKey(shape.declaration))),\n )\n ) {\n return [];\n }\n const candidates = pipe(\n named,\n Arr.map((shape) => matchOf(context, open)(locals, shape)),\n Arr.getSomes,\n );\n return Arr.sort(candidates, matchOrder);\n };\n\nconst shapeProblemOf =\n (context: ShapeContext, open: OpenTypeIds) =>\n (site: ShapeSite): Option.Option<Problem> => {\n const symbols = context.checker.getPropertiesOfType(site.type);\n if (symbols.length < MINIMUM_SHAPE_PROPERTIES) {\n return Option.none();\n }\n const locals = localPropertiesOf(context.checker)(symbols);\n return Option.liftPredicate(\n candidatesOf(context, open)(site, locals),\n Arr.isReadonlyArrayNonEmpty,\n ).pipe(Option.map((found) => shapeProblem(site, found)));\n };\n\nconst shapeProblemsIn =\n (context: ShapeContext) =>\n (sourceFile: SourceFile): readonly Problem[] => {\n const sites = shapeSitesIn(context.checker)(sourceFile);\n if (!Arr.isReadonlyArrayNonEmpty(sites)) {\n return [];\n }\n const open = openTypeIdsOf(context.checker);\n return Arr.getSomes(\n pipe(\n sites,\n Arr.map((site) => shapeProblemOf(context, open)(site)),\n ),\n );\n };\n\nexport { shapeProblemsIn };\nexport type { ShapeContext };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport {\n isArrayLiteralExpression,\n isCallExpression,\n isElementAccessExpression,\n isEnumDeclaration,\n isIdentifier,\n isPropertyAccessExpression,\n isSpreadElement,\n isTypeReferenceNode,\n isUnionTypeNode,\n} from \"./compiler.ts\";\nimport type {\n ArrayLiteralExpression,\n CallExpression,\n Checker,\n Expression,\n Node,\n TypeSymbol,\n TypeNode,\n UnionTypeNode,\n} from \"./compiler.ts\";\nimport {\n childrenOf,\n declarationsOf,\n isTypeDeclaration,\n propertyNamesOf,\n referencedSymbols,\n} from \"./syntax.ts\";\nimport { finiteValuesOf, isSubsetOf, literalUnionOf, schemaTypeOf } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface ValueSite {\n readonly node: Node;\n readonly values: readonly Value[];\n readonly sources: readonly TypeSymbol[];\n}\n\nconst namedValuesOf =\n (checker: Checker) =>\n (symbol: TypeSymbol): Option.Option<readonly Value[]> => {\n if (\n pipe(\n declarationsOf(symbol),\n Arr.some((declaration) => isTypeDeclaration(declaration)),\n )\n ) {\n return finiteValuesOf(checker)(checker.getDeclaredTypeOfSymbol(symbol));\n }\n return finiteValuesOf(checker)(checker.getTypeOfSymbol(symbol));\n };\n\nconst hasFiniteContext =\n (checker: Checker) =>\n (node: Expression): boolean =>\n Option.fromUndefinedOr(checker.getContextualType(node)).pipe(\n Option.flatMap(finiteValuesOf(checker)),\n Option.isSome,\n );\n\nconst isNamedValue = (element: Expression): boolean => {\n if (isSpreadElement(element)) {\n return isNamedValue(element.expression);\n }\n return (\n isIdentifier(element) ||\n isPropertyAccessExpression(element) ||\n isElementAccessExpression(element)\n );\n};\n\nconst namesEveryElement = (array: ArrayLiteralExpression): boolean =>\n pipe(\n array.elements,\n Arr.every((element) => isNamedValue(element)),\n );\n\nconst expressionValuesOf =\n (checker: Checker) =>\n (node: Expression): Option.Option<readonly Value[]> => {\n if (hasFiniteContext(checker)(node)) {\n return Option.none();\n }\n const type = checker.getTypeAtLocation(node);\n if (isArrayLiteralExpression(node)) {\n return Option.liftPredicate(node, (array) => !namesEveryElement(array)).pipe(\n Option.flatMap(() => finiteValuesOf(checker)(type)),\n );\n }\n return schemaTypeOf(checker)(type).pipe(Option.flatMap(literalUnionOf));\n };\n\nconst selectsKeys =\n (checker: Checker) =>\n (node: UnionTypeNode, values: readonly Value[]): boolean => {\n const { parent } = node;\n if (!isTypeReferenceNode(parent)) {\n return false;\n }\n const typeArguments: readonly TypeNode[] = parent.typeArguments ?? [];\n return pipe(\n typeArguments,\n Arr.filter((argument) => argument !== node),\n Arr.some((argument) =>\n isSubsetOf(values, propertyNamesOf(checker)(checker.getTypeFromTypeNode(argument))),\n ),\n );\n };\n\nconst unionValuesOf =\n (checker: Checker) =>\n (node: UnionTypeNode): Option.Option<readonly Value[]> =>\n literalUnionOf(checker.getTypeFromTypeNode(node)).pipe(\n Option.filter((values) => !selectsKeys(checker)(node, values)),\n );\n\nconst isExpressionSite = (node: Node): node is ArrayLiteralExpression | CallExpression =>\n isArrayLiteralExpression(node) || isCallExpression(node);\n\nconst expressionSiteValuesOf =\n (checker: Checker) =>\n (node: Node): Option.Option<readonly Value[]> =>\n Option.liftPredicate(node, isExpressionSite).pipe(Option.flatMap(expressionValuesOf(checker)));\n\nconst siteValuesOf =\n (checker: Checker) =>\n (node: Node): Option.Option<readonly Value[]> => {\n if (isUnionTypeNode(node)) {\n return unionValuesOf(checker)(node);\n }\n if (isEnumDeclaration(node)) {\n return literalUnionOf(checker.getTypeAtLocation(node.name));\n }\n return expressionSiteValuesOf(checker)(node);\n };\n\nconst derivationScopeOf = (node: Node): Node => {\n if (isTypeReferenceNode(node.parent)) {\n return node.parent;\n }\n return node;\n};\n\nconst sourcesOf =\n (checker: Checker) =>\n (node: Node): readonly TypeSymbol[] =>\n pipe(\n referencedSymbols(checker)(derivationScopeOf(node)),\n Arr.filter((symbol) => Option.isSome(namedValuesOf(checker)(symbol))),\n );\n\nconst sitesUnder =\n (checker: Checker) =>\n (node: Node): readonly ValueSite[] => {\n const nested = pipe(\n childrenOf(node),\n Arr.flatMap((child) => sitesUnder(checker)(child)),\n );\n if (Arr.isReadonlyArrayNonEmpty(nested)) {\n return nested;\n }\n return siteValuesOf(checker)(node).pipe(\n Option.map((values) => ({ node, values, sources: sourcesOf(checker)(node) })),\n Option.toArray,\n );\n };\n\nexport { sitesUnder };\nexport type { ValueSite };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport {\n isBinaryExpression,\n isCallExpression,\n isNewExpression,\n isNumericLiteral,\n isPropertyAssignment,\n isStringLiteral,\n isTypeAliasDeclaration,\n isVariableDeclaration,\n SyntaxKind,\n} from \"./compiler.ts\";\nimport type {\n Checker,\n Declaration,\n Node,\n NumericLiteral,\n SourceFile,\n StringLiteral,\n TypeSymbol,\n} from \"./compiler.ts\";\nimport type { Flow } from \"./flows.ts\";\nimport { describeLibraryType } from \"./library.ts\";\nimport type { LibraryVocabulary } from \"./library.ts\";\nimport { ownerKeyOf } from \"./owners.ts\";\nimport type { Owner } from \"./owners.ts\";\nimport { CANDIDATE_LIMIT, problemAt } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { contextSymbolsOf } from \"./slots.ts\";\nimport {\n contains,\n declarationsOf,\n descendantsOf,\n importedModulesOf,\n referencedSymbols,\n uniqueByReference,\n} from \"./syntax.ts\";\nimport { formatValues, isSubsetOf, vocabularyOf } from \"./values.ts\";\n\ninterface ValueContext {\n readonly checker: Checker;\n readonly owners: readonly Owner[];\n readonly vocabularies: readonly LibraryVocabulary[];\n readonly flows: readonly Flow[];\n}\n\ninterface SiteVerdict {\n readonly problems: readonly Problem[];\n readonly unowned: readonly ValueSite[];\n}\n\nconst OWNER_SEARCH_DEPTH = 4;\nconst NOTHING_HIDDEN = 0;\n\nconst directOwners =\n (context: ValueContext) =>\n (symbol: TypeSymbol): readonly Owner[] => {\n const keys = Arr.getSomes(\n pipe(\n declarationsOf(symbol),\n Arr.map((declaration) => ownerKeyOf(declaration)),\n ),\n );\n return pipe(\n context.owners,\n Arr.filter((owner) => keys.includes(owner.key)),\n );\n };\n\nconst isFollowable = (declaration: Declaration): boolean =>\n !declaration.getSourceFile().isDeclarationFile &&\n (isTypeAliasDeclaration(declaration) || isVariableDeclaration(declaration));\n\nconst ownersBehind =\n (context: ValueContext) =>\n (symbol: TypeSymbol, ancestors: readonly TypeSymbol[]): readonly Owner[] => {\n const direct = directOwners(context)(symbol);\n if (Arr.isReadonlyArrayNonEmpty(direct) || ancestors.length >= OWNER_SEARCH_DEPTH) {\n return direct;\n }\n const visited = [...ancestors, symbol];\n return uniqueByReference(\n pipe(\n declarationsOf(symbol),\n Arr.filter((declaration) => isFollowable(declaration)),\n Arr.flatMap((declaration) => referencedSymbols(context.checker)(declaration)),\n Arr.filter((referenced) => !visited.includes(referenced)),\n Arr.flatMap((referenced) => ownersBehind(context)(referenced, visited)),\n ),\n );\n };\n\nconst describeOwners = (owners: readonly Owner[]): string =>\n pipe(\n owners,\n Arr.map((owner) => `${owner.conceptId} (${owner.name})`),\n Arr.join(\", \"),\n );\n\nconst verdict = (problems: readonly Problem[], unowned: readonly ValueSite[]): SiteVerdict => ({\n problems,\n unowned,\n});\n\nconst derivedVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n const owners = uniqueByReference(\n pipe(\n site.sources,\n Arr.flatMap((source) => ownersBehind(context)(source, [])),\n ),\n );\n const held = pipe(\n owners,\n Arr.flatMap((owner) => owner.values),\n );\n const added = pipe(\n site.values,\n Arr.filter((value) => !isSubsetOf([value], held)),\n );\n if (!Arr.isReadonlyArrayNonEmpty(owners) || !Arr.isReadonlyArrayNonEmpty(added)) {\n return verdict([], []);\n }\n const message = `This set adds ${formatValues(added)} to ${describeOwners(owners)}. Add the values to the owner, or register the wider set as its own concept.`;\n return verdict([problemAt({ rule: \"owner-extension\", message })(site.node)], []);\n };\n\nconst libraryCandidates =\n (context: ValueContext) =>\n (site: ValueSite): readonly string[] => {\n const flowing = Arr.dedupe(\n pipe(\n context.flows,\n Arr.filter((flow) => flow.site.node === site.node),\n Arr.map((flow) => flow.target),\n ),\n );\n if (Arr.isReadonlyArrayNonEmpty(flowing)) {\n return flowing;\n }\n if (\n !pipe(\n site.values,\n Arr.some((value) => typeof value === \"string\"),\n )\n ) {\n return [];\n }\n const imported = importedModulesOf(site.node.getSourceFile());\n return Arr.dedupe(\n pipe(\n context.vocabularies,\n Arr.filter((library) => imported.includes(library.specifier)),\n Arr.filter((library) => isSubsetOf(site.values, library.vocabulary.values)),\n Arr.map((library) => describeLibraryType(library)),\n ),\n );\n };\n\nconst listCandidates = (candidates: readonly string[]): string => {\n const shown = pipe(Arr.take(candidates, CANDIDATE_LIMIT), Arr.join(\", \"));\n const hidden = candidates.length - CANDIDATE_LIMIT;\n if (hidden > NOTHING_HIDDEN) {\n return `${shown} and ${String(hidden)} more`;\n }\n return shown;\n};\n\nconst originalVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n const owners = pipe(\n context.owners,\n Arr.filter((owner) => isSubsetOf(site.values, owner.values)),\n );\n if (Arr.isReadonlyArrayNonEmpty(owners)) {\n const message = `The values ${formatValues(site.values)} are owned by ${describeOwners(owners)}. Derive this set from the owner instead of restating it.`;\n return verdict([problemAt({ rule: \"owner-value-set\", message })(site.node)], []);\n }\n const candidates = libraryCandidates(context)(site);\n if (Arr.isReadonlyArrayNonEmpty(candidates)) {\n const message = `The values ${formatValues(site.values)} restate a dependency type: ${listCandidates(candidates)}. Derive this set from the library type.`;\n return verdict([problemAt({ rule: \"library-value-set\", message })(site.node)], []);\n }\n return verdict([], [site]);\n };\n\nconst siteVerdict =\n (context: ValueContext) =>\n (site: ValueSite): SiteVerdict => {\n if (Arr.isReadonlyArrayNonEmpty(site.sources)) {\n return derivedVerdict(context)(site);\n }\n return originalVerdict(context)(site);\n };\n\nconst VALUE_PARENT_KINDS: ReadonlySet<SyntaxKind> = new Set([\n SyntaxKind.ReturnStatement,\n SyntaxKind.ArrayLiteralExpression,\n SyntaxKind.ConditionalExpression,\n SyntaxKind.ParenthesizedExpression,\n SyntaxKind.ArrowFunction,\n SyntaxKind.JsxExpression,\n]);\n\nconst isCallArgument = (node: Node, parent: Node): boolean =>\n (isCallExpression(parent) || isNewExpression(parent)) && parent.expression !== node;\n\nconst isInitializer = (node: Node, parent: Node): boolean =>\n (isPropertyAssignment(parent) || isVariableDeclaration(parent)) && parent.initializer === node;\n\nconst isRightOperand = (node: Node, parent: Node): boolean =>\n isBinaryExpression(parent) && parent.right === node;\n\nconst VALUE_SLOTS = [isCallArgument, isInitializer, isRightOperand];\n\nconst isValuePosition = (node: Node): boolean => {\n const { parent } = node;\n return (\n VALUE_PARENT_KINDS.has(parent.kind) ||\n pipe(\n VALUE_SLOTS,\n Arr.some((isSlot) => isSlot(node, parent)),\n )\n );\n};\n\nconst ownedLiteralProblem =\n (context: ValueContext) =>\n (literal: StringLiteral | NumericLiteral): Option.Option<Problem> =>\n Option.fromUndefinedOr(context.checker.getContextualType(literal)).pipe(\n Option.filter((contextual) =>\n vocabularyOf(context.checker)(contextual).pipe(\n Option.exists((vocabulary) => !vocabulary.admitsUnnamedValues),\n ),\n ),\n Option.map(() =>\n pipe(\n contextSymbolsOf(context.checker)(literal),\n Arr.flatMap((symbol) => ownersBehind(context)(symbol, [])),\n uniqueByReference,\n Arr.filter((owner) => isSubsetOf([literal.text], pipe(owner.values, Arr.map(String)))),\n ),\n ),\n Option.filter((owners) => Arr.isReadonlyArrayNonEmpty(owners)),\n Option.map((owners) =>\n problemAt({\n rule: \"owned-literal\",\n message: `${literal.getText()} is a value of ${describeOwners(owners)}. Write it through the owner's binding instead of as a literal.`,\n })(literal),\n ),\n );\n\nconst ownedLiteralProblems =\n (context: ValueContext) =>\n (sourceFile: SourceFile, excluded: readonly Node[]): readonly Problem[] =>\n Arr.getSomes(\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isStringLiteral(node) || isNumericLiteral(node)),\n Arr.filter((node) => isValuePosition(node)),\n Arr.filter(\n (node) =>\n !pipe(\n excluded,\n Arr.some((outer) => contains(outer)(node)),\n ),\n ),\n Arr.map((node) => ownedLiteralProblem(context)(node)),\n ),\n );\n\nexport { ownedLiteralProblems, siteVerdict };\nexport type { SiteVerdict, ValueContext };\n","import { Option, Array as Arr, pipe } from \"effect\";\n\nimport { isVariableDeclaration } from \"./compiler.ts\";\nimport type { Checker, Node, VariableDeclaration } from \"./compiler.ts\";\nimport { flowsIn } from \"./flows.ts\";\nimport { ownerKeyOf } from \"./owners.ts\";\nimport type { Owner } from \"./owners.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { Project } from \"./project.ts\";\nimport { shapeProblemsIn } from \"./shapes.ts\";\nimport { sitesUnder } from \"./sites.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { contains, descendantsOf } from \"./syntax.ts\";\nimport { ownedLiteralProblems, siteVerdict } from \"./value-checks.ts\";\n\ninterface ProjectAnalysis {\n readonly problems: readonly Problem[];\n readonly unowned: readonly ValueSite[];\n}\n\nconst isVisibleTo =\n (project: Project) =>\n (owner: Owner): boolean =>\n pipe(\n project.sourceFiles,\n Arr.some((sourceFile) => sourceFile.fileName === owner.file),\n ) ||\n Option.exists(\n owner.packageName,\n (name) =>\n Option.contains(project.packageName, name) || project.workspaceDependencies.includes(name),\n );\n\nconst ownerDeclarationsIn = (\n project: Project,\n owners: readonly Owner[],\n): readonly VariableDeclaration[] => {\n const keys = new Set(\n pipe(\n owners,\n Arr.map((owner) => owner.key),\n ),\n );\n return pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) =>\n pipe(\n descendantsOf(sourceFile),\n Arr.filter((node) => isVariableDeclaration(node)),\n Arr.filter((declaration) => Option.exists(ownerKeyOf(declaration), (key) => keys.has(key))),\n ),\n ),\n );\n};\n\nconst isInside =\n (outers: readonly Node[]) =>\n (node: Node): boolean =>\n pipe(\n outers,\n Arr.some((outer) => contains(outer)(node)),\n );\n\nconst sitesOutside =\n (checker: Checker) =>\n (project: Project, outers: readonly Node[]): readonly ValueSite[] =>\n pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => sitesUnder(checker)(sourceFile)),\n Arr.filter((site) => !isInside(outers)(site.node)),\n );\n\nconst nodesOf = (sites: readonly ValueSite[]): readonly Node[] =>\n pipe(\n sites,\n Arr.map((site) => site.node),\n );\n\nconst analyzeProject =\n (owners: readonly Owner[]) =>\n (project: Project): ProjectAnalysis => {\n const { checker } = project;\n const ownerDeclarations = ownerDeclarationsIn(project, owners);\n const sites = sitesOutside(checker)(project, ownerDeclarations);\n const flowContext = { checker, program: project.program, sites };\n const context = {\n checker,\n owners: pipe(\n owners,\n Arr.filter((owner) => isVisibleTo(project)(owner)),\n ),\n vocabularies: project.library.vocabularies,\n flows: pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => flowsIn(flowContext)(sourceFile)),\n ),\n };\n const verdicts = pipe(\n sites,\n Arr.map((site) => siteVerdict(context)(site)),\n );\n const excluded = [...ownerDeclarations, ...nodesOf(sites)];\n const shapeContext = { checker, program: project.program, shapes: project.library.shapes };\n return {\n problems: [\n ...pipe(\n verdicts,\n Arr.flatMap((found) => found.problems),\n ),\n ...pipe(\n project.sourceFiles,\n Arr.flatMap((sourceFile) => [\n ...ownedLiteralProblems(context)(sourceFile, excluded),\n ...shapeProblemsIn(shapeContext)(sourceFile),\n ]),\n ),\n ],\n unowned: pipe(\n verdicts,\n Arr.flatMap((found) => found.unowned),\n ),\n };\n };\n\nexport { analyzeProject };\nexport type { ProjectAnalysis };\n","import { Array as Arr, Order, Record as Rec, pipe } from \"effect\";\n\nimport { OWNER_TAG } from \"./owners.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport type { ValueSite } from \"./sites.ts\";\nimport { columnOf, lineOf } from \"./syntax.ts\";\nimport { formatValues, valueKey } from \"./values.ts\";\nimport type { Value } from \"./values.ts\";\n\ninterface PackageScope {\n readonly name: string;\n readonly dependencies: readonly string[];\n}\n\ninterface UnownedSite {\n readonly scope: PackageScope;\n readonly file: string;\n readonly start: number;\n readonly line: number;\n readonly column: number;\n readonly values: readonly Value[];\n}\n\nconst DUPLICATE_THRESHOLD = 1;\n\nconst unownedSiteOf =\n (scope: PackageScope) =>\n (site: ValueSite): UnownedSite => ({\n scope,\n file: site.node.getSourceFile().fileName,\n start: site.node.getStart(),\n line: lineOf(site.node),\n column: columnOf(site.node),\n values: site.values,\n });\n\nconst canDerive = (left: UnownedSite, right: UnownedSite): boolean =>\n left.scope.name === right.scope.name ||\n left.scope.dependencies.includes(right.scope.name) ||\n right.scope.dependencies.includes(left.scope.name);\n\nconst siteKey = (site: UnownedSite): string => `${site.file}#${String(site.start)}`;\n\nconst valueSetKey = (site: UnownedSite): string => {\n const keys = pipe(\n site.values,\n Arr.map((value) => valueKey(value)),\n );\n return pipe(Arr.sort(keys, Order.String), Arr.join(\"\\0\"));\n};\n\nconst duplicateProblems =\n (relative: (file: string) => string) =>\n (sites: readonly UnownedSite[]): readonly Problem[] => {\n const unique = Arr.dedupeWith(sites, (left, right) => siteKey(left) === siteKey(right));\n const groups = Rec.values(Arr.groupBy(unique, (site) => valueSetKey(site)));\n return pipe(\n groups,\n Arr.filter((group) => group.length > DUPLICATE_THRESHOLD),\n Arr.flatMap((group) =>\n pipe(\n group,\n Arr.flatMap((site): readonly Problem[] => {\n const related = pipe(\n group,\n Arr.filter((other) => other !== site && canDerive(site, other)),\n );\n if (!Arr.isReadonlyArrayNonEmpty(related)) {\n return [];\n }\n const others = pipe(\n related,\n Arr.map((other) => `${relative(other.file)}:${String(other.line)}`),\n Arr.join(\", \"),\n );\n return [\n {\n file: site.file,\n line: site.line,\n column: site.column,\n rule: \"duplicate-value-set\",\n message: `The values ${formatValues(site.values)} are also declared at ${others}. Register one owner with /** @${OWNER_TAG} <concept> */ and derive the others from it.`,\n },\n ];\n }),\n ),\n ),\n );\n };\n\nexport { duplicateProblems, unownedSiteOf };\nexport type { PackageScope, UnownedSite };\n","import { Array as Arr, Effect, Number as Num, Option, String as Str, pipe } from \"effect\";\n\nimport type { API } from \"./compiler.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst RSS_LINE = /^VmRSS:\\s+(?<kib>\\d+) kB$/mu;\nconst BYTES_PER_KIB = 1024;\nconst UNKNOWN_RSS = 0;\n\nconst kibibytesIn = (status: string): Option.Option<string> =>\n Option.fromNullishOr(RSS_LINE.exec(status)).pipe(\n Option.flatMap((match) => Option.fromUndefinedOr(match.groups)),\n Option.flatMap((groups) => Option.fromUndefinedOr(groups[\"kib\"])),\n );\n\nconst residentBytesOf = (pid: string): Effect.Effect<number, never, RepositoryFiles> =>\n Effect.gen(function* residentBytes() {\n const files = yield* RepositoryFiles;\n const status = yield* files.readFile(`/proc/${pid}/status`);\n return pipe(\n status,\n Option.flatMap(kibibytesIn),\n Option.flatMap(Num.parse),\n Option.map((kib) => kib * BYTES_PER_KIB),\n Option.getOrElse(() => UNKNOWN_RSS),\n );\n });\n\nconst childPids = Effect.gen(function* childPids() {\n const files = yield* RepositoryFiles;\n const pid = String(process.pid);\n const children = yield* files.readFile(`/proc/${pid}/task/${pid}/children`);\n return pipe(\n children,\n Option.map((text) => pipe(Str.trim(text), Str.split(\" \"), Arr.filter(Str.isNonEmpty))),\n Option.getOrElse((): readonly string[] => []),\n );\n});\n\nconst annotateMemory = Effect.gen(function* annotateMemory() {\n const own = yield* residentBytesOf(String(process.pid));\n const pids = yield* childPids;\n const children = yield* pipe(\n pids,\n Effect.forEach((pid) => residentBytesOf(pid)),\n );\n const { heapUsed } = process.memoryUsage();\n yield* Effect.annotateCurrentSpan({\n \"process.memory.rss\": own,\n \"process.memory.heap_used\": heapUsed,\n \"msch.compiler.memory.rss\": Num.sumAll(children),\n });\n});\n\nconst annotateResources = (api: API): Effect.Effect<void, never, RepositoryFiles> =>\n Effect.gen(function* annotateCompiler() {\n yield* annotateMemory;\n const { totals } = api.getTimingInfo();\n yield* Effect.annotateCurrentSpan({\n \"msch.compiler.requests\": totals.requestCount,\n \"msch.compiler.round_trip_ms\": totals.roundTripMs,\n \"msch.compiler.server_ms\": totals.serverTimeMs,\n });\n });\n\nexport { annotateResources };\n","import { Array as Arr, Effect, Function as Fn, Option, Order, String as Str, pipe } from \"effect\";\n\nimport { API, getLeadingCommentRanges } from \"./compiler.ts\";\nimport type { Checker, ParsedCommandLine, Program, SourceFile } from \"./compiler.ts\";\nimport {\n MANIFEST_FILE,\n NODE_MODULES,\n dependencyEntries,\n readManifest,\n workspaceDependencies,\n} from \"./dependencies.ts\";\nimport { libraryCache, libraryIndex } from \"./library.ts\";\nimport type { LibraryCache, LibraryIndex } from \"./library.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { annotateResources } from \"./telemetry.ts\";\n\ninterface Project {\n readonly packageName: Option.Option<string>;\n readonly workspaceDependencies: readonly string[];\n readonly program: Program;\n readonly checker: Checker;\n readonly sourceFiles: readonly SourceFile[];\n readonly library: LibraryIndex;\n}\n\ninterface PackageInfo {\n readonly directory: string;\n readonly name: Option.Option<string>;\n readonly workspaceDependencies: readonly string[];\n}\n\nconst CONFIG_FILE = \"tsconfig.json\";\nconst HIDDEN_PREFIX = \".\";\nconst SKIPPED_DIRECTORIES: ReadonlySet<string> = new Set([NODE_MODULES, \"dist\", \"coverage\"]);\n\nconst listConfigFiles = (\n directory: string,\n): Effect.Effect<readonly string[], never, RepositoryFiles> =>\n Effect.gen(function* configFilesUnder() {\n const files = yield* RepositoryFiles;\n const names = yield* files.readDirectory(directory);\n const visible = pipe(\n names,\n Arr.filter((name) => !Str.startsWith(HIDDEN_PREFIX)(name) && !SKIPPED_DIRECTORIES.has(name)),\n Arr.map((name) => files.join(directory, name)),\n );\n const nested = yield* Fn.pipe(\n visible,\n Effect.forEach((entryPath) =>\n files.isDirectory(entryPath).pipe(\n Effect.flatMap(\n Option.match({\n onNone: (): Effect.Effect<readonly string[], never, RepositoryFiles> =>\n Effect.succeed([]),\n onSome: (\n directoryEntry,\n ): Effect.Effect<readonly string[], never, RepositoryFiles> => {\n if (directoryEntry) {\n return listConfigFiles(entryPath);\n }\n return Effect.succeed(\n Arr.filter([entryPath], () => files.basename(entryPath) === CONFIG_FILE),\n );\n },\n }),\n ),\n ),\n ),\n );\n return Arr.sort(nested.flat(), Order.String);\n });\n\nconst parseConfig =\n (api: API) =>\n (configPath: string): Option.Option<ParsedCommandLine> =>\n Option.some(api.parseConfigFile(configPath)).pipe(\n Option.filter((parsed) => Arr.isReadonlyArrayNonEmpty(parsed.fileNames)),\n );\n\nconst nearestPackageDirectory = (\n directory: string,\n root: string,\n): Effect.Effect<string, never, RepositoryFiles> =>\n Effect.gen(function* nearestPackage() {\n const files = yield* RepositoryFiles;\n const hasManifest = yield* files.exists(files.join(directory, MANIFEST_FILE));\n const parent = files.dirname(directory);\n if (hasManifest || directory === root || parent === directory) {\n return directory;\n }\n return yield* nearestPackageDirectory(parent, root);\n });\n\nconst packageInfoOf = Effect.fn(\"packageInfoOf\")(function* packageInfoOf(\n configPath: string,\n root: string,\n) {\n const files = yield* RepositoryFiles;\n const directory = yield* nearestPackageDirectory(files.dirname(configPath), root);\n const manifest = yield* readManifest(directory);\n return {\n directory,\n name: manifest.pipe(Option.flatMap((found) => Option.fromUndefinedOr(found.name))),\n workspaceDependencies: manifest.pipe(\n Option.map(workspaceDependencies),\n Option.getOrElse(() => []),\n ),\n } satisfies PackageInfo;\n});\n\nconst NO_CHECK_PRAGMA = /^\\/\\/\\s*@ts-nocheck/u;\nconst FILE_START = 0;\n\nconst skipsTypeChecking = (sourceFile: SourceFile): boolean =>\n pipe(\n getLeadingCommentRanges(sourceFile.text, FILE_START) ?? [],\n Arr.some((range) => NO_CHECK_PRAGMA.test(Str.slice(range.pos, range.end)(sourceFile.text))),\n );\n\nconst buildProject = Effect.fn(\"buildProject\")(function* buildProject(\n { compiler: { api, libraries }, generated }: Workspace,\n parsed: ParsedCommandLine,\n info: PackageInfo,\n) {\n const entries = yield* dependencyEntries(info.directory);\n const program = yield* Effect.sync(() =>\n api.createProgram(\n [\n ...parsed.fileNames,\n ...pipe(\n entries,\n Arr.map((entry) => entry.declarationsPath),\n ),\n ],\n { ...parsed.options, noEmit: true },\n ),\n ).pipe(Effect.withSpan(\"createProgram\"));\n const { checker } = program.getProject();\n const library = yield* libraryIndex(libraries)(checker)(entries);\n const projectFiles: ReadonlySet<string> = new Set(\n pipe(\n parsed.fileNames,\n Arr.filter((fileName) => !generated.includes(fileName)),\n ),\n );\n return {\n packageName: info.name,\n workspaceDependencies: info.workspaceDependencies,\n program,\n checker,\n sourceFiles: pipe(\n program.getSourceFileNames(),\n Arr.filter((fileName) => projectFiles.has(fileName)),\n Arr.flatMap((fileName) =>\n Option.toArray(Option.fromUndefinedOr(program.getSourceFile(fileName))),\n ),\n Arr.filter((sourceFile) => !sourceFile.isDeclarationFile && !skipsTypeChecking(sourceFile)),\n ),\n library,\n } satisfies Project;\n});\n\ninterface Compiler {\n readonly api: API;\n readonly libraries: LibraryCache;\n}\n\ninterface Workspace {\n readonly compiler: Compiler;\n readonly root: string;\n readonly generated: readonly string[];\n}\n\nconst typeScriptCompiler = Effect.acquireRelease(\n Effect.sync((): Compiler => ({\n api: new API({ collectTiming: true }),\n libraries: libraryCache(),\n })),\n ({ api }) =>\n Effect.sync(() => {\n api.close();\n }),\n);\n\nconst loadProject = Effect.fn(\"loadProject\")(function* loadProject(\n workspace: Workspace,\n configPath: string,\n) {\n const { compiler, root } = workspace;\n const parsed = parseConfig(compiler.api)(configPath);\n if (Option.isNone(parsed)) {\n return Option.none<Project>();\n }\n const info = yield* packageInfoOf(configPath, root);\n const project = yield* buildProject(workspace, parsed.value, info);\n yield* Effect.annotateCurrentSpan({\n \"msch.project.config\": configPath,\n \"msch.project.program_files\": project.program.getSourceFileNames().length,\n \"msch.project.source_files\": project.sourceFiles.length,\n });\n yield* annotateResources(compiler.api);\n return Option.some(project);\n});\n\nconst releaseProject = (project: Project): Effect.Effect<void> =>\n Effect.sync(() => {\n project.program.dispose();\n });\n\nconst withProject =\n (workspace: Workspace) =>\n (configPath: string) =>\n <Value, Failure, Requirements>(\n work: (project: Project) => Effect.Effect<Value, Failure, Requirements>,\n ): Effect.Effect<Option.Option<Value>, Failure, Requirements | RepositoryFiles> =>\n Effect.acquireUseRelease(\n loadProject(workspace, configPath),\n (loaded) =>\n Option.match(loaded, {\n onNone: () => Effect.succeedNone,\n onSome: (project) => work(project).pipe(Effect.asSome),\n }),\n (loaded) => Option.match(loaded, { onNone: () => Effect.void, onSome: releaseProject }),\n );\n\nconst mentions =\n (needle: string) =>\n ({ api }: Compiler) =>\n (configPath: string): Effect.Effect<boolean, never, RepositoryFiles> =>\n Effect.gen(function* mentionsNeedle() {\n const files = yield* RepositoryFiles;\n const fileNames = Option.match(parseConfig(api)(configPath), {\n onNone: (): readonly string[] => [],\n onSome: (parsed): readonly string[] => parsed.fileNames,\n });\n const texts = yield* pipe(\n fileNames,\n Effect.forEach((fileName) => files.readFile(fileName)),\n );\n const includesNeedle = Str.includes(needle);\n return pipe(\n texts,\n Arr.some((text) => Option.exists(text, includesNeedle)),\n );\n });\n\nexport { listConfigFiles, mentions, typeScriptCompiler, withProject };\nexport type { Compiler, Project, Workspace };\n","import { Effect, Option, Array as Arr, pipe } from \"effect\";\n\nimport { analyzeProject } from \"./analysis.ts\";\nimport { duplicateProblems, unownedSiteOf } from \"./duplicates.ts\";\nimport type { PackageScope, UnownedSite } from \"./duplicates.ts\";\nimport { OWNER_TAG, combineOwnerScans, ownersIn } from \"./owners.ts\";\nimport type { Owner, OwnerScan } from \"./owners.ts\";\nimport { sortProblems } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { listConfigFiles, mentions, typeScriptCompiler, withProject } from \"./project.ts\";\nimport type { Project, Workspace } from \"./project.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst scanOwners = Effect.fn(\"scanOwners\")(function* scanOwners(\n workspace: Workspace,\n configPaths: readonly string[],\n) {\n const ownerConfigs = yield* pipe(\n configPaths,\n Effect.filter(mentions(`@${OWNER_TAG}`)(workspace.compiler)),\n );\n const scans = yield* pipe(\n ownerConfigs,\n Effect.forEach((configPath) =>\n withProject(workspace)(configPath)((project) => Effect.sync(() => ownersIn(project))),\n ),\n );\n return combineOwnerScans(Arr.getSomes(scans));\n});\n\nconst scopeOf = (project: Project, configPath: string): PackageScope => ({\n name: Option.getOrElse(project.packageName, () => configPath),\n dependencies: project.workspaceDependencies,\n});\n\ninterface Analysis {\n readonly problems: readonly Problem[];\n readonly unowned: readonly UnownedSite[];\n}\n\nconst analyzeProjects =\n (workspace: Workspace, owners: readonly Owner[]) =>\n (configPaths: readonly string[]): Effect.Effect<readonly Analysis[], never, RepositoryFiles> =>\n pipe(\n configPaths,\n Effect.forEach((configPath) =>\n withProject(workspace)(configPath)((project) =>\n Effect.sync(() => {\n const analysis = analyzeProject(owners)(project);\n const scope = scopeOf(project, configPath);\n return {\n problems: analysis.problems,\n unowned: pipe(analysis.unowned, Arr.map(unownedSiteOf(scope))),\n };\n }).pipe(Effect.withSpan(\"analyzeProject\")),\n ),\n ),\n Effect.map(Arr.getSomes),\n );\n\nconst checkRepository = Effect.fn(\"checkRepository\")(function* checkRepository(root: string) {\n const files = yield* RepositoryFiles;\n const compiler = yield* typeScriptCompiler;\n const generated = yield* files.generatedFiles(root);\n const workspace: Workspace = { compiler, root, generated };\n const configPaths = yield* listConfigFiles(root);\n const ownerScan: OwnerScan = yield* scanOwners(workspace, configPaths);\n const analyses = yield* analyzeProjects(workspace, ownerScan.owners)(configPaths);\n const relative = (file: string): string => files.relative(root, file);\n const unowned = pipe(\n analyses,\n Arr.flatMap((analysis) => analysis.unowned),\n );\n return sortProblems([\n ...ownerScan.problems,\n ...pipe(\n analyses,\n Arr.flatMap((analysis) => analysis.problems),\n ),\n ...duplicateProblems(relative)(unowned),\n ]);\n}, Effect.scoped);\n\nexport { checkRepository };\n","import { Array as Arr, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem } from \"./problem.ts\";\n\nconst START = 0;\nconst FIRST_COLUMN = 1;\n\nconst positionOf =\n (source: string) =>\n (index: number): Pick<Problem, \"line\" | \"column\"> => {\n const before = pipe(source, Str.slice(START, index), Str.split(\"\\n\"));\n return {\n line: before.length,\n column: pipe(\n Arr.last(before),\n Option.match({ onNone: () => FIRST_COLUMN, onSome: (last) => last.length + FIRST_COLUMN }),\n ),\n };\n };\n\nexport { positionOf };\n","import { Array as Arr, Effect, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { positionOf } from \"./text-position.ts\";\n\nconst HIDDEN =\n /[\\u00AD\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u2069\\uFEFF]|[\\u{E0000}-\\u{E007F}]/gu;\n\nconst NUL = \"\\0\";\nconst START = 0;\nconst HEX = 16;\nconst CODE_POINT_WIDTH = 4;\nconst READ_CONCURRENCY = 64;\nconst RULE: RuleName = \"hidden-unicode\";\n\nconst hexOf = (character: string): string =>\n pipe(\n Str.codePointAt(START)(character),\n Option.getOrElse(() => START),\n (code) => code.toString(HEX),\n Str.toUpperCase,\n Str.padStart(CODE_POINT_WIDTH, \"0\"),\n );\n\nconst problemOf =\n (file: string, source: string) =>\n (found: RegExpMatchArray): Problem => {\n const hex = hexOf(found[START]);\n return {\n file,\n ...positionOf(source)(found.index ?? START),\n rule: RULE,\n message: `U+${hex} is invisible in editors and reviews and can change what the text means. Remove it, or write it as the escape \\\\u${hex}.`,\n };\n };\n\nconst problemsIn = (file: string, source: string): readonly Problem[] => {\n if (Str.includes(NUL)(source)) {\n return [];\n }\n return pipe(Arr.fromIterable(Str.matchAll(HIDDEN)(source)), Arr.map(problemOf(file, source)));\n};\n\n/** @internal */\nconst checkHiddenUnicode = Effect.fn(\"checkHiddenUnicode\")(function* checkHiddenUnicode(\n root: string,\n) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const found = yield* Effect.forEach(\n names,\n (name) => {\n const file = files.join(root, name);\n return files.readFile(file).pipe(\n Effect.map(\n Option.match({\n onNone: (): readonly Problem[] => [],\n onSome: (source) => problemsIn(file, source),\n }),\n ),\n );\n },\n { concurrency: READ_CONCURRENCY },\n );\n return Arr.flatten(found);\n});\n\nexport { checkHiddenUnicode };\n","import { Array as Arr, Effect, Option, Schema, String as Str, pipe } from \"effect\";\nimport { resolveConfigFromFile } from \"vite-plus\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\n\nconst RULE: RuleName = \"nested-docs\";\nconst SEPARATOR = \"/\";\nconst CONFIG_FILE = \"vite.config.ts\";\nconst FIRST = 1;\nconst READ_CONCURRENCY = 64;\nconst AGENT_DOCS = /^(?:AGENTS|CLAUDE)(?:\\.[^/]+)?\\.md$/iu;\nconst README = /^README(?:\\.[^/]+)?$/iu;\n\nconst Published = Schema.Struct({ publish: Schema.Literal(true) });\nconst WorkspaceConfig = Schema.Struct({ msch: Published });\n\nconst taggedError = Schema.TaggedError;\n\nclass WorkspaceConfigUnreadable extends taggedError<\n WorkspaceConfigUnreadable,\n { readonly brand: unique symbol }\n>()(\"WorkspaceConfigUnreadable\", { file: Schema.String }) {}\n\nconst isNested = (name: string): boolean => Str.includes(SEPARATOR)(name);\n\nconst isPublished = Effect.fn(\"isPublished\")(function* isPublished(\n root: string,\n directory: string,\n) {\n const files = yield* RepositoryFiles;\n const file = files.join(root, directory, CONFIG_FILE);\n if (!(yield* files.exists(file))) {\n return false;\n }\n const config = yield* Effect.tryPromise({\n try: () => resolveConfigFromFile(file),\n catch: () => WorkspaceConfigUnreadable.make({ file }),\n }).pipe(Effect.option);\n return pipe(config, Option.flatMap(Schema.decodeUnknownOption(WorkspaceConfig)), Option.isSome);\n});\n\nconst problemFor = (file: string, message: string): Problem => ({\n file,\n line: FIRST,\n column: FIRST,\n rule: RULE,\n message,\n});\n\nconst AGENT_DOCS_MESSAGE =\n \"belongs only at the repository root. Move what agents need into the root AGENTS.md and delete this file.\";\nconst README_MESSAGE =\n \"is allowed below the root only in a workspace published to npm, marked by msch: { publish: true } in its vite.config.ts. Set it there if the workspace is published, or move the content into the root README.md and delete this file.\";\n\nconst problemIn = Effect.fn(\"problemIn\")(function* problemIn(root: string, name: string) {\n const files = yield* RepositoryFiles;\n const base = files.basename(name);\n const file = files.join(root, name);\n if (AGENT_DOCS.test(base)) {\n return Option.some(problemFor(file, `${base} ${AGENT_DOCS_MESSAGE}`));\n }\n if (!README.test(base)) {\n return Option.none<Problem>();\n }\n if (yield* isPublished(root, files.dirname(name))) {\n return Option.none<Problem>();\n }\n return Option.some(problemFor(file, `${base} ${README_MESSAGE}`));\n});\n\n/** @internal */\nconst checkNestedDocs = Effect.fn(\"checkNestedDocs\")(function* checkNestedDocs(root: string) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const nested = pipe(names, Arr.filter(isNested));\n const found = yield* Effect.forEach(nested, (name) => problemIn(root, name), {\n concurrency: READ_CONCURRENCY,\n });\n return Arr.getSomes(found);\n});\n\nexport { checkNestedDocs };\n","import { Array as Arr, Option, pipe } from \"effect\";\n\nimport type { OverrideKey, OverrideReport } from \"./override-resolution.ts\";\nimport type { Problem } from \"./problem.ts\";\n\nconst describeVersions = (versions: readonly string[]): string =>\n Option.getOrElse(\n Option.liftPredicate(Arr.join(versions, \",\"), (joined) => joined !== \"\"),\n () => \"-\",\n );\n\nconst describeChanges = (report: OverrideReport): string => {\n const versions = pipe(\n report.changes,\n Arr.map(\n (change) =>\n `${change.name} ${describeVersions(change.before)} -> ${describeVersions(change.after)}`,\n ),\n );\n const contexts = Arr.filter([\"the peer contexts\"], () => report.peerContextsChanged);\n return Arr.join([...versions, ...contexts], \"; \");\n};\n\ninterface LocatedOverride extends OverrideKey {\n readonly file: string;\n}\n\nconst overrideProblem =\n (located: LocatedOverride) =>\n (report: OverrideReport): Option.Option<Problem> => {\n const at = { file: located.file, line: located.line, column: located.column };\n if (report.verdict === \"unused\") {\n return Option.some({\n ...at,\n rule: \"unused-override\",\n message: `Every package resolves the same way without the override ${report.key}. Remove it.`,\n });\n }\n if (report.verdict === \"verify\") {\n return Option.some({\n ...at,\n rule: \"removable-override\",\n message: `Removing the override ${report.key} changes ${describeChanges(report)} without new peer issues or advisories. Remove it and run verify.`,\n });\n }\n return Option.none();\n };\n\nexport { overrideProblem };\nexport type { LocatedOverride };\n","import { Array as Arr, Option, Order, Record as Rec, Schema, String as Str, pipe } from \"effect\";\nimport { LineCounter, isMap, isScalar, parseAllDocuments, parseDocument } from \"yaml\";\n\nconst VerdictSchema = Schema.Literals([\"unused\", \"keep\", \"verify\"]);\n\nconst PackageChangeSchema = Schema.Struct({\n name: Schema.String,\n before: Schema.Array(Schema.String),\n after: Schema.Array(Schema.String),\n});\n\nconst OverrideReportSchema = Schema.Struct({\n key: Schema.String,\n verdict: VerdictSchema,\n changes: Schema.Array(PackageChangeSchema),\n peerContextsChanged: Schema.Boolean,\n peerIssues: Schema.Array(Schema.String),\n advisories: Schema.Array(Schema.String),\n});\n\ntype OverrideReport = typeof OverrideReportSchema.Type;\ntype PackageChange = typeof PackageChangeSchema.Type;\n\nconst PeerParentSchema = Schema.Struct({ name: Schema.String, version: Schema.String });\n\nconst PeerIssueSchema = Schema.Struct({\n parents: Schema.Array(PeerParentSchema),\n wantedRange: Schema.String,\n foundVersion: Schema.optionalKey(Schema.String),\n});\n\ntype PeerIssue = typeof PeerIssueSchema.Type;\n\nconst ProjectPeerIssuesSchema = Schema.Struct({\n bad: Schema.Record(Schema.String, Schema.Array(PeerIssueSchema)),\n missing: Schema.Record(Schema.String, Schema.Array(PeerIssueSchema)),\n conflicts: Schema.Array(Schema.String),\n});\n\ntype ProjectPeerIssues = typeof ProjectPeerIssuesSchema.Type;\n\nconst PeerIssuesLog = Schema.fromJsonString(\n Schema.Struct({\n name: Schema.Literal(\"pnpm:peer-dependency-issues\"),\n issuesByProjects: Schema.Record(Schema.String, ProjectPeerIssuesSchema),\n }),\n);\n\ninterface Findings {\n readonly peerIssues: readonly string[];\n readonly advisories: readonly string[];\n}\n\ninterface Resolution extends Findings {\n readonly versions: Readonly<Record<string, readonly string[]>>;\n readonly snapshots: readonly string[];\n}\n\nconst AdvisorySchema = Schema.Struct({\n module_name: Schema.String,\n github_advisory_id: Schema.String,\n});\n\nconst AuditReport = Schema.fromJsonString(\n Schema.Struct({ advisories: Schema.Record(Schema.String, AdvisorySchema) }),\n);\n\nconst SCOPE_PREFIX = \"@\";\nconst NAME_START = 0;\nconst SEPARATOR_LENGTH = 1;\nconst PEER_CONTEXT_START = \"(\";\n\nconst sorted = (values: readonly string[]): readonly string[] =>\n Arr.sort(Arr.dedupe(values), Order.String);\n\nconst describeIssue =\n (project: string, kind: string) =>\n ([peer, issues]: readonly [string, readonly PeerIssue[]]): readonly string[] =>\n pipe(\n issues,\n Arr.map((issue) => {\n const dependent = Option.match(Arr.last(issue.parents), {\n onNone: () => project,\n onSome: (parent) => `${parent.name}@${parent.version}`,\n });\n const found = Option.getOrElse(Option.fromUndefinedOr(issue.foundVersion), () => \"none\");\n return `${project}: ${kind} peer ${peer}@${issue.wantedRange} of ${dependent}, found ${found}`;\n }),\n );\n\nconst issuesOfProject = ([project, issues]: readonly [\n string,\n ProjectPeerIssues,\n]): readonly string[] => [\n ...pipe(Rec.toEntries(issues.bad), Arr.flatMap(describeIssue(project, \"unmet\"))),\n ...pipe(Rec.toEntries(issues.missing), Arr.flatMap(describeIssue(project, \"missing\"))),\n ...pipe(\n issues.conflicts,\n Arr.map((peer) => `${project}: conflicting peer ${peer}`),\n ),\n];\n\nconst peerIssuesIn = (output: string): readonly string[] =>\n sorted(\n pipe(\n Str.split(output, \"\\n\"),\n Arr.map((line) => Schema.decodeOption(PeerIssuesLog)(line)),\n Arr.getSomes,\n Arr.flatMap((log) => pipe(Rec.toEntries(log.issuesByProjects), Arr.flatMap(issuesOfProject))),\n ),\n );\n\nconst advisoriesIn = (output: string): readonly string[] =>\n Option.match(Schema.decodeOption(AuditReport)(output), {\n onNone: () => [],\n onSome: (report) =>\n sorted(\n pipe(\n Rec.values(report.advisories),\n Arr.map((advisory) => `${advisory.module_name} ${advisory.github_advisory_id}`),\n ),\n ),\n });\n\nconst separatorOf = (key: string): Option.Option<number> => {\n if (!Str.startsWith(SCOPE_PREFIX)(key)) {\n return Str.indexOf(SCOPE_PREFIX)(key);\n }\n return pipe(\n Str.slice(SEPARATOR_LENGTH)(key),\n Str.indexOf(SCOPE_PREFIX),\n Option.map((index) => index + SEPARATOR_LENGTH),\n );\n};\n\nconst withoutPeerContext = (version: string): string =>\n Option.match(Str.indexOf(PEER_CONTEXT_START)(version), {\n onNone: () => version,\n onSome: (start) => Str.slice(NAME_START, start)(version),\n });\n\nconst packageOf = (key: string): Option.Option<readonly [string, string]> =>\n Option.map(separatorOf(key), (separator) => [\n Str.slice(NAME_START, separator)(key),\n withoutPeerContext(Str.slice(separator + SEPARATOR_LENGTH)(key)),\n ]);\n\nconst keysOf = (node: unknown): readonly string[] => {\n if (!isMap(node)) {\n return [];\n }\n return pipe(\n node.items,\n Arr.flatMap((pair): readonly string[] => {\n if (isScalar(pair.key)) {\n return [String(pair.key.value)];\n }\n return [];\n }),\n );\n};\n\nconst lockfileKeysOf = (lockfile: string, section: string): readonly string[] =>\n pipe(\n parseAllDocuments(lockfile),\n Arr.flatMap((document) => keysOf(document.get(section))),\n );\n\nconst resolutionOf =\n (findings: Findings) =>\n (lockfile: string): Resolution => {\n const snapshots = lockfileKeysOf(lockfile, \"snapshots\");\n const packages = Arr.getSomes(\n pipe(\n [...lockfileKeysOf(lockfile, \"packages\"), ...snapshots],\n Arr.map((key) => packageOf(key)),\n ),\n );\n const versions = Rec.map(\n Arr.groupBy(packages, ([name]) => name),\n (entries) =>\n sorted(\n pipe(\n entries,\n Arr.map(([, version]) => version),\n ),\n ),\n );\n return { ...findings, versions, snapshots: sorted(snapshots) };\n };\n\nconst changesBetween = (baseline: Resolution, candidate: Resolution): readonly PackageChange[] =>\n pipe(\n sorted([...Rec.keys(baseline.versions), ...Rec.keys(candidate.versions)]),\n Arr.map((name) => ({\n name,\n before: baseline.versions[name] ?? [],\n after: candidate.versions[name] ?? [],\n })),\n Arr.filter((change) => Arr.join(change.before, \" \") !== Arr.join(change.after, \" \")),\n );\n\nconst growsThePackageSet = (change: PackageChange): boolean =>\n change.after.length > change.before.length;\n\nconst needsTheOverride = (\n found: Pick<OverrideReport, \"changes\" | \"peerIssues\" | \"advisories\">,\n): boolean =>\n pipe(\n found.changes,\n Arr.some((change) => growsThePackageSet(change)),\n ) ||\n Arr.isReadonlyArrayNonEmpty(found.peerIssues) ||\n Arr.isReadonlyArrayNonEmpty(found.advisories);\n\nconst judge =\n (baseline: Resolution) =>\n (key: string, candidate: Resolution): OverrideReport => {\n const changes = changesBetween(baseline, candidate);\n const peerIssues = Arr.difference(candidate.peerIssues, baseline.peerIssues);\n const advisories = Arr.difference(candidate.advisories, baseline.advisories);\n const peerContextsChanged =\n Arr.join(baseline.snapshots, \" \") !== Arr.join(candidate.snapshots, \" \");\n const found = { key, changes, peerContextsChanged, peerIssues, advisories };\n if (!Arr.isReadonlyArrayNonEmpty(changes) && !peerContextsChanged) {\n return { ...found, verdict: \"unused\" };\n }\n if (needsTheOverride(found)) {\n return { ...found, verdict: \"keep\" };\n }\n return { ...found, verdict: \"verify\" };\n };\n\nconst OVERRIDES = \"overrides\";\nconst BASELINE_PROBE = \"msch-baseline-probe\";\nconst REMOVED_DEPENDENCY = \"-\";\n\ninterface OverrideKey {\n readonly key: string;\n readonly line: number;\n readonly column: number;\n}\n\nconst overrideKeysOf = (manifest: string): readonly OverrideKey[] => {\n const lineCounter = new LineCounter();\n const overrides = parseDocument(manifest, { lineCounter }).get(OVERRIDES);\n if (!isMap(overrides)) {\n return [];\n }\n return pipe(\n overrides.items,\n Arr.flatMap((pair): readonly OverrideKey[] => {\n const { key } = pair;\n if (!isScalar(key)) {\n return [];\n }\n return pipe(\n Option.fromNullishOr(key.range),\n Option.map(([start]) => {\n const { line, col } = lineCounter.linePos(start);\n return { key: String(key.value), line, column: col };\n }),\n Option.toArray,\n );\n }),\n );\n};\n\nconst withoutOverride =\n (key: string) =>\n (manifest: string): string => {\n const document = parseDocument(manifest);\n document.deleteIn([OVERRIDES, key]);\n return document.toString();\n };\n\nconst withBaselineProbe = (manifest: string): string => {\n const document = parseDocument(manifest);\n document.setIn([OVERRIDES, BASELINE_PROBE], REMOVED_DEPENDENCY);\n return document.toString();\n};\n\nexport {\n BASELINE_PROBE,\n advisoriesIn,\n judge,\n overrideKeysOf,\n peerIssuesIn,\n resolutionOf,\n withBaselineProbe,\n withoutOverride,\n};\nexport type { Findings, OverrideKey, OverrideReport, Resolution };\n","import {\n Array as Arr,\n Effect,\n FileSystem,\n Option,\n Path,\n Schema,\n Stream,\n String as Str,\n pipe,\n} from \"effect\";\nimport type { PlatformError } from \"effect\";\nimport { ChildProcess } from \"effect/process\";\nimport type { ChildProcessSpawner } from \"effect/process\";\n\nimport { overrideProblem } from \"./override-findings.ts\";\nimport {\n BASELINE_PROBE,\n advisoriesIn,\n judge,\n overrideKeysOf,\n peerIssuesIn,\n resolutionOf,\n withBaselineProbe,\n withoutOverride,\n} from \"./override-resolution.ts\";\nimport type { OverrideKey } from \"./override-resolution.ts\";\nimport type { Problem } from \"./problem.ts\";\n\nconst WORKSPACE_FILE = \"pnpm-workspace.yaml\";\nconst LOCKFILE = \"pnpm-lock.yaml\";\nconst RESOLUTION_FILES = [\"*package.json\", WORKSPACE_FILE, LOCKFILE, \".npmrc\", \"patches/*\"];\nconst RESOLUTION_CONCURRENCY = 4;\nconst SUCCEEDED = 0;\n\nconst taggedError = Schema.TaggedError;\n\nclass OverrideResolutionFailed extends taggedError<\n OverrideResolutionFailed,\n { readonly brand: unique symbol }\n>()(\"OverrideResolutionFailed\", { override: Schema.String, output: Schema.String }) {}\n\ntype CandidateFailure = OverrideResolutionFailed | PlatformError.PlatformError;\ntype CandidateServices =\n | FileSystem.FileSystem\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner;\n\ninterface Workspace {\n readonly root: string;\n readonly files: readonly string[];\n readonly manifest: string;\n}\n\nconst textOf = <Failure>(\n stream: Stream.Stream<Uint8Array, Failure>,\n): Effect.Effect<string, Failure> => stream.pipe(Stream.decodeText(), Stream.mkString);\n\nconst resolveIn = Effect.fn(\"resolveIn\")(function* resolveIn(directory: string, override: string) {\n const handle = yield* ChildProcess.make(\n \"vp\",\n [\"install\", \"--lockfile-only\", \"--ignore-scripts\", \"--\", \"--reporter=ndjson\"],\n { cwd: directory, env: { CI: \"true\" }, extendEnv: true, stdin: \"ignore\" },\n );\n const [output, status] = yield* Effect.all([textOf(handle.all), handle.exitCode], {\n concurrency: \"unbounded\",\n });\n if (Number(status) !== SUCCEEDED) {\n return yield* OverrideResolutionFailed.make({ override, output });\n }\n return output;\n});\n\nconst auditIn = Effect.fn(\"auditIn\")(function* auditIn(directory: string) {\n const handle = yield* ChildProcess.make(\"vp\", [\"pm\", \"audit\", \"--json\"], {\n cwd: directory,\n extendEnv: true,\n stdin: \"ignore\",\n });\n const [report] = yield* Effect.all([textOf(handle.stdout), handle.exitCode], {\n concurrency: \"unbounded\",\n });\n return advisoriesIn(report);\n}, Effect.scoped);\n\nconst trackedResolutionFiles = Effect.fn(\"trackedResolutionFiles\")(function* trackedFiles(\n root: string,\n) {\n const handle = yield* ChildProcess.make(\"git\", [\"ls-files\", \"-z\", \"--\", ...RESOLUTION_FILES], {\n cwd: root,\n });\n const listed = yield* textOf(handle.stdout);\n return pipe(Str.split(listed, \"\\0\"), Arr.filter(Str.isNonEmpty));\n}, Effect.scoped);\n\nconst copyFiles = Effect.fn(\"copyFiles\")(function* copyFiles(\n workspace: Workspace,\n directory: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const copyOne = (file: string): Effect.Effect<void, PlatformError.PlatformError> => {\n const target = path.join(directory, file);\n const copy = fs.copyFile(path.join(workspace.root, file), target);\n return fs.makeDirectory(path.dirname(target), { recursive: true }).pipe(Effect.andThen(copy));\n };\n yield* Effect.forEach(workspace.files, copyOne, { discard: true });\n});\n\nconst resolutionWith = Effect.fn(\"resolutionWith\")(function* resolutionWith(\n workspace: Workspace,\n override: string,\n manifest: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const directory = yield* fs.makeTempDirectoryScoped({ prefix: \"msch-overrides-\" });\n yield* copyFiles(workspace, directory);\n yield* fs.writeFileString(path.join(directory, WORKSPACE_FILE), manifest);\n const output = yield* resolveIn(directory, override);\n const lockfile = yield* fs.readFileString(path.join(directory, LOCKFILE));\n yield* Effect.annotateCurrentSpan({ \"msch.override\": override });\n const advisories = yield* auditIn(directory);\n return resolutionOf({ peerIssues: peerIssuesIn(output), advisories })(lockfile);\n}, Effect.scoped);\n\nconst problemsFor = Effect.fn(\"problemsFor\")(function* problemsFor(\n root: string,\n manifest: string,\n keys: readonly OverrideKey[],\n) {\n const path = yield* Path.Path;\n const files = yield* trackedResolutionFiles(root);\n const workspace: Workspace = { root, files, manifest };\n const baseline = yield* resolutionWith(workspace, BASELINE_PROBE, withBaselineProbe(manifest));\n const judgeAgainstBaseline = judge(baseline);\n const file = path.join(root, WORKSPACE_FILE);\n const problemOf = (\n located: OverrideKey,\n ): Effect.Effect<Option.Option<Problem>, CandidateFailure, CandidateServices> =>\n resolutionWith(workspace, located.key, withoutOverride(located.key)(manifest)).pipe(\n Effect.map((candidate) =>\n overrideProblem({ ...located, file })(judgeAgainstBaseline(located.key, candidate)),\n ),\n );\n const problems = yield* Effect.forEach(keys, problemOf, {\n concurrency: RESOLUTION_CONCURRENCY,\n });\n return Arr.getSomes(problems);\n});\n\n/** @internal */\nconst checkOverrides = Effect.fn(\"checkOverrides\")(function* checkOverrides(root: string) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const manifest = yield* fs.readFileString(path.join(root, WORKSPACE_FILE)).pipe(Effect.option);\n const keys = Option.match(manifest, { onNone: () => [], onSome: overrideKeysOf });\n if (Option.isNone(manifest) || !Arr.isReadonlyArrayNonEmpty(keys)) {\n return [];\n }\n return yield* problemsFor(root, manifest.value, keys);\n});\n\nexport { checkOverrides };\n","import { Array as Arr, Effect, Option, String as Str, pipe } from \"effect\";\n\nimport type { Problem, RuleName } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { positionOf } from \"./text-position.ts\";\n\nconst PYTHON_FILE =\n /(?:\\.(?:py|pyi|pyw|pyx|ipynb)|(?:^|\\/)(?:pyproject\\.toml|uv\\.lock|uv\\.toml|poetry\\.lock|Pipfile|Pipfile\\.lock|setup\\.cfg|tox\\.ini|pytest\\.ini|\\.python-version|requirements[^/]*\\.txt))$/u;\n\nconst SCANNED_FILE =\n /(?:\\.(?:[cm]?[jt]sx?|jsonc?|toml|ya?ml|sh|bash|zsh|fish|rs|cs|go|mk)|(?:^|\\/)(?:Dockerfile[^/]*|Makefile|justfile|\\.tool-versions|[^./][^./]*))$/u;\n\nconst LOCKFILE = /(?:^|\\/)(?:[^/]*\\.lock|[^/]*-lock\\.(?:json|ya?ml))$/u;\n\nconst TOOL_VERSIONS = /(?:^|\\/)(?:\\.?mise(?:\\.[^/]+)?\\.toml|\\.tool-versions)$/u;\n\nconst COMMAND_PATTERNS: readonly RegExp[] = [\n /(?<![\\w./@-])python[\\d.]*[ \\t]+(?:[-\"'$./]|\\S+\\.py\\b)/gu,\n /(?<![\\w./@-])pip3?[ \\t]+(?:install|uninstall|download|freeze|wheel|compile|sync)\\b/gu,\n /(?<![\\w./@-])pipx[ \\t]+(?:run|install|inject|upgrade)\\b/gu,\n /(?<![\\w./@-])uvx[ \\t]+[^\\s=:,;)|&]/gu,\n /(?<![\\w./@-])uv[ \\t]+(?:run|sync|lock|pip|tool|venv|add|remove|python|export|build|publish|init|tree|cache|self)\\b/gu,\n /(?<![\\w./@-])poetry[ \\t]+(?:run|install|add|lock|build|publish|shell|export)\\b/gu,\n /(?:\\bcommand[\"']?\\s*[:=]\\s*|(?:\\bspawn\\w*|\\bexec\\w*|\\bexeca|Command::new|ChildProcess\\.make|\\$)\\(\\s*)[\"'`](?:python[\\d.]*|pip3?|pipx|uvx?|poetry)[\"'`]/gu,\n /\\buses:\\s*[\"']?(?:actions\\/setup-python|astral-sh\\/setup-uv|astral-sh\\/ruff-action|pypa\\/[\\w.-]+|snok\\/install-poetry|abatilo\\/actions-poetry|conda-incubator\\/setup-miniconda|mamba-org\\/setup-micromamba|pdm-project\\/setup-pdm)\\b/gu,\n];\n\nconst TOOL_PATTERNS: readonly RegExp[] = [\n /^[ \\t]*[\"']?(?:python|uv|pipx|poetry|ruff|pdm|hatch|pipx:[^\"'\\s=]+)[\"']?[ \\t]*(?:=|[ \\t]+\\S)/gmu,\n];\n\nconst READ_CONCURRENCY = 64;\nconst FIRST_LINE = 1;\nconst FIRST_COLUMN = 1;\nconst WHOLE_MATCH = 0;\nconst FILE_RULE: RuleName = \"python-file\";\nconst COMMAND_RULE: RuleName = \"python-command\";\n\ninterface Listed {\n readonly name: string;\n readonly file: string;\n}\n\nconst fileProblem = ({ file }: Listed): Problem => ({\n file,\n line: FIRST_LINE,\n column: FIRST_COLUMN,\n rule: FILE_RULE,\n message: \"Python is not used in this repository. Replace this file with TypeScript or Rust.\",\n});\n\nconst patternsFor = (name: string): readonly RegExp[] => {\n if (TOOL_VERSIONS.test(name)) {\n return [...COMMAND_PATTERNS, ...TOOL_PATTERNS];\n }\n return COMMAND_PATTERNS;\n};\n\nconst commandProblem =\n ({ file }: Listed, source: string) =>\n (found: RegExpMatchArray): Problem => ({\n file,\n ...positionOf(source)(found.index ?? WHOLE_MATCH),\n rule: COMMAND_RULE,\n message: `Python is not used in this repository. Remove \\`${Str.trim(found[WHOLE_MATCH])}\\` and do the work in TypeScript or Rust.`,\n });\n\nconst commandProblems = (entry: Listed, source: string): readonly Problem[] =>\n pipe(\n patternsFor(entry.name),\n Arr.flatMap((pattern) => Arr.fromIterable(Str.matchAll(pattern)(source))),\n Arr.map(commandProblem(entry, source)),\n );\n\nconst isPython = ({ name }: Listed): boolean => PYTHON_FILE.test(name);\n\nconst isScanned = (entry: Listed): boolean =>\n !isPython(entry) && SCANNED_FILE.test(entry.name) && !LOCKFILE.test(entry.name);\n\n/** @internal */\nconst checkPython = Effect.fn(\"checkPython\")(function* checkPython(root: string) {\n const files = yield* RepositoryFiles;\n const names = yield* files.listedFiles(root);\n const listed = pipe(\n names,\n Arr.map((name): Listed => ({ name, file: files.join(root, name) })),\n );\n const problemsIn = (entry: Listed): Effect.Effect<readonly Problem[]> =>\n files.readFile(entry.file).pipe(\n Effect.map(\n Option.match({\n onNone: (): readonly Problem[] => [],\n onSome: (source) => commandProblems(entry, source),\n }),\n ),\n );\n const scanned = yield* Effect.forEach(pipe(listed, Arr.filter(isScanned)), problemsIn, {\n concurrency: READ_CONCURRENCY,\n });\n const present = yield* Effect.filter(pipe(listed, Arr.filter(isPython)), ({ file }) =>\n files.exists(file),\n );\n return [...pipe(present, Arr.map(fileProblem)), ...Arr.flatten(scanned)];\n});\n\nexport { checkPython };\n","import { Array as Arr, Effect } from \"effect\";\n\nimport { checkRepository } from \"./check.ts\";\nimport { checkHiddenUnicode } from \"./hidden-unicode.ts\";\nimport { checkNestedDocs } from \"./nested-docs.ts\";\nimport { checkOverrides } from \"./overrides.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { checkPython } from \"./python.ts\";\n\n/** @internal */\nconst checkAll: (\n root: string,\n) => Effect.Effect<\n readonly Problem[],\n Effect.Error<\n | ReturnType<typeof checkRepository>\n | ReturnType<typeof checkOverrides>\n | ReturnType<typeof checkHiddenUnicode>\n >,\n Effect.Services<\n | ReturnType<typeof checkRepository>\n | ReturnType<typeof checkOverrides>\n | ReturnType<typeof checkHiddenUnicode>\n >\n> = Effect.fn(\"checkAll\")(function* checkAll(root: string) {\n const found = yield* Effect.all(\n [\n checkRepository(root),\n checkOverrides(root),\n checkHiddenUnicode(root),\n checkPython(root),\n checkNestedDocs(root),\n ],\n { concurrency: \"unbounded\" },\n );\n return Arr.flatten(found);\n});\n\nexport { checkAll };\n","import { Effect, Schema, Stdio, Stream } from \"effect\";\n\nconst taggedError = Schema.TaggedError;\n\nclass ProblemsFound extends taggedError<ProblemsFound, { readonly brand: unique symbol }>()(\n \"ProblemsFound\",\n {\n count: Schema.Finite,\n },\n) {}\n\n/** @internal */\nconst writeStdout = Effect.fn(\"writeStdout\")(function* writeStdout(text: string) {\n const stdio = yield* Stdio.Stdio;\n yield* Stream.make(text).pipe(Stream.run(stdio.stdout()), Effect.orDie);\n});\n\nexport { ProblemsFound, writeStdout };\n","import { runMain } from \"@effect/platform-node/NodeRuntime\";\nimport { layer as nodeServicesLayer } from \"@effect/platform-node/NodeServices\";\nimport { Cause, Effect, Layer, Option, Schema, Stdio, Stream } from \"effect\";\nimport type { FileSystem, Path } from \"effect\";\nimport { FetchHttpClient } from \"effect/http\";\nimport { Otlp, OtlpSerialization } from \"effect/observability\";\nimport type { ChildProcessSpawner } from \"effect/process\";\n\nimport { ProblemsFound } from \"./output.ts\";\nimport { nodeRepositoryFiles } from \"./repository-files.ts\";\nimport type { RepositoryFiles } from \"./repository-files.ts\";\n\nconst reportFailure = <Failure>(\n cause: Cause.Cause<Failure>,\n): Effect.Effect<void, never, Stdio.Stdio> =>\n Effect.gen(function* report() {\n const stdio = yield* Stdio.Stdio;\n const failed = Cause.findErrorOption(cause).pipe(Option.exists(Schema.is(ProblemsFound)));\n if (failed) {\n return;\n }\n yield* Stream.make(`${Cause.pretty(cause)}\\n`).pipe(Stream.run(stdio.stderr()), Effect.orDie);\n });\n\nconst tracing = Otlp.layerFromConfig({ resource: { serviceName: \"msch\" } }).pipe(\n Layer.provide(OtlpSerialization.layerJson),\n Layer.provide(FetchHttpClient.layer),\n);\n\nconst runCli = <Value, Failure>(\n program: Effect.Effect<\n Value,\n Failure,\n | RepositoryFiles\n | Stdio.Stdio\n | FileSystem.FileSystem\n | Path.Path\n | ChildProcessSpawner.ChildProcessSpawner\n >,\n): void => {\n const services = Layer.mergeAll(nodeRepositoryFiles, tracing).pipe(\n Layer.provideMerge(nodeServicesLayer),\n );\n const main = Layer.build(services).pipe(\n Effect.flatMap((context) =>\n Effect.provideContext(program.pipe(Effect.tapCause(reportFailure)), context),\n ),\n Effect.scoped,\n );\n runMain(main, { disableErrorReporting: true });\n};\n\n/** @internal */\nexport { runCli };\n","#!/usr/bin/env node\nimport { Effect, Schema, Stdio, Array as Arr, pipe } from \"effect\";\n\nimport { checkAll } from \"./all-checks.ts\";\nimport { JSON_FLAG } from \"./cli-contract.ts\";\nimport { ProblemsFound, writeStdout } from \"./output.ts\";\nimport { ProblemList, formatProblem, sortProblems } from \"./problem.ts\";\nimport type { Problem } from \"./problem.ts\";\nimport { RepositoryFiles } from \"./repository-files.ts\";\nimport { runCli } from \"./runtime.ts\";\n\nconst NO_PROBLEMS = 0;\n\nconst reportText = (\n root: string,\n problems: readonly Problem[],\n): Effect.Effect<void, ProblemsFound, RepositoryFiles | Stdio.Stdio> =>\n Effect.gen(function* report() {\n const files = yield* RepositoryFiles;\n const format = formatProblem((file) => files.relative(root, file));\n yield* writeStdout(\n pipe(\n problems,\n Arr.map((problem) => `${format(problem)}\\n`),\n Arr.join(\"\"),\n ),\n );\n if (problems.length > NO_PROBLEMS) {\n return yield* ProblemsFound.make({ count: problems.length });\n }\n return yield* Effect.void;\n });\n\nconst msch = Effect.gen(function* msch() {\n const stdio = yield* Stdio.Stdio;\n const files = yield* RepositoryFiles;\n const args = yield* stdio.args;\n const root = files.resolve(\".\");\n const found = yield* checkAll(root);\n const problems = sortProblems(found);\n if (args.includes(JSON_FLAG)) {\n const text = yield* Schema.encodeEffect(Schema.fromJsonString(ProblemList))(problems);\n return yield* writeStdout(text);\n }\n return yield* reportText(root, problems);\n});\n\nrunCli(msch);\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@r_masseater/msch",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "masseater's check policy: points every finite value set and object shape at its one owner, and ships the oxlint preset of plugins and rules.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lint",
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"msch": "./dist/cli.mjs"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
|
-
"dist"
|
|
24
|
+
"dist",
|
|
25
|
+
"src/vite.d.ts"
|
|
25
26
|
],
|
|
26
27
|
"type": "module",
|
|
27
28
|
"exports": {
|
|
@@ -38,6 +39,9 @@
|
|
|
38
39
|
"types": "./dist/oxlint.d.mts",
|
|
39
40
|
"default": "./dist/oxlint.mjs"
|
|
40
41
|
},
|
|
42
|
+
"./vite": {
|
|
43
|
+
"types": "./src/vite.d.ts"
|
|
44
|
+
},
|
|
41
45
|
"./package.json": "./package.json"
|
|
42
46
|
},
|
|
43
47
|
"publishConfig": {
|
|
@@ -63,9 +67,11 @@
|
|
|
63
67
|
"@effect/vitest": "4.1.2",
|
|
64
68
|
"@r_masseater/vitest-otlp": "0.2.0",
|
|
65
69
|
"@types/node": "26.6.6",
|
|
70
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@1.5.0",
|
|
66
71
|
"vite-plus": "1.5.0"
|
|
67
72
|
},
|
|
68
73
|
"peerDependencies": {
|
|
74
|
+
"vite": "*",
|
|
69
75
|
"vite-plus": ">=1.5.0"
|
|
70
76
|
},
|
|
71
77
|
"engines": {
|