@platformos/platformos-check-common 0.0.13 → 0.0.16
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 +28 -0
- package/dist/checks/metadata-params/extract-undefined-variables.d.ts +8 -0
- package/dist/checks/metadata-params/extract-undefined-variables.js +213 -0
- package/dist/checks/metadata-params/extract-undefined-variables.js.map +1 -0
- package/dist/checks/metadata-params/index.js +48 -33
- package/dist/checks/metadata-params/index.js.map +1 -1
- package/dist/checks/translation-utils.d.ts +3 -7
- package/dist/checks/translation-utils.js +2 -2
- package/dist/checks/translation-utils.js.map +1 -1
- package/dist/checks/undefined-object/index.js +11 -0
- package/dist/checks/undefined-object/index.js.map +1 -1
- package/dist/checks/unknown-property/index.js +64 -2
- package/dist/checks/unknown-property/index.js.map +1 -1
- package/dist/to-source-code.d.ts +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/checks/metadata-params/extract-undefined-variables.spec.ts +115 -0
- package/src/checks/metadata-params/extract-undefined-variables.ts +286 -0
- package/src/checks/metadata-params/index.spec.ts +180 -26
- package/src/checks/metadata-params/index.ts +51 -34
- package/src/checks/translation-utils.ts +5 -5
- package/src/checks/undefined-object/index.spec.ts +165 -36
- package/src/checks/undefined-object/index.ts +13 -0
- package/src/checks/unknown-property/index.spec.ts +62 -0
- package/src/checks/unknown-property/index.ts +73 -2
- package/src/disabled-checks/index.spec.ts +4 -4
- package/src/url-helpers.spec.ts +145 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @platformos/theme-check-common
|
|
2
2
|
|
|
3
|
+
## 0.0.16
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Improved Liquid Linting
|
|
8
|
+
- Better metadata params validation — Reworked detection of undefined variables in page/partial metadata parameters, reducing false positives
|
|
9
|
+
- Improved undefined object detection — More accurate identification of undefined objects in Liquid templates
|
|
10
|
+
- Fixed invalid property detection — The unknown-property check now correctly catches more cases of invalid property access on objects
|
|
11
|
+
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @platformos/liquid-html-parser@0.0.15
|
|
14
|
+
|
|
15
|
+
## 0.0.15
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- ctrl+click fix
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
- @platformos/liquid-html-parser@0.0.14
|
|
22
|
+
|
|
23
|
+
## 0.0.14
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- better ctrl click, more checks
|
|
28
|
+
- Updated dependencies
|
|
29
|
+
- @platformos/liquid-html-parser@0.0.13
|
|
30
|
+
|
|
3
31
|
## 0.0.13
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses a Liquid source string and returns a deduplicated list of variable names
|
|
3
|
+
* that are used but never defined. Returns [] on parse errors.
|
|
4
|
+
*
|
|
5
|
+
* This mirrors the variable tracking logic from the UndefinedObject check but
|
|
6
|
+
* packaged as a standalone synchronous function.
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractUndefinedVariables(source: string, globalObjectNames?: string[]): string[];
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractUndefinedVariables = extractUndefinedVariables;
|
|
4
|
+
const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
|
|
5
|
+
/**
|
|
6
|
+
* Parses a Liquid source string and returns a deduplicated list of variable names
|
|
7
|
+
* that are used but never defined. Returns [] on parse errors.
|
|
8
|
+
*
|
|
9
|
+
* This mirrors the variable tracking logic from the UndefinedObject check but
|
|
10
|
+
* packaged as a standalone synchronous function.
|
|
11
|
+
*/
|
|
12
|
+
function extractUndefinedVariables(source, globalObjectNames = []) {
|
|
13
|
+
let ast;
|
|
14
|
+
try {
|
|
15
|
+
ast = (0, liquid_html_parser_1.toLiquidHtmlAST)(source);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const scopedVariables = new Map();
|
|
21
|
+
const fileScopedVariables = new Set(globalObjectNames);
|
|
22
|
+
const variables = [];
|
|
23
|
+
function indexVariableScope(variableName, scope) {
|
|
24
|
+
if (!variableName)
|
|
25
|
+
return;
|
|
26
|
+
const indexedScope = scopedVariables.get(variableName) ?? [];
|
|
27
|
+
scopedVariables.set(variableName, indexedScope.concat(scope));
|
|
28
|
+
}
|
|
29
|
+
function walk(node, ancestors) {
|
|
30
|
+
// Process definitions from LiquidTag nodes
|
|
31
|
+
if (node.type === liquid_html_parser_1.NodeTypes.LiquidTag) {
|
|
32
|
+
handleLiquidTag(node, ancestors);
|
|
33
|
+
}
|
|
34
|
+
// Process definitions from LiquidBranch nodes (catch)
|
|
35
|
+
if (node.type === liquid_html_parser_1.NodeTypes.LiquidBranch) {
|
|
36
|
+
handleLiquidBranch(node);
|
|
37
|
+
}
|
|
38
|
+
// Process variable usages
|
|
39
|
+
if (node.type === liquid_html_parser_1.NodeTypes.VariableLookup) {
|
|
40
|
+
handleVariableLookup(node, ancestors);
|
|
41
|
+
}
|
|
42
|
+
// Recurse into children
|
|
43
|
+
const newAncestors = ancestors.concat(node);
|
|
44
|
+
for (const value of Object.values(node)) {
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
for (const item of value) {
|
|
47
|
+
if (isNode(item)) {
|
|
48
|
+
walk(item, newAncestors);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (isNode(value)) {
|
|
53
|
+
walk(value, newAncestors);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function handleLiquidTag(node, _ancestors) {
|
|
58
|
+
if (isLiquidTagAssign(node) || isLiquidTagGraphQL(node) || isLiquidTagParseJson(node)) {
|
|
59
|
+
indexVariableScope(node.markup.name, {
|
|
60
|
+
start: node.blockStartPosition.end,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (isLiquidTagHashAssign(node) && node.markup.target.name) {
|
|
64
|
+
indexVariableScope(node.markup.target.name, {
|
|
65
|
+
start: node.blockStartPosition.end,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (isLiquidTagCapture(node)) {
|
|
69
|
+
indexVariableScope(node.markup.name, {
|
|
70
|
+
start: node.blockEndPosition?.end,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (node.name === 'form') {
|
|
74
|
+
indexVariableScope(node.name, {
|
|
75
|
+
start: node.blockStartPosition.end,
|
|
76
|
+
end: node.blockEndPosition?.start,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (node.name === 'function') {
|
|
80
|
+
const fnName = node.markup.name;
|
|
81
|
+
if (fnName.lookups.length === 0 && fnName.name !== null) {
|
|
82
|
+
indexVariableScope(fnName.name, {
|
|
83
|
+
start: node.position.end,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if ((isLiquidTagIncrement(node) || isLiquidTagDecrement(node)) && node.markup.name !== null) {
|
|
88
|
+
indexVariableScope(node.markup.name, {
|
|
89
|
+
start: node.position.start,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (isLiquidForTag(node) || isLiquidTableRowTag(node)) {
|
|
93
|
+
indexVariableScope(node.markup.variableName, {
|
|
94
|
+
start: node.blockStartPosition.end,
|
|
95
|
+
end: node.blockEndPosition?.start,
|
|
96
|
+
});
|
|
97
|
+
indexVariableScope(node.name === 'for' ? 'forloop' : 'tablerowloop', {
|
|
98
|
+
start: node.blockStartPosition.end,
|
|
99
|
+
end: node.blockEndPosition?.start,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (isLiquidTagBackground(node)) {
|
|
103
|
+
indexVariableScope(node.markup.jobId, {
|
|
104
|
+
start: node.position.end,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function handleLiquidBranch(node) {
|
|
109
|
+
if (node.name === liquid_html_parser_1.NamedTags.catch &&
|
|
110
|
+
node.markup &&
|
|
111
|
+
typeof node.markup !== 'string' &&
|
|
112
|
+
'name' in node.markup &&
|
|
113
|
+
node.markup.name) {
|
|
114
|
+
indexVariableScope(node.markup.name, {
|
|
115
|
+
start: node.blockStartPosition.end,
|
|
116
|
+
end: node.blockEndPosition?.start,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function handleVariableLookup(node, ancestors) {
|
|
121
|
+
const parent = ancestors[ancestors.length - 1];
|
|
122
|
+
if (isLiquidTag(parent) && isLiquidTagCapture(parent))
|
|
123
|
+
return;
|
|
124
|
+
if (isLiquidTag(parent) && isLiquidTagParseJson(parent))
|
|
125
|
+
return;
|
|
126
|
+
if (isFunctionMarkup(parent) && parent.name === node)
|
|
127
|
+
return;
|
|
128
|
+
if (isLiquidBranchCatch(parent) && parent.markup === node)
|
|
129
|
+
return;
|
|
130
|
+
if (isHashAssignMarkup(parent) && parent.target === node)
|
|
131
|
+
return;
|
|
132
|
+
variables.push(node);
|
|
133
|
+
}
|
|
134
|
+
walk(ast, []);
|
|
135
|
+
// Determine undefined variables
|
|
136
|
+
const seen = new Set();
|
|
137
|
+
const result = [];
|
|
138
|
+
for (const variable of variables) {
|
|
139
|
+
if (!variable.name)
|
|
140
|
+
continue;
|
|
141
|
+
if (seen.has(variable.name))
|
|
142
|
+
continue;
|
|
143
|
+
const isVariableDefined = isDefined(variable.name, variable.position, fileScopedVariables, scopedVariables);
|
|
144
|
+
if (!isVariableDefined) {
|
|
145
|
+
seen.add(variable.name);
|
|
146
|
+
result.push(variable.name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
function isNode(x) {
|
|
152
|
+
return x !== null && typeof x === 'object' && typeof x.type === 'string';
|
|
153
|
+
}
|
|
154
|
+
function isDefined(variableName, variablePosition, fileScopedVariables, scopedVariables) {
|
|
155
|
+
if (fileScopedVariables.has(variableName)) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
const scopes = scopedVariables.get(variableName);
|
|
159
|
+
if (!scopes) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return scopes.some((scope) => {
|
|
163
|
+
const start = variablePosition.start;
|
|
164
|
+
const isVariableAfterScopeStart = !scope.start || start > scope.start;
|
|
165
|
+
const isVariableBeforeScopeEnd = !scope.end || start < scope.end;
|
|
166
|
+
return isVariableAfterScopeStart && isVariableBeforeScopeEnd;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function isLiquidTag(node) {
|
|
170
|
+
return node?.type === liquid_html_parser_1.NodeTypes.LiquidTag;
|
|
171
|
+
}
|
|
172
|
+
function isLiquidTagCapture(node) {
|
|
173
|
+
return node.name === liquid_html_parser_1.NamedTags.capture;
|
|
174
|
+
}
|
|
175
|
+
function isLiquidTagAssign(node) {
|
|
176
|
+
return node.name === liquid_html_parser_1.NamedTags.assign && typeof node.markup !== 'string';
|
|
177
|
+
}
|
|
178
|
+
function isLiquidTagHashAssign(node) {
|
|
179
|
+
return node.name === liquid_html_parser_1.NamedTags.hash_assign && typeof node.markup !== 'string';
|
|
180
|
+
}
|
|
181
|
+
function isLiquidTagGraphQL(node) {
|
|
182
|
+
return node.name === liquid_html_parser_1.NamedTags.graphql && typeof node.markup !== 'string';
|
|
183
|
+
}
|
|
184
|
+
function isLiquidTagParseJson(node) {
|
|
185
|
+
return node.name === liquid_html_parser_1.NamedTags.parse_json && typeof node.markup !== 'string';
|
|
186
|
+
}
|
|
187
|
+
function isLiquidForTag(node) {
|
|
188
|
+
return node.name === liquid_html_parser_1.NamedTags.for && typeof node.markup !== 'string';
|
|
189
|
+
}
|
|
190
|
+
function isLiquidTableRowTag(node) {
|
|
191
|
+
return node.name === liquid_html_parser_1.NamedTags.tablerow && typeof node.markup !== 'string';
|
|
192
|
+
}
|
|
193
|
+
function isLiquidTagIncrement(node) {
|
|
194
|
+
return node.name === liquid_html_parser_1.NamedTags.increment && typeof node.markup !== 'string';
|
|
195
|
+
}
|
|
196
|
+
function isLiquidTagDecrement(node) {
|
|
197
|
+
return node.name === liquid_html_parser_1.NamedTags.decrement && typeof node.markup !== 'string';
|
|
198
|
+
}
|
|
199
|
+
function isLiquidTagBackground(node) {
|
|
200
|
+
return (node.name === liquid_html_parser_1.NamedTags.background &&
|
|
201
|
+
typeof node.markup !== 'string' &&
|
|
202
|
+
node.markup.type === liquid_html_parser_1.NodeTypes.BackgroundMarkup);
|
|
203
|
+
}
|
|
204
|
+
function isHashAssignMarkup(node) {
|
|
205
|
+
return node?.type === liquid_html_parser_1.NodeTypes.HashAssignMarkup;
|
|
206
|
+
}
|
|
207
|
+
function isFunctionMarkup(node) {
|
|
208
|
+
return node?.type === liquid_html_parser_1.NodeTypes.FunctionMarkup;
|
|
209
|
+
}
|
|
210
|
+
function isLiquidBranchCatch(node) {
|
|
211
|
+
return node?.type === liquid_html_parser_1.NodeTypes.LiquidBranch && node.name === liquid_html_parser_1.NamedTags.catch;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=extract-undefined-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-undefined-variables.js","sourceRoot":"","sources":["../../../src/checks/metadata-params/extract-undefined-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.MetadataParamsCheck = void 0;
|
|
7
4
|
const types_1 = require("../../types");
|
|
8
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
9
5
|
const platformos_common_1 = require("@platformos/platformos-common");
|
|
10
6
|
const vscode_uri_1 = require("vscode-uri");
|
|
11
7
|
const path_1 = require("../../path");
|
|
12
|
-
|
|
13
|
-
source = source.trim();
|
|
14
|
-
if (!source.startsWith('---'))
|
|
15
|
-
return null;
|
|
16
|
-
const end = source.indexOf('---', 3);
|
|
17
|
-
if (end === -1)
|
|
18
|
-
return null;
|
|
19
|
-
const yamlBlock = source.slice(3, end).trim();
|
|
20
|
-
try {
|
|
21
|
-
const result = js_yaml_1.default.load(yamlBlock);
|
|
22
|
-
return Object.keys(result.metadata.params);
|
|
23
|
-
}
|
|
24
|
-
catch (e) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
8
|
+
const extract_undefined_variables_1 = require("./extract-undefined-variables");
|
|
28
9
|
exports.MetadataParamsCheck = {
|
|
29
10
|
meta: {
|
|
30
11
|
code: 'MetadataParamsCheck',
|
|
31
12
|
name: 'Metadata Params Check',
|
|
32
13
|
docs: {
|
|
33
|
-
description: 'Ensures that parameters referenced in the document exist in
|
|
14
|
+
description: 'Ensures that parameters referenced in the document exist in the doc tag or are inferred from undefined variables.',
|
|
34
15
|
recommended: true,
|
|
35
16
|
url: undefined,
|
|
36
17
|
},
|
|
@@ -46,21 +27,55 @@ exports.MetadataParamsCheck = {
|
|
|
46
27
|
if (!locatedFile) {
|
|
47
28
|
return;
|
|
48
29
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
30
|
+
const source = await context.fs.readFile(locatedFile);
|
|
31
|
+
const relativePath = (0, path_1.relative)(locatedFile, context.config.rootUri);
|
|
32
|
+
let requiredParams;
|
|
33
|
+
let allowedParams;
|
|
34
|
+
// Check for @doc tag first — if present, it's the complete param list
|
|
35
|
+
const docDef = context.getDocDefinition
|
|
36
|
+
? await context.getDocDefinition(relativePath)
|
|
37
|
+
: undefined;
|
|
38
|
+
if (docDef?.liquidDoc?.parameters) {
|
|
39
|
+
const globalObjectNames = [];
|
|
40
|
+
if (context.platformosDocset) {
|
|
41
|
+
const objects = await context.platformosDocset.objects();
|
|
42
|
+
for (const obj of objects) {
|
|
43
|
+
if (!obj.access || obj.access.global === true || obj.access.template.length > 0) {
|
|
44
|
+
globalObjectNames.push(obj.name);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const undefinedVars = (0, extract_undefined_variables_1.extractUndefinedVariables)(source, globalObjectNames);
|
|
49
|
+
const docRequiredNames = docDef.liquidDoc.parameters
|
|
59
50
|
.filter((p) => p.required)
|
|
60
51
|
.map((p) => p.name);
|
|
52
|
+
requiredParams = docRequiredNames.filter((name) => undefinedVars.includes(name));
|
|
53
|
+
allowedParams = docDef.liquidDoc.parameters.map((p) => p.name);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// No @doc — scan for undefined variables, treat all as required
|
|
57
|
+
const globalObjectNames = [];
|
|
58
|
+
if (context.platformosDocset) {
|
|
59
|
+
const objects = await context.platformosDocset.objects();
|
|
60
|
+
for (const obj of objects) {
|
|
61
|
+
if (!obj.access || obj.access.global === true || obj.access.template.length > 0) {
|
|
62
|
+
globalObjectNames.push(obj.name);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (relativePath.includes('views/partials/') || relativePath.includes('/lib/')) {
|
|
67
|
+
if (!globalObjectNames.includes('app')) {
|
|
68
|
+
globalObjectNames.push('app');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const undefinedVars = (0, extract_undefined_variables_1.extractUndefinedVariables)(source, globalObjectNames);
|
|
72
|
+
if (undefinedVars.length === 0)
|
|
73
|
+
return;
|
|
74
|
+
requiredParams = undefinedVars;
|
|
75
|
+
allowedParams = undefinedVars;
|
|
61
76
|
}
|
|
62
77
|
args
|
|
63
|
-
.filter((arg) => !
|
|
78
|
+
.filter((arg) => !allowedParams.includes(arg.name))
|
|
64
79
|
.forEach((arg) => {
|
|
65
80
|
context.report({
|
|
66
81
|
message: `Unknown parameter ${arg.name} passed to ${nodeType} call`,
|
|
@@ -68,7 +83,7 @@ exports.MetadataParamsCheck = {
|
|
|
68
83
|
endIndex: arg.position.end,
|
|
69
84
|
});
|
|
70
85
|
});
|
|
71
|
-
|
|
86
|
+
requiredParams
|
|
72
87
|
.filter((param) => !args.find((arg) => arg.name === param))
|
|
73
88
|
.forEach((param) => {
|
|
74
89
|
context.report({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/metadata-params/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/metadata-params/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AbstractFileSystem } from '@platformos/platformos-common';
|
|
2
2
|
/**
|
|
3
3
|
* Discovers all module names by listing app/modules/ and modules/ directories.
|
|
4
4
|
* Returns a deduplicated set of module names.
|
|
5
5
|
*/
|
|
6
|
-
export declare function discoverModules(fs:
|
|
7
|
-
readDirectory(uri: string): Promise<[string, FileType][]>;
|
|
8
|
-
}, ...moduleDirUris: string[]): Promise<Set<string>>;
|
|
6
|
+
export declare function discoverModules(fs: AbstractFileSystem, ...moduleDirUris: string[]): Promise<Set<string>>;
|
|
9
7
|
export interface TranslationContext {
|
|
10
|
-
fs:
|
|
11
|
-
readDirectory(uri: string): Promise<[string, FileType][]>;
|
|
12
|
-
};
|
|
8
|
+
fs: AbstractFileSystem;
|
|
13
9
|
toUri(relativePath: string): string;
|
|
14
10
|
getTranslationsForBase(uri: string, locale: string): Promise<Record<string, any>>;
|
|
15
11
|
}
|
|
@@ -19,8 +19,8 @@ async function discoverModules(fs, ...moduleDirUris) {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
catch
|
|
23
|
-
|
|
22
|
+
catch {
|
|
23
|
+
// Directory doesn't exist or isn't accessible — skip
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
return modules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation-utils.js","sourceRoot":"","sources":["../../src/checks/translation-utils.ts"],"names":[],"mappings":";;AAOA,0CAkBC;AAYD,gDAyBC;AA9DD,
|
|
1
|
+
{"version":3,"file":"translation-utils.js","sourceRoot":"","sources":["../../src/checks/translation-utils.ts"],"names":[],"mappings":";;AAOA,0CAkBC;AAYD,gDAyBC;AA9DD,qEAAkG;AAClG,sDAA8D;AAE9D;;;GAGG;AACI,KAAK,UAAU,eAAe,CACnC,EAAsB,EACtB,GAAG,aAAuB;IAE1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;gBAC5C,IAAI,SAAS,KAAK,4BAAQ,CAAC,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,uCAAmB,CAAC,cAAc,EAAE,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACrF,WAAW,CAAC,IAAI,CAAC,GAAG,IAAA,oCAAsB,EAAC,YAAY,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,OAAO,CAAC,EAAE,EACV,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAC5B,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CACzB,CAAC;IACF,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,uCAAmB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACrF,KAAK,MAAM,GAAG,IAAI,IAAA,oCAAsB,EAAC,YAAY,CAAC,EAAE,CAAC;gBACvD,WAAW,CAAC,IAAI,CAAC,WAAW,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -5,6 +5,7 @@ const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
|
|
|
5
5
|
const types_1 = require("../../types");
|
|
6
6
|
const utils_1 = require("../../utils");
|
|
7
7
|
const utils_2 = require("../utils");
|
|
8
|
+
const path_1 = require("../../path");
|
|
8
9
|
exports.UndefinedObject = {
|
|
9
10
|
meta: {
|
|
10
11
|
code: 'UndefinedObject',
|
|
@@ -34,6 +35,7 @@ exports.UndefinedObject = {
|
|
|
34
35
|
const scopedVariables = new Map();
|
|
35
36
|
const fileScopedVariables = new Set();
|
|
36
37
|
const variables = [];
|
|
38
|
+
let hasDocTag = false;
|
|
37
39
|
function indexVariableScope(variableName, scope) {
|
|
38
40
|
if (!variableName)
|
|
39
41
|
return;
|
|
@@ -47,6 +49,11 @@ exports.UndefinedObject = {
|
|
|
47
49
|
fileScopedVariables.add(paramName);
|
|
48
50
|
}
|
|
49
51
|
},
|
|
52
|
+
async LiquidRawTag(node) {
|
|
53
|
+
if (node.name === 'doc') {
|
|
54
|
+
hasDocTag = true;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
50
57
|
async LiquidTag(node, ancestors) {
|
|
51
58
|
if ((0, utils_2.isWithinRawTagThatDoesNotParseItsContents)(ancestors))
|
|
52
59
|
return;
|
|
@@ -152,6 +159,10 @@ exports.UndefinedObject = {
|
|
|
152
159
|
variables.push(node);
|
|
153
160
|
},
|
|
154
161
|
async onCodePathEnd() {
|
|
162
|
+
const fileIsPage = (0, path_1.isPage)(context.file.uri);
|
|
163
|
+
// If no @doc tag and not a page, assume undefined variables are params from caller
|
|
164
|
+
if (!hasDocTag && !fileIsPage)
|
|
165
|
+
return;
|
|
155
166
|
const objects = await globalObjects(platformosDocset, relativePath);
|
|
156
167
|
objects.forEach((obj) => fileScopedVariables.add(obj.name));
|
|
157
168
|
variables.forEach((variable) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/undefined-object/index.ts"],"names":[],"mappings":";;;AAAA,uEAoBwC;AACxC,uCAAgG;AAChG,uCAA4C;AAC5C,oCAAqE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/undefined-object/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,8 +54,10 @@ exports.UnknownProperty = {
|
|
|
54
54
|
// {% assign x = var | default: '{"fallback": true}' | parse_json %}
|
|
55
55
|
if (isLiquidTagAssign(node)) {
|
|
56
56
|
const markup = node.markup;
|
|
57
|
-
// Close any previous shape for this variable (reassignment)
|
|
58
|
-
|
|
57
|
+
// Close any previous shape for this variable (reassignment).
|
|
58
|
+
// Use the value expression's end so the RHS can still see the old shape
|
|
59
|
+
// (e.g. {% assign c = c.d %} — c.d must resolve against the previous shape of c).
|
|
60
|
+
closeShapeRange(markup.name, markup.value.position.end);
|
|
59
61
|
const hasParseJsonFilter = markup.value.filters &&
|
|
60
62
|
markup.value.filters.some((f) => f.name === 'parse_json' || f.name === 'to_hash');
|
|
61
63
|
if (hasParseJsonFilter) {
|
|
@@ -85,6 +87,18 @@ exports.UnknownProperty = {
|
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
}
|
|
90
|
+
// {% assign x = {a: 5, b: {c: 1}} %} or {% assign x = [1, 2, 3] %}
|
|
91
|
+
const exprType = markup.value.expression.type;
|
|
92
|
+
if (exprType === liquid_html_parser_1.NodeTypes.JsonHashLiteral || exprType === liquid_html_parser_1.NodeTypes.JsonArrayLiteral) {
|
|
93
|
+
const shape = inferShapeFromLiteralNode(markup.value.expression);
|
|
94
|
+
if (shape) {
|
|
95
|
+
variableShapes.push({
|
|
96
|
+
name: markup.name,
|
|
97
|
+
shape,
|
|
98
|
+
range: [node.position.end],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
88
102
|
// {% assign x = y | dig: "key1" | dig: "key2" %}
|
|
89
103
|
// Follow the dig path through the source variable's known shape.
|
|
90
104
|
const digFilters = markup.value.filters?.filter((f) => f.name === 'dig') ?? [];
|
|
@@ -423,4 +437,52 @@ function isGraphQLInlineMarkup(markup) {
|
|
|
423
437
|
function isLiquidString(expr) {
|
|
424
438
|
return expr.type === liquid_html_parser_1.NodeTypes.String;
|
|
425
439
|
}
|
|
440
|
+
/**
|
|
441
|
+
* Infer a PropertyShape from a JsonHashLiteral or JsonArrayLiteral AST node.
|
|
442
|
+
*/
|
|
443
|
+
function inferShapeFromLiteralNode(node) {
|
|
444
|
+
if (node.type === liquid_html_parser_1.NodeTypes.JsonArrayLiteral) {
|
|
445
|
+
let itemShape;
|
|
446
|
+
for (const element of node.elements) {
|
|
447
|
+
const elShape = inferShapeFromExpressionNode(element);
|
|
448
|
+
if (elShape) {
|
|
449
|
+
itemShape = itemShape ? itemShape : elShape;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return { kind: 'array', itemShape };
|
|
453
|
+
}
|
|
454
|
+
if (node.type === liquid_html_parser_1.NodeTypes.JsonHashLiteral) {
|
|
455
|
+
const properties = new Map();
|
|
456
|
+
for (const entry of node.entries) {
|
|
457
|
+
// Keys are VariableLookup nodes where the name is the key string
|
|
458
|
+
if (entry.key.type === liquid_html_parser_1.NodeTypes.VariableLookup && entry.key.name) {
|
|
459
|
+
const valueShape = inferShapeFromExpressionNode(entry.value);
|
|
460
|
+
properties.set(entry.key.name, valueShape ?? { kind: 'primitive' });
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return { kind: 'object', properties };
|
|
464
|
+
}
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Infer a PropertyShape from a Liquid expression or variable node.
|
|
469
|
+
*/
|
|
470
|
+
function inferShapeFromExpressionNode(node) {
|
|
471
|
+
if (node.type === liquid_html_parser_1.NodeTypes.JsonHashLiteral) {
|
|
472
|
+
return inferShapeFromLiteralNode(node) ?? { kind: 'primitive' };
|
|
473
|
+
}
|
|
474
|
+
if (node.type === liquid_html_parser_1.NodeTypes.JsonArrayLiteral) {
|
|
475
|
+
return inferShapeFromLiteralNode(node) ?? { kind: 'primitive' };
|
|
476
|
+
}
|
|
477
|
+
if (node.type === liquid_html_parser_1.NodeTypes.String) {
|
|
478
|
+
return { kind: 'primitive', primitiveType: 'string' };
|
|
479
|
+
}
|
|
480
|
+
if (node.type === liquid_html_parser_1.NodeTypes.Number) {
|
|
481
|
+
return { kind: 'primitive', primitiveType: 'number' };
|
|
482
|
+
}
|
|
483
|
+
if (node.type === liquid_html_parser_1.NodeTypes.LiquidLiteral) {
|
|
484
|
+
return { kind: 'primitive' };
|
|
485
|
+
}
|
|
486
|
+
return { kind: 'primitive' };
|
|
487
|
+
}
|
|
426
488
|
//# sourceMappingURL=index.js.map
|