@astrojs/ts-plugin 1.0.4 → 1.0.5
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/.turbo/turbo-build.log +2 -2
- package/CHANGELOG.md +6 -0
- package/dist/index.js +4 -1
- package/dist/language-service/index.js +35 -12
- package/dist/module-loader.js +44 -3
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/src/index.ts +5 -1
- package/src/language-service/index.ts +37 -10
- package/src/module-loader.ts +63 -5
- package/src/utils.ts +2 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
@astrojs/ts-plugin:build: cache hit, replaying output
|
|
1
|
+
@astrojs/ts-plugin:build: cache hit, replaying output 295b71fd393768a9
|
|
2
2
|
@astrojs/ts-plugin:build:
|
|
3
|
-
@astrojs/ts-plugin:build: > @astrojs/ts-plugin@1.0.
|
|
3
|
+
@astrojs/ts-plugin:build: > @astrojs/ts-plugin@1.0.5 build /home/runner/work/language-tools/language-tools/packages/ts-plugin
|
|
4
4
|
@astrojs/ts-plugin:build: > astro-scripts build "src/**/*.ts"
|
|
5
5
|
@astrojs/ts-plugin:build:
|
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -15,6 +15,9 @@ function init(modules) {
|
|
|
15
15
|
logger.log("Detected that this is not an Astro project, abort patching TypeScript");
|
|
16
16
|
return info.languageService;
|
|
17
17
|
}
|
|
18
|
+
if ((0, import_language_service.isPatched)(info.languageService)) {
|
|
19
|
+
return info.languageService;
|
|
20
|
+
}
|
|
18
21
|
logger.log("Starting Astro plugin");
|
|
19
22
|
const snapshotManager = new import_astro_snapshots.AstroSnapshotManager(modules.typescript, info.project.projectService, logger);
|
|
20
23
|
if (parsedCommandLine) {
|
|
@@ -51,4 +54,4 @@ function init(modules) {
|
|
|
51
54
|
return { create, getExternalFiles };
|
|
52
55
|
}
|
|
53
56
|
module.exports = init;
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLDZCQUFxQztBQUNyQyw4QkFBbUQ7QUFDbkQsb0JBQXVCO0FBQ3ZCLDJCQUFrQztBQUNsQyxpQ0FBeUM7QUFDekMsbUJBQXFFO0FBRXJFLFNBQVMsS0FBSyxTQUEwRTtBQUN2RixRQUFNLEtBQUssUUFBUTtBQUVuQixXQUFTLE9BQU8sTUFBc0Q7QUFYdkU7QUFZRSxVQUFNLFNBQVMsSUFBSSxxQkFBTyxLQUFLLFFBQVEsZUFBZSxNQUFNO0FBQzVELFVBQU0scUJBQW9CLGdCQUFLLHFCQUFvQix5QkFBekIsZ0NBQWdELHNDQUF3QixLQUFLLE9BQU87QUFFOUcsUUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLGlCQUFpQixHQUFHO0FBQ3JELGFBQU8sSUFBSSx1RUFBdUU7QUFDbEYsYUFBTyxLQUFLO0FBQUEsSUFDYjtBQUVBLFlBQUksbUNBQVUsS0FBSyxlQUFlLEdBQUc7QUFDcEMsYUFBTyxLQUFLO0FBQUEsSUFDYjtBQUVBLFdBQU8sSUFBSSx1QkFBdUI7QUFFbEMsVUFBTSxrQkFBa0IsSUFBSSw0Q0FBcUIsUUFBUSxZQUFZLEtBQUssUUFBUSxnQkFBZ0IsTUFBTTtBQUN4RyxRQUFJLG1CQUFtQjtBQUN0QixVQUFJO0FBQUEsUUFDSCxRQUFRO0FBQUEsUUFDUixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTDtBQUFBLFFBQ0E7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLGdEQUFrQixRQUFRLGlCQUFpQixRQUFRLFlBQVksS0FBSyxxQkFBcUIsS0FBSyxPQUFPO0FBQ3JHLGVBQU8saURBQXdCLEtBQUssaUJBQWlCLGlCQUFpQixNQUFNO0FBQUEsRUFDN0U7QUFFQSxXQUFTLGlCQUFpQixTQUFzQztBQXpDakU7QUEwQ0UsWUFBTywrREFBeUIsWUFBWSxRQUFRLGVBQWUsQ0FBQyxNQUE3RCxtQkFBZ0UsZUFBaEUsWUFBOEUsQ0FBQztBQUFBLEVBQ3ZGO0FBRUEsV0FBUyxlQUFlLFNBQTRCLG1CQUFxRDtBQUN4RyxRQUFJLG1CQUFtQjtBQUN0QixZQUFNLGlCQUFhLDBDQUE0QixJQUFJLFNBQVMsaUJBQWlCO0FBRTdFLFVBQUksV0FBVyxTQUFTO0FBQUcsZUFBTztBQUFBLElBQ25DO0FBRUEsUUFBSTtBQUNILFlBQU0sa0JBQWtCLFFBQVEsbUJBQW1CO0FBQ25ELFlBQU0sb0JBQ0wsT0FBTyxnQkFBZ0IsbUJBQW1CLFlBQzFDLFFBQVEsUUFBUSxTQUFTLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixjQUFjLEVBQUUsQ0FBQztBQUVyRSxhQUFPO0FBQUEsSUFDUixTQUFTLEdBQVA7QUFDRCxjQUFRLGVBQWUsT0FBTyxLQUFLLENBQVc7QUFDOUMsYUFBTztBQUFBLElBQ1I7QUFBQSxFQUNEO0FBRUEsU0FBTyxFQUFFLFFBQVEsaUJBQWlCO0FBQ25DO0FBRUEsaUJBQVM7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -18,7 +18,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var language_service_exports = {};
|
|
20
20
|
__export(language_service_exports, {
|
|
21
|
-
decorateLanguageService: () => decorateLanguageService
|
|
21
|
+
decorateLanguageService: () => decorateLanguageService,
|
|
22
|
+
isPatched: () => isPatched
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(language_service_exports);
|
|
24
25
|
var import_completions = require("./completions.js");
|
|
@@ -29,19 +30,41 @@ var import_find_references = require("./find-references.js");
|
|
|
29
30
|
var import_implementation = require("./implementation.js");
|
|
30
31
|
var import_line_column_offset = require("./line-column-offset.js");
|
|
31
32
|
var import_rename = require("./rename.js");
|
|
33
|
+
const astroPluginPatchSymbol = Symbol("astroPluginPatchSymbol");
|
|
34
|
+
function isPatched(ls) {
|
|
35
|
+
return ls[astroPluginPatchSymbol] === true;
|
|
36
|
+
}
|
|
32
37
|
function decorateLanguageService(ls, snapshotManager, logger) {
|
|
33
|
-
|
|
34
|
-
(0,
|
|
35
|
-
(0,
|
|
36
|
-
(0,
|
|
37
|
-
(0,
|
|
38
|
-
(0,
|
|
39
|
-
(0,
|
|
40
|
-
(0,
|
|
41
|
-
|
|
38
|
+
const proxy = new Proxy(ls, createProxyHandler());
|
|
39
|
+
(0, import_line_column_offset.decorateLineColumnOffset)(proxy, snapshotManager);
|
|
40
|
+
(0, import_rename.decorateRename)(proxy, snapshotManager, logger);
|
|
41
|
+
(0, import_diagnostics.decorateDiagnostics)(proxy);
|
|
42
|
+
(0, import_find_references.decorateFindReferences)(proxy, snapshotManager, logger);
|
|
43
|
+
(0, import_completions.decorateCompletions)(proxy, logger);
|
|
44
|
+
(0, import_definition.decorateGetDefinition)(proxy, snapshotManager);
|
|
45
|
+
(0, import_implementation.decorateGetImplementation)(proxy, snapshotManager);
|
|
46
|
+
(0, import_file_references.decorateGetFileReferences)(proxy, snapshotManager);
|
|
47
|
+
return proxy;
|
|
48
|
+
}
|
|
49
|
+
function createProxyHandler() {
|
|
50
|
+
const decorated = {};
|
|
51
|
+
return {
|
|
52
|
+
get(target, p) {
|
|
53
|
+
var _a;
|
|
54
|
+
if (p === astroPluginPatchSymbol) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return (_a = decorated[p]) != null ? _a : target[p];
|
|
58
|
+
},
|
|
59
|
+
set(_, p, value) {
|
|
60
|
+
decorated[p] = value;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
42
64
|
}
|
|
43
65
|
// Annotate the CommonJS export names for ESM import in node:
|
|
44
66
|
0 && (module.exports = {
|
|
45
|
-
decorateLanguageService
|
|
67
|
+
decorateLanguageService,
|
|
68
|
+
isPatched
|
|
46
69
|
});
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xhbmd1YWdlLXNlcnZpY2UvaW5kZXgudHMiXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQSx5QkFBb0M7QUFDcEMsd0JBQXNDO0FBQ3RDLHlCQUFvQztBQUNwQyw2QkFBMEM7QUFDMUMsNkJBQXVDO0FBQ3ZDLDRCQUEwQztBQUMxQyxnQ0FBeUM7QUFDekMsb0JBQStCO0FBRS9CLE1BQU0seUJBQXlCLE9BQU8sd0JBQXdCO0FBRXZELFNBQVMsVUFBVSxJQUF3QjtBQUNqRCxTQUFRLEdBQVcsNEJBQTRCO0FBQ2hEO0FBRU8sU0FBUyx3QkFDZixJQUNBLGlCQUNBLFFBQ3FCO0FBQ3JCLFFBQU0sUUFBUSxJQUFJLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQztBQUVoRCwwREFBeUIsT0FBTyxlQUFlO0FBQy9DLG9DQUFlLE9BQU8saUJBQWlCLE1BQU07QUFDN0MsOENBQW9CLEtBQUs7QUFDekIscURBQXVCLE9BQU8saUJBQWlCLE1BQU07QUFDckQsOENBQW9CLE9BQU8sTUFBTTtBQUNqQywrQ0FBc0IsT0FBTyxlQUFlO0FBQzVDLHVEQUEwQixPQUFPLGVBQWU7QUFDaEQsd0RBQTBCLE9BQU8sZUFBZTtBQUVoRCxTQUFPO0FBQ1I7QUFFQSxTQUFTLHFCQUF1RDtBQUMvRCxRQUFNLFlBQXlDLENBQUM7QUFFaEQsU0FBTztBQUFBLElBQ04sSUFBSSxRQUFRLEdBQUc7QUF6Q2pCO0FBMENHLFVBQUksTUFBTSx3QkFBd0I7QUFDakMsZUFBTztBQUFBLE1BQ1I7QUFFQSxjQUFPLGVBQVUsT0FBVixZQUE0QyxPQUFPO0FBQUEsSUFDM0Q7QUFBQSxJQUNBLElBQUksR0FBRyxHQUFHLE9BQU87QUFDaEIsZ0JBQVUsS0FBaUM7QUFFM0MsYUFBTztBQUFBLElBQ1I7QUFBQSxFQUNEO0FBQ0Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist/module-loader.js
CHANGED
|
@@ -48,11 +48,16 @@ class ModuleResolutionCache {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
function patchModuleLoader(logger, snapshotManager, typescript, lsHost, project) {
|
|
51
|
-
var _a;
|
|
51
|
+
var _a, _b;
|
|
52
52
|
const astroSys = (0, import_astro_sys.createAstroSys)(logger);
|
|
53
53
|
const moduleCache = new ModuleResolutionCache();
|
|
54
54
|
const origResolveModuleNames = (_a = lsHost.resolveModuleNames) == null ? void 0 : _a.bind(lsHost);
|
|
55
|
-
lsHost.
|
|
55
|
+
const origResolveModuleNamLiterals = (_b = lsHost.resolveModuleNameLiterals) == null ? void 0 : _b.bind(lsHost);
|
|
56
|
+
if (lsHost.resolveModuleNameLiterals) {
|
|
57
|
+
lsHost.resolveModuleNameLiterals = resolveModuleNameLiterals;
|
|
58
|
+
} else {
|
|
59
|
+
lsHost.resolveModuleNames = resolveModuleNames;
|
|
60
|
+
}
|
|
56
61
|
const origRemoveFile = project.removeFile.bind(project);
|
|
57
62
|
project.removeFile = (info, fileExists, detachFromProject) => {
|
|
58
63
|
logger.log("File is being removed. Delete from cache: ", info.fileName);
|
|
@@ -102,9 +107,45 @@ function patchModuleLoader(logger, snapshotManager, typescript, lsHost, project)
|
|
|
102
107
|
};
|
|
103
108
|
return resolvedAstroModule;
|
|
104
109
|
}
|
|
110
|
+
function resolveModuleNameLiterals(moduleLiterals, containingFile, redirectedReference, options, containingSourceFile, reusedNames) {
|
|
111
|
+
var _a2;
|
|
112
|
+
logger.log("Resolving modules names for " + containingFile);
|
|
113
|
+
const resolved = (_a2 = origResolveModuleNamLiterals == null ? void 0 : origResolveModuleNamLiterals(
|
|
114
|
+
moduleLiterals,
|
|
115
|
+
containingFile,
|
|
116
|
+
redirectedReference,
|
|
117
|
+
options,
|
|
118
|
+
containingSourceFile,
|
|
119
|
+
reusedNames
|
|
120
|
+
)) != null ? _a2 : moduleLiterals.map(
|
|
121
|
+
() => ({
|
|
122
|
+
resolvedModule: void 0
|
|
123
|
+
})
|
|
124
|
+
);
|
|
125
|
+
return resolved.map((tsResolvedModule, idx) => {
|
|
126
|
+
const moduleName = moduleLiterals[idx].text;
|
|
127
|
+
if (tsResolvedModule.resolvedModule || !(0, import_utils.ensureRealAstroFilePath)(moduleName).endsWith(".astro")) {
|
|
128
|
+
return tsResolvedModule;
|
|
129
|
+
}
|
|
130
|
+
return resolveAstroModuleNameFromCache(moduleName, containingFile, options);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function resolveAstroModuleNameFromCache(moduleName, containingFile, options) {
|
|
134
|
+
const cachedModule = moduleCache.get(moduleName, containingFile);
|
|
135
|
+
if (cachedModule) {
|
|
136
|
+
return {
|
|
137
|
+
resolvedModule: cachedModule
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const resolvedModule = resolveModuleName(moduleName, containingFile, options);
|
|
141
|
+
moduleCache.set(moduleName, containingFile, resolvedModule);
|
|
142
|
+
return {
|
|
143
|
+
resolvedModule
|
|
144
|
+
};
|
|
145
|
+
}
|
|
105
146
|
}
|
|
106
147
|
// Annotate the CommonJS export names for ESM import in node:
|
|
107
148
|
0 && (module.exports = {
|
|
108
149
|
patchModuleLoader
|
|
109
150
|
});
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,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QUFXO0FBQUEsTUFDdEM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNELEVBQUU7QUFDRixRQUFJLENBQUMsdUJBQXVCLEtBQUMscUNBQXVCLG9CQUFvQixnQkFBZ0IsR0FBRztBQUMxRixhQUFPO0FBQUEsSUFDUjtBQUVBLFVBQU0sdUJBQW1CLHNDQUF3QixvQkFBb0IsZ0JBQWdCO0FBQ3JGLFdBQU8sSUFBSSxZQUFZLE1BQU0saUJBQWlCLGdCQUFnQjtBQUM5RCxVQUFNLFdBQVcsZ0JBQWdCLE9BQU8sZ0JBQWdCO0FBQ3hELFFBQUksQ0FBQyxVQUFVO0FBQ2QsYUFBTztBQUFBLElBQ1I7QUFFQSxVQUFNLHNCQUE2QztBQUFBLE1BQ2xELFdBQVcsV0FBVyxVQUFVO0FBQUEsTUFDaEM7QUFBQSxJQUNEO0FBQ0EsV0FBTztBQUFBLEVBQ1I7QUFFQSxXQUFTLDBCQUNSLGdCQUNBLGdCQUNBLHFCQUNBLFNBQ0Esc0JBQ0EsYUFDd0Q7QUE3SjFELFFBQUFBO0FBOEpFLFdBQU8sSUFBSSxpQ0FBaUMsY0FBYztBQUsxRCxVQUFNLFlBQ0xBLE1BQUE7QUFBQSxNQUNDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxVQU5ELE9BQUFBLE1BUUEsZUFBZTtBQUFBLE1BQ2QsT0FBbUQ7QUFBQSxRQUNsRCxnQkFBZ0I7QUFBQSxNQUNqQjtBQUFBLElBQ0Q7QUFFRCxXQUFPLFNBQVMsSUFBSSxDQUFDLGtCQUFrQixRQUFRO0FBQzlDLFlBQU0sYUFBYSxlQUFlLEtBQUs7QUFDdkMsVUFBSSxpQkFBaUIsa0JBQWtCLEtBQUMsc0NBQXdCLFVBQVUsRUFBRSxTQUFTLFFBQVEsR0FBRztBQUMvRixlQUFPO0FBQUEsTUFDUjtBQUVBLGFBQU8sZ0NBQWdDLFlBQVksZ0JBQWdCLE9BQU87QUFBQSxJQUMzRSxDQUFDO0FBQUEsRUFDRjtBQUVBLFdBQVMsZ0NBQWdDLFlBQW9CLGdCQUF3QixTQUE2QjtBQUNqSCxVQUFNLGVBQWUsWUFBWSxJQUFJLFlBQVksY0FBYztBQUMvRCxRQUFJLGNBQWM7QUFDakIsYUFBTztBQUFBLFFBQ04sZ0JBQWdCO0FBQUEsTUFDakI7QUFBQSxJQUNEO0FBRUEsVUFBTSxpQkFBaUIsa0JBQWtCLFlBQVksZ0JBQWdCLE9BQU87QUFDNUUsZ0JBQVksSUFBSSxZQUFZLGdCQUFnQixjQUFjO0FBQzFELFdBQU87QUFBQSxNQUNOO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDsiLAogICJuYW1lcyI6IFsiX2EiXQp9Cg==
|
package/dist/utils.js
CHANGED
|
@@ -84,4 +84,4 @@ function readProjectAstroFilesFromFs(ts, project, parsedCommandLine) {
|
|
|
84
84
|
replaceDeep,
|
|
85
85
|
toRealAstroFilePath
|
|
86
86
|
});
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzLnRzIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRU8sU0FBUyxnQkFBZ0IsVUFBa0I7QUFDakQsU0FBTyxTQUFTLFNBQVMsUUFBUTtBQUNsQztBQUVPLFNBQVMsdUJBQXVCLFVBQWtCO0FBQ3hELFNBQU8sU0FBUyxTQUFTLFdBQVc7QUFDckM7QUFFTyxTQUFTLG9CQUFvQixVQUFrQjtBQUNyRCxTQUFPLFNBQVMsTUFBTSxHQUFHLENBQUMsTUFBTSxNQUFNO0FBQ3ZDO0FBRU8sU0FBUyx3QkFBd0IsVUFBa0I7QUFDekQsU0FBTyx1QkFBdUIsUUFBUSxJQUFJLG9CQUFvQixRQUFRLElBQUk7QUFDM0U7QUFFTyxTQUFTLHFCQUF3QixLQUFxQztBQUM1RSxTQUFPLFFBQVEsVUFBYSxRQUFRO0FBQ3JDO0FBS08sU0FBUyxZQUNmLEtBQ0EsV0FDQSxnQkFDSTtBQUNKLFNBQU8sYUFBYSxHQUFHO0FBRXZCLFdBQVMsYUFBYSxNQUFnQjtBQUNyQyxRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzdCLGFBQU8sS0FBSyxRQUFRLFdBQVcsY0FBYztBQUFBLElBQzlDO0FBQ0EsUUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQ3hCLGFBQU8sS0FBSyxJQUFJLENBQUMsVUFBVSxhQUFhLEtBQUssQ0FBQztBQUFBLElBQy9DO0FBQ0EsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM3QixhQUFPLE9BQU8sS0FBSyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksUUFBUTtBQUM1QyxXQUFHLE9BQU8sYUFBYSxLQUFLLElBQUk7QUFDaEMsZUFBTztBQUFBLE1BQ1IsR0FBRyxDQUFDLENBQVE7QUFBQSxJQUNiO0FBQ0EsV0FBTztBQUFBLEVBQ1I7QUFDRDtBQUVPLFNBQVMsd0JBQXdCLFNBQTRCO0FBakRwRTtBQWtEQyxVQUNFLGFBQXdDLDRCQUF4QyxZQUNBLFFBQVEsbUJBQW1CLEVBQVU7QUFFeEM7QUFFTyxTQUFTLDRCQUNmLElBQ0EsU0FDQSxtQkFDQztBQUNELFFBQU0sV0FBd0Isa0JBQWtCO0FBQ2hELFFBQU0sRUFBRSxTQUFTLFFBQVEsSUFBSTtBQUU3QixPQUFJLG1DQUFTLFlBQVcsR0FBRztBQUMxQixXQUFPLENBQUM7QUFBQSxFQUNUO0FBRUEsU0FBTyxHQUFHLElBQ1IsY0FBYyxRQUFRLG9CQUFvQixLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxHQUFHLFNBQVMsT0FBTyxFQUMxRixJQUFJLEdBQUcsT0FBTyxnQkFBZ0I7QUFDakM7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type ts from 'typescript/lib/tsserverlibrary';
|
|
2
2
|
import { AstroSnapshotManager } from './astro-snapshots.js';
|
|
3
|
-
import { decorateLanguageService } from './language-service/index.js';
|
|
3
|
+
import { decorateLanguageService, isPatched } from './language-service/index.js';
|
|
4
4
|
import { Logger } from './logger.js';
|
|
5
5
|
import { patchModuleLoader } from './module-loader.js';
|
|
6
6
|
import { ProjectAstroFilesManager } from './project-astro-files.js';
|
|
@@ -18,6 +18,10 @@ function init(modules: { typescript: typeof import('typescript/lib/tsserverlibra
|
|
|
18
18
|
return info.languageService;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
if (isPatched(info.languageService)) {
|
|
22
|
+
return info.languageService;
|
|
23
|
+
}
|
|
24
|
+
|
|
21
25
|
logger.log('Starting Astro plugin');
|
|
22
26
|
|
|
23
27
|
const snapshotManager = new AstroSnapshotManager(modules.typescript, info.project.projectService, logger);
|
|
@@ -10,19 +10,46 @@ import { decorateGetImplementation } from './implementation.js';
|
|
|
10
10
|
import { decorateLineColumnOffset } from './line-column-offset.js';
|
|
11
11
|
import { decorateRename } from './rename.js';
|
|
12
12
|
|
|
13
|
+
const astroPluginPatchSymbol = Symbol('astroPluginPatchSymbol');
|
|
14
|
+
|
|
15
|
+
export function isPatched(ls: ts.LanguageService) {
|
|
16
|
+
return (ls as any)[astroPluginPatchSymbol] === true;
|
|
17
|
+
}
|
|
18
|
+
|
|
13
19
|
export function decorateLanguageService(
|
|
14
20
|
ls: ts.LanguageService,
|
|
15
21
|
snapshotManager: AstroSnapshotManager,
|
|
16
22
|
logger: Logger
|
|
17
23
|
): ts.LanguageService {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
const proxy = new Proxy(ls, createProxyHandler());
|
|
25
|
+
|
|
26
|
+
decorateLineColumnOffset(proxy, snapshotManager);
|
|
27
|
+
decorateRename(proxy, snapshotManager, logger);
|
|
28
|
+
decorateDiagnostics(proxy);
|
|
29
|
+
decorateFindReferences(proxy, snapshotManager, logger);
|
|
30
|
+
decorateCompletions(proxy, logger);
|
|
31
|
+
decorateGetDefinition(proxy, snapshotManager);
|
|
32
|
+
decorateGetImplementation(proxy, snapshotManager);
|
|
33
|
+
decorateGetFileReferences(proxy, snapshotManager);
|
|
34
|
+
|
|
35
|
+
return proxy;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function createProxyHandler(): ProxyHandler<ts.LanguageService> {
|
|
39
|
+
const decorated: Partial<ts.LanguageService> = {};
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
get(target, p) {
|
|
43
|
+
if (p === astroPluginPatchSymbol) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return decorated[p as keyof ts.LanguageService] ?? target[p as keyof ts.LanguageService];
|
|
48
|
+
},
|
|
49
|
+
set(_, p, value) {
|
|
50
|
+
decorated[p as keyof ts.LanguageService] = value;
|
|
51
|
+
|
|
52
|
+
return true;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
28
55
|
}
|
package/src/module-loader.ts
CHANGED
|
@@ -8,19 +8,19 @@ import { ensureRealAstroFilePath, isVirtualAstroFilePath } from './utils.js';
|
|
|
8
8
|
* Caches resolved modules.
|
|
9
9
|
*/
|
|
10
10
|
class ModuleResolutionCache {
|
|
11
|
-
private cache = new Map<string, ts.
|
|
11
|
+
private cache = new Map<string, ts.ResolvedModuleFull>();
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Tries to get a cached module.
|
|
15
15
|
*/
|
|
16
|
-
get(moduleName: string, containingFile: string): ts.
|
|
16
|
+
get(moduleName: string, containingFile: string): ts.ResolvedModuleFull | undefined {
|
|
17
17
|
return this.cache.get(this.getKey(moduleName, containingFile));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Caches resolved module, if it is not undefined.
|
|
22
22
|
*/
|
|
23
|
-
set(moduleName: string, containingFile: string, resolvedModule: ts.
|
|
23
|
+
set(moduleName: string, containingFile: string, resolvedModule: ts.ResolvedModuleFull | undefined) {
|
|
24
24
|
if (!resolvedModule) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
@@ -63,8 +63,13 @@ export function patchModuleLoader(
|
|
|
63
63
|
const astroSys = createAstroSys(logger);
|
|
64
64
|
const moduleCache = new ModuleResolutionCache();
|
|
65
65
|
const origResolveModuleNames = lsHost.resolveModuleNames?.bind(lsHost);
|
|
66
|
+
const origResolveModuleNamLiterals = lsHost.resolveModuleNameLiterals?.bind(lsHost);
|
|
66
67
|
|
|
67
|
-
lsHost.
|
|
68
|
+
if (lsHost.resolveModuleNameLiterals) {
|
|
69
|
+
lsHost.resolveModuleNameLiterals = resolveModuleNameLiterals;
|
|
70
|
+
} else {
|
|
71
|
+
lsHost.resolveModuleNames = resolveModuleNames;
|
|
72
|
+
}
|
|
68
73
|
|
|
69
74
|
const origRemoveFile = project.removeFile.bind(project);
|
|
70
75
|
project.removeFile = (info, fileExists, detachFromProject) => {
|
|
@@ -118,7 +123,7 @@ export function patchModuleLoader(
|
|
|
118
123
|
name: string,
|
|
119
124
|
containingFile: string,
|
|
120
125
|
compilerOptions: ts.CompilerOptions
|
|
121
|
-
): ts.
|
|
126
|
+
): ts.ResolvedModuleFull | undefined {
|
|
122
127
|
const astroResolvedModule = typescript.resolveModuleName(
|
|
123
128
|
name,
|
|
124
129
|
containingFile,
|
|
@@ -142,4 +147,57 @@ export function patchModuleLoader(
|
|
|
142
147
|
};
|
|
143
148
|
return resolvedAstroModule;
|
|
144
149
|
}
|
|
150
|
+
|
|
151
|
+
function resolveModuleNameLiterals(
|
|
152
|
+
moduleLiterals: readonly ts.StringLiteralLike[],
|
|
153
|
+
containingFile: string,
|
|
154
|
+
redirectedReference: ts.ResolvedProjectReference | undefined,
|
|
155
|
+
options: ts.CompilerOptions,
|
|
156
|
+
containingSourceFile: ts.SourceFile,
|
|
157
|
+
reusedNames: readonly ts.StringLiteralLike[] | undefined
|
|
158
|
+
): readonly ts.ResolvedModuleWithFailedLookupLocations[] {
|
|
159
|
+
logger.log('Resolving modules names for ' + containingFile);
|
|
160
|
+
// Try resolving all module names with the original method first.
|
|
161
|
+
// The ones that are undefined will be re-checked if they are a
|
|
162
|
+
// Astro file and if so, are resolved, too. This way we can defer
|
|
163
|
+
// all module resolving logic except for Astro files to TypeScript.
|
|
164
|
+
const resolved =
|
|
165
|
+
origResolveModuleNamLiterals?.(
|
|
166
|
+
moduleLiterals,
|
|
167
|
+
containingFile,
|
|
168
|
+
redirectedReference,
|
|
169
|
+
options,
|
|
170
|
+
containingSourceFile,
|
|
171
|
+
reusedNames
|
|
172
|
+
) ??
|
|
173
|
+
moduleLiterals.map(
|
|
174
|
+
(): ts.ResolvedModuleWithFailedLookupLocations => ({
|
|
175
|
+
resolvedModule: undefined,
|
|
176
|
+
})
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
return resolved.map((tsResolvedModule, idx) => {
|
|
180
|
+
const moduleName = moduleLiterals[idx].text;
|
|
181
|
+
if (tsResolvedModule.resolvedModule || !ensureRealAstroFilePath(moduleName).endsWith('.astro')) {
|
|
182
|
+
return tsResolvedModule;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return resolveAstroModuleNameFromCache(moduleName, containingFile, options);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function resolveAstroModuleNameFromCache(moduleName: string, containingFile: string, options: ts.CompilerOptions) {
|
|
190
|
+
const cachedModule = moduleCache.get(moduleName, containingFile);
|
|
191
|
+
if (cachedModule) {
|
|
192
|
+
return {
|
|
193
|
+
resolvedModule: cachedModule,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const resolvedModule = resolveModuleName(moduleName, containingFile, options);
|
|
198
|
+
moduleCache.set(moduleName, containingFile, resolvedModule);
|
|
199
|
+
return {
|
|
200
|
+
resolvedModule: resolvedModule,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
145
203
|
}
|