@platformos/platformos-check-common 0.0.11 → 0.0.13

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 (140) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/CLAUDE.md +150 -0
  3. package/dist/AugmentedPlatformOSDocset.js +1 -0
  4. package/dist/AugmentedPlatformOSDocset.js.map +1 -1
  5. package/dist/checks/circular-render/index.d.ts +2 -0
  6. package/dist/checks/circular-render/index.js +164 -0
  7. package/dist/checks/circular-render/index.js.map +1 -0
  8. package/dist/checks/deprecated-filter/index.js +15 -0
  9. package/dist/checks/deprecated-filter/index.js.map +1 -1
  10. package/dist/checks/duplicate-content-for-arguments/index.js +1 -1
  11. package/dist/checks/duplicate-content-for-arguments/index.js.map +1 -1
  12. package/dist/checks/graphql/index.d.ts +1 -0
  13. package/dist/checks/graphql/index.js +20 -7
  14. package/dist/checks/graphql/index.js.map +1 -1
  15. package/dist/checks/index.d.ts +1 -1
  16. package/dist/checks/index.js +6 -0
  17. package/dist/checks/index.js.map +1 -1
  18. package/dist/checks/invalid-hash-assign-target/index.js +4 -3
  19. package/dist/checks/invalid-hash-assign-target/index.js.map +1 -1
  20. package/dist/checks/missing-content-for-arguments/index.js +1 -1
  21. package/dist/checks/missing-content-for-arguments/index.js.map +1 -1
  22. package/dist/checks/missing-page/index.d.ts +2 -0
  23. package/dist/checks/missing-page/index.js +73 -0
  24. package/dist/checks/missing-page/index.js.map +1 -0
  25. package/dist/checks/missing-partial/index.js +31 -31
  26. package/dist/checks/missing-partial/index.js.map +1 -1
  27. package/dist/checks/missing-render-partial-arguments/index.d.ts +2 -0
  28. package/dist/checks/missing-render-partial-arguments/index.js +37 -0
  29. package/dist/checks/missing-render-partial-arguments/index.js.map +1 -0
  30. package/dist/checks/nested-graphql-query/index.d.ts +2 -0
  31. package/dist/checks/nested-graphql-query/index.js +146 -0
  32. package/dist/checks/nested-graphql-query/index.js.map +1 -0
  33. package/dist/checks/pagination-size/index.js +1 -1
  34. package/dist/checks/pagination-size/index.js.map +1 -1
  35. package/dist/checks/translation-key-exists/index.js +16 -19
  36. package/dist/checks/translation-key-exists/index.js.map +1 -1
  37. package/dist/checks/translation-utils.d.ts +20 -0
  38. package/dist/checks/translation-utils.js +51 -0
  39. package/dist/checks/translation-utils.js.map +1 -0
  40. package/dist/checks/undefined-object/index.js +35 -13
  41. package/dist/checks/undefined-object/index.js.map +1 -1
  42. package/dist/checks/unknown-property/index.js +75 -10
  43. package/dist/checks/unknown-property/index.js.map +1 -1
  44. package/dist/checks/unknown-property/property-shape.js +14 -1
  45. package/dist/checks/unknown-property/property-shape.js.map +1 -1
  46. package/dist/checks/unrecognized-content-for-arguments/index.js +1 -1
  47. package/dist/checks/unrecognized-content-for-arguments/index.js.map +1 -1
  48. package/dist/checks/unused-assign/index.js +23 -1
  49. package/dist/checks/unused-assign/index.js.map +1 -1
  50. package/dist/checks/unused-translation-key/index.d.ts +4 -0
  51. package/dist/checks/unused-translation-key/index.js +85 -0
  52. package/dist/checks/unused-translation-key/index.js.map +1 -0
  53. package/dist/checks/valid-content-for-argument-types/index.js +1 -1
  54. package/dist/checks/valid-content-for-argument-types/index.js.map +1 -1
  55. package/dist/checks/valid-render-partial-argument-types/index.js +2 -1
  56. package/dist/checks/valid-render-partial-argument-types/index.js.map +1 -1
  57. package/dist/checks/variable-name/index.js +4 -0
  58. package/dist/checks/variable-name/index.js.map +1 -1
  59. package/dist/context-utils.d.ts +2 -1
  60. package/dist/context-utils.js +31 -1
  61. package/dist/context-utils.js.map +1 -1
  62. package/dist/doc-generator/DocBlockGenerator.d.ts +16 -0
  63. package/dist/doc-generator/DocBlockGenerator.js +464 -0
  64. package/dist/doc-generator/DocBlockGenerator.js.map +1 -0
  65. package/dist/doc-generator/index.d.ts +1 -0
  66. package/dist/doc-generator/index.js +6 -0
  67. package/dist/doc-generator/index.js.map +1 -0
  68. package/dist/frontmatter/index.d.ts +59 -0
  69. package/dist/frontmatter/index.js +301 -0
  70. package/dist/frontmatter/index.js.map +1 -0
  71. package/dist/index.d.ts +3 -1
  72. package/dist/index.js +6 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/liquid-doc/arguments.js +9 -0
  75. package/dist/liquid-doc/arguments.js.map +1 -1
  76. package/dist/liquid-doc/utils.d.ts +10 -2
  77. package/dist/liquid-doc/utils.js +26 -1
  78. package/dist/liquid-doc/utils.js.map +1 -1
  79. package/dist/path.d.ts +1 -1
  80. package/dist/path.js +3 -1
  81. package/dist/path.js.map +1 -1
  82. package/dist/to-schema.d.ts +1 -1
  83. package/dist/tsconfig.tsbuildinfo +1 -1
  84. package/dist/types.d.ts +8 -1
  85. package/dist/types.js.map +1 -1
  86. package/dist/url-helpers.d.ts +55 -0
  87. package/dist/url-helpers.js +334 -0
  88. package/dist/url-helpers.js.map +1 -0
  89. package/dist/utils/block.js.map +1 -1
  90. package/dist/utils/index.d.ts +1 -0
  91. package/dist/utils/index.js +1 -0
  92. package/dist/utils/index.js.map +1 -1
  93. package/dist/utils/levenshtein.d.ts +3 -0
  94. package/dist/utils/levenshtein.js +39 -0
  95. package/dist/utils/levenshtein.js.map +1 -0
  96. package/package.json +2 -2
  97. package/src/AugmentedPlatformOSDocset.ts +1 -0
  98. package/src/checks/deprecated-filter/index.spec.ts +41 -1
  99. package/src/checks/deprecated-filter/index.ts +17 -0
  100. package/src/checks/graphql/index.spec.ts +173 -0
  101. package/src/checks/graphql/index.ts +21 -10
  102. package/src/checks/index.ts +6 -0
  103. package/src/checks/invalid-hash-assign-target/index.spec.ts +26 -0
  104. package/src/checks/invalid-hash-assign-target/index.ts +6 -4
  105. package/src/checks/missing-page/index.spec.ts +755 -0
  106. package/src/checks/missing-page/index.ts +89 -0
  107. package/src/checks/missing-partial/index.spec.ts +361 -0
  108. package/src/checks/missing-partial/index.ts +39 -47
  109. package/src/checks/missing-render-partial-arguments/index.spec.ts +74 -0
  110. package/src/checks/missing-render-partial-arguments/index.ts +44 -0
  111. package/src/checks/nested-graphql-query/index.spec.ts +175 -0
  112. package/src/checks/nested-graphql-query/index.ts +203 -0
  113. package/src/checks/parser-blocking-script/index.spec.ts +7 -3
  114. package/src/checks/translation-key-exists/index.spec.ts +79 -2
  115. package/src/checks/translation-key-exists/index.ts +18 -27
  116. package/src/checks/translation-utils.ts +63 -0
  117. package/src/checks/undefined-object/index.spec.ts +153 -19
  118. package/src/checks/undefined-object/index.ts +43 -19
  119. package/src/checks/unknown-property/index.spec.ts +133 -0
  120. package/src/checks/unknown-property/index.ts +84 -10
  121. package/src/checks/unknown-property/property-shape.ts +15 -1
  122. package/src/checks/unused-assign/index.spec.ts +75 -1
  123. package/src/checks/unused-assign/index.ts +26 -1
  124. package/src/checks/unused-doc-param/index.spec.ts +4 -2
  125. package/src/checks/valid-doc-param-types/index.spec.ts +1 -1
  126. package/src/checks/valid-render-partial-argument-types/index.spec.ts +24 -1
  127. package/src/checks/valid-render-partial-argument-types/index.ts +3 -2
  128. package/src/checks/variable-name/index.spec.ts +10 -1
  129. package/src/checks/variable-name/index.ts +5 -0
  130. package/src/context-utils.ts +33 -1
  131. package/src/frontmatter/index.ts +344 -0
  132. package/src/index.ts +6 -0
  133. package/src/liquid-doc/arguments.ts +9 -0
  134. package/src/liquid-doc/utils.ts +26 -2
  135. package/src/path.ts +2 -0
  136. package/src/types.ts +9 -1
  137. package/src/url-helpers.spec.ts +241 -0
  138. package/src/url-helpers.ts +363 -0
  139. package/src/utils/index.ts +1 -0
  140. package/src/utils/levenshtein.ts +41 -0
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LiquidHtmlNode, NodeTypes as LiquidHtmlNodeTypes } from '@platformos/liquid-html-parser';
2
2
  import { Schema, Settings } from './types/schema-prop-factory';
