@platformos/platformos-language-server-common 0.0.7 → 0.0.9

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 (249) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/PropertyShapeInference.d.ts +18 -0
  3. package/dist/PropertyShapeInference.js +62 -0
  4. package/dist/PropertyShapeInference.js.map +1 -1
  5. package/dist/TypeSystem.d.ts +4 -9
  6. package/dist/TypeSystem.js +246 -390
  7. package/dist/TypeSystem.js.map +1 -1
  8. package/dist/codeActions/providers/GenerateDocBlockProvider.d.ts +10 -0
  9. package/dist/codeActions/providers/GenerateDocBlockProvider.js +39 -0
  10. package/dist/codeActions/providers/GenerateDocBlockProvider.js.map +1 -0
  11. package/dist/commands/providers/GenerateDocBlockCommandProvider.d.ts +19 -0
  12. package/dist/commands/providers/GenerateDocBlockCommandProvider.js +64 -0
  13. package/dist/commands/providers/GenerateDocBlockCommandProvider.js.map +1 -0
  14. package/dist/completions/CompletionsProvider.d.ts +6 -10
  15. package/dist/completions/CompletionsProvider.js +6 -9
  16. package/dist/completions/CompletionsProvider.js.map +1 -1
  17. package/dist/completions/params/LiquidCompletionParams.js +6 -17
  18. package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
  19. package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
  20. package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
  21. package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
  22. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
  23. package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
  24. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
  25. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
  26. package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
  27. package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
  28. package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
  29. package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
  30. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
  31. package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
  32. package/dist/completions/providers/index.d.ts +0 -3
  33. package/dist/completions/providers/index.js +1 -7
  34. package/dist/completions/providers/index.js.map +1 -1
  35. package/dist/css/CSSLanguageService.d.ts +19 -5
  36. package/dist/css/CSSLanguageService.js +77 -63
  37. package/dist/css/CSSLanguageService.js.map +1 -1
  38. package/dist/definitions/DefinitionProvider.d.ts +1 -1
  39. package/dist/definitions/DefinitionProvider.js +1 -3
  40. package/dist/definitions/DefinitionProvider.js.map +1 -1
  41. package/dist/diagnostics/offenseToDiagnostic.js +1 -1
  42. package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
  43. package/dist/diagnostics/runChecks.d.ts +3 -5
  44. package/dist/diagnostics/runChecks.js +12 -64
  45. package/dist/diagnostics/runChecks.js.map +1 -1
  46. package/dist/docset/MarkdownRenderer.js +1 -1
  47. package/dist/docset/MarkdownRenderer.js.map +1 -1
  48. package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
  49. package/dist/documentLinks/DocumentLinksProvider.js +3 -3
  50. package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
  51. package/dist/documents/DocumentManager.d.ts +4 -5
  52. package/dist/documents/DocumentManager.js +17 -12
  53. package/dist/documents/DocumentManager.js.map +1 -1
  54. package/dist/documents/types.d.ts +16 -3
  55. package/dist/documents/types.js +3 -3
  56. package/dist/documents/types.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/rename/RenameProvider.d.ts +2 -2
  92. package/dist/rename/RenameProvider.js +2 -2
  93. package/dist/rename/RenameProvider.js.map +1 -1
  94. package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
  95. package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
  96. package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
  97. package/dist/renamed/RenameHandler.d.ts +2 -3
  98. package/dist/renamed/RenameHandler.js +3 -8
  99. package/dist/renamed/RenameHandler.js.map +1 -1
  100. package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
  101. package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
  102. package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
  103. package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
  104. package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
  105. package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
  106. package/dist/renamed/handlers/utils.d.ts +1 -1
  107. package/dist/server/AppGraphManager.d.ts +32 -0
  108. package/dist/server/AppGraphManager.js +155 -0
  109. package/dist/server/AppGraphManager.js.map +1 -0
  110. package/dist/server/startServer.d.ts +2 -2
  111. package/dist/server/startServer.js +62 -164
  112. package/dist/server/startServer.js.map +1 -1
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/dist/types.d.ts +33 -54
  115. package/dist/types.js +21 -26
  116. package/dist/types.js.map +1 -1
  117. package/dist/utils/liquidDoc.js +1 -1
  118. package/dist/utils/liquidDoc.js.map +1 -1
  119. package/dist/utils/uri.d.ts +2 -9
  120. package/dist/utils/uri.js +5 -21
  121. package/dist/utils/uri.js.map +1 -1
  122. package/package.json +4 -4
  123. package/src/ClientCapabilities.ts +1 -1
  124. package/src/PropertyShapeInference.ts +81 -1
  125. package/src/TypeSystem.spec.ts +206 -449
  126. package/src/TypeSystem.ts +267 -460
  127. package/src/codeActions/providers/FixAllProvider.spec.ts +1 -1
  128. package/src/codeActions/providers/FixProvider.spec.ts +11 -11
  129. package/src/codeActions/providers/SuggestionProvider.spec.ts +2 -2
  130. package/src/commands/providers/ApplyFixesProvider.ts +2 -2
  131. package/src/commands/providers/ApplySuggestionProvider.ts +2 -2
  132. package/src/commands/providers/RunChecksProvider.ts +2 -2
  133. package/src/completions/CompletionsProvider.ts +14 -35
  134. package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
  135. package/src/completions/params/LiquidCompletionParams.ts +8 -17
  136. package/src/completions/params/fix.spec.ts +0 -3
  137. package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
  138. package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
  139. package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
  140. package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
  141. package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
  142. package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
  143. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
  144. package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
  145. package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
  146. package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +4 -18
  147. package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
  148. package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
  149. package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
  150. package/src/completions/providers/PartialCompletionProvider.spec.ts +6 -15
  151. package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +13 -15
  152. package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +2 -3
  153. package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
  154. package/src/completions/providers/TranslationCompletionProvider.ts +3 -3
  155. package/src/completions/providers/index.ts +0 -3
  156. package/src/css/CSSLanguageService.ts +97 -81
  157. package/src/definitions/DefinitionProvider.ts +0 -6
  158. package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
  159. package/src/diagnostics/offenseToDiagnostic.ts +1 -1
  160. package/src/diagnostics/runChecks.spec.ts +22 -30
  161. package/src/diagnostics/runChecks.ts +17 -91
  162. package/src/docset/MarkdownRenderer.ts +1 -1
  163. package/src/documentLinks/DocumentLinksProvider.ts +10 -10
  164. package/src/documents/DocumentManager.spec.ts +46 -119
  165. package/src/documents/DocumentManager.ts +19 -15
  166. package/src/documents/types.ts +18 -9
  167. package/src/hover/HoverProvider.ts +9 -21
  168. package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
  169. package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
  170. package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
  171. package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +1 -4
  172. package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
  173. package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
  174. package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
  175. package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
  176. package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
  177. package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
  178. package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
  179. package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
  180. package/src/hover/providers/RenderPartialHoverProvider.spec.ts +11 -14
  181. package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
  182. package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +10 -13
  183. package/src/hover/providers/RenderPartialParameterHoverProvider.ts +2 -3
  184. package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
  185. package/src/hover/providers/TranslationHoverProvider.ts +3 -3
  186. package/src/index.ts +4 -7
  187. package/src/internal-types.ts +1 -1
  188. package/src/json/JSONContributions.ts +4 -61
  189. package/src/json/JSONLanguageService.ts +19 -117
  190. package/src/json/test/test-helpers.ts +4 -35
  191. package/src/json/utils.ts +0 -27
  192. package/src/rename/RenameProvider.ts +4 -4
  193. package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +5 -5
  194. package/src/rename/providers/LiquidVariableRenameProvider.ts +6 -6
  195. package/src/renamed/RenameHandler.ts +4 -9
  196. package/src/renamed/handlers/AssetRenameHandler.spec.ts +28 -28
  197. package/src/renamed/handlers/AssetRenameHandler.ts +6 -6
  198. package/src/renamed/handlers/PartialRenameHandler.spec.ts +9 -9
  199. package/src/renamed/handlers/PartialRenameHandler.ts +10 -10
  200. package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
  201. package/src/server/safe.ts +1 -1
  202. package/src/server/startServer.spec.ts +10 -12
  203. package/src/server/startServer.ts +69 -222
  204. package/src/test/CompletionItemsAssertion.spec.ts +1 -4
  205. package/src/types.ts +33 -63
  206. package/src/utils/debounce.ts +1 -1
  207. package/src/utils/liquidDoc.ts +6 -6
  208. package/src/utils/uri.ts +5 -17
  209. package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
  210. package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
  211. package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
  212. package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
  213. package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
  214. package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
  215. package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
  216. package/src/css/CSSLanguageService.spec.ts +0 -159
  217. package/src/css/test/test-helpers.ts +0 -30
  218. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
  219. package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
  220. package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
  221. package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
  222. package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
  223. package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
  224. package/src/json/JSONLanguageService.spec.ts +0 -424
  225. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
  226. package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
  227. package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
  228. package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
  229. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
  230. package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
  231. package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
  232. package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
  233. package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
  234. package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
  235. package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
  236. package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
  237. package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
  238. package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
  239. package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
  240. package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
  241. package/src/json/schemaSettings.spec.ts +0 -103
  242. package/src/json/schemaSettings.ts +0 -53
  243. package/src/plugins/css.ts +0 -12
  244. package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
  245. package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
  246. package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
  247. package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
  248. package/src/renamed/handlers/utils.ts +0 -22
  249. package/src/settings/index.ts +0 -50
