@platformos/platformos-check-common 0.0.8 → 0.0.9

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 (77) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +4 -4
  3. package/dist/checks/graphql-variables/index.js +4 -0
  4. package/dist/checks/graphql-variables/index.js.map +1 -1
  5. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js +1 -1
  6. package/dist/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.js.map +1 -1
  7. package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.d.ts +19 -0
  8. package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.js +79 -0
  9. package/dist/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.js.map +1 -0
  10. package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.d.ts +3 -0
  11. package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.js +32 -0
  12. package/dist/checks/liquid-html-syntax-error/checks/UnknownTag.js.map +1 -0
  13. package/dist/checks/liquid-html-syntax-error/index.js +21 -3
  14. package/dist/checks/liquid-html-syntax-error/index.js.map +1 -1
  15. package/dist/checks/matching-translations/index.js +103 -68
  16. package/dist/checks/matching-translations/index.js.map +1 -1
  17. package/dist/checks/undefined-object/index.js +6 -1
  18. package/dist/checks/undefined-object/index.js.map +1 -1
  19. package/dist/context-utils.d.ts +16 -0
  20. package/dist/context-utils.js +30 -1
  21. package/dist/context-utils.js.map +1 -1
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +17 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/liquid-doc/arguments.js +8 -1
  26. package/dist/liquid-doc/arguments.js.map +1 -1
  27. package/dist/liquid-doc/utils.d.ts +2 -2
  28. package/dist/liquid-doc/utils.js +10 -0
  29. package/dist/liquid-doc/utils.js.map +1 -1
  30. package/dist/path.d.ts +1 -1
  31. package/dist/path.js +12 -1
  32. package/dist/path.js.map +1 -1
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/dist/types.d.ts +8 -0
  35. package/dist/types.js.map +1 -1
  36. package/package.json +2 -2
  37. package/src/checks/duplicate-render-partial-arguments/index.spec.ts +12 -12
  38. package/src/checks/graphql-variables/index.spec.ts +95 -0
  39. package/src/checks/graphql-variables/index.ts +4 -0
  40. package/src/checks/img-width-and-height/index.ts +1 -1
  41. package/src/checks/invalid-hash-assign-target/index.spec.ts +26 -26
  42. package/src/checks/json-syntax-error/index.ts +1 -1
  43. package/src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts +2 -2
  44. package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.spec.ts +259 -0
  45. package/src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.ts +89 -0
  46. package/src/checks/liquid-html-syntax-error/checks/UnknownTag.spec.ts +293 -0
  47. package/src/checks/liquid-html-syntax-error/checks/UnknownTag.ts +43 -0
  48. package/src/checks/liquid-html-syntax-error/index.ts +24 -3
  49. package/src/checks/matching-translations/index.spec.ts +114 -24
  50. package/src/checks/matching-translations/index.ts +102 -81
  51. package/src/checks/metadata-params/index.ts +1 -1
  52. package/src/checks/missing-partial/index.ts +6 -6
  53. package/src/checks/undefined-object/index.spec.ts +29 -2
  54. package/src/checks/undefined-object/index.ts +7 -1
  55. package/src/checks/unused-assign/index.ts +1 -1
  56. package/src/checks/valid-json/index.ts +1 -1
  57. package/src/checks/valid-render-partial-argument-types/index.spec.ts +13 -13
  58. package/src/context-utils.ts +42 -1
  59. package/src/disabled-checks/index.spec.ts +26 -61
  60. package/src/disabled-checks/index.ts +2 -4
  61. package/src/disabled-checks/test-checks.ts +4 -4
  62. package/src/ignore.spec.ts +4 -4
  63. package/src/index.ts +18 -0
  64. package/src/liquid-doc/arguments.ts +9 -3
  65. package/src/liquid-doc/liquidDoc.spec.ts +1 -1
  66. package/src/liquid-doc/utils.ts +13 -5
  67. package/src/path.ts +16 -1
  68. package/src/test/MockApp.ts +2 -2
  69. package/src/test/MockFileSystem.spec.ts +10 -11
  70. package/src/test/contain-offense.spec.ts +11 -3
  71. package/src/test/test-helper.ts +24 -28
  72. package/src/types.ts +8 -0
  73. package/src/visitor.spec.ts +2 -2
  74. package/src/types/schemas/index.ts +0 -3
  75. package/src/types/schemas/preset.ts +0 -52
  76. package/src/types/schemas/setting.ts +0 -320
  77. package/src/types/schemas/template.ts +0 -34
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @platformos/theme-check-common
2
2
 
