@breadstone-infrastructure/token-linter 0.0.231

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 (196) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +72 -0
  4. package/cli/Cli.d.ts +10 -0
  5. package/cli/Cli.d.ts.map +1 -0
  6. package/cli/Cli.js +32 -0
  7. package/cli/Cli.js.map +1 -0
  8. package/cli/CliArgs.d.ts +2 -0
  9. package/cli/CliArgs.d.ts.map +1 -0
  10. package/cli/CliArgs.js +88 -0
  11. package/cli/CliArgs.js.map +1 -0
  12. package/cli/CliArgsConfig.d.ts +2 -0
  13. package/cli/CliArgsConfig.d.ts.map +1 -0
  14. package/cli/CliArgsConfig.js +12 -0
  15. package/cli/CliArgsConfig.js.map +1 -0
  16. package/cli/CliRun.d.ts +2 -0
  17. package/cli/CliRun.d.ts.map +1 -0
  18. package/cli/CliRun.js +34 -0
  19. package/cli/CliRun.js.map +1 -0
  20. package/cli/commands/LintCommand.d.ts +2 -0
  21. package/cli/commands/LintCommand.d.ts.map +1 -0
  22. package/cli/commands/LintCommand.js +66 -0
  23. package/cli/commands/LintCommand.js.map +1 -0
  24. package/cli/commands/LintCommandArgsConfig.d.ts +2 -0
  25. package/cli/commands/LintCommandArgsConfig.d.ts.map +1 -0
  26. package/cli/commands/LintCommandArgsConfig.js +46 -0
  27. package/cli/commands/LintCommandArgsConfig.js.map +1 -0
  28. package/cli/lint.d.ts +3 -0
  29. package/cli/lint.d.ts.map +1 -0
  30. package/cli/lint.js +55 -0
  31. package/cli/lint.js.map +1 -0
  32. package/config/TokenLinterConfigDiscovery.d.ts +16 -0
  33. package/config/TokenLinterConfigDiscovery.d.ts.map +1 -0
  34. package/config/TokenLinterConfigDiscovery.js +44 -0
  35. package/config/TokenLinterConfigDiscovery.js.map +1 -0
  36. package/config/defineConfig.d.ts +41 -0
  37. package/config/defineConfig.d.ts.map +1 -0
  38. package/config/defineConfig.js +37 -0
  39. package/config/defineConfig.js.map +1 -0
  40. package/core/interaction.d.ts +25 -0
  41. package/core/interaction.d.ts.map +1 -0
  42. package/core/interaction.js +45 -0
  43. package/core/interaction.js.map +1 -0
  44. package/core/loader.d.ts +21 -0
  45. package/core/loader.d.ts.map +1 -0
  46. package/core/loader.js +84 -0
  47. package/core/loader.js.map +1 -0
  48. package/core/rule-registry.d.ts +46 -0
  49. package/core/rule-registry.d.ts.map +1 -0
  50. package/core/rule-registry.js +73 -0
  51. package/core/rule-registry.js.map +1 -0
  52. package/core/rule.d.ts +46 -0
  53. package/core/rule.d.ts.map +1 -0
  54. package/core/rule.js +3 -0
  55. package/core/rule.js.map +1 -0
  56. package/core/runner.d.ts +23 -0
  57. package/core/runner.d.ts.map +1 -0
  58. package/core/runner.js +103 -0
  59. package/core/runner.js.map +1 -0
  60. package/index.d.ts +46 -0
  61. package/index.d.ts.map +1 -0
  62. package/index.js +47 -0
  63. package/index.js.map +1 -0
  64. package/models/lint-result.d.ts +14 -0
  65. package/models/lint-result.d.ts.map +1 -0
  66. package/models/lint-result.js +3 -0
  67. package/models/lint-result.js.map +1 -0
  68. package/models/rule-context.d.ts +18 -0
  69. package/models/rule-context.d.ts.map +1 -0
  70. package/models/rule-context.js +3 -0
  71. package/models/rule-context.js.map +1 -0
  72. package/models/rule-finding.d.ts +15 -0
  73. package/models/rule-finding.d.ts.map +1 -0
  74. package/models/rule-finding.js +3 -0
  75. package/models/rule-finding.js.map +1 -0
  76. package/models/rule-result.d.ts +11 -0
  77. package/models/rule-result.d.ts.map +1 -0
  78. package/models/rule-result.js +3 -0
  79. package/models/rule-result.js.map +1 -0
  80. package/models/rule-severity.d.ts +14 -0
  81. package/models/rule-severity.d.ts.map +1 -0
  82. package/models/rule-severity.js +10 -0
  83. package/models/rule-severity.js.map +1 -0
  84. package/models/token-entry.d.ts +11 -0
  85. package/models/token-entry.d.ts.map +1 -0
  86. package/models/token-entry.js +2 -0
  87. package/models/token-entry.js.map +1 -0
  88. package/models/token-linter-config.d.ts +30 -0
  89. package/models/token-linter-config.d.ts.map +1 -0
  90. package/models/token-linter-config.js +3 -0
  91. package/models/token-linter-config.js.map +1 -0
  92. package/orchestration/TokenLinterOrchestrator.d.ts +29 -0
  93. package/orchestration/TokenLinterOrchestrator.d.ts.map +1 -0
  94. package/orchestration/TokenLinterOrchestrator.js +98 -0
  95. package/orchestration/TokenLinterOrchestrator.js.map +1 -0
  96. package/package.json +20 -0
  97. package/presets/index.d.ts +2 -0
  98. package/presets/index.d.ts.map +1 -0
  99. package/presets/index.js +2 -0
  100. package/presets/index.js.map +1 -0
  101. package/presets/recommended.d.ts +23 -0
  102. package/presets/recommended.d.ts.map +1 -0
  103. package/presets/recommended.js +41 -0
  104. package/presets/recommended.js.map +1 -0
  105. package/reporters/console.reporter.d.ts +15 -0
  106. package/reporters/console.reporter.d.ts.map +1 -0
  107. package/reporters/console.reporter.js +75 -0
  108. package/reporters/console.reporter.js.map +1 -0
  109. package/reporters/json.reporter.d.ts +11 -0
  110. package/reporters/json.reporter.d.ts.map +1 -0
  111. package/reporters/json.reporter.js +37 -0
  112. package/reporters/json.reporter.js.map +1 -0
  113. package/reporters/reporter.d.ts +16 -0
  114. package/reporters/reporter.d.ts.map +1 -0
  115. package/reporters/reporter.js +3 -0
  116. package/reporters/reporter.js.map +1 -0
  117. package/reporters/summary.reporter.d.ts +12 -0
  118. package/reporters/summary.reporter.d.ts.map +1 -0
  119. package/reporters/summary.reporter.js +48 -0
  120. package/reporters/summary.reporter.js.map +1 -0
  121. package/rules/alphabetical-sort.rule.d.ts +19 -0
  122. package/rules/alphabetical-sort.rule.d.ts.map +1 -0
  123. package/rules/alphabetical-sort.rule.js +72 -0
  124. package/rules/alphabetical-sort.rule.js.map +1 -0
  125. package/rules/component-presence.rule.d.ts +29 -0
  126. package/rules/component-presence.rule.d.ts.map +1 -0
  127. package/rules/component-presence.rule.js +102 -0
  128. package/rules/component-presence.rule.js.map +1 -0
  129. package/rules/duplicate-value.rule.d.ts +17 -0
  130. package/rules/duplicate-value.rule.d.ts.map +1 -0
  131. package/rules/duplicate-value.rule.js +49 -0
  132. package/rules/duplicate-value.rule.js.map +1 -0
  133. package/rules/empty-json.rule.d.ts +52 -0
  134. package/rules/empty-json.rule.d.ts.map +1 -0
  135. package/rules/empty-json.rule.js +100 -0
  136. package/rules/empty-json.rule.js.map +1 -0
  137. package/rules/forbidden-key.rule.d.ts +57 -0
  138. package/rules/forbidden-key.rule.d.ts.map +1 -0
  139. package/rules/forbidden-key.rule.js +118 -0
  140. package/rules/forbidden-key.rule.js.map +1 -0
  141. package/rules/forbidden-value.rule.d.ts +53 -0
  142. package/rules/forbidden-value.rule.d.ts.map +1 -0
  143. package/rules/forbidden-value.rule.js +130 -0
  144. package/rules/forbidden-value.rule.js.map +1 -0
  145. package/rules/includes-consistency.rule.d.ts +30 -0
  146. package/rules/includes-consistency.rule.d.ts.map +1 -0
  147. package/rules/includes-consistency.rule.js +153 -0
  148. package/rules/includes-consistency.rule.js.map +1 -0
  149. package/rules/index.d.ts +7 -0
  150. package/rules/index.d.ts.map +1 -0
  151. package/rules/index.js +47 -0
  152. package/rules/index.js.map +1 -0
  153. package/rules/key-consistency.rule.d.ts +38 -0
  154. package/rules/key-consistency.rule.d.ts.map +1 -0
  155. package/rules/key-consistency.rule.js +161 -0
  156. package/rules/key-consistency.rule.js.map +1 -0
  157. package/rules/missing-includes.rule.d.ts +19 -0
  158. package/rules/missing-includes.rule.d.ts.map +1 -0
  159. package/rules/missing-includes.rule.js +51 -0
  160. package/rules/missing-includes.rule.js.map +1 -0
  161. package/rules/mixin-reference.rule.d.ts +28 -0
  162. package/rules/mixin-reference.rule.d.ts.map +1 -0
  163. package/rules/mixin-reference.rule.js +104 -0
  164. package/rules/mixin-reference.rule.js.map +1 -0
  165. package/rules/naming-convention.rule.d.ts +29 -0
  166. package/rules/naming-convention.rule.d.ts.map +1 -0
  167. package/rules/naming-convention.rule.js +112 -0
  168. package/rules/naming-convention.rule.js.map +1 -0
  169. package/rules/nested-depth.rule.d.ts +42 -0
  170. package/rules/nested-depth.rule.d.ts.map +1 -0
  171. package/rules/nested-depth.rule.js +72 -0
  172. package/rules/nested-depth.rule.js.map +1 -0
  173. package/rules/required-includes.rule.d.ts +60 -0
  174. package/rules/required-includes.rule.d.ts.map +1 -0
  175. package/rules/required-includes.rule.js +118 -0
  176. package/rules/required-includes.rule.js.map +1 -0
  177. package/rules/rule-options.d.ts +158 -0
  178. package/rules/rule-options.d.ts.map +1 -0
  179. package/rules/rule-options.js +89 -0
  180. package/rules/rule-options.js.map +1 -0
  181. package/rules/value-consistency.rule.d.ts +17 -0
  182. package/rules/value-consistency.rule.d.ts.map +1 -0
  183. package/rules/value-consistency.rule.js +69 -0
  184. package/rules/value-consistency.rule.js.map +1 -0
  185. package/rules/value-schema.rule.d.ts +18 -0
  186. package/rules/value-schema.rule.d.ts.map +1 -0
  187. package/rules/value-schema.rule.js +108 -0
  188. package/rules/value-schema.rule.js.map +1 -0
  189. package/rules/value-type.rule.d.ts +71 -0
  190. package/rules/value-type.rule.d.ts.map +1 -0
  191. package/rules/value-type.rule.js +176 -0
  192. package/rules/value-type.rule.js.map +1 -0
  193. package/utils.d.ts +55 -0
  194. package/utils.d.ts.map +1 -0
  195. package/utils.js +125 -0
  196. package/utils.js.map +1 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ ## 0.0.231 (2026-03-14)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **cli:** integrate CliParser for improved argument parsing and build scripts ([23b1773dce](https://github.com/RueDeRennes/mosaik/commit/23b1773dce))
