@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.
- package/CHANGELOG.md +20 -0
- package/dist/PropertyShapeInference.d.ts +18 -0
- package/dist/PropertyShapeInference.js +62 -0
- package/dist/PropertyShapeInference.js.map +1 -1
- package/dist/TypeSystem.d.ts +4 -9
- package/dist/TypeSystem.js +246 -390
- package/dist/TypeSystem.js.map +1 -1
- package/dist/codeActions/providers/GenerateDocBlockProvider.d.ts +10 -0
- package/dist/codeActions/providers/GenerateDocBlockProvider.js +39 -0
- package/dist/codeActions/providers/GenerateDocBlockProvider.js.map +1 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.d.ts +19 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.js +64 -0
- package/dist/commands/providers/GenerateDocBlockCommandProvider.js.map +1 -0
- 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 +6 -17
- 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/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/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/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 +17 -12
- 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/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/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/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 +2 -9
- package/dist/utils/uri.js +5 -21
- package/dist/utils/uri.js.map +1 -1
- package/package.json +4 -4
- package/src/ClientCapabilities.ts +1 -1
- package/src/PropertyShapeInference.ts +81 -1
- package/src/TypeSystem.spec.ts +206 -449
- package/src/TypeSystem.ts +267 -460
- package/src/codeActions/providers/FixAllProvider.spec.ts +1 -1
- package/src/codeActions/providers/FixProvider.spec.ts +11 -11
- package/src/codeActions/providers/SuggestionProvider.spec.ts +2 -2
- package/src/commands/providers/ApplyFixesProvider.ts +2 -2
- package/src/commands/providers/ApplySuggestionProvider.ts +2 -2
- package/src/commands/providers/RunChecksProvider.ts +2 -2
- package/src/completions/CompletionsProvider.ts +14 -35
- package/src/completions/params/LiquidCompletionParams.spec.ts +0 -9
- package/src/completions/params/LiquidCompletionParams.ts +8 -17
- package/src/completions/params/fix.spec.ts +0 -3
- package/src/completions/providers/FilterCompletionProvider.spec.ts +2 -8
- 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 +4 -18
- 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 +6 -15
- package/src/completions/providers/RenderPartialParameterCompletionProvider.spec.ts +13 -15
- package/src/completions/providers/RenderPartialParameterCompletionProvider.ts +2 -3
- package/src/completions/providers/TranslationCompletionProvider.spec.ts +1 -4
- package/src/completions/providers/TranslationCompletionProvider.ts +3 -3
- 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 +22 -30
- package/src/diagnostics/runChecks.ts +17 -91
- package/src/docset/MarkdownRenderer.ts +1 -1
- package/src/documentLinks/DocumentLinksProvider.ts +10 -10
- package/src/documents/DocumentManager.spec.ts +46 -119
- package/src/documents/DocumentManager.ts +19 -15
- package/src/documents/types.ts +18 -9
- 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 +1 -4
- 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 +11 -14
- package/src/hover/providers/RenderPartialHoverProvider.ts +1 -5
- package/src/hover/providers/RenderPartialParameterHoverProvider.spec.ts +10 -13
- package/src/hover/providers/RenderPartialParameterHoverProvider.ts +2 -3
- package/src/hover/providers/TranslationHoverProvider.spec.ts +1 -4
- package/src/hover/providers/TranslationHoverProvider.ts +3 -3
- package/src/index.ts +4 -7
- 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/rename/RenameProvider.ts +4 -4
- package/src/rename/providers/LiquidVariableRenameProvider.spec.ts +5 -5
- package/src/rename/providers/LiquidVariableRenameProvider.ts +6 -6
- package/src/renamed/RenameHandler.ts +4 -9
- package/src/renamed/handlers/AssetRenameHandler.spec.ts +28 -28
- package/src/renamed/handlers/AssetRenameHandler.ts +6 -6
- package/src/renamed/handlers/PartialRenameHandler.spec.ts +9 -9
- package/src/renamed/handlers/PartialRenameHandler.ts +10 -10
- package/src/server/{ThemeGraphManager.ts → AppGraphManager.ts} +21 -90
- package/src/server/safe.ts +1 -1
- package/src/server/startServer.spec.ts +10 -12
- package/src/server/startServer.ts +69 -222
- package/src/test/CompletionItemsAssertion.spec.ts +1 -4
- package/src/types.ts +33 -63
- package/src/utils/debounce.ts +1 -1
- package/src/utils/liquidDoc.ts +6 -6
- package/src/utils/uri.ts +5 -17
- 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 -159
- 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/renamed/handlers/utils.ts +0 -22
- package/src/settings/index.ts +0 -50
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, assert, beforeEach } from 'vitest';
|
|
2
|
-
import { JSONLanguageService } from '../../JSONLanguageService';
|
|
3
|
-
import { DocumentManager } from '../../../documents';
|
|
4
|
-
import {
|
|
5
|
-
getRequestParams,
|
|
6
|
-
isCompletionList,
|
|
7
|
-
mockJSONLanguageService,
|
|
8
|
-
} from '../../test/test-helpers';
|
|
9
|
-
|
|
10
|
-
describe('Unit: SettingsPropertyCompletionProvider', () => {
|
|
11
|
-
const rootUri = 'file:///root/';
|
|
12
|
-
let jsonLanguageService: JSONLanguageService;
|
|
13
|
-
let documentManager: DocumentManager;
|
|
14
|
-
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
documentManager = new DocumentManager(
|
|
17
|
-
undefined, // don't need a fs
|
|
18
|
-
undefined, // don't need a connection
|
|
19
|
-
undefined, // don't need client capabilities
|
|
20
|
-
async () => 'theme', // 'theme' mode
|
|
21
|
-
async () => false, // schema is invalid for tests
|
|
22
|
-
);
|
|
23
|
-
jsonLanguageService = mockJSONLanguageService(
|
|
24
|
-
rootUri,
|
|
25
|
-
documentManager,
|
|
26
|
-
async (_uri: string) => ({
|
|
27
|
-
general: {
|
|
28
|
-
fake: 'Fake Setting',
|
|
29
|
-
},
|
|
30
|
-
}),
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
await jsonLanguageService.setup({
|
|
34
|
-
textDocument: {
|
|
35
|
-
completion: {
|
|
36
|
-
contextSupport: true,
|
|
37
|
-
completionItem: {
|
|
38
|
-
snippetSupport: true,
|
|
39
|
-
commitCharactersSupport: true,
|
|
40
|
-
documentationFormat: ['markdown'],
|
|
41
|
-
deprecatedSupport: true,
|
|
42
|
-
preselectSupport: true,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
describe('section file with valid schema', () => {
|
|
50
|
-
const tests = [
|
|
51
|
-
{
|
|
52
|
-
label: 'preset',
|
|
53
|
-
schemaTemplate: (setting: object) => {
|
|
54
|
-
return {
|
|
55
|
-
presets: [setting],
|
|
56
|
-
};
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
label: 'default',
|
|
61
|
-
schemaTemplate: (setting: object) => {
|
|
62
|
-
return {
|
|
63
|
-
default: setting,
|
|
64
|
-
};
|
|
65
|
-
},
|
|
66
|
-
},
|
|
67
|
-
];
|
|
68
|
-
|
|
69
|
-
for (const test of tests) {
|
|
70
|
-
describe(`${test.label} settings`, () => {
|
|
71
|
-
it(`completes ${test.label} setting property when settings exist`, async () => {
|
|
72
|
-
const schema = {
|
|
73
|
-
settings: [{ id: 'custom-setting' }, { id: 'fake-setting' }, {}],
|
|
74
|
-
...test.schemaTemplate({
|
|
75
|
-
settings: {
|
|
76
|
-
'█': '',
|
|
77
|
-
},
|
|
78
|
-
}),
|
|
79
|
-
};
|
|
80
|
-
const source = `
|
|
81
|
-
{% schema %}
|
|
82
|
-
${JSON.stringify(schema)}
|
|
83
|
-
{% endschema %}
|
|
84
|
-
`;
|
|
85
|
-
const params = getRequestParams(documentManager, 'sections/section.liquid', source);
|
|
86
|
-
const completions = await jsonLanguageService.completions(params);
|
|
87
|
-
|
|
88
|
-
assert(isCompletionList(completions));
|
|
89
|
-
expect(completions.items).to.have.lengthOf(2);
|
|
90
|
-
expect(completions.items.map((item) => item.label)).to.include.members([
|
|
91
|
-
`"custom-setting"`,
|
|
92
|
-
`"fake-setting"`,
|
|
93
|
-
]);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it(`offers no suggestions for ${test.label} setting property when there are no settings`, async () => {
|
|
97
|
-
const schema = {
|
|
98
|
-
...test.schemaTemplate({
|
|
99
|
-
settings: {
|
|
100
|
-
'█': '',
|
|
101
|
-
},
|
|
102
|
-
}),
|
|
103
|
-
};
|
|
104
|
-
const source = `
|
|
105
|
-
{% schema %}
|
|
106
|
-
${JSON.stringify(schema)}
|
|
107
|
-
{% endschema %}
|
|
108
|
-
`;
|
|
109
|
-
const params = getRequestParams(documentManager, 'sections/section.liquid', source);
|
|
110
|
-
const completions = await jsonLanguageService.completions(params);
|
|
111
|
-
|
|
112
|
-
assert(isCompletionList(completions));
|
|
113
|
-
expect(completions.items).to.have.lengthOf(0);
|
|
114
|
-
expect(completions.items.map((item) => item.label)).to.include.members([]);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it(`offers ${test.label} setting completion with docs from setting.label`, async () => {
|
|
118
|
-
const schema = {
|
|
119
|
-
settings: [
|
|
120
|
-
{ id: 'custom-setting', label: 'Custom Setting' },
|
|
121
|
-
{ id: 'fake-setting', label: 't:general.fake' },
|
|
122
|
-
{},
|
|
123
|
-
],
|
|
124
|
-
...test.schemaTemplate({
|
|
125
|
-
settings: {
|
|
126
|
-
'█': '',
|
|
127
|
-
},
|
|
128
|
-
}),
|
|
129
|
-
};
|
|
130
|
-
const source = `
|
|
131
|
-
{% schema %}
|
|
132
|
-
${JSON.stringify(schema)}
|
|
133
|
-
{% endschema %}
|
|
134
|
-
`;
|
|
135
|
-
const params = getRequestParams(documentManager, 'sections/section.liquid', source);
|
|
136
|
-
const completions = await jsonLanguageService.completions(params);
|
|
137
|
-
|
|
138
|
-
assert(isCompletionList(completions));
|
|
139
|
-
expect(completions.items).to.have.lengthOf(2);
|
|
140
|
-
expect(completions.items).toEqual(
|
|
141
|
-
expect.arrayContaining([
|
|
142
|
-
expect.objectContaining({
|
|
143
|
-
documentation: { kind: 'markdown', value: 'Custom Setting' },
|
|
144
|
-
}),
|
|
145
|
-
expect.objectContaining({
|
|
146
|
-
documentation: { kind: 'markdown', value: 'Fake Setting' },
|
|
147
|
-
}),
|
|
148
|
-
]),
|
|
149
|
-
);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
describe('block file with valid schema', () => {
|
|
155
|
-
it(`offers no suggestions for default setting property when file is block`, async () => {
|
|
156
|
-
const source = `
|
|
157
|
-
{% schema %}
|
|
158
|
-
{
|
|
159
|
-
"settings": [
|
|
160
|
-
{"id": "custom-setting"},
|
|
161
|
-
{"id": "fake-setting"},
|
|
162
|
-
{},
|
|
163
|
-
],
|
|
164
|
-
"default": {
|
|
165
|
-
"settings": {
|
|
166
|
-
"█": ""
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
{% endschema %}
|
|
171
|
-
`;
|
|
172
|
-
const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
|
|
173
|
-
const completions = await jsonLanguageService.completions(params);
|
|
174
|
-
|
|
175
|
-
assert(isCompletionList(completions));
|
|
176
|
-
expect(completions.items).to.have.lengthOf(0);
|
|
177
|
-
expect(completions.items.map((item) => item.label)).to.include.members([]);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
describe('invalid schema', () => {
|
|
183
|
-
it('completes preset setting property when settings exist and schema has small errors', async () => {
|
|
184
|
-
const source = `
|
|
185
|
-
{% schema %}
|
|
186
|
-
{
|
|
187
|
-
"settings": [
|
|
188
|
-
{"id": "custom-setting"},
|
|
189
|
-
{"id": "fake-setting"},
|
|
190
|
-
{},
|
|
191
|
-
],
|
|
192
|
-
"presets": [{
|
|
193
|
-
"settings": {
|
|
194
|
-
"█"
|
|
195
|
-
}
|
|
196
|
-
}]
|
|
197
|
-
}
|
|
198
|
-
{% endschema %}
|
|
199
|
-
`;
|
|
200
|
-
const params = getRequestParams(documentManager, 'blocks/block.liquid', source);
|
|
201
|
-
const completions = await jsonLanguageService.completions(params);
|
|
202
|
-
|
|
203
|
-
assert(isCompletionList(completions));
|
|
204
|
-
expect(completions.items).to.have.lengthOf(2);
|
|
205
|
-
expect(completions.items.map((item) => item.label)).to.include.members([
|
|
206
|
-
`"custom-setting"`,
|
|
207
|
-
`"fake-setting"`,
|
|
208
|
-
]);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
});
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { isError, SourceCodeType } from '@platformos/platformos-check-common';
|
|
2
|
-
import { JSONPath } from 'vscode-json-languageservice';
|
|
3
|
-
import { JSONCompletionItem } from 'vscode-json-languageservice/lib/umd/jsonContributions';
|
|
4
|
-
import { RequestContext } from '../../RequestContext';
|
|
5
|
-
import { isBlockFile, isSectionFile } from '../../utils';
|
|
6
|
-
import { JSONCompletionProvider } from '../JSONCompletionProvider';
|
|
7
|
-
import { GetTranslationsForURI } from '../../../translations';
|
|
8
|
-
import { isSectionOrBlockSchema } from './BlockTypeCompletionProvider';
|
|
9
|
-
import { schemaSettingsPropertyCompletionItems } from '../../schemaSettings';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* The SettingsPropertyCompletionProvider offers property completions for:
|
|
13
|
-
* - `presets.[].settings.[]` objects inside `{% schema %}` tag in sections and blocks
|
|
14
|
-
* - `default.settings` object inside `{% schema %}` tag in sections
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* {% schema %}
|
|
18
|
-
* {
|
|
19
|
-
* "presets": [
|
|
20
|
-
* {
|
|
21
|
-
* "settings": [
|
|
22
|
-
* { "█" },
|
|
23
|
-
* ]
|
|
24
|
-
* },
|
|
25
|
-
* ],
|
|
26
|
-
* "default": {
|
|
27
|
-
* "settings": {
|
|
28
|
-
* "█"
|
|
29
|
-
* }
|
|
30
|
-
* }
|
|
31
|
-
* }
|
|
32
|
-
* {% endschema %}
|
|
33
|
-
*/
|
|
34
|
-
export class SettingsPropertyCompletionProvider implements JSONCompletionProvider {
|
|
35
|
-
constructor(public getDefaultSchemaTranslations: GetTranslationsForURI) {}
|
|
36
|
-
|
|
37
|
-
async completeProperty(context: RequestContext, path: JSONPath): Promise<JSONCompletionItem[]> {
|
|
38
|
-
const { doc } = context;
|
|
39
|
-
|
|
40
|
-
if (doc.type !== SourceCodeType.LiquidHtml) return [];
|
|
41
|
-
|
|
42
|
-
// section files can have schemas with `presets` and `default`
|
|
43
|
-
// block files can have schemas with `presets` only
|
|
44
|
-
if (
|
|
45
|
-
!(isSectionFile(doc.uri) && (isPresetSettingsPath(path) || isDefaultSettingsPath(path))) &&
|
|
46
|
-
!(isBlockFile(doc.uri) && isPresetSettingsPath(path))
|
|
47
|
-
) {
|
|
48
|
-
return [];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const schema = await doc.getSchema();
|
|
52
|
-
|
|
53
|
-
if (!schema || !isSectionOrBlockSchema(schema) || isError(schema.parsed)) {
|
|
54
|
-
return [];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const parsedSchema = schema.parsed;
|
|
58
|
-
|
|
59
|
-
if (!parsedSchema?.settings || !Array.isArray(parsedSchema.settings)) {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const translations = await this.getDefaultSchemaTranslations(doc.textDocument.uri);
|
|
64
|
-
|
|
65
|
-
return schemaSettingsPropertyCompletionItems(parsedSchema.settings, translations);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function isPresetSettingsPath(path: JSONPath) {
|
|
70
|
-
return path.length === 3 && path.at(0) === 'presets' && path.at(2) === 'settings';
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function isDefaultSettingsPath(path: JSONPath) {
|
|
74
|
-
return path.length === 2 && path.at(0) === 'default' && path.at(1) === 'settings';
|
|
75
|
-
}
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
-
import { DocumentManager } from '../../documents';
|
|
3
|
-
import { createJSONDocumentLinksVisitor } from './DocumentLinksProvider';
|
|
4
|
-
import { toJSONAST, visit } from '@platformos/platformos-check-common';
|
|
5
|
-
import { URI } from 'vscode-uri';
|
|
6
|
-
import { JSONLanguageService } from '../JSONLanguageService';
|
|
7
|
-
|
|
8
|
-
describe('JSON Document Links', () => {
|
|
9
|
-
let documentManager: DocumentManager;
|
|
10
|
-
let rootUri: string;
|
|
11
|
-
let uriString: string;
|
|
12
|
-
let jsonLanguageService: JSONLanguageService;
|
|
13
|
-
|
|
14
|
-
beforeEach(async () => {
|
|
15
|
-
documentManager = new DocumentManager();
|
|
16
|
-
rootUri = 'file:///path/to/project';
|
|
17
|
-
|
|
18
|
-
// Create a minimal JSONLanguageService for testing
|
|
19
|
-
jsonLanguageService = new JSONLanguageService(
|
|
20
|
-
documentManager,
|
|
21
|
-
{ schemas: async () => [] },
|
|
22
|
-
async () => ({}),
|
|
23
|
-
async () => 'theme',
|
|
24
|
-
async () => [],
|
|
25
|
-
async () => undefined,
|
|
26
|
-
async () => rootUri,
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
// Initialize the service to resolve the initialized promise
|
|
30
|
-
await jsonLanguageService.setup({});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe('Schema Tags in Liquid Files', () => {
|
|
34
|
-
it('should return document links for block types in schema tags', async () => {
|
|
35
|
-
uriString = 'file:///path/to/sections/header.liquid';
|
|
36
|
-
rootUri = 'file:///path/to/project';
|
|
37
|
-
|
|
38
|
-
const schemaContent = `
|
|
39
|
-
{
|
|
40
|
-
"name": "Header",
|
|
41
|
-
"blocks": [
|
|
42
|
-
{ "type": "logo" },
|
|
43
|
-
{ "type": "navigation" }
|
|
44
|
-
]
|
|
45
|
-
}
|
|
46
|
-
`;
|
|
47
|
-
|
|
48
|
-
const liquidContent = `
|
|
49
|
-
<div>Header content</div>
|
|
50
|
-
|
|
51
|
-
{% schema %}
|
|
52
|
-
${schemaContent}
|
|
53
|
-
{% endschema %}
|
|
54
|
-
`;
|
|
55
|
-
|
|
56
|
-
documentManager.open(uriString, liquidContent, 1);
|
|
57
|
-
|
|
58
|
-
const textDocument = documentManager.get(uriString)!.textDocument;
|
|
59
|
-
const schemaOffset = liquidContent.indexOf(schemaContent);
|
|
60
|
-
|
|
61
|
-
const visitor = await createJSONDocumentLinksVisitor(
|
|
62
|
-
textDocument,
|
|
63
|
-
URI.parse(rootUri),
|
|
64
|
-
schemaOffset,
|
|
65
|
-
);
|
|
66
|
-
const ast = toJSONAST(schemaContent);
|
|
67
|
-
|
|
68
|
-
if (ast instanceof Error) throw ast;
|
|
69
|
-
const result = await visit(ast, visitor);
|
|
70
|
-
|
|
71
|
-
expect(result).toHaveLength(2);
|
|
72
|
-
expect(result[0].target).toBe('file:///path/to/project/blocks/logo.liquid');
|
|
73
|
-
expect(result[1].target).toBe('file:///path/to/project/blocks/navigation.liquid');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it('should handle section types in schema tags', async () => {
|
|
77
|
-
uriString = 'file:///path/to/sections/main-collection.liquid';
|
|
78
|
-
rootUri = 'file:///path/to/project';
|
|
79
|
-
|
|
80
|
-
const schemaContent = `
|
|
81
|
-
{
|
|
82
|
-
"name": "Collection",
|
|
83
|
-
"blocks": [
|
|
84
|
-
{
|
|
85
|
-
"type": "text",
|
|
86
|
-
"settings": []
|
|
87
|
-
}
|
|
88
|
-
],
|
|
89
|
-
"presets": [
|
|
90
|
-
{
|
|
91
|
-
"name": "Default",
|
|
92
|
-
"blocks": [
|
|
93
|
-
{ "type": "text" }
|
|
94
|
-
]
|
|
95
|
-
}
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
`;
|
|
99
|
-
|
|
100
|
-
const liquidContent = `
|
|
101
|
-
<div>Collection content</div>
|
|
102
|
-
|
|
103
|
-
{% schema %}
|
|
104
|
-
${schemaContent}
|
|
105
|
-
{% endschema %}
|
|
106
|
-
`;
|
|
107
|
-
|
|
108
|
-
documentManager.open(uriString, liquidContent, 1);
|
|
109
|
-
|
|
110
|
-
const textDocument = documentManager.get(uriString)!.textDocument;
|
|
111
|
-
const schemaOffset = liquidContent.indexOf(schemaContent);
|
|
112
|
-
|
|
113
|
-
const visitor = await createJSONDocumentLinksVisitor(
|
|
114
|
-
textDocument,
|
|
115
|
-
URI.parse(rootUri),
|
|
116
|
-
schemaOffset,
|
|
117
|
-
);
|
|
118
|
-
const ast = toJSONAST(schemaContent);
|
|
119
|
-
|
|
120
|
-
if (ast instanceof Error) throw ast;
|
|
121
|
-
const result = await visit(ast, visitor);
|
|
122
|
-
|
|
123
|
-
// Should find both block type references (in blocks array and in presets)
|
|
124
|
-
expect(result).toHaveLength(2);
|
|
125
|
-
expect(result[0].target).toBe('file:///path/to/project/blocks/text.liquid');
|
|
126
|
-
expect(result[1].target).toBe('file:///path/to/project/blocks/text.liquid');
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it('should not create links for special block types in schema tags', async () => {
|
|
130
|
-
uriString = 'file:///path/to/sections/app-blocks.liquid';
|
|
131
|
-
rootUri = 'file:///path/to/project';
|
|
132
|
-
|
|
133
|
-
const schemaContent = `
|
|
134
|
-
{
|
|
135
|
-
"name": "App Blocks",
|
|
136
|
-
"blocks": [
|
|
137
|
-
{ "type": "@app" },
|
|
138
|
-
{ "type": "@theme" },
|
|
139
|
-
{ "type": "custom-block" }
|
|
140
|
-
]
|
|
141
|
-
}
|
|
142
|
-
`;
|
|
143
|
-
|
|
144
|
-
const liquidContent = `
|
|
145
|
-
<div>App blocks section</div>
|
|
146
|
-
|
|
147
|
-
{% schema %}
|
|
148
|
-
${schemaContent}
|
|
149
|
-
{% endschema %}
|
|
150
|
-
`;
|
|
151
|
-
|
|
152
|
-
documentManager.open(uriString, liquidContent, 1);
|
|
153
|
-
|
|
154
|
-
const textDocument = documentManager.get(uriString)!.textDocument;
|
|
155
|
-
const schemaOffset = liquidContent.indexOf(schemaContent);
|
|
156
|
-
const visitor = await createJSONDocumentLinksVisitor(
|
|
157
|
-
textDocument,
|
|
158
|
-
URI.parse(rootUri),
|
|
159
|
-
schemaOffset,
|
|
160
|
-
);
|
|
161
|
-
const ast = toJSONAST(schemaContent);
|
|
162
|
-
|
|
163
|
-
if (ast instanceof Error) throw ast;
|
|
164
|
-
const result = await visit(ast, visitor);
|
|
165
|
-
|
|
166
|
-
// Should only create link for custom-block, not @app or @theme
|
|
167
|
-
expect(result).toHaveLength(1);
|
|
168
|
-
expect(result[0].target).toBe('file:///path/to/project/blocks/custom-block.liquid');
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
describe('JSON Files', () => {
|
|
173
|
-
it('should return document links for section types in template JSON files', async () => {
|
|
174
|
-
uriString = 'file:///path/to/templates/index.json';
|
|
175
|
-
|
|
176
|
-
const jsonContent = `{
|
|
177
|
-
"layout": "theme",
|
|
178
|
-
"sections": {
|
|
179
|
-
"header": {
|
|
180
|
-
"type": "header-section"
|
|
181
|
-
},
|
|
182
|
-
"main": {
|
|
183
|
-
"type": "main-product"
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}`;
|
|
187
|
-
|
|
188
|
-
documentManager.open(uriString, jsonContent, 1);
|
|
189
|
-
|
|
190
|
-
const result = await jsonLanguageService.documentLinks({
|
|
191
|
-
textDocument: { uri: uriString },
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
expect(result).toHaveLength(2);
|
|
195
|
-
expect(result[0].target).toBe('file:///path/to/project/sections/header-section.liquid');
|
|
196
|
-
expect(result[1].target).toBe('file:///path/to/project/sections/main-product.liquid');
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('should return document links for block types in section JSON files', async () => {
|
|
200
|
-
uriString = 'file:///path/to/sections/settings.json';
|
|
201
|
-
|
|
202
|
-
const jsonContent = `{
|
|
203
|
-
"name": "Section with blocks",
|
|
204
|
-
"blocks": [
|
|
205
|
-
{ "type": "text" },
|
|
206
|
-
{ "type": "image" },
|
|
207
|
-
{ "type": "@app" }
|
|
208
|
-
]
|
|
209
|
-
}`;
|
|
210
|
-
|
|
211
|
-
documentManager.open(uriString, jsonContent, 1);
|
|
212
|
-
|
|
213
|
-
const result = await jsonLanguageService.documentLinks({
|
|
214
|
-
textDocument: { uri: uriString },
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
expect(result).toHaveLength(2);
|
|
218
|
-
expect(result[0].target).toBe('file:///path/to/project/blocks/text.liquid');
|
|
219
|
-
expect(result[1].target).toBe('file:///path/to/project/blocks/image.liquid');
|
|
220
|
-
// @app should not create a link
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
});
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { JSONNode, SourceCodeType } from '@platformos/platformos-check-common';
|
|
2
|
-
import { DocumentLink, Range } from 'vscode-languageserver';
|
|
3
|
-
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
4
|
-
import { URI, Utils } from 'vscode-uri';
|
|
5
|
-
import { Visitor } from '@platformos/platformos-check-common';
|
|
6
|
-
|
|
7
|
-
export async function createJSONDocumentLinksVisitor(
|
|
8
|
-
textDocument: TextDocument,
|
|
9
|
-
root: URI,
|
|
10
|
-
offset: number = 0,
|
|
11
|
-
): Promise<Visitor<SourceCodeType.JSON, DocumentLink>> {
|
|
12
|
-
const visitor: Visitor<SourceCodeType.JSON, DocumentLink> = {
|
|
13
|
-
async Property(node, ancestors) {
|
|
14
|
-
const origin = jsonPropertyOriginDirectory(ancestors);
|
|
15
|
-
|
|
16
|
-
if (!origin) return;
|
|
17
|
-
|
|
18
|
-
if (
|
|
19
|
-
!(
|
|
20
|
-
node.key.value === 'type' &&
|
|
21
|
-
node.value.type === 'Literal' &&
|
|
22
|
-
typeof node.value.value === 'string'
|
|
23
|
-
)
|
|
24
|
-
) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (origin === 'blocks' && ['@app', '@theme'].includes(node.value.value)) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return DocumentLink.create(
|
|
33
|
-
range(textDocument, node.value, offset),
|
|
34
|
-
Utils.resolvePath(root, origin, node.value.value + '.liquid').toString(),
|
|
35
|
-
);
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
return visitor;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function range(textDocument: TextDocument, node: JSONNode, offset: number): Range {
|
|
42
|
-
// +1 and -1 to exclude the quotes
|
|
43
|
-
const start = textDocument.positionAt(offset + node.loc.start.offset + 1);
|
|
44
|
-
const end = textDocument.positionAt(offset + node.loc.end.offset - 1);
|
|
45
|
-
return Range.create(start, end);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function jsonPropertyOriginDirectory(ancestors: JSONNode[]): 'sections' | 'blocks' | undefined {
|
|
49
|
-
for (let i = ancestors.length - 1; i >= 0; i--) {
|
|
50
|
-
const ancestor = ancestors[i];
|
|
51
|
-
if (ancestor.type === 'Property') {
|
|
52
|
-
if (ancestor.key.value === 'blocks') {
|
|
53
|
-
return 'blocks';
|
|
54
|
-
}
|
|
55
|
-
if (ancestor.key.value === 'sections') {
|
|
56
|
-
return 'sections';
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|