eslint-plugin-export-scope
Version:
Don't leak LOCAL utils, states, components into the global scope
68 lines • 3.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCompletionsAtPosition = void 0;
const typescript_1 = require("typescript");
const checkIsImportable_1 = require("../checkIsImportable");
const path_1 = require("path");
const tsUtils_1 = require("./tsUtils");
const scopeFileCompletions_1 = require("./scopeFileCompletions");
const jsDocCompletions_1 = require("./jsDocCompletions");
const getCompletionsAtPosition = (ts, info) => (importPath, position, ...args) => {
const ls = info.languageService;
const tsProgram = ls.getProgram();
const importDir = (0, path_1.dirname)(importPath);
const original = ls.getCompletionsAtPosition(importPath, position, ...args);
const file = tsProgram?.getSourceFile(importPath);
const fileTextToPosition = file?.getFullText().slice(0, position);
if (!fileTextToPosition)
return original;
if ([checkIsImportable_1.SCOPE_TS_FILE_NAME, checkIsImportable_1.SCOPE_JS_FILE_NAME].includes((0, path_1.basename)(importPath))) {
return (0, scopeFileCompletions_1.getScopeFileCompletions)(ts, importDir, fileTextToPosition) ?? original;
}
{
// -------------- snippets --------------
const lastLine = fileTextToPosition.split("\n").at(-1)?.trimStart();
// autocompletion in VSCode only triggers direcly after @ symbol
const snippetTriggerFound = ["@scope", "@scopeDefault", "@scopeException"].some((x) => lastLine && x.startsWith(lastLine));
if (snippetTriggerFound) {
const atSnippet = (name) => ({
name: `@${name}`,
kind: typescript_1.ScriptElementKind.unknown,
kindModifiers: "",
sortText: "10",
isSnippet: true,
insertText: `/** @${name} ${"${0}"} */`,
replacementSpan: { start: position - 1, length: 1 },
});
return {
...(0, tsUtils_1.getNewCompletions)(),
isGlobalCompletion: true,
entries: [atSnippet("scope"), atSnippet("scopeDefault"), atSnippet("scopeException")],
};
}
}
{
// -------------- jsdoc completions --------------
const lastJSDocPos = fileTextToPosition.lastIndexOf("/**");
const lastClosingJSDocPos = fileTextToPosition.lastIndexOf("*/");
if (lastClosingJSDocPos < lastJSDocPos) {
return (0, jsDocCompletions_1.jsDocCompletions)(importDir, original ?? (0, tsUtils_1.getNewCompletions)(), fileTextToPosition.slice(lastJSDocPos));
}
}
// -------------- accessibility validation --------------
if (!original || !tsProgram)
return original;
const filtered = original.entries.filter((entry) => {
if (entry.kind !== typescript_1.ScriptElementKind.alias && entry.kindModifiers !== "export")
return true;
let exportPath = entry.data?.fileName;
if (!exportPath) {
const symbol = ls.getCompletionEntrySymbol(importPath, position, entry.name, undefined);
exportPath = symbol?.declarations?.[0]?.getSourceFile().fileName;
}
return (0, checkIsImportable_1.checkIsImportable)({ tsProgram, importPath, exportPath, exportName: entry.name });
});
return { ...original, entries: filtered ?? [] };
};
exports.getCompletionsAtPosition = getCompletionsAtPosition;
//# sourceMappingURL=getCompletionsAtPosition.js.map
;