@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
@@ -8,19 +8,16 @@ exports.isUnionType = isUnionType;
8
8
  exports.typeToDisplayString = typeToDisplayString;
9
9
  const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
10
10
  const platformos_check_common_1 = require("@platformos/platformos-check-common");
11
- const settings_1 = require("./settings");
12
11
  const utils_1 = require("./utils");
13
12
  const platformos_check_common_2 = require("@platformos/platformos-check-common");
14
13
  const PropertyShapeInference_1 = require("./PropertyShapeInference");
15
14
  const vscode_uri_1 = require("vscode-uri");
16
15
  class TypeSystem {
17
- constructor(themeDocset, getThemeSettingsSchemaForURI, getMetafieldDefinitions, fs, documentsLocator, findThemeRootURI) {
18
- this.themeDocset = themeDocset;
19
- this.getThemeSettingsSchemaForURI = getThemeSettingsSchemaForURI;
20
- this.getMetafieldDefinitions = getMetafieldDefinitions;
16
+ constructor(platformosDocset, fs, documentsLocator, findAppRootURI) {
17
+ this.platformosDocset = platformosDocset;
21
18
  this.fs = fs;
22
19
  this.documentsLocator = documentsLocator;
23
- this.findThemeRootURI = findThemeRootURI;
20
+ this.findAppRootURI = findAppRootURI;
24
21
  this.graphqlSchemaLoaded = false;
25
22
  /**
26
23
  * An indexed representation of objects.json by name
@@ -28,72 +25,7 @@ class TypeSystem {
28
25
  * e.g. objectMap['product'] returns the product ObjectEntry.
29
26
  */
30
27
  this.objectMap = async (uri, ast) => {
31
- const [objectMap, themeSettingProperties, metafieldDefinitionsObjectMap] = await Promise.all([
32
- this._objectMap(),
33
- this.themeSettingProperties(uri),
34
- this.metafieldDefinitionsObjectMap(uri),
35
- ]);
36
- // Here we shallow mutate `settings.properties` to have the properties made
37
- // available by settings_schema.json
38
- const result = {
39
- ...objectMap,
40
- settings: {
41
- ...(objectMap.settings ?? {}),
42
- properties: themeSettingProperties,
43
- },
44
- ...customMetafieldTypeEntries(objectMap['metafield']),
45
- ...metafieldDefinitionsObjectMap,
46
- };
47
- // For each metafield definition fetched, we need to override existing types with `metafields` property
48
- // to `${category}_metafield`.
49
- //
50
- // WARNING: Since we aren't cloning the object, we are mutating the original type for all themes in
51
- // the workspace. However, this is fine since these changes are not unique to a theme.
52
- for (let category of platformos_check_common_1.FETCHED_METAFIELD_CATEGORIES) {
53
- if (!result[category])
54
- continue;
55
- let metafieldsProperty = result[category].properties?.find((prop) => prop.name === 'metafields');
56
- if (!metafieldsProperty)
57
- continue;
58
- metafieldsProperty.return_type = [{ type: `${category}_metafields`, name: '' }];
59
- }
60
- // Deal with sections/file.liquid section.settings by infering the type from the {% schema %}
61
- if (/[\/\\]sections[\/\\]/.test(uri) && result.section) {
62
- result.section = JSON.parse(JSON.stringify(result.section)); // easy deep clone
63
- const settings = result.section.properties?.find((x) => x.name === 'settings');
64
- if (!settings || !settings.return_type)
65
- return result;
66
- settings.return_type = [{ type: 'section_settings', name: '' }];
67
- result.section_settings = {
68
- name: 'section_settings',
69
- access: {
70
- global: false,
71
- parents: [],
72
- template: [],
73
- },
74
- properties: schemaSettingsAsProperties(ast),
75
- return_type: [],
76
- };
77
- }
78
- // Deal with blocks/files.liquid block.settings in a similar fashion
79
- if (/[\/\\]blocks[\/\\]/.test(uri) && result.block) {
80
- result.block = JSON.parse(JSON.stringify(result.block)); // easy deep clone
81
- const settings = result.block.properties?.find((x) => x.name === 'settings');
82
- if (!settings || !settings.return_type)
83
- return result;
84
- settings.return_type = [{ type: 'block_settings', name: '' }];
85
- result.block_settings = {
86
- name: 'block_settings',
87
- access: {
88
- global: false,
89
- parents: [],
90
- template: [],
91
- },
92
- properties: schemaSettingsAsProperties(ast),
93
- return_type: [],
94
- };
95
- }
96
- return result;
28
+ return this._objectMap();
97
29
  };
98
30
  // This is the big one we reuse (memoized)
99
31
  this._objectMap = (0, utils_1.memo)(async () => {
@@ -112,10 +44,10 @@ class TypeSystem {
112
44
  }, {});
113
45
  });
114
46
  this.filterEntries = (0, utils_1.memo)(async () => {
115
- return this.themeDocset.filters();
47
+ return this.platformosDocset.filters();
116
48
  });
117
49
  this.objectEntries = (0, utils_1.memo)(async () => {
118
- return this.themeDocset.objects();
50
+ return this.platformosDocset.objects();
119
51
  });
120
52
  /**
121
53
  * The seedSymbolsTable contains all the global variables.
@@ -153,7 +85,7 @@ class TypeSystem {
153
85
  }
154
86
  async getGraphQLSchema() {
155
87
  if (!this.graphqlSchemaLoaded) {
156
- this.graphqlSchemaCache = (await this.themeDocset.graphQL()) ?? undefined;
88
+ this.graphqlSchemaCache = (await this.platformosDocset.graphQL()) ?? undefined;
157
89
  this.graphqlSchemaLoaded = true;
158
90
  }
159
91
  return this.graphqlSchemaCache;
@@ -190,87 +122,12 @@ class TypeSystem {
190
122
  };
191
123
  });
192
124
  }
193
- async themeSettingProperties(uri) {
194
- const themeSettingsSchema = await this.getThemeSettingsSchemaForURI(uri);
195
- const categories = themeSettingsSchema.filter(settings_1.isSettingsCategory);
196
- const result = [];
197
- for (const category of categories) {
198
- const inputSettings = category.settings.filter(settings_1.isInputSetting);
199
- for (const setting of inputSettings) {
200
- result.push({
201
- name: setting.id,
202
- summary: '', // TODO, this should lookup the locale file for settings... setting.label
203
- description: '', // TODO , this should lookup the locale file as well... setting.info,
204
- return_type: settingReturnType(setting),
205
- access: {
206
- global: false,
207
- parents: [],
208
- template: [],
209
- },
210
- });
211
- }
212
- }
213
- return result;
214
- }
215
- async metafieldDefinitionsObjectMap(uri) {
216
- let result = {};
217
- const metafieldDefinitionMap = await this.getMetafieldDefinitions(uri);
218
- for (let [category, definitions] of Object.entries(metafieldDefinitionMap)) {
219
- // Metafield definitions need to be grouped by their namespace
220
- let metafieldNamespaces = new Map();
221
- for (let definition of definitions) {
222
- if (!metafieldNamespaces.has(definition.namespace)) {
223
- metafieldNamespaces.set(definition.namespace, []);
224
- }
225
- metafieldNamespaces.get(definition.namespace).push({
226
- name: definition.key,
227
- description: definition.description,
228
- return_type: metafieldReturnType(definition.type.name),
229
- });
230
- }
231
- let metafieldGroupProperties = [];
232
- for (let [namespace, namespaceProperties] of metafieldNamespaces) {
233
- const metafieldCategoryNamespaceHandle = `${category}_metafield_${namespace}`;
234
- // Since the namespace can be shared by multiple categories, we need to make sure the return_type
235
- // handle is unique across all categories
236
- metafieldGroupProperties.push({
237
- name: namespace,
238
- return_type: [{ type: metafieldCategoryNamespaceHandle, name: '' }],
239
- access: {
240
- global: false,
241
- parents: [],
242
- template: [],
243
- },
244
- });
245
- result[metafieldCategoryNamespaceHandle] = {
246
- name: metafieldCategoryNamespaceHandle,
247
- properties: namespaceProperties,
248
- access: {
249
- global: false,
250
- parents: [],
251
- template: [],
252
- },
253
- };
254
- }
255
- const metafieldCategoryHandle = `${category}_metafields`;
256
- result[metafieldCategoryHandle] = {
257
- name: metafieldCategoryHandle,
258
- properties: metafieldGroupProperties,
259
- access: {
260
- global: false,
261
- parents: [],
262
- template: [],
263
- },
264
- };
265
- }
266
- return result;
267
- }
268
125
  async symbolsTable(partialAst, uri) {
269
126
  const [seedSymbolsTable, liquidDrops, graphqlSchema, rootUri, objectMap, filtersMap] = await Promise.all([
270
127
  this.seedSymbolsTable(uri),
271
- this.themeDocset.liquidDrops(),
128
+ this.platformosDocset.liquidDrops(),
272
129
  this.getGraphQLSchema(),
273
- this.findThemeRootURI?.(uri) ?? null,
130
+ this.findAppRootURI?.(uri) ?? null,
274
131
  this.objectMap(uri, partialAst),
275
132
  this.filtersMap(),
276
133
  ]);
@@ -279,35 +136,9 @@ class TypeSystem {
279
136
  }
280
137
  }
281
138
  exports.TypeSystem = TypeSystem;
282
- const SECTION_FILE_REGEX = /sections[\/\\][^.\\\/]*\.liquid$/;
283
- const BLOCK_FILE_REGEX = /blocks[\/\\][^.\\\/]*\.liquid$/;
284
139
  const PARTIAL_FILE_REGEX = /(views[\/\\]partials[\/\\]|[\/\\]lib[\/\\])[^.]*\.liquid$/;
285
- const LAYOUT_FILE_REGEX = /layout[\/\\]checkout\.liquid$/;
286
140
  function getContextualEntries(uri) {
287
141
  const normalizedUri = platformos_check_common_1.path.normalize(uri);
288
- if (LAYOUT_FILE_REGEX.test(normalizedUri)) {
289
- return [
290
- 'locale',
291
- 'direction',
292
- 'skip_to_content_link',
293
- 'checkout_html_classes',
294
- 'checkout_stylesheets',
295
- 'checkout_scripts',
296
- 'content_for_logo',
297
- 'breadcrumb',
298
- 'order_summary_toggle',
299
- 'content_for_order_summary',
300
- 'alternative_payment_methods',
301
- 'content_for_footer',
302
- 'tracking_code',
303
- ];
304
- }
305
- if (SECTION_FILE_REGEX.test(normalizedUri)) {
306
- return ['section', 'predictive_search', 'recommendations', 'comment'];
307
- }
308
- if (BLOCK_FILE_REGEX.test(normalizedUri)) {
309
- return ['app', 'section', 'recommendations', 'block'];
310
- }
311
142
  if (PARTIAL_FILE_REGEX.test(normalizedUri)) {
312
143
  return ['app'];
313
144
  }
@@ -346,44 +177,194 @@ async function buildSymbolsTable(partialAst, seedSymbolsTable, liquidDrops, grap
346
177
  const typeRanges = await (0, platformos_check_common_2.visit)(partialAst, {
347
178
  // {% assign x = foo.x | filter %}
348
179
  // {% assign x = '{"a": 1}' | parse_json %}
180
+ // {% assign x = {a: 1, b: "hello"} %}
181
+ // {% assign x["key"] = value %}
182
+ // {% assign arr << item %}
183
+ // {% assign arr = source << item %}
349
184
  async AssignMarkup(node) {
350
- // Check if this has a parse_json or to_hash filter
351
- const hasParseJsonFilter = node.value.filters?.some((f) => f.name === 'parse_json' || f.name === 'to_hash');
352
- if (hasParseJsonFilter) {
353
- let jsonString;
354
- // Check if expression is a direct JSON string
355
- if (node.value.expression.type === liquid_html_parser_1.NodeTypes.String) {
356
- jsonString = node.value.expression.value;
185
+ // For explicit push form (assign a = source << value), treat as array append
186
+ const isPushRhs = node.value.type === liquid_html_parser_1.NodeTypes.AssignPushRhs;
187
+ const effectiveValue = isPushRhs
188
+ ? node.value.pushValue
189
+ : node.value;
190
+ const effectiveOperator = isPushRhs ? '<<' : node.operator;
191
+ const expression = effectiveValue.expression;
192
+ let valueShape;
193
+ // Resolver for variable references inside JSON literals
194
+ const resolveExpr = (expr) => {
195
+ if (expr.type !== liquid_html_parser_1.NodeTypes.VariableLookup || !expr.name)
196
+ return undefined;
197
+ // Look up the variable's shape from already-processed assignments
198
+ const shapes = variableShapes.get(expr.name);
199
+ const shapeEntry = shapes
200
+ ? findLastApplicableShape(shapes, node.position.start)
201
+ : undefined;
202
+ let shape = shapeEntry?.shape;
203
+ // Fall back to seedSymbolsTable
204
+ if (!shape && seedSymbolsTable[expr.name]) {
205
+ for (const tr of seedSymbolsTable[expr.name]) {
206
+ if (tr.range[0] < node.position.start) {
207
+ if (typeof tr.type !== 'string' && tr.type.kind === 'shape') {
208
+ shape = tr.type.shape;
209
+ }
210
+ else if (typeof tr.type === 'string' || tr.type.kind === 'array') {
211
+ shape = resolvedTypeToShape(tr.type);
212
+ }
213
+ }
214
+ }
357
215
  }
358
- // Check if there's a default filter with a JSON string argument
359
- if (!jsonString && node.value.filters) {
360
- const defaultFilter = node.value.filters.find((f) => f.name === 'default');
361
- if (defaultFilter && defaultFilter.args && defaultFilter.args.length > 0) {
362
- const firstArg = defaultFilter.args[0];
363
- if (firstArg.type === liquid_html_parser_1.NodeTypes.String) {
364
- jsonString = firstArg.value;
216
+ if (!shape)
217
+ return undefined;
218
+ // Resolve lookups (e.g. a.x or a["key"])
219
+ for (const lookup of expr.lookups) {
220
+ if (shape.kind === 'object' && lookup.type === liquid_html_parser_1.NodeTypes.String && shape.properties) {
221
+ const prop = shape.properties.get(lookup.value);
222
+ if (prop) {
223
+ shape = prop;
224
+ }
225
+ else {
226
+ return undefined;
227
+ }
228
+ }
229
+ else if (shape.kind === 'array') {
230
+ if (lookup.type === liquid_html_parser_1.NodeTypes.Number ||
231
+ (lookup.type === liquid_html_parser_1.NodeTypes.String &&
232
+ (lookup.value === 'first' || lookup.value === 'last'))) {
233
+ shape = shape.itemShape;
234
+ if (!shape)
235
+ return undefined;
236
+ }
237
+ else {
238
+ return undefined;
365
239
  }
366
240
  }
241
+ else {
242
+ return undefined;
243
+ }
367
244
  }
368
- if (jsonString) {
369
- const shape = (0, PropertyShapeInference_1.inferShapeFromJSONString)(jsonString);
370
- if (shape) {
371
- // Track shape for potential hash_assign merging
372
- if (!variableShapes.has(node.name)) {
373
- variableShapes.set(node.name, []);
245
+ return shape;
246
+ };
247
+ // Case 1: JSON literal expression
248
+ if (expression.type === liquid_html_parser_1.NodeTypes.JsonHashLiteral ||
249
+ expression.type === liquid_html_parser_1.NodeTypes.JsonArrayLiteral) {
250
+ valueShape = (0, PropertyShapeInference_1.inferShapeFromJsonLiteral)(expression, resolveExpr);
251
+ }
252
+ // Case 2: parse_json / to_hash filter on a string
253
+ if (!valueShape) {
254
+ const hasParseJsonFilter = effectiveValue.filters?.some((f) => f.name === 'parse_json' || f.name === 'to_hash');
255
+ if (hasParseJsonFilter) {
256
+ let jsonString;
257
+ if (expression.type === liquid_html_parser_1.NodeTypes.String) {
258
+ jsonString = expression.value;
259
+ }
260
+ if (!jsonString && effectiveValue.filters) {
261
+ const defaultFilter = effectiveValue.filters.find((f) => f.name === 'default');
262
+ if (defaultFilter &&
263
+ defaultFilter.args &&
264
+ defaultFilter.args.length > 0 &&
265
+ defaultFilter.args[0].type === liquid_html_parser_1.NodeTypes.String) {
266
+ jsonString = defaultFilter.args[0].value;
374
267
  }
375
- variableShapes.get(node.name).push({ shape, rangeEnd: node.position.end });
376
- return {
377
- identifier: node.name,
378
- type: shapeType(shape),
379
- range: [node.position.end],
380
- };
381
268
  }
269
+ if (jsonString) {
270
+ valueShape = (0, PropertyShapeInference_1.inferShapeFromJSONString)(jsonString) ?? undefined;
271
+ }
272
+ }
273
+ }
274
+ // Case 3: Infer primitive shape for << and LHS lookup scenarios
275
+ if (!valueShape && ((node.lookups && node.lookups.length > 0) || effectiveOperator === '<<')) {
276
+ if (expression.type === liquid_html_parser_1.NodeTypes.String) {
277
+ valueShape = { kind: 'primitive', primitiveType: 'string' };
278
+ }
279
+ else if (expression.type === liquid_html_parser_1.NodeTypes.Number) {
280
+ valueShape = { kind: 'primitive', primitiveType: 'number' };
281
+ }
282
+ else if (expression.type === liquid_html_parser_1.NodeTypes.LiquidLiteral) {
283
+ if (expression.value === null) {
284
+ valueShape = { kind: 'primitive', primitiveType: 'null' };
285
+ }
286
+ else if (typeof expression.value === 'boolean') {
287
+ valueShape = { kind: 'primitive', primitiveType: 'boolean' };
288
+ }
289
+ }
290
+ }
291
+ // Handle lookups on the LHS (assign x["key"] = value)
292
+ if (node.lookups && node.lookups.length > 0) {
293
+ const lookupPath = getAssignLookupPath(node.lookups);
294
+ if (lookupPath && lookupPath.length > 0) {
295
+ const existingShapes = variableShapes.get(node.name) || [];
296
+ const existingShapeEntry = findLastApplicableShape(existingShapes, node.position.start);
297
+ let baseShape;
298
+ if (existingShapeEntry) {
299
+ baseShape = existingShapeEntry.shape;
300
+ }
301
+ else {
302
+ let existingType;
303
+ if (seedSymbolsTable[node.name]) {
304
+ for (const tr of seedSymbolsTable[node.name]) {
305
+ if (tr.range[0] < node.position.start) {
306
+ if (typeof tr.type !== 'string' && tr.type.kind === 'shape') {
307
+ existingType = tr.type;
308
+ }
309
+ }
310
+ }
311
+ }
312
+ baseShape =
313
+ existingType && isShapeType(existingType)
314
+ ? existingType.shape
315
+ : { kind: 'object', properties: new Map() };
316
+ }
317
+ const newShape = mergeNestedPropertyIntoShape(baseShape, lookupPath, valueShape ?? { kind: 'primitive' });
318
+ if (!variableShapes.has(node.name))
319
+ variableShapes.set(node.name, []);
320
+ variableShapes.get(node.name).push({ shape: newShape, rangeEnd: node.position.end });
321
+ return {
322
+ identifier: node.name,
323
+ type: shapeType(newShape),
324
+ range: [node.position.end],
325
+ };
326
+ }
327
+ }
328
+ // Handle << operator (array append), including explicit form (assign a = source << value)
329
+ if (effectiveOperator === '<<') {
330
+ const itemShape = valueShape ?? { kind: 'primitive' };
331
+ const existingShapes = variableShapes.get(node.name) || [];
332
+ const existingShapeEntry = findLastApplicableShape(existingShapes, node.position.start);
333
+ let arrayShape;
334
+ if (existingShapeEntry?.shape.kind === 'array') {
335
+ const existing = existingShapeEntry.shape.itemShape;
336
+ arrayShape = {
337
+ kind: 'array',
338
+ itemShape: existing ? (0, PropertyShapeInference_1.mergeShapes)(existing, itemShape) : itemShape,
339
+ };
340
+ }
341
+ else {
342
+ arrayShape = { kind: 'array', itemShape };
382
343
  }
344
+ if (!variableShapes.has(node.name))
345
+ variableShapes.set(node.name, []);
346
+ variableShapes.get(node.name).push({ shape: arrayShape, rangeEnd: node.position.end });
347
+ return {
348
+ identifier: node.name,
349
+ type: shapeType(arrayShape),
350
+ range: [node.position.end],
351
+ };
383
352
  }
353
+ // Simple assignment with shape (JSON literal or parse_json)
354
+ if (valueShape) {
355
+ if (!variableShapes.has(node.name))
356
+ variableShapes.set(node.name, []);
357
+ variableShapes.get(node.name).push({ shape: valueShape, rangeEnd: node.position.end });
358
+ return {
359
+ identifier: node.name,
360
+ type: shapeType(valueShape),
361
+ range: [node.position.end],
362
+ };
363
+ }
364
+ // Default: lazy variable type
384
365
  return {
385
366
  identifier: node.name,
386
- type: lazyVariable(node.value, node.position.start),
367
+ type: lazyVariable(effectiveValue, node.position.start),
387
368
  range: [node.position.end],
388
369
  };
389
370
  },
@@ -417,13 +398,6 @@ async function buildSymbolsTable(partialAst, seedSymbolsTable, liquidDrops, grap
417
398
  range: [node.position.end],
418
399
  };
419
400
  }
420
- else if (['form', 'paginate'].includes(node.name)) {
421
- return {
422
- identifier: node.name,
423
- type: node.name,
424
- range: [node.blockStartPosition.end, end(node.blockEndPosition?.end)],
425
- };
426
- }
427
401
  else if (['for', 'tablerow'].includes(node.name)) {
428
402
  return {
429
403
  identifier: node.name + 'loop',
@@ -731,10 +705,22 @@ function inferType(thing, symbolsTable, objectMap, filtersMap) {
731
705
  case liquid_html_parser_1.NodeTypes.Range: {
732
706
  return arrayType('number');
733
707
  }
708
+ // JSON literal expressions: {key: val} or [1, 2, 3]
709
+ case liquid_html_parser_1.NodeTypes.JsonHashLiteral:
710
+ case liquid_html_parser_1.NodeTypes.JsonArrayLiteral: {
711
+ const resolver = (expr) => {
712
+ const type = inferType(expr, symbolsTable, objectMap, filtersMap);
713
+ return resolvedTypeToShape(type);
714
+ };
715
+ return shapeType((0, PropertyShapeInference_1.inferShapeFromJsonLiteral)(thing, resolver));
716
+ }
734
717
  // The type of the assign markup is the type of the right hand side.
735
718
  // {% assign x = y.property | filter1 | filter2 %}
736
719
  case liquid_html_parser_1.NodeTypes.AssignMarkup: {
737
- return inferType(thing.value, symbolsTable, objectMap, filtersMap);
720
+ const assignValue = thing.value.type === liquid_html_parser_1.NodeTypes.AssignPushRhs
721
+ ? thing.value.pushValue
722
+ : thing.value;
723
+ return inferType(assignValue, symbolsTable, objectMap, filtersMap);
738
724
  }
739
725
  // A variable lookup is expression[.lookup]*
740
726
  // {{ y.property }}
@@ -996,6 +982,34 @@ function shapeToType(shape) {
996
982
  }
997
983
  return exports.Untyped;
998
984
  }
985
+ /**
986
+ * Convert a resolved type back to a PropertyShape (inverse of shapeToType).
987
+ * Used when embedding resolved variable types into JSON literal shapes.
988
+ */
989
+ function resolvedTypeToShape(type) {
990
+ if (typeof type === 'string') {
991
+ switch (type) {
992
+ case 'string':
993
+ return { kind: 'primitive', primitiveType: 'string' };
994
+ case 'number':
995
+ return { kind: 'primitive', primitiveType: 'number' };
996
+ case 'boolean':
997
+ return { kind: 'primitive', primitiveType: 'boolean' };
998
+ case exports.Untyped:
999
+ case exports.Unknown:
1000
+ return undefined;
1001
+ default:
1002
+ return { kind: 'primitive' };
1003
+ }
1004
+ }
1005
+ if (isShapeType(type))
1006
+ return type.shape;
1007
+ if (isArrayType(type)) {
1008
+ const itemShape = resolvedTypeToShape(type.valueType);
1009
+ return { kind: 'array', itemShape };
1010
+ }
1011
+ return undefined;
1012
+ }
999
1013
  function inferPseudoTypePropertyType(curr, // settings
1000
1014
  lookup, objectMap) {
1001
1015
  const parentEntry = objectMap[curr];
@@ -1239,6 +1253,25 @@ function typeToDisplayString(type) {
1239
1253
  return type.types.map((t) => typeToDisplayString(t)).join(' | ');
1240
1254
  return 'unknown';
1241
1255
  }
1256
+ /**
1257
+ * Extract the lookup path from assign lookups.
1258
+ * For {% assign a["key1"]["key2"] = value %}, returns ['key1', 'key2']
1259
+ */
1260
+ function getAssignLookupPath(lookups) {
1261
+ const path = [];
1262
+ for (const lookup of lookups) {
1263
+ if (lookup.type === liquid_html_parser_1.NodeTypes.String) {
1264
+ path.push(lookup.value);
1265
+ }
1266
+ else if (lookup.type === liquid_html_parser_1.NodeTypes.Number) {
1267
+ path.push(`${lookup.value}`);
1268
+ }
1269
+ else {
1270
+ return undefined;
1271
+ }
1272
+ }
1273
+ return path.length > 0 ? path : undefined;
1274
+ }
1242
1275
  /**
1243
1276
  * Extract the lookup path from a hash_assign target.
1244
1277
  * For {% hash_assign a['key1']['key2'] = value %}, returns ['key1', 'key2']
@@ -1301,181 +1334,4 @@ function findLastApplicableShape(shapes, position) {
1301
1334
  }
1302
1335
  return result;
1303
1336
  }
1304
- function settingReturnType(setting) {
1305
- switch (setting.type) {
1306
- // basic settings
1307
- case 'checkbox':
1308
- return [{ type: 'boolean', name: '' }];
1309
- case 'range':
1310
- case 'number':
1311
- return [{ type: 'number', name: '' }];
1312
- case 'radio':
1313
- case 'select':
1314
- case 'text':
1315
- case 'textarea':
1316
- return [{ type: 'string', name: '' }];
1317
- // specialized settings
1318
- case 'article':
1319
- return [{ type: 'article', name: '' }];
1320
- case 'blog':
1321
- return [{ type: 'blog', name: '' }];
1322
- case 'collection':
1323
- return [{ type: 'collection', name: '' }];
1324
- case 'collection_list':
1325
- return [{ type: 'array', array_value: 'collection' }];
1326
- case 'color':
1327
- return [{ type: 'color', name: '' }];
1328
- case 'color_background':
1329
- return [{ type: 'string', name: '' }];
1330
- case 'color_scheme':
1331
- return [{ type: 'color_scheme', name: '' }];
1332
- // TODO ??
1333
- case 'color_scheme_group':
1334
- return [];
1335
- case 'font_picker':
1336
- return [{ type: 'font', name: '' }];
1337
- case 'html':
1338
- return [{ type: 'string', name: '' }];
1339
- case 'image_picker':
1340
- return [{ type: 'image', name: '' }];
1341
- case 'inline_richtext':
1342
- return [{ type: 'string', name: '' }];
1343
- case 'link_list':
1344
- return [{ type: 'linklist', name: '' }];
1345
- case 'liquid':
1346
- return [{ type: 'string', name: '' }];
1347
- case 'page':
1348
- return [{ type: 'page', name: '' }];
1349
- case 'product':
1350
- return [{ type: 'product', name: '' }];
1351
- case 'product_list':
1352
- return [{ type: 'array', array_value: 'product' }];
1353
- case 'richtext':
1354
- return [{ type: 'string', name: '' }];
1355
- case 'text_alignment':
1356
- return [{ type: 'string', name: '' }];
1357
- case 'url':
1358
- return [{ type: 'string', name: '' }];
1359
- case 'video':
1360
- return [{ type: 'video', name: '' }];
1361
- case 'video_url':
1362
- return [{ type: 'string', name: '' }];
1363
- default:
1364
- return [];
1365
- }
1366
- }
1367
- const METAFIELD_TYPE_TO_TYPE = Object.freeze({
1368
- single_line_text_field: String,
1369
- multi_line_text_field: String,
1370
- url_reference: String,
1371
- date: String,
1372
- date_time: String,
1373
- number_integer: 'number',
1374
- number_decimal: 'number',
1375
- product_reference: 'product',
1376
- collection_reference: 'collection',
1377
- variant_reference: 'variant',
1378
- page_reference: 'page',
1379
- boolean: 'boolean',
1380
- color: 'color',
1381
- weight: 'measurement',
1382
- volume: 'measurement',
1383
- dimension: 'measurement',
1384
- rating: 'rating',
1385
- money: 'money',
1386
- json: exports.Untyped,
1387
- metaobject_reference: 'metaobject',
1388
- mixed_reference: exports.Untyped,
1389
- rich_text_field: exports.Untyped,
1390
- file_reference: exports.Untyped,
1391
- });
1392
- const REFERENCE_TYPE_METAFIELDS = Object.entries(METAFIELD_TYPE_TO_TYPE)
1393
- .filter(([metafieldType, _type]) => metafieldType.endsWith('_reference'))
1394
- .map(([_metafieldType, type]) => type);
1395
- function metafieldReturnType(metafieldType) {
1396
- let isArray = metafieldType.startsWith('list.');
1397
- if (isArray) {
1398
- metafieldType = metafieldType.split('.')[1];
1399
- }
1400
- let type = 'metafield_' + (METAFIELD_TYPE_TO_TYPE[metafieldType] ?? exports.Untyped);
1401
- if (isArray) {
1402
- return [{ type: `${type}_array`, name: '' }];
1403
- }
1404
- return [{ type: type, name: '' }];
1405
- }
1406
- // The default `metafield` type has an untyped `value` property.
1407
- // We need to create new metafield types with the labels `metafield_x` and `metafield_x_array`
1408
- // where x is the type of metafield inside the `value` property. The metafields ending with `x_array`
1409
- // is where the value is an array of type x.
1410
- const customMetafieldTypeEntries = (0, utils_1.memo)((baseMetafieldEntry) => {
1411
- if (!baseMetafieldEntry)
1412
- return {};
1413
- return [
1414
- ...new Set([...Object.values(METAFIELD_TYPE_TO_TYPE), ...platformos_check_common_1.FETCHED_METAFIELD_CATEGORIES]),
1415
- ].reduce((map, type) => {
1416
- {
1417
- const metafieldEntry = JSON.parse(JSON.stringify(baseMetafieldEntry)); // easy deep clone
1418
- const metafieldValueProp = metafieldEntry.properties?.find((prop) => prop.name === 'value');
1419
- if (metafieldValueProp) {
1420
- metafieldValueProp.return_type = [{ type: type, name: '' }];
1421
- metafieldValueProp.description = '';
1422
- metafieldEntry.name = `metafield_${type}`;
1423
- map[metafieldEntry.name] = metafieldEntry;
1424
- }
1425
- }
1426
- {
1427
- const metafieldArrayEntry = JSON.parse(JSON.stringify(baseMetafieldEntry)); // easy deep clone
1428
- const metafieldArrayValueProp = metafieldArrayEntry.properties?.find((prop) => prop.name === 'value');
1429
- if (metafieldArrayValueProp) {
1430
- // A metafield definition using a list of references does not use an array, but a separate type of collection.
1431
- // For auto-completion purposes, we can't use the array type
1432
- // https://shopify.dev/docs/api/liquid/objects/metafield#metafield-determining-the-length-of-a-list-metafield
1433
- if (REFERENCE_TYPE_METAFIELDS.includes(type)) {
1434
- metafieldArrayValueProp.return_type = [{ type: 'untyped', name: '' }];
1435
- }
1436
- else {
1437
- metafieldArrayValueProp.return_type = [{ type: 'array', name: '', array_value: type }];
1438
- }
1439
- metafieldArrayValueProp.description = '';
1440
- metafieldArrayEntry.name = `metafield_${type}_array`;
1441
- map[metafieldArrayEntry.name] = metafieldArrayEntry;
1442
- }
1443
- }
1444
- return map;
1445
- }, {});
1446
- });
1447
- function schemaSettingsAsProperties(ast) {
1448
- if (ast.type !== liquid_html_parser_1.NodeTypes.Document)
1449
- return [];
1450
- try {
1451
- const source = ast._source; // (the unfixed source)
1452
- const start = /\{%\s*schema\s*%\}/m.exec(source);
1453
- const end = /\{%\s*endschema\s*%\}/m.exec(source);
1454
- if (!start || !end)
1455
- return [];
1456
- const schema = source.slice(start.index + start[0].length, end.index);
1457
- const json = (0, platformos_check_common_1.parseJSON)(schema);
1458
- if ((0, platformos_check_common_1.isError)(json) || !('settings' in json) || !Array.isArray(json.settings))
1459
- return [];
1460
- const result = [];
1461
- const inputSettings = json.settings.filter(settings_1.isInputSetting);
1462
- for (const setting of inputSettings) {
1463
- result.push({
1464
- name: setting.id,
1465
- summary: '', // TODO, this should lookup the locale file for settings... setting.label
1466
- description: '', // TODO , this should lookup the locale file as well... setting.info,
1467
- return_type: settingReturnType(setting),
1468
- access: {
1469
- global: false,
1470
- parents: [],
1471
- template: [],
1472
- },
1473
- });
1474
- }
1475
- return result;
1476
- }
1477
- catch (_) {
1478
- return [];
1479
- }
1480
- }
1481
1337
  //# sourceMappingURL=TypeSystem.js.map