@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.
Files changed (32) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/TypeSystem.js +3 -9
  3. package/dist/TypeSystem.js.map +1 -1
  4. package/dist/codeActions/CodeActionsProvider.d.ts +1 -1
  5. package/dist/completions/CompletionsProvider.d.ts +8 -3
  6. package/dist/completions/CompletionsProvider.js +100 -1
  7. package/dist/completions/CompletionsProvider.js.map +1 -1
  8. package/dist/completions/params/LiquidCompletionParams.js +1 -2
  9. package/dist/completions/params/LiquidCompletionParams.js.map +1 -1
  10. package/dist/completions/providers/FrontmatterKeyCompletionProvider.d.ts +14 -0
  11. package/dist/completions/providers/FrontmatterKeyCompletionProvider.js +149 -0
  12. package/dist/completions/providers/FrontmatterKeyCompletionProvider.js.map +1 -0
  13. package/dist/completions/providers/index.d.ts +1 -0
  14. package/dist/completions/providers/index.js +3 -1
  15. package/dist/completions/providers/index.js.map +1 -1
  16. package/dist/definitions/DefinitionProvider.js +2 -0
  17. package/dist/definitions/DefinitionProvider.js.map +1 -1
  18. package/dist/definitions/providers/FrontmatterDefinitionProvider.d.ts +28 -0
  19. package/dist/definitions/providers/FrontmatterDefinitionProvider.js +207 -0
  20. package/dist/definitions/providers/FrontmatterDefinitionProvider.js.map +1 -0
  21. package/dist/tsconfig.tsbuildinfo +1 -1
  22. package/package.json +4 -4
  23. package/src/TypeSystem.spec.ts +2 -2
  24. package/src/TypeSystem.ts +3 -11
  25. package/src/completions/CompletionsProvider.ts +120 -2
  26. package/src/completions/params/LiquidCompletionParams.ts +1 -2
  27. package/src/completions/providers/FrontmatterKeyCompletionProvider.spec.ts +196 -0
  28. package/src/completions/providers/FrontmatterKeyCompletionProvider.ts +182 -0
  29. package/src/completions/providers/index.ts +5 -0
  30. package/src/definitions/DefinitionProvider.ts +2 -0
  31. package/src/definitions/providers/FrontmatterDefinitionProvider.spec.ts +463 -0
  32. 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;YAE5C,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;AAlFD,gDAkFC"}
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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"}