@platformos/platformos-language-server-common 0.0.6 → 0.0.8

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.
Files changed (247) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/PropertyShapeInference.d.ts +18 -0
  3. package/dist/PropertyShapeInference.js +58 -0
  4. package/dist/PropertyShapeInference.js.map +1 -1
  5. package/dist/TypeSystem.d.ts +4 -9
  6. package/dist/TypeSystem.js +234 -388
  7. package/dist/TypeSystem.js.map +1 -1
  8. package/dist/completions/CompletionsProvider.d.ts +6 -10
  9. package/dist/completions/CompletionsProvider.js +6 -9
  10. package/dist/completions/CompletionsProvider.js.map +1 -1
  11. package/dist/completions/params/LiquidCompletionParams.js +4 -16
  12. package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
  13. package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
  14. package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
  15. package/dist/completions/providers/FilterCompletionProvider.js.map +1 -1
  16. package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
  17. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
  18. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
  19. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
  20. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
  21. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
  22. package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
  23. package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
  24. package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
  25. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
  26. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
  27. package/dist/completions/providers/TranslationCompletionProvider.js +1 -1
  28. package/dist/completions/providers/TranslationCompletionProvider.js.map +1 -1
  29. package/dist/completions/providers/index.d.ts +0 -3
  30. package/dist/completions/providers/index.js +1 -7
  31. package/dist/completions/providers/index.js.map +1 -1
  32. package/dist/css/CSSLanguageService.d.ts +19 -5
  33. package/dist/css/CSSLanguageService.js +77 -63
  34. package/dist/css/CSSLanguageService.js.map +1 -1
  35. package/dist/definitions/DefinitionProvider.d.ts +1 -1
  36. package/dist/definitions/DefinitionProvider.js +1 -3
  37. package/dist/definitions/DefinitionProvider.js.map +1 -1
  38. package/dist/diagnostics/offenseToDiagnostic.js +1 -1
  39. package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
  40. package/dist/diagnostics/runChecks.d.ts +3 -5
  41. package/dist/diagnostics/runChecks.js +12 -64
  42. package/dist/diagnostics/runChecks.js.map +1 -1
  43. package/dist/docset/MarkdownRenderer.js +1 -1
  44. package/dist/docset/MarkdownRenderer.js.map +1 -1
  45. package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.d.ts +1 -1
  46. package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
  47. package/dist/documentLinks/DocumentLinksProvider.js +3 -3
  48. package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
  49. package/dist/documents/DocumentManager.d.ts +4 -5
  50. package/dist/documents/DocumentManager.js +12 -11
  51. package/dist/documents/DocumentManager.js.map +1 -1
  52. package/dist/documents/types.d.ts +16 -3
  53. package/dist/documents/types.js +3 -3
  54. package/dist/documents/types.js.map +1 -1
  55. package/dist/formatting/OnTypeFormattingProvider.d.ts +1 -1
  56. package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.js.map +1 -1
  57. package/dist/hover/HoverProvider.d.ts +5 -8
  58. package/dist/hover/HoverProvider.js +8 -14
  59. package/dist/hover/HoverProvider.js.map +1 -1
  60. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.d.ts +3 -3
  61. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js +3 -3
  62. package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js.map +1 -1
  63. package/dist/hover/providers/LiquidFilterHoverProvider.d.ts +3 -3
  64. package/dist/hover/providers/LiquidFilterHoverProvider.js +3 -3
  65. package/dist/hover/providers/LiquidFilterHoverProvider.js.map +1 -1
  66. package/dist/hover/providers/LiquidTagHoverProvider.d.ts +3 -3
  67. package/dist/hover/providers/LiquidTagHoverProvider.js +3 -3
  68. package/dist/hover/providers/LiquidTagHoverProvider.js.map +1 -1
  69. package/dist/hover/providers/RenderPartialHoverProvider.js +1 -1
  70. package/dist/hover/providers/RenderPartialHoverProvider.js.map +1 -1
  71. package/dist/hover/providers/RenderPartialParameterHoverProvider.js +1 -1
  72. package/dist/hover/providers/RenderPartialParameterHoverProvider.js.map +1 -1
  73. package/dist/hover/providers/TranslationHoverProvider.d.ts +3 -3
  74. package/dist/hover/providers/TranslationHoverProvider.js +3 -3
  75. package/dist/hover/providers/TranslationHoverProvider.js.map +1 -1
  76. package/dist/index.d.ts +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/internal-types.d.ts +1 -1
  79. package/dist/json/JSONContributions.d.ts +1 -5
  80. package/dist/json/JSONContributions.js +4 -36
  81. package/dist/json/JSONContributions.js.map +1 -1
  82. package/dist/json/JSONLanguageService.d.ts +4 -12
  83. package/dist/json/JSONLanguageService.js +17 -80
  84. package/dist/json/JSONLanguageService.js.map +1 -1
  85. package/dist/json/test/test-helpers.d.ts +1 -3
  86. package/dist/json/test/test-helpers.js +3 -19
  87. package/dist/json/test/test-helpers.js.map +1 -1
  88. package/dist/json/utils.d.ts +0 -5
  89. package/dist/json/utils.js +0 -24
  90. package/dist/json/utils.js.map +1 -1
  91. package/dist/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.d.ts +1 -1
  92. package/dist/progress.js.map +1 -1
  93. package/dist/rename/RenameProvider.d.ts +2 -2
  94. package/dist/rename/RenameProvider.js +2 -2
  95. package/dist/rename/RenameProvider.js.map +1 -1
  96. package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
  97. package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
  98. package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
  99. package/dist/renamed/RenameHandler.d.ts +2 -3
  100. package/dist/renamed/RenameHandler.js +3 -8
  101. package/dist/renamed/RenameHandler.js.map +1 -1
  102. package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
  103. package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
  104. package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
  105. package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
  106. package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
  107. package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
  108. package/dist/renamed/handlers/utils.d.ts +1 -1
  109. package/dist/server/AppGraphManager.d.ts +32 -0
  110. package/dist/server/AppGraphManager.js +155 -0
  111. package/dist/server/AppGraphManager.js.map +1 -0
  112. package/dist/server/Configuration.js.map +1 -1
  113. package/dist/server/startServer.d.ts +2 -2
  114. package/dist/server/startServer.js +62 -164
  115. package/dist/server/startServer.js.map +1 -1
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/dist/types.d.ts +33 -54
  118. package/dist/types.js +21 -26
  119. package/dist/types.js.map +1 -1
  120. package/dist/utils/liquidDoc.js +1 -1
  121. package/dist/utils/liquidDoc.js.map +1 -1
  122. package/dist/utils/uri.d.ts +0 -8
  123. package/dist/utils/uri.js +1 -17
  124. package/dist/utils/uri.js.map +1 -1
  125. package/package.json +9 -9
  126. package/src/PropertyShapeInference.ts +76 -1
  127. package/src/TypeSystem.spec.ts +187 -452
  128. package/src/TypeSystem.ts +253 -459
  129. package/src/completions/CompletionsProvider.ts +13 -34
  130. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  131. package/src/completions/params/LiquidCompletionParams.ts +4 -14
  132. package/src/completions/params/fix.spec.ts +0 -3
  133. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  134. package/src/completions/providers/FilterCompletionProvider.ts +6 -6
  135. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  136. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  137. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  138. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  139. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  140. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  141. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  142. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  143. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
  144. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  145. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  146. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  147. package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
  148. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
  149. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
  150. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  151. package/src/completions/providers/TranslationCompletionProvider.ts +1 -1
  152. package/src/completions/providers/index.ts +0 -3
  153. package/src/css/CSSLanguageService.ts +97 -81
  154. package/src/definitions/DefinitionProvider.ts +0 -6
  155. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  156. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  157. package/src/diagnostics/runChecks.spec.ts +16 -24
  158. package/src/diagnostics/runChecks.ts +17 -91
  159. package/src/docset/MarkdownRenderer.ts +1 -1
  160. package/src/documentLinks/DocumentLinksProvider.ts +3 -3
  161. package/src/documents/DocumentManager.spec.ts +12 -97
  162. package/src/documents/DocumentManager.ts +13 -14
  163. package/src/documents/types.ts +18 -9
  164. package/src/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.ts +1 -3
  165. package/src/hover/HoverProvider.ts +9 -21
  166. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  167. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  168. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
  170. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  171. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  172. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  173. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  174. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  175. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  176. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  177. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  178. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
  179. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  180. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
  181. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
  182. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  183. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  184. package/src/index.ts +2 -5
  185. package/src/internal-types.ts +1 -1
  186. package/src/json/JSONContributions.ts +4 -61
  187. package/src/json/JSONLanguageService.ts +19 -117
  188. package/src/json/test/test-helpers.ts +4 -35
  189. package/src/json/utils.ts +0 -27
  190. package/src/progress.ts +4 -1
  191. package/src/rename/RenameProvider.ts +3 -3
  192. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
  193. package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
  194. package/src/renamed/RenameHandler.ts +4 -9
  195. package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
  196. package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
  197. package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
  198. package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
  199. package/src/renamed/handlers/utils.ts +1 -1
  200. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  201. package/src/server/Configuration.ts +4 -1
  202. package/src/server/startServer.spec.ts +7 -9
  203. package/src/server/startServer.ts +65 -217
  204. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  205. package/src/types.ts +33 -63
  206. package/src/utils/liquidDoc.ts +1 -1
  207. package/src/utils/uri.ts +0 -14
  208. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  209. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  210. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  211. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  212. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  213. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  214. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  215. package/src/css/CSSLanguageService.spec.ts +0 -161
  216. package/src/css/test/test-helpers.ts +0 -30
  217. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  218. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  219. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  220. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  221. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  222. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  223. package/src/json/JSONLanguageService.spec.ts +0 -424
  224. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  225. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  226. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  227. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  228. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  229. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  230. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  231. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  232. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  233. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  234. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  235. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  236. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  237. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  238. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  239. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  240. package/src/json/schemaSettings.spec.ts +0 -103
  241. package/src/json/schemaSettings.ts +0 -53
  242. package/src/plugins/css.ts +0 -12
  243. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  244. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  245. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  246. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  247. package/src/settings/index.ts +0 -50