6
+ - **cli:** implement Prisma Seeds CLI with argument configuration and commands ([d7d3ab6ff9](https://github.com/RueDeRennes/mosaik/commit/d7d3ab6ff9))
7
+ - **token-linter:** enhance rule options with detailed interfaces and functions ([396600ab78](https://github.com/RueDeRennes/mosaik/commit/396600ab78))
8
+ - **buttons): add ripple prop to button components and related updates feat(components): implement ripple behavior in various components fix(theme:** remove duplicate ripple property in theme JSON files ([d31f695f82](https://github.com/RueDeRennes/mosaik/commit/d31f695f82))
9
+ - **McpToolRegistrar): add overview and framework guide tools with enhanced descriptions feat(package:** update dependencies across multiple packages to latest versions ([45bc8fb4f6](https://github.com/RueDeRennes/mosaik/commit/45bc8fb4f6))
10
+ - **Button, Banner:** add shadow properties and update related styles and tokens ([5d69398b19](https://github.com/RueDeRennes/mosaik/commit/5d69398b19))
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 andre.wehlert
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # @breadstone-infrastructure/token-linter
2
+
3
+ A configurable, extensible linter for **Style Dictionary** token JSON files. Validates structure, consistency, naming, and values across themes.
4
+
5
+ ## Features
6
+
7
+ - **14 built-in rules** covering structural, quality, and formatting concerns
8
+ - **Config-file driven** — place a `tokenlinter.config.mjs` in your project
9
+ - **Rule severity overrides** — set rules to `error`, `warning`, `info`, or `off`
10
+ - **Auto-fix support** — fixable rules (alphabetical sort, missing includes) can write corrections
11
+ - **Multiple reporters** — console (colored), JSON (CI), summary (compact)
12
+ - **Extensible** — register custom rules via the public `IRule` interface
13
+ - **Standalone** — usable as a library, CLI, or via Nx executor
14
+
15
+ ## Usage
16
+
17
+ ### Config file (`tokenlinter.config.mjs`)
18
+
19
+ ```js
20
+ import { defineConfig } from '@breadstone-infrastructure/token-linter';
21
+
22
+ export default defineConfig({
23
+ themes: ['joy', 'memphis', 'cosmopolitan'],
24
+ tokensDir: 'tokens/themes',
25
+ mixinsDir: 'tokens/mixins',
26
+ reporter: 'console',
27
+ rules: {
28
+ 'forbidden-value': 'warning',
29
+ 'empty-json': 'off',
30
+ },
31
+ ruleOptions: {
32
+ 'forbidden-key': { keys: ['transition', 'shadow'], themes: ['memphis'] },
33
+ 'nested-depth': { maxDepth: 3 },
34
+ },
35
+ });
36
+ ```
37
+
38
+ ### Nx Executor
39
+
40
+ ```jsonc
41
+ {
42
+ "token-lint": {
43
+ "executor": "@breadstone-infrastructure/nx-tasks:token-linter",
44
+ "options": {
45
+ "configFile": "tokenlinter.config.mjs"
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ## Built-in Rules
52
+
53
+ | Rule | Default Severity | Fixable | Description |
54
+ |---|---|---|---|
55
+ | `component-presence` | error | — | All themes contain the same component files |
56
+ | `key-consistency` | error | — | Same keys per component across themes |
57
+ | `includes-consistency` | warning | — | `$includes` arrays match across themes |
58
+ | `missing-includes` | warning | ✓ | All files have a `$includes` field |
59
+ | `empty-json` | warning | — | No empty token files |
60
+ | `forbidden-value` | warning | — | No forbidden values (unset, 0px, all) |
61
+ | `forbidden-key` | warning | — | No forbidden keys (configurable) |
62
+ | `naming-convention` | warning | — | camelCase token keys |
63
+ | `value-schema` | info | — | Values match CSS patterns |
64
+ | `value-consistency` | info | — | var() vs hardcoded drift detection |
65
+ | `duplicate-value` | info | — | Duplicate values that could be shared |
66
+ | `nested-depth` | warning | — | Max nesting depth enforcement |
67
+ | `mixin-reference` | error | — | `$includes` refs point to real mixins |
68
+ | `alphabetical-sort` | warning | ✓ | Keys sorted alphabetically |
69
+
70
+ ## License
71
+
72
+ MIT
package/cli/Cli.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { Program } from '@breadstone-infrastructure/utilities';
2
+ import { type ICliArgsConfig } from './CliArgsConfig.js';
3
+ /**
4
+ * @description Token Linter CLI application.
5
+ * @public
6
+ */
7
+ export declare class Cli extends Program<ICliArgsConfig> {
8
+ constructor();
9
+ }
10
+ //# sourceMappingURL=Cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAE/D,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMlF;;;GAGG;AACH,qBAAa,GAAI,SAAQ,OAAO,CAAC,cAAc,CAAC;;CA2B/C"}
package/cli/Cli.js ADDED
@@ -0,0 +1,32 @@
1
+ // #region Imports
2
+ import { Program } from '@breadstone-infrastructure/utilities';
3
+ import { CLI_ARGS } from './CliArgs.js';
4
+ import { DEFAULT_CLI_ARGS_CONFIG } from './CliArgsConfig.js';
5
+ import { LintCommand } from './commands/LintCommand.js';
6
+ import { DEFAULT_LINT_COMMAND_ARGS_CONFIG } from './commands/LintCommandArgsConfig.js';
7
+ // #endregion
8
+ /**
9
+ * @description Token Linter CLI application.
10
+ * @public
11
+ */
12
+ export class Cli extends Program {
13
+ // #region Ctor
14
+ constructor() {
15
+ super({
16
+ moduleName: 'token-linter',
17
+ prog: 'token-linter',
18
+ description: 'Token Linter — A configurable linter for Style Dictionary token JSON files.',
19
+ version: '@@VERSION',
20
+ addHelp: true,
21
+ debug: true,
22
+ });
23
+ this.config
24
+ .assign(DEFAULT_CLI_ARGS_CONFIG);
25
+ this.args
26
+ .register(...CLI_ARGS);
27
+ const lintCtorFn = () => [DEFAULT_LINT_COMMAND_ARGS_CONFIG];
28
+ this.commands
29
+ .register('lint', LintCommand, lintCtorFn);
30
+ }
31
+ }
32
+ //# sourceMappingURL=Cli.js.map
package/cli/Cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAuB,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAEvF,aAAa;AAEb;;;GAGG;AACH,MAAM,OAAO,GAAI,SAAQ,OAAuB;IAE5C,eAAe;IAEf;QACI,KAAK,CAAC;YACF,UAAU,EAAE,cAAc;YAC1B,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,6EAA6E;YAC1F,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM;aACN,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI;aACJ,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;QAE3B,MAAM,UAAU,GAAoD,GAAG,EAAE,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAE7G,IAAI,CAAC,QAAQ;aACR,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;CAGJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CliArgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliArgs.d.ts","sourceRoot":"","sources":["../../src/cli/CliArgs.ts"],"names":[],"mappings":""}
package/cli/CliArgs.js ADDED
@@ -0,0 +1,88 @@
1
+ // #region Imports
2
+ import { Boolean } from '@breadstone-infrastructure/utilities';
3
+ import { DEFAULT_CLI_ARGS_CONFIG } from './CliArgsConfig.js';
4
+ // #endregion
5
+ // #region Arguments
6
+ /**
7
+ * @description Enables auto-fix for fixable rule violations.
8
+ * @internal
9
+ */
10
+ export const FIX_ARG = {
11
+ alias: ['-f', '--fix'],
12
+ options: {
13
+ type: (value) => Boolean.parse(value),
14
+ required: false,
15
+ default: DEFAULT_CLI_ARGS_CONFIG.fix,
16
+ metavar: 'boolean',
17
+ help: 'Enables auto-fix for fixable rule violations.',
18
+ },
19
+ };
20
+ /**
21
+ * @description Enables verbose logging output.
22
+ * @internal
23
+ */
24
+ export const VERBOSE_ARG = {
25
+ alias: ['-v', '--verbose'],
26
+ options: {
27
+ type: (value) => Boolean.parse(value),
28
+ required: false,
29
+ default: DEFAULT_CLI_ARGS_CONFIG.verbose,
30
+ metavar: 'boolean',
31
+ help: 'Enables verbose logging output.',
32
+ },
33
+ };
34
+ /**
35
+ * @description Enables interactive mode for rule resolution.
36
+ * @internal
37
+ */
38
+ export const INTERACTIVE_ARG = {
39
+ alias: ['-i', '--interactive'],
40
+ options: {
41
+ type: (value) => Boolean.parse(value),
42
+ required: false,
43
+ default: DEFAULT_CLI_ARGS_CONFIG.interactive,
44
+ metavar: 'boolean',
45
+ help: 'Enables interactive mode for rule resolution.',
46
+ },
47
+ };
48
+ /**
49
+ * @description Sets the reporter type for output formatting.
50
+ * @internal
51
+ */
52
+ export const REPORTER_ARG = {
53
+ alias: ['-r', '--reporter'],
54
+ options: {
55
+ required: false,
56
+ default: DEFAULT_CLI_ARGS_CONFIG.reporter,
57
+ metavar: 'string',
58
+ help: 'Sets the reporter type (console, json, summary).',
59
+ },
60
+ };
61
+ /**
62
+ * @description Sets the current working directory.
63
+ * @internal
64
+ */
65
+ export const CWD_ARG = {
66
+ alias: ['-c', '--cwd'],
67
+ options: {
68
+ required: false,
69
+ default: DEFAULT_CLI_ARGS_CONFIG.cwd,
70
+ metavar: 'string',
71
+ help: 'Specifies the current working directory for config discovery.',
72
+ },
73
+ };
74
+ // #endregion
75
+ // #region Exports
76
+ /**
77
+ * @description Aggregate export for all CLI arguments.
78
+ * @internal
79
+ */
80
+ export const CLI_ARGS = [
81
+ FIX_ARG,
82
+ VERBOSE_ARG,
83
+ INTERACTIVE_ARG,
84
+ REPORTER_ARG,
85
+ CWD_ARG,
86
+ ];
87
+ // #endregion
88
+ //# sourceMappingURL=CliArgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliArgs.js","sourceRoot":"","sources":["../../src/cli/CliArgs.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,OAAO,EAAoB,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,aAAa;AAEb,oBAAoB;AAEpB;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAgB;IAChC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE;QACL,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB,CAAC,GAAG;QACpC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,+CAA+C;KACxD;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB;IACpC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE;QACL,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB,CAAC,OAAO;QACxC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,iCAAiC;KAC1C;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgB;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC;IAC9B,OAAO,EAAE;QACL,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB,CAAC,WAAW;QAC5C,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,+CAA+C;KACxD;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgB;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB,CAAC,QAAQ;QACzC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,kDAAkD;KAC3D;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAgB;IAChC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB,CAAC,GAAG;QACpC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,+DAA+D;KACxE;CACJ,CAAC;AAEF,aAAa;AAEb,kBAAkB;AAElB;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,OAAO;IACP,WAAW;IACX,eAAe;IACf,YAAY;IACZ,OAAO;CACV,CAAC;AAEF,aAAa"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CliArgsConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliArgsConfig.d.ts","sourceRoot":"","sources":["../../src/cli/CliArgsConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @description Default CLI argument values.
3
+ * @internal
4
+ */
5
+ export const DEFAULT_CLI_ARGS_CONFIG = {
6
+ fix: false,
7
+ verbose: false,
8
+ interactive: false,
9
+ reporter: 'console',
10
+ cwd: process.cwd(),
11
+ };
12
+ //# sourceMappingURL=CliArgsConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliArgsConfig.js","sourceRoot":"","sources":["../../src/cli/CliArgsConfig.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACnD,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,KAAK;IAClB,QAAQ,EAAE,SAAS;IACnB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;CACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CliRun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliRun.d.ts","sourceRoot":"","sources":["../../src/cli/CliRun.ts"],"names":[],"mappings":""}
package/cli/CliRun.js ADDED
@@ -0,0 +1,34 @@
1
+ // #region Imports
2
+ import { ConsoleLogger } from '@breadstone-infrastructure/utilities';
3
+ import { Cli } from './Cli.js';
4
+ // #endregion
5
+ const logger = new ConsoleLogger();
6
+ /**
7
+ * @description Bootstrap the Token Linter CLI.
8
+ * @internal
9
+ */
10
+ (async () => {
11
+ const catchAction = (error) => {
12
+ logger.error(String(error));
13
+ };
14
+ let cli = null;
15
+ try {
16
+ cli = new Cli();
17
+ }
18
+ catch (error) {
19
+ catchAction(error);
20
+ return;
21
+ }
22
+ try {
23
+ await cli.init();
24
+ }
25
+ catch (error) {
26
+ catchAction(error);
27
+ return;
28
+ }
29
+ await cli.run();
30
+ })().catch((error) => {
31
+ logger.error(error);
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=CliRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CliRun.js","sourceRoot":"","sources":["../../src/cli/CliRun.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,aAAa;AAEb,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AAEnC;;;GAGG;AACH,CAAC,KAAK,IAAI,EAAE;IACR,MAAM,WAAW,GAAG,CAAC,KAAY,EAAQ,EAAE;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,IAAI,GAAG,GAAe,IAAI,CAAC;IAC3B,IAAI,CAAC;QACD,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,WAAW,CAAC,KAAc,CAAC,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,WAAW,CAAC,KAAc,CAAC,CAAC;QAC5B,OAAO;IACX,CAAC;IAED,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LintCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LintCommand.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/LintCommand.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ // #region Imports
2
+ import { ProgramCommandBase } from '@breadstone-infrastructure/utilities';
3
+ import { TokenLinterOrchestrator } from '../../orchestration/TokenLinterOrchestrator.js';
4
+ import { DEFAULT_LINT_COMMAND_ARGS_CONFIG, LINT_COMMAND_ARGS } from './LintCommandArgsConfig.js';
5
+ // #endregion
6
+ /**
7
+ * @description CLI command that executes the token linter.
8
+ * @internal
9
+ */
10
+ export class LintCommand extends ProgramCommandBase {
11
+ // #region Fields
12
+ _orchestrator;
13
+ // #endregion
14
+ // #region Ctor
15
+ constructor(config) {
16
+ super(config);
17
+ this._orchestrator = new TokenLinterOrchestrator();
18
+ }
19
+ // #endregion
20
+ // #region Properties
21
+ get name() {
22
+ return 'lint';
23
+ }
24
+ get args() {
25
+ return LINT_COMMAND_ARGS;
26
+ }
27
+ // #endregion
28
+ // #region Methods
29
+ configure(config) {
30
+ return Object.assign(this.config, DEFAULT_LINT_COMMAND_ARGS_CONFIG, super.configure(config));
31
+ }
32
+ async execute() {
33
+ const rootPath = this.config.cwd || process.cwd();
34
+ const overrides = {};
35
+ if (this.config.fix) {
36
+ overrides['fix'] = true;
37
+ }
38
+ if (this.config.verbose) {
39
+ overrides['verbose'] = true;
40
+ }
41
+ if (this.config.interactive) {
42
+ overrides['interactive'] = true;
43
+ }
44
+ if (this.config.reporter && this.config.reporter !== 'console') {
45
+ overrides['reporter'] = this.config.reporter;
46
+ }
47
+ if (this.config.tokensDir) {
48
+ overrides['tokensDir'] = this.config.tokensDir;
49
+ }
50
+ if (this.config.mixinsDir) {
51
+ overrides['mixinsDir'] = this.config.mixinsDir;
52
+ }
53
+ const hasOverrides = Object.keys(overrides).length > 0;
54
+ const result = hasOverrides
55
+ ? await this._orchestrator.executeWithOverrides(rootPath, overrides)
56
+ : await this._orchestrator.executeFromConfig(rootPath);
57
+ if (result.totalErrors > 0) {
58
+ return {
59
+ canceled: true,
60
+ error: Object.assign(new Error(`Token linting failed with ${result.totalErrors} error(s).`), { code: 1 }),
61
+ };
62
+ }
63
+ return { canceled: false, result };
64
+ }
65
+ }
66
+ //# sourceMappingURL=LintCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LintCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/LintCommand.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAoB,kBAAkB,EAA6B,MAAM,sCAAsC,CAAC;AAEvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,gCAAgC,EAA+B,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE9H,aAAa;AAEb;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,kBAA0C;IAEvE,iBAAiB;IAEA,aAAa,CAA0B;IAExD,aAAa;IAEb,eAAe;IAEf,YAAmB,MAA8B;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,aAAa,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACvD,CAAC;IAED,aAAa;IAEb,qBAAqB;IAErB,IAAW,IAAI;QACX,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED,aAAa;IAEb,kBAAkB;IAEF,SAAS,CAAC,MAA8B;QACpD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACjG,CAAC;IAEe,KAAK,CAAC,OAAO;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElD,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAClB,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1B,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC7D,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACnD,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,YAAY;YACvB,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC;YACpE,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO;gBACH,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,WAAW,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;aAC5G,CAAC;QACN,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;CAGJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LintCommandArgsConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LintCommandArgsConfig.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/LintCommandArgsConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ // #region Imports
2
+ import { DEFAULT_CLI_ARGS_CONFIG } from '../CliArgsConfig.js';
3
+ /**
4
+ * @description Default lint command argument values.
5
+ * @internal
6
+ */
7
+ export const DEFAULT_LINT_COMMAND_ARGS_CONFIG = {
8
+ ...DEFAULT_CLI_ARGS_CONFIG,
9
+ tokensDir: '',
10
+ mixinsDir: '',
11
+ };
12
+ /**
13
+ * @description Argument to override the tokens directory.
14
+ * @internal
15
+ */
16
+ export const TOKENS_DIR_ARG = {
17
+ alias: ['-t', '--tokens-dir'],
18
+ options: {
19
+ required: false,
20
+ default: DEFAULT_LINT_COMMAND_ARGS_CONFIG.tokensDir,
21
+ metavar: 'string',
22
+ help: 'Overrides the tokens directory from the config file.',
23
+ },
24
+ };
25
+ /**
26
+ * @description Argument to override the mixins directory.
27
+ * @internal
28
+ */
29
+ export const MIXINS_DIR_ARG = {
30
+ alias: ['-m', '--mixins-dir'],
31
+ options: {
32
+ required: false,
33
+ default: DEFAULT_LINT_COMMAND_ARGS_CONFIG.mixinsDir,
34
+ metavar: 'string',
35
+ help: 'Overrides the mixins directory from the config file.',
36
+ },
37
+ };
38
+ /**
39
+ * @description All lint command specific arguments.
40
+ * @internal
41
+ */
42
+ export const LINT_COMMAND_ARGS = [
43
+ TOKENS_DIR_ARG,
44
+ MIXINS_DIR_ARG,
45
+ ];
46
+ //# sourceMappingURL=LintCommandArgsConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LintCommandArgsConfig.js","sourceRoot":"","sources":["../../../src/cli/commands/LintCommandArgsConfig.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAGlB,OAAO,EAAE,uBAAuB,EAAuB,MAAM,qBAAqB,CAAC;AAanF;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAA2B;IACpE,GAAG,uBAAuB;IAC1B,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;CAChB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,gCAAgC,CAAC,SAAS;QACnD,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,sDAAsD;KAC/D;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC;IAC7B,OAAO,EAAE;QACL,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,gCAAgC,CAAC,SAAS;QACnD,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,sDAAsD;KAC/D;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACjD,cAAc;IACd,cAAc;CACjB,CAAC"}
package/cli/lint.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":""}
package/cli/lint.js ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ // #region Imports
3
+ import { ConsoleLogger } from '@breadstone-infrastructure/utilities';
4
+ import { TokenLinterOrchestrator } from '../orchestration/TokenLinterOrchestrator.js';
5
+ // #endregion
6
+ /**
7
+ * @description CLI entry point for the token linter.
8
+ *
9
+ * Usage:
10
+ * token-linter [rootPath]
11
+ *
12
+ * Options:
13
+ * --fix Auto-fix fixable rule violations
14
+ * --verbose Enable verbose logging
15
+ *
16
+ * The CLI discovers a `tokenlinter.config.mjs` file in the given root path (default: cwd).
17
+ */
18
+ async function main() {
19
+ const logger = new ConsoleLogger();
20
+ const args = process.argv.slice(2);
21
+ // Parse flags
22
+ const fix = args.includes('--fix');
23
+ const verbose = args.includes('--verbose');
24
+ // Parse root path (first non-flag argument, default to cwd)
25
+ const rootPath = args.find(arg => !arg.startsWith('--')) ?? process.cwd();
26
+ const orchestrator = new TokenLinterOrchestrator(logger);
27
+ try {
28
+ const result = await orchestrator.executeFromConfig(rootPath);
29
+ // Override fix/verbose from CLI flags if provided
30
+ if (fix || verbose) {
31
+ const { TokenLinterConfigDiscovery } = await import('../config/TokenLinterConfigDiscovery.js');
32
+ const discovery = new TokenLinterConfigDiscovery();
33
+ const config = await discovery.discover(rootPath);
34
+ const mergedConfig = {
35
+ ...config,
36
+ fix: fix || config.fix,
37
+ verbose: verbose || config.verbose,
38
+ };
39
+ const overrideResult = await orchestrator.execute(rootPath, mergedConfig);
40
+ if (overrideResult.totalErrors > 0) {
41
+ process.exit(1);
42
+ }
43
+ return;
44
+ }
45
+ if (result.totalErrors > 0) {
46
+ process.exit(1);
47
+ }
48
+ }
49
+ catch (error) {
50
+ logger.error(`Token Linter failed: ${error.message}`);
51
+ process.exit(1);
52
+ }
53
+ }
54
+ main();
55
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":";AAEA,kBAAkB;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAEtF,aAAa;AAEb;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,IAAI;IACf,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,cAAc;IACd,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE3C,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1E,MAAM,YAAY,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE9D,kDAAkD;QAClD,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACjB,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;YAC/F,MAAM,SAAS,GAAG,IAAI,0BAA0B,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAElD,MAAM,YAAY,GAAG;gBACjB,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG;gBACtB,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO;aACrC,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAE1E,IAAI,cAAc,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YAED,OAAO;QACX,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ITokenLinterConfig } from '../models/token-linter-config.js';
2
+ /**
3
+ * @description Discovers and loads `tokenlinter.config.mjs` files from a given root path.
4
+ * @public
5
+ */
6
+ export declare class TokenLinterConfigDiscovery {
7
+ private static readonly _CONFIG_FILE_NAME;
8
+ private readonly _fs;
9
+ constructor();
10
+ /**
11
+ * @description Discovers and loads the token linter config from the given root path.
12
+ */
13
+ discover(rootPath: string): Promise<ITokenLinterConfig>;
14
+ private loadConfig;
15
+ }
16
+ //# sourceMappingURL=TokenLinterConfigDiscovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenLinterConfigDiscovery.d.ts","sourceRoot":"","sources":["../../src/config/TokenLinterConfigDiscovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAI3E;;;GAGG;AACH,qBAAa,0BAA0B;IAInC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;;IAcjC;;OAEG;IACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAatD,UAAU;CAiB3B"}
@@ -0,0 +1,44 @@
1
+ // #region Imports
2
+ import { FileSystem } from '@breadstone-infrastructure/utilities';
3
+ // #endregion
4
+ /**
5
+ * @description Discovers and loads `tokenlinter.config.mjs` files from a given root path.
6
+ * @public
7
+ */
8
+ export class TokenLinterConfigDiscovery {
9
+ // #region Fields
10
+ static _CONFIG_FILE_NAME = 'tokenlinter.config.mjs';
11
+ _fs;
12
+ // #endregion
13
+ // #region Ctor
14
+ constructor() {
15
+ this._fs = new FileSystem();
16
+ }
17
+ // #endregion
18
+ // #region Methods
19
+ /**
20
+ * @description Discovers and loads the token linter config from the given root path.
21
+ */
22
+ async discover(rootPath) {
23
+ const configPath = this._fs.pathCombine(rootPath, TokenLinterConfigDiscovery._CONFIG_FILE_NAME);
24
+ if (!this._fs.fileExists(configPath)) {
25
+ throw new Error(`No token linter config file found at: ${configPath}. ` +
26
+ `Create a '${TokenLinterConfigDiscovery._CONFIG_FILE_NAME}' file in your project root.`);
27
+ }
28
+ return this.loadConfig(configPath);
29
+ }
30
+ async loadConfig(configPath) {
31
+ const resolvedPath = this._fs.pathResolve(configPath);
32
+ if (!resolvedPath.endsWith('.mjs')) {
33
+ throw new Error(`Unsupported config file format: '${configPath}'. Only .mjs files are supported.`);
34
+ }
35
+ try {
36
+ const moduleResult = await import(resolvedPath);
37
+ return moduleResult.default || moduleResult;
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Failed to load token linter config from ${resolvedPath}: ${error}`);
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=TokenLinterConfigDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenLinterConfigDiscovery.js","sourceRoot":"","sources":["../../src/config/TokenLinterConfigDiscovery.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGlE,aAAa;AAEb;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAEnC,iBAAiB;IAET,MAAM,CAAU,iBAAiB,GAAG,wBAAwB,CAAC;IACpD,GAAG,CAAa;IAEjC,aAAa;IAEb,eAAe;IAEf;QACI,IAAI,CAAC,GAAG,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,aAAa;IAEb,kBAAkB;IAElB;;OAEG;IACI,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;QAEhG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACX,yCAAyC,UAAU,IAAI;gBACvD,aAAa,0BAA0B,CAAC,iBAAiB,8BAA8B,CAC1F,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,UAAkB;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,mCAAmC,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAEhD,OAAO,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;QACzF,CAAC;IACL,CAAC"}