driftdetect-core 0.1.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 (221) hide show
  1. package/dist/analyzers/ast-analyzer.d.ts +251 -0
  2. package/dist/analyzers/ast-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/ast-analyzer.js +548 -0
  4. package/dist/analyzers/ast-analyzer.js.map +1 -0
  5. package/dist/analyzers/flow-analyzer.d.ts +241 -0
  6. package/dist/analyzers/flow-analyzer.d.ts.map +1 -0
  7. package/dist/analyzers/flow-analyzer.js +1219 -0
  8. package/dist/analyzers/flow-analyzer.js.map +1 -0
  9. package/dist/analyzers/index.d.ts +18 -0
  10. package/dist/analyzers/index.d.ts.map +1 -0
  11. package/dist/analyzers/index.js +19 -0
  12. package/dist/analyzers/index.js.map +1 -0
  13. package/dist/analyzers/semantic-analyzer.d.ts +252 -0
  14. package/dist/analyzers/semantic-analyzer.d.ts.map +1 -0
  15. package/dist/analyzers/semantic-analyzer.js +1182 -0
  16. package/dist/analyzers/semantic-analyzer.js.map +1 -0
  17. package/dist/analyzers/type-analyzer.d.ts +289 -0
  18. package/dist/analyzers/type-analyzer.d.ts.map +1 -0
  19. package/dist/analyzers/type-analyzer.js +1269 -0
  20. package/dist/analyzers/type-analyzer.js.map +1 -0
  21. package/dist/analyzers/types.d.ts +537 -0
  22. package/dist/analyzers/types.d.ts.map +1 -0
  23. package/dist/analyzers/types.js +11 -0
  24. package/dist/analyzers/types.js.map +1 -0
  25. package/dist/config/config-loader.d.ts +166 -0
  26. package/dist/config/config-loader.d.ts.map +1 -0
  27. package/dist/config/config-loader.js +429 -0
  28. package/dist/config/config-loader.js.map +1 -0
  29. package/dist/config/config-validator.d.ts +204 -0
  30. package/dist/config/config-validator.d.ts.map +1 -0
  31. package/dist/config/config-validator.js +632 -0
  32. package/dist/config/config-validator.js.map +1 -0
  33. package/dist/config/defaults.d.ts +8 -0
  34. package/dist/config/defaults.d.ts.map +1 -0
  35. package/dist/config/defaults.js +26 -0
  36. package/dist/config/defaults.js.map +1 -0
  37. package/dist/config/index.d.ts +10 -0
  38. package/dist/config/index.d.ts.map +1 -0
  39. package/dist/config/index.js +10 -0
  40. package/dist/config/index.js.map +1 -0
  41. package/dist/config/types.d.ts +47 -0
  42. package/dist/config/types.d.ts.map +1 -0
  43. package/dist/config/types.js +7 -0
  44. package/dist/config/types.js.map +1 -0
  45. package/dist/index.d.ts +37 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/manifest/exporter.d.ts +21 -0
  50. package/dist/manifest/exporter.d.ts.map +1 -0
  51. package/dist/manifest/exporter.js +339 -0
  52. package/dist/manifest/exporter.js.map +1 -0
  53. package/dist/manifest/index.d.ts +14 -0
  54. package/dist/manifest/index.d.ts.map +1 -0
  55. package/dist/manifest/index.js +15 -0
  56. package/dist/manifest/index.js.map +1 -0
  57. package/dist/manifest/manifest-store.d.ts +111 -0
  58. package/dist/manifest/manifest-store.d.ts.map +1 -0
  59. package/dist/manifest/manifest-store.js +418 -0
  60. package/dist/manifest/manifest-store.js.map +1 -0
  61. package/dist/manifest/types.d.ts +238 -0
  62. package/dist/manifest/types.d.ts.map +1 -0
  63. package/dist/manifest/types.js +11 -0
  64. package/dist/manifest/types.js.map +1 -0
  65. package/dist/matcher/confidence-scorer.d.ts +188 -0
  66. package/dist/matcher/confidence-scorer.d.ts.map +1 -0
  67. package/dist/matcher/confidence-scorer.js +302 -0
  68. package/dist/matcher/confidence-scorer.js.map +1 -0
  69. package/dist/matcher/index.d.ts +24 -0
  70. package/dist/matcher/index.d.ts.map +1 -0
  71. package/dist/matcher/index.js +26 -0
  72. package/dist/matcher/index.js.map +1 -0
  73. package/dist/matcher/outlier-detector.d.ts +252 -0
  74. package/dist/matcher/outlier-detector.d.ts.map +1 -0
  75. package/dist/matcher/outlier-detector.js +544 -0
  76. package/dist/matcher/outlier-detector.js.map +1 -0
  77. package/dist/matcher/pattern-matcher.d.ts +169 -0
  78. package/dist/matcher/pattern-matcher.d.ts.map +1 -0
  79. package/dist/matcher/pattern-matcher.js +692 -0
  80. package/dist/matcher/pattern-matcher.js.map +1 -0
  81. package/dist/matcher/types.d.ts +476 -0
  82. package/dist/matcher/types.d.ts.map +1 -0
  83. package/dist/matcher/types.js +36 -0
  84. package/dist/matcher/types.js.map +1 -0
  85. package/dist/parsers/base-parser.d.ts +282 -0
  86. package/dist/parsers/base-parser.d.ts.map +1 -0
  87. package/dist/parsers/base-parser.js +421 -0
  88. package/dist/parsers/base-parser.js.map +1 -0
  89. package/dist/parsers/css-parser.d.ts +225 -0
  90. package/dist/parsers/css-parser.d.ts.map +1 -0
  91. package/dist/parsers/css-parser.js +477 -0
  92. package/dist/parsers/css-parser.js.map +1 -0
  93. package/dist/parsers/index.d.ts +15 -0
  94. package/dist/parsers/index.d.ts.map +1 -0
  95. package/dist/parsers/index.js +15 -0
  96. package/dist/parsers/index.js.map +1 -0
  97. package/dist/parsers/json-parser.d.ts +219 -0
  98. package/dist/parsers/json-parser.d.ts.map +1 -0
  99. package/dist/parsers/json-parser.js +602 -0
  100. package/dist/parsers/json-parser.js.map +1 -0
  101. package/dist/parsers/markdown-parser.d.ts +276 -0
  102. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  103. package/dist/parsers/markdown-parser.js +731 -0
  104. package/dist/parsers/markdown-parser.js.map +1 -0
  105. package/dist/parsers/parser-manager.d.ts +294 -0
  106. package/dist/parsers/parser-manager.d.ts.map +1 -0
  107. package/dist/parsers/parser-manager.js +738 -0
  108. package/dist/parsers/parser-manager.js.map +1 -0
  109. package/dist/parsers/python-parser.d.ts +204 -0
  110. package/dist/parsers/python-parser.d.ts.map +1 -0
  111. package/dist/parsers/python-parser.js +517 -0
  112. package/dist/parsers/python-parser.js.map +1 -0
  113. package/dist/parsers/types.d.ts +43 -0
  114. package/dist/parsers/types.d.ts.map +1 -0
  115. package/dist/parsers/types.js +7 -0
  116. package/dist/parsers/types.js.map +1 -0
  117. package/dist/parsers/typescript-parser.d.ts +264 -0
  118. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  119. package/dist/parsers/typescript-parser.js +658 -0
  120. package/dist/parsers/typescript-parser.js.map +1 -0
  121. package/dist/rules/evaluator.d.ts +305 -0
  122. package/dist/rules/evaluator.d.ts.map +1 -0
  123. package/dist/rules/evaluator.js +579 -0
  124. package/dist/rules/evaluator.js.map +1 -0
  125. package/dist/rules/index.d.ts +13 -0
  126. package/dist/rules/index.d.ts.map +1 -0
  127. package/dist/rules/index.js +13 -0
  128. package/dist/rules/index.js.map +1 -0
  129. package/dist/rules/quick-fix-generator.d.ts +334 -0
  130. package/dist/rules/quick-fix-generator.d.ts.map +1 -0
  131. package/dist/rules/quick-fix-generator.js +1075 -0
  132. package/dist/rules/quick-fix-generator.js.map +1 -0
  133. package/dist/rules/rule-engine.d.ts +241 -0
  134. package/dist/rules/rule-engine.d.ts.map +1 -0
  135. package/dist/rules/rule-engine.js +585 -0
  136. package/dist/rules/rule-engine.js.map +1 -0
  137. package/dist/rules/severity-manager.d.ts +394 -0
  138. package/dist/rules/severity-manager.d.ts.map +1 -0
  139. package/dist/rules/severity-manager.js +619 -0
  140. package/dist/rules/severity-manager.js.map +1 -0
  141. package/dist/rules/types.d.ts +370 -0
  142. package/dist/rules/types.d.ts.map +1 -0
  143. package/dist/rules/types.js +133 -0
  144. package/dist/rules/types.js.map +1 -0
  145. package/dist/rules/variant-manager.d.ts +388 -0
  146. package/dist/rules/variant-manager.d.ts.map +1 -0
  147. package/dist/rules/variant-manager.js +777 -0
  148. package/dist/rules/variant-manager.js.map +1 -0
  149. package/dist/scanner/change-detector.d.ts +164 -0
  150. package/dist/scanner/change-detector.d.ts.map +1 -0
  151. package/dist/scanner/change-detector.js +263 -0
  152. package/dist/scanner/change-detector.js.map +1 -0
  153. package/dist/scanner/dependency-graph.d.ts +270 -0
  154. package/dist/scanner/dependency-graph.d.ts.map +1 -0
  155. package/dist/scanner/dependency-graph.js +436 -0
  156. package/dist/scanner/dependency-graph.js.map +1 -0
  157. package/dist/scanner/file-walker.d.ts +127 -0
  158. package/dist/scanner/file-walker.d.ts.map +1 -0
  159. package/dist/scanner/file-walker.js +526 -0
  160. package/dist/scanner/file-walker.js.map +1 -0
  161. package/dist/scanner/index.d.ts +12 -0
  162. package/dist/scanner/index.d.ts.map +1 -0
  163. package/dist/scanner/index.js +12 -0
  164. package/dist/scanner/index.js.map +1 -0
  165. package/dist/scanner/types.d.ts +218 -0
  166. package/dist/scanner/types.d.ts.map +1 -0
  167. package/dist/scanner/types.js +10 -0
  168. package/dist/scanner/types.js.map +1 -0
  169. package/dist/scanner/worker-pool.d.ts +317 -0
  170. package/dist/scanner/worker-pool.d.ts.map +1 -0
  171. package/dist/scanner/worker-pool.js +571 -0
  172. package/dist/scanner/worker-pool.js.map +1 -0
  173. package/dist/store/cache-manager.d.ts +179 -0
  174. package/dist/store/cache-manager.d.ts.map +1 -0
  175. package/dist/store/cache-manager.js +391 -0
  176. package/dist/store/cache-manager.js.map +1 -0
  177. package/dist/store/history-store.d.ts +314 -0
  178. package/dist/store/history-store.d.ts.map +1 -0
  179. package/dist/store/history-store.js +707 -0
  180. package/dist/store/history-store.js.map +1 -0
  181. package/dist/store/index.d.ts +20 -0
  182. package/dist/store/index.d.ts.map +1 -0
  183. package/dist/store/index.js +26 -0
  184. package/dist/store/index.js.map +1 -0
  185. package/dist/store/lock-file-manager.d.ts +202 -0
  186. package/dist/store/lock-file-manager.d.ts.map +1 -0
  187. package/dist/store/lock-file-manager.js +475 -0
  188. package/dist/store/lock-file-manager.js.map +1 -0
  189. package/dist/store/pattern-store.d.ts +289 -0
  190. package/dist/store/pattern-store.d.ts.map +1 -0
  191. package/dist/store/pattern-store.js +936 -0
  192. package/dist/store/pattern-store.js.map +1 -0
  193. package/dist/store/schema-validator.d.ts +159 -0
  194. package/dist/store/schema-validator.d.ts.map +1 -0
  195. package/dist/store/schema-validator.js +1096 -0
  196. package/dist/store/schema-validator.js.map +1 -0
  197. package/dist/store/types.d.ts +585 -0
  198. package/dist/store/types.d.ts.map +1 -0
  199. package/dist/store/types.js +82 -0
  200. package/dist/store/types.js.map +1 -0
  201. package/dist/types/analysis.d.ts +19 -0
  202. package/dist/types/analysis.d.ts.map +1 -0
  203. package/dist/types/analysis.js +5 -0
  204. package/dist/types/analysis.js.map +1 -0
  205. package/dist/types/common.d.ts +7 -0
  206. package/dist/types/common.d.ts.map +1 -0
  207. package/dist/types/common.js +5 -0
  208. package/dist/types/common.js.map +1 -0
  209. package/dist/types/index.d.ts +12 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +10 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/types/patterns.d.ts +40 -0
  214. package/dist/types/patterns.d.ts.map +1 -0
  215. package/dist/types/patterns.js +7 -0
  216. package/dist/types/patterns.js.map +1 -0
  217. package/dist/types/violations.d.ts +7 -0
  218. package/dist/types/violations.d.ts.map +1 -0
  219. package/dist/types/violations.js +7 -0
  220. package/dist/types/violations.js.map +1 -0
  221. package/package.json +46 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Config Loader - Configuration loading and merging