@@ -1,113 +1,129 @@
1
- import { LiquidRawTag, NodeTypes } from '@platformos/liquid-html-parser';
2
- import { Mode, Modes, SourceCodeType, findCurrentNode } from '@platformos/platformos-check-common';
3
- import { LanguageService, Stylesheet, getCSSLanguageService } from 'vscode-css-languageservice';
1
+ import { getCSSLanguageService, LanguageService } from 'vscode-css-languageservice';
2
+ import {
3
+ HtmlRawNode,
4
+ LiquidHtmlNode,
5
+ NodeTypes,
6
+ RawMarkupKinds,
7
+ walk,
8
+ } from '@platformos/liquid-html-parser';
9
+ import { isError, SourceCodeType } from '@platformos/platformos-check-common';
4
10
  import {
5
11
  CompletionItem,
6
12
  CompletionList,
7
13
  CompletionParams,
8
- Diagnostic,
9
- DocumentDiagnosticParams,
10
14
  Hover,
11
15
  HoverParams,
12
16
  ClientCapabilities as LSPClientCapabilities,
17
+ Position,
13
18
  } from 'vscode-languageserver';
14
19
  import { TextDocument } from 'vscode-languageserver-textdocument';
15
20
  import { DocumentManager } from '../documents';
16
21
 