3
+ ## 0.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Beta release
8
+ - Updated dependencies
9
+ - @platformos/liquid-html-parser@0.0.9
10
+
3
11
  ## 0.0.8
4
12
 
5
13
  ### Patch Changes
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  platformOS Check helps you follow best practices by analyzing your platformOS files.
11
11
 
12
- Theme Check is available [to code editors that support the Language Server Protocol](https://github.com/Platform-OS/platformos-tools/wiki).
12
+ platformOS Check is available [to code editors that support the Language Server Protocol](https://github.com/Platform-OS/platformos-tools/wiki).
13
13
 
14
14
  You may be interested by the sibling modules:
15
15
 
@@ -61,10 +61,10 @@ main();
61
61
  The browser version is a bit more complex, you need to provide your own implementation of all the dependency injections.
62
62
 
63
63
  ```ts
64
- import { simpleCheck, recommended, ThemeData, Config, Dependencies } from '@platformos/platformos-check-browser';
64
+ import { simpleCheck, recommended, Config, Dependencies } from '@platformos/platformos-check-browser';
65
65
 
66
66
  async function main() {
67
- const themeDesc = {
67
+ const appDesc = {
68
68
  'app/views/partials/product-card.liquid': '{{ product | image_url | image_tag }}',
69
69
  'app/views/partials/for-loop.liquid': '{% for variant in product.variants %}...{% endfor %}',
70
70
  };
@@ -79,7 +79,7 @@ async function main() {
79
79
  // ...
80
80
  };
81
81
 
82
- const offenses = await simpleCheck(themeDesc, config, dependencies);
82
+ const offenses = await simpleCheck(appDesc, config, dependencies);
83
83
 
84
84
  console.log(offenses);
85
85
  }
@@ -50,6 +50,10 @@ exports.GraphQLVariablesCheck = {
50
50
  create(context) {
51
51
  const locator = new platformos_common_1.DocumentsLocator(context.fs);
52
52
  const validate = async (targetFile, args, position) => {
53
+ // `args` is a special parameter that splats a hash as all GraphQL variables
54
+ // at runtime — we can't know which keys will be provided statically.
55
+ if (args.some((arg) => arg.name === 'args'))
56
+ return;
53
57
  const locatedFile = await locator.locate(vscode_uri_1.URI.parse(context.config.rootUri), 'graphql', targetFile);
54
58
  if (!locatedFile) {
55
59
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/graphql-variables/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/graphql-variables/index.ts"],"names":[],"mappings":"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"}
@@ -66,7 +66,7 @@ function detectInvalidLoopArguments(node, tags = []) {
66
66
  };
67
67
  }
68
68
  function isSupportedTagArgument(tags, tagName, key, positional) {
69
- return (tags
69
+ return ((tags ?? [])
70
70
  .find((tag) => tag.name === tagName)
71
71
  ?.parameters?.some((parameter) => parameter.name === key && parameter.positional === positional) || false);
72
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InvalidLoopArguments.js","sourceRoot":"","sources":["../../../../src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InvalidLoopArguments.js","sourceRoot":"","sources":["../../../../src/checks/liquid-html-syntax-error/checks/InvalidLoopArguments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { LiquidTag } from '@platformos/liquid-html-parser';
2
+ import { Problem, SourceCodeType, TagEntry } from '../../..';
3
+ /**
4
+ * Detects known tags whose markup couldn't be parsed by the grammar.
5
+ *
6
+ * When the tolerant parser encounters a known tag name (e.g. "render") but can't parse
7
+ * the markup with the strict grammar rule, it falls back to the base case and stores
8
+ * the markup as a raw string. This function detects that situation.
9
+ *
10
+ * This check only applies to tags that DON'T have more specific sub-checks.
11
+ * Tags like assign, echo, if, for etc. have dedicated checks that provide
12
+ * better error messages and autofixes for their specific syntax patterns.
13
+ *
14
+ * Examples:
15
+ * {% graphql %} → name: 'graphql', markup: '' (string — invalid)
16
+ * {% render %} → name: 'render', markup: '' (string — invalid)
17
+ * {% function res 'path' %} → name: 'function', markup: "res 'path'" (string — invalid)
18
+ */
19
+ export declare function detectInvalidTagSyntax(node: LiquidTag, tags?: TagEntry[]): Problem<SourceCodeType.LiquidHtml> | undefined;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectInvalidTagSyntax = detectInvalidTagSyntax;
4
+ const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
5
+ /**
6
+ * Tags that use no markup at all — they are valid as `{% else %}`, `{% break %}`, etc.
7
+ * When their markup is a string, it's always '' (empty), so they should not trigger this check.
8
+ */
9
+ const TAGS_WITH_NO_EXPECTED_MARKUP = new Set(liquid_html_parser_1.TAGS_WITHOUT_MARKUP);
10
+ /**
11
+ * Tags that have dedicated sub-checks handling their string-markup cases with
12
+ * more specific error messages and autofixes. This check should NOT fire on these
13
+ * to avoid double-reporting or overriding their nuanced decisions.
14
+ *
15
+ * - assign → MultipleAssignValues, InvalidFilterName, InvalidPipeSyntax
16
+ * - echo → InvalidEchoValue, InvalidFilterName, InvalidPipeSyntax
17
+ * - if/elsif/unless → InvalidConditionalNode, InvalidConditionalNodeParenthesis
18
+ * - for/tablerow → InvalidLoopRange, InvalidLoopArguments
19
+ */
20
+ const TAGS_WITH_DEDICATED_CHECKS = new Set([
21
+ liquid_html_parser_1.NamedTags.assign,
22
+ liquid_html_parser_1.NamedTags.echo,
23
+ liquid_html_parser_1.NamedTags.if,
24
+ liquid_html_parser_1.NamedTags.elsif,
25
+ liquid_html_parser_1.NamedTags.unless,
26
+ liquid_html_parser_1.NamedTags.for,
27
+ liquid_html_parser_1.NamedTags.tablerow,
28
+ liquid_html_parser_1.NamedTags.when,
29
+ ]);
30
+ /**
31
+ * All tag names in the NamedTags enum — these have specific grammar rules for their markup.
32
+ * If a NamedTag's markup is a string (instead of a parsed object), it means the strict grammar
33
+ * rule failed and the tag fell through to the base case.
34
+ */
35
+ const NAMED_TAGS = new Set(Object.values(liquid_html_parser_1.NamedTags));
36
+ /**
37
+ * Detects known tags whose markup couldn't be parsed by the grammar.
38
+ *
39
+ * When the tolerant parser encounters a known tag name (e.g. "render") but can't parse
40
+ * the markup with the strict grammar rule, it falls back to the base case and stores
41
+ * the markup as a raw string. This function detects that situation.
42
+ *
43
+ * This check only applies to tags that DON'T have more specific sub-checks.
44
+ * Tags like assign, echo, if, for etc. have dedicated checks that provide
45
+ * better error messages and autofixes for their specific syntax patterns.
46
+ *
47
+ * Examples:
48
+ * {% graphql %} → name: 'graphql', markup: '' (string — invalid)
49
+ * {% render %} → name: 'render', markup: '' (string — invalid)
50
+ * {% function res 'path' %} → name: 'function', markup: "res 'path'" (string — invalid)
51
+ */
52
+ function detectInvalidTagSyntax(node, tags = []) {
53
+ const tagName = node.name;
54
+ // Only check tags known to the grammar with specific markup rules
55
+ if (!NAMED_TAGS.has(tagName)) {
56
+ return;
57
+ }
58
+ // Tags without expected markup (else, break, continue, etc.) always have string markup
59
+ if (TAGS_WITH_NO_EXPECTED_MARKUP.has(tagName)) {
60
+ return;
61
+ }
62
+ // Skip tags that have dedicated sub-checks with more specific error handling
63
+ if (TAGS_WITH_DEDICATED_CHECKS.has(tagName)) {
64
+ return;
65
+ }
66
+ // If markup is not a string, it was parsed successfully — no error
67
+ if (typeof node.markup !== 'string') {
68
+ return;
69
+ }
70
+ // Build a helpful hint from the docset if available
71
+ const tagEntry = tags.find((t) => t.name === tagName);
72
+ const syntaxHint = tagEntry?.syntax ? ` Expected syntax: ${tagEntry.syntax}` : '';
73
+ return {
74
+ message: `Invalid syntax for tag '${tagName}'${syntaxHint}`,
75
+ startIndex: node.position.start,
76
+ endIndex: node.position.end,
77
+ };
78
+ }
79
+ //# sourceMappingURL=InvalidTagSyntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvalidTagSyntax.js","sourceRoot":"","sources":["../../../../src/checks/liquid-html-syntax-error/checks/InvalidTagSyntax.ts"],"names":[],"mappings":";;AAqDA,wDAmCC;AAxFD,uEAA2F;AAG3F;;;GAGG;AACH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAS,wCAAmB,CAAC,CAAC;AAE1E;;;;;;;;;GASG;AACH,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS;IACjD,8BAAS,CAAC,MAAM;IAChB,8BAAS,CAAC,IAAI;IACd,8BAAS,CAAC,EAAE;IACZ,8BAAS,CAAC,KAAK;IACf,8BAAS,CAAC,MAAM;IAChB,8BAAS,CAAC,GAAG;IACb,8BAAS,CAAC,QAAQ;IAClB,8BAAS,CAAC,IAAI;CACf,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,8BAAS,CAAC,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,sBAAsB,CACpC,IAAe,EACf,OAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAE1B,kEAAkE;IAClE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,uFAAuF;IACvF,IAAI,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,IAAI,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,oDAAoD;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAElF,OAAO;QACL,OAAO,EAAE,2BAA2B,OAAO,IAAI,UAAU,EAAE;QAC3D,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { LiquidTag } from '@platformos/liquid-html-parser';
2
+ import { Problem, SourceCodeType, TagEntry } from '../../..';
3
+ export declare function detectUnknownTag(node: LiquidTag, tags?: TagEntry[]): Problem<SourceCodeType.LiquidHtml> | undefined;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectUnknownTag = detectUnknownTag;
4
+ const liquid_html_parser_1 = require("@platformos/liquid-html-parser");
5
+ /**
6
+ * All tag names known to the grammar (NamedTags enum + TAGS_WITHOUT_MARKUP + BLOCKS + RAW_TAGS).
7
+ * These are tags that the parser recognizes with specific grammar rules.
8
+ */
9
+ const GRAMMAR_KNOWN_TAGS = new Set([
10
+ ...Object.values(liquid_html_parser_1.NamedTags),
11
+ ...liquid_html_parser_1.TAGS_WITHOUT_MARKUP,
12
+ ...liquid_html_parser_1.BLOCKS,
13
+ ...liquid_html_parser_1.RAW_TAGS,
14
+ '#', // inline comment: {% # this is a comment %}
15
+ ]);
16
+ function detectUnknownTag(node, tags = []) {
17
+ const tagName = node.name;
18
+ // If the tag is known to the grammar, it's not unknown
19
+ if (GRAMMAR_KNOWN_TAGS.has(tagName)) {
20
+ return;
21
+ }
22
+ // If the tag is known to the docset, it's not unknown
23
+ if (tags.some((tag) => tag.name === tagName)) {
24
+ return;
25
+ }
26
+ return {
27
+ message: `Unknown tag '${tagName}'`,
28
+ startIndex: node.position.start,
29
+ endIndex: node.position.end,
30
+ };
31
+ }
32
+ //# sourceMappingURL=UnknownTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnknownTag.js","sourceRoot":"","sources":["../../../../src/checks/liquid-html-syntax-error/checks/UnknownTag.ts"],"names":[],"mappings":";;AAqBA,4CAqBC;AA1CD,uEAMwC;AAGxC;;;GAGG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAS;IACzC,GAAG,MAAM,CAAC,MAAM,CAAC,8BAAS,CAAC;IAC3B,GAAG,wCAAmB;IACtB,GAAG,2BAAM;IACT,GAAG,6BAAQ;IACX,GAAG,EAAE,4CAA4C;CAClD,CAAC,CAAC;AAEH,SAAgB,gBAAgB,CAC9B,IAAe,EACf,OAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAE1B,uDAAuD;IACvD,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,sDAAsD;IACtD,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO;QACL,OAAO,EAAE,gBAAgB,OAAO,GAAG;QACnC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;KAC5B,CAAC;AACJ,CAAC"}
@@ -12,6 +12,8 @@ const InvalidLoopArguments_1 = require("./checks/InvalidLoopArguments");
12
12
  const InvalidConditionalNodeParenthesis_1 = require("./checks/InvalidConditionalNodeParenthesis");
13
13
  const InvalidFilterName_1 = require("./checks/InvalidFilterName");
14
14
  const InvalidPipeSyntax_1 = require("./checks/InvalidPipeSyntax");
15
+ const UnknownTag_1 = require("./checks/UnknownTag");
16
+ const InvalidTagSyntax_1 = require("./checks/InvalidTagSyntax");
15
17
  const utils_2 = require("../utils");
16
18
  function isParsingErrorWithLocation(error) {
17
19
  return 'name' in error && error.name === 'LiquidHTMLParsingError' && 'loc' in error;
@@ -53,11 +55,19 @@ exports.LiquidHTMLSyntaxError = {
53
55
  async LiquidTag(node, ancestors) {
54
56
  if ((0, utils_2.isWithinRawTagThatDoesNotParseItsContents)(ancestors))
55
57
  return;
58
+ const tags = (await tagsPromise) ?? [];
59
+ // Unknown tags are fatal — no point in further syntax checks.
60
+ const unknownTagProblem = (0, UnknownTag_1.detectUnknownTag)(node, tags);
61
+ if (unknownTagProblem) {
62
+ context.report(unknownTagProblem);
63
+ return;
64
+ }
65
+ // Run specific sub-checks first — they provide better error messages and autofixes.
56
66
  const problems = [
57
67
  (0, MultipleAssignValues_1.detectMultipleAssignValues)(node),
58
68
  (0, InvalidEchoValue_1.detectInvalidEchoValue)(node),
59
69
  (0, InvalidLoopRange_1.detectInvalidLoopRange)(node),
60
- (0, InvalidLoopArguments_1.detectInvalidLoopArguments)(node, await tagsPromise),
70
+ (0, InvalidLoopArguments_1.detectInvalidLoopArguments)(node, tags),
61
71
  ].filter(Boolean);
62
72
  // Fixers for `detectConditionalNodeUnsupportedParenthesis` and `detectInvalidConditionalNode` consume
63
73
  // the whole node markup, so we MUST not run both.
@@ -65,8 +75,16 @@ exports.LiquidHTMLSyntaxError = {
65
75
  if (conditionalNodeProblem) {
66
76
  problems.push(conditionalNodeProblem);
67
77
  }
78
+ // InvalidTagSyntax is a catch-all for known tags with unparseable markup.
79
+ // Only fire it if no more specific sub-check already reported on this tag.
80
+ if (problems.length === 0) {
81
+ const invalidSyntaxProblem = (0, InvalidTagSyntax_1.detectInvalidTagSyntax)(node, tags);
82
+ if (invalidSyntaxProblem) {
83
+ problems.push(invalidSyntaxProblem);
84
+ }
85
+ }
68
86
  problems.forEach(context.report);
69
- const filterProblems = await (0, InvalidFilterName_1.detectInvalidFilterName)(node, await filtersPromise);
87
+ const filterProblems = await (0, InvalidFilterName_1.detectInvalidFilterName)(node, (await filtersPromise) ?? []);
70
88
  if (filterProblems.length > 0) {
71
89
  filterProblems.forEach((filterProblem) => context.report(filterProblem));
72
90
  }
@@ -87,7 +105,7 @@ exports.LiquidHTMLSyntaxError = {
87
105
  async LiquidVariableOutput(node, ancestors) {
88
106
  if ((0, utils_2.isWithinRawTagThatDoesNotParseItsContents)(ancestors))
89
107
  return;
90
- const filterProblems = await (0, InvalidFilterName_1.detectInvalidFilterName)(node, await filtersPromise);
108
+ const filterProblems = await (0, InvalidFilterName_1.detectInvalidFilterName)(node, (await filtersPromise) ?? []);
91
109
  if (filterProblems.length > 0) {
92
110
  filterProblems.forEach((problem) => context.report(problem));
93
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/liquid-html-syntax-error/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/liquid-html-syntax-error/index.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,36 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MatchingTranslations = void 0;
4
4
  const types_1 = require("../../types");
5
5
  const PLURALIZATION_KEYS = new Set(['zero', 'one', 'two', 'few', 'many', 'other']);
6
+ /**
7
+ * Returns the locale declared in a YAML translation file by reading its first
8
+ * top-level key (e.g. `en`, `pt-BR`, `fr`). platformOS determines a file's
9
+ * locale from content, not from its path.
10
+ */
11
+ function getLocaleFromAst(ast) {
12
+ if (ast instanceof Error)
13
+ return null;
14
+ if (ast.type !== 'Object')
15
+ return null;
16
+ const firstProp = ast.children[0];
17
+ if (!firstProp || firstProp.type !== 'Property')
18
+ return null;
19
+ return firstProp.key.value || null;
20
+ }
21
+ /**
22
+ * Extracts the translations base directory from a relative file path.
23
+ *
24
+ * e.g. `app/translations/pt-BR.yml` → `app/translations`
25
+ * `app/translations/pt-BR/validation.yml` → `app/translations`
26
+ * `modules/x/public/translations/en.yml` → `modules/x/public/translations`
27
+ *
28
+ * Returns `null` if the path doesn't contain a `/translations/` segment.
29
+ */
30
+ function getTranslationRelativeBase(relativePath) {
31
+ const idx = relativePath.lastIndexOf('/translations/');
32
+ if (idx === -1)
33
+ return null;
34
+ return relativePath.substring(0, idx + '/translations'.length);
35
+ }
6
36
  exports.MatchingTranslations = {
7
37
  meta: {
8
38
  code: 'MatchingTranslations',
@@ -18,38 +48,55 @@ exports.MatchingTranslations = {
18
48
  targets: [],
19
49
  },
20
50
  create(context) {
21
- // State
22
- const defaultTranslations = new Set();
23
- const missingTranslations = new Set();
51
+ // ── State ──────────────────────────────────────────────────────────────
52
+ const enTranslations = new Set(); // keys present in the en scope
53
+ const missingFromLocale = new Set(); // en keys absent from the entire locale scope
24
54
  const nodesByPath = new Map();
25
55
  const file = context.file;
26
56
  const fileUri = file.uri;
27
57
  const relativePath = context.toRelativePath(fileUri);
28
58
  const ast = file.ast;
59
+ // ── Guard: only lint translation files ────────────────────────────────
29
60
  const isTranslationFile = relativePath.includes('/translations/');
30
- // In platformOS, en.yml is the reference locale; skip running the check on it
31
- const basename = fileUri.split('/').pop() ?? '';
32
- const isDefaultTranslationsFile = basename.replace(/\.ya?ml$/, '') === 'en';
33
- if (!isTranslationFile || isDefaultTranslationsFile || ast instanceof Error) {
34
- // No need to lint a file that isn't a non-default translation file
61
+ // The locale is always the first top-level key in the YAML file (e.g. `en`,
62
+ // `pt-BR`). platformOS resolves locale from content, not from the file path.
63
+ const locale = getLocaleFromAst(ast);
64
+ if (!isTranslationFile || !locale || locale === 'en' || ast instanceof Error) {
35
65
  return {};
36
66
  }
37
- // Helpers
38
- const hasDefaultTranslations = () => defaultTranslations.size > 0;
67
+ // ── Derive scope (translation base URI) ──────────────────────────────
68
+ const relativeBase = getTranslationRelativeBase(relativePath);
69
+ if (!relativeBase)
70
+ return {};
71
+ const translationBaseUri = context.toUri(relativeBase);
72
+ // A "primary" locale file is the top-level `{locale}.yml` (not inside a
73
+ // locale sub-directory like `pt-BR/`). Only the primary file reports
74
+ // missing translations to avoid duplicate offenses across split files.
75
+ const pathAfterBase = relativePath.substring(relativeBase.length + 1);
76
+ const isPrimaryLocaleFile = !pathAfterBase.includes('/');
77
+ // ── Helpers ───────────────────────────────────────────────────────────
39
78
  const isTerminalNode = ({ type }) => type === 'Literal';
40
79
  const isPluralizationNode = (node) => PLURALIZATION_KEYS.has(node.key.value);
41
- const hasDefaultTranslation = (translationPath) => defaultTranslations.has(translationPath) ?? false;
42
80
  const isPluralizationPath = (path) => [...PLURALIZATION_KEYS].some((key) => path.endsWith(key));
43
- const jsonPaths = (json) => {
44
- const keys = Object.keys(json);
45
- return keys.reduce((acc, key) => {
46
- if (typeof json[key] !== 'object') {
47
- return acc.concat(key);
81
+ const countCommonParts = (a, b) => {
82
+ const min = Math.min(a.length, b.length);
83
+ for (let i = 0; i < min; i++)
84
+ if (a[i] !== b[i])
85
+ return i;
86
+ return min;
87
+ };
88
+ const closestTranslationKey = (key) => {
89
+ const keyParts = key.split('.');
90
+ let closest = '';
91
+ let max = 0;
92
+ for (const path of nodesByPath.keys()) {
93
+ const common = countCommonParts(path.split('.'), keyParts);
94
+ if (common > max) {
95
+ max = common;
96
+ closest = path;
48
97
  }
49
- const childJson = json[key];
50
- const childPaths = jsonPaths(childJson);
51
- return acc.concat(childPaths.map((path) => `${key}.${path}`));
52
- }, []);
98
+ }
99
+ return nodesByPath.get(closest) ?? ast;
53
100
  };
54
101
  // Strip the locale prefix (first Property in the ancestors chain).
55
102
  // YAML files wrap content under a locale key: { en: { hello: 'Hello' } }
@@ -57,77 +104,65 @@ exports.MatchingTranslations = {
57
104
  const objectPath = (nodes) => {
58
105
  const props = nodes.filter((n) => n.type === 'Property');
59
106
  if (props.length <= 1)
60
- return ''; // locale key itself, or empty
107
+ return '';
61
108
  return props
62
109
  .slice(1)
63
110
  .map((p) => p.key.value)
64
111
  .join('.');
65
112
  };
66
- const countCommonParts = (arrayA, arrayB) => {
67
- const minLength = Math.min(arrayA.length, arrayB.length);
68
- for (let i = 0; i < minLength; i++) {
69
- if (arrayA[i] !== arrayB[i]) {
70
- return i;
71
- }
72
- }
73
- return minLength;
74
- };
75
- const closestTranslationKey = (translationKey) => {
76
- const translationKeyParts = translationKey.split('.');
77
- let closestMatch = '';
78
- let maxCommonParts = 0;
79
- for (const path of nodesByPath.keys()) {
80
- const pathParts = path.split('.');
81
- const commonParts = countCommonParts(pathParts, translationKeyParts);
82
- if (commonParts > maxCommonParts) {
83
- maxCommonParts = commonParts;
84
- closestMatch = path;
85
- }
86
- }
87
- return nodesByPath.get(closestMatch) ?? ast;
88
- };
113
+ const jsonPaths = (json) => Object.keys(json).reduce((acc, key) => {
114
+ if (typeof json[key] !== 'object')
115
+ return acc.concat(key);
116
+ return acc.concat(jsonPaths(json[key]).map((p) => `${key}.${p}`));
117
+ }, []);
89
118
  return {
90
119
  async onCodePathStart() {
91
- const defaultTranslationPaths = await context.getDefaultTranslations().then(jsonPaths);
92
- defaultTranslationPaths.forEach(Set.prototype.add, defaultTranslations);
93
- // At the `onCodePathStart`, we assume that all translations are missing,
94
- // and remove translation paths while traversing through the file.
95
- defaultTranslationPaths.forEach(Set.prototype.add, missingTranslations);
120
+ // Aggregate ALL en translations in this scope (en.yml + en/*.yml)
121
+ const en = await context.getTranslationsForBase(translationBaseUri, 'en');
122
+ jsonPaths(en).forEach(Set.prototype.add, enTranslations);
123
+ if (!isPrimaryLocaleFile)
124
+ return;
125
+ // For the primary locale file: pre-compute which en keys are absent
126
+ // from the entire locale scope (locale.yml + locale/*.yml).
127
+ const localeAgg = await context.getTranslationsForBase(translationBaseUri, locale);
128
+ const localeKeys = new Set(jsonPaths(localeAgg));
129
+ for (const key of enTranslations) {
130
+ if (!localeKeys.has(key))
131
+ missingFromLocale.add(key);
132
+ }
96
133
  },
97
134
  async Property(node, ancestors) {
98
135
  const path = objectPath(ancestors.concat(node));
99
136
  if (!path)
100
- return; // skip the root locale key (e.g. 'pt-BR')
101
- nodesByPath.set(path, node);
102
- if (!hasDefaultTranslations())
103
137
  return;
138
+ nodesByPath.set(path, node);
104
139
  if (isPluralizationNode(node))
105
140
  return;
106
141
  if (!isTerminalNode(node.value))
107
142
  return;
108
- if (hasDefaultTranslation(path)) {
109
- // As `path` is present, we remove it from the
110
- // `missingTranslationsPerFile` bucket.
111
- missingTranslations.delete(path);
112
- return;
143
+ if (!enTranslations.size)
144
+ return; // no en reference skip
145
+ if (!enTranslations.has(path)) {
146
+ context.report({
147
+ message: `A translation for '${path}' does not exist in the en locale`,
148
+ startIndex: node.loc.start.offset,
149
+ endIndex: node.loc.end.offset,
150
+ });
113
151
  }
114
- context.report({
115
- message: `A default translation for '${path}' does not exist`,
116
- startIndex: node.loc.start.offset,
117
- endIndex: node.loc.end.offset,
118
- });
119
152
  },
120
153
  async onCodePathEnd() {
121
- missingTranslations.forEach((path) => {
122
- const closest = closestTranslationKey(path);
123
- if (isPluralizationPath(path))
124
- return;
154
+ if (!isPrimaryLocaleFile)
155
+ return;
156
+ for (const key of missingFromLocale) {
157
+ if (isPluralizationPath(key))
158
+ continue;
159
+ const closest = closestTranslationKey(key);
125
160
  context.report({
126
- message: `The translation for '${path}' is missing`,
161
+ message: `The translation for '${key}' is missing`,
127
162
  startIndex: closest.loc.start.offset,
128
163
  endIndex: closest.loc.end.offset,
129
164
  });
130
- });
165
+ }
131
166
  },
132
167
  };
133
168
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/matching-translations/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/matching-translations/index.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,7 @@ exports.UndefinedObject = {
50
50
  async LiquidTag(node, ancestors) {
51
51
  if ((0, utils_2.isWithinRawTagThatDoesNotParseItsContents)(ancestors))
52
52
  return;
53
- if (isLiquidTagAssign(node) || isLiquidTagGraphQL(node)) {
53
+ if (isLiquidTagAssign(node) || isLiquidTagGraphQL(node) || isLiquidTagParseJson(node)) {
54
54
  indexVariableScope(node.markup.name, {
55
55
  start: node.blockStartPosition.end,
56
56
  });
@@ -122,6 +122,8 @@ exports.UndefinedObject = {
122
122
  const parent = (0, utils_1.last)(ancestors);
123
123
  if (isLiquidTag(parent) && isLiquidTagCapture(parent))
124
124
  return;
125
+ if (isLiquidTag(parent) && isLiquidTagParseJson(parent))
126
+ return;
125
127
  // Skip the jobId variable in background tag markup - it's being defined, not used
126
128
  if (isBackgroundInlineMarkup(parent) && parent.jobId === node)
127
129
  return;
@@ -206,6 +208,9 @@ function isLiquidTagHashAssign(node) {
206
208
  function isLiquidTagGraphQL(node) {
207
209
  return node.name === liquid_html_parser_1.NamedTags.graphql && typeof node.markup !== 'string';
208
210
  }
211
+ function isLiquidTagParseJson(node) {
212
+ return node.name === liquid_html_parser_1.NamedTags.parse_json && typeof node.markup !== 'string';
213
+ }
209
214
  function isLiquidForTag(node) {
210
215
  return node.name === liquid_html_parser_1.NamedTags.for && typeof node.markup !== 'string';
211
216
  }