@platformos/platformos-check-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 (54) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/checks/index.d.ts +1 -1
  3. package/dist/checks/index.js +6 -2
  4. package/dist/checks/index.js.map +1 -1
  5. package/dist/checks/json-literal-quote-style/index.d.ts +2 -0
  6. package/dist/checks/json-literal-quote-style/index.js +42 -0
  7. package/dist/checks/json-literal-quote-style/index.js.map +1 -0
  8. package/dist/checks/liquid-html-syntax-error/checks/InvalidAssignSyntax.d.ts +32 -0
  9. package/dist/checks/liquid-html-syntax-error/checks/InvalidAssignSyntax.js +93 -0
  10. package/dist/checks/liquid-html-syntax-error/checks/InvalidAssignSyntax.js.map +1 -0
  11. package/dist/checks/liquid-html-syntax-error/checks/InvalidOutputPush.d.ts +17 -0
  12. package/dist/checks/liquid-html-syntax-error/checks/InvalidOutputPush.js +37 -0
  13. package/dist/checks/liquid-html-syntax-error/checks/InvalidOutputPush.js.map +1 -0
  14. package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.js +1 -1
  15. package/dist/checks/liquid-html-syntax-error/index.js +25 -0
  16. package/dist/checks/liquid-html-syntax-error/index.js.map +1 -1
  17. package/dist/checks/partial-call-arguments/extract-undefined-variables.d.ts +14 -0
  18. package/dist/checks/partial-call-arguments/extract-undefined-variables.js +234 -0
  19. package/dist/checks/partial-call-arguments/extract-undefined-variables.js.map +1 -0
  20. package/dist/checks/partial-call-arguments/index.d.ts +2 -0
  21. package/dist/checks/partial-call-arguments/index.js +117 -0
  22. package/dist/checks/partial-call-arguments/index.js.map +1 -0
  23. package/dist/checks/unused-assign/index.js +17 -0
  24. package/dist/checks/unused-assign/index.js.map +1 -1
  25. package/dist/checks/valid-frontmatter/index.d.ts +2 -0
  26. package/dist/checks/valid-frontmatter/index.js +279 -0
  27. package/dist/checks/valid-frontmatter/index.js.map +1 -0
  28. package/dist/frontmatter/index.d.ts +1 -59
  29. package/dist/frontmatter/index.js +6 -298
  30. package/dist/frontmatter/index.js.map +1 -1
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +2 -2
  33. package/src/checks/index.ts +6 -2
  34. package/src/checks/json-literal-quote-style/index.spec.ts +129 -0
  35. package/src/checks/json-literal-quote-style/index.ts +45 -0
  36. package/src/checks/liquid-html-syntax-error/checks/InvalidAssignSyntax.spec.ts +471 -0
  37. package/src/checks/liquid-html-syntax-error/checks/InvalidAssignSyntax.ts +97 -0
  38. package/src/checks/liquid-html-syntax-error/checks/InvalidOutputPush.spec.ts +104 -0
  39. package/src/checks/liquid-html-syntax-error/checks/InvalidOutputPush.ts +39 -0
  40. package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.spec.ts +86 -2
  41. package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.ts +1 -1
  42. package/src/checks/liquid-html-syntax-error/index.ts +30 -0
  43. package/src/checks/partial-call-arguments/extract-undefined-variables.spec.ts +218 -0
  44. package/src/checks/{metadata-params → partial-call-arguments}/extract-undefined-variables.ts +31 -6
  45. package/src/checks/partial-call-arguments/index.spec.ts +436 -0
  46. package/src/checks/{metadata-params → partial-call-arguments}/index.ts +18 -11
  47. package/src/checks/undefined-object/index.spec.ts +101 -0
  48. package/src/checks/unused-assign/index.spec.ts +48 -0
  49. package/src/checks/unused-assign/index.ts +15 -0
  50. package/src/checks/valid-frontmatter/index.spec.ts +666 -0
  51. package/src/checks/valid-frontmatter/index.ts +344 -0
  52. package/src/frontmatter/index.ts +9 -344
  53. package/src/checks/metadata-params/extract-undefined-variables.spec.ts +0 -115
  54. package/src/checks/metadata-params/index.spec.ts +0 -257
