@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.
- package/CHANGELOG.md +20 -0
- package/dist/PropertyShapeInference.d.ts +18 -0
- package/dist/PropertyShapeInference.js +58 -0
- package/dist/PropertyShapeInference.js.map +1 -1
- package/dist/TypeSystem.d.ts +4 -9
- package/dist/TypeSystem.js +234 -388
- package/dist/TypeSystem.js.map +1 -1
- package/dist/completions/CompletionsProvider.d.ts +6 -10
- package/dist/completions/CompletionsProvider.js +6 -9
- package/dist/completions/CompletionsProvider.js.map +1 -1
- package/dist/completions/params/LiquidCompletionParams.js +4 -16
- package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
- package/dist/completions/providers/ContentForCompletionProvider.js +2 -4
- package/dist/completions/providers/ContentForCompletionProvider.js.map +1 -1
- package/dist/completions/providers/FilterCompletionProvider.js.map +1 -1
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.js +6 -6
- package/dist/completions/providers/FilterNamedParameterCompletionProvider.js.map +1 -1
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js +3 -3
- package/dist/completions/providers/LiquidDocParamTypeCompletionProvider.js.map +1 -1
- package/dist/completions/providers/LiquidTagsCompletionProvider.d.ts +3 -3
- package/dist/completions/providers/LiquidTagsCompletionProvider.js +3 -3
- package/dist/completions/providers/LiquidTagsCompletionProvider.js.map +1 -1
- package/dist/completions/providers/RenderPartialParameterCompletionProvider.js +1 -1
- package/dist/completions/providers/RenderPartialParameterCompletionProvider.js.map +1 -1
- package/dist/completions/providers/TranslationCompletionProvider.js +1 -1
- package/dist/completions/providers/TranslationCompletionProvider.js.map +1 -1
- package/dist/completions/providers/index.d.ts +0 -3
- package/dist/completions/providers/index.js +1 -7
- package/dist/completions/providers/index.js.map +1 -1
- package/dist/css/CSSLanguageService.d.ts +19 -5
- package/dist/css/CSSLanguageService.js +77 -63
- package/dist/css/CSSLanguageService.js.map +1 -1
- package/dist/definitions/DefinitionProvider.d.ts +1 -1
- package/dist/definitions/DefinitionProvider.js +1 -3
- package/dist/definitions/DefinitionProvider.js.map +1 -1
- package/dist/diagnostics/offenseToDiagnostic.js +1 -1
- package/dist/diagnostics/offenseToDiagnostic.js.map +1 -1
- package/dist/diagnostics/runChecks.d.ts +3 -5
- package/dist/diagnostics/runChecks.js +12 -64
- package/dist/diagnostics/runChecks.js.map +1 -1
- package/dist/docset/MarkdownRenderer.js +1 -1
- package/dist/docset/MarkdownRenderer.js.map +1 -1
- package/dist/documentHighlights/providers/HtmlTagNameDocumentHighlightsProvider.d.ts +1 -1
- package/dist/documentLinks/DocumentLinksProvider.d.ts +3 -3
- package/dist/documentLinks/DocumentLinksProvider.js +3 -3
- package/dist/documentLinks/DocumentLinksProvider.js.map +1 -1
- package/dist/documents/DocumentManager.d.ts +4 -5
- package/dist/documents/DocumentManager.js +12 -11
- package/dist/documents/DocumentManager.js.map +1 -1
- package/dist/documents/types.d.ts +16 -3
- package/dist/documents/types.js +3 -3
- package/dist/documents/types.js.map +1 -1
- package/dist/formatting/OnTypeFormattingProvider.d.ts +1 -1
- package/dist/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.js.map +1 -1
- package/dist/hover/HoverProvider.d.ts +5 -8
- package/dist/hover/HoverProvider.js +8 -14
- package/dist/hover/HoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidFilterArgumentHoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidFilterHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidFilterHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidFilterHoverProvider.js.map +1 -1
- package/dist/hover/providers/LiquidTagHoverProvider.d.ts +3 -3
- package/dist/hover/providers/LiquidTagHoverProvider.js +3 -3
- package/dist/hover/providers/LiquidTagHoverProvider.js.map +1 -1
- package/dist/hover/providers/RenderPartialHoverProvider.js +1 -1
- package/dist/hover/providers/RenderPartialHoverProvider.js.map +1 -1
- package/dist/hover/providers/RenderPartialParameterHoverProvider.js +1 -1
- package/dist/hover/providers/RenderPartialParameterHoverProvider.js.map +1 -1
- package/dist/hover/providers/TranslationHoverProvider.d.ts +3 -3
- package/dist/hover/providers/TranslationHoverProvider.js +3 -3
- package/dist/hover/providers/TranslationHoverProvider.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/json/JSONContributions.d.ts +1 -5
- package/dist/json/JSONContributions.js +4 -36
- package/dist/json/JSONContributions.js.map +1 -1
- package/dist/json/JSONLanguageService.d.ts +4 -12
- package/dist/json/JSONLanguageService.js +17 -80
- package/dist/json/JSONLanguageService.js.map +1 -1
- package/dist/json/test/test-helpers.d.ts +1 -3
- package/dist/json/test/test-helpers.js +3 -19
- package/dist/json/test/test-helpers.js.map +1 -1
- package/dist/json/utils.d.ts +0 -5
- package/dist/json/utils.js +0 -24
- package/dist/json/utils.js.map +1 -1
- package/dist/linkedEditingRanges/providers/HtmlTagNameLinkedRangesProvider.d.ts +1 -1
- package/dist/progress.js.map +1 -1
- package/dist/rename/RenameProvider.d.ts +2 -2
- package/dist/rename/RenameProvider.js +2 -2
- package/dist/rename/RenameProvider.js.map +1 -1
- package/dist/rename/providers/LiquidVariableRenameProvider.d.ts +3 -3
- package/dist/rename/providers/LiquidVariableRenameProvider.js +4 -4
- package/dist/rename/providers/LiquidVariableRenameProvider.js.map +1 -1
- package/dist/renamed/RenameHandler.d.ts +2 -3
- package/dist/renamed/RenameHandler.js +3 -8
- package/dist/renamed/RenameHandler.js.map +1 -1
- package/dist/renamed/handlers/AssetRenameHandler.d.ts +3 -3
- package/dist/renamed/handlers/AssetRenameHandler.js +5 -5
- package/dist/renamed/handlers/AssetRenameHandler.js.map +1 -1
- package/dist/renamed/handlers/PartialRenameHandler.d.ts +3 -3
- package/dist/renamed/handlers/PartialRenameHandler.js +5 -5
- package/dist/renamed/handlers/PartialRenameHandler.js.map +1 -1
- package/dist/renamed/handlers/utils.d.ts +1 -1
- package/dist/server/AppGraphManager.d.ts +32 -0
- package/dist/server/AppGraphManager.js +155 -0
- package/dist/server/AppGraphManager.js.map +1 -0
- package/dist/server/Configuration.js.map +1 -1
- package/dist/server/startServer.d.ts +2 -2
- package/dist/server/startServer.js +62 -164
- package/dist/server/startServer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +33 -54
- package/dist/types.js +21 -26
- package/dist/types.js.map +1 -1
- package/dist/utils/liquidDoc.js +1 -1
- package/dist/utils/liquidDoc.js.map +1 -1
- package/dist/utils/uri.d.ts +0 -8
- package/dist/utils/uri.js +1 -17
- package/dist/utils/uri.js.map +1 -1
- package/package.json +9 -9
- package/src/PropertyShapeInference.ts +76 -1
- package/src/TypeSystem.spec.ts +187 -452
- package/src/TypeSystem.ts +253 -459
- package/src/completions/CompletionsProvider.ts +13 -34
- package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
- package/src/completions/params/LiquidCompletionParams.ts +4 -14
- package/src/completions/params/fix.spec.ts +0 -3
- package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
- package/src/completions/providers/FilterCompletionProvider.ts +6 -6
- package/src/completions/providers/FilterNamedParameterCompletionProvider.spec.ts +1 -5
- package/src/completions/providers/FilterNamedParameterCompletionProvider.ts +6 -6
- package/src/completions/providers/HtmlAttributeCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/HtmlAttributeValueCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/HtmlTagCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/LiquidDocParamTypeCompletionProvider.spec.ts +1 -28
- package/src/completions/providers/LiquidDocParamTypeCompletionProvider.ts +3 -3
- package/src/completions/providers/LiquidDocTagCompletionProvider.spec.ts +1 -26
- package/src/completions/providers/LiquidTagsCompletionProvider.spec.ts +2 -16
- package/src/completions/providers/LiquidTagsCompletionProvider.ts +3 -3
- package/src/completions/providers/ObjectAttributeCompletionProvider.spec.ts +2 -31
- package/src/completions/providers/ObjectCompletionProvider.spec.ts +34 -123
- package/src/completions/providers/PartialCompletionProvider.spec.ts +4 -13
- package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +3 -5
- package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +0 -1
- package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/TranslationCompletionProvider.ts +1 -1
- package/src/completions/providers/index.ts +0 -3
- package/src/css/CSSLanguageService.ts +97 -81
- package/src/definitions/DefinitionProvider.ts +0 -6
- package/src/definitions/providers/TranslationStringDefinitionProvider.spec.ts +1 -5
- package/src/diagnostics/offenseToDiagnostic.ts +1 -1
- package/src/diagnostics/runChecks.spec.ts +16 -24
- package/src/diagnostics/runChecks.ts +17 -91
- package/src/docset/MarkdownRenderer.ts +1 -1
- package/src/documentLinks/DocumentLinksProvider.ts +3 -3
- package/src/documents/DocumentManager.spec.ts +12 -97
- package/src/documents/DocumentManager.ts +13 -14
- package/src/documents/types.ts +18 -9
- package/src/formatting/providers/HtmlElementAutoclosingOnTypeFormattingProvider.ts +1 -3
- package/src/hover/HoverProvider.ts +9 -21
- package/src/hover/providers/HtmlAttributeHoverProvider.spec.ts +1 -3
- package/src/hover/providers/HtmlAttributeValueHoverProvider.spec.ts +1 -3
- package/src/hover/providers/HtmlTagHoverProvider.spec.ts +1 -3
- package/src/hover/providers/LiquidDocTagHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterArgumentHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterArgumentHoverProvider.ts +3 -3
- package/src/hover/providers/LiquidFilterHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidFilterHoverProvider.ts +3 -3
- package/src/hover/providers/LiquidObjectAttributeHoverProvider.spec.ts +1 -3
- package/src/hover/providers/LiquidObjectHoverProvider.spec.ts +46 -129
- package/src/hover/providers/LiquidTagHoverProvider.spec.ts +0 -3
- package/src/hover/providers/LiquidTagHoverProvider.ts +3 -3
- package/src/hover/providers/RenderPartialHoverProvider.spec.ts +1 -4
- package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
- package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +1 -4
- package/src/hover/providers/RenderPartialParameterHoverProvider.ts +0 -1
- package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
- package/src/hover/providers/TranslationHoverProvider.ts +3 -3
- package/src/index.ts +2 -5
- package/src/internal-types.ts +1 -1
- package/src/json/JSONContributions.ts +4 -61
- package/src/json/JSONLanguageService.ts +19 -117
- package/src/json/test/test-helpers.ts +4 -35
- package/src/json/utils.ts +0 -27
- package/src/progress.ts +4 -1
- package/src/rename/RenameProvider.ts +3 -3
- package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +4 -4
- package/src/rename/providers/LiquidVariableRenameProvider.ts +4 -4
- package/src/renamed/RenameHandler.ts +4 -9
- package/src/renamed/handlers/AssetRenameHandler.spec.ts +3 -3
- package/src/renamed/handlers/AssetRenameHandler.ts +5 -5
- package/src/renamed/handlers/PartialRenameHandler.spec.ts +2 -2
- package/src/renamed/handlers/PartialRenameHandler.ts +5 -5
- package/src/renamed/handlers/utils.ts +1 -1
- package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
- package/src/server/Configuration.ts +4 -1
- package/src/server/startServer.spec.ts +7 -9
- package/src/server/startServer.ts +65 -217
- package/src/test/CompletionItemsAssertion.spec.ts +1 -4
- package/src/types.ts +33 -63
- package/src/utils/liquidDoc.ts +1 -1
- package/src/utils/uri.ts +0 -14
- package/src/completions/providers/ContentForBlockTypeCompletionProvider.spec.ts +0 -41
- package/src/completions/providers/ContentForBlockTypeCompletionProvider.ts +0 -42
- package/src/completions/providers/ContentForCompletionProvider.spec.ts +0 -96
- package/src/completions/providers/ContentForCompletionProvider.ts +0 -113
- package/src/completions/providers/ContentForParameterCompletionProvider.spec.ts +0 -362
- package/src/completions/providers/ContentForParameterCompletionProvider.ts +0 -187
- package/src/completions/providers/data/contentForParameterCompletionOptions.ts +0 -9
- package/src/css/CSSLanguageService.spec.ts +0 -161
- package/src/css/test/test-helpers.ts +0 -30
- package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.spec.ts +0 -96
- package/src/definitions/providers/SchemaTranslationStringDefinitionProvider.ts +0 -82
- package/src/hover/providers/ContentForArgumentHoverProvider.spec.ts +0 -76
- package/src/hover/providers/ContentForArgumentHoverProvider.ts +0 -56
- package/src/hover/providers/ContentForTypeHoverProvider.spec.ts +0 -91
- package/src/hover/providers/ContentForTypeHoverProvider.ts +0 -42
- package/src/json/JSONLanguageService.spec.ts +0 -424
- package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.spec.ts +0 -163
- package/src/json/completions/providers/BlockSettingsPropertyCompletionProvider.ts +0 -121
- package/src/json/completions/providers/BlockTypeCompletionProvider.spec.ts +0 -137
- package/src/json/completions/providers/BlockTypeCompletionProvider.ts +0 -108
- package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.spec.ts +0 -132
- package/src/json/completions/providers/ReferencedBlockTypeCompletionProvider.ts +0 -120
- package/src/json/completions/providers/SchemaTranslationCompletionProvider.ts +0 -51
- package/src/json/completions/providers/SettingsPropertyCompletionProvider.spec.ts +0 -211
- package/src/json/completions/providers/SettingsPropertyCompletionProvider.ts +0 -75
- package/src/json/documentLinks/DocumentLinksProvider.spec.ts +0 -223
- package/src/json/documentLinks/DocumentLinksProvider.ts +0 -61
- package/src/json/hover/providers/BlockSettingsHoverProvider.spec.ts +0 -292
- package/src/json/hover/providers/BlockSettingsHoverProvider.ts +0 -99
- package/src/json/hover/providers/SchemaTranslationHoverProvider.ts +0 -35
- package/src/json/hover/providers/SettingsHoverProvider.spec.ts +0 -139
- package/src/json/hover/providers/SettingsHoverProvider.ts +0 -79
- package/src/json/schemaSettings.spec.ts +0 -103
- package/src/json/schemaSettings.ts +0 -53
- package/src/plugins/css.ts +0 -12
- package/src/renamed/handlers/BlockRenameHandler.spec.ts +0 -399
- package/src/renamed/handlers/BlockRenameHandler.ts +0 -402
- package/src/renamed/handlers/SectionRenameHandler.spec.ts +0 -321
- package/src/renamed/handlers/SectionRenameHandler.ts +0 -224
- package/src/settings/index.ts +0 -50
package/dist/TypeSystem.js
CHANGED
|
@@ -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(
|
|
18
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
47
|
+
return this.platformosDocset.filters();
|
|
116
48
|
});
|
|
117
49
|
this.objectEntries = (0, utils_1.memo)(async () => {
|
|
118
|
-
return this.
|
|
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.
|
|
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.
|
|
128
|
+
this.platformosDocset.liquidDrops(),
|
|
272
129
|
this.getGraphQLSchema(),
|
|
273
|
-
this.
|
|
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,41 +177,184 @@ 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 %}
|
|
349
183
|
async AssignMarkup(node) {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
184
|
+
const expression = node.value.expression;
|
|
185
|
+
let valueShape;
|
|
186
|
+
// Resolver for variable references inside JSON literals
|
|
187
|
+
const resolveExpr = (expr) => {
|
|
188
|
+
if (expr.type !== liquid_html_parser_1.NodeTypes.VariableLookup || !expr.name)
|
|
189
|
+
return undefined;
|
|
190
|
+
// Look up the variable's shape from already-processed assignments
|
|
191
|
+
const shapes = variableShapes.get(expr.name);
|
|
192
|
+
const shapeEntry = shapes
|
|
193
|
+
? findLastApplicableShape(shapes, node.position.start)
|
|
194
|
+
: undefined;
|
|
195
|
+
let shape = shapeEntry?.shape;
|
|
196
|
+
// Fall back to seedSymbolsTable
|
|
197
|
+
if (!shape && seedSymbolsTable[expr.name]) {
|
|
198
|
+
for (const tr of seedSymbolsTable[expr.name]) {
|
|
199
|
+
if (tr.range[0] < node.position.start) {
|
|
200
|
+
if (typeof tr.type !== 'string' && tr.type.kind === 'shape') {
|
|
201
|
+
shape = tr.type.shape;
|
|
202
|
+
}
|
|
203
|
+
else if (typeof tr.type === 'string' || tr.type.kind === 'array') {
|
|
204
|
+
shape = resolvedTypeToShape(tr.type);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
357
208
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
209
|
+
if (!shape)
|
|
210
|
+
return undefined;
|
|
211
|
+
// Resolve lookups (e.g. a.x or a["key"])
|
|
212
|
+
for (const lookup of expr.lookups) {
|
|
213
|
+
if (shape.kind === 'object' && lookup.type === liquid_html_parser_1.NodeTypes.String && shape.properties) {
|
|
214
|
+
const prop = shape.properties.get(lookup.value);
|
|
215
|
+
if (prop) {
|
|
216
|
+
shape = prop;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (shape.kind === 'array') {
|
|
223
|
+
if (lookup.type === liquid_html_parser_1.NodeTypes.Number ||
|
|
224
|
+
(lookup.type === liquid_html_parser_1.NodeTypes.String &&
|
|
225
|
+
(lookup.value === 'first' || lookup.value === 'last'))) {
|
|
226
|
+
shape = shape.itemShape;
|
|
227
|
+
if (!shape)
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
return undefined;
|
|
365
232
|
}
|
|
366
233
|
}
|
|
234
|
+
else {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
367
237
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
238
|
+
return shape;
|
|
239
|
+
};
|
|
240
|
+
// Case 1: JSON literal expression
|
|
241
|
+
if (expression.type === liquid_html_parser_1.NodeTypes.JsonHashLiteral ||
|
|
242
|
+
expression.type === liquid_html_parser_1.NodeTypes.JsonArrayLiteral) {
|
|
243
|
+
valueShape = (0, PropertyShapeInference_1.inferShapeFromJsonLiteral)(expression, resolveExpr);
|
|
244
|
+
}
|
|
245
|
+
// Case 2: parse_json / to_hash filter on a string
|
|
246
|
+
if (!valueShape) {
|
|
247
|
+
const hasParseJsonFilter = node.value.filters?.some((f) => f.name === 'parse_json' || f.name === 'to_hash');
|
|
248
|
+
if (hasParseJsonFilter) {
|
|
249
|
+
let jsonString;
|
|
250
|
+
if (expression.type === liquid_html_parser_1.NodeTypes.String) {
|
|
251
|
+
jsonString = expression.value;
|
|
252
|
+
}
|
|
253
|
+
if (!jsonString && node.value.filters) {
|
|
254
|
+
const defaultFilter = node.value.filters.find((f) => f.name === 'default');
|
|
255
|
+
if (defaultFilter &&
|
|
256
|
+
defaultFilter.args &&
|
|
257
|
+
defaultFilter.args.length > 0 &&
|
|
258
|
+
defaultFilter.args[0].type === liquid_html_parser_1.NodeTypes.String) {
|
|
259
|
+
jsonString = defaultFilter.args[0].value;
|
|
374
260
|
}
|
|
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
261
|
}
|
|
262
|
+
if (jsonString) {
|
|
263
|
+
valueShape = (0, PropertyShapeInference_1.inferShapeFromJSONString)(jsonString) ?? undefined;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Case 3: Infer primitive shape for << and LHS lookup scenarios
|
|
268
|
+
if (!valueShape && ((node.lookups && node.lookups.length > 0) || node.operator === '<<')) {
|
|
269
|
+
if (expression.type === liquid_html_parser_1.NodeTypes.String) {
|
|
270
|
+
valueShape = { kind: 'primitive', primitiveType: 'string' };
|
|
271
|
+
}
|
|
272
|
+
else if (expression.type === liquid_html_parser_1.NodeTypes.Number) {
|
|
273
|
+
valueShape = { kind: 'primitive', primitiveType: 'number' };
|
|
274
|
+
}
|
|
275
|
+
else if (expression.type === liquid_html_parser_1.NodeTypes.LiquidLiteral) {
|
|
276
|
+
if (expression.value === null) {
|
|
277
|
+
valueShape = { kind: 'primitive', primitiveType: 'null' };
|
|
278
|
+
}
|
|
279
|
+
else if (typeof expression.value === 'boolean') {
|
|
280
|
+
valueShape = { kind: 'primitive', primitiveType: 'boolean' };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Handle lookups on the LHS (assign x["key"] = value)
|
|
285
|
+
if (node.lookups && node.lookups.length > 0) {
|
|
286
|
+
const lookupPath = getAssignLookupPath(node.lookups);
|
|
287
|
+
if (lookupPath && lookupPath.length > 0) {
|
|
288
|
+
const existingShapes = variableShapes.get(node.name) || [];
|
|
289
|
+
const existingShapeEntry = findLastApplicableShape(existingShapes, node.position.start);
|
|
290
|
+
let baseShape;
|
|
291
|
+
if (existingShapeEntry) {
|
|
292
|
+
baseShape = existingShapeEntry.shape;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
let existingType;
|
|
296
|
+
if (seedSymbolsTable[node.name]) {
|
|
297
|
+
for (const tr of seedSymbolsTable[node.name]) {
|
|
298
|
+
if (tr.range[0] < node.position.start) {
|
|
299
|
+
if (typeof tr.type !== 'string' && tr.type.kind === 'shape') {
|
|
300
|
+
existingType = tr.type;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
baseShape =
|
|
306
|
+
existingType && isShapeType(existingType)
|
|
307
|
+
? existingType.shape
|
|
308
|
+
: { kind: 'object', properties: new Map() };
|
|
309
|
+
}
|
|
310
|
+
const newShape = mergeNestedPropertyIntoShape(baseShape, lookupPath, valueShape ?? { kind: 'primitive' });
|
|
311
|
+
if (!variableShapes.has(node.name))
|
|
312
|
+
variableShapes.set(node.name, []);
|
|
313
|
+
variableShapes.get(node.name).push({ shape: newShape, rangeEnd: node.position.end });
|
|
314
|
+
return {
|
|
315
|
+
identifier: node.name,
|
|
316
|
+
type: shapeType(newShape),
|
|
317
|
+
range: [node.position.end],
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Handle << operator (array append)
|
|
322
|
+
if (node.operator === '<<') {
|
|
323
|
+
const itemShape = valueShape ?? { kind: 'primitive' };
|
|
324
|
+
const existingShapes = variableShapes.get(node.name) || [];
|
|
325
|
+
const existingShapeEntry = findLastApplicableShape(existingShapes, node.position.start);
|
|
326
|
+
let arrayShape;
|
|
327
|
+
if (existingShapeEntry?.shape.kind === 'array') {
|
|
328
|
+
const existing = existingShapeEntry.shape.itemShape;
|
|
329
|
+
arrayShape = {
|
|
330
|
+
kind: 'array',
|
|
331
|
+
itemShape: existing ? (0, PropertyShapeInference_1.mergeShapes)(existing, itemShape) : itemShape,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
arrayShape = { kind: 'array', itemShape };
|
|
382
336
|
}
|
|
337
|
+
if (!variableShapes.has(node.name))
|
|
338
|
+
variableShapes.set(node.name, []);
|
|
339
|
+
variableShapes.get(node.name).push({ shape: arrayShape, rangeEnd: node.position.end });
|
|
340
|
+
return {
|
|
341
|
+
identifier: node.name,
|
|
342
|
+
type: shapeType(arrayShape),
|
|
343
|
+
range: [node.position.end],
|
|
344
|
+
};
|
|
383
345
|
}
|
|
346
|
+
// Simple assignment with shape (JSON literal or parse_json)
|
|
347
|
+
if (valueShape) {
|
|
348
|
+
if (!variableShapes.has(node.name))
|
|
349
|
+
variableShapes.set(node.name, []);
|
|
350
|
+
variableShapes.get(node.name).push({ shape: valueShape, rangeEnd: node.position.end });
|
|
351
|
+
return {
|
|
352
|
+
identifier: node.name,
|
|
353
|
+
type: shapeType(valueShape),
|
|
354
|
+
range: [node.position.end],
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
// Default: lazy variable type
|
|
384
358
|
return {
|
|
385
359
|
identifier: node.name,
|
|
386
360
|
type: lazyVariable(node.value, node.position.start),
|
|
@@ -417,13 +391,6 @@ async function buildSymbolsTable(partialAst, seedSymbolsTable, liquidDrops, grap
|
|
|
417
391
|
range: [node.position.end],
|
|
418
392
|
};
|
|
419
393
|
}
|
|
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
394
|
else if (['for', 'tablerow'].includes(node.name)) {
|
|
428
395
|
return {
|
|
429
396
|
identifier: node.name + 'loop',
|
|
@@ -731,6 +698,15 @@ function inferType(thing, symbolsTable, objectMap, filtersMap) {
|
|
|
731
698
|
case liquid_html_parser_1.NodeTypes.Range: {
|
|
732
699
|
return arrayType('number');
|
|
733
700
|
}
|
|
701
|
+
// JSON literal expressions: {key: val} or [1, 2, 3]
|
|
702
|
+
case liquid_html_parser_1.NodeTypes.JsonHashLiteral:
|
|
703
|
+
case liquid_html_parser_1.NodeTypes.JsonArrayLiteral: {
|
|
704
|
+
const resolver = (expr) => {
|
|
705
|
+
const type = inferType(expr, symbolsTable, objectMap, filtersMap);
|
|
706
|
+
return resolvedTypeToShape(type);
|
|
707
|
+
};
|
|
708
|
+
return shapeType((0, PropertyShapeInference_1.inferShapeFromJsonLiteral)(thing, resolver));
|
|
709
|
+
}
|
|
734
710
|
// The type of the assign markup is the type of the right hand side.
|
|
735
711
|
// {% assign x = y.property | filter1 | filter2 %}
|
|
736
712
|
case liquid_html_parser_1.NodeTypes.AssignMarkup: {
|
|
@@ -996,6 +972,34 @@ function shapeToType(shape) {
|
|
|
996
972
|
}
|
|
997
973
|
return exports.Untyped;
|
|
998
974
|
}
|
|
975
|
+
/**
|
|
976
|
+
* Convert a resolved type back to a PropertyShape (inverse of shapeToType).
|
|
977
|
+
* Used when embedding resolved variable types into JSON literal shapes.
|
|
978
|
+
*/
|
|
979
|
+
function resolvedTypeToShape(type) {
|
|
980
|
+
if (typeof type === 'string') {
|
|
981
|
+
switch (type) {
|
|
982
|
+
case 'string':
|
|
983
|
+
return { kind: 'primitive', primitiveType: 'string' };
|
|
984
|
+
case 'number':
|
|
985
|
+
return { kind: 'primitive', primitiveType: 'number' };
|
|
986
|
+
case 'boolean':
|
|
987
|
+
return { kind: 'primitive', primitiveType: 'boolean' };
|
|
988
|
+
case exports.Untyped:
|
|
989
|
+
case exports.Unknown:
|
|
990
|
+
return undefined;
|
|
991
|
+
default:
|
|
992
|
+
return { kind: 'primitive' };
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
if (isShapeType(type))
|
|
996
|
+
return type.shape;
|
|
997
|
+
if (isArrayType(type)) {
|
|
998
|
+
const itemShape = resolvedTypeToShape(type.valueType);
|
|
999
|
+
return { kind: 'array', itemShape };
|
|
1000
|
+
}
|
|
1001
|
+
return undefined;
|
|
1002
|
+
}
|
|
999
1003
|
function inferPseudoTypePropertyType(curr, // settings
|
|
1000
1004
|
lookup, objectMap) {
|
|
1001
1005
|
const parentEntry = objectMap[curr];
|
|
@@ -1239,6 +1243,25 @@ function typeToDisplayString(type) {
|
|
|
1239
1243
|
return type.types.map((t) => typeToDisplayString(t)).join(' | ');
|
|
1240
1244
|
return 'unknown';
|
|
1241
1245
|
}
|
|
1246
|
+
/**
|
|
1247
|
+
* Extract the lookup path from assign lookups.
|
|
1248
|
+
* For {% assign a["key1"]["key2"] = value %}, returns ['key1', 'key2']
|
|
1249
|
+
*/
|
|
1250
|
+
function getAssignLookupPath(lookups) {
|
|
1251
|
+
const path = [];
|
|
1252
|
+
for (const lookup of lookups) {
|
|
1253
|
+
if (lookup.type === liquid_html_parser_1.NodeTypes.String) {
|
|
1254
|
+
path.push(lookup.value);
|
|
1255
|
+
}
|
|
1256
|
+
else if (lookup.type === liquid_html_parser_1.NodeTypes.Number) {
|
|
1257
|
+
path.push(`${lookup.value}`);
|
|
1258
|
+
}
|
|
1259
|
+
else {
|
|
1260
|
+
return undefined;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
return path.length > 0 ? path : undefined;
|
|
1264
|
+
}
|
|
1242
1265
|
/**
|
|
1243
1266
|
* Extract the lookup path from a hash_assign target.
|
|
1244
1267
|
* For {% hash_assign a['key1']['key2'] = value %}, returns ['key1', 'key2']
|
|
@@ -1301,181 +1324,4 @@ function findLastApplicableShape(shapes, position) {
|
|
|
1301
1324
|
}
|
|
1302
1325
|
return result;
|
|
1303
1326
|
}
|
|
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
1327
|
//# sourceMappingURL=TypeSystem.js.map
|