3
- import { AbstractFileSystem, UriString } from '@platformos/platformos-common';
3
+ import { AbstractFileSystem, RouteTable, UriString } from '@platformos/platformos-common';
4
4
  import { JSONCorrector, StringCorrector } from './fixes';
5
5
  import { ArrayNode, ASTNode, JSONNode, JSONNodeTypes, LiteralNode, ObjectNode, PropertyNode, ValueNode } from './jsonc/types';
6
6
  import { JsonValidationSet, PlatformOSDocset } from './types/platformos-liquid-docs';
@@ -262,6 +262,11 @@ export interface Dependencies {
262
262
  * Returns an empty array if no files reference this file
263
263
  */
264
264
  getReferences?: (uri: string) => Promise<Reference[]>;
265
+ /**
266
+ * Optional pre-built RouteTable. When provided (e.g. by the LSP),
267
+ * the check pipeline reuses it instead of building a new one per run.
268
+ */
269
+ routeTable?: RouteTable;
265
270
  }
266
271
  export type ValidateJSON = (uri: string, jsonString: string) => Promise<{
267
272
  message: string;
@@ -282,6 +287,8 @@ export interface AugmentedDependencies extends Dependencies {
282
287
  * Covers both `{base}/{locale}.yml` and `{base}/{locale}/*.yml`.
283
288
  */
284
289
  getTranslationsForBase(translationBaseUri: string, locale: string): Promise<Translations>;
290
+ /** Lazily builds and returns a shared RouteTable for the current check run. */
291
+ getRouteTable(): Promise<RouteTable>;
285
292
  }
286
293
  type StaticContextProperties<T extends SourceCodeType> = T extends SourceCodeType ? {
287
294
  report(problem: Problem<T>): void;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uEAAkG;AAwEzE,oGAxEa,8BAAmB,OAwEb;AAnD5C,gDAA8B;AAC9B,8DAA4C;AAC5C,iEAA+C;AAExC,MAAM,YAAY,GAAG,CAAC,IAAc,EAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC;AAA/E,QAAA,YAAY,gBAAmE;AACrF,MAAM,WAAW,GAAG,CAAC,IAAc,EAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAA5E,QAAA,WAAW,eAAiE;AAClF,MAAM,cAAc,GAAG,CAAC,IAAc,EAAwB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,CAAC;AAArF,QAAA,cAAc,kBAAuE;AAC3F,MAAM,WAAW,GAAG,CAAC,IAAc,EAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAA5E,QAAA,WAAW,eAAiE;AAClF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;AAAlF,QAAA,aAAa,iBAAqE;AAkB/F,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,2CAAyB,CAAA;IACzB,qCAAmB,CAAA;IACnB,+BAAa,CAAA;AACf,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AA0eD,gEAAgE;AAChE,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,6CAAW,CAAA;IACX,uCAAQ,CAAA;AACV,CAAC,EAJW,QAAQ,wBAAR,QAAQ,QAInB;AAED,+CAA+C;AAC/C,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,2CAA2B,CAAA;AAC7B,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uEAAkG;AAwEzE,oGAxEa,8BAAmB,OAwEb;AAnD5C,gDAA8B;AAC9B,8DAA4C;AAC5C,iEAA+C;AAExC,MAAM,YAAY,GAAG,CAAC,IAAc,EAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC;AAA/E,QAAA,YAAY,gBAAmE;AACrF,MAAM,WAAW,GAAG,CAAC,IAAc,EAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAA5E,QAAA,WAAW,eAAiE;AAClF,MAAM,cAAc,GAAG,CAAC,IAAc,EAAwB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,CAAC;AAArF,QAAA,cAAc,kBAAuE;AAC3F,MAAM,WAAW,GAAG,CAAC,IAAc,EAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAA5E,QAAA,WAAW,eAAiE;AAClF,MAAM,aAAa,GAAG,CAAC,IAAc,EAAuB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC;AAAlF,QAAA,aAAa,iBAAqE;AAkB/F,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,2CAAyB,CAAA;IACzB,qCAAmB,CAAA;IACnB,+BAAa,CAAA;AACf,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAkfD,gEAAgE;AAChE,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,6CAAW,CAAA;IACX,uCAAQ,CAAA;AACV,CAAC,EAJW,QAAQ,wBAAR,QAAQ,QAInB;AAED,+CAA+C;AAC/C,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,2CAA2B,CAAA;AAC7B,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB"}
@@ -0,0 +1,55 @@
1
+ import { LiquidHtmlNode, HtmlElement, AssignMarkup, AttrDoubleQuoted, AttrSingleQuoted, AttrUnquoted } from '@platformos/liquid-html-parser';
2
+ export declare function shouldSkipUrl(url: string): boolean;
3
+ export type ValuedAttrNode = AttrDoubleQuoted | AttrSingleQuoted | AttrUnquoted;
4
+ export declare function isValuedAttrNode(node: LiquidHtmlNode): node is ValuedAttrNode;
5
+ export declare function getAttrName(attr: ValuedAttrNode): string | null;
6
+ export declare function getStaticAttrValue(attr: ValuedAttrNode): string | null;
7
+ /**
8
+ * Resolve an assign markup's RHS to a URL pattern string.
9
+ * Handles string literals with `append` and `prepend` filters.
10
+ * Variable arguments to append/prepend become `:_liquid_` placeholders.
11
+ * Returns null if the value can't be statically resolved to a URL pattern.
12
+ */
13
+ export declare function resolveAssignToUrlPattern(markup: AssignMarkup): string | null;
14
+ /**
15
+ * Extract a URL pattern from an attribute value.
16
+ * Returns null if the URL cannot be analyzed (contains Liquid tags or is fully dynamic).
17
+ *
18
+ * Static text becomes literal path segments.
19
+ * Each {{ expression }} becomes `:_liquid_` (matches one path segment).
20
+ * {{ context.location.host }} is recognized and stripped from absolute self-referencing URLs.
21
+ *
22
+ * When a `variableMap` is provided, a single `{{ varName }}` in the attribute
23
+ * will be resolved through the map (from tracked {% assign %} statements).
24
+ */
25
+ export declare function extractUrlPattern(attr: ValuedAttrNode, variableMap?: Map<string, string>): string | null;
26
+ /**
27
+ * Determine the effective HTTP method for a <form> element,
28
+ * accounting for _method hidden input overrides.
29
+ * Returns null if the method can't be statically determined.
30
+ */
31
+ export declare function getEffectiveMethod(formNode: HtmlElement): string | null;
32
+ /**
33
+ * If the given node is a `{% assign %}` tag whose RHS resolves to a URL pattern,
34
+ * returns `{ name, urlPattern }`. Otherwise returns null.
35
+ *
36
+ * Shared by `buildVariableMap` (full AST walk) and `MissingPage` (incremental
37
+ * visitor), so the assign-to-URL resolution logic lives in one place.
38
+ */
39
+ export declare function tryExtractAssignUrl(node: LiquidHtmlNode): {
40
+ name: string;
41
+ urlPattern: string;
42
+ } | null;
43
+ /**
44
+ * Walk an AST subtree and collect {% assign %} variable mappings that resolve to URL patterns.
45
+ * Not scope-aware: assigns inside {% if %} / {% for %} blocks are tracked even though they
46
+ * may not be in scope when the href is evaluated. This is an acceptable trade-off — the
47
+ * alternative (full scope analysis) would add significant complexity for marginal accuracy gains.
48
+ *
49
+ * Uses document-order traversal so that reassignments correctly overwrite earlier values.
50
+ *
51
+ * @param beforeOffset When provided, only assigns whose position.end is before this
52
+ * offset are included. Used by the LSP definition provider so that each cursor
53
+ * position sees only the assigns that precede it.
54
+ */
55
+ export declare function buildVariableMap(children: LiquidHtmlNode[], beforeOffset?: number): Map<string, string>;
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldSkipUrl = shouldSkipUrl;
4
+ exports.isValuedAttrNode = isValuedAttrNode;
5
+ exports.getAttrName = getAttrName;
6
+ exports.getStaticAttrValue = getStaticAttrValue;
7
+ exports.resolveAssignToUrlPattern = resolveAssignToUrlPattern;
8
+ exports.extractUrlPattern = extractUrlPattern;
9
+ exports.getEffectiveMethod = getEffectiveMethod;
10
+ exports.tryExtractAssignUrl = tryExtractAssignUrl;
11
+ exports.buildVariableMap = buildVariableMap;
12
+ const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
13
+ /**
14
+ * Shared URL extraction and HTTP method detection helpers
15
+ * for route-aware checks and LSP features.
16
+ *
17
+ * These helpers depend on liquid-html-parser AST types and live in
18
+ * platformos-check-common (not platformos-common) to keep the lower-level
19
+ * package free of parser dependencies. The pure RouteTable/slug logic
20
+ * remains in platformos-common.
21
+ */
22
+ /** Extract the `children` array from a node if it has one (block tags, elements). */
23
+ function getTraversableChildren(node) {
24
+ if ('children' in node) {
25
+ const children = node.children;
26
+ if (Array.isArray(children))
27
+ return children;
28
+ }
29
+ return null;
30
+ }
31
+ /** Extract the `markup` array from a node if it is an array ({% liquid %} tags). */
32
+ function getTraversableMarkup(node) {
33
+ if ('markup' in node) {
34
+ const markup = node.markup;
35
+ if (Array.isArray(markup))
36
+ return markup;
37
+ }
38
+ return null;
39
+ }
40
+ const SKIP_PREFIXES = ['http://', 'https://', '//', 'mailto:', 'tel:', 'javascript:', 'data:', '#'];
41
+ function shouldSkipUrl(url) {
42
+ if (url === '' || url === '#')
43
+ return true;
44
+ const lower = url.toLowerCase();
45
+ return SKIP_PREFIXES.some((prefix) => lower.startsWith(prefix));
46
+ }
47
+ function isValuedAttrNode(node) {
48
+ return (node.type === liquid_html_parser_1.NodeTypes.AttrDoubleQuoted ||
49
+ node.type === liquid_html_parser_1.NodeTypes.AttrSingleQuoted ||
50
+ node.type === liquid_html_parser_1.NodeTypes.AttrUnquoted);
51
+ }
52
+ function getAttrName(attr) {
53
+ if (attr.name.length !== 1)
54
+ return null;
55
+ if (attr.name[0].type !== liquid_html_parser_1.NodeTypes.TextNode)
56
+ return null;
57
+ return attr.name[0].value.toLowerCase();
58
+ }
59
+ function getStaticAttrValue(attr) {
60
+ if (attr.value.length !== 1)
61
+ return null;
62
+ if (attr.value[0].type !== liquid_html_parser_1.NodeTypes.TextNode)
63
+ return null;
64
+ return attr.value[0].value;
65
+ }
66
+ /**
67
+ * Check if a LiquidVariableOutput node contains exactly `context.location.host`.
68
+ */
69
+ function isContextLocationHost(node) {
70
+ if (node.type !== liquid_html_parser_1.NodeTypes.LiquidVariableOutput)
71
+ return false;
72
+ const { markup } = node;
73
+ const raw = typeof markup === 'string' ? markup : markup.rawSource;
74
+ return raw.trim() === 'context.location.host';
75
+ }
76
+ /**
77
+ * Get the simple variable name from a LiquidVariableOutput node.
78
+ * Returns the name if it's a plain variable lookup (e.g. `{{ url }}`) with no
79
+ * filters or nested lookups. Returns null otherwise.
80
+ */
81
+ function getSimpleVariableName(node) {
82
+ if (node.type !== liquid_html_parser_1.NodeTypes.LiquidVariableOutput)
83
+ return null;
84
+ const { markup } = node;
85
+ if (typeof markup === 'string')
86
+ return null;
87
+ const variable = markup;
88
+ if (variable.filters.length > 0)
89
+ return null;
90
+ if (variable.expression.type !== liquid_html_parser_1.NodeTypes.VariableLookup)
91
+ return null;
92
+ const lookup = variable.expression;
93
+ if (lookup.name === null || lookup.lookups.length > 0)
94
+ return null;
95
+ return lookup.name;
96
+ }
97
+ /**
98
+ * Evaluate a filter argument to either a static string or `:_liquid_` placeholder.
99
+ */
100
+ function evaluateFilterArg(filter) {
101
+ if (filter.args.length !== 1)
102
+ return null;
103
+ const arg = filter.args[0];
104
+ if (arg.type === liquid_html_parser_1.NodeTypes.String)
105
+ return arg.value;
106
+ if (arg.type === liquid_html_parser_1.NodeTypes.VariableLookup)
107
+ return ':_liquid_';
108
+ return null;
109
+ }
110
+ /**
111
+ * Resolve an assign markup's RHS to a URL pattern string.
112
+ * Handles string literals with `append` and `prepend` filters.
113
+ * Variable arguments to append/prepend become `:_liquid_` placeholders.
114
+ * Returns null if the value can't be statically resolved to a URL pattern.
115
+ */
116
+ function resolveAssignToUrlPattern(markup) {
117
+ if (markup.operator !== '=')
118
+ return null;
119
+ const value = markup.value;
120
+ if (value.type !== liquid_html_parser_1.NodeTypes.LiquidVariable)
121
+ return null;
122
+ const variable = value;
123
+ let result;
124
+ // Base expression must be a string literal or a variable lookup
125
+ if (variable.expression.type === liquid_html_parser_1.NodeTypes.String) {
126
+ result = variable.expression.value;
127
+ }
128
+ else if (variable.expression.type === liquid_html_parser_1.NodeTypes.VariableLookup) {
129
+ result = ':_liquid_';
130
+ }
131
+ else {
132
+ return null;
133
+ }
134
+ // Apply append/prepend filters in order
135
+ for (const filter of variable.filters) {
136
+ const arg = evaluateFilterArg(filter);
137
+ if (arg === null)
138
+ return null;
139
+ if (filter.name === 'append') {
140
+ result = result + arg;
141
+ }
142
+ else if (filter.name === 'prepend') {
143
+ result = arg + result;
144
+ }
145
+ else {
146
+ // Unknown filter — can't determine the result
147
+ return null;
148
+ }
149
+ }
150
+ return normalizeUrlPattern(result);
151
+ }
152
+ /**
153
+ * Normalize a raw URL string into a matchable URL pattern.
154
+ * Strips query/fragment, validates segments, returns null if not analyzable.
155
+ */
156
+ function normalizeUrlPattern(raw) {
157
+ let url = raw;
158
+ // Handle self-referencing absolute URLs
159
+ url = url.replace(/^https?:\/\/:_context_host_\//, '/');
160
+ url = url.replace(/^\/\/:_context_host_\//, '/');
161
+ // Must start with / to be a relative URL we can check
162
+ if (!url.startsWith('/'))
163
+ return null;
164
+ // Strip query string and fragment
165
+ const queryIdx = url.indexOf('?');
166
+ if (queryIdx !== -1)
167
+ url = url.slice(0, queryIdx);
168
+ const hashIdx = url.indexOf('#');
169
+ if (hashIdx !== -1)
170
+ url = url.slice(0, hashIdx);
171
+ // If any segment has :_liquid_ mixed with other text, skip
172
+ const segments = url.split('/').filter((s) => s.length > 0);
173
+ if (segments.some((s) => s.includes(':_liquid_') && s !== ':_liquid_'))
174
+ return null;
175
+ return url;
176
+ }
177
+ /**
178
+ * Extract a URL pattern from an attribute value.
179
+ * Returns null if the URL cannot be analyzed (contains Liquid tags or is fully dynamic).
180
+ *
181
+ * Static text becomes literal path segments.
182
+ * Each {{ expression }} becomes `:_liquid_` (matches one path segment).
183
+ * {{ context.location.host }} is recognized and stripped from absolute self-referencing URLs.
184
+ *
185
+ * When a `variableMap` is provided, a single `{{ varName }}` in the attribute
186
+ * will be resolved through the map (from tracked {% assign %} statements).
187
+ */
188
+ function extractUrlPattern(attr, variableMap) {
189
+ // Check if the entire attribute is a single variable that we can resolve
190
+ if (variableMap && attr.value.length === 1) {
191
+ const varName = getSimpleVariableName(attr.value[0]);
192
+ if (varName !== null && variableMap.has(varName)) {
193
+ return variableMap.get(varName);
194
+ }
195
+ }
196
+ const parts = [];
197
+ let hasStatic = false;
198
+ for (const node of attr.value) {
199
+ if (node.type === liquid_html_parser_1.NodeTypes.TextNode) {
200
+ parts.push(node.value);
201
+ hasStatic = true;
202
+ }
203
+ else if (node.type === liquid_html_parser_1.NodeTypes.LiquidVariableOutput) {
204
+ parts.push(isContextLocationHost(node) ? ':_context_host_' : ':_liquid_');
205
+ }
206
+ else {
207
+ // Liquid tags — unpredictable structure
208
+ return null;
209
+ }
210
+ }
211
+ // Fully dynamic (no static text at all)
212
+ if (!hasStatic)
213
+ return null;
214
+ return normalizeUrlPattern(parts.join(''));
215
+ }
216
+ function isHtmlVoidElement(node) {
217
+ return node.type === liquid_html_parser_1.NodeTypes.HtmlVoidElement;
218
+ }
219
+ /**
220
+ * Recursively scan a form subtree for <input type="hidden" name="_method" value="...">
221
+ * Returns the _method value if found, or null.
222
+ */
223
+ function findMethodOverride(formNode) {
224
+ const stack = [...formNode.children];
225
+ while (stack.length > 0) {
226
+ const child = stack.pop();
227
+ if (isHtmlVoidElement(child) && child.name === 'input') {
228
+ const attrs = child.attributes.filter(isValuedAttrNode);
229
+ const typeAttr = attrs.find((a) => getAttrName(a) === 'type');
230
+ const nameAttr = attrs.find((a) => getAttrName(a) === 'name');
231
+ const valueAttr = attrs.find((a) => getAttrName(a) === 'value');
232
+ if (!typeAttr || !nameAttr || !valueAttr)
233
+ continue;
234
+ const typeVal = getStaticAttrValue(typeAttr);
235
+ const nameVal = getStaticAttrValue(nameAttr);
236
+ if (typeVal?.toLowerCase() !== 'hidden' || nameVal !== '_method')
237
+ continue;
238
+ const methodVal = getStaticAttrValue(valueAttr);
239
+ if (methodVal)
240
+ return methodVal.toLowerCase();
241
+ // Liquid value for _method — can't determine method
242
+ return null;
243
+ }
244
+ // Recurse into elements that have children
245
+ if (child.type === liquid_html_parser_1.NodeTypes.HtmlElement) {
246
+ const el = child;
247
+ for (const grandchild of el.children) {
248
+ stack.push(grandchild);
249
+ }
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /**
255
+ * Determine the effective HTTP method for a <form> element,
256
+ * accounting for _method hidden input overrides.
257
+ * Returns null if the method can't be statically determined.
258
+ */
259
+ function getEffectiveMethod(formNode) {
260
+ const methodAttr = formNode.attributes.find((a) => isValuedAttrNode(a) && getAttrName(a) === 'method');
261
+ let formMethod = 'get';
262
+ if (methodAttr) {
263
+ const val = getStaticAttrValue(methodAttr);
264
+ if (val === null)
265
+ return null; // Liquid in method attr — skip
266
+ formMethod = val.toLowerCase();
267
+ }
268
+ if (formMethod === 'post') {
269
+ const override = findMethodOverride(formNode);
270
+ if (override !== null)
271
+ return override;
272
+ return formMethod;
273
+ }
274
+ return formMethod;
275
+ }
276
+ /**
277
+ * If the given node is a `{% assign %}` tag whose RHS resolves to a URL pattern,
278
+ * returns `{ name, urlPattern }`. Otherwise returns null.
279
+ *
280
+ * Shared by `buildVariableMap` (full AST walk) and `MissingPage` (incremental
281
+ * visitor), so the assign-to-URL resolution logic lives in one place.
282
+ */
283
+ function tryExtractAssignUrl(node) {
284
+ if (node.type !== liquid_html_parser_1.NodeTypes.LiquidTag || node.name !== liquid_html_parser_1.NamedTags.assign) {
285
+ return null;
286
+ }
287
+ const markup = node.markup;
288
+ if (markup.lookups.length > 0)
289
+ return null;
290
+ const urlPattern = resolveAssignToUrlPattern(markup);
291
+ if (urlPattern === null)
292
+ return null;
293
+ return { name: markup.name, urlPattern };
294
+ }
295
+ /**
296
+ * Walk an AST subtree and collect {% assign %} variable mappings that resolve to URL patterns.
297
+ * Not scope-aware: assigns inside {% if %} / {% for %} blocks are tracked even though they
298
+ * may not be in scope when the href is evaluated. This is an acceptable trade-off — the
299
+ * alternative (full scope analysis) would add significant complexity for marginal accuracy gains.
300
+ *
301
+ * Uses document-order traversal so that reassignments correctly overwrite earlier values.
302
+ *
303
+ * @param beforeOffset When provided, only assigns whose position.end is before this
304
+ * offset are included. Used by the LSP definition provider so that each cursor
305
+ * position sees only the assigns that precede it.
306
+ */
307
+ function buildVariableMap(children, beforeOffset) {
308
+ const variableMap = new Map();
309
+ function walk(nodes) {
310
+ for (const node of nodes) {
311
+ // Apply the beforeOffset cutoff only to assign nodes themselves, not to block
312
+ // containers. A block tag ({% if %}, {% for %}, HTML element, etc.) may start
313
+ // before the cursor but end after it — we must still recurse into its children
314
+ // to find any assigns that precede the cursor within that block.
315
+ const extracted = tryExtractAssignUrl(node);
316
+ if (extracted) {
317
+ if (beforeOffset === undefined || node.position.end <= beforeOffset) {
318
+ variableMap.set(extracted.name, extracted.urlPattern);
319
+ }
320
+ }
321
+ // Recurse into children (block tags like {% if %}, {% for %})
322
+ const children = getTraversableChildren(node);
323
+ if (children)
324
+ walk(children);
325
+ // Recurse into markup arrays ({% liquid %} block contains assigns in markup)
326
+ const markupArray = getTraversableMarkup(node);
327
+ if (markupArray)
328
+ walk(markupArray);
329
+ }
330
+ }
331
+ walk(children);
332
+ return variableMap;
333
+ }
334
+ //# sourceMappingURL=url-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-helpers.js","sourceRoot":"","sources":["../src/url-helpers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/utils/block.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/utils/block.ts"],"names":[],"mappings":"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"}
@@ -5,3 +5,4 @@ export * from './error';
5
5
  export * from './types';
6
6
  export * from './memo';
7
7
  export * from './indexBy';
8
+ export * from './levenshtein';
@@ -21,4 +21,5 @@ __exportStar(require("./error"), exports);
21
21
  __exportStar(require("./types"), exports);
22
22
  __exportStar(require("./memo"), exports);
23
23
  __exportStar(require("./indexBy"), exports);
24
+ __exportStar(require("./levenshtein"), exports);
24
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,6CAA2B;AAC3B,0CAAwB;AACxB,0CAAwB;AACxB,yCAAuB;AACvB,4CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,6CAA2B;AAC3B,0CAAwB;AACxB,0CAAwB;AACxB,yCAAuB;AACvB,4CAA0B;AAC1B,gDAA8B"}
@@ -0,0 +1,3 @@
1
+ export declare function levenshtein(a: string, b: string): number;
2
+ export declare function flattenTranslationKeys(obj: Record<string, any>, prefix?: string): string[];
3
+ export declare function findNearestKeys(missingKey: string, allKeys: string[], maxDistance?: number, maxResults?: number): string[];
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.levenshtein = levenshtein;
4
+ exports.flattenTranslationKeys = flattenTranslationKeys;
5
+ exports.findNearestKeys = findNearestKeys;
6
+ function levenshtein(a, b) {
7
+ const dp = Array.from({ length: a.length + 1 }, (_, i) => Array.from({ length: b.length + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
8
+ for (let i = 1; i <= a.length; i++) {
9
+ for (let j = 1; j <= b.length; j++) {
10
+ dp[i][j] =
11
+ a[i - 1] === b[j - 1]
12
+ ? dp[i - 1][j - 1]
13
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
14
+ }
15
+ }
16
+ return dp[a.length][b.length];
17
+ }
18
+ function flattenTranslationKeys(obj, prefix = '') {
19
+ const keys = [];
20
+ for (const [k, v] of Object.entries(obj)) {
21
+ const full = prefix ? `${prefix}.${k}` : k;
22
+ if (typeof v === 'object' && v !== null) {
23
+ keys.push(...flattenTranslationKeys(v, full));
24
+ }
25
+ else {
26
+ keys.push(full);
27
+ }
28
+ }
29
+ return keys;
30
+ }
31
+ function findNearestKeys(missingKey, allKeys, maxDistance = 3, maxResults = 3) {
32
+ return allKeys
33
+ .map((key) => ({ key, distance: levenshtein(missingKey, key) }))
34
+ .filter(({ distance }) => distance <= maxDistance)
35
+ .sort((a, b) => a.distance - b.distance)
36
+ .slice(0, maxResults)
37
+ .map(({ key }) => key);
38
+ }
39
+ //# sourceMappingURL=levenshtein.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levenshtein.js","sourceRoot":"","sources":["../../src/utils/levenshtein.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platformos/platformos-check-common",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,7 +26,7 @@
26
26
  "type-check": "tsc --noEmit"
27
27
  },
28
28
  "dependencies": {
29
- "@platformos/liquid-html-parser": "0.0.10",
29
+ "@platformos/liquid-html-parser": "0.0.12",
30
30
  "graphql": "^16.12.0",
31
31
  "js-yaml": "^4.1.1",
32
32
  "jsonc-parser": "^3.3.1",
@@ -35,6 +35,7 @@ const undocumentedFilters = [
35
35
  'handle_from',
36
36
  'pad_spaces',
37
37
  'paragraphize',
38
+ 'push',
38
39
  'sentence',
39
40
  'unit',
40
41
  'weight',
@@ -1,5 +1,5 @@
1
1
  import { expect, describe, it } from 'vitest';
2
- import { highlightedOffenses, runLiquidCheck } from '../../test';
2
+ import { applySuggestions, highlightedOffenses, runLiquidCheck } from '../../test';
3
3
  import { DeprecatedFilter } from './index';
4
4
 
5
5
  const mockDependencies = {
@@ -99,4 +99,44 @@ describe('Module: DeprecatedFilter', () => {
99
99
  );
100
100
  expect(offenses).toHaveLength(2);
101
101
  });
102
+
103
+ it('should provide a suggestion to replace deprecated filter with recommended alternative', async () => {
104
+ const sourceCode = `{{ value | old_filter }}`;
105
+
106
+ const offenses = await runLiquidCheck(
107
+ DeprecatedFilter,
108
+ sourceCode,
109
+ 'file.liquid',
110
+ mockDependencies,
111
+ );
112
+ expect(offenses).toHaveLength(1);
113
+ expect(offenses[0].suggest).toHaveLength(1);
114
+ expect(offenses[0].suggest![0].message).toEqual("Replace 'old_filter' with 'new_filter'");
115
+ });
116
+
117
+ it('should apply the suggestion to replace the filter name', async () => {
118
+ const sourceCode = `{{ value | old_filter }}`;
119
+
120
+ const offenses = await runLiquidCheck(
121
+ DeprecatedFilter,
122
+ sourceCode,
123
+ 'file.liquid',
124
+ mockDependencies,
125
+ );
126
+ const suggestions = applySuggestions(sourceCode, offenses[0]);
127
+ expect(suggestions).toContain('{{ value | new_filter }}');
128
+ });
129
+
130
+ it('should not provide a suggestion when no replacement exists', async () => {
131
+ const sourceCode = `{{ value | deprecated_no_replacement }}`;
132
+
133
+ const offenses = await runLiquidCheck(
134
+ DeprecatedFilter,
135
+ sourceCode,
136
+ 'file.liquid',
137
+ mockDependencies,
138
+ );
139
+ expect(offenses).toHaveLength(1);
140
+ expect(offenses[0].suggest).toBeUndefined();
141
+ });
102
142
  });