@platformos/platformos-language-server-common 0.0.17 → 0.0.19
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/TypeSystem.js +3 -9
- package/dist/TypeSystem.js.map +1 -1
- package/dist/codeActions/CodeActionsProvider.d.ts +1 -1
- package/dist/completions/CompletionsProvider.d.ts +8 -3
- package/dist/completions/CompletionsProvider.js +100 -1
- package/dist/completions/CompletionsProvider.js.map +1 -1
- package/dist/completions/params/LiquidCompletionParams.js +1 -2
- package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
- package/dist/completions/providers/FrontmatterKeyCompletionProvider.d.ts +14 -0
- package/dist/completions/providers/FrontmatterKeyCompletionProvider.js +149 -0
- package/dist/completions/providers/FrontmatterKeyCompletionProvider.js.map +1 -0
- package/dist/completions/providers/index.d.ts +1 -0
- package/dist/completions/providers/index.js +3 -1
- package/dist/completions/providers/index.js.map +1 -1
- package/dist/definitions/DefinitionProvider.js +2 -0
- package/dist/definitions/DefinitionProvider.js.map +1 -1
- package/dist/definitions/providers/FrontmatterDefinitionProvider.d.ts +28 -0
- package/dist/definitions/providers/FrontmatterDefinitionProvider.js +207 -0
- package/dist/definitions/providers/FrontmatterDefinitionProvider.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/TypeSystem.spec.ts +2 -2
- package/src/TypeSystem.ts +3 -11
- package/src/completions/CompletionsProvider.ts +120 -2
- package/src/completions/params/LiquidCompletionParams.ts +1 -2
- package/src/completions/providers/FrontmatterKeyCompletionProvider.spec.ts +196 -0
- package/src/completions/providers/FrontmatterKeyCompletionProvider.ts +182 -0
- package/src/completions/providers/index.ts +5 -0
- package/src/definitions/DefinitionProvider.ts +2 -0
- package/src/definitions/providers/FrontmatterDefinitionProvider.spec.ts +463 -0
- package/src/definitions/providers/FrontmatterDefinitionProvider.ts +258 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FrontmatterKeyCompletionProvider = void 0;
|
|
4
|
+
const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
|
|
5
|
+
const platformos_common_1 = require("@platformos/platformos-common");
|
|
6
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
7
|
+
class FrontmatterKeyCompletionProvider {
|
|
8
|
+
constructor(getLayoutNamesForURI, getAuthPolicyNamesForURI) {
|
|
9
|
+
this.getLayoutNamesForURI = getLayoutNamesForURI;
|
|
10
|
+
this.getAuthPolicyNamesForURI = getAuthPolicyNamesForURI;
|
|
11
|
+
}
|
|
12
|
+
async completions(params) {
|
|
13
|
+
const { document } = params;
|
|
14
|
+
// Use the full document AST — the partial AST used for other completions is truncated
|
|
15
|
+
// at the cursor, so the frontmatter closing "---" is never present there.
|
|
16
|
+
const ast = document.ast;
|
|
17
|
+
if (ast instanceof Error || ast.type !== liquid_html_parser_1.NodeTypes.Document)
|
|
18
|
+
return [];
|
|
19
|
+
const frontmatterNode = ast.children.find((child) => child.type === liquid_html_parser_1.NodeTypes.YAMLFrontmatter);
|
|
20
|
+
if (!frontmatterNode)
|
|
21
|
+
return [];
|
|
22
|
+
const schema = (0, platformos_common_1.getFrontmatterSchema)((0, platformos_common_1.getFileType)(params.textDocument.uri));
|
|
23
|
+
if (!schema)
|
|
24
|
+
return [];
|
|
25
|
+
// Locate the YAML body within the source: skip the opening "---\n"
|
|
26
|
+
const source = document.textDocument.getText();
|
|
27
|
+
const bodyStart = source.indexOf('\n', frontmatterNode.position.start) + 1;
|
|
28
|
+
const bodyEnd = bodyStart + frontmatterNode.body.length;
|
|
29
|
+
const cursor = document.textDocument.offsetAt(params.position);
|
|
30
|
+
if (cursor < bodyStart || cursor > bodyEnd)
|
|
31
|
+
return [];
|
|
32
|
+
const cursorInBody = cursor - bodyStart;
|
|
33
|
+
// Determine what context the cursor is in based on the current line text.
|
|
34
|
+
const bodyUpToCursor = frontmatterNode.body.slice(0, cursorInBody);
|
|
35
|
+
const lastNewline = bodyUpToCursor.lastIndexOf('\n');
|
|
36
|
+
const currentLineText = bodyUpToCursor.slice(lastNewline + 1);
|
|
37
|
+
// ── List-item completion ─────────────────────────────────────────────────
|
|
38
|
+
// Must be checked before colonIndex since list items have no colon.
|
|
39
|
+
const listItemMatch = currentLineText.match(/^(\s*)-\s*(.*)/);
|
|
40
|
+
if (listItemMatch) {
|
|
41
|
+
const partial = listItemMatch[2];
|
|
42
|
+
const parentKey = findParentKey(bodyUpToCursor);
|
|
43
|
+
return this.listItemCompletions(parentKey, partial, params.textDocument.uri);
|
|
44
|
+
}
|
|
45
|
+
const colonIndex = currentLineText.indexOf(':');
|
|
46
|
+
if (colonIndex === -1) {
|
|
47
|
+
// ── Key completion ────────────────────────────────────────────────────
|
|
48
|
+
return this.keyCompletions(frontmatterNode.body, currentLineText, schema);
|
|
49
|
+
}
|
|
50
|
+
// ── Scalar value completion ───────────────────────────────────────────────
|
|
51
|
+
const key = currentLineText.slice(0, colonIndex).trim();
|
|
52
|
+
const afterColon = currentLineText.slice(colonIndex + 1);
|
|
53
|
+
const rawPartial = afterColon.trimStart();
|
|
54
|
+
// Strip enclosing quotes for prefix matching, but keep raw text for filtering
|
|
55
|
+
const partial = rawPartial.replace(/^['"]/, '').replace(/['"]$/, '');
|
|
56
|
+
return this.valueCompletions(key, partial, schema, params.textDocument.uri);
|
|
57
|
+
}
|
|
58
|
+
// ── Key completions ─────────────────────────────────────────────────────────
|
|
59
|
+
keyCompletions(body, currentLineText, schema) {
|
|
60
|
+
if (!schema)
|
|
61
|
+
return [];
|
|
62
|
+
const partial = currentLineText.trimStart();
|
|
63
|
+
// Collect keys already present so we can omit them.
|
|
64
|
+
const usedKeys = new Set();
|
|
65
|
+
const keyRegex = /^([a-zA-Z_][a-zA-Z0-9_]*):/gm;
|
|
66
|
+
let match;
|
|
67
|
+
while ((match = keyRegex.exec(body)) !== null) {
|
|
68
|
+
usedKeys.add(match[1]);
|
|
69
|
+
}
|
|
70
|
+
return Object.entries(schema.fields)
|
|
71
|
+
.filter(([key]) => !usedKeys.has(key) && key.startsWith(partial))
|
|
72
|
+
.map(([key, fieldSchema]) => {
|
|
73
|
+
const typeStr = Array.isArray(fieldSchema.type)
|
|
74
|
+
? fieldSchema.type.join(' | ')
|
|
75
|
+
: fieldSchema.type;
|
|
76
|
+
const tags = [
|
|
77
|
+
fieldSchema.required ? 'required' : undefined,
|
|
78
|
+
fieldSchema.deprecated ? 'deprecated' : undefined,
|
|
79
|
+
].filter(Boolean);
|
|
80
|
+
const detail = tags.length > 0 ? `${typeStr} (${tags.join(', ')})` : typeStr;
|
|
81
|
+
return {
|
|
82
|
+
label: key,
|
|
83
|
+
kind: vscode_languageserver_1.CompletionItemKind.Field,
|
|
84
|
+
detail,
|
|
85
|
+
documentation: fieldSchema.description
|
|
86
|
+
? { kind: 'markdown', value: fieldSchema.description }
|
|
87
|
+
: undefined,
|
|
88
|
+
insertText: key + ': ',
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// ── Value completions for scalar fields ─────────────────────────────────────
|
|
93
|
+
async valueCompletions(key, partial, schema, uri) {
|
|
94
|
+
if (!schema)
|
|
95
|
+
return [];
|
|
96
|
+
// Layout field — list available layout files
|
|
97
|
+
if (key === 'layout' || key === 'layout_name') {
|
|
98
|
+
const names = (await this.getLayoutNamesForURI?.(uri)) ?? [];
|
|
99
|
+
return names
|
|
100
|
+
.filter((n) => n.startsWith(partial))
|
|
101
|
+
.map((n) => ({ label: n, kind: vscode_languageserver_1.CompletionItemKind.Value }));
|
|
102
|
+
}
|
|
103
|
+
// Fields with enum values
|
|
104
|
+
const fieldSchema = schema.fields[key];
|
|
105
|
+
if (fieldSchema?.enumValues) {
|
|
106
|
+
return fieldSchema.enumValues
|
|
107
|
+
.map(String)
|
|
108
|
+
.filter((v) => v.startsWith(partial))
|
|
109
|
+
.map((v) => ({
|
|
110
|
+
label: v,
|
|
111
|
+
kind: vscode_languageserver_1.CompletionItemKind.Value,
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// ── List-item completions (authorization_policies, etc.) ─────────────────────
|
|
117
|
+
async listItemCompletions(parentKey, partial, uri) {
|
|
118
|
+
if (parentKey === 'authorization_policies') {
|
|
119
|
+
const names = (await this.getAuthPolicyNamesForURI?.(uri)) ?? [];
|
|
120
|
+
return names
|
|
121
|
+
.filter((n) => n.startsWith(partial))
|
|
122
|
+
.map((n) => ({ label: n, kind: vscode_languageserver_1.CompletionItemKind.Value }));
|
|
123
|
+
}
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.FrontmatterKeyCompletionProvider = FrontmatterKeyCompletionProvider;
|
|
128
|
+
/** Walk backwards through the YAML body up-to-cursor to find the key that
|
|
129
|
+
* owns the current list block (the first non-indented, non-list-item line). */
|
|
130
|
+
function findParentKey(bodyUpToCursor) {
|
|
131
|
+
const lines = bodyUpToCursor.split('\n');
|
|
132
|
+
// Start from the second-to-last line (the current line is the last)
|
|
133
|
+
for (let i = lines.length - 2; i >= 0; i--) {
|
|
134
|
+
const line = lines[i];
|
|
135
|
+
if (!line.trim())
|
|
136
|
+
continue; // skip blank lines
|
|
137
|
+
// List item line — keep walking up
|
|
138
|
+
if (/^\s+-/.test(line))
|
|
139
|
+
continue;
|
|
140
|
+
// Top-level key line
|
|
141
|
+
const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):/);
|
|
142
|
+
if (match)
|
|
143
|
+
return match[1];
|
|
144
|
+
// Anything else — stop
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=FrontmatterKeyCompletionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrontmatterKeyCompletionProvider.js","sourceRoot":"","sources":["../../../src/completions/providers/FrontmatterKeyCompletionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,4 +11,5 @@ export { PartialCompletionProvider } from './PartialCompletionProvider';
|
|
|
11
11
|
export { GetPartialNamesForURI, RenderPartialParameterCompletionProvider, } from './RenderPartialParameterCompletionProvider';
|
|
12
12
|
export { LiquidDocTagCompletionProvider } from './LiquidDocTagCompletionProvider';
|
|
13
13
|
export { LiquidDocParamTypeCompletionProvider } from './LiquidDocParamTypeCompletionProvider';
|
|
14
|
+
export { FrontmatterKeyCompletionProvider, GetLayoutNamesForURI, GetAuthPolicyNamesForURI, } from './FrontmatterKeyCompletionProvider';
|
|
14
15
|
export { Provider } from './common/Provider';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LiquidDocParamTypeCompletionProvider = exports.LiquidDocTagCompletionProvider = exports.RenderPartialParameterCompletionProvider = exports.PartialCompletionProvider = exports.TranslationCompletionProvider = exports.ObjectCompletionProvider = exports.ObjectAttributeCompletionProvider = exports.LiquidTagsCompletionProvider = exports.FilterNamedParameterCompletionProvider = exports.FilterCompletionProvider = exports.HtmlAttributeValueCompletionProvider = exports.HtmlAttributeCompletionProvider = exports.HtmlTagCompletionProvider = void 0;
|
|
3
|
+
exports.FrontmatterKeyCompletionProvider = exports.LiquidDocParamTypeCompletionProvider = exports.LiquidDocTagCompletionProvider = exports.RenderPartialParameterCompletionProvider = exports.PartialCompletionProvider = exports.TranslationCompletionProvider = exports.ObjectCompletionProvider = exports.ObjectAttributeCompletionProvider = exports.LiquidTagsCompletionProvider = exports.FilterNamedParameterCompletionProvider = exports.FilterCompletionProvider = exports.HtmlAttributeValueCompletionProvider = exports.HtmlAttributeCompletionProvider = exports.HtmlTagCompletionProvider = void 0;
|
|
4
4
|
var HtmlTagCompletionProvider_1 = require("./HtmlTagCompletionProvider");
|
|
5
5
|
Object.defineProperty(exports, "HtmlTagCompletionProvider", { enumerable: true, get: function () { return HtmlTagCompletionProvider_1.HtmlTagCompletionProvider; } });
|
|
6
6
|
var HtmlAttributeCompletionProvider_1 = require("./HtmlAttributeCompletionProvider");
|
|
@@ -27,4 +27,6 @@ var LiquidDocTagCompletionProvider_1 = require("./LiquidDocTagCompletionProvider
|
|
|
27
27
|
Object.defineProperty(exports, "LiquidDocTagCompletionProvider", { enumerable: true, get: function () { return LiquidDocTagCompletionProvider_1.LiquidDocTagCompletionProvider; } });
|
|
28
28
|
var LiquidDocParamTypeCompletionProvider_1 = require("./LiquidDocParamTypeCompletionProvider");
|
|
29
29
|
Object.defineProperty(exports, "LiquidDocParamTypeCompletionProvider", { enumerable: true, get: function () { return LiquidDocParamTypeCompletionProvider_1.LiquidDocParamTypeCompletionProvider; } });
|
|
30
|
+
var FrontmatterKeyCompletionProvider_1 = require("./FrontmatterKeyCompletionProvider");
|
|
31
|
+
Object.defineProperty(exports, "FrontmatterKeyCompletionProvider", { enumerable: true, get: function () { return FrontmatterKeyCompletionProvider_1.FrontmatterKeyCompletionProvider; } });
|
|
30
32
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/completions/providers/index.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,qFAAoF;AAA3E,kJAAA,+BAA+B,OAAA;AACxC,+FAA8F;AAArF,4JAAA,oCAAoC,OAAA;AAC7C,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,mGAAkG;AAAzF,gKAAA,sCAAsC,OAAA;AAC/C,+EAA8E;AAArE,4IAAA,4BAA4B,OAAA;AACrC,yFAAwF;AAA/E,sJAAA,iCAAiC,OAAA;AAC1C,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,iFAAgF;AAAvE,8IAAA,6BAA6B,OAAA;AACtC,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,uGAGoD;AADlD,oKAAA,wCAAwC,OAAA;AAE1C,mFAAkF;AAAzE,gJAAA,8BAA8B,OAAA;AACvC,+FAA8F;AAArF,4JAAA,oCAAoC,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/completions/providers/index.ts"],"names":[],"mappings":";;;AAAA,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,qFAAoF;AAA3E,kJAAA,+BAA+B,OAAA;AACxC,+FAA8F;AAArF,4JAAA,oCAAoC,OAAA;AAC7C,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,mGAAkG;AAAzF,gKAAA,sCAAsC,OAAA;AAC/C,+EAA8E;AAArE,4IAAA,4BAA4B,OAAA;AACrC,yFAAwF;AAA/E,sJAAA,iCAAiC,OAAA;AAC1C,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,iFAAgF;AAAvE,8IAAA,6BAA6B,OAAA;AACtC,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA;AAClC,uGAGoD;AADlD,oKAAA,wCAAwC,OAAA;AAE1C,mFAAkF;AAAzE,gJAAA,8BAA8B,OAAA;AACvC,+FAA8F;AAArF,4JAAA,oCAAoC,OAAA;AAC7C,uFAI4C;AAH1C,oJAAA,gCAAgC,OAAA"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DefinitionProvider = void 0;
|
|
4
4
|
const platformos_check_common_1 = require("@platformos/platformos-check-common");
|
|
5
|
+
const FrontmatterDefinitionProvider_1 = require("./providers/FrontmatterDefinitionProvider");
|
|
5
6
|
const PageRouteDefinitionProvider_1 = require("./providers/PageRouteDefinitionProvider");
|
|
6
7
|
const RenderPartialDefinitionProvider_1 = require("./providers/RenderPartialDefinitionProvider");
|
|
7
8
|
const TranslationStringDefinitionProvider_1 = require("./providers/TranslationStringDefinitionProvider");
|
|
@@ -14,6 +15,7 @@ class DefinitionProvider {
|
|
|
14
15
|
if (fs && findAppRootURI) {
|
|
15
16
|
this.pageRouteProvider = new PageRouteDefinitionProvider_1.PageRouteDefinitionProvider(documentManager, fs, findAppRootURI);
|
|
16
17
|
this.providers.push(this.pageRouteProvider);
|
|
18
|
+
this.providers.push(new FrontmatterDefinitionProvider_1.FrontmatterDefinitionProvider(documentManager, fs, findAppRootURI));
|
|
17
19
|
if (documentsLocator && searchPathsCache) {
|
|
18
20
|
this.providers.push(new RenderPartialDefinitionProvider_1.RenderPartialDefinitionProvider(documentManager, documentsLocator, searchPathsCache, findAppRootURI));
|
|
19
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefinitionProvider.js","sourceRoot":"","sources":["../../src/definitions/DefinitionProvider.ts"],"names":[],"mappings":";;;AAAA,iFAAsF;AAOtF,yFAAsF;AACtF,iGAA8F;AAC9F,yGAAsG;AAEtG,MAAa,kBAAkB;IAI7B,YACU,eAAgC,EACxC,0BAAoF,EACpF,EAAuB,EACvB,cAAwD,EACxD,gBAAmC,EACnC,gBAAoC;QAL5B,oBAAe,GAAf,eAAe,CAAiB;QAOxC,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,yEAAmC,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACrF,CAAC;QAEF,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,yDAA2B,CAAC,eAAe,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAC9F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DefinitionProvider.js","sourceRoot":"","sources":["../../src/definitions/DefinitionProvider.ts"],"names":[],"mappings":";;;AAAA,iFAAsF;AAOtF,6FAA0F;AAC1F,yFAAsF;AACtF,iGAA8F;AAC9F,yGAAsG;AAEtG,MAAa,kBAAkB;IAI7B,YACU,eAAgC,EACxC,0BAAoF,EACpF,EAAuB,EACvB,cAAwD,EACxD,gBAAmC,EACnC,gBAAoC;QAL5B,oBAAe,GAAf,eAAe,CAAiB;QAOxC,IAAI,CAAC,SAAS,GAAG;YACf,IAAI,yEAAmC,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACrF,CAAC;QAEF,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,yDAA2B,CAAC,eAAe,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAC9F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,6DAA6B,CAAC,eAAe,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;YAE5F,IAAI,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,iEAA+B,CACjC,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,CACf,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,iBAAiB,CAAC,GAAW,EAAE,OAAe;QAC5C,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,2DAA2D;IAC3D,iBAAiB,CAAC,GAAW;QAC3B,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,IAAI,CAAC,iBAAiB,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAwB;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACrE,IACE,CAAC,UAAU;YACX,UAAU,CAAC,IAAI,KAAK,wCAAc,CAAC,UAAU;YAC7C,UAAU,CAAC,GAAG,YAAY,KAAK,EAC/B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,IAAA,yCAAe,EACvC,UAAU,CAAC,GAAG,EACd,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CACvC,CAAC;QAEF,MAAM,OAAO,GAAqB,MAAM,OAAO,CAAC,GAAG,CACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAChF,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;CACF;AAnFD,gDAmFC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type AbstractFileSystem } from '@platformos/platformos-common';
|
|
2
|
+
import { DefinitionParams, DefinitionLink } from 'vscode-languageserver-protocol';
|
|
3
|
+
import { LiquidHtmlNode } from '@platformos/liquid-html-parser';
|
|
4
|
+
import { DocumentManager } from '../../documents';
|
|
5
|
+
import { BaseDefinitionProvider } from '../BaseDefinitionProvider';
|
|
6
|
+
export declare class FrontmatterDefinitionProvider implements BaseDefinitionProvider {
|
|
7
|
+
private documentManager;
|
|
8
|
+
private fs;
|
|
9
|
+
private findAppRootURI;
|
|
10
|
+
constructor(documentManager: DocumentManager, fs: AbstractFileSystem, findAppRootURI: (uri: string) => Promise<string | null>);
|
|
11
|
+
definitions(params: DefinitionParams, _node: LiquidHtmlNode, _ancestors: LiquidHtmlNode[]): Promise<DefinitionLink[]>;
|
|
12
|
+
private resolveLayoutDefinition;
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a frontmatter list-item value to a definition link.
|
|
15
|
+
*
|
|
16
|
+
* App-level items (e.g. `require_login`) resolve to:
|
|
17
|
+
* app/{appDir}/{name}.liquid
|
|
18
|
+
*
|
|
19
|
+
* Module-prefixed items (e.g. `modules/community/require_login`) resolve to the first
|
|
20
|
+
* existing path in priority order:
|
|
21
|
+
* app/modules/{mod}/public/{appDir}/{name}.liquid (app overwrite, public)
|
|
22
|
+
* app/modules/{mod}/private/{appDir}/{name}.liquid (app overwrite, private)
|
|
23
|
+
* modules/{mod}/public/{appDir}/{name}.liquid
|
|
24
|
+
* modules/{mod}/private/{appDir}/{name}.liquid
|
|
25
|
+
*/
|
|
26
|
+
private resolveAssociationDefinition;
|
|
27
|
+
private fileExists;
|
|
28
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FrontmatterDefinitionProvider = void 0;
|
|
4
|
+
const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
|
|
5
|
+
const platformos_common_1 = require("@platformos/platformos-common");
|
|
6
|
+
const platformos_check_common_1 = require("@platformos/platformos-check-common");
|
|
7
|
+
const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol");
|
|
8
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
9
|
+
class FrontmatterDefinitionProvider {
|
|
10
|
+
constructor(documentManager, fs, findAppRootURI) {
|
|
11
|
+
this.documentManager = documentManager;
|
|
12
|
+
this.fs = fs;
|
|
13
|
+
this.findAppRootURI = findAppRootURI;
|
|
14
|
+
}
|
|
15
|
+
async definitions(params, _node, _ancestors) {
|
|
16
|
+
const uri = params.textDocument.uri;
|
|
17
|
+
const sourceCode = this.documentManager.get(uri);
|
|
18
|
+
if (!sourceCode ||
|
|
19
|
+
sourceCode.type !== platformos_check_common_1.SourceCodeType.LiquidHtml ||
|
|
20
|
+
sourceCode.ast instanceof Error)
|
|
21
|
+
return [];
|
|
22
|
+
const ast = sourceCode.ast;
|
|
23
|
+
if (ast.type !== liquid_html_parser_1.NodeTypes.Document)
|
|
24
|
+
return [];
|
|
25
|
+
const frontmatterNode = ast.children.find((child) => child.type === liquid_html_parser_1.NodeTypes.YAMLFrontmatter);
|
|
26
|
+
if (!frontmatterNode)
|
|
27
|
+
return [];
|
|
28
|
+
const doc = sourceCode.textDocument;
|
|
29
|
+
const source = doc.getText();
|
|
30
|
+
const bodyStart = source.indexOf('\n', frontmatterNode.position.start) + 1;
|
|
31
|
+
const bodyEnd = bodyStart + frontmatterNode.body.length;
|
|
32
|
+
const cursor = doc.offsetAt(params.position);
|
|
33
|
+
if (cursor < bodyStart || cursor > bodyEnd)
|
|
34
|
+
return [];
|
|
35
|
+
const cursorInBody = cursor - bodyStart;
|
|
36
|
+
const bodyUpToCursor = frontmatterNode.body.slice(0, cursorInBody);
|
|
37
|
+
// Determine the current line
|
|
38
|
+
const lastNewline = bodyUpToCursor.lastIndexOf('\n');
|
|
39
|
+
const currentLineText = bodyUpToCursor.slice(lastNewline + 1);
|
|
40
|
+
// Determine remaining text on current line
|
|
41
|
+
const bodyFromCursor = frontmatterNode.body.slice(cursorInBody);
|
|
42
|
+
const nextNewline = bodyFromCursor.indexOf('\n');
|
|
43
|
+
const restOfLine = nextNewline === -1 ? bodyFromCursor : bodyFromCursor.slice(0, nextNewline);
|
|
44
|
+
const fullCurrentLine = currentLineText + restOfLine;
|
|
45
|
+
// List item: line starts with optional whitespace + "- " (no colon, check first)
|
|
46
|
+
const listItemMatch = fullCurrentLine.match(/^(\s*)-\s*(.*)/);
|
|
47
|
+
if (listItemMatch) {
|
|
48
|
+
const parentKey = findParentKey(bodyUpToCursor);
|
|
49
|
+
const appDir = parentKey ? platformos_common_1.FRONTMATTER_ASSOCIATION_DIRS[parentKey] : undefined;
|
|
50
|
+
if (!appDir)
|
|
51
|
+
return [];
|
|
52
|
+
const itemValue = listItemMatch[2].trim().replace(/^['"]/, '').replace(/['"]$/, '');
|
|
53
|
+
if (!itemValue || itemValue.includes('{{') || itemValue.includes('{%'))
|
|
54
|
+
return [];
|
|
55
|
+
return this.resolveAssociationDefinition(uri, itemValue, appDir, lastNewline + 1 + bodyStart, doc);
|
|
56
|
+
}
|
|
57
|
+
const colonIndex = fullCurrentLine.indexOf(':');
|
|
58
|
+
if (colonIndex === -1)
|
|
59
|
+
return [];
|
|
60
|
+
const key = fullCurrentLine.slice(0, colonIndex).trim();
|
|
61
|
+
// Scalar value: cursor must be after the colon
|
|
62
|
+
if (cursor <= bodyStart + lastNewline + 1 + colonIndex)
|
|
63
|
+
return [];
|
|
64
|
+
// `layout` / `layout_name` are valid on Page; `layout` / `layout_path` on Email.
|
|
65
|
+
const fileType = (0, platformos_common_1.getFileType)(uri);
|
|
66
|
+
const isLayoutKey = (fileType === platformos_common_1.PlatformOSFileType.Page && (key === 'layout' || key === 'layout_name')) ||
|
|
67
|
+
(fileType === platformos_common_1.PlatformOSFileType.Email && (key === 'layout' || key === 'layout_path'));
|
|
68
|
+
if (!isLayoutKey)
|
|
69
|
+
return [];
|
|
70
|
+
const afterColon = fullCurrentLine.slice(colonIndex + 1).trimStart();
|
|
71
|
+
const value = afterColon.replace(/^['"]/, '').replace(/['"]$/, '').trim();
|
|
72
|
+
if (!value || value.includes('{{') || value.includes('{%'))
|
|
73
|
+
return [];
|
|
74
|
+
// Compute origin range: from after colon+space to end of value
|
|
75
|
+
const lineStart = bodyStart + lastNewline + 1;
|
|
76
|
+
const valueStartInLine = colonIndex + 1 + (fullCurrentLine.slice(colonIndex + 1).length - afterColon.length);
|
|
77
|
+
const originStart = lineStart + valueStartInLine;
|
|
78
|
+
const originEnd = originStart + afterColon.length;
|
|
79
|
+
return this.resolveLayoutDefinition(uri, value, originStart, originEnd, doc);
|
|
80
|
+
}
|
|
81
|
+
async resolveLayoutDefinition(fileUri, layoutName, originStart, originEnd, doc) {
|
|
82
|
+
const rootUri = await this.findAppRootURI(fileUri);
|
|
83
|
+
if (!rootUri)
|
|
84
|
+
return [];
|
|
85
|
+
const root = vscode_uri_1.URI.parse(rootUri);
|
|
86
|
+
let targetUri;
|
|
87
|
+
if (layoutName.startsWith('modules/')) {
|
|
88
|
+
const match = layoutName.match(/^modules\/([^/]+)\/(.+)$/);
|
|
89
|
+
if (!match)
|
|
90
|
+
return [];
|
|
91
|
+
const [, mod, rest] = match;
|
|
92
|
+
// Check app overwrite first (app/modules/{mod}/{visibility}/views/layouts/{rest}.liquid),
|
|
93
|
+
// then fall back to the original module path (modules/{mod}/{visibility}/...).
|
|
94
|
+
// Both visibilities are checked for each root before moving to the next.
|
|
95
|
+
const roots = [
|
|
96
|
+
(v) => vscode_uri_1.Utils.joinPath(root, 'app', 'modules', mod, v, 'views', 'layouts', `${rest}.liquid`),
|
|
97
|
+
(v) => vscode_uri_1.Utils.joinPath(root, 'modules', mod, v, 'views', 'layouts', `${rest}.liquid`),
|
|
98
|
+
];
|
|
99
|
+
outer: for (const makeCandidate of roots) {
|
|
100
|
+
for (const visibility of ['public', 'private']) {
|
|
101
|
+
const candidate = makeCandidate(visibility);
|
|
102
|
+
if (await this.fileExists(candidate.toString())) {
|
|
103
|
+
targetUri = candidate.toString();
|
|
104
|
+
break outer;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const candidate = vscode_uri_1.Utils.joinPath(root, 'app', 'views', 'layouts', `${layoutName}.liquid`);
|
|
111
|
+
if (await this.fileExists(candidate.toString())) {
|
|
112
|
+
targetUri = candidate.toString();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!targetUri)
|
|
116
|
+
return [];
|
|
117
|
+
const originRange = vscode_languageserver_protocol_1.Range.create(doc.positionAt(originStart), doc.positionAt(originEnd));
|
|
118
|
+
const targetRange = vscode_languageserver_protocol_1.Range.create(0, 0, 0, 0);
|
|
119
|
+
return [vscode_languageserver_protocol_1.LocationLink.create(targetUri, targetRange, targetRange, originRange)];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Resolves a frontmatter list-item value to a definition link.
|
|
123
|
+
*
|
|
124
|
+
* App-level items (e.g. `require_login`) resolve to:
|
|
125
|
+
* app/{appDir}/{name}.liquid
|
|
126
|
+
*
|
|
127
|
+
* Module-prefixed items (e.g. `modules/community/require_login`) resolve to the first
|
|
128
|
+
* existing path in priority order:
|
|
129
|
+
* app/modules/{mod}/public/{appDir}/{name}.liquid (app overwrite, public)
|
|
130
|
+
* app/modules/{mod}/private/{appDir}/{name}.liquid (app overwrite, private)
|
|
131
|
+
* modules/{mod}/public/{appDir}/{name}.liquid
|
|
132
|
+
* modules/{mod}/private/{appDir}/{name}.liquid
|
|
133
|
+
*/
|
|
134
|
+
async resolveAssociationDefinition(fileUri, itemName, appDir, lineAbsStart, doc) {
|
|
135
|
+
const rootUri = await this.findAppRootURI(fileUri);
|
|
136
|
+
if (!rootUri)
|
|
137
|
+
return [];
|
|
138
|
+
const root = vscode_uri_1.URI.parse(rootUri);
|
|
139
|
+
let targetUri;
|
|
140
|
+
if (itemName.startsWith('modules/')) {
|
|
141
|
+
const match = itemName.match(/^modules\/([^/]+)\/(.+)$/);
|
|
142
|
+
if (!match)
|
|
143
|
+
return [];
|
|
144
|
+
const [, mod, name] = match;
|
|
145
|
+
const candidates = [
|
|
146
|
+
vscode_uri_1.Utils.joinPath(root, 'app', 'modules', mod, 'public', appDir, `${name}.liquid`),
|
|
147
|
+
vscode_uri_1.Utils.joinPath(root, 'app', 'modules', mod, 'private', appDir, `${name}.liquid`),
|
|
148
|
+
vscode_uri_1.Utils.joinPath(root, 'modules', mod, 'public', appDir, `${name}.liquid`),
|
|
149
|
+
vscode_uri_1.Utils.joinPath(root, 'modules', mod, 'private', appDir, `${name}.liquid`),
|
|
150
|
+
];
|
|
151
|
+
for (const candidate of candidates) {
|
|
152
|
+
if (await this.fileExists(candidate.toString())) {
|
|
153
|
+
targetUri = candidate.toString();
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const candidate = vscode_uri_1.Utils.joinPath(root, 'app', appDir, `${itemName}.liquid`);
|
|
160
|
+
if (await this.fileExists(candidate.toString())) {
|
|
161
|
+
targetUri = candidate.toString();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!targetUri)
|
|
165
|
+
return [];
|
|
166
|
+
// Compute origin range: from after the "- " to end of the item value on this line
|
|
167
|
+
const body = doc.getText();
|
|
168
|
+
const lineText = body.slice(lineAbsStart, lineAbsStart + 200).split('\n')[0] ?? '';
|
|
169
|
+
const dashIdx = lineText.indexOf('-');
|
|
170
|
+
if (dashIdx === -1)
|
|
171
|
+
return [];
|
|
172
|
+
const valueOffset = lineAbsStart +
|
|
173
|
+
dashIdx +
|
|
174
|
+
1 +
|
|
175
|
+
(lineText.slice(dashIdx + 1).length - lineText.slice(dashIdx + 1).trimStart().length);
|
|
176
|
+
const valueEnd = lineAbsStart + lineText.length;
|
|
177
|
+
const originRange = vscode_languageserver_protocol_1.Range.create(doc.positionAt(valueOffset), doc.positionAt(valueEnd));
|
|
178
|
+
const targetRange = vscode_languageserver_protocol_1.Range.create(0, 0, 0, 0);
|
|
179
|
+
return [vscode_languageserver_protocol_1.LocationLink.create(targetUri, targetRange, targetRange, originRange)];
|
|
180
|
+
}
|
|
181
|
+
async fileExists(uri) {
|
|
182
|
+
try {
|
|
183
|
+
await this.fs.stat(uri);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.FrontmatterDefinitionProvider = FrontmatterDefinitionProvider;
|
|
192
|
+
function findParentKey(bodyUpToCursor) {
|
|
193
|
+
const lines = bodyUpToCursor.split('\n');
|
|
194
|
+
for (let i = lines.length - 2; i >= 0; i--) {
|
|
195
|
+
const line = lines[i];
|
|
196
|
+
if (!line.trim())
|
|
197
|
+
continue;
|
|
198
|
+
if (/^\s+-/.test(line))
|
|
199
|
+
continue;
|
|
200
|
+
const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):/);
|
|
201
|
+
if (match)
|
|
202
|
+
return match[1];
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=FrontmatterDefinitionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrontmatterDefinitionProvider.js","sourceRoot":"","sources":["../../../src/definitions/providers/FrontmatterDefinitionProvider.ts"],"names":[],"mappings":"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"}
|