UNPKG

eslint-plugin-export-scope

Version:

Don't leak LOCAL utils, states, components into the global scope

68 lines 3.46 kB
"use strict"; 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