3
+ *
4
+ * Loads configuration from .drift/config.json and merges with defaults.
5
+ * Supports environment variable overrides and handles missing config gracefully.
6
+ *
7
+ * @requirements 36.1 - THE Config_System SHALL read from .drift/config.json
8
+ * @requirements 36.2 - THE Config_System SHALL support severity overrides per pattern
9
+ * @requirements 36.3 - THE Config_System SHALL support ignore patterns for files/folders
10
+ * @requirements 36.4 - THE Config_System SHALL support AI provider configuration
11
+ * @requirements 36.5 - THE Config_System SHALL support CI mode settings
12
+ */
13
+ import type { DriftConfig } from './types.js';
14
+ /**
15
+ * Error thrown when configuration loading fails
16
+ */
17
+ export declare class ConfigLoadError extends Error {
18
+ readonly filePath: string;
19
+ readonly errorCause: Error | undefined;
20
+ constructor(message: string, filePath: string, errorCause?: Error | undefined);
21
+ }
22
+ /**
23
+ * Error thrown when configuration parsing fails
24
+ */
25
+ export declare class ConfigParseError extends Error {
26
+ readonly filePath: string;
27
+ readonly errorCause: Error | undefined;
28
+ constructor(message: string, filePath: string, errorCause?: Error | undefined);
29
+ }
30
+ /**
31
+ * Configuration loader options
32
+ */
33
+ export interface ConfigLoaderOptions {
34
+ /** Root directory to search for .drift/config.json */
35
+ rootDir?: string | undefined;
36
+ /** Whether to apply environment variable overrides */
37
+ applyEnvOverrides?: boolean | undefined;
38
+ /** Whether to validate the loaded configuration */
39
+ validate?: boolean | undefined;
40
+ }
41
+ /**
42
+ * Result of loading configuration
43
+ */
44
+ export interface ConfigLoadResult {
45
+ /** The loaded and merged configuration */
46
+ config: DriftConfig;
47
+ /** Path to the config file (if found) */
48
+ configPath?: string | undefined;
49
+ /** Whether the config file was found */
50
+ configFileFound: boolean;
51
+ /** Whether environment overrides were applied */
52
+ envOverridesApplied: boolean;
53
+ }
54
+ /**
55
+ * ConfigLoader - Loads and manages Drift configuration
56
+ *
57
+ * Handles loading configuration from .drift/config.json, merging with defaults,
58
+ * and applying environment variable overrides.
59
+ *
60
+ * @requirements 36.1 - Read from .drift/config.json
61
+ * @requirements 36.2 - Support severity overrides per pattern
62
+ * @requirements 36.3 - Support ignore patterns for files/folders
63
+ * @requirements 36.4 - Support AI provider configuration
64
+ * @requirements 36.5 - Support CI mode settings
65
+ */
66
+ export declare class ConfigLoader {
67
+ private readonly rootDir;
68
+ private readonly applyEnvOverrides;
69
+ private cachedConfig;
70
+ private configPath;
71
+ constructor(options?: ConfigLoaderOptions);
72
+ /**
73
+ * Load configuration from file, merge with defaults, and apply env overrides
74
+ *
75
+ * @requirements 36.1 - Read from .drift/config.json
76
+ *
77
+ * @returns The loaded configuration result
78
+ */
79
+ load(): Promise<ConfigLoadResult>;
80
+ /**
81
+ * Get the cached configuration, loading if necessary
82
+ *
83
+ * @returns The configuration
84
+ */
85
+ getConfig(): Promise<DriftConfig>;
86
+ /**
87
+ * Reload configuration from disk
88
+ *
89
+ * @returns The reloaded configuration result
90
+ */
91
+ reload(): Promise<ConfigLoadResult>;
92
+ /**
93
+ * Check if a config file exists
94
+ *
95
+ * @returns True if config file exists
96
+ */
97
+ configFileExists(): Promise<boolean>;
98
+ /**
99
+ * Get the path to the config file
100
+ *
101
+ * @returns The config file path
102
+ */
103
+ getConfigPath(): string;
104
+ /**
105
+ * Save configuration to file
106
+ *
107
+ * @param config - Configuration to save
108
+ */
109
+ save(config: DriftConfig): Promise<void>;
110
+ /**
111
+ * Clear the cached configuration
112
+ */
113
+ clearCache(): void;
114
+ /**
115
+ * Load configuration from a JSON file
116
+ *
117
+ * @param filePath - Path to the config file
118
+ * @returns The parsed configuration
119
+ */
120
+ private loadFromFile;
121
+ /**
122
+ * Merge loaded configuration with defaults
123
+ *
124
+ * @param loaded - Loaded configuration
125
+ * @param base - Base configuration (defaults to DEFAULT_CONFIG)
126
+ * @returns Merged configuration
127
+ */
128
+ private mergeWithDefaults;
129
+ /**
130
+ * Get configuration overrides from environment variables
131
+ *
132
+ * @returns Configuration overrides from environment
133
+ */
134
+ private getEnvOverrides;
135
+ /**
136
+ * Get AI configuration overrides from environment
137
+ */
138
+ private getAIEnvOverrides;
139
+ /**
140
+ * Get CI configuration overrides from environment
141
+ */
142
+ private getCIEnvOverrides;
143
+ /**
144
+ * Get performance configuration overrides from environment
145
+ */
146
+ private getPerformanceEnvOverrides;
147
+ /**
148
+ * Get learning configuration overrides from environment
149
+ */
150
+ private getLearningEnvOverrides;
151
+ }
152
+ /**
153
+ * Load configuration with default options
154
+ *
155
+ * @param rootDir - Root directory to search for config
156
+ * @returns The loaded configuration
157
+ */
158
+ export declare function loadConfig(rootDir?: string): Promise<DriftConfig>;
159
+ /**
160
+ * Load configuration and return full result
161
+ *
162
+ * @param rootDir - Root directory to search for config
163
+ * @returns The configuration load result
164
+ */
165
+ export declare function loadConfigWithResult(rootDir?: string): Promise<ConfigLoadResult>;
166
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,YAAY,CAAC;AAwCpB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;gBAG5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,KAAK,GAAG,SAAS;CAOjC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;gBAG5C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,KAAK,GAAG,SAAS;CAOjC;AA2FD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,MAAM,EAAE,WAAW,CAAC;IACpB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,mBAAwB;IAU7C;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAiCvC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAQvC;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAKzC;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1C;;;;OAIG;IACH,aAAa,IAAI,MAAM;IAIvB;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9C;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;;;;OAKG;YACW,YAAY;IAqC1B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAqBlC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAehC;AAMD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQvE;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOtF"}
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Config Loader - Configuration loading and merging
3
+ *
4
+ * Loads configuration from .drift/config.json and merges with defaults.
5
+ * Supports environment variable overrides and handles missing config gracefully.
6
+ *
7
+ * @requirements 36.1 - THE Config_System SHALL read from .drift/config.json
8
+ * @requirements 36.2 - THE Config_System SHALL support severity overrides per pattern
9
+ * @requirements 36.3 - THE Config_System SHALL support ignore patterns for files/folders
10
+ * @requirements 36.4 - THE Config_System SHALL support AI provider configuration
11
+ * @requirements 36.5 - THE Config_System SHALL support CI mode settings
12
+ */
13
+ import * as fs from 'node:fs/promises';
14
+ import * as path from 'node:path';
15
+ import { DEFAULT_CONFIG } from './defaults.js';
16
+ // ============================================================================
17
+ // Constants
18
+ // ============================================================================
19
+ /** Directory name for drift configuration */
20
+ const DRIFT_DIR = '.drift';
21
+ /** Config file name */
22
+ const CONFIG_FILE = 'config.json';
23
+ /** Environment variable prefix for config overrides */
24
+ const ENV_PREFIX = 'DRIFT_';
25
+ /** Environment variable names for specific config options */
26
+ const ENV_VARS = {
27
+ // AI configuration
28
+ AI_PROVIDER: `${ENV_PREFIX}AI_PROVIDER`,
29
+ AI_MODEL: `${ENV_PREFIX}AI_MODEL`,
30
+ // CI configuration
31
+ CI_FAIL_ON: `${ENV_PREFIX}CI_FAIL_ON`,
32
+ CI_REPORT_FORMAT: `${ENV_PREFIX}CI_REPORT_FORMAT`,
33
+ // Performance configuration
34
+ MAX_WORKERS: `${ENV_PREFIX}MAX_WORKERS`,
35
+ CACHE_ENABLED: `${ENV_PREFIX}CACHE_ENABLED`,
36
+ INCREMENTAL_ANALYSIS: `${ENV_PREFIX}INCREMENTAL_ANALYSIS`,
37
+ // Learning configuration
38
+ AUTO_APPROVE_THRESHOLD: `${ENV_PREFIX}AUTO_APPROVE_THRESHOLD`,
39
+ MIN_OCCURRENCES: `${ENV_PREFIX}MIN_OCCURRENCES`,
40
+ };
41
+ // ============================================================================
42
+ // Error Classes
43
+ // ============================================================================
44
+ /**
45
+ * Error thrown when configuration loading fails
46
+ */
47
+ export class ConfigLoadError extends Error {
48
+ filePath;
49
+ errorCause;
50
+ constructor(message, filePath, errorCause) {
51
+ super(message);
52
+ this.name = 'ConfigLoadError';
53
+ this.filePath = filePath;
54
+ this.errorCause = errorCause;
55
+ }
56
+ }
57
+ /**
58
+ * Error thrown when configuration parsing fails
59
+ */
60
+ export class ConfigParseError extends Error {
61
+ filePath;
62
+ errorCause;
63
+ constructor(message, filePath, errorCause) {
64
+ super(message);
65
+ this.name = 'ConfigParseError';
66
+ this.filePath = filePath;
67
+ this.errorCause = errorCause;
68
+ }
69
+ }
70
+ // ============================================================================
71
+ // Helper Functions
72
+ // ============================================================================
73
+ /**
74
+ * Check if a file exists
75
+ */
76
+ async function fileExists(filePath) {
77
+ try {
78
+ await fs.access(filePath);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * Deep merge two objects, with source values overriding target values
87
+ */
88
+ function deepMerge(target, source) {
89
+ const result = { ...target };
90
+ for (const key of Object.keys(source)) {
91
+ const sourceValue = source[key];
92
+ const targetValue = target[key];
93
+ if (sourceValue === undefined) {
94
+ continue;
95
+ }
96
+ if (isPlainObject(sourceValue) &&
97
+ isPlainObject(targetValue)) {
98
+ result[key] = deepMerge(targetValue, sourceValue);
99
+ }
100
+ else {
101
+ result[key] = sourceValue;
102
+ }
103
+ }
104
+ return result;
105
+ }
106
+ /**
107
+ * Check if a value is a plain object
108
+ */
109
+ function isPlainObject(value) {
110
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
111
+ }
112
+ /**
113
+ * Parse a boolean from an environment variable string
114
+ */
115
+ function parseEnvBoolean(value) {
116
+ if (value === undefined)
117
+ return undefined;
118
+ const lower = value.toLowerCase();
119
+ if (lower === 'true' || lower === '1' || lower === 'yes')
120
+ return true;
121
+ if (lower === 'false' || lower === '0' || lower === 'no')
122
+ return false;
123
+ return undefined;
124
+ }
125
+ /**
126
+ * Parse a number from an environment variable string
127
+ */
128
+ function parseEnvNumber(value) {
129
+ if (value === undefined)
130
+ return undefined;
131
+ const num = parseFloat(value);
132
+ return isNaN(num) ? undefined : num;
133
+ }
134
+ /**
135
+ * Parse an integer from an environment variable string
136
+ */
137
+ function parseEnvInteger(value) {
138
+ if (value === undefined)
139
+ return undefined;
140
+ const num = parseInt(value, 10);
141
+ return isNaN(num) ? undefined : num;
142
+ }
143
+ /**
144
+ * ConfigLoader - Loads and manages Drift configuration
145
+ *
146
+ * Handles loading configuration from .drift/config.json, merging with defaults,
147
+ * and applying environment variable overrides.
148
+ *
149
+ * @requirements 36.1 - Read from .drift/config.json
150
+ * @requirements 36.2 - Support severity overrides per pattern
151
+ * @requirements 36.3 - Support ignore patterns for files/folders
152
+ * @requirements 36.4 - Support AI provider configuration
153
+ * @requirements 36.5 - Support CI mode settings
154
+ */
155
+ export class ConfigLoader {
156
+ rootDir;
157
+ applyEnvOverrides;
158
+ cachedConfig = null;
159
+ configPath;
160
+ constructor(options = {}) {
161
+ this.rootDir = options.rootDir ?? process.cwd();
162
+ this.applyEnvOverrides = options.applyEnvOverrides ?? true;
163
+ this.configPath = path.join(this.rootDir, DRIFT_DIR, CONFIG_FILE);
164
+ }
165
+ // ==========================================================================
166
+ // Public Methods
167
+ // ==========================================================================
168
+ /**
169
+ * Load configuration from file, merge with defaults, and apply env overrides
170
+ *
171
+ * @requirements 36.1 - Read from .drift/config.json
172
+ *
173
+ * @returns The loaded configuration result
174
+ */
175
+ async load() {
176
+ // Start with defaults
177
+ let config = { ...DEFAULT_CONFIG };
178
+ let configFileFound = false;
179
+ let envOverridesApplied = false;
180
+ // Try to load from file
181
+ if (await fileExists(this.configPath)) {
182
+ const fileConfig = await this.loadFromFile(this.configPath);
183
+ config = this.mergeWithDefaults(fileConfig);
184
+ configFileFound = true;
185
+ }
186
+ // Apply environment variable overrides
187
+ if (this.applyEnvOverrides) {
188
+ const envConfig = this.getEnvOverrides();
189
+ if (Object.keys(envConfig).length > 0) {
190
+ config = this.mergeWithDefaults(envConfig, config);
191
+ envOverridesApplied = true;
192
+ }
193
+ }
194
+ // Cache the config
195
+ this.cachedConfig = config;
196
+ return {
197
+ config,
198
+ configPath: configFileFound ? this.configPath : undefined,
199
+ configFileFound,
200
+ envOverridesApplied,
201
+ };
202
+ }
203
+ /**
204
+ * Get the cached configuration, loading if necessary
205
+ *
206
+ * @returns The configuration
207
+ */
208
+ async getConfig() {
209
+ if (this.cachedConfig) {
210
+ return this.cachedConfig;
211
+ }
212
+ const result = await this.load();
213
+ return result.config;
214
+ }
215
+ /**
216
+ * Reload configuration from disk
217
+ *
218
+ * @returns The reloaded configuration result
219
+ */
220
+ async reload() {
221
+ this.cachedConfig = null;
222
+ return this.load();
223
+ }
224
+ /**
225
+ * Check if a config file exists
226
+ *
227
+ * @returns True if config file exists
228
+ */
229
+ async configFileExists() {
230
+ return fileExists(this.configPath);
231
+ }
232
+ /**
233
+ * Get the path to the config file
234
+ *
235
+ * @returns The config file path
236
+ */
237
+ getConfigPath() {
238
+ return this.configPath;
239
+ }
240
+ /**
241
+ * Save configuration to file
242
+ *
243
+ * @param config - Configuration to save
244
+ */
245
+ async save(config) {
246
+ // Ensure .drift directory exists
247
+ const driftDir = path.dirname(this.configPath);
248
+ await fs.mkdir(driftDir, { recursive: true });
249
+ // Write config file
250
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
251
+ // Update cache
252
+ this.cachedConfig = config;
253
+ }
254
+ /**
255
+ * Clear the cached configuration
256
+ */
257
+ clearCache() {
258
+ this.cachedConfig = null;
259
+ }
260
+ // ==========================================================================
261
+ // Private Methods
262
+ // ==========================================================================
263
+ /**
264
+ * Load configuration from a JSON file
265
+ *
266
+ * @param filePath - Path to the config file
267
+ * @returns The parsed configuration
268
+ */
269
+ async loadFromFile(filePath) {
270
+ try {
271
+ const content = await fs.readFile(filePath, 'utf-8');
272
+ try {
273
+ const parsed = JSON.parse(content);
274
+ if (!isPlainObject(parsed)) {
275
+ throw new ConfigParseError('Configuration must be a JSON object', filePath);
276
+ }
277
+ return parsed;
278
+ }
279
+ catch (parseError) {
280
+ if (parseError instanceof ConfigParseError) {
281
+ throw parseError;
282
+ }
283
+ throw new ConfigParseError(`Failed to parse configuration file: ${parseError.message}`, filePath, parseError);
284
+ }
285
+ }
286
+ catch (error) {
287
+ if (error instanceof ConfigParseError) {
288
+ throw error;
289
+ }
290
+ throw new ConfigLoadError(`Failed to read configuration file: ${error.message}`, filePath, error);
291
+ }
292
+ }
293
+ /**
294
+ * Merge loaded configuration with defaults
295
+ *
296
+ * @param loaded - Loaded configuration
297
+ * @param base - Base configuration (defaults to DEFAULT_CONFIG)
298
+ * @returns Merged configuration
299
+ */
300
+ mergeWithDefaults(loaded, base = DEFAULT_CONFIG) {
301
+ return deepMerge(base, loaded);
302
+ }
303
+ /**
304
+ * Get configuration overrides from environment variables
305
+ *
306
+ * @returns Configuration overrides from environment
307
+ */
308
+ getEnvOverrides() {
309
+ const overrides = {};
310
+ // AI configuration overrides
311
+ const aiOverrides = this.getAIEnvOverrides();
312
+ if (Object.keys(aiOverrides).length > 0) {
313
+ overrides.ai = aiOverrides;
314
+ }
315
+ // CI configuration overrides
316
+ const ciOverrides = this.getCIEnvOverrides();
317
+ if (Object.keys(ciOverrides).length > 0) {
318
+ overrides.ci = ciOverrides;
319
+ }
320
+ // Performance configuration overrides
321
+ const perfOverrides = this.getPerformanceEnvOverrides();
322
+ if (Object.keys(perfOverrides).length > 0) {
323
+ overrides.performance = perfOverrides;
324
+ }
325
+ // Learning configuration overrides
326
+ const learningOverrides = this.getLearningEnvOverrides();
327
+ if (Object.keys(learningOverrides).length > 0) {
328
+ overrides.learning = learningOverrides;
329
+ }
330
+ return overrides;
331
+ }
332
+ /**
333
+ * Get AI configuration overrides from environment
334
+ */
335
+ getAIEnvOverrides() {
336
+ const overrides = {};
337
+ const provider = process.env[ENV_VARS.AI_PROVIDER];
338
+ if (provider && ['openai', 'anthropic', 'ollama'].includes(provider)) {
339
+ overrides.provider = provider;
340
+ }
341
+ const model = process.env[ENV_VARS.AI_MODEL];
342
+ if (model) {
343
+ overrides.model = model;
344
+ }
345
+ return overrides;
346
+ }
347
+ /**
348
+ * Get CI configuration overrides from environment
349
+ */
350
+ getCIEnvOverrides() {
351
+ const overrides = {};
352
+ const failOn = process.env[ENV_VARS.CI_FAIL_ON];
353
+ if (failOn && ['error', 'warning', 'none'].includes(failOn)) {
354
+ overrides.failOn = failOn;
355
+ }
356
+ const reportFormat = process.env[ENV_VARS.CI_REPORT_FORMAT];
357
+ if (reportFormat && ['json', 'text', 'github', 'gitlab'].includes(reportFormat)) {
358
+ overrides.reportFormat = reportFormat;
359
+ }
360
+ return overrides;
361
+ }
362
+ /**
363
+ * Get performance configuration overrides from environment
364
+ */
365
+ getPerformanceEnvOverrides() {
366
+ const overrides = {};
367
+ const maxWorkers = parseEnvInteger(process.env[ENV_VARS.MAX_WORKERS]);
368
+ if (maxWorkers !== undefined && maxWorkers > 0) {
369
+ overrides.maxWorkers = maxWorkers;
370
+ }
371
+ const cacheEnabled = parseEnvBoolean(process.env[ENV_VARS.CACHE_ENABLED]);
372
+ if (cacheEnabled !== undefined) {
373
+ overrides.cacheEnabled = cacheEnabled;
374
+ }
375
+ const incrementalAnalysis = parseEnvBoolean(process.env[ENV_VARS.INCREMENTAL_ANALYSIS]);
376
+ if (incrementalAnalysis !== undefined) {
377
+ overrides.incrementalAnalysis = incrementalAnalysis;
378
+ }
379
+ return overrides;
380
+ }
381
+ /**
382
+ * Get learning configuration overrides from environment
383
+ */
384
+ getLearningEnvOverrides() {
385
+ const overrides = {};
386
+ const autoApproveThreshold = parseEnvNumber(process.env[ENV_VARS.AUTO_APPROVE_THRESHOLD]);
387
+ if (autoApproveThreshold !== undefined && autoApproveThreshold >= 0 && autoApproveThreshold <= 1) {
388
+ overrides.autoApproveThreshold = autoApproveThreshold;
389
+ }
390
+ const minOccurrences = parseEnvInteger(process.env[ENV_VARS.MIN_OCCURRENCES]);
391
+ if (minOccurrences !== undefined && minOccurrences > 0) {
392
+ overrides.minOccurrences = minOccurrences;
393
+ }
394
+ return overrides;
395
+ }
396
+ }
397
+ // ============================================================================
398
+ // Convenience Functions
399
+ // ============================================================================
400
+ /**
401
+ * Load configuration with default options
402
+ *
403
+ * @param rootDir - Root directory to search for config
404
+ * @returns The loaded configuration
405
+ */
406
+ export async function loadConfig(rootDir) {
407
+ const options = {};
408
+ if (rootDir !== undefined) {
409
+ options.rootDir = rootDir;
410
+ }
411
+ const loader = new ConfigLoader(options);
412
+ const result = await loader.load();
413
+ return result.config;
414
+ }
415
+ /**
416
+ * Load configuration and return full result
417
+ *
418
+ * @param rootDir - Root directory to search for config
419
+ * @returns The configuration load result
420
+ */
421
+ export async function loadConfigWithResult(rootDir) {
422
+ const options = {};
423
+ if (rootDir !== undefined) {
424
+ options.rootDir = rootDir;
425
+ }
426
+ const loader = new ConfigLoader(options);
427
+ return loader.load();
428
+ }
429
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AASlC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,6CAA6C;AAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC;AAE3B,uBAAuB;AACvB,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,uDAAuD;AACvD,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,6DAA6D;AAC7D,MAAM,QAAQ,GAAG;IACf,mBAAmB;IACnB,WAAW,EAAE,GAAG,UAAU,aAAa;IACvC,QAAQ,EAAE,GAAG,UAAU,UAAU;IAEjC,mBAAmB;IACnB,UAAU,EAAE,GAAG,UAAU,YAAY;IACrC,gBAAgB,EAAE,GAAG,UAAU,kBAAkB;IAEjD,4BAA4B;IAC5B,WAAW,EAAE,GAAG,UAAU,aAAa;IACvC,aAAa,EAAE,GAAG,UAAU,eAAe;IAC3C,oBAAoB,EAAE,GAAG,UAAU,sBAAsB;IAEzD,yBAAyB;IACzB,sBAAsB,EAAE,GAAG,UAAU,wBAAwB;IAC7D,eAAe,EAAE,GAAG,UAAU,iBAAiB;CACvC,CAAC;AAEX,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,QAAQ,CAAS;IACjB,UAAU,CAAoB;IAE9C,YACE,OAAe,EACf,QAAgB,EAChB,UAA8B;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzB,QAAQ,CAAS;IACjB,UAAU,CAAoB;IAE9C,YACE,OAAe,EACf,QAAgB,EAChB,UAA8B;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,MAAS,EACT,MAAkB;IAElB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAO,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAmB,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IACE,aAAa,CAAC,WAAW,CAAC;YAC1B,aAAa,CAAC,WAAW,CAAC,EAC1B,CAAC;YACA,MAAkC,CAAC,GAAa,CAAC,GAAG,SAAS,CAC5D,WAAqB,EACrB,WAAqB,CACtB,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAkC,CAAC,GAAa,CAAC,GAAG,WAAW,CAAC;QACnE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACvE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAgCD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IAChB,iBAAiB,CAAU;IACpC,YAAY,GAAuB,IAAI,CAAC;IACxC,UAAU,CAAS;IAE3B,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC3D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QACR,sBAAsB;QACtB,IAAI,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;QACnC,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAEhC,wBAAwB;QACxB,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC5C,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,uCAAuC;QACvC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAE3B,OAAO;YACL,MAAM;YACN,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACzD,eAAe;YACf,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,oBAAoB;QACpB,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/B,OAAO,CACR,CAAC;QAEF,eAAe;QACf,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E;;;;;OAKG;IACK,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAErD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,gBAAgB,CACxB,qCAAqC,EACrC,QAAQ,CACT,CAAC;gBACJ,CAAC;gBAED,OAAO,MAA8B,CAAC;YACxC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,IAAI,UAAU,YAAY,gBAAgB,EAAE,CAAC;oBAC3C,MAAM,UAAU,CAAC;gBACnB,CAAC;gBACD,MAAM,IAAI,gBAAgB,CACxB,uCAAwC,UAAoB,CAAC,OAAO,EAAE,EACtE,QAAQ,EACR,UAAmB,CACpB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,eAAe,CACvB,sCAAuC,KAAe,CAAC,OAAO,EAAE,EAChE,QAAQ,EACR,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CACvB,MAA4B,EAC5B,OAAoB,cAAc;QAElC,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACK,eAAe;QACrB,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,6BAA6B;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS,CAAC,EAAE,GAAG,WAAuB,CAAC;QACzC,CAAC;QAED,6BAA6B;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS,CAAC,EAAE,GAAG,WAAuB,CAAC;QACzC,CAAC;QAED,sCAAsC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,SAAS,CAAC,WAAW,GAAG,aAAkC,CAAC;QAC7D,CAAC;QAED,mCAAmC;QACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,SAAS,CAAC,QAAQ,GAAG,iBAAmC,CAAC;QAC3D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrE,SAAS,CAAC,QAAQ,GAAG,QAAgC,CAAC;QACxD,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,MAAM,SAAS,GAAsB,EAAE,CAAC;QAExC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,SAAS,CAAC,MAAM,GAAG,MAA4B,CAAC;QAClD,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAChF,SAAS,CAAC,YAAY,GAAG,YAAwC,CAAC;QACpE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,0BAA0B;QAChC,MAAM,SAAS,GAA+B,EAAE,CAAC;QAEjD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC/C,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;QACpC,CAAC;QAED,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;QACxC,CAAC;QAED,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACxF,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,SAAS,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QACtD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,uBAAuB;QAC7B,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC1F,IAAI,oBAAoB,KAAK,SAAS,IAAI,oBAAoB,IAAI,CAAC,IAAI,oBAAoB,IAAI,CAAC,EAAE,CAAC;YACjG,SAAS,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACxD,CAAC;QAED,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9E,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvD,SAAS,CAAC,cAAc,GAAG,cAAc,CAAC;QAC5C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IACzD,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC"}