@@ -0,0 +1,234 @@
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 `{ required: [], optional: [] }` on parse errors.
8
+ *
9
+ * Variables used exclusively with `| default` filter (e.g. `assign x = x | default: val`)
10
+ * are returned in `optional` — the partial handles the missing-argument case itself.
11
+ *
12
+ * This mirrors the variable tracking logic from the UndefinedObject check but
13
+ * packaged as a standalone synchronous function.
14
+ */
15
+ function extractUndefinedVariables(source, globalObjectNames = []) {
16
+ let ast;
17
+ try {
18
+ ast = (0, liquid_html_parser_1.toLiquidHtmlAST)(source);
19
+ }
20
+ catch {
21
+ return { required: [], optional: [] };
22
+ }
23
+ const scopedVariables = new Map();
24
+ const fileScopedVariables = new Set(globalObjectNames);
25
+ const variables = [];
26
+ const variablesWithDefault = new Set();
27
+ function indexVariableScope(variableName, scope) {
28
+ if (!variableName)
29
+ return;
30
+ const indexedScope = scopedVariables.get(variableName) ?? [];
31
+ scopedVariables.set(variableName, indexedScope.concat(scope));
32
+ }
33
+ function walk(node, ancestors) {
34
+ // Process definitions from LiquidTag nodes
35
+ if (node.type === liquid_html_parser_1.NodeTypes.LiquidTag) {
36
+ handleLiquidTag(node, ancestors);
37
+ }
38
+ // Process definitions from LiquidBranch nodes (catch)
39
+ if (node.type === liquid_html_parser_1.NodeTypes.LiquidBranch) {
40
+ handleLiquidBranch(node);
41
+ }
42
+ // Process variable usages
43
+ if (node.type === liquid_html_parser_1.NodeTypes.VariableLookup) {
44
+ handleVariableLookup(node, ancestors);
45
+ }
46
+ // Recurse into children
47
+ const newAncestors = ancestors.concat(node);
48
+ for (const value of Object.values(node)) {
49
+ if (Array.isArray(value)) {
50
+ for (const item of value) {
51
+ if (isNode(item)) {
52
+ walk(item, newAncestors);
53
+ }
54
+ }
55
+ }
56
+ else if (isNode(value)) {
57
+ walk(value, newAncestors);
58
+ }
59
+ }
60
+ }
61
+ function handleLiquidTag(node, _ancestors) {
62
+ if (isLiquidTagAssign(node) || isLiquidTagGraphQL(node) || isLiquidTagParseJson(node)) {
63
+ indexVariableScope(node.markup.name, {
64
+ start: node.blockStartPosition.end,
65
+ });
66
+ }
67
+ if (isLiquidTagHashAssign(node) && node.markup.target.name) {
68
+ indexVariableScope(node.markup.target.name, {
69
+ start: node.blockStartPosition.end,
70
+ });
71
+ }
72
+ if (isLiquidTagCapture(node)) {
73
+ indexVariableScope(node.markup.name, {
74
+ start: node.blockEndPosition?.end,
75
+ });
76
+ }
77
+ if (node.name === 'form') {
78
+ indexVariableScope(node.name, {
79
+ start: node.blockStartPosition.end,
80
+ end: node.blockEndPosition?.start,
81
+ });
82
+ }
83
+ if (node.name === 'function') {
84
+ const fnName = node.markup.name;
85
+ if (fnName.lookups.length === 0 && fnName.name !== null) {
86
+ indexVariableScope(fnName.name, {
87
+ start: node.position.end,
88
+ });
89
+ }
90
+ }
91
+ if ((isLiquidTagIncrement(node) || isLiquidTagDecrement(node)) && node.markup.name !== null) {
92
+ indexVariableScope(node.markup.name, {
93
+ start: node.position.start,
94
+ });
95
+ }
96
+ if (isLiquidForTag(node) || isLiquidTableRowTag(node)) {
97
+ indexVariableScope(node.markup.variableName, {
98
+ start: node.blockStartPosition.end,
99
+ end: node.blockEndPosition?.start,
100
+ });
101
+ indexVariableScope(node.name === 'for' ? 'forloop' : 'tablerowloop', {
102
+ start: node.blockStartPosition.end,
103
+ end: node.blockEndPosition?.start,
104
+ });
105
+ }
106
+ if (isLiquidTagBackground(node)) {
107
+ indexVariableScope(node.markup.jobId, {
108
+ start: node.position.end,
109
+ });
110
+ }
111
+ }
112
+ function handleLiquidBranch(node) {
113
+ if (node.name === liquid_html_parser_1.NamedTags.catch &&
114
+ node.markup &&
115
+ typeof node.markup !== 'string' &&
116
+ 'name' in node.markup &&
117
+ node.markup.name) {
118
+ indexVariableScope(node.markup.name, {
119
+ start: node.blockStartPosition.end,
120
+ end: node.blockEndPosition?.start,
121
+ });
122
+ }
123
+ }
124
+ function handleVariableLookup(node, ancestors) {
125
+ const parent = ancestors[ancestors.length - 1];
126
+ if (isLiquidTag(parent) && isLiquidTagCapture(parent))
127
+ return;
128
+ if (isLiquidTag(parent) && isLiquidTagParseJson(parent))
129
+ return;
130
+ if (isFunctionMarkup(parent) && parent.name === node)
131
+ return;
132
+ if (isLiquidBranchCatch(parent) && parent.markup === node)
133
+ return;
134
+ if (isHashAssignMarkup(parent) && parent.target === node)
135
+ return;
136
+ variables.push(node);
137
+ // Detect `x | default: ...` — the variable is the expression of a LiquidVariable
138
+ // that has a `default` filter, meaning the partial handles the missing case itself.
139
+ if (node.name &&
140
+ isLiquidVariable(parent) &&
141
+ parent.expression === node &&
142
+ parent.filters.some((f) => f.name === 'default')) {
143
+ variablesWithDefault.add(node.name);
144
+ }
145
+ }
146
+ walk(ast, []);
147
+ // Determine undefined variables
148
+ const seen = new Set();
149
+ const required = [];
150
+ const optional = [];
151
+ for (const variable of variables) {
152
+ if (!variable.name)
153
+ continue;
154
+ if (seen.has(variable.name))
155
+ continue;
156
+ const isVariableDefined = isDefined(variable.name, variable.position, fileScopedVariables, scopedVariables);
157
+ if (!isVariableDefined) {
158
+ seen.add(variable.name);
159
+ if (variablesWithDefault.has(variable.name)) {
160
+ optional.push(variable.name);
161
+ }
162
+ else {
163
+ required.push(variable.name);
164
+ }
165
+ }
166
+ }
167
+ return { required, optional };
168
+ }
169
+ function isNode(x) {
170
+ return x !== null && typeof x === 'object' && typeof x.type === 'string';
171
+ }
172
+ function isDefined(variableName, variablePosition, fileScopedVariables, scopedVariables) {
173
+ if (fileScopedVariables.has(variableName)) {
174
+ return true;
175
+ }
176
+ const scopes = scopedVariables.get(variableName);
177
+ if (!scopes) {
178
+ return false;
179
+ }
180
+ return scopes.some((scope) => {
181
+ const start = variablePosition.start;
182
+ const isVariableAfterScopeStart = !scope.start || start > scope.start;
183
+ const isVariableBeforeScopeEnd = !scope.end || start < scope.end;
184
+ return isVariableAfterScopeStart && isVariableBeforeScopeEnd;
185
+ });
186
+ }
187
+ function isLiquidTag(node) {
188
+ return node?.type === liquid_html_parser_1.NodeTypes.LiquidTag;
189
+ }
190
+ function isLiquidTagCapture(node) {
191
+ return node.name === liquid_html_parser_1.NamedTags.capture;
192
+ }
193
+ function isLiquidTagAssign(node) {
194
+ return node.name === liquid_html_parser_1.NamedTags.assign && typeof node.markup !== 'string';
195
+ }
196
+ function isLiquidTagHashAssign(node) {
197
+ return node.name === liquid_html_parser_1.NamedTags.hash_assign && typeof node.markup !== 'string';
198
+ }
199
+ function isLiquidTagGraphQL(node) {
200
+ return node.name === liquid_html_parser_1.NamedTags.graphql && typeof node.markup !== 'string';
201
+ }
202
+ function isLiquidTagParseJson(node) {
203
+ return node.name === liquid_html_parser_1.NamedTags.parse_json && typeof node.markup !== 'string';
204
+ }
205
+ function isLiquidForTag(node) {
206
+ return node.name === liquid_html_parser_1.NamedTags.for && typeof node.markup !== 'string';
207
+ }
208
+ function isLiquidTableRowTag(node) {
209
+ return node.name === liquid_html_parser_1.NamedTags.tablerow && typeof node.markup !== 'string';
210
+ }
211
+ function isLiquidTagIncrement(node) {
212
+ return node.name === liquid_html_parser_1.NamedTags.increment && typeof node.markup !== 'string';
213
+ }
214
+ function isLiquidTagDecrement(node) {
215
+ return node.name === liquid_html_parser_1.NamedTags.decrement && typeof node.markup !== 'string';
216
+ }
217
+ function isLiquidTagBackground(node) {
218
+ return (node.name === liquid_html_parser_1.NamedTags.background &&
219
+ typeof node.markup !== 'string' &&
220
+ node.markup.type === liquid_html_parser_1.NodeTypes.BackgroundMarkup);
221
+ }
222
+ function isHashAssignMarkup(node) {
223
+ return node?.type === liquid_html_parser_1.NodeTypes.HashAssignMarkup;
224
+ }
225
+ function isFunctionMarkup(node) {
226
+ return node?.type === liquid_html_parser_1.NodeTypes.FunctionMarkup;
227
+ }
228
+ function isLiquidBranchCatch(node) {
229
+ return node?.type === liquid_html_parser_1.NodeTypes.LiquidBranch && node.name === liquid_html_parser_1.NamedTags.catch;
230
+ }
231
+ function isLiquidVariable(node) {
232
+ return node?.type === liquid_html_parser_1.NodeTypes.LiquidVariable;
233
+ }
234
+ //# sourceMappingURL=extract-undefined-variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-undefined-variables.js","sourceRoot":"","sources":["../../../src/checks/partial-call-arguments/extract-undefined-variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { LiquidCheckDefinition } from '../../types';
2
+ export declare const PartialCallArguments: LiquidCheckDefinition;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PartialCallArguments = void 0;
4
+ const types_1 = require("../../types");
5
+ const platformos_common_1 = require("@platformos/platformos-common");
6
+ const vscode_uri_1 = require("vscode-uri");
7
+ const path_1 = require("../../path");
8
+ const extract_undefined_variables_1 = require("./extract-undefined-variables");
9
+ exports.PartialCallArguments = {
10
+ meta: {
11
+ code: 'PartialCallArguments',
12
+ aliases: ['MetadataParamsCheck'],
13
+ name: 'Partial Call Arguments',
14
+ docs: {
15
+ description: 'Ensures that all required arguments are passed at render/function call sites, and that no unknown arguments are passed. Required vs optional is determined from the {% doc %} block when present, or inferred from undefined variables in the partial source otherwise. Variables used with | default are treated as optional.',
16
+ recommended: true,
17
+ url: 'https://documentation.platformos.com/developer-guide/platformos-check/checks/partial-call-arguments',
18
+ },
19
+ type: types_1.SourceCodeType.LiquidHtml,
20
+ severity: types_1.Severity.ERROR,
21
+ schema: {},
22
+ targets: [],
23
+ },
24
+ create(context) {
25
+ const locator = new platformos_common_1.DocumentsLocator(context.fs);
26
+ const validate = async (nodeType, targetFile, args, position) => {
27
+ const locatedFile = await locator.locate(vscode_uri_1.URI.parse(context.config.rootUri), nodeType, targetFile);
28
+ if (!locatedFile) {
29
+ return;
30
+ }
31
+ const source = await context.fs.readFile(locatedFile);
32
+ const relativePath = (0, path_1.relative)(locatedFile, context.config.rootUri);
33
+ let requiredParams;
34
+ let allowedParams;
35
+ // Check for @doc tag first — if present, it's the complete param list
36
+ const docDef = context.getDocDefinition
37
+ ? await context.getDocDefinition(relativePath)
38
+ : undefined;
39
+ if (docDef?.liquidDoc?.parameters) {
40
+ const globalObjectNames = [];
41
+ if (context.platformosDocset) {
42
+ const objects = await context.platformosDocset.objects();
43
+ for (const obj of objects) {
44
+ if (!obj.access || obj.access.global === true || obj.access.template.length > 0) {
45
+ globalObjectNames.push(obj.name);
46
+ }
47
+ }
48
+ }
49
+ const { required: undefinedRequiredVars, optional: undefinedOptionalVars } = (0, extract_undefined_variables_1.extractUndefinedVariables)(source, globalObjectNames);
50
+ const undefinedVars = [...undefinedRequiredVars, ...undefinedOptionalVars];
51
+ const docRequiredNames = docDef.liquidDoc.parameters
52
+ .filter((p) => p.required)
53
+ .map((p) => p.name);
54
+ requiredParams = docRequiredNames.filter((name) => undefinedVars.includes(name));
55
+ allowedParams = docDef.liquidDoc.parameters.map((p) => p.name);
56
+ }
57
+ else {
58
+ // No @doc — infer required vs optional from undefined variables in the source.
59
+ // Variables used with `| default` are treated as optional.
60
+ const globalObjectNames = [];
61
+ if (context.platformosDocset) {
62
+ const objects = await context.platformosDocset.objects();
63
+ for (const obj of objects) {
64
+ if (!obj.access || obj.access.global === true || obj.access.template.length > 0) {
65
+ globalObjectNames.push(obj.name);
66
+ }
67
+ }
68
+ }
69
+ if (relativePath.includes('views/partials/') || relativePath.includes('/lib/')) {
70
+ if (!globalObjectNames.includes('app')) {
71
+ globalObjectNames.push('app');
72
+ }
73
+ }
74
+ const { required: requiredVars, optional: optionalVars } = (0, extract_undefined_variables_1.extractUndefinedVariables)(source, globalObjectNames);
75
+ if (requiredVars.length === 0 && optionalVars.length === 0)
76
+ return;
77
+ requiredParams = requiredVars;
78
+ allowedParams = [...requiredVars, ...optionalVars];
79
+ }
80
+ args
81
+ .filter((arg) => !allowedParams.includes(arg.name))
82
+ .forEach((arg) => {
83
+ context.report({
84
+ message: `Unknown parameter ${arg.name} passed to ${nodeType} call`,
85
+ startIndex: arg.position.start,
86
+ endIndex: arg.position.end,
87
+ });
88
+ });
89
+ requiredParams
90
+ .filter((param) => !args.find((arg) => arg.name === param))
91
+ .forEach((param) => {
92
+ context.report({
93
+ message: `Required parameter ${param} must be passed to ${nodeType} call`,
94
+ startIndex: position.start,
95
+ endIndex: position.end,
96
+ });
97
+ });
98
+ };
99
+ return {
100
+ async RenderMarkup(node) {
101
+ const targetFile = 'value' in node.partial ? node.partial.value : node.partial.name;
102
+ if (!targetFile) {
103
+ return;
104
+ }
105
+ await validate('render', targetFile, node.args, node.position);
106
+ },
107
+ async FunctionMarkup(node) {
108
+ const targetFile = 'value' in node.partial ? node.partial.value : node.partial.name;
109
+ if (!targetFile) {
110
+ return;
111
+ }
112
+ await validate('function', targetFile, node.args, node.position);
113
+ },
114
+ };
115
+ },
116
+ };
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/partial-call-arguments/index.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,12 @@ exports.UnusedAssign = {
25
25
  // effects on the original, so they count as "using" the variable.
26
26
  const referenceAssignedVariables = new Set();
27
27
  const usedVariables = new Set();
28
+ // Concatenated markup of LiquidTags whose parsing fell back to a raw string
29
+ // (e.g. a typo like `{% assign name = x | default: [...] } %}`). The AST has
30
+ // no VariableLookup nodes to traverse inside them, so onCodePathEnd scans
31
+ // this text for assigned-variable names — avoids compounding the user's
32
+ // syntax error with false "unused" warnings.
33
+ let fallbackText = '';
28
34
  function checkVariableUsage(node) {
29
35
  if (node.type === liquid_html_parser_1.NodeTypes.VariableLookup) {
30
36
  usedVariables.add(node.name);
@@ -58,6 +64,9 @@ exports.UnusedAssign = {
58
64
  else if (isLiquidTagCapture(node) && node.markup.name) {
59
65
  assignedVariables.set(node.markup.name, node);
60
66
  }
67
+ else if (typeof node.markup === 'string' && node.markup) {
68
+ fallbackText += '\n' + node.markup;
69
+ }
61
70
  },
62
71
  async VariableLookup(node, ancestors) {
63
72
  if ((0, utils_1.isWithinRawTagThatDoesNotParseItsContents)(ancestors))
@@ -69,6 +78,14 @@ exports.UnusedAssign = {
69
78
  checkVariableUsage(node);
70
79
  },
71
80
  async onCodePathEnd() {
81
+ if (fallbackText) {
82
+ for (const name of assignedVariables.keys()) {
83
+ if (usedVariables.has(name))
84
+ continue;
85
+ if (new RegExp(`\\b${name}\\b`).test(fallbackText))
86
+ usedVariables.add(name);
87
+ }
88
+ }
72
89
  for (const [variable, node] of assignedVariables.entries()) {
73
90
  if (!usedVariables.has(variable) && !variable.startsWith('_')) {
74
91
  context.report({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/unused-assign/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/unused-assign/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { LiquidCheckDefinition } from '../../types';
2
+ export declare const ValidFrontmatter: LiquidCheckDefinition;