@ttsc/lint 0.11.0-dev.20260518-2 → 0.12.0

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 (57) hide show
  1. package/README.md +67 -141
  2. package/lib/{structures/defaultFormat.d.ts → defaultFormat.d.ts} +3 -3
  3. package/lib/{structures/defaultFormat.js → defaultFormat.js} +3 -3
  4. package/lib/defaultFormat.js.map +1 -0
  5. package/lib/index.d.ts +1 -38
  6. package/lib/index.js +7 -5
  7. package/lib/index.js.map +1 -1
  8. package/lib/structures/ITtscLintConfig.d.ts +27 -0
  9. package/lib/structures/{PluginRuleNames.js → ITtscLintConfig.js} +1 -1
  10. package/lib/structures/ITtscLintConfig.js.map +1 -0
  11. package/lib/structures/{TtscLintFormatConfig.d.ts → ITtscLintFormatConfig.d.ts} +17 -16
  12. package/lib/structures/{TtscLintConfig.js → ITtscLintFormatConfig.js} +1 -1
  13. package/lib/structures/ITtscLintFormatConfig.js.map +1 -0
  14. package/lib/structures/ITtscLintPluginConfig.d.ts +6 -6
  15. package/lib/structures/TtscLintRuleMap.d.ts +11 -9
  16. package/lib/structures/TtscLintRuleOptions.d.ts +118 -144
  17. package/lib/structures/index.d.ts +2 -7
  18. package/lib/structures/index.js +2 -7
  19. package/lib/structures/index.js.map +1 -1
  20. package/linthost/config.go +1 -6
  21. package/linthost/config_format.go +253 -298
  22. package/linthost/format.go +91 -1
  23. package/package.json +3 -3
  24. package/rule/rule.go +124 -124
  25. package/src/{structures/defaultFormat.ts → defaultFormat.ts} +5 -5
  26. package/src/index.ts +7 -5
  27. package/src/structures/ITtscLintConfig.ts +33 -0
  28. package/src/structures/{TtscLintFormatConfig.ts → ITtscLintFormatConfig.ts} +17 -16
  29. package/src/structures/ITtscLintPluginConfig.ts +6 -6
  30. package/src/structures/TtscLintRuleMap.ts +17 -13
  31. package/src/structures/TtscLintRuleOptions.ts +118 -144
  32. package/src/structures/index.ts +2 -7
  33. package/lib/defineConfig.d.ts +0 -55
  34. package/lib/defineConfig.js +0 -39
  35. package/lib/defineConfig.js.map +0 -1
  36. package/lib/structures/PluginRuleNames.d.ts +0 -14
  37. package/lib/structures/PluginRuleNames.js.map +0 -1
  38. package/lib/structures/TtscLintConfig.d.ts +0 -27
  39. package/lib/structures/TtscLintConfig.js.map +0 -1
  40. package/lib/structures/TtscLintConfigEntry.d.ts +0 -39
  41. package/lib/structures/TtscLintConfigEntry.js +0 -3
  42. package/lib/structures/TtscLintConfigEntry.js.map +0 -1
  43. package/lib/structures/TtscLintFormatConfig.js +0 -3
  44. package/lib/structures/TtscLintFormatConfig.js.map +0 -1
  45. package/lib/structures/TtscLintPlugins.d.ts +0 -9
  46. package/lib/structures/TtscLintPlugins.js +0 -3
  47. package/lib/structures/TtscLintPlugins.js.map +0 -1
  48. package/lib/structures/TtscLintRuleEntry.d.ts +0 -22
  49. package/lib/structures/TtscLintRuleEntry.js +0 -3
  50. package/lib/structures/TtscLintRuleEntry.js.map +0 -1
  51. package/lib/structures/defaultFormat.js.map +0 -1
  52. package/src/defineConfig.ts +0 -69
  53. package/src/structures/PluginRuleNames.ts +0 -19
  54. package/src/structures/TtscLintConfig.ts +0 -31
  55. package/src/structures/TtscLintConfigEntry.ts +0 -50
  56. package/src/structures/TtscLintPlugins.ts +0 -10
  57. package/src/structures/TtscLintRuleEntry.ts +0 -28
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ITtscLintFormatConfig.js","sourceRoot":"","sources":["../../src/structures/ITtscLintFormatConfig.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import type { TtscLintFormatConfig } from "./TtscLintFormatConfig";
1
+ import type { ITtscLintFormatConfig } from "./ITtscLintFormatConfig";
2
2
  import type { TtscLintRuleMap } from "./TtscLintRuleMap";
