@platformos/platformos-check-common 0.0.12 → 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 +59 -0
- package/dist/checks/circular-render/index.d.ts +2 -0
- package/dist/checks/circular-render/index.js +164 -0
- package/dist/checks/circular-render/index.js.map +1 -0
- package/dist/checks/index.d.ts +1 -1
- package/dist/checks/index.js +6 -0
- package/dist/checks/index.js.map +1 -1
- 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/missing-page/index.d.ts +2 -0
- package/dist/checks/missing-page/index.js +73 -0
- package/dist/checks/missing-page/index.js.map +1 -0
- package/dist/checks/missing-partial/index.js +31 -31
- package/dist/checks/missing-partial/index.js.map +1 -1
- package/dist/checks/missing-render-partial-arguments/index.d.ts +2 -0
- package/dist/checks/missing-render-partial-arguments/index.js +37 -0
- package/dist/checks/missing-render-partial-arguments/index.js.map +1 -0
- package/dist/checks/nested-graphql-query/index.d.ts +2 -0
- package/dist/checks/nested-graphql-query/index.js +146 -0
- package/dist/checks/nested-graphql-query/index.js.map +1 -0
- package/dist/checks/translation-key-exists/index.js +16 -19
- package/dist/checks/translation-key-exists/index.js.map +1 -1
- package/dist/checks/translation-utils.d.ts +16 -0
- package/dist/checks/translation-utils.js +51 -0
- package/dist/checks/translation-utils.js.map +1 -0
- package/dist/checks/undefined-object/index.js +32 -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/checks/unused-translation-key/index.d.ts +4 -0
- package/dist/checks/unused-translation-key/index.js +85 -0
- package/dist/checks/unused-translation-key/index.js.map +1 -0
- package/dist/checks/valid-render-partial-argument-types/index.js +2 -1
- package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -1
- package/dist/context-utils.d.ts +2 -1
- package/dist/context-utils.js +31 -1
- package/dist/context-utils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/liquid-doc/arguments.js +4 -0
- package/dist/liquid-doc/arguments.js.map +1 -1
- package/dist/liquid-doc/utils.d.ts +10 -2
- package/dist/liquid-doc/utils.js +26 -1
- package/dist/liquid-doc/utils.js.map +1 -1
- package/dist/to-source-code.d.ts +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +8 -1
- package/dist/types.js.map +1 -1
- package/dist/url-helpers.d.ts +55 -0
- package/dist/url-helpers.js +334 -0
- package/dist/url-helpers.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/levenshtein.d.ts +3 -0
- package/dist/utils/levenshtein.js +39 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/package.json +2 -2
- package/src/checks/graphql/index.spec.ts +2 -2
- package/src/checks/index.ts +6 -0
- 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/missing-page/index.spec.ts +755 -0
- package/src/checks/missing-page/index.ts +89 -0
- package/src/checks/missing-partial/index.spec.ts +361 -0
- package/src/checks/missing-partial/index.ts +39 -47
- package/src/checks/missing-render-partial-arguments/index.spec.ts +74 -0
- package/src/checks/missing-render-partial-arguments/index.ts +44 -0
- package/src/checks/nested-graphql-query/index.spec.ts +175 -0
- package/src/checks/nested-graphql-query/index.ts +203 -0
- package/src/checks/parser-blocking-script/index.spec.ts +7 -3
- package/src/checks/translation-key-exists/index.spec.ts +79 -2
- package/src/checks/translation-key-exists/index.ts +18 -27
- package/src/checks/translation-utils.ts +63 -0
- package/src/checks/undefined-object/index.spec.ts +194 -35
- package/src/checks/undefined-object/index.ts +40 -1
- package/src/checks/unknown-property/index.spec.ts +62 -0
- package/src/checks/unknown-property/index.ts +73 -2
- package/src/checks/unused-assign/index.spec.ts +1 -1
- package/src/checks/unused-doc-param/index.spec.ts +4 -2
- package/src/checks/valid-doc-param-types/index.spec.ts +1 -1
- package/src/checks/valid-render-partial-argument-types/index.spec.ts +24 -1
- package/src/checks/valid-render-partial-argument-types/index.ts +3 -2
- package/src/checks/variable-name/index.spec.ts +1 -1
- package/src/context-utils.ts +33 -1
- package/src/disabled-checks/index.spec.ts +4 -4
- package/src/index.ts +3 -0
- package/src/liquid-doc/arguments.ts +6 -0
- package/src/liquid-doc/utils.ts +26 -2
- package/src/types.ts +9 -1
- package/src/url-helpers.spec.ts +386 -0
- package/src/url-helpers.ts +363 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/levenshtein.ts +41 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
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
|
+
|
|
31
|
+
## 0.0.13
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- **MissingRenderPartialArguments**: Reports an error when required `@param` arguments declared in a partial's LiquidDoc are not provided at the `{% render %}` call site.
|
|
36
|
+
- **NestedGraphQLQuery**: Detects N+1 query patterns — `{% graphql %}` tags inside `{% for %}`/`{% tablerow %}` loops. Also follows `{% function %}` and `{% render %}` calls transitively to detect indirect GraphQL queries. Skips loops wrapped in `{% cache %}` or `{% background %}`.
|
|
37
|
+
- Added **GraphQLFieldCompletionProvider**: Provides completions for GraphQL field names.
|
|
38
|
+
- Added **GraphQLFieldHoverProvider**: Shows hover documentation for GraphQL fields.
|
|
39
|
+
- Added `theme_render_rc` as a new document type, enabling the `{% theme_render_rc %}` tag to resolve partials through configurable `theme_search_paths` defined in `app/config.yml`.
|
|
40
|
+
- **DocumentsLocator**: New `locateWithSearchPaths()` method resolves partials using prioritized search paths, including dynamic paths with `{{ }}` Liquid expressions that expand by enumerating subdirectories.
|
|
41
|
+
- **loadSearchPaths()**: New utility to read and parse `theme_search_paths` from `app/config.yml`.
|
|
42
|
+
- **TranslationKeyExists**: Refactored to load all defined keys (app-level and module-level) in a single pass. Now suggests nearest matching keys using Levenshtein distance when a translation key is not found.
|
|
43
|
+
- Extracted shared translation utilities into `translation-utils.ts` for module discovery and key loading.
|
|
44
|
+
- Added `levenshtein.ts` utility for fuzzy key matching.
|
|
45
|
+
- Added support for `{% try %}...{% catch error %}` — the error variable in catch branches is now correctly registered as defined, preventing false-positive "undefined object" warnings.
|
|
46
|
+
- `null`/`nil` literals are now treated as compatible with any `@param` type, preventing false type-mismatch errors when passing null values to partials.
|
|
47
|
+
- `recursiveReadDirectory` now gracefully handles `ENOENT` errors instead of crashing when a directory doesn't exist.
|
|
48
|
+
- **MissingPartial** check updated to support `theme_render_rc` tag resolution through search paths.
|
|
49
|
+
- Extracted `tryExtractAssignUrl()` helper to deduplicate assign-to-URL resolution logic shared between `MissingPage` check and `buildVariableMap`.
|
|
50
|
+
- Fixed `buildVariableMap` to correctly recurse into block tags (`{% if %}`, `{% for %}`) whose position spans beyond the cursor offset — previously assigns inside such blocks could be missed.
|
|
51
|
+
- **SearchPathsLoader**: Now caches `theme_search_paths` per root URI to avoid re-reading `app/config.yml` on every request. Invalidated when file watchers detect config changes.
|
|
52
|
+
- Immediate cache invalidation on `app/config.yml` save (via `onDidSaveTextDocument`) so go-to-definition doesn't see stale data.
|
|
53
|
+
- Bulk file-watcher threshold extracted to `BULK_PAGE_CHANGE_THRESHOLD` constant.
|
|
54
|
+
- **RouteTable**: Added `routeCount()` method returning total number of route entries.
|
|
55
|
+
- Route table build errors are now properly handled — a failed build resets the cached promise so subsequent attempts can retry.
|
|
56
|
+
- `MissingPartial` check simplified with a shared `reportIfMissing()` helper, reducing code duplication across `RenderMarkup`, `FunctionMarkup`, and `GraphQLMarkup` visitors.
|
|
57
|
+
- AST traversal helpers (`getTraversableChildren`, `getTraversableMarkup`) extracted in `url-helpers.ts`.
|
|
58
|
+
- `MissingPage` check front-loads route table building in `onCodePathStart` instead of lazy-loading per element visit.
|
|
59
|
+
- Updated dependencies
|
|
60
|
+
- @platformos/liquid-html-parser@0.0.12
|
|
61
|
+
|
|
3
62
|
## 0.0.12
|
|
4
63
|
|
|
5
64
|
### Patch Changes
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CircularRender = void 0;
|
|
4
|
+
const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
|
|
5
|
+
const types_1 = require("../../types");
|
|
6
|
+
const platformos_common_1 = require("@platformos/platformos-common");
|
|
7
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
8
|
+
const MAX_DEPTH = 50;
|
|
9
|
+
// Module-level cache: URI -> partial references extracted from that file.
|
|
10
|
+
// Shared across all files in a check run to avoid re-parsing.
|
|
11
|
+
const parseCacheMap = new WeakMap();
|
|
12
|
+
function getParseCache(context) {
|
|
13
|
+
if (!parseCacheMap.has(context.fs)) {
|
|
14
|
+
parseCacheMap.set(context.fs, new Map());
|
|
15
|
+
}
|
|
16
|
+
return parseCacheMap.get(context.fs);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extract partial references (render/function/include) from a Liquid source string.
|
|
20
|
+
* Returns an empty array on parse errors.
|
|
21
|
+
*/
|
|
22
|
+
function extractPartialRefs(source) {
|
|
23
|
+
let ast;
|
|
24
|
+
try {
|
|
25
|
+
ast = (0, liquid_html_parser_1.toLiquidHtmlAST)(source);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const refs = [];
|
|
31
|
+
const stack = [ast];
|
|
32
|
+
while (stack.length > 0) {
|
|
33
|
+
const node = stack.pop();
|
|
34
|
+
if (!node || typeof node !== 'object')
|
|
35
|
+
continue;
|
|
36
|
+
if (node.type === liquid_html_parser_1.NodeTypes.LiquidTag &&
|
|
37
|
+
node.markup &&
|
|
38
|
+
typeof node.markup === 'object' &&
|
|
39
|
+
(node.markup.type === liquid_html_parser_1.NodeTypes.RenderMarkup ||
|
|
40
|
+
node.markup.type === liquid_html_parser_1.NodeTypes.FunctionMarkup) &&
|
|
41
|
+
node.markup.partial &&
|
|
42
|
+
node.markup.partial.type !== liquid_html_parser_1.NodeTypes.VariableLookup) {
|
|
43
|
+
refs.push({
|
|
44
|
+
name: node.markup.partial.value,
|
|
45
|
+
documentType: node.name || 'render',
|
|
46
|
+
startIndex: node.markup.partial.position.start,
|
|
47
|
+
endIndex: node.markup.partial.position.end,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Traverse children (skip circular references like parentNode, prev, next)
|
|
51
|
+
for (const key of Object.keys(node)) {
|
|
52
|
+
if (liquid_html_parser_1.nonTraversableProperties.has(key))
|
|
53
|
+
continue;
|
|
54
|
+
const value = node[key];
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
for (const child of value) {
|
|
57
|
+
if (child && typeof child === 'object') {
|
|
58
|
+
stack.push(child);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (value && typeof value === 'object' && value.type) {
|
|
63
|
+
stack.push(value);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return refs;
|
|
68
|
+
}
|
|
69
|
+
exports.CircularRender = {
|
|
70
|
+
meta: {
|
|
71
|
+
code: 'CircularRender',
|
|
72
|
+
name: 'Prevent circular renders',
|
|
73
|
+
docs: {
|
|
74
|
+
description: 'Reports circular render/function/include chains that would cause infinite loops at runtime.',
|
|
75
|
+
recommended: true,
|
|
76
|
+
url: 'https://documentation.platformos.com/developer-guide/platformos-check/checks/circular-render',
|
|
77
|
+
},
|
|
78
|
+
type: types_1.SourceCodeType.LiquidHtml,
|
|
79
|
+
severity: types_1.Severity.ERROR,
|
|
80
|
+
schema: {},
|
|
81
|
+
targets: [],
|
|
82
|
+
},
|
|
83
|
+
create(context) {
|
|
84
|
+
const locator = new platformos_common_1.DocumentsLocator(context.fs);
|
|
85
|
+
const rootUri = vscode_uri_1.URI.parse(context.config.rootUri);
|
|
86
|
+
const parseCache = getParseCache(context);
|
|
87
|
+
const collectedRefs = [];
|
|
88
|
+
return {
|
|
89
|
+
async RenderMarkup(node, ancestors) {
|
|
90
|
+
if (node.partial.type === liquid_html_parser_1.NodeTypes.VariableLookup)
|
|
91
|
+
return;
|
|
92
|
+
const parent = ancestors.at(-1);
|
|
93
|
+
const documentType = parent?.name === 'include' ? 'include' : 'render';
|
|
94
|
+
collectedRefs.push({
|
|
95
|
+
name: node.partial.value,
|
|
96
|
+
documentType,
|
|
97
|
+
startIndex: node.partial.position.start,
|
|
98
|
+
endIndex: node.partial.position.end,
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
async FunctionMarkup(node) {
|
|
102
|
+
if (node.partial.type === liquid_html_parser_1.NodeTypes.VariableLookup)
|
|
103
|
+
return;
|
|
104
|
+
collectedRefs.push({
|
|
105
|
+
name: node.partial.value,
|
|
106
|
+
documentType: 'function',
|
|
107
|
+
startIndex: node.partial.position.start,
|
|
108
|
+
endIndex: node.partial.position.end,
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
async onCodePathEnd() {
|
|
112
|
+
const fileUri = context.file.uri;
|
|
113
|
+
for (const ref of collectedRefs) {
|
|
114
|
+
const cycle = await findCycle(locator, rootUri, context.fs, parseCache, fileUri, ref.name, ref.documentType, [fileUri], 0);
|
|
115
|
+
if (cycle) {
|
|
116
|
+
const cyclePath = cycle
|
|
117
|
+
.map((u) => {
|
|
118
|
+
const parts = u.split('/');
|
|
119
|
+
return parts.slice(-2).join('/');
|
|
120
|
+
})
|
|
121
|
+
.join(' -> ');
|
|
122
|
+
context.report({
|
|
123
|
+
message: `Circular render detected: ${cyclePath}. This will cause an infinite loop at runtime.`,
|
|
124
|
+
startIndex: ref.startIndex,
|
|
125
|
+
endIndex: ref.endIndex,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
async function findCycle(locator, rootUri, fs, parseCache, originUri, partialName, documentType, path, depth) {
|
|
134
|
+
if (depth >= MAX_DEPTH)
|
|
135
|
+
return null;
|
|
136
|
+
const uri = await locator.locate(rootUri, documentType, partialName);
|
|
137
|
+
if (!uri)
|
|
138
|
+
return null;
|
|
139
|
+
if (uri === originUri) {
|
|
140
|
+
return [...path, uri];
|
|
141
|
+
}
|
|
142
|
+
if (path.includes(uri)) {
|
|
143
|
+
// This is a cycle, but it doesn't include the origin file — skip it
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
let refs = parseCache.get(uri);
|
|
147
|
+
if (!refs) {
|
|
148
|
+
try {
|
|
149
|
+
const source = await fs.readFile(uri);
|
|
150
|
+
refs = extractPartialRefs(source);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
refs = [];
|
|
154
|
+
}
|
|
155
|
+
parseCache.set(uri, refs);
|
|
156
|
+
}
|
|
157
|
+
for (const dep of refs) {
|
|
158
|
+
const cycle = await findCycle(locator, rootUri, fs, parseCache, originUri, dep.name, dep.documentType, [...path, uri], depth + 1);
|
|
159
|
+
if (cycle)
|
|
160
|
+
return cycle;
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/circular-render/index.ts"],"names":[],"mappings":"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"}
|
package/dist/checks/index.d.ts
CHANGED
|
@@ -5,4 +5,4 @@ export declare const allChecks: (LiquidCheckDefinition | JSONCheckDefinition | G
|
|
|
5
5
|
* - meta.docs.recommended: true
|
|
6
6
|
* - Either no meta.targets list exist or if it does exist then Recommended is a target
|
|
7
7
|
*/
|
|
8
|
-
export declare const recommended: (LiquidCheckDefinition | JSONCheckDefinition |
|
|
8
|
+
export declare const recommended: (LiquidCheckDefinition | JSONCheckDefinition | YAMLCheckDefinition | GraphQLCheckDefinition)[];
|
package/dist/checks/index.js
CHANGED
|
@@ -32,6 +32,9 @@ const graphql_1 = require("./graphql");
|
|
|
32
32
|
const unknown_property_1 = require("./unknown-property");
|
|
33
33
|
const invalid_hash_assign_target_1 = require("./invalid-hash-assign-target");
|
|
34
34
|
const duplicate_function_arguments_1 = require("./duplicate-function-arguments");
|
|
35
|
+
const missing_render_partial_arguments_1 = require("./missing-render-partial-arguments");
|
|
36
|
+
const nested_graphql_query_1 = require("./nested-graphql-query");
|
|
37
|
+
const missing_page_1 = require("./missing-page");
|
|
35
38
|
exports.allChecks = [
|
|
36
39
|
deprecated_filter_1.DeprecatedFilter,
|
|
37
40
|
deprecated_tag_1.DeprecatedTag,
|
|
@@ -63,6 +66,9 @@ exports.allChecks = [
|
|
|
63
66
|
graphql_1.GraphQLCheck,
|
|
64
67
|
unknown_property_1.UnknownProperty,
|
|
65
68
|
invalid_hash_assign_target_1.InvalidHashAssignTarget,
|
|
69
|
+
missing_render_partial_arguments_1.MissingRenderPartialArguments,
|
|
70
|
+
nested_graphql_query_1.NestedGraphQLQuery,
|
|
71
|
+
missing_page_1.MissingPage,
|
|
66
72
|
];
|
|
67
73
|
/**
|
|
68
74
|
* The recommended checks is populated by all checks with the following conditions:
|
package/dist/checks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":";;;AAAA,oCAMkB;AAElB,2DAAuD;AACvD,qDAAiD;AACjD,6FAAuF;AACvF,iEAA2D;AAC3D,2DAAsD;AACtD,yEAAmE;AACnE,mEAA+D;AAC/D,mDAA+C;AAC/C,uDAAmD;AACnD,yDAAqD;AACrD,qEAAgE;AAChE,qEAAgE;AAChE,mEAA8D;AAC9D,yDAAqD;AACrD,qEAA+D;AAC/D,qDAAiD;AACjD,mGAA6F;AAC7F,mDAA+C;AAC/C,yDAAoD;AACpD,qEAAgE;AAChE,6CAAyC;AACzC,mEAA6D;AAC7D,+FAAwF;AACxF,mDAA+C;AAC/C,uDAAwD;AACxD,2DAA4D;AAC5D,uCAAyC;AACzC,yDAAqD;AACrD,6EAAuE;AACvE,iFAA4E;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":";;;AAAA,oCAMkB;AAElB,2DAAuD;AACvD,qDAAiD;AACjD,6FAAuF;AACvF,iEAA2D;AAC3D,2DAAsD;AACtD,yEAAmE;AACnE,mEAA+D;AAC/D,mDAA+C;AAC/C,uDAAmD;AACnD,yDAAqD;AACrD,qEAAgE;AAChE,qEAAgE;AAChE,mEAA8D;AAC9D,yDAAqD;AACrD,qEAA+D;AAC/D,qDAAiD;AACjD,mGAA6F;AAC7F,mDAA+C;AAC/C,yDAAoD;AACpD,qEAAgE;AAChE,6CAAyC;AACzC,mEAA6D;AAC7D,+FAAwF;AACxF,mDAA+C;AAC/C,uDAAwD;AACxD,2DAA4D;AAC5D,uCAAyC;AACzC,yDAAqD;AACrD,6EAAuE;AACvE,iFAA4E;AAC5E,yFAAmF;AACnF,iEAA4D;AAC5D,iDAA6C;AAEhC,QAAA,SAAS,GAKhB;IACJ,oCAAgB;IAChB,8BAAa;IACb,yDAA0B;IAC1B,oEAA+B;IAC/B,wCAAiB;IACjB,mCAAe;IACf,gDAAqB;IACrB,4CAAoB;IACpB,4BAAY;IACZ,gCAAc;IACd,kCAAe;IACf,6CAAoB;IACpB,6CAAoB;IACpB,2CAAmB;IACnB,kCAAe;IACf,4CAAmB;IACnB,8BAAa;IACb,0EAAkC;IAClC,4BAAY;IACZ,iCAAc;IACd,6CAAoB;IACpB,sBAAS;IACT,0CAAkB;IAClB,qEAA+B;IAC/B,4BAAY;IACZ,qCAAmB;IACnB,yCAAqB;IACrB,sBAAY;IACZ,kCAAe;IACf,oDAAuB;IACvB,gEAA6B;IAC7B,yCAAkB;IAClB,0BAAW;CACZ,CAAC;AAEF;;;;GAIG;AACU,QAAA,WAAW,GAAG,iBAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;IACpD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAClD,MAAM,aAAa,GACjB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;QACnB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;QAC1B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAY,CAAC,WAAW,CAAC,CAAC;IAExD,OAAO,aAAa,IAAI,aAAa,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -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({
|