@prover-coder-ai/eslint-plugin-suggest-members 0.0.20 → 0.0.22
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/lib/core/plugin-meta.d.ts +1 -1
- package/lib/core/plugin-meta.js +1 -1
- package/lib/rules/suggest-members/index.d.ts.map +1 -1
- package/lib/rules/suggest-members/index.js +6 -8
- package/lib/rules/suggest-members/index.js.map +1 -1
- package/lib/shell/validation/module-path-index.d.ts +1 -0
- package/lib/shell/validation/module-path-index.d.ts.map +1 -1
- package/lib/shell/validation/module-path-index.js +122 -14
- package/lib/shell/validation/module-path-index.js.map +1 -1
- package/lib/shell/validation/module-validation-effect.d.ts.map +1 -1
- package/lib/shell/validation/module-validation-effect.js +27 -2
- package/lib/shell/validation/module-validation-effect.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare const name = "@prover-coder-ai/eslint-plugin-suggest-members";
|
|
2
|
-
export declare const version = "0.0.
|
|
2
|
+
export declare const version = "0.0.22";
|
|
3
3
|
export declare const namespace = "eslint-plugin-suggest-members";
|
|
4
4
|
//# sourceMappingURL=plugin-meta.d.ts.map
|
package/lib/core/plugin-meta.js
CHANGED
|
@@ -9,6 +9,6 @@
|
|
|
9
9
|
// INVARIANT: name != "" && version != "" && namespace != ""
|
|
10
10
|
// COMPLEXITY: O(1)/O(1)
|
|
11
11
|
export const name = "@prover-coder-ai/eslint-plugin-suggest-members";
|
|
12
|
-
export const version = "0.0.
|
|
12
|
+
export const version = "0.0.22";
|
|
13
13
|
export const namespace = "eslint-plugin-suggest-members";
|
|
14
14
|
//# sourceMappingURL=plugin-meta.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/suggest-members/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/suggest-members/index.ts"],"names":[],"mappings":"AAwFA,eAAO,MAAM,kBAAkB,mJAoC9B,CAAA"}
|
|
@@ -4,7 +4,7 @@ import { makeTypeScriptCompilerServiceLayer } from "../../shell/services/typescr
|
|
|
4
4
|
import { getParserServicesForContext } from "../../shell/shared/import-validation-base.js";
|
|
5
5
|
import { createRule } from "../../shell/shared/rule-creator.js";
|
|
6
6
|
import { runValidationEffect } from "../../shell/shared/validation-runner.js";
|
|
7
|
-
import { formatMemberValidationMessage, validateMemberAccessEffectWithNodes, validateMemberPropertyNameEffect
|
|
7
|
+
import { formatMemberValidationMessage, validateMemberAccessEffectWithNodes, validateMemberPropertyNameEffect } from "../../shell/validation/member-validation-effect.js";
|
|
8
8
|
const createValidateAndReport = (tsServiceLayer, context, esTreeNodeToTSNodeMap) => (node) => {
|
|
9
9
|
if (node.computed)
|
|
10
10
|
return;
|
|
@@ -22,17 +22,17 @@ const createValidateAndReport = (tsServiceLayer, context, esTreeNodeToTSNodeMap)
|
|
|
22
22
|
formatMessage: formatMemberValidationMessage
|
|
23
23
|
});
|
|
24
24
|
};
|
|
25
|
-
const
|
|
25
|
+
const validatePatternProperty = (tsServiceLayer, context, esTreeNodeToTSNodeMap) => (property) => {
|
|
26
26
|
if (property.computed)
|
|
27
27
|
return;
|
|
28
28
|
if (property.key.type !== AST_NODE_TYPES.Identifier)
|
|
29
29
|
return;
|
|
30
|
-
if (property.parent.type !==
|
|
30
|
+
if (property.parent.type !== AST_NODE_TYPES.ObjectPattern)
|
|
31
31
|
return;
|
|
32
32
|
const tsParentNode = esTreeNodeToTSNodeMap.get(property.parent);
|
|
33
33
|
if (!tsParentNode)
|
|
34
34
|
return;
|
|
35
|
-
const validationEffect = pipe(
|
|
35
|
+
const validationEffect = pipe(validateMemberPropertyNameEffect(property.key.name, property.key, tsParentNode), Effect.provide(tsServiceLayer));
|
|
36
36
|
runValidationEffect({
|
|
37
37
|
validationEffect,
|
|
38
38
|
context,
|
|
@@ -56,15 +56,13 @@ export const suggestMembersRule = createRule("suggest-members", {
|
|
|
56
56
|
const esTreeNodeToTSNodeMap = parserServices.esTreeNodeToTSNodeMap;
|
|
57
57
|
const tsServiceLayer = makeTypeScriptCompilerServiceLayer(checker, program);
|
|
58
58
|
const validateAndReport = createValidateAndReport(tsServiceLayer, context, esTreeNodeToTSNodeMap);
|
|
59
|
-
const
|
|
60
|
-
const validateLiteralProperty = validateObjectProperty(tsServiceLayer, context, esTreeNodeToTSNodeMap, AST_NODE_TYPES.ObjectExpression, (propertyName, node, tsNode) => validateObjectLiteralPropertyNameEffect(propertyName, node, tsNode));
|
|
59
|
+
const validatePatternPropertyName = validatePatternProperty(tsServiceLayer, context, esTreeNodeToTSNodeMap);
|
|
61
60
|
return {
|
|
62
61
|
MemberExpression(node) {
|
|
63
62
|
validateAndReport(node);
|
|
64
63
|
},
|
|
65
64
|
Property(node) {
|
|
66
|
-
|
|
67
|
-
validateLiteralProperty(node);
|
|
65
|
+
validatePatternPropertyName(node);
|
|
68
66
|
}
|
|
69
67
|
};
|
|
70
68
|
}, defaultOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/suggest-members/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAGzD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/suggest-members/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export interface ModulePathIndex {
|
|
|
4
4
|
readonly localFileSet: ReadonlySet<string>;
|
|
5
5
|
readonly packageNames: ReadonlyArray<string>;
|
|
6
6
|
readonly packageNameSet: ReadonlySet<string>;
|
|
7
|
+
readonly canResolveModule?: (modulePath: string, containingFile: string) => boolean;
|
|
7
8
|
}
|
|
8
9
|
export declare const buildModulePathIndex: (program: ts.Program) => ModulePathIndex;
|
|
9
10
|
export declare const getModulePathIndex: (program: ts.Program) => ModulePathIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-path-index.d.ts","sourceRoot":"","sources":["../../../src/shell/validation/module-path-index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAIhC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"module-path-index.d.ts","sourceRoot":"","sources":["../../../src/shell/validation/module-path-index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAIhC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAA;CACpF;AAqOD,eAAO,MAAM,oBAAoB,GAAI,SAAS,EAAE,CAAC,OAAO,KAAG,eAe1D,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,SAAS,EAAE,CAAC,OAAO,KAAG,eAMxD,CAAA"}
|
|
@@ -67,20 +67,81 @@ const findNearestPackageJson = (startDir) => {
|
|
|
67
67
|
const rootCandidate = joinPath(currentDir, "package.json");
|
|
68
68
|
return ts.sys.fileExists(rootCandidate) ? rootCandidate : null;
|
|
69
69
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
// CHANGE: read package.json "name" field for workspace package discovery
|
|
71
|
+
// WHY: monorepo workspace packages need their names collected so cross-package imports are recognized
|
|
72
|
+
// PURITY: SHELL
|
|
73
|
+
// INVARIANT: returns name or null
|
|
74
|
+
// COMPLEXITY: O(1)/O(1)
|
|
75
|
+
const PackageNameSchema = S.Struct({
|
|
76
|
+
name: S.String
|
|
77
|
+
}).pipe(S.partial);
|
|
78
|
+
const decodePackageName = S.decodeUnknownEither(S.parseJson(PackageNameSchema));
|
|
79
|
+
const readPackageNameFromPath = (packageJsonPath) => {
|
|
74
80
|
const content = ts.sys.readFile(packageJsonPath);
|
|
75
81
|
if (!content)
|
|
76
|
-
return
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
return null;
|
|
83
|
+
return Either.match(decodePackageName(content), {
|
|
84
|
+
onLeft: () => null,
|
|
85
|
+
onRight: (value) => value.name !== undefined && value.name.length > 0 ? value.name : null
|
|
86
|
+
});
|
|
79
87
|
};
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
// CHANGE: collect unique package.json directories from source files
|
|
89
|
+
// WHY: in monorepos, program.getCurrentDirectory() returns the workspace root,
|
|
90
|
+
// missing package-level dependencies. Source files belong to specific packages,
|
|
91
|
+
// so we find their nearest package.json files for accurate dependency discovery.
|
|
92
|
+
// PURITY: SHELL
|
|
93
|
+
// INVARIANT: each unique package.json is read at most once
|
|
94
|
+
// COMPLEXITY: O(n)/O(n) where n = |sourceFiles|
|
|
95
|
+
const collectPackageJsonPaths = (sourceFileDirs) => {
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const result = [];
|
|
98
|
+
for (const dir of sourceFileDirs) {
|
|
99
|
+
const found = findNearestPackageJson(dir);
|
|
100
|
+
if (found && !seen.has(found)) {
|
|
101
|
+
seen.add(found);
|
|
102
|
+
result.push(found);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
};
|
|
107
|
+
// CHANGE: discover workspace sibling package names
|
|
108
|
+
// WHY: in monorepos, cross-package imports reference sibling packages by name.
|
|
109
|
+
// These names must be in the index to prevent false-positive "module not found" errors.
|
|
110
|
+
// REF: issue #14 — plugin unable to work with monorepos where one package imports from another
|
|
111
|
+
// PURITY: SHELL
|
|
112
|
+
// INVARIANT: only reads package.json files that exist on disk
|
|
113
|
+
// COMPLEXITY: O(w)/O(w) where w = |workspace packages|
|
|
114
|
+
const discoverWorkspacePackageNames = (packageJsonPaths) => {
|
|
115
|
+
const names = [];
|
|
116
|
+
const visitedParents = new Set();
|
|
117
|
+
for (const pkgPath of packageJsonPaths) {
|
|
118
|
+
const pkgDir = dirname(pkgPath);
|
|
119
|
+
const parentDir = dirname(pkgDir);
|
|
120
|
+
if (visitedParents.has(parentDir))
|
|
121
|
+
continue;
|
|
122
|
+
visitedParents.add(parentDir);
|
|
123
|
+
// use getDirectories to enumerate sibling package directories
|
|
124
|
+
const subdirs = ts.sys.getDirectories(parentDir);
|
|
125
|
+
for (const subdir of subdirs) {
|
|
126
|
+
if (subdir === "node_modules")
|
|
127
|
+
continue;
|
|
128
|
+
const sibPkgJson = joinPath(parentDir, subdir, "package.json");
|
|
129
|
+
if (ts.sys.fileExists(sibPkgJson)) {
|
|
130
|
+
const name = readPackageNameFromPath(sibPkgJson);
|
|
131
|
+
if (name)
|
|
132
|
+
names.push(name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return names;
|
|
137
|
+
};
|
|
138
|
+
// CHANGE: collect local source files and their directories from a TypeScript program
|
|
139
|
+
// WHY: extracted from buildModulePathIndex to reduce complexity
|
|
140
|
+
// PURITY: SHELL
|
|
141
|
+
// COMPLEXITY: O(n)/O(n) where n = |sourceFiles|
|
|
142
|
+
const collectSourceFilesAndDirs = (program) => {
|
|
82
143
|
const localFiles = [];
|
|
83
|
-
const
|
|
144
|
+
const sourceFileDirs = new Set();
|
|
84
145
|
for (const sourceFile of program.getSourceFiles()) {
|
|
85
146
|
if (sourceFile.isDeclarationFile)
|
|
86
147
|
continue;
|
|
@@ -90,17 +151,64 @@ export const buildModulePathIndex = (program) => {
|
|
|
90
151
|
if (isSupportedFile(normalized)) {
|
|
91
152
|
localFiles.push(normalized);
|
|
92
153
|
}
|
|
154
|
+
sourceFileDirs.add(dirname(normalized));
|
|
93
155
|
}
|
|
94
|
-
|
|
95
|
-
|
|
156
|
+
return { localFiles, sourceFileDirs };
|
|
157
|
+
};
|
|
158
|
+
// CHANGE: extract dependency names from all package.json files and workspace siblings
|
|
159
|
+
// WHY: extracted from buildModulePathIndex to reduce complexity
|
|
160
|
+
// PURITY: SHELL
|
|
161
|
+
// COMPLEXITY: O(n)/O(n)
|
|
162
|
+
const collectAllPackageNames = (packageJsonPaths) => {
|
|
163
|
+
const packageNames = new Set();
|
|
164
|
+
for (const pkgPath of packageJsonPaths) {
|
|
165
|
+
const content = ts.sys.readFile(pkgPath);
|
|
166
|
+
if (!content)
|
|
167
|
+
continue;
|
|
168
|
+
const parsed = parsePackageJson(content);
|
|
169
|
+
if (!parsed)
|
|
170
|
+
continue;
|
|
171
|
+
for (const name of extractPackageNames(parsed)) {
|
|
172
|
+
packageNames.add(name);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
for (const name of discoverWorkspacePackageNames(packageJsonPaths)) {
|
|
96
176
|
packageNames.add(name);
|
|
97
177
|
}
|
|
178
|
+
return [...packageNames];
|
|
179
|
+
};
|
|
180
|
+
// CHANGE: create a TypeScript module resolution fallback function
|
|
181
|
+
// WHY: even if package name discovery misses a workspace package,
|
|
182
|
+
// TypeScript's own resolution can validate the import as a last resort
|
|
183
|
+
// PURITY: SHELL
|
|
184
|
+
// COMPLEXITY: O(1)/O(1)
|
|
185
|
+
const createModuleResolver = (program) => {
|
|
186
|
+
const compilerOptions = program.getCompilerOptions();
|
|
187
|
+
return (modulePath, containingFile) => {
|
|
188
|
+
const resolved = ts.resolveModuleName(modulePath, containingFile, compilerOptions, ts.sys);
|
|
189
|
+
return resolved.resolvedModule !== undefined;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
const moduleIndexCache = new WeakMap();
|
|
193
|
+
// CHANGE: collect dependencies from all package.json files near source files, not just program root
|
|
194
|
+
// WHY: in monorepos, program.getCurrentDirectory() returns workspace root which has minimal deps.
|
|
195
|
+
// Each package has its own package.json with the actual dependencies used by that package.
|
|
196
|
+
// REF: issue #14 — monorepo cross-package imports not recognized
|
|
197
|
+
// PURITY: SHELL
|
|
198
|
+
// INVARIANT: index contains deps from all relevant package.json files + workspace package names
|
|
199
|
+
// COMPLEXITY: O(n)/O(n)
|
|
200
|
+
export const buildModulePathIndex = (program) => {
|
|
201
|
+
const { localFiles, sourceFileDirs } = collectSourceFilesAndDirs(program);
|
|
202
|
+
const startDirs = [...sourceFileDirs, normalizePath(program.getCurrentDirectory())];
|
|
203
|
+
const packageJsonPaths = collectPackageJsonPaths(startDirs);
|
|
204
|
+
const packageNames = collectAllPackageNames(packageJsonPaths);
|
|
98
205
|
const uniqueFiles = [...new Set(localFiles)];
|
|
99
206
|
return {
|
|
100
207
|
localFiles: uniqueFiles,
|
|
101
208
|
localFileSet: new Set(uniqueFiles),
|
|
102
|
-
packageNames
|
|
103
|
-
packageNameSet: new Set(packageNames)
|
|
209
|
+
packageNames,
|
|
210
|
+
packageNameSet: new Set(packageNames),
|
|
211
|
+
canResolveModule: createModuleResolver(program)
|
|
104
212
|
};
|
|
105
213
|
};
|
|
106
214
|
export const getModulePathIndex = (program) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-path-index.js","sourceRoot":"","sources":["../../../src/shell/validation/module-path-index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,0EAA0E;AAC1E,iBAAiB;AACjB,4BAA4B;AAC5B,cAAc;AACd,gBAAgB;AAChB,cAAc;AACd,2DAA2D;AAC3D,wBAAwB;AACxB,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"module-path-index.js","sourceRoot":"","sources":["../../../src/shell/validation/module-path-index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,0EAA0E;AAC1E,iBAAiB;AACjB,4BAA4B;AAC5B,cAAc;AACd,gBAAgB;AAChB,cAAc;AACd,2DAA2D;AAC3D,wBAAwB;AACxB,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAU1E,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAE5E,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAW,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAEjH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7D,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9D,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;CACnE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAIlB,MAAM,iBAAiB,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAE/E,MAAM,qBAAqB,GAAG,CAC5B,KAAmD,EAC5B,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAE7D,MAAM,WAAW,GAAG,CAClB,MAA4C,EACrB,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAyB,EAAE;IACxE,MAAM,QAAQ,GAAqC;QACjD,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,sBAAsB;KACvB,CAAA;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC/E,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAsB,EAAE,CAC/D,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;IACvC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;IAClB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;CAC1B,CAAC,CAAA;AAEJ,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7C,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,UAAU,CAAA;IACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,GAAG,QAA+B,EAAU,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAElG,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAiB,EAAE;IACjE,IAAI,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAEnC,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;QACtD,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;QAClD,UAAU,GAAG,SAAS,CAAA;QACtB,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC1D,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAA;AAChE,CAAC,CAAA;AAED,yEAAyE;AACzE,sGAAsG;AACtG,gBAAgB;AAChB,kCAAkC;AAClC,wBAAwB;AACxB,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM;CACf,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AAElB,MAAM,iBAAiB,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAE/E,MAAM,uBAAuB,GAAG,CAAC,eAAuB,EAAiB,EAAE;IACzE,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,OAAO,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;QAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;QAClB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KAC1F,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,oEAAoE;AACpE,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AACnF,gBAAgB;AAChB,2DAA2D;AAC3D,gDAAgD;AAChD,MAAM,uBAAuB,GAAG,CAC9B,cAAqC,EACd,EAAE;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,MAAM,GAAkB,EAAE,CAAA;IAEhC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,mDAAmD;AACnD,+EAA+E;AAC/E,0FAA0F;AAC1F,+FAA+F;AAC/F,gBAAgB;AAChB,8DAA8D;AAC9D,uDAAuD;AACvD,MAAM,6BAA6B,GAAG,CACpC,gBAAuC,EAChB,EAAE;IACzB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;IAExC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAEjC,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAQ;QAC3C,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAE7B,8DAA8D;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QAChD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,KAAK,cAAc;gBAAE,SAAQ;YACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;YAC9D,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAA;gBAChD,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,qFAAqF;AACrF,gEAAgE;AAChE,gBAAgB;AAChB,gDAAgD;AAChD,MAAM,yBAAyB,GAAG,CAChC,OAAmB,EACyD,EAAE;IAC9E,MAAM,UAAU,GAAkB,EAAE,CAAA;IACpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;IAExC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAClD,IAAI,UAAU,CAAC,iBAAiB;YAAE,SAAQ;QAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,SAAQ;QAEnD,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7B,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,sFAAsF;AACtF,gEAAgE;AAChE,gBAAgB;AAChB,wBAAwB;AACxB,MAAM,sBAAsB,GAAG,CAC7B,gBAAuC,EAChB,EAAE;IACzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO;YAAE,SAAQ;QACtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,6BAA6B,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,CAAC,GAAG,YAAY,CAAC,CAAA;AAC1B,CAAC,CAAA;AAED,kEAAkE;AAClE,kEAAkE;AAClE,yEAAyE;AACzE,gBAAgB;AAChB,wBAAwB;AACxB,MAAM,oBAAoB,GAAG,CAC3B,OAAmB,EACsC,EAAE;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAA;IACpD,OAAO,CAAC,UAAkB,EAAE,cAAsB,EAAW,EAAE;QAC7D,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QAC1F,OAAO,QAAQ,CAAC,cAAc,KAAK,SAAS,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAA+B,CAAA;AAEnE,oGAAoG;AACpG,kGAAkG;AAClG,6FAA6F;AAC7F,iEAAiE;AACjE,gBAAgB;AAChB,gGAAgG;AAChG,wBAAwB;AACxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAmB,EAAmB,EAAE;IAC3E,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAA;IAEzE,MAAM,SAAS,GAAG,CAAC,GAAG,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAA;IACnF,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAC3D,MAAM,YAAY,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;IAE7D,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;IAC5C,OAAO;QACL,UAAU,EAAE,WAAW;QACvB,YAAY,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC;QAClC,YAAY;QACZ,cAAc,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC;QACrC,gBAAgB,EAAE,oBAAoB,CAAC,OAAO,CAAC;KAChD,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAmB,EAAmB,EAAE;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC9C,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACvC,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-validation-effect.d.ts","sourceRoot":"","sources":["../../../src/shell/validation/module-validation-effect.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"module-validation-effect.d.ts","sourceRoot":"","sources":["../../../src/shell/validation/module-validation-effect.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAA;AAG5C,OAAO,KAAK,EAAE,0BAA0B,EAAuB,MAAM,qBAAqB,CAAA;AAe1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAuJ7D,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,eAAe,MAAM,EACrB,gBAAgB,MAAM,EACtB,cAAc,eAAe,KAC5B,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,eAAe,CAUzD,CAAA;AAEH,eAAO,MAAM,sBAAsB,GACjC,YAAY,MAAM,EAClB,gBAAgB,MAAM,KACrB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,oBAAoB,CAS5D,CAAA;AAEH,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,EACjB,WAAW,MAAM,KAChB,OAQF,CAAA;AAED,eAAO,MAAM,iCAAiC,GAC5C,QAAQ,0BAA0B,KACjC,MAaA,CAAA"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import * as NodePath from "@effect/platform-node/NodePath";
|
|
11
11
|
import * as Path from "@effect/platform/Path";
|
|
12
12
|
import { Effect, Match, pipe } from "effect";
|
|
13
|
+
import * as ts from "typescript";
|
|
13
14
|
import { extractModuleName, formatModuleMessage, isModulePath, isValidCandidate, makeModuleNotFoundResult, makeValidModuleResult } from "../../core/index.js";
|
|
14
15
|
import { findSimilarCandidates } from "../../core/suggestion/engine.js";
|
|
15
16
|
import { MODULE_FILE_EXTENSIONS, normalizeModuleSpecifier, stripKnownExtension } from "../../core/validation/module-path-utils.js";
|
|
@@ -45,12 +46,24 @@ const checkIndexFilesInIndex = (index, dirPath) => MODULE_FILE_EXTENSIONS.some((
|
|
|
45
46
|
const isRelativeModuleSpecifier = (value) => value.startsWith("./") || value.startsWith("../") || value.startsWith("/");
|
|
46
47
|
const isNodeProtocolSpecifier = (value) => value.startsWith("node:");
|
|
47
48
|
const isPackageSpecifier = (value) => !isRelativeModuleSpecifier(value) && !isNodeProtocolSpecifier(value);
|
|
48
|
-
const
|
|
49
|
+
const fileExistsOnDisk = (filePath) => ts.sys.fileExists(filePath);
|
|
50
|
+
// CHANGE: add containingFile parameter and TypeScript resolution fallback
|
|
51
|
+
// WHY: in monorepos, workspace packages may not appear in the package name index.
|
|
52
|
+
// TypeScript's module resolution can validate these imports as a last resort.
|
|
53
|
+
// REF: issue #14 — monorepo cross-package imports produce false-positive errors
|
|
54
|
+
// PURITY: SHELL
|
|
55
|
+
// INVARIANT: Valid when package is in index OR resolvable by TypeScript
|
|
56
|
+
// COMPLEXITY: O(n log n)/O(n)
|
|
57
|
+
const validatePackageModulePathWithIndex = (index, requestedPath, node, containingFile) => {
|
|
49
58
|
const moduleName = extractModuleName(requestedPath);
|
|
50
59
|
if (moduleName.length === 0)
|
|
51
60
|
return makeValidModuleResult();
|
|
52
61
|
if (index.packageNameSet.has(moduleName))
|
|
53
62
|
return makeValidModuleResult();
|
|
63
|
+
// fallback: check if TypeScript can resolve the module
|
|
64
|
+
if (index.canResolveModule?.(requestedPath, containingFile)) {
|
|
65
|
+
return makeValidModuleResult();
|
|
66
|
+
}
|
|
54
67
|
const validCandidates = index.packageNames.filter((candidate) => isValidCandidate(candidate, moduleName));
|
|
55
68
|
const suggestions = findSimilarCandidates(moduleName, validCandidates);
|
|
56
69
|
if (suggestions.length === 0) {
|
|
@@ -61,6 +74,18 @@ const validatePackageModulePathWithIndex = (index, requestedPath, node) => {
|
|
|
61
74
|
const validateRelativeModulePathWithIndex = (index, node, requestedPath, containingFile) => {
|
|
62
75
|
const resolvedPath = resolveRelativePath(containingFile, requestedPath);
|
|
63
76
|
const resolvedWithoutExtension = stripKnownExtension(resolvedPath);
|
|
77
|
+
// CHANGE: accept existing on-disk imports even if TS program index excludes file type
|
|
78
|
+
// WHY: style/assets imports (e.g. .css) are usually not part of Program.getSourceFiles()
|
|
79
|
+
// but should not be reported as missing when file exists.
|
|
80
|
+
// QUOTE(TZ): "должно не падать ... если подключаем модуль"
|
|
81
|
+
// REF: user-message-2026-02-11
|
|
82
|
+
// SOURCE: n/a
|
|
83
|
+
// FORMAT THEOREM: ∀p ∈ RelativeImports: fileExists(p) → Valid(p)
|
|
84
|
+
// PURITY: SHELL
|
|
85
|
+
// INVARIANT: fallback only suppresses false positives for real files on disk
|
|
86
|
+
// COMPLEXITY: O(1)/O(1)
|
|
87
|
+
if (fileExistsOnDisk(resolvedPath))
|
|
88
|
+
return makeValidModuleResult();
|
|
64
89
|
if (containsFile(index, resolvedPath))
|
|
65
90
|
return makeValidModuleResult();
|
|
66
91
|
if (checkPathWithExtensionsInIndex(index, resolvedWithoutExtension))
|
|
@@ -81,7 +106,7 @@ const validateModulePathWithIndex = (index, node, requestedPath, containingFile)
|
|
|
81
106
|
return makeValidModuleResult();
|
|
82
107
|
}
|
|
83
108
|
if (isPackageSpecifier(requestedPath)) {
|
|
84
|
-
return validatePackageModulePathWithIndex(index, requestedPath, node);
|
|
109
|
+
return validatePackageModulePathWithIndex(index, requestedPath, node, containingFile);
|
|
85
110
|
}
|
|
86
111
|
return validateRelativeModulePathWithIndex(index, node, requestedPath, containingFile);
|
|
87
112
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-validation-effect.js","sourceRoot":"","sources":["../../../src/shell/validation/module-validation-effect.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,iDAAiD;AACjD,iBAAiB;AACjB,4BAA4B;AAC5B,cAAc;AACd,gBAAgB;AAChB,8DAA8D;AAC9D,oCAAoC;AACpC,8BAA8B;AAC9B,OAAO,KAAK,QAAQ,MAAM,gCAAgC,CAAA;AAC1D,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"module-validation-effect.js","sourceRoot":"","sources":["../../../src/shell/validation/module-validation-effect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"types": "lib/index.d.ts",
|
|
14
14
|
"name": "@prover-coder-ai/eslint-plugin-suggest-members",
|
|
15
15
|
"type": "module",
|
|
16
|
-
"version": "0.0.
|
|
16
|
+
"version": "0.0.22",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@effect/platform": "^0.94.
|
|
18
|
+
"@effect/platform": "^0.94.4",
|
|
19
19
|
"@effect/platform-node": "^0.104.1",
|
|
20
20
|
"@effect/schema": "^0.75.5",
|
|
21
|
-
"@typescript-eslint/utils": "8.
|
|
22
|
-
"effect": "^3.19.
|
|
21
|
+
"@typescript-eslint/utils": "8.55.0",
|
|
22
|
+
"effect": "^3.19.16"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"eslint": "^8.57.0 || ^9.0.0",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"sync-plugin-meta": "node scripts/sync-plugin-meta.mjs",
|
|
31
31
|
"build": "pnpm run sync-plugin-meta && tsc -p tsconfig.build.json",
|
|
32
32
|
"dev": "tsc -p tsconfig.build.json --watch",
|
|
33
|
-
"lint": "
|
|
34
|
-
"lint:tests": "
|
|
35
|
-
"lint:effect": "
|
|
33
|
+
"lint": "vibecode-linter src/",
|
|
34
|
+
"lint:tests": "vibecode-linter tests/",
|
|
35
|
+
"lint:effect": "eslint --config eslint.effect-ts-check.config.mjs .",
|
|
36
36
|
"check": "pnpm run typecheck",
|
|
37
37
|
"prestart": "pnpm run build",
|
|
38
38
|
"start": "node lib/index.js",
|