package/src/types.ts CHANGED
@@ -1,7 +1,4 @@
1
- import {
2
- Config,
3
- Dependencies as ThemeCheckDependencies,
4
- } from '@platformos/platformos-check-common';
1
+ import { Config, Dependencies as CheckDependencies } from '@platformos/platformos-check-common';
5
2
  import { AbstractFileSystem } from '@platformos/platformos-common';
6
3
  import { URI } from 'vscode-languageserver';
7
4
  import * as rpc from 'vscode-jsonrpc';
@@ -10,10 +7,7 @@ import { WithOptional } from './utils';
10
7
  import { Range } from 'vscode-json-languageservice';
11
8
  import { Reference } from '@platformos/platformos-graph';
12
9
 
13
- export type Dependencies = WithOptional<
14
- RequiredDependencies,
15
- 'log' | 'getMetafieldDefinitions' | 'fetchMetafieldDefinitionsForURI'
16
- >;
10
+ export type Dependencies = WithOptional<RequiredDependencies, 'log'>;
17
11
 
18
12
  export interface RequiredDependencies {
19
13
  /**
@@ -34,25 +28,25 @@ export interface RequiredDependencies {
34
28
  *
35
29
  * @example
36
30
  *
37
- * Here's an example VS Code workspace a partner could run
31
+ * Here's an example VS Code workspace a developer could run
38
32
  * ```
39
- * theme1/
40
- * src/
41
- * locales/
42
- * sections/
43
- * snippets/
44
- * dist/
45
- * locales/
46
- * sections/
47
- * foo.liquud
48
- * snippets/
49
- * theme2/
50
- * locales/
51
- * sections/
52
- * snippets/
33
+ * my-app/
34
+ * .pos
35
+ * app/
36
+ * views/
37
+ * layouts/
38
+ * pages/
39
+ * partials/
40
+ * lib/
41
+ * assets/
42
+ * another-app/
43
+ * .pos
44
+ * app/
45
+ * views/
46
+ * pages/
53
47
  * ```
54
48
  *
55
- * In this situation, we have 3 different "roots."
49
+ * In this situation, we have 2 different "roots."
56
50
  *
57
51
  * @param uri - a file path
58
52
  * @returns {Promise<Config>}
@@ -61,19 +55,17 @@ export interface RequiredDependencies {
61
55
 
62
56
  /**
63
57
  * In local environments, the Language Server can download the latest versions
64
- * of themes docset from `Shopify/theme-liquid-docs`. However, this is not
65
- * possible in the browser, so we implement different solutions for each
66
- * environment.
58
+ * of the platformOS Liquid docset. In the browser, the docset must be
59
+ * precompiled into the bundle at build time.
67
60
  */
68
- themeDocset: NonNullable<ThemeCheckDependencies['themeDocset']>;
61
+ platformosDocset: NonNullable<CheckDependencies['platformosDocset']>;
69
62
 
70
63
  /**
71
- * In local environments, the Language Server can download the latest versions
72
- * of themes schemas from `Shopify/theme-liquid-docs`. Due to limitations in
73
- * browser environments, json schemas must be precompiled into validators prior
74
- * to theme-check instantiation.
64
+ * In local environments, the Language Server can download the latest JSON
65
+ * validation schemas. In browser environments, schemas must be precompiled
66
+ * into validators prior to platformos-check instantiation.
75
67
  */
76
- jsonValidationSet: NonNullable<ThemeCheckDependencies['jsonValidationSet']>;
68
+ jsonValidationSet: NonNullable<CheckDependencies['jsonValidationSet']>;
77
69
 
78
70
  /**
79
71
  * A file system abstraction that allows the Language Server to read files by URI.
@@ -85,23 +77,10 @@ export interface RequiredDependencies {
85
77
  * The browser accepts a custom implementation.
86
78
  */
87
79
  fs: AbstractFileSystem;
88
-
89
- /**
90
- * In local environments, the Language Server can download the metafield definitions
91
- * and provide a set of memoized definitions. In other environments, we rely on dynamically
92
- * fetching the set of metafield definitions every time.
93
- */
94
- getMetafieldDefinitions: ThemeCheckDependencies['getMetafieldDefinitions'];
95
-
96
- /**
97
- * Fetch Metafield definitions using the CLI provided the URI of the project root.
98
- * This should only be used in node environments; not on the browser.
99
- */
100
- fetchMetafieldDefinitionsForURI: (uri: URI) => Promise<void>;
101
80
  }
