@platformos/platformos-language-server-common 0.0.12 → 0.0.16
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/CHANGELOG.md +67 -0
- package/dist/PropertyShapeInference.d.ts +5 -0
- package/dist/PropertyShapeInference.js +28 -0
- package/dist/PropertyShapeInference.js.map +1 -1
- package/dist/TypeSystem.js +106 -55
- package/dist/TypeSystem.js.map +1 -1
- package/dist/VariableShapeExtractor.js +2 -4
- package/dist/VariableShapeExtractor.js.map +1 -1
- package/dist/codeActions/CodeActionsProvider.d.ts +1 -1
- package/dist/completions/CompletionsProvider.d.ts +1 -0
- package/dist/completions/CompletionsProvider.js +6 -0
- package/dist/completions/CompletionsProvider.js.map +1 -1
- package/dist/completions/providers/GraphQLFieldCompletionProvider.d.ts +12 -0
- package/dist/completions/providers/GraphQLFieldCompletionProvider.js +75 -0
- package/dist/completions/providers/GraphQLFieldCompletionProvider.js.map +1 -0
- package/dist/definitions/DefinitionProvider.d.ts +19 -1
- package/dist/definitions/DefinitionProvider.js +33 -1
- package/dist/definitions/DefinitionProvider.js.map +1 -1
- package/dist/definitions/providers/PageRouteDefinitionProvider.d.ts +51 -0
- package/dist/definitions/providers/PageRouteDefinitionProvider.js +204 -0
- package/dist/definitions/providers/PageRouteDefinitionProvider.js.map +1 -0
- package/dist/definitions/providers/RenderPartialDefinitionProvider.d.ts +14 -0
- package/dist/definitions/providers/RenderPartialDefinitionProvider.js +50 -0
- package/dist/definitions/providers/RenderPartialDefinitionProvider.js.map +1 -0
- package/dist/diagnostics/runChecks.d.ts +3 -1
- package/dist/diagnostics/runChecks.js +2 -1
- package/dist/diagnostics/runChecks.js.map +1 -1
- package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -1
- package/dist/documentLinks/DocumentLinksProvider.js +18 -20
- package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
- package/dist/hover/HoverProvider.d.ts +1 -0
- package/dist/hover/HoverProvider.js +6 -0
- package/dist/hover/HoverProvider.js.map +1 -1
- package/dist/hover/providers/GraphQLFieldHoverProvider.d.ts +12 -0
- package/dist/hover/providers/GraphQLFieldHoverProvider.js +85 -0
- package/dist/hover/providers/GraphQLFieldHoverProvider.js.map +1 -0
- package/dist/server/AppGraphManager.js +3 -4
- package/dist/server/AppGraphManager.js.map +1 -1
- package/dist/server/CachedFileSystem.js +7 -2
- package/dist/server/CachedFileSystem.js.map +1 -1
- package/dist/server/startServer.js +71 -5
- package/dist/server/startServer.js.map +1 -1
- package/dist/test/MockConnection.d.ts +1 -1
- package/dist/test/MockConnection.js +11 -4
- package/dist/test/MockConnection.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/searchPaths.d.ts +21 -0
- package/dist/utils/searchPaths.js +34 -0
- package/dist/utils/searchPaths.js.map +1 -0
- package/package.json +6 -4
- package/src/PropertyShapeInference.spec.ts +44 -0
- package/src/PropertyShapeInference.ts +27 -0
- package/src/TypeSystem.spec.ts +59 -0
- package/src/TypeSystem.ts +119 -58
- package/src/VariableShapeExtractor.ts +2 -4
- package/src/completions/CompletionsProvider.ts +11 -0
- package/src/completions/providers/GraphQLFieldCompletionProvider.ts +78 -0
- package/src/definitions/DefinitionProvider.ts +52 -0
- package/src/definitions/providers/PageRouteDefinitionProvider.spec.ts +776 -0
- package/src/definitions/providers/PageRouteDefinitionProvider.ts +250 -0
- package/src/definitions/providers/RenderPartialDefinitionProvider.spec.ts +226 -0
- package/src/definitions/providers/RenderPartialDefinitionProvider.ts +70 -0
- package/src/diagnostics/runChecks.ts +4 -0
- package/src/documentLinks/DocumentLinksProvider.spec.ts +131 -10
- package/src/documentLinks/DocumentLinksProvider.ts +27 -35
- package/src/hover/HoverProvider.ts +11 -0
- package/src/hover/providers/GraphQLFieldHoverProvider.spec.ts +124 -0
- package/src/hover/providers/GraphQLFieldHoverProvider.ts +90 -0
- package/src/server/AppGraphManager.ts +3 -5
- package/src/server/CachedFileSystem.ts +11 -2
- package/src/server/startServer.spec.ts +62 -0
- package/src/server/startServer.ts +85 -5
- package/src/test/MockConnection.ts +16 -4
- package/src/utils/searchPaths.spec.ts +101 -0
- package/src/utils/searchPaths.ts +32 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { RouteTable } from '@platformos/platformos-common';
|
|
1
2
|
import { DocumentManager } from '../documents';
|
|
2
3
|
import { Dependencies } from '../types';
|
|
3
4
|
import { DiagnosticsManager } from './DiagnosticsManager';
|
|
4
5
|
import { AppGraphManager } from '../server/AppGraphManager';
|
|
5
|
-
export declare function makeRunChecks(documentManager: DocumentManager, diagnosticsManager: DiagnosticsManager, { fs, loadConfig, platformosDocset, jsonValidationSet, appGraphManager, includeFilesFromDisk, }: Pick<Dependencies, 'fs' | 'loadConfig' | 'platformosDocset' | 'jsonValidationSet'> & {
|
|
6
|
+
export declare function makeRunChecks(documentManager: DocumentManager, diagnosticsManager: DiagnosticsManager, { fs, loadConfig, platformosDocset, jsonValidationSet, appGraphManager, includeFilesFromDisk, getRouteTable, }: Pick<Dependencies, 'fs' | 'loadConfig' | 'platformosDocset' | 'jsonValidationSet'> & {
|
|
6
7
|
appGraphManager?: AppGraphManager;
|
|
7
8
|
includeFilesFromDisk?: () => boolean;
|
|
9
|
+
getRouteTable?: () => RouteTable | undefined;
|
|
8
10
|
}): (triggerURIs: string[]) => Promise<void>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeRunChecks = makeRunChecks;
|
|
4
4
|
const platformos_check_common_1 = require("@platformos/platformos-check-common");
|
|
5
|
-
function makeRunChecks(documentManager, diagnosticsManager, { fs, loadConfig, platformosDocset, jsonValidationSet, appGraphManager, includeFilesFromDisk, }) {
|
|
5
|
+
function makeRunChecks(documentManager, diagnosticsManager, { fs, loadConfig, platformosDocset, jsonValidationSet, appGraphManager, includeFilesFromDisk, getRouteTable, }) {
|
|
6
6
|
return async function runChecks(triggerURIs) {
|
|
7
7
|
// This function takes an array of triggerURIs so that we can correctly
|
|
8
8
|
// recheck on file renames that came from out of bounds in a
|
|
@@ -25,6 +25,7 @@ function makeRunChecks(documentManager, diagnosticsManager, { fs, loadConfig, pl
|
|
|
25
25
|
fs,
|
|
26
26
|
platformosDocset,
|
|
27
27
|
jsonValidationSet,
|
|
28
|
+
routeTable: getRouteTable?.(),
|
|
28
29
|
async getReferences(uri) {
|
|
29
30
|
if (!appGraphManager)
|
|
30
31
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runChecks.js","sourceRoot":"","sources":["../../src/diagnostics/runChecks.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"runChecks.js","sourceRoot":"","sources":["../../src/diagnostics/runChecks.ts"],"names":[],"mappings":";;AAeA,sCAkEC;AAjFD,iFAO6C;AAQ7C,SAAgB,aAAa,CAC3B,eAAgC,EAChC,kBAAsC,EACtC,EACE,EAAE,EACF,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,aAAa,GAKd;IAED,OAAO,KAAK,UAAU,SAAS,CAAC,WAAqB;QACnD,uEAAuE;QACvE,4DAA4D;QAC5D,cAAc;QACd,EAAE;QACF,yBAAyB;QACzB,uCAAuC;QACvC,oCAAoC;QACpC,EAAE;QACF,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAA,wCAAc,EAAC,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,kCAAQ,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAEnE,OAAO;QAEP,KAAK,UAAU,gBAAgB,CAAC,iBAAyB;YACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAE1E,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAK,EAAC,GAAG,EAAE,MAAM,EAAE;gBAC3C,EAAE;gBACF,gBAAgB;gBAChB,iBAAiB;gBACjB,UAAU,EAAE,aAAa,EAAE,EAAE;gBAE7B,KAAK,CAAC,aAAa,CAAC,GAAW;oBAC7B,IAAI,CAAC,eAAe;wBAAE,OAAO,EAAE,CAAC;oBAChC,OAAO,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;gBAED,KAAK,CAAC,gBAAgB,CAAC,YAAY;oBACjC,MAAM,GAAG,GAAG,8BAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBACpD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACrC,IAAI,GAAG,EAAE,IAAI,KAAK,wCAAc,CAAC,UAAU;wBAAE,OAAO,SAAS,CAAC;oBAC9D,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC5B,CAAC;aACF,CAAC,CAAC;YAEH,oEAAoE;YACpE,sEAAsE;YACtE,QAAQ;YACR,KAAK,MAAM,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC7B,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC3F,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -2,11 +2,13 @@ import { DocumentLink } from 'vscode-languageserver';
|
|
|
2
2
|
import { DocumentManager } from '../documents';
|
|
3
3
|
import { FindAppRootURI } from '../internal-types';
|
|
4
4
|
import { DocumentsLocator, TranslationProvider } from '@platformos/platformos-common';
|
|
5
|
+
import { SearchPathsLoader } from '../utils/searchPaths';
|
|
5
6
|
export declare class DocumentLinksProvider {
|
|
6
7
|
private documentManager;
|
|
7
8
|
private findAppRootURI;
|
|
8
9
|
private documentsLocator;
|
|
9
10
|
private translationProvider;
|
|
10
|
-
|
|
11
|
+
private searchPathsCache;
|
|
12
|
+
constructor(documentManager: DocumentManager, findAppRootURI: FindAppRootURI, documentsLocator: DocumentsLocator, translationProvider: TranslationProvider, searchPathsCache: SearchPathsLoader);
|
|
11
13
|
documentLinks(uriString: string): Promise<DocumentLink[]>;
|
|
12
14
|
}
|
|
@@ -7,11 +7,12 @@ const vscode_languageserver_1 = require("vscode-languageserver");
|
|
|
7
7
|
const vscode_uri_1 = require("vscode-uri");
|
|
8
8
|
const platformos_check_common_2 = require("@platformos/platformos-check-common");
|
|
9
9
|
class DocumentLinksProvider {
|
|
10
|
-
constructor(documentManager, findAppRootURI, documentsLocator, translationProvider) {
|
|
10
|
+
constructor(documentManager, findAppRootURI, documentsLocator, translationProvider, searchPathsCache) {
|
|
11
11
|
this.documentManager = documentManager;
|
|
12
12
|
this.findAppRootURI = findAppRootURI;
|
|
13
13
|
this.documentsLocator = documentsLocator;
|
|
14
14
|
this.translationProvider = translationProvider;
|
|
15
|
+
this.searchPathsCache = searchPathsCache;
|
|
15
16
|
}
|
|
16
17
|
async documentLinks(uriString) {
|
|
17
18
|
const sourceCode = this.documentManager.get(uriString);
|
|
@@ -24,32 +25,29 @@ class DocumentLinksProvider {
|
|
|
24
25
|
if (!rootUri) {
|
|
25
26
|
return [];
|
|
26
27
|
}
|
|
27
|
-
const
|
|
28
|
+
const root = vscode_uri_1.URI.parse(rootUri);
|
|
29
|
+
const searchPaths = await this.searchPathsCache.get(root);
|
|
30
|
+
const visitor = documentLinksVisitor(sourceCode.textDocument, root, this.documentsLocator, this.translationProvider, searchPaths);
|
|
28
31
|
return (0, platformos_check_common_2.visit)(sourceCode.ast, visitor);
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
34
|
exports.DocumentLinksProvider = DocumentLinksProvider;
|
|
32
|
-
function documentLinksVisitor(textDocument, root, documentsLocator, translationProvider) {
|
|
35
|
+
function documentLinksVisitor(textDocument, root, documentsLocator, translationProvider, searchPaths) {
|
|
33
36
|
return {
|
|
34
37
|
async LiquidTag(node) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
isLiquidString(node.markup.partial)) {
|
|
44
|
-
const partial = node.markup.partial;
|
|
45
|
-
return vscode_languageserver_1.DocumentLink.create(range(textDocument, partial), await documentsLocator.locate(root, node.name, partial.value));
|
|
38
|
+
const markup = node.markup;
|
|
39
|
+
if (typeof markup === 'string' || markup === null)
|
|
40
|
+
return;
|
|
41
|
+
const name = node.name;
|
|
42
|
+
// render, include, function, theme_render_rc all have a .partial field
|
|
43
|
+
if ('partial' in markup && isLiquidString(markup.partial)) {
|
|
44
|
+
const uri = await documentsLocator.locateOrDefault(root, name, markup.partial.value, searchPaths);
|
|
45
|
+
return vscode_languageserver_1.DocumentLink.create(range(textDocument, markup.partial), uri);
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const snippet = node.markup.graphql;
|
|
52
|
-
return vscode_languageserver_1.DocumentLink.create(range(textDocument, snippet), await documentsLocator.locate(root, node.name, snippet.value));
|
|
47
|
+
// graphql has a .graphql field
|
|
48
|
+
if ('graphql' in markup && isLiquidString(markup.graphql)) {
|
|
49
|
+
const uri = await documentsLocator.locateOrDefault(root, name, markup.graphql.value);
|
|
50
|
+
return vscode_languageserver_1.DocumentLink.create(range(textDocument, markup.graphql), uri);
|
|
53
51
|
}
|
|
54
52
|
},
|
|
55
53
|
async LiquidVariable(node) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentLinksProvider.js","sourceRoot":"","sources":["../../src/documentLinks/DocumentLinksProvider.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"DocumentLinksProvider.js","sourceRoot":"","sources":["../../src/documentLinks/DocumentLinksProvider.ts"],"names":[],"mappings":";;;AAAA,uEAAyF;AACzF,iFAAqE;AACrE,iEAA4D;AAE5D,2CAAiC;AAEjC,iFAAqE;AAMrE,MAAa,qBAAqB;IAChC,YACU,eAAgC,EAChC,cAA8B,EAC9B,gBAAkC,EAClC,mBAAwC,EACxC,gBAAmC;QAJnC,oBAAe,GAAf,eAAe,CAAiB;QAChC,mBAAc,GAAd,cAAc,CAAgB;QAC9B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,qBAAgB,GAAhB,gBAAgB,CAAmB;IAC1C,CAAC;IAEJ,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvD,IACE,CAAC,UAAU;YACX,UAAU,CAAC,IAAI,KAAK,wCAAc,CAAC,UAAU;YAC7C,UAAU,CAAC,GAAG,YAAY,KAAK,EAC/B,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,gBAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,oBAAoB,CAClC,UAAU,CAAC,YAAY,EACvB,IAAI,EACJ,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,WAAW,CACZ,CAAC;QACF,OAAO,IAAA,+BAAK,EAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF;AApCD,sDAoCC;AAED,SAAS,oBAAoB,CAC3B,YAA0B,EAC1B,IAAS,EACT,gBAAkC,EAClC,mBAAwC,EACxC,WAA4B;IAE5B,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,IAAI;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO;YAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAoB,CAAC;YAEvC,uEAAuE;YACvE,IAAI,SAAS,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAChD,IAAI,EACJ,IAAI,EACJ,MAAM,CAAC,OAAO,CAAC,KAAK,EACpB,WAAW,CACZ,CAAC;gBACF,OAAO,oCAAY,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;YAED,+BAA+B;YAC/B,IAAI,SAAS,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACrF,OAAO,oCAAY,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,IAAI;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CAAC,mBAAmB,CAC9D,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,KAAK,EACrB,IAAI,CACL,CAAC;gBACF,OAAO,oCAAY,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;gBACnC,OAAO,oCAAY,CAAC,MAAM,CACxB,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,EACpC,MAAM,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,YAA0B,EAAE,IAA8C;IACvF,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,6BAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB;IAC1C,OAAO,IAAI,CAAC,IAAI,KAAK,8BAAS,CAAC,MAAM,CAAC;AACxC,CAAC"}
|
|
@@ -12,6 +12,7 @@ export declare class HoverProvider {
|
|
|
12
12
|
readonly getDocDefinitionForURI: GetDocDefinitionForURI;
|
|
13
13
|
readonly findAppRootURI: FindAppRootURI;
|
|
14
14
|
private providers;
|
|
15
|
+
private graphqlFieldHoverProvider;
|
|
15
16
|
constructor(documentManager: DocumentManager, platformosDocset: PlatformOSDocset, translationProvider: TranslationProvider, getTranslationsForURI?: GetTranslationsForURI, getDocDefinitionForURI?: GetDocDefinitionForURI, findAppRootURI?: FindAppRootURI);
|
|
16
17
|
hover(params: HoverParams): Promise<Hover | null>;
|
|
17
18
|
}
|
|
@@ -7,6 +7,7 @@ const providers_1 = require("./providers");
|
|
|
7
7
|
const HtmlAttributeValueHoverProvider_1 = require("./providers/HtmlAttributeValueHoverProvider");
|
|
8
8
|
const platformos_check_common_2 = require("@platformos/platformos-check-common");
|
|
9
9
|
const LiquidDocTagHoverProvider_1 = require("./providers/LiquidDocTagHoverProvider");
|
|
10
|
+
const GraphQLFieldHoverProvider_1 = require("./providers/GraphQLFieldHoverProvider");
|
|
10
11
|
class HoverProvider {
|
|
11
12
|
constructor(documentManager, platformosDocset, translationProvider, getTranslationsForURI = async () => ({}), getDocDefinitionForURI = async () => undefined, findAppRootURI = async () => null) {
|
|
12
13
|
this.documentManager = documentManager;
|
|
@@ -17,6 +18,7 @@ class HoverProvider {
|
|
|
17
18
|
this.findAppRootURI = findAppRootURI;
|
|
18
19
|
this.providers = [];
|
|
19
20
|
const typeSystem = new TypeSystem_1.TypeSystem(platformosDocset);
|
|
21
|
+
this.graphqlFieldHoverProvider = new GraphQLFieldHoverProvider_1.GraphQLFieldHoverProvider(platformosDocset, documentManager);
|
|
20
22
|
this.providers = [
|
|
21
23
|
new providers_1.LiquidTagHoverProvider(platformosDocset),
|
|
22
24
|
new providers_1.LiquidFilterArgumentHoverProvider(platformosDocset),
|
|
@@ -35,6 +37,10 @@ class HoverProvider {
|
|
|
35
37
|
async hover(params) {
|
|
36
38
|
const uri = params.textDocument.uri;
|
|
37
39
|
const document = this.documentManager.get(uri);
|
|
40
|
+
// GraphQL files get dedicated hover support
|
|
41
|
+
if (document?.type === platformos_check_common_1.SourceCodeType.GraphQL) {
|
|
42
|
+
return this.graphqlFieldHoverProvider.hover(params);
|
|
43
|
+
}
|
|
38
44
|
// Supports only Liquid resources
|
|
39
45
|
if (document?.type !== platformos_check_common_1.SourceCodeType.LiquidHtml || document.ast instanceof Error) {
|
|
40
46
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HoverProvider.js","sourceRoot":"","sources":["../../src/hover/HoverProvider.ts"],"names":[],"mappings":";;;AAAA,iFAI6C;AAE7C,8CAA2C;AAI3C,2CAWqB;AACrB,iGAA8F;AAC9F,iFAAsE;AACtE,qFAAkF;AAGlF,MAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"HoverProvider.js","sourceRoot":"","sources":["../../src/hover/HoverProvider.ts"],"names":[],"mappings":";;;AAAA,iFAI6C;AAE7C,8CAA2C;AAI3C,2CAWqB;AACrB,iGAA8F;AAC9F,iFAAsE;AACtE,qFAAkF;AAClF,qFAAkF;AAGlF,MAAa,aAAa;IAIxB,YACW,eAAgC,EAChC,gBAAkC,EAClC,mBAAwC,EACxC,wBAA+C,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAC/D,yBAAiD,KAAK,IAAI,EAAE,CAAC,SAAS,EACtE,iBAAiC,KAAK,IAAI,EAAE,CAAC,IAAI;QALjD,oBAAe,GAAf,eAAe,CAAiB;QAChC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,0BAAqB,GAArB,qBAAqB,CAA0C;QAC/D,2BAAsB,GAAtB,sBAAsB,CAAgD;QACtE,mBAAc,GAAd,cAAc,CAAmC;QATpD,cAAS,GAAwB,EAAE,CAAC;QAW1C,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,yBAAyB,GAAG,IAAI,qDAAyB,CAC5D,gBAAgB,EAChB,eAAe,CAChB,CAAC;QACF,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,kCAAsB,CAAC,gBAAgB,CAAC;YAC5C,IAAI,6CAAiC,CAAC,gBAAgB,CAAC;YACvD,IAAI,qCAAyB,CAAC,gBAAgB,CAAC;YAC/C,IAAI,qCAAyB,CAAC,UAAU,CAAC;YACzC,IAAI,8CAAkC,CAAC,UAAU,CAAC;YAClD,IAAI,gCAAoB,EAAE;YAC1B,IAAI,sCAA0B,EAAE;YAChC,IAAI,iEAA+B,EAAE;YACrC,IAAI,oCAAwB,CAAC,eAAe,EAAE,mBAAmB,EAAE,cAAc,CAAC;YAClF,IAAI,sCAA0B,CAAC,sBAAsB,CAAC;YACtD,IAAI,+CAAmC,CAAC,sBAAsB,CAAC;YAC/D,IAAI,qDAAyB,CAAC,eAAe,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAmB;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/C,4CAA4C;QAC5C,IAAI,QAAQ,EAAE,IAAI,KAAK,wCAAc,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,iCAAiC;QACjC,IAAI,QAAQ,EAAE,IAAI,KAAK,wCAAc,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,YAAY,KAAK,EAAE,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,IAAA,yCAAe,EAC9C,QAAQ,CAAC,GAAG,EACZ,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAChD,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;CACF;AAxDD,sCAwDC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Hover, HoverParams } from 'vscode-languageserver';
|
|
2
|
+
import { DocumentManager } from '../../documents';
|
|
3
|
+
import { PlatformOSDocset } from '@platformos/platformos-check-common';
|
|
4
|
+
export declare class GraphQLFieldHoverProvider {
|
|
5
|
+
private platformosDocset;
|
|
6
|
+
private documentManager;
|
|
7
|
+
private schemaCache;
|
|
8
|
+
private schemaLoaded;
|
|
9
|
+
constructor(platformosDocset: PlatformOSDocset, documentManager: DocumentManager);
|
|
10
|
+
private getSchema;
|
|
11
|
+
hover(params: HoverParams): Promise<Hover | null>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GraphQLFieldHoverProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* graphql-language-service and graphql must be loaded dynamically to avoid
|
|
6
|
+
* the "Cannot use GraphQLList from another module or realm" error that occurs
|
|
7
|
+
* when vitest transforms the graphql ESM module into separate instances.
|
|
8
|
+
* By requiring at runtime, we ensure a single shared module instance.
|
|
9
|
+
*/
|
|
10
|
+
let _glsMod;
|
|
11
|
+
function getGLS() {
|
|
12
|
+
if (!_glsMod)
|
|
13
|
+
_glsMod = require('graphql-language-service');
|
|
14
|
+
return _glsMod;
|
|
15
|
+
}
|
|
16
|
+
let _graphqlMod;
|
|
17
|
+
function getGraphQL() {
|
|
18
|
+
if (!_graphqlMod)
|
|
19
|
+
_graphqlMod = require('graphql');
|
|
20
|
+
return _graphqlMod;
|
|
21
|
+
}
|
|
22
|
+
class GraphQLFieldHoverProvider {
|
|
23
|
+
constructor(platformosDocset, documentManager) {
|
|
24
|
+
this.platformosDocset = platformosDocset;
|
|
25
|
+
this.documentManager = documentManager;
|
|
26
|
+
this.schemaLoaded = false;
|
|
27
|
+
}
|
|
28
|
+
async getSchema() {
|
|
29
|
+
if (!this.schemaLoaded) {
|
|
30
|
+
const sdl = await this.platformosDocset.graphQL();
|
|
31
|
+
if (sdl) {
|
|
32
|
+
try {
|
|
33
|
+
this.schemaCache = getGraphQL().buildSchema(sdl);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Invalid schema SDL
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
this.schemaLoaded = true;
|
|
40
|
+
}
|
|
41
|
+
return this.schemaCache;
|
|
42
|
+
}
|
|
43
|
+
async hover(params) {
|
|
44
|
+
const uri = params.textDocument.uri;
|
|
45
|
+
const document = this.documentManager.get(uri);
|
|
46
|
+
if (!document)
|
|
47
|
+
return null;
|
|
48
|
+
const schema = await this.getSchema();
|
|
49
|
+
if (!schema)
|
|
50
|
+
return null;
|
|
51
|
+
const content = document.textDocument.getText();
|
|
52
|
+
const gls = getGLS();
|
|
53
|
+
// graphql-language-service's getHoverInformation uses the character *before* the cursor
|
|
54
|
+
// position to identify the token. We try offset +1 first, then the original position,
|
|
55
|
+
// to handle the case where the cursor is at the start of a token.
|
|
56
|
+
const positions = [
|
|
57
|
+
new gls.Position(params.position.line, params.position.character + 1),
|
|
58
|
+
new gls.Position(params.position.line, params.position.character),
|
|
59
|
+
];
|
|
60
|
+
try {
|
|
61
|
+
let hoverInfo;
|
|
62
|
+
for (const position of positions) {
|
|
63
|
+
const info = gls.getHoverInformation(schema, content, position);
|
|
64
|
+
if (info && info !== '' && info !== 'null') {
|
|
65
|
+
hoverInfo = typeof info === 'string' ? info : String(info);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!hoverInfo) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
contents: {
|
|
74
|
+
kind: 'markdown',
|
|
75
|
+
value: hoverInfo,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.GraphQLFieldHoverProvider = GraphQLFieldHoverProvider;
|
|
85
|
+
//# sourceMappingURL=GraphQLFieldHoverProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphQLFieldHoverProvider.js","sourceRoot":"","sources":["../../../src/hover/providers/GraphQLFieldHoverProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,9 +22,7 @@ class AppGraphManager {
|
|
|
22
22
|
const rootUri = await this.findAppRootURI(anyUri);
|
|
23
23
|
if (!rootUri)
|
|
24
24
|
return;
|
|
25
|
-
|
|
26
|
-
if (!graph)
|
|
27
|
-
return;
|
|
25
|
+
// Delete existing graph to force rebuild
|
|
28
26
|
this.graphs.delete(rootUri);
|
|
29
27
|
await this.getAppGraphForURI(rootUri);
|
|
30
28
|
this.connection.sendNotification(types_1.AppGraphDidUpdateNotification.type, { uri: rootUri });
|
|
@@ -33,7 +31,8 @@ class AppGraphManager {
|
|
|
33
31
|
const { documentManager } = this;
|
|
34
32
|
await documentManager.preload(rootUri);
|
|
35
33
|
const dependencies = await this.graphDependencies(rootUri);
|
|
36
|
-
|
|
34
|
+
const graph = await (0, platformos_graph_1.buildAppGraph)(rootUri, dependencies, entryPoints);
|
|
35
|
+
return graph;
|
|
37
36
|
};
|
|
38
37
|
this.getSourceCode = async (uri) => {
|
|
39
38
|
const doc = this.documentManager.get(uri);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppGraphManager.js","sourceRoot":"","sources":["../../src/server/AppGraphManager.ts"],"names":[],"mappings":";;;AAEA,mEAOsC;AACtC,6EAAoD;AAEpD,2FAAkE;AAElE,oCAKkB;AAClB,oCAAoC;AAGpC,MAAa,eAAe;
|
|
1
|
+
{"version":3,"file":"AppGraphManager.js","sourceRoot":"","sources":["../../src/server/AppGraphManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CachedFileSystem = void 0;
|
|
4
4
|
class CachedFileSystem {
|
|
5
5
|
constructor(fs) {
|
|
6
|
-
this.readFile = cachedByUri(fs.readFile.bind(fs)
|
|
6
|
+
this.readFile = cachedByUri(fs.readFile.bind(fs),
|
|
7
|
+
// app/config.yml can change externally (e.g. vim) without a file watcher
|
|
8
|
+
// notification. Always read it fresh — it's small and rarely accessed.
|
|
9
|
+
(uri) => uri.endsWith('/app/config.yml'));
|
|
7
10
|
this.readDirectory = cachedByUri(fs.readDirectory.bind(fs));
|
|
8
11
|
this.stat = cachedByUri(fs.stat.bind(fs));
|
|
9
12
|
}
|
|
10
13
|
}
|
|
11
14
|
exports.CachedFileSystem = CachedFileSystem;
|
|
12
|
-
function cachedByUri(fn) {
|
|
15
|
+
function cachedByUri(fn, skipCache) {
|
|
13
16
|
const cache = new Map();
|
|
14
17
|
function cached(uri) {
|
|
18
|
+
if (skipCache?.(uri))
|
|
19
|
+
return fn(uri);
|
|
15
20
|
if (!cache.has(uri)) {
|
|
16
21
|
// I'm intentionally leaving this comment here for debugging purposes :)
|
|
17
22
|
// console.error('cache miss', fn.name, uri);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CachedFileSystem.js","sourceRoot":"","sources":["../../src/server/CachedFileSystem.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAK3B,YAAY,EAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"CachedFileSystem.js","sourceRoot":"","sources":["../../src/server/CachedFileSystem.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAK3B,YAAY,EAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,CACzB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,yEAAyE;QACzE,uEAAuE;QACvE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACzC,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AAfD,4CAeC;AAOD,SAAS,WAAW,CAClB,EAA+B,EAC/B,SAAoC;IAEpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5C,SAAS,MAAM,CAAC,GAAW;QACzB,IAAI,SAAS,EAAE,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,wEAAwE;YACxE,6CAA6C;YAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QAClC,wEAAwE;QACxE,mDAAmD;QACnD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -22,6 +22,7 @@ const RenameProvider_1 = require("../rename/RenameProvider");
|
|
|
22
22
|
const RenameHandler_1 = require("../renamed/RenameHandler");
|
|
23
23
|
const types_1 = require("../types");
|
|
24
24
|
const utils_1 = require("../utils");
|
|
25
|
+
const searchPaths_1 = require("../utils/searchPaths");
|
|
25
26
|
const version_1 = require("../version");
|
|
26
27
|
const CachedFileSystem_1 = require("./CachedFileSystem");
|
|
27
28
|
const Configuration_1 = require("./Configuration");
|
|
@@ -30,6 +31,12 @@ const AppGraphManager_1 = require("./AppGraphManager");
|
|
|
30
31
|
const platformos_common_2 = require("@platformos/platformos-common");
|
|
31
32
|
const vscode_uri_1 = require("vscode-uri");
|
|
32
33
|
const defaultLogger = () => { };
|
|
34
|
+
/**
|
|
35
|
+
* When a file-watcher batch contains this many page-file changes, we
|
|
36
|
+
* assume a bulk operation (git checkout, branch switch, stash pop) and
|
|
37
|
+
* fully rebuild the route table instead of applying incremental updates.
|
|
38
|
+
*/
|
|
39
|
+
const BULK_PAGE_CHANGE_THRESHOLD = 10;
|
|
33
40
|
/**
|
|
34
41
|
* The `git:` VFS does not support the `fs.readDirectory` call and makes most things break.
|
|
35
42
|
* `git` URIs are the ones you'd encounter when doing a git diff in VS Code. They're not
|
|
@@ -65,7 +72,8 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
65
72
|
const diagnosticsManager = new diagnostics_1.DiagnosticsManager(connection);
|
|
66
73
|
const documentsLocator = new platformos_common_2.DocumentsLocator(fs);
|
|
67
74
|
const translationProvider = new platformos_common_1.TranslationProvider(fs);
|
|
68
|
-
const
|
|
75
|
+
const searchPathsCache = new searchPaths_1.SearchPathsLoader(fs);
|
|
76
|
+
const documentLinksProvider = new documentLinks_1.DocumentLinksProvider(documentManager, findAppRootURI, documentsLocator, translationProvider, searchPathsCache);
|
|
69
77
|
const codeActionsProvider = new codeActions_1.CodeActionsProvider(documentManager, diagnosticsManager);
|
|
70
78
|
const onTypeFormattingProvider = new formatting_1.OnTypeFormattingProvider(documentManager, async function setCursorPosition(textDocument, position) {
|
|
71
79
|
if (!clientCapabilities.hasShowDocumentSupport)
|
|
@@ -99,6 +107,7 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
99
107
|
jsonValidationSet,
|
|
100
108
|
appGraphManager,
|
|
101
109
|
includeFilesFromDisk: () => configuration[Configuration_1.INCLUDE_FILES_FROM_DISK],
|
|
110
|
+
getRouteTable: () => definitionsProvider.getRouteTable(),
|
|
102
111
|
}), 100);
|
|
103
112
|
// In platformOS, there are no built-in system translations. User-defined translations
|
|
104
113
|
// are resolved via TranslationProvider at the point of lookup.
|
|
@@ -137,7 +146,7 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
137
146
|
return null;
|
|
138
147
|
return documentManager.get(defaultLocaleFileUri) ?? null;
|
|
139
148
|
}
|
|
140
|
-
const definitionsProvider = new DefinitionProvider_1.DefinitionProvider(documentManager, getDefaultLocaleSourceCode);
|
|
149
|
+
const definitionsProvider = new DefinitionProvider_1.DefinitionProvider(documentManager, getDefaultLocaleSourceCode, fs, findAppRootURI, documentsLocator, searchPathsCache);
|
|
141
150
|
const jsonLanguageService = new JSONLanguageService_1.JSONLanguageService(documentManager, jsonValidationSet);
|
|
142
151
|
const cssLanguageService = new CSSLanguageService_1.CSSLanguageService(documentManager);
|
|
143
152
|
const completionsProvider = new completions_1.CompletionsProvider({
|
|
@@ -243,6 +252,9 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
243
252
|
{
|
|
244
253
|
globPattern: '**/*.css',
|
|
245
254
|
},
|
|
255
|
+
{
|
|
256
|
+
globPattern: '**/app/config.yml',
|
|
257
|
+
},
|
|
246
258
|
],
|
|
247
259
|
});
|
|
248
260
|
});
|
|
@@ -287,7 +299,11 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
287
299
|
cssLanguageService.change(uri, params.contentChanges[0].text, version);
|
|
288
300
|
return;
|
|
289
301
|
}
|
|
290
|
-
|
|
302
|
+
const text = params.contentChanges[0].text;
|
|
303
|
+
documentManager.change(uri, text, version);
|
|
304
|
+
if ((0, platformos_common_1.isPage)(uri)) {
|
|
305
|
+
definitionsProvider.onPageFileChanged(uri, text);
|
|
306
|
+
}
|
|
291
307
|
if (await configuration.shouldCheckOnChange()) {
|
|
292
308
|
runChecks([uri]);
|
|
293
309
|
}
|
|
@@ -300,6 +316,13 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
300
316
|
if (hasUnsupportedDocument(params))
|
|
301
317
|
return;
|
|
302
318
|
const { uri } = params.textDocument;
|
|
319
|
+
// onDidChangeWatchedFiles also fires for in-editor saves, but it arrives after
|
|
320
|
+
// onDidSaveTextDocument. Invalidate the search-paths cache here immediately so
|
|
321
|
+
// that go-to-definition requests triggered by the same save don't see stale data
|
|
322
|
+
// while waiting for the file-watcher notification.
|
|
323
|
+
if (uri.endsWith('/app/config.yml')) {
|
|
324
|
+
searchPathsCache.invalidate();
|
|
325
|
+
}
|
|
303
326
|
if (await configuration.shouldCheckOnSave()) {
|
|
304
327
|
runChecks([uri]);
|
|
305
328
|
}
|
|
@@ -418,6 +441,14 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
418
441
|
if (params.changes.length === 0)
|
|
419
442
|
return;
|
|
420
443
|
const triggerUris = params.changes.map((change) => change.uri);
|
|
444
|
+
// When many page files change at once (e.g., git checkout, branch switch, stash pop),
|
|
445
|
+
// incremental updates aren't reliable — files not open in the editor won't get
|
|
446
|
+
// individual onDidChangeTextDocument events. VS Code reports branch-switch changes
|
|
447
|
+
// as FileChangeType.Changed, so we count all change types.
|
|
448
|
+
const bulkPageChanges = params.changes.filter((c) => (0, platformos_common_1.isPage)(c.uri));
|
|
449
|
+
if (bulkPageChanges.length >= BULK_PAGE_CHANGE_THRESHOLD) {
|
|
450
|
+
definitionsProvider.invalidateRouteTable();
|
|
451
|
+
}
|
|
421
452
|
const updates = [];
|
|
422
453
|
for (const change of params.changes) {
|
|
423
454
|
// App Check config changes should clear the config cache
|
|
@@ -425,6 +456,19 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
425
456
|
loadConfig.clearCache();
|
|
426
457
|
continue;
|
|
427
458
|
}
|
|
459
|
+
// app/config.yml changes should clear expanded search paths cache
|
|
460
|
+
// and force re-check of all open documents.
|
|
461
|
+
// Note: readFile for config.yml bypasses the CachedFileSystem cache,
|
|
462
|
+
// so we don't need to invalidate it — reads are always fresh.
|
|
463
|
+
if (change.uri.endsWith('/app/config.yml')) {
|
|
464
|
+
documentsLocator.clearExpandedPathsCache();
|
|
465
|
+
searchPathsCache.invalidate();
|
|
466
|
+
// Ensure open liquid files are re-checked with the new search paths
|
|
467
|
+
for (const doc of documentManager.openDocuments) {
|
|
468
|
+
triggerUris.push(doc.uri);
|
|
469
|
+
}
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
428
472
|
// Rename cache invalidation is handled by onDidRenameFiles
|
|
429
473
|
if (documentManager.hasRecentRename(change.uri)) {
|
|
430
474
|
documentManager.clearRecentRename(change.uri);
|
|
@@ -438,7 +482,13 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
438
482
|
fs.stat.invalidate(change.uri);
|
|
439
483
|
appGraphManager.create(change.uri);
|
|
440
484
|
// If a file is created under out feet, we update its contents.
|
|
441
|
-
updates.push(documentManager.changeFromDisk(change.uri))
|
|
485
|
+
updates.push(documentManager.changeFromDisk(change.uri).then(() => {
|
|
486
|
+
if ((0, platformos_common_1.isPage)(change.uri)) {
|
|
487
|
+
const doc = documentManager.get(change.uri);
|
|
488
|
+
if (doc)
|
|
489
|
+
definitionsProvider.onPageFileChanged(change.uri, doc.source);
|
|
490
|
+
}
|
|
491
|
+
}));
|
|
442
492
|
break;
|
|
443
493
|
case vscode_languageserver_1.FileChangeType.Changed:
|
|
444
494
|
// A changed file invalidates readFile and stat (but not readDirectory)
|
|
@@ -449,7 +499,21 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
449
499
|
// If it is open, then we don't need to update it because the document manager
|
|
450
500
|
// will have the version from the editor.
|
|
451
501
|
if (documentManager.get(change.uri)?.version === undefined) {
|
|
452
|
-
updates.push(documentManager.changeFromDisk(change.uri))
|
|
502
|
+
updates.push(documentManager.changeFromDisk(change.uri).then(() => {
|
|
503
|
+
if ((0, platformos_common_1.isPage)(change.uri)) {
|
|
504
|
+
const doc = documentManager.get(change.uri);
|
|
505
|
+
if (doc)
|
|
506
|
+
definitionsProvider.onPageFileChanged(change.uri, doc.source);
|
|
507
|
+
}
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
else if ((0, platformos_common_1.isPage)(change.uri)) {
|
|
511
|
+
// File is open in editor but changed externally (e.g. git checkout).
|
|
512
|
+
// The doc manager already has the editor version, but the route table
|
|
513
|
+
// may be stale — update it from whatever the doc manager holds.
|
|
514
|
+
const doc = documentManager.get(change.uri);
|
|
515
|
+
if (doc)
|
|
516
|
+
definitionsProvider.onPageFileChanged(change.uri, doc.source);
|
|
453
517
|
}
|
|
454
518
|
break;
|
|
455
519
|
case vscode_languageserver_1.FileChangeType.Deleted:
|
|
@@ -458,6 +522,8 @@ function startServer(connection, { fs: injectedFs, loadConfig: injectedLoadConfi
|
|
|
458
522
|
fs.readFile.invalidate(change.uri);
|
|
459
523
|
fs.stat.invalidate(change.uri);
|
|
460
524
|
appGraphManager.delete(change.uri);
|
|
525
|
+
if ((0, platformos_common_1.isPage)(change.uri))
|
|
526
|
+
definitionsProvider.onPageFileDeleted(change.uri);
|
|
461
527
|
// If a file is deleted, it's removed from the document manager
|
|
462
528
|
documentManager.delete(change.uri);
|
|
463
529
|
break;
|