17
22
  export class CSSLanguageService {
18
23
  private service: LanguageService | null = null;
24
+ // Standalone .css files — managed independently of DocumentManager
25
+ private cssDocuments: Map<string, TextDocument> = new Map();
19
26
 
20
27
  constructor(private documentManager: DocumentManager) {}
21
28
 
22
- async setup(clientCapabilities: LSPClientCapabilities) {
23
- this.service = getCSSLanguageService({
24
- clientCapabilities,
25
- });
29
+ setup(clientCapabilities: LSPClientCapabilities) {
30
+ this.service = getCSSLanguageService({ clientCapabilities });
26
31
  }
27
32
 
28
- async completions(params: CompletionParams): Promise<null | CompletionList | CompletionItem[]> {
29
- const service = this.service;
30
- if (!service) return null;
31
- const documents = this.getDocuments(params, service);
32
- if (!documents) return null;
33
- const [stylesheetTextDocument, stylesheetDocument] = documents;
34
- return service.doComplete(stylesheetTextDocument, params.position, stylesheetDocument);
33
+ open(uri: string, source: string, version: number) {
34
+ this.cssDocuments.set(uri, TextDocument.create(uri, 'css', version, source));
35
+ }
36
+
37
+ change(uri: string, source: string, version: number) {
38
+ const existing = this.cssDocuments.get(uri);
39
+ if (existing) {
40
+ this.cssDocuments.set(uri, TextDocument.update(existing, [{ text: source }], version));
41
+ } else {
42
+ this.open(uri, source, version);
43
+ }
35
44
  }
36
45
 
37
- async diagnostics(params: DocumentDiagnosticParams): Promise<Diagnostic[]> {
46
+ close(uri: string) {
47
+ this.cssDocuments.delete(uri);
48
+ }
49
+
50
+ async completions(params: CompletionParams): Promise<CompletionList | CompletionItem[] | null> {
38
51
  const service = this.service;
39
- if (!service) return [];
40
- const documents = this.getDocuments(params, service);
41
- if (!documents) return [];
42
- const [stylesheetTextDocument, stylesheetDocument] = documents;
43
- return service.doValidation(stylesheetTextDocument, stylesheetDocument);
52
+ if (!service) return null;
53
+
54
+ const uri = params.textDocument.uri;
55
+
56
+ if (uri.endsWith('.css')) {
57
+ const textDoc = this.cssDocuments.get(uri);
58
+ if (!textDoc) return null;
59
+ const stylesheet = service.parseStylesheet(textDoc);
60
+ return service.doComplete(textDoc, params.position, stylesheet);
61
+ }
62
+
63
+ const embedded = this.findEmbeddedCSS(uri, params.position);
64
+ if (!embedded) return null;
65
+ const stylesheet = service.parseStylesheet(embedded.virtualDoc);
66
+ return service.doComplete(embedded.virtualDoc, params.position, stylesheet);
44
67
  }
45
68
 
46
69
  async hover(params: HoverParams): Promise<Hover | null> {
47
70
  const service = this.service;
48
71
  if (!service) return null;
49
- const documents = this.getDocuments(params, service);
50
- if (!documents) return null;
51
- const [stylesheetTextDocument, stylesheetDocument] = documents;
52
- return service.doHover(stylesheetTextDocument, params.position, stylesheetDocument);
72
+
73
+ const uri = params.textDocument.uri;
74
+
75
+ if (uri.endsWith('.css')) {
76
+ const textDoc = this.cssDocuments.get(uri);
77
+ if (!textDoc) return null;
78
+ const stylesheet = service.parseStylesheet(textDoc);
79
+ return service.doHover(textDoc, params.position, stylesheet);
80
+ }
81
+
82
+ const embedded = this.findEmbeddedCSS(uri, params.position);
83
+ if (!embedded) return null;
84
+ const stylesheet = service.parseStylesheet(embedded.virtualDoc);
85
+ return service.doHover(embedded.virtualDoc, params.position, stylesheet);
53
86
  }
54
87
 
55
- private getDocuments(
56
- params: HoverParams | CompletionParams | DocumentDiagnosticParams,
57
- service: LanguageService,
58
- ): [TextDocument, Stylesheet] | null {
59
- const document = this.documentManager.get(params.textDocument.uri);
60
- if (!document) return null;
61
-
62
- switch (document.type) {
63
- case SourceCodeType.GraphQL:
64
- case SourceCodeType.JSON: {
65
- return null;
66
- }
67
- case SourceCodeType.LiquidHtml: {
68
- if (document.ast instanceof Error) return null;
69
- const textDocument = document.textDocument;
70
- let offset = 0;
71
- let isDiagnostics = false;
72
- if ('position' in params && params.position.line !== 0 && params.position.character !== 0) {
73
- offset = textDocument.offsetAt(params.position);
74
- } else {
75
- const stylesheetIndex = document.source.indexOf('{% stylesheet %}');
76
- offset = stylesheetIndex;
77
- isDiagnostics = true;
78
- }
79
- const [node, ancestors] = findCurrentNode(document.ast, offset);
80
- let stylesheetTag = [...ancestors].find(
81
- (node): node is LiquidRawTag =>
82
- node.type === NodeTypes.LiquidRawTag && node.name === 'stylesheet',
83
- );
84
- if (isDiagnostics && 'children' in node && node.children) {
85
- stylesheetTag = node.children.find(
86
- (node): node is LiquidRawTag =>
87
- node.type === NodeTypes.LiquidRawTag && node.name === 'stylesheet',
88
- );
89
- }
88
+ /**
89
+ * Finds the <style> block under the cursor in a .liquid file and builds a
90
+ * virtual CSS TextDocument whose line numbers align with the parent document.
91
+ *
92
+ * Strategy: prefix body.value with N newlines where N equals the line number
93
+ * of blockStartPosition.end. This keeps line numbers in sync so the same LSP
94
+ * Position can be passed directly to the CSS service.
95
+ *
96
+ * Note: character offsets are only accurate when <style> is on its own line
97
+ * (the typical case). Inline `<style>css</style>` is not handled perfectly.
98
+ */
99
+ private findEmbeddedCSS(uri: string, position: Position): { virtualDoc: TextDocument } | null {
100
+ const document = this.documentManager.get(uri);
101
+ if (!document || document.type !== SourceCodeType.LiquidHtml) return null;
102
+ if (isError(document.ast)) return null;
90
103
 
91
- if (!stylesheetTag) return null;
92
-
93
- const schemaLineNumber = textDocument.positionAt(stylesheetTag.blockStartPosition.end).line;
94
- // Hacking away "same line numbers" here by prefixing the file with newlines
95
- // This way params.position will be at the same line number in this fake jsonTextDocument
96
- // Which means that the completions will be at the same line number in the Liquid document
97
- const stylesheetString =
98
- Array(schemaLineNumber).fill('\n').join('') +
99
- stylesheetTag.source
100
- .slice(stylesheetTag.blockStartPosition.end, stylesheetTag.blockEndPosition.start)
101
- .replace(/\n$/, ''); // Remove trailing newline so parsing errors don't show up on `{% endstylesheet %}`
102
- const stylesheetTextDocument = TextDocument.create(
103
- textDocument.uri,
104
- 'json',
105
- textDocument.version,
106
- stylesheetString,
107
- );
108
- const stylesheetDocument = service.parseStylesheet(stylesheetTextDocument);
109
- return [stylesheetTextDocument, stylesheetDocument];
104
+ const offset = document.textDocument.offsetAt(position);
105
+
106
+ let foundNode: HtmlRawNode | null = null;
107
+ walk(document.ast as LiquidHtmlNode, (node) => {
108
+ if (node.type === NodeTypes.HtmlRawNode) {
109
+ const rawNode = node as HtmlRawNode;
110
+ if (
111
+ rawNode.body.kind === RawMarkupKinds.css &&
112
+ rawNode.blockStartPosition.end <= offset &&
113
+ offset <= rawNode.blockEndPosition.start
114
+ ) {
115
+ foundNode = rawNode;
116
+ }
110
117
  }
111
- }
118
+ });
119
+
120
+ if (!foundNode) return null;
121
+
122
+ const node = foundNode as HtmlRawNode;
123
+ const bodyStartPos = document.textDocument.positionAt(node.blockStartPosition.end);
124
+ const prefix = '\n'.repeat(bodyStartPos.line);
125
+ const virtualDoc = TextDocument.create(uri + '#style', 'css', 0, prefix + node.body.value);
126
+
127
+ return { virtualDoc };
112
128
  }
113
129
  }
@@ -3,7 +3,6 @@ import { DefinitionLink, DefinitionParams } from 'vscode-languageserver';
3
3
 
4
4
  import { AugmentedJsonSourceCode, DocumentManager } from '../documents';
5
5
  import { BaseDefinitionProvider } from './BaseDefinitionProvider';
6
- import { SchemaTranslationStringDefinitionProvider } from './providers/SchemaTranslationStringDefinitionProvider';
7
6
  import { TranslationStringDefinitionProvider } from './providers/TranslationStringDefinitionProvider';
8
7
 
9
8
  export class DefinitionProvider {
@@ -12,14 +11,9 @@ export class DefinitionProvider {
12
11
  constructor(
13
12
  private documentManager: DocumentManager,
14
13
  getDefaultLocaleSourceCode: (uri: string) => Promise<AugmentedJsonSourceCode | null>,
15
- getDefaultSchemaLocaleSourceCode: (uri: string) => Promise<AugmentedJsonSourceCode | null>,
16
14
  ) {
17
15
  this.providers = [
18
16
  new TranslationStringDefinitionProvider(documentManager, getDefaultLocaleSourceCode),
19
- new SchemaTranslationStringDefinitionProvider(
20
- documentManager,
21
- getDefaultSchemaLocaleSourceCode,
22
- ),
23
17
  ];
24
18
  }
25
19
 
@@ -33,11 +33,7 @@ describe('Module: TranslationStringDefinitionProvider', () => {
33
33
  };
34
34
  };
35
35
 
36
- provider = new DefinitionProvider(
37
- documentManager,
38
- mockGetDefaultLocaleSourceCode,
39
- async () => null,
40
- );
36
+ provider = new DefinitionProvider(documentManager, mockGetDefaultLocaleSourceCode);
41
37
  });
42
38
 
43
39
  it('finds the definition of existing translation keys', async () => {
@@ -20,7 +20,7 @@ export function offenseToDiagnostic(offense: Offense): Diagnostic {
20
20
  offense.message,
21
21
  diagnosticSeverity(offense),
22
22
  offense.check,
23
- 'theme-check',
23
+ 'platformos-check',
24
24
  );
25
25
 
26
26
  const url = checkToDocsUrl[offense.check];
@@ -45,7 +45,7 @@ describe('Module: runChecks', () => {
45
45
  let connection: { sendDiagnostics: ReturnType<typeof vi.fn> };
46
46
  let runChecks: ReturnType<typeof makeRunChecks>;
47
47
  let fs: MockFileSystem;
48
- const rootUri = path.normalize('browser:///theme');
48
+ const rootUri = path.normalize('browser:///app');
49
49
  const fileUri = path.join(rootUri, 'app', 'input.liquid');
50
50
 
51
51
  beforeEach(() => {
@@ -67,18 +67,16 @@ describe('Module: runChecks', () => {
67
67
  runChecks = makeRunChecks(documentManager, diagnosticsManager, {
68
68
  fs,
69
69
  loadConfig: async () => ({
70
- context: 'theme' as const,
71
70
  settings: {},
72
71
  checks: [LiquidFilter],
73
72
  rootUri,
74
73
  }),
75
- themeDocset: {
74
+ platformosDocset: {
76
75
  graphQL: async () => null,
77
76
  filters: async () => [],
78
77
  objects: async () => [],
79
78
  liquidDrops: async () => [],
80
79
  tags: async () => [],
81
- systemTranslations: async () => ({}),
82
80
  },
83
81
  jsonValidationSet: {
84
82
  schemas: async () => [],
@@ -98,7 +96,7 @@ describe('Module: runChecks', () => {
98
96
  version: fileVersion,
99
97
  diagnostics: [
100
98
  {
101
- source: 'theme-check',
99
+ source: 'platformos-check',
102
100
  code: 'LiquidFilter',
103
101
  message: 'Liquid filter can not be used',
104
102
  severity: 1,
@@ -147,7 +145,7 @@ describe('Module: runChecks', () => {
147
145
  fileVersion: 0,
148
146
  diagnostics: [
149
147
  {
150
- source: 'theme-check',
148
+ source: 'platformos-check',
151
149
  code: 'LiquidFilter',
152
150
  message: 'Liquid filter can not be used',
153
151
  severity: 1,
@@ -171,7 +169,7 @@ describe('Module: runChecks', () => {
171
169
  fileVersion: 0,
172
170
  diagnostics: [
173
171
  {
174
- source: 'theme-check',
172
+ source: 'platformos-check',
175
173
  code: 'LiquidFilter',
176
174
  message: 'Liquid filter can not be used',
177
175
  severity: 1,
@@ -206,17 +204,17 @@ describe('Module: runChecks', () => {
206
204
  });
207
205
 
208
206
  it('should use the contents of the default translations file buffer (if any) instead of the result of the factory', async () => {
209
- const defaultPath = 'locales/en.default.json';
207
+ const defaultPath = 'app/translations/en.yml';
210
208
  const defaultURI = path.join(rootUri, ...defaultPath.split('/'));
211
- const frPath = 'locales/fr.json';
209
+ const frPath = 'app/translations/fr.yml';
212
210
  const frURI = path.join(rootUri, ...frPath.split('/'));
213
211
  const files = {
214
212
  '.pos': '',
215
213
  'app/test': '',
216
214
  '.git/test': 'test',
217
215
  'modules/test': 'test',
218
- [defaultPath]: JSON.stringify({ hello: 'hello' }),
219
- [frPath]: JSON.stringify({ hello: 'bonjour', hi: 'salut' }),
216
+ [defaultPath]: 'en:\n hello: hello',
217
+ [frPath]: 'fr:\n hello: bonjour\n hi: salut',
220
218
  };
221
219
 
222
220
  const matchingTranslation = allChecks.filter((c) => c.meta.code === 'MatchingTranslations');
@@ -224,18 +222,16 @@ describe('Module: runChecks', () => {
224
222
  runChecks = makeRunChecks(documentManager, diagnosticsManager, {
225
223
  fs: new MockFileSystem(files, rootUri),
226
224
  loadConfig: async () => ({
227
- context: 'theme',
228
225
  settings: {},
229
226
  checks: matchingTranslation,
230
227
  rootUri: rootUri,
231
228
  }),
232
- themeDocset: {
229
+ platformosDocset: {
233
230
  graphQL: async () => null,
234
231
  filters: async () => [],
235
232
  objects: async () => [],
236
233
  liquidDrops: async () => [],
237
234
  tags: async () => [],
238
- systemTranslations: async () => ({}),
239
235
  },
240
236
  jsonValidationSet: {
241
237
  schemas: async () => [],
@@ -251,20 +247,16 @@ describe('Module: runChecks', () => {
251
247
  version: 0,
252
248
  diagnostics: expect.arrayContaining([
253
249
  {
254
- source: 'theme-check',
250
+ source: 'platformos-check',
255
251
  code: 'MatchingTranslations',
256
252
  codeDescription: { href: expect.any(String) },
257
253
  message: `A default translation for 'hi' does not exist`,
258
254
  severity: 1,
259
255
  range: {
260
- end: {
261
- character: 31,
262
- line: 0,
263
- },
264
- start: {
265
- character: 19,
266
- line: 0,
267
- },
256
+ // 'fr:\n hello: bonjour\n hi: salut'
257
+ // line 2 starts at offset 21, 'hi: salut' spans offsets 23-31
258
+ start: { line: 2, character: 2 },
259
+ end: { line: 2, character: 10 },
268
260
  },
269
261
  },
270
262
  ]),
@@ -273,7 +265,7 @@ describe('Module: runChecks', () => {
273
265
 
274
266
  // Change the contents of the defaultURI buffer, expect frURI to be fixed
275
267
  documentManager.open(defaultURI, files[defaultPath], 0);
276
- documentManager.change(defaultURI, JSON.stringify({ hello: 'hello', hi: 'hi' }), 1);
268
+ documentManager.change(defaultURI, 'en:\n hello: hello\n hi: hi', 1);
277
269
  connection.sendDiagnostics.mockClear();
278
270
  await runChecks([frURI]);
279
271
  expect(connection.sendDiagnostics).toHaveBeenCalledWith({
@@ -2,21 +2,15 @@ import {
2
2
  check,
3
3
  findRoot,
4
4
  makeFileExists,
5
- Offense,
6
5
  path,
7
6
  Reference,
8
- SectionSchema,
9
- Severity,
10
7
  SourceCodeType,
11
- ThemeBlockSchema,
12
8
  } from '@platformos/platformos-check-common';
13
9
 
14
- import { CSSLanguageService } from '../css/CSSLanguageService';
15
- import { AugmentedSourceCode, DocumentManager } from '../documents';
10
+ import { DocumentManager } from '../documents';
16
11
  import { Dependencies } from '../types';
17
12
  import { DiagnosticsManager } from './DiagnosticsManager';
18
- import { offenseSeverity } from './offenseToDiagnostic';
19
- import { ThemeGraphManager } from '../server/ThemeGraphManager';
13
+ import { AppGraphManager } from '../server/AppGraphManager';
20
14
 
21
15
  export function makeRunChecks(
22
16
  documentManager: DocumentManager,
@@ -24,18 +18,12 @@ export function makeRunChecks(
24
18
  {
25
19
  fs,
26
20
  loadConfig,
27
- themeDocset,
21
+ platformosDocset,
28
22
  jsonValidationSet,
29
- getMetafieldDefinitions,
30
- cssLanguageService,
31
- themeGraphManager,
23
+ appGraphManager,
32
24
  includeFilesFromDisk,
33
- }: Pick<
34
- Dependencies,
35
- 'fs' | 'loadConfig' | 'themeDocset' | 'jsonValidationSet' | 'getMetafieldDefinitions'
36
- > & {
37
- cssLanguageService?: CSSLanguageService;
38
- themeGraphManager?: ThemeGraphManager;
25
+ }: Pick<Dependencies, 'fs' | 'loadConfig' | 'platformosDocset' | 'jsonValidationSet'> & {
26
+ appGraphManager?: AppGraphManager;
39
27
  includeFilesFromDisk?: () => boolean;
40
28
  },
41
29
  ) {
@@ -45,10 +33,10 @@ export function makeRunChecks(
45
33
  // workspaces.
46
34
  //
47
35
  // e.g. if a user renames
48
- // theme1/snippets/a.liquid to
49
- // theme1/snippets/b.liquid
36
+ // app1/app/views/partials/a.liquid to
37
+ // app1/app/views/partials/b.liquid
50
38
  //
51
- // then we recheck theme1
39
+ // then we recheck app1
52
40
  const fileExists = makeFileExists(fs);
53
41
  const rootURIs = await Promise.all(triggerURIs.map((uri) => findRoot(uri, fileExists)));
54
42
  const deduplicatedRootURIs = new Set<string>(rootURIs.filter((x): x is string => !!x));
@@ -58,42 +46,16 @@ export function makeRunChecks(
58
46
 
59
47
  async function runChecksForRoot(configFileRootUri: string) {
60
48
  const config = await loadConfig(configFileRootUri, fs);
61
- const theme = documentManager.theme(config.rootUri, includeFilesFromDisk?.());
49
+ const app = documentManager.app(config.rootUri, includeFilesFromDisk?.());
62
50
 
63
- const cssOffenses = cssLanguageService
64
- ? await Promise.all(
65
- theme.map((sourceCode) => getCSSDiagnostics(cssLanguageService, sourceCode)),
66
- ).then((offenses) => offenses.flat())
67
- : [];
68
-
69
- const themeOffenses = await check(theme, config, {
51
+ const appOffenses = await check(app, config, {
70
52
  fs,
71
- themeDocset,
53
+ platformosDocset,
72
54
  jsonValidationSet,
73
- getMetafieldDefinitions,
74
55
 
75
56
  async getReferences(uri: string): Promise<Reference[]> {
76
- if (!themeGraphManager) return [];
77
- return themeGraphManager.getReferences(uri);
78
- },
79
-
80
- // TODO should do something for app blocks?
81
- async getBlockSchema(name) {
82
- // We won't preload here. If it's available, we'll give it. Otherwise expect nothing.
83
- const uri = path.join(config.rootUri, 'blocks', `${name}.liquid`);
84
- const doc = documentManager.get(uri);
85
- if (doc?.type !== SourceCodeType.LiquidHtml) return undefined;
86
- const schema = await doc.getSchema();
87
- return schema as ThemeBlockSchema | undefined;
88
- },
89
-
90
- async getSectionSchema(name) {
91
- // We won't preload here. If it's available, we'll give it. Otherwise expect nothing.
92
- const uri = path.join(config.rootUri, 'sections', `${name}.liquid`);
93
- const doc = documentManager.get(uri);
94
- if (doc?.type !== SourceCodeType.LiquidHtml) return undefined;
95
- const schema = await doc.getSchema();
96
- return schema as SectionSchema | undefined;
57
+ if (!appGraphManager) return [];
58
+ return appGraphManager.getReferences(uri);
97
59
  },
98
60
 
99
61
  async getDocDefinition(relativePath) {
@@ -103,50 +65,14 @@ export function makeRunChecks(
103
65
  return doc.getLiquidDoc();
104
66
  },
105
67
  });
106
- const offenses = [...themeOffenses, ...cssOffenses];
107
68
 
108
- // We iterate over the theme files (as opposed to offenses) because if
69
+ // We iterate over the app files (as opposed to offenses) because if
109
70
  // there were offenses before, we need to send an empty array to clear
110
71
  // them.
111
- for (const sourceCode of theme) {
112
- const sourceCodeOffenses = offenses.filter((offense) => offense.uri === sourceCode.uri);
72
+ for (const sourceCode of app) {
73
+ const sourceCodeOffenses = appOffenses.filter((offense) => offense.uri === sourceCode.uri);
113
74
  diagnosticsManager.set(sourceCode.uri, sourceCode.version, sourceCodeOffenses);
114
75
  }
115
76
  }
116
77
  };
117
78
  }
118
-
119
- async function getCSSDiagnostics(
120
- cssLanguageService: CSSLanguageService,
121
- sourceCode: AugmentedSourceCode,
122
- ): Promise<Offense[]> {
123
- if (sourceCode.type !== SourceCodeType.LiquidHtml) {
124
- return [];
125
- }
126
-
127
- const diagnostics = await cssLanguageService.diagnostics({
128
- textDocument: { uri: sourceCode.uri },
129
- });
130
-
131
- return diagnostics
132
- .map(
133
- (diagnostic): Offense => ({
134
- check: 'css',
135
- message: diagnostic.message,
136
- end: {
137
- index: sourceCode.textDocument.offsetAt(diagnostic.range.end),
138
- line: diagnostic.range.end.line,
139
- character: diagnostic.range.end.character,
140
- },
141
- start: {
142
- index: sourceCode.textDocument.offsetAt(diagnostic.range.start),
143
- line: diagnostic.range.start.line,
144
- character: diagnostic.range.start.character,
145
- },
146
- severity: offenseSeverity(diagnostic),
147
- uri: sourceCode.uri,
148
- type: SourceCodeType.LiquidHtml,
149
- }),
150
- )
151
- .filter((offense) => offense.severity !== Severity.INFO);
152
- }
@@ -62,7 +62,7 @@ function sanitize(s: string | undefined) {
62
62
  ?.replace(/(^|\n+)&gt;/g, ' ')
63
63
  .replace(/&gt;/g, '>')
64
64
  .replace(/&lt;/g, '<')
65
- .replace(/\]\(\//g, '](https://shopify.dev/')
65
+ .replace(/\]\(\//g, '](https://documentation.platformos.com/')
66
66
  .trim();
67
67
  }
68
68
 
@@ -6,13 +6,13 @@ import { URI, Utils } from 'vscode-uri';
6
6
 
7
7
  import { visit, Visitor } from '@platformos/platformos-check-common';
8
8
  import { DocumentManager } from '../documents';
9
- import { FindThemeRootURI } from '../internal-types';
9
+ import { FindAppRootURI } from '../internal-types';
10
10
  import { DocumentsLocator, TranslationProvider } from '@platformos/platformos-common';
11
11
 
12
12
  export class DocumentLinksProvider {
13
13
  constructor(
14
14
  private documentManager: DocumentManager,
15
- private findThemeRootURI: FindThemeRootURI,
15
+ private findAppRootURI: FindAppRootURI,
16
16
  private documentsLocator: DocumentsLocator,
17
17
  private translationProvider: TranslationProvider,
18
18
  ) {}
@@ -27,7 +27,7 @@ export class DocumentLinksProvider {
27
27
  return [];
28
28
  }
29
29
 
30
- const rootUri = await this.findThemeRootURI(uriString);
30
+ const rootUri = await this.findAppRootURI(uriString);
31
31
  if (!rootUri) {
32
32
  return [];
33
33
  }