3
3
  /** `compilerOptions.plugins[]` entry shape consumed by `@ttsc/lint`. */
4
4
  export interface ITtscLintPluginConfig {
@@ -61,7 +61,7 @@ export interface ITtscLintPluginConfig {
61
61
  plugins?: Record<string, string>;
62
62
  /**
63
63
  * Prettier-style flat configuration for the `format/*` rules. Sibling of
64
- * `rules`. See {@link TtscLintFormatConfig} for the full surface.
64
+ * `rules`. See {@link ITtscLintFormatConfig} for the full surface.
65
65
  *
66
66
  * ```jsonc
67
67
  * {
@@ -74,7 +74,7 @@ export interface ITtscLintPluginConfig {
74
74
  * combined with `extends` on the same plugin entry — put format options
75
75
  * inside the extends-target lint.config.ts instead.
76
76
  */
77
- format?: TtscLintFormatConfig;
77
+ format?: ITtscLintFormatConfig;
78
78
  /**
79
79
  * Inline rule map or path to a standalone lint config file.
80
80
  *
@@ -85,9 +85,9 @@ export interface ITtscLintPluginConfig {
85
85
  *
86
86
  * The legacy shape is intentionally narrower than `rules`/`extends`: a string
87
87
  * (file path) or a flat rule-name → severity map. The Go-side parser only
88
- * accepts those two shapes; widening the TS type to the new
89
- * `TtscLintConfig` union would silently let `config: [{ rules: {...} }]`
90
- * pass type-checking and fail at runtime.
88
+ * accepts those two shapes; widening the TS type to the full config object
89
+ * would silently let unsupported nested shapes pass type-checking and fail
90
+ * at runtime.
91
91
  */
92
92
  config?: string | TtscLintRuleMap;
93
93
  /** Extra plugin-owned fields are passed through unchanged. */
@@ -1,17 +1,17 @@
1
- import type { PluginRuleNames } from "./PluginRuleNames";
2
- import type { TtscLintPlugins } from "./TtscLintPlugins";
3
1
  import type { TtscLintRule } from "./TtscLintRule";
4
- import type { TtscLintRuleOptionsMap } from "./TtscLintRuleOptions";
2
+ import type { ITtscLintRuleOptionsMap } from "./TtscLintRuleOptions";
5
3
  import type { TtscLintSeverity } from "./TtscLintSeverity";
6
4
  /**
7
5
  * Rule-name → severity or severity-tuple map.
8
6
  *
9
7
  * Built from two independent mapped types intersected together:
10
8
  *
11
- * - Rules listed in `TtscLintRuleOptionsMap` accept `severity`, `[severity]`, or
9
+ * - Rules listed in `ITtscLintRuleOptionsMap` accept `severity`, `[severity]`, or
12
10
  * `[severity, options]`, with the options type picked per rule key.
13
- * - Every other built-in rule plus any contributor plugin rule accepts `severity`
14
- * or `[severity]`.
11
+ * - Every other built-in rule accepts `severity` or `[severity]`.
12
+ * - Namespaced contributor plugin rules accept `severity`, `[severity]`, or
13
+ * `[severity, unknownOptions]` because the host type surface no longer
14
+ * knows contributor rule schemas.
15
15
  *
16
16
  * Splitting the two halves (instead of folding them into one mapped type with a
17
17
  * conditional value) keeps TypeScript's contextual typing intact inside the
@@ -37,8 +37,10 @@ import type { TtscLintSeverity } from "./TtscLintSeverity";
37
37
  * splits each negative case into its own const to keep every branch
38
38
  * load-bearing.
39
39
  */
40
- export type TtscLintRuleMap<P extends TtscLintPlugins = Record<string, never>> = {
41
- [K in keyof TtscLintRuleOptionsMap]?: TtscLintSeverity | readonly [TtscLintSeverity] | readonly [TtscLintSeverity, TtscLintRuleOptionsMap[K]];
40
+ export type TtscLintRuleMap = {
41
+ [K in keyof ITtscLintRuleOptionsMap]?: TtscLintSeverity | readonly [TtscLintSeverity] | readonly [TtscLintSeverity, ITtscLintRuleOptionsMap[K]];
42
42
  } & {
43
- [K in Exclude<TtscLintRule | PluginRuleNames<P>, keyof TtscLintRuleOptionsMap>]?: TtscLintSeverity | readonly [TtscLintSeverity];
43
+ [K in Exclude<TtscLintRule, keyof ITtscLintRuleOptionsMap>]?: TtscLintSeverity | readonly [TtscLintSeverity];
44
+ } & {
45
+ [K in `${string}/${string}`]?: TtscLintSeverity | readonly [TtscLintSeverity] | readonly [TtscLintSeverity, unknown];
44
46
  };
@@ -1,149 +1,123 @@
1
- /**
2
- * Per-rule option shapes used by `TtscLintRuleEntry` to type the second tuple
3
- * slot.
4
- *
5
- * Each entry here maps a rule name to its option struct. Rule names that do not
6
- * appear in this interface accept severity-only configuration (a `[severity]`
7
- * tuple is _also_ allowed for them, with an empty options blob).
8
- *
9
- * The shapes are designed to match the analogous prettier / ESLint options
10
- * where the rule absorbs an existing tool's behavior:
11
- *
12
- * - `format/semi` mirrors prettier `semi`.
13
- * - `format/quotes` mirrors prettier `singleQuote` (inverted).
14
- * - `format/trailing-comma` mirrors prettier `trailingComma`.
15
- * - `format/sort-imports` mirrors `@trivago/prettier-plugin-sort-imports`
16
- * (`importOrder`, `importOrderSeparation`, `importOrderSortSpecifiers`,
17
- * `importOrderCaseInsensitive`).
18
- * - `format/jsdoc` mirrors `prettier-plugin-jsdoc` (`tagSynonyms` layered onto
19
- * the built-in synonym table, `sortTags` reserved for a future pass).
20
- *
21
- * Future option additions go here so the TypeScript autocomplete updates in one
22
- * place. The Go side reads these as `json.RawMessage` and each rule decodes
23
- * into its own struct.
24
- */
25
- export declare namespace TtscLintRuleOptions {
26
- /** `format/semi` options. */
27
- interface Semi {
28
- /**
29
- * Whether trailing semicolons must be present on ASI statements.
30
- *
31
- * @default "always"
32
- */
33
- prefer?: "always" | "never";
34
- }
35
- /** `format/quotes` options. */
36
- interface Quotes {
37
- /**
38
- * Quote style for string literals. Template literals are always preserved
39
- * regardless of this setting.
40
- *
41
- * @default "double"
42
- */
43
- prefer?: "double" | "single";
44
- }
45
- /** `format/trailing-comma` options. */
46
- interface TrailingComma {
47
- /**
48
- * Which multi-line lists receive a trailing comma. `"all"` matches
49
- * prettier's modern default; `"es5"` skips function calls and type
50
- * parameter lists; `"none"` disables the rule entirely.
51
- *
52
- * @default "all"
53
- */
54
- mode?: "all" | "es5" | "none";
55
- }
56
- /** `format/sort-imports` options. */
57
- interface SortImports {
58
- /**
59
- * Ordered list of regex strings (or the `<THIRD_PARTY_MODULES>`
60
- * placeholder) defining the group order. Imports matching the first pattern
61
- * land in group 0, the second in group 1, and so on. The placeholder
62
- * absorbs any specifier that does not match another pattern. Mirrors
63
- * trivago's `importOrder` semantics.
64
- */
65
- importOrder?: readonly string[];
66
- /**
67
- * Insert a blank line between groups.
68
- *
69
- * @default true
70
- */
71
- importOrderSeparation?: boolean;
72
- /**
73
- * Sort named import specifiers alphabetically within each declaration.
74
- *
75
- * @default true
76
- */
77
- importOrderSortSpecifiers?: boolean;
78
- /**
79
- * Treat `A` and `a` as equivalent when comparing module specifiers and
80
- * specifier names. Mirrors trivago's `importOrderCaseInsensitive`.
81
- *
82
- * @default false
83
- */
84
- importOrderCaseInsensitive?: boolean;
85
- }
86
- /** `format/print-width` options. */
87
- interface PrintWidth {
88
- /**
89
- * Maximum column width before broken-form layout is chosen. Mirrors
90
- * prettier's `printWidth`.
91
- *
92
- * @default 80
93
- */
94
- printWidth?: number;
95
- /**
96
- * Indentation increment in columns. Mirrors prettier's `tabWidth`.
97
- *
98
- * @default 2
99
- */
100
- tabWidth?: number;
101
- /**
102
- * Emit indentation as tab characters rather than spaces. Mirrors
103
- * prettier's `useTabs`. Continuation alignment beyond the tab
104
- * boundary still falls back to spaces, matching dprint's
105
- * "indent with tabs, align with spaces" convention.
106
- *
107
- * @default false
108
- */
109
- useTabs?: boolean;
110
- /**
111
- * Line-terminator emitted on every newline the printer inserts.
112
- * Mirrors prettier's `endOfLine` `"lf"` and `"crlf"` modes.
113
- *
114
- * @default "lf"
115
- */
116
- endOfLine?: "lf" | "crlf";
117
- }
118
- /** `format/jsdoc` options. */
119
- interface JSDoc {
120
- /**
121
- * Extra `from → to` tag rewrites layered on top of the built-in synonym
122
- * table (`@return → @returns`, `@arg → @param`, etc.). User-supplied
123
- * entries win on key collision, so a `{"return": "RETURN"}` entry overrides
124
- * the built-in default for `@return`.
125
- *
126
- * @default {} (use built-in table unchanged)
127
- */
128
- tagSynonyms?: Record<string, string>;
129
- /**
130
- * Sort JSDoc tag blocks into the canonical order (`@description`, `@param`,
131
- * `@returns`, …).
132
- *
133
- * @default false (deferred; MVP only normalizes tag names)
134
- */
135
- sortTags?: boolean;
136
- }
1
+ /** `format/semi` rule options. */
2
+ export interface ITtscLintSemiRuleOptions {
3
+ /**
4
+ * Whether trailing semicolons must be present on ASI statements.
5
+ *
6
+ * @default "always"
7
+ */
8
+ prefer?: "always" | "never";
9
+ }
10
+ /** `format/quotes` rule options. */
11
+ export interface ITtscLintQuotesRuleOptions {
12
+ /**
13
+ * Quote style for string literals. Template literals are always preserved
14
+ * regardless of this setting.
15
+ *
16
+ * @default "double"
17
+ */
18
+ prefer?: "double" | "single";
19
+ }
20
+ /** `format/trailing-comma` rule options. */
21
+ export interface ITtscLintTrailingCommaRuleOptions {
22
+ /**
23
+ * Which multi-line lists receive a trailing comma. `"all"` matches prettier's
24
+ * modern default; `"es5"` skips function calls and type parameter lists;
25
+ * `"none"` disables the rule entirely.
26
+ *
27
+ * @default "all"
28
+ */
29
+ mode?: "all" | "es5" | "none";
30
+ }
31
+ /** `format/sort-imports` rule options. */
32
+ export interface ITtscLintSortImportsRuleOptions {
33
+ /**
34
+ * Ordered list of regex strings (or the `<THIRD_PARTY_MODULES>` placeholder)
35
+ * defining the group order. Imports matching the first pattern land in group
36
+ * 0, the second in group 1, and so on. The placeholder absorbs any specifier
37
+ * that does not match another pattern. Mirrors trivago's `importOrder`
38
+ * semantics.
39
+ */
40
+ importOrder?: readonly string[];
41
+ /**
42
+ * Insert a blank line between groups.
43
+ *
44
+ * @default true
45
+ */
46
+ importOrderSeparation?: boolean;
47
+ /**
48
+ * Sort named import specifiers alphabetically within each declaration.
49
+ *
50
+ * @default true
51
+ */
52
+ importOrderSortSpecifiers?: boolean;
53
+ /**
54
+ * Treat `A` and `a` as equivalent when comparing module specifiers and
55
+ * specifier names. Mirrors trivago's `importOrderCaseInsensitive`.
56
+ *
57
+ * @default false
58
+ */
59
+ importOrderCaseInsensitive?: boolean;
60
+ }
61
+ /** `format/print-width` rule options. */
62
+ export interface ITtscLintPrintWidthRuleOptions {
63
+ /**
64
+ * Maximum column width before broken-form layout is chosen. Mirrors
65
+ * prettier's `printWidth`.
66
+ *
67
+ * @default 80
68
+ */
69
+ printWidth?: number;
70
+ /**
71
+ * Indentation increment in columns. Mirrors prettier's `tabWidth`.
72
+ *
73
+ * @default 2
74
+ */
75
+ tabWidth?: number;
76
+ /**
77
+ * Emit indentation as tab characters rather than spaces. Mirrors prettier's
78
+ * `useTabs`. Continuation alignment beyond the tab boundary still falls back
79
+ * to spaces, matching dprint's "indent with tabs, align with spaces"
80
+ * convention.
81
+ *
82
+ * @default false
83
+ */
84
+ useTabs?: boolean;
85
+ /**
86
+ * Line-terminator emitted on every newline the printer inserts. Mirrors
87
+ * prettier's `endOfLine` `"lf"` and `"crlf"` modes.
88
+ *
89
+ * @default "lf"
90
+ */
91
+ endOfLine?: "lf" | "crlf";
92
+ }
93
+ /** `format/jsdoc` rule options. */
94
+ export interface ITtscLintJsdocRuleOptions {
95
+ /**
96
+ * Extra `from -> to` tag rewrites layered on top of the built-in synonym
97
+ * table (`@return -> @returns`, `@arg -> @param`, etc.). User-supplied
98
+ * entries win on key collision, so a `{"return": "RETURN"}` entry overrides
99
+ * the built-in default for `@return`.
100
+ *
101
+ * @default {} (use built-in table unchanged)
102
+ */
103
+ tagSynonyms?: Record<string, string>;
104
+ /**
105
+ * Sort JSDoc tag blocks into the canonical order (`@description`, `@param`,
106
+ * `@returns`, ...).
107
+ *
108
+ * @default false (deferred; MVP only normalizes tag names)
109
+ */
110
+ sortTags?: boolean;
137
111
  }
138
112
  /**
139
- * Index from rule name to its option struct. Used by `TtscLintRuleEntry<R>` to
113
+ * Index from rule name to its option object. `TtscLintRuleMap` uses this to
140
114
  * produce precise tuple types per rule.
141
115
  */
142
- export interface TtscLintRuleOptionsMap {
143
- "format/semi": TtscLintRuleOptions.Semi;
144
- "format/quotes": TtscLintRuleOptions.Quotes;
145
- "format/trailing-comma": TtscLintRuleOptions.TrailingComma;
146
- "format/sort-imports": TtscLintRuleOptions.SortImports;
147
- "format/jsdoc": TtscLintRuleOptions.JSDoc;
148
- "format/print-width": TtscLintRuleOptions.PrintWidth;
116
+ export interface ITtscLintRuleOptionsMap {
117
+ "format/semi": ITtscLintSemiRuleOptions;
118
+ "format/quotes": ITtscLintQuotesRuleOptions;
119
+ "format/trailing-comma": ITtscLintTrailingCommaRuleOptions;
120
+ "format/sort-imports": ITtscLintSortImportsRuleOptions;
121
+ "format/jsdoc": ITtscLintJsdocRuleOptions;
122
+ "format/print-width": ITtscLintPrintWidthRuleOptions;
149
123
  }
@@ -1,14 +1,9 @@
1
- export * from "./defaultFormat";
1
+ export * from "./ITtscLintConfig";
2
+ export * from "./ITtscLintFormatConfig";
2
3
  export * from "./ITtscLintPlugin";
3
4
  export * from "./ITtscLintPluginConfig";
4
5
  export * from "./ITtscLintPluginMeta";
5
- export * from "./PluginRuleNames";
6
- export * from "./TtscLintConfig";
7
- export * from "./TtscLintConfigEntry";
8
- export * from "./TtscLintFormatConfig";
9
- export * from "./TtscLintPlugins";
10
6
  export * from "./TtscLintRule";
11
- export * from "./TtscLintRuleEntry";
12
7
  export * from "./TtscLintRuleMap";
13
8
  export * from "./TtscLintRuleOptions";
14
9
  export * from "./TtscLintSeverity";
@@ -14,17 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./defaultFormat"), exports);
17
+ __exportStar(require("./ITtscLintConfig"), exports);
18
+ __exportStar(require("./ITtscLintFormatConfig"), exports);
18
19
  __exportStar(require("./ITtscLintPlugin"), exports);
19
20
  __exportStar(require("./ITtscLintPluginConfig"), exports);
20
21
  __exportStar(require("./ITtscLintPluginMeta"), exports);
21
- __exportStar(require("./PluginRuleNames"), exports);
22
- __exportStar(require("./TtscLintConfig"), exports);
23
- __exportStar(require("./TtscLintConfigEntry"), exports);
24
- __exportStar(require("./TtscLintFormatConfig"), exports);
25
- __exportStar(require("./TtscLintPlugins"), exports);
26
22
  __exportStar(require("./TtscLintRule"), exports);
27
- __exportStar(require("./TtscLintRuleEntry"), exports);
28
23
  __exportStar(require("./TtscLintRuleMap"), exports);
29
24
  __exportStar(require("./TtscLintRuleOptions"), exports);
30
25
  __exportStar(require("./TtscLintSeverity"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/structures/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,oDAAkC;AAClC,0DAAwC;AACxC,wDAAsC;AACtC,oDAAkC;AAClC,mDAAiC;AACjC,wDAAsC;AACtC,yDAAuC;AACvC,oDAAkC;AAClC,iDAA+B;AAC/B,sDAAoC;AACpC,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/structures/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,0DAAwC;AACxC,oDAAkC;AAClC,0DAAwC;AACxC,wDAAsC;AACtC,iDAA+B;AAC/B,oDAAkC;AAClC,wDAAsC;AACtC,qDAAmC"}
@@ -490,7 +490,6 @@ func collectExternalConfigEntries(store *ConfigStore, raw any, baseDir, path str
490
490
  }
491
491
  merged := mergeRuleMaps(formatRulesRaw, rulesMap)
492
492
  if len(merged) == 0 {
493
- // `format: { severity: "off" }` and no rules — drop entry.
494
493
  return nil
495
494
  }
496
495
  parsed, err := parseExternalRuleMapInto(merged, path+".rules", store)
@@ -798,9 +797,7 @@ func LoadConfigResolver(entry *PluginEntry, cwd, tsconfigPath string) (RuleResol
798
797
  return nil, fmt.Errorf("@ttsc/lint: \"format\" and \"extends\" cannot be combined on a single plugin entry; put format options inside the extends-target lint.config.ts instead")
799
798
  }
800
799
 
801
- // Expand the format block (if any) into a rules-shaped map. The
802
- // returned map is empty when `format.severity === "off"` so the
803
- // downstream merge with `rules` still produces the right result.
800
+ // Expand the format block (if any) into a rules-shaped map.
804
801
  var formatRulesRaw map[string]any
805
802
  if hasFormat {
806
803
  formatMap, ok := formatValue.(map[string]any)
@@ -827,8 +824,6 @@ func LoadConfigResolver(entry *PluginEntry, cwd, tsconfigPath string) (RuleResol
827
824
  }
828
825
  merged := mergeRuleMaps(formatRulesRaw, rulesMap)
829
826
  if len(merged) == 0 {
830
- // `format: { severity: "off" }` with no `rules` field — no
831
- // rules to register.
832
827
  return InlineRuleResolver{Rules: RuleConfig{}, Options: RuleOptionsMap{}}, nil
833
828
  }
834
829
  cfg, opts, err := ParseRulesWithOptions(merged)