102
81
 
103
- export namespace ThemeGraphReferenceRequest {
104
- export const method = 'themeGraph/references';
82
+ export namespace AppGraphReferenceRequest {
83
+ export const method = 'appGraph/references';
105
84
  export const type = new rpc.RequestType<Params, Response, void>(method);
106
85
  export interface Params {
107
86
  uri: string;
@@ -111,8 +90,8 @@ export namespace ThemeGraphReferenceRequest {
111
90
  export type Response = AugmentedReference[];
112
91
  }
113
92
 
114
- export namespace ThemeGraphDependenciesRequest {
115
- export const method = 'themeGraph/dependencies';
93
+ export namespace AppGraphDependenciesRequest {
94
+ export const method = 'appGraph/dependencies';
116
95
  export const type = new rpc.RequestType<Params, Response, void>(method);
117
96
  export interface Params {
118
97
  uri: string;
@@ -122,8 +101,8 @@ export namespace ThemeGraphDependenciesRequest {
122
101
  export type Response = AugmentedReference[];
123
102
  }
124
103
 
125
- export namespace ThemeGraphRootRequest {
126
- export const method = 'themeGraph/rootUri';
104
+ export namespace AppGraphRootRequest {
105
+ export const method = 'appGraph/rootUri';
127
106
  export const type = new rpc.RequestType<Params, Response, void>(method);
128
107
  export interface Params {
129
108
  uri: string;
@@ -131,17 +110,8 @@ export namespace ThemeGraphRootRequest {
131
110
  export type Response = string;
132
111
  }
133
112
 
134
- export namespace ThemeGraphDeadCodeRequest {
135
- export const method = 'themeGraph/deadCode';
136
- export const type = new rpc.RequestType<Params, Response, void>(method);
137
- export interface Params {
138
- uri: string;
139
- }
140
- export type Response = string[];
141
- }
142
-
143
- export namespace ThemeGraphDidUpdateNotification {
144
- export const method = 'themeGraph/onDidChangeTree';
113
+ export namespace AppGraphDidUpdateNotification {
114
+ export const method = 'appGraph/onDidChangeTree';
145
115
  export const type = new rpc.NotificationType<Params>(method);
146
116
  export interface Params {
147
117
  uri: string;
@@ -27,7 +27,7 @@ export interface DebouncedFunction<F extends Function> {
27
27
  * This is useful in cases where you have an "expensive" function that you only want
28
28
  * to execute after the user is idle for a little bit.
29
29
  *
30
- * e.g. Run theme check after the user has stopped typing for at least 100ms.
30
+ * e.g. Run platformos-check after the user has stopped typing for at least 100ms.
31
31
  *
32
32
  * The debounced function has the same type signature as its argument.
33
33
  *
@@ -29,11 +29,11 @@ export function formatLiquidDocTagHandle(label: string, description: string, exa
29
29
  export const SUPPORTED_LIQUID_DOC_TAG_HANDLES = {
30
30
  [SupportedDocTagTypes.Param]: {
31
31
  description:
32
- 'Provides information about a parameter for the snippet.\n' +
32
+ 'Provides information about a parameter for the partial.\n' +
33
33
  `- The type of parameter is optional and can be ${Object.values(BasicParamTypes)
34
34
  .map((type) => `\`${type}\``)
35
35
  .join(', ')}\n` +
36
- ` or liquid object that isn't exclusively a global object in our [API Docs](https://shopify.dev/docs/api/liquid/objects)\n` +
36
+ ` or liquid object that isn't exclusively a global object in our [API Docs](https://documentation.platformos.com/api-reference/liquid/platformos-objects)\n` +
37
37
  '- An optional parameter is denoted by square brackets around the parameter name\n' +
38
38
  '- The description is optional Markdown text',
39
39
  example:
@@ -45,15 +45,15 @@ export const SUPPORTED_LIQUID_DOC_TAG_HANDLES = {
45
45
  template: `param {$2} $1$0`,
46
46
  },
47
47
  [SupportedDocTagTypes.Example]: {
48
- description: 'Provides an example on how to use the snippet.',
48
+ description: 'Provides an example on how to use the partial.',
49
49
  example:
50
- '{% doc %}\n' + ' @example {% render "snippet-name", arg1: "value" %}\n' + '{% enddoc %}\n',
50
+ '{% doc %}\n' + ' @example {% render "partial-name", arg1: "value" %}\n' + '{% enddoc %}\n',
51
51
  template: `example $0`,
52
52
  },
53
53
  [SupportedDocTagTypes.Description]: {
54
- description: 'Provides information on what the snippet does.',
54
+ description: 'Provides information on what the partial does.',
55
55
  example:
56
- '{% doc %}\n' + ' @description This snippet renders a product image.\n' + '{% enddoc %}\n',
56
+ '{% doc %}\n' + ' @description This partial renders a product image.\n' + '{% enddoc %}\n',
57
57
  template: `description $0`,
58
58
  },
59
59
  };
package/src/utils/uri.ts CHANGED
@@ -1,22 +1,10 @@
1
1
  import { path } from '@platformos/platformos-check-common';
2
+ import { isPartial, PlatformOSFileType, getFileType } from '@platformos/platformos-common';
3
+
4
+ export { isPartial };
2
5
 
3
6
  export const partialName = (uri: string) => path.basename(uri, '.liquid');
4
- export const isPartial = (uri: string) => /\b(partials|lib)(\\|\/)[^\\\/]*\.liquid/.test(uri);
5
7
 
6
- // asset urls have their `.liquid`` removed (if present) and require the other extension */
8
+ // asset urls have their `.liquid` removed (if present) and require the other extension
7
9
  export const assetName = (uri: string) => path.basename(uri, '.liquid');
8
- export const isAsset = (uri: string) => /\bassets(\\|\/)[^\\\/]/.test(uri);
9
-
10
- export const blockName = (uri: string) => path.basename(uri, '.liquid');
11
- export const isBlock = (uri: string) => /\bblocks(\\|\/)[^\\\/]/.test(uri);
12
-
13
- export const sectionName = (uri: string) => path.basename(uri, '.liquid');
14
- export const isSection = (uri: string) =>
15
- /\bsections(\\|\/)[^\\\/]/.test(uri) && /.liquid$/.test(uri);
16
-
17
- export const sectionGroupName = (uri: string) => path.basename(uri, '.json');
18
- export const isSectionGroup = (uri: string) =>
19
- /\bsections(\\|\/)[^\\\/]/.test(uri) && /.json$/.test(uri);
20
-
21
- export const templateName = (uri: string) => path.basename(uri, '.json');
22
- export const isTemplate = (uri: string) => /\btemplates(\\|\/)[^\\\/]/.test(uri);
10
+ export const isAsset = (uri: string) => getFileType(uri) === PlatformOSFileType.Asset;
@@ -1,41 +0,0 @@
1
- import { MetafieldDefinitionMap } from '@platformos/platformos-check-common';
2
- import { beforeEach, describe, expect, it } from 'vitest';
3
- import { InsertTextFormat } from 'vscode-json-languageservice';
4
- import { DocumentManager } from '../../documents';
5
- import { CompletionsProvider } from '../CompletionsProvider';
6
-
7
- describe('Module: ContentForBlockTypeCompletionProvider', async () => {
8
- let provider: CompletionsProvider;
9
-
10
- beforeEach(async () => {
11
- provider = new CompletionsProvider({
12
- documentManager: new DocumentManager(),
13
- themeDocset: {
14
- graphQL: async () => null,
15
- filters: async () => [],
16
- objects: async () => [],
17
- liquidDrops: async () => [],
18
- tags: async () => [],
19
- systemTranslations: async () => ({}),
20
- },
21
- getMetafieldDefinitions: async (_rootUri: string) => ({}) as MetafieldDefinitionMap,
22
- getThemeBlockNames: async (_rootUri: string, _includePrivate: boolean) => [
23
- 'block-1',
24
- 'block-2',
25
- ],
26
- });
27
- });
28
-
29
- it('should complete content_for "block" type parameter ', async () => {
30
- const expected = ['block-1', 'block-2'].sort();
31
- await expect(provider).to.complete('{% content_for "block", type: "█" %}', expected);
32
- });
33
-
34
- it('should not complete content_for "blocks" type parameter', async () => {
35
- await expect(provider).to.complete('{% content_for "blocks", type: "█" %}', []);
36
- });
37
-
38
- it('should not complete content_for "block" id parameter', async () => {
39
- await expect(provider).to.complete('{% content_for "block", type: "", id: "█" %}', []);
40
- });
41
- });
@@ -1,42 +0,0 @@
1
- import { NodeTypes } from '@platformos/liquid-html-parser';
2
- import { CompletionItem, CompletionItemKind } from 'vscode-languageserver';
3
- import { LiquidCompletionParams } from '../params';
4
- import { Provider } from './common';
5
-
6
- export class ContentForBlockTypeCompletionProvider implements Provider {
7
- constructor(
8
- private readonly getThemeBlockNames: (
9
- rootUri: string,
10
- includePrivate: boolean,
11
- ) => Promise<string[]>,
12
- ) {}
13
-
14
- async completions(params: LiquidCompletionParams): Promise<CompletionItem[]> {
15
- if (!params.completionContext) return [];
16
-
17
- const { document } = params;
18
- const doc = document.textDocument;
19
- const { node, ancestors } = params.completionContext;
20
- const parentNode = ancestors.at(-1);
21
- const grandParentNode = ancestors.at(-2);
22
-
23
- if (
24
- !node ||
25
- !parentNode ||
26
- !grandParentNode ||
27
- node.type !== NodeTypes.String ||
28
- parentNode.type !== NodeTypes.NamedArgument ||
29
- parentNode.name !== 'type' ||
30
- grandParentNode.type !== NodeTypes.ContentForMarkup ||
31
- grandParentNode.contentForType.value !== 'block'
32
- ) {
33
- return [];
34
- }
35
-
36
- return (await this.getThemeBlockNames(doc.uri, false)).map((blockName) => ({
37
- label: blockName,
38
- kind: CompletionItemKind.EnumMember,
39
- insertText: blockName,
40
- }));
41
- }
42
- }
@@ -1,96 +0,0 @@
1
- import { MetafieldDefinitionMap } from '@platformos/platformos-check-common';
2
- import { beforeEach, describe, expect, it } from 'vitest';
3
- import { InsertTextFormat } from 'vscode-json-languageservice';
4
- import { DocumentManager } from '../../documents';
5
- import { CompletionsProvider } from '../CompletionsProvider';
6
-
7
- describe('Module: ContentForCompletionProvider', async () => {
8
- let provider: CompletionsProvider;
9
-
10
- beforeEach(async () => {
11
- provider = new CompletionsProvider({
12
- documentManager: new DocumentManager(),
13
- themeDocset: {
14
- graphQL: async () => null,
15
- filters: async () => [],
16
- objects: async () => [],
17
- liquidDrops: async () => [],
18
- tags: async () => [],
19
- systemTranslations: async () => ({}),
20
- },
21
- getMetafieldDefinitions: async (_rootUri: string) => ({}) as MetafieldDefinitionMap,
22
- });
23
- });
24
-
25
- it('should complete content_for block keywords correctly', async () => {
26
- const expected = ['block', 'blocks'].sort();
27
- await expect(provider).to.complete('{% content_for "█" %}', expected);
28
- });
29
-
30
- describe('when the text being completed does not have extra markup', () => {
31
- it('should text edit complete content_for block with type & id placeholders', async () => {
32
- const source = '{% content_for "█" %}';
33
- await expect(provider).to.complete(
34
- source,
35
- expect.arrayContaining([
36
- expect.objectContaining({
37
- label: 'block',
38
- textEdit: expect.applyEdits(source, `{% content_for "block", type: "$1", id: "$2" %}`),
39
- }),
40
- ]),
41
- );
42
- });
43
-
44
- it('should keep using the quote type used', async () => {
45
- const source = `{% content_for '█' %}`;
46
- await expect(provider).to.complete(
47
- source,
48
- expect.arrayContaining([
49
- expect.objectContaining({
50
- label: 'block',
51
- textEdit: expect.applyEdits(
52
- source,
53
- // single quotes everywhere
54
- `{% content_for 'block', type: '$1', id: '$2' %}`,
55
- ),
56
- }),
57
- ]),
58
- );
59
- });
60
-
61
- it('should text edit complete inside the liquid liquid tag', async () => {
62
- const source = `{% liquid
63
- content_for "█"
64
- echo "more content"
65
- %}`;
66
- const afterEdit = `{% liquid
67
- content_for "block", type: "$1", id: "$2"
68
- echo "more content"
69
- %}`;
70
- await expect(provider).to.complete(
71
- source,
72
- expect.arrayContaining([
73
- expect.objectContaining({
74
- label: 'block',
75
- textEdit: expect.applyEdits(source, afterEdit),
76
- }),
77
- ]),
78
- );
79
- });
80
- });
81
-
82
- describe('when it has extra markup', () => {
83
- it('should not text edit complete', async () => {
84
- const source = '{% content_for "█", type: "some-type", id: "some-id" %}';
85
- await expect(provider).to.complete(
86
- source,
87
- expect.arrayContaining([
88
- expect.objectContaining({
89
- label: 'block',
90
- insertTextFormat: InsertTextFormat.PlainText,
91
- }),
92
- ]),
93
- );
94
- });
95
- });
96
- });
@@ -1,113 +0,0 @@
1
- import { LiquidString, NodeTypes } from '@platformos/liquid-html-parser';
2
- import {
3
- CompletionItem,
4
- CompletionItemKind,
5
- InsertTextFormat,
6
- Range,
7
- TextEdit,
8
- } from 'vscode-languageserver';
9
- import { LiquidCompletionParams } from '../params';
10
- import { Provider } from './common';
11
-
12
- export class ContentForCompletionProvider implements Provider {
13
- constructor() {}
14
-
15
- async completions(params: LiquidCompletionParams): Promise<CompletionItem[]> {
16
- if (!params.completionContext) return [];
17
-
18
- const { document } = params;
19
- const doc = document.textDocument;
20
- const { node, ancestors } = params.completionContext;
21
- const parentNode = ancestors.at(-1);
22
-
23
- if (
24
- !node ||
25
- !parentNode ||
26
- node.type !== NodeTypes.String ||
27
- parentNode.type !== NodeTypes.ContentForMarkup
28
- ) {
29
- return [];
30
- }
31
-
32
- const options = [
33
- {
34
- keyword: 'block',
35
- description: 'Renders a static theme block within `sections` or `theme blocks`.\n',
36
- syntax: "content_for 'block', type: '$1', id: '$2'",
37
- },
38
- {
39
- keyword: 'blocks',
40
- description: `Renders block elements within sections or other blocks as configured in the JSON template or section groups.
41
- See [theme blocks](https://shopify.dev/docs/storefronts/themes/architecture/blocks/theme-blocks)
42
- to see how to create theme blocks that can be used this way.\n`,
43
- syntax: `content_for 'blocks'`,
44
- },
45
- ];
46
-
47
- const partial = node.value;
48
- const isInLiquidLiquidTag = ancestors.some(
49
- (node) => node.type === NodeTypes.LiquidTag && node.name === 'liquid',
50
- );
51
- const startPosition = node.position.start + 1; // after the quote
52
- const endPosition = indexOf(
53
- document.source,
54
- // We want to maintain trailing whitespace to whatever it was before the completion
55
- isInLiquidLiquidTag ? / *\n/g : /\s*-?%}/gm,
56
- startPosition + partial.length,
57
- );
58
- const hasMarkup =
59
- document.source
60
- .slice(startPosition + partial.length, endPosition)
61
- .replace(/^['"]/, '')
62
- .trim() !== '';
63
- const shouldCompleteSyntax = endPosition !== -1 && !hasMarkup;
64
-
65
- return options
66
- .filter(({ keyword }) => keyword.startsWith(partial))
67
- .map(({ keyword, description, syntax }): CompletionItem => {
68
- const item: CompletionItem = {
69
- label: keyword,
70
- kind: CompletionItemKind.Keyword,
71
- insertTextFormat: InsertTextFormat.PlainText,
72
- documentation: {
73
- kind: 'markdown',
74
- value: description,
75
- },
76
- };
77
-
78
- if (shouldCompleteSyntax) {
79
- const snippetText = getSnippetText(node, syntax);
80
- item.insertTextFormat = InsertTextFormat.Snippet;
81
- item.textEdit = TextEdit.replace(
82
- Range.create(doc.positionAt(startPosition), doc.positionAt(endPosition)),
83
- snippetText,
84
- );
85
- }
86
-
87
- return item;
88
- });
89
- }
90
- }
91
-
92
- function getSnippetText(node: LiquidString, syntax: string): string {
93
- // Language clients don't like it when the text edit starts before the word being completed
94
- // So we make the snippet text start with the word being completed
95
- return (
96
- syntax
97
- .replace(/^content_for '/, '')
98
- // use the same quote type as the original string everywhere in the snippet
99
- .replace(node.single ? /"/g : /'/g, node.single ? "'" : '"')
100
- );
101
- }
102
-
103
- /**
104
- * String.prototype.indexOf does not accept RegExp args...
105
- * String.prototype.search does not accept fromIndex args...
106
- *
107
- * We want both.
108
- */
109
- function indexOf(string: string, searchValue: RegExp, fromIndex: number): number {
110
- searchValue.lastIndex = fromIndex;
111
- const match = searchValue.exec(string);
112
- return match ? match.index : -1;
113
- }