@flagshark/core 1.0.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.
- package/dist/detection/config-adapter.d.ts +16 -0
- package/dist/detection/config-adapter.d.ts.map +1 -0
- package/dist/detection/config-adapter.js +60 -0
- package/dist/detection/config-adapter.js.map +1 -0
- package/dist/detection/detectors/cpp.d.ts +17 -0
- package/dist/detection/detectors/cpp.d.ts.map +1 -0
- package/dist/detection/detectors/cpp.js +113 -0
- package/dist/detection/detectors/cpp.js.map +1 -0
- package/dist/detection/detectors/csharp.d.ts +17 -0
- package/dist/detection/detectors/csharp.d.ts.map +1 -0
- package/dist/detection/detectors/csharp.js +258 -0
- package/dist/detection/detectors/csharp.js.map +1 -0
- package/dist/detection/detectors/go.d.ts +17 -0
- package/dist/detection/detectors/go.d.ts.map +1 -0
- package/dist/detection/detectors/go.js +319 -0
- package/dist/detection/detectors/go.js.map +1 -0
- package/dist/detection/detectors/index.d.ts +14 -0
- package/dist/detection/detectors/index.d.ts.map +1 -0
- package/dist/detection/detectors/index.js +14 -0
- package/dist/detection/detectors/index.js.map +1 -0
- package/dist/detection/detectors/java.d.ts +17 -0
- package/dist/detection/detectors/java.d.ts.map +1 -0
- package/dist/detection/detectors/java.js +264 -0
- package/dist/detection/detectors/java.js.map +1 -0
- package/dist/detection/detectors/javascript.d.ts +18 -0
- package/dist/detection/detectors/javascript.d.ts.map +1 -0
- package/dist/detection/detectors/javascript.js +32 -0
- package/dist/detection/detectors/javascript.js.map +1 -0
- package/dist/detection/detectors/kotlin.d.ts +17 -0
- package/dist/detection/detectors/kotlin.d.ts.map +1 -0
- package/dist/detection/detectors/kotlin.js +210 -0
- package/dist/detection/detectors/kotlin.js.map +1 -0
- package/dist/detection/detectors/objectivec.d.ts +17 -0
- package/dist/detection/detectors/objectivec.d.ts.map +1 -0
- package/dist/detection/detectors/objectivec.js +244 -0
- package/dist/detection/detectors/objectivec.js.map +1 -0
- package/dist/detection/detectors/php.d.ts +17 -0
- package/dist/detection/detectors/php.d.ts.map +1 -0
- package/dist/detection/detectors/php.js +210 -0
- package/dist/detection/detectors/php.js.map +1 -0
- package/dist/detection/detectors/python.d.ts +17 -0
- package/dist/detection/detectors/python.d.ts.map +1 -0
- package/dist/detection/detectors/python.js +284 -0
- package/dist/detection/detectors/python.js.map +1 -0
- package/dist/detection/detectors/ruby.d.ts +17 -0
- package/dist/detection/detectors/ruby.d.ts.map +1 -0
- package/dist/detection/detectors/ruby.js +259 -0
- package/dist/detection/detectors/ruby.js.map +1 -0
- package/dist/detection/detectors/rust.d.ts +17 -0
- package/dist/detection/detectors/rust.d.ts.map +1 -0
- package/dist/detection/detectors/rust.js +159 -0
- package/dist/detection/detectors/rust.js.map +1 -0
- package/dist/detection/detectors/swift.d.ts +17 -0
- package/dist/detection/detectors/swift.d.ts.map +1 -0
- package/dist/detection/detectors/swift.js +229 -0
- package/dist/detection/detectors/swift.js.map +1 -0
- package/dist/detection/detectors/typescript.d.ts +17 -0
- package/dist/detection/detectors/typescript.d.ts.map +1 -0
- package/dist/detection/detectors/typescript.js +350 -0
- package/dist/detection/detectors/typescript.js.map +1 -0
- package/dist/detection/feature-flag.d.ts +16 -0
- package/dist/detection/feature-flag.d.ts.map +1 -0
- package/dist/detection/feature-flag.js +2 -0
- package/dist/detection/feature-flag.js.map +1 -0
- package/dist/detection/helpers.d.ts +51 -0
- package/dist/detection/helpers.d.ts.map +1 -0
- package/dist/detection/helpers.js +266 -0
- package/dist/detection/helpers.js.map +1 -0
- package/dist/detection/index.d.ts +19 -0
- package/dist/detection/index.d.ts.map +1 -0
- package/dist/detection/index.js +53 -0
- package/dist/detection/index.js.map +1 -0
- package/dist/detection/interface.d.ts +76 -0
- package/dist/detection/interface.d.ts.map +1 -0
- package/dist/detection/interface.js +25 -0
- package/dist/detection/interface.js.map +1 -0
- package/dist/detection/polyglot-analyzer.d.ts +83 -0
- package/dist/detection/polyglot-analyzer.d.ts.map +1 -0
- package/dist/detection/polyglot-analyzer.js +245 -0
- package/dist/detection/polyglot-analyzer.js.map +1 -0
- package/dist/detection/registry.d.ts +31 -0
- package/dist/detection/registry.d.ts.map +1 -0
- package/dist/detection/registry.js +68 -0
- package/dist/detection/registry.js.map +1 -0
- package/dist/detection/yaml-config.d.ts +333 -0
- package/dist/detection/yaml-config.d.ts.map +1 -0
- package/dist/detection/yaml-config.js +215 -0
- package/dist/detection/yaml-config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/scan-repo.d.ts +67 -0
- package/dist/scan-repo.d.ts.map +1 -0
- package/dist/scan-repo.js +55 -0
- package/dist/scan-repo.js.map +1 -0
- package/dist/scanner.d.ts +18 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +108 -0
- package/dist/scanner.js.map +1 -0
- package/dist/staleness.d.ts +30 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +217 -0
- package/dist/staleness.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML Config -- .flagshark.yml config file parsing with Zod validation.
|
|
3
|
+
* Ported from Go: internal/config/flagconfig.go + internal/processor/yaml_config_integration.go
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
export declare const SupportedLanguageSchema: z.ZodEnum<["go", "typescript", "javascript", "python", "java", "kotlin", "swift", "ruby", "csharp", "php", "rust", "cpp", "objc", "all"]>;
|
|
7
|
+
export type SupportedLanguage = z.infer<typeof SupportedLanguageSchema>;
|
|
8
|
+
export declare const ValidReturnTypes: readonly ["boolean", "string", "integer", "float", "json"];
|
|
9
|
+
export declare const MethodConfigSchema: z.ZodObject<{
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
flag_key_index: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
context_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
13
|
+
min_params: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
14
|
+
examples: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
15
|
+
return_type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["", "boolean", "string", "integer", "float", "json"]>>>;
|
|
16
|
+
default_value_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
name: string;
|
|
19
|
+
flag_key_index: number;
|
|
20
|
+
context_index: number;
|
|
21
|
+
min_params: number;
|
|
22
|
+
examples: string[];
|
|
23
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
24
|
+
default_value_index: number;
|
|
25
|
+
}, {
|
|
26
|
+
name: string;
|
|
27
|
+
flag_key_index?: number | undefined;
|
|
28
|
+
context_index?: number | undefined;
|
|
29
|
+
min_params?: number | undefined;
|
|
30
|
+
examples?: string[] | undefined;
|
|
31
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
32
|
+
default_value_index?: number | undefined;
|
|
33
|
+
}>;
|
|
34
|
+
export type MethodConfig = z.infer<typeof MethodConfigSchema>;
|
|
35
|
+
export declare const FeatureFlagProviderSchema: z.ZodObject<{
|
|
36
|
+
name: z.ZodString;
|
|
37
|
+
languages: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<["go", "typescript", "javascript", "python", "java", "kotlin", "swift", "ruby", "csharp", "php", "rust", "cpp", "objc", "all"]>, "many">>>;
|
|
38
|
+
import_pattern: z.ZodDefault<z.ZodString>;
|
|
39
|
+
methods: z.ZodArray<z.ZodObject<{
|
|
40
|
+
name: z.ZodString;
|
|
41
|
+
flag_key_index: z.ZodDefault<z.ZodNumber>;
|
|
42
|
+
context_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
43
|
+
min_params: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
44
|
+
examples: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
45
|
+
return_type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["", "boolean", "string", "integer", "float", "json"]>>>;
|
|
46
|
+
default_value_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
47
|
+
}, "strip", z.ZodTypeAny, {
|
|
48
|
+
name: string;
|
|
49
|
+
flag_key_index: number;
|
|
50
|
+
context_index: number;
|
|
51
|
+
min_params: number;
|
|
52
|
+
examples: string[];
|
|
53
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
54
|
+
default_value_index: number;
|
|
55
|
+
}, {
|
|
56
|
+
name: string;
|
|
57
|
+
flag_key_index?: number | undefined;
|
|
58
|
+
context_index?: number | undefined;
|
|
59
|
+
min_params?: number | undefined;
|
|
60
|
+
examples?: string[] | undefined;
|
|
61
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
62
|
+
default_value_index?: number | undefined;
|
|
63
|
+
}>, "many">;
|
|
64
|
+
import_aliases: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
65
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
66
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
name: string;
|
|
69
|
+
languages: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[];
|
|
70
|
+
import_pattern: string;
|
|
71
|
+
methods: {
|
|
72
|
+
name: string;
|
|
73
|
+
flag_key_index: number;
|
|
74
|
+
context_index: number;
|
|
75
|
+
min_params: number;
|
|
76
|
+
examples: string[];
|
|
77
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
78
|
+
default_value_index: number;
|
|
79
|
+
}[];
|
|
80
|
+
import_aliases: string[];
|
|
81
|
+
description: string;
|
|
82
|
+
enabled: boolean;
|
|
83
|
+
}, {
|
|
84
|
+
name: string;
|
|
85
|
+
methods: {
|
|
86
|
+
name: string;
|
|
87
|
+
flag_key_index?: number | undefined;
|
|
88
|
+
context_index?: number | undefined;
|
|
89
|
+
min_params?: number | undefined;
|
|
90
|
+
examples?: string[] | undefined;
|
|
91
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
92
|
+
default_value_index?: number | undefined;
|
|
93
|
+
}[];
|
|
94
|
+
languages?: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[] | undefined;
|
|
95
|
+
import_pattern?: string | undefined;
|
|
96
|
+
import_aliases?: string[] | undefined;
|
|
97
|
+
description?: string | undefined;
|
|
98
|
+
enabled?: boolean | undefined;
|
|
99
|
+
}>;
|
|
100
|
+
export type FeatureFlagProvider = z.infer<typeof FeatureFlagProviderSchema>;
|
|
101
|
+
export declare const GlobalConfigSchema: z.ZodObject<{
|
|
102
|
+
enable_fallback_detection: z.ZodDefault<z.ZodBoolean>;
|
|
103
|
+
strict_import_matching: z.ZodDefault<z.ZodBoolean>;
|
|
104
|
+
custom_patterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
105
|
+
}, "strip", z.ZodTypeAny, {
|
|
106
|
+
enable_fallback_detection: boolean;
|
|
107
|
+
strict_import_matching: boolean;
|
|
108
|
+
custom_patterns: string[];
|
|
109
|
+
}, {
|
|
110
|
+
enable_fallback_detection?: boolean | undefined;
|
|
111
|
+
strict_import_matching?: boolean | undefined;
|
|
112
|
+
custom_patterns?: string[] | undefined;
|
|
113
|
+
}>;
|
|
114
|
+
export type GlobalConfig = z.infer<typeof GlobalConfigSchema>;
|
|
115
|
+
export declare const FeatureFlagConfigSchema: z.ZodObject<{
|
|
116
|
+
version: z.ZodString;
|
|
117
|
+
providers: z.ZodArray<z.ZodObject<{
|
|
118
|
+
name: z.ZodString;
|
|
119
|
+
languages: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<["go", "typescript", "javascript", "python", "java", "kotlin", "swift", "ruby", "csharp", "php", "rust", "cpp", "objc", "all"]>, "many">>>;
|
|
120
|
+
import_pattern: z.ZodDefault<z.ZodString>;
|
|
121
|
+
methods: z.ZodArray<z.ZodObject<{
|
|
122
|
+
name: z.ZodString;
|
|
123
|
+
flag_key_index: z.ZodDefault<z.ZodNumber>;
|
|
124
|
+
context_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
125
|
+
min_params: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
126
|
+
examples: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
127
|
+
return_type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["", "boolean", "string", "integer", "float", "json"]>>>;
|
|
128
|
+
default_value_index: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
129
|
+
}, "strip", z.ZodTypeAny, {
|
|
130
|
+
name: string;
|
|
131
|
+
flag_key_index: number;
|
|
132
|
+
context_index: number;
|
|
133
|
+
min_params: number;
|
|
134
|
+
examples: string[];
|
|
135
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
136
|
+
default_value_index: number;
|
|
137
|
+
}, {
|
|
138
|
+
name: string;
|
|
139
|
+
flag_key_index?: number | undefined;
|
|
140
|
+
context_index?: number | undefined;
|
|
141
|
+
min_params?: number | undefined;
|
|
142
|
+
examples?: string[] | undefined;
|
|
143
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
144
|
+
default_value_index?: number | undefined;
|
|
145
|
+
}>, "many">;
|
|
146
|
+
import_aliases: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
147
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
148
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
149
|
+
}, "strip", z.ZodTypeAny, {
|
|
150
|
+
name: string;
|
|
151
|
+
languages: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[];
|
|
152
|
+
import_pattern: string;
|
|
153
|
+
methods: {
|
|
154
|
+
name: string;
|
|
155
|
+
flag_key_index: number;
|
|
156
|
+
context_index: number;
|
|
157
|
+
min_params: number;
|
|
158
|
+
examples: string[];
|
|
159
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
160
|
+
default_value_index: number;
|
|
161
|
+
}[];
|
|
162
|
+
import_aliases: string[];
|
|
163
|
+
description: string;
|
|
164
|
+
enabled: boolean;
|
|
165
|
+
}, {
|
|
166
|
+
name: string;
|
|
167
|
+
methods: {
|
|
168
|
+
name: string;
|
|
169
|
+
flag_key_index?: number | undefined;
|
|
170
|
+
context_index?: number | undefined;
|
|
171
|
+
min_params?: number | undefined;
|
|
172
|
+
examples?: string[] | undefined;
|
|
173
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
174
|
+
default_value_index?: number | undefined;
|
|
175
|
+
}[];
|
|
176
|
+
languages?: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[] | undefined;
|
|
177
|
+
import_pattern?: string | undefined;
|
|
178
|
+
import_aliases?: string[] | undefined;
|
|
179
|
+
description?: string | undefined;
|
|
180
|
+
enabled?: boolean | undefined;
|
|
181
|
+
}>, "many">;
|
|
182
|
+
global_settings: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
183
|
+
enable_fallback_detection: z.ZodDefault<z.ZodBoolean>;
|
|
184
|
+
strict_import_matching: z.ZodDefault<z.ZodBoolean>;
|
|
185
|
+
custom_patterns: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
186
|
+
}, "strip", z.ZodTypeAny, {
|
|
187
|
+
enable_fallback_detection: boolean;
|
|
188
|
+
strict_import_matching: boolean;
|
|
189
|
+
custom_patterns: string[];
|
|
190
|
+
}, {
|
|
191
|
+
enable_fallback_detection?: boolean | undefined;
|
|
192
|
+
strict_import_matching?: boolean | undefined;
|
|
193
|
+
custom_patterns?: string[] | undefined;
|
|
194
|
+
}>>>;
|
|
195
|
+
}, "strip", z.ZodTypeAny, {
|
|
196
|
+
version: string;
|
|
197
|
+
providers: {
|
|
198
|
+
name: string;
|
|
199
|
+
languages: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[];
|
|
200
|
+
import_pattern: string;
|
|
201
|
+
methods: {
|
|
202
|
+
name: string;
|
|
203
|
+
flag_key_index: number;
|
|
204
|
+
context_index: number;
|
|
205
|
+
min_params: number;
|
|
206
|
+
examples: string[];
|
|
207
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
208
|
+
default_value_index: number;
|
|
209
|
+
}[];
|
|
210
|
+
import_aliases: string[];
|
|
211
|
+
description: string;
|
|
212
|
+
enabled: boolean;
|
|
213
|
+
}[];
|
|
214
|
+
global_settings: {
|
|
215
|
+
enable_fallback_detection: boolean;
|
|
216
|
+
strict_import_matching: boolean;
|
|
217
|
+
custom_patterns: string[];
|
|
218
|
+
};
|
|
219
|
+
}, {
|
|
220
|
+
version: string;
|
|
221
|
+
providers: {
|
|
222
|
+
name: string;
|
|
223
|
+
methods: {
|
|
224
|
+
name: string;
|
|
225
|
+
flag_key_index?: number | undefined;
|
|
226
|
+
context_index?: number | undefined;
|
|
227
|
+
min_params?: number | undefined;
|
|
228
|
+
examples?: string[] | undefined;
|
|
229
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
230
|
+
default_value_index?: number | undefined;
|
|
231
|
+
}[];
|
|
232
|
+
languages?: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[] | undefined;
|
|
233
|
+
import_pattern?: string | undefined;
|
|
234
|
+
import_aliases?: string[] | undefined;
|
|
235
|
+
description?: string | undefined;
|
|
236
|
+
enabled?: boolean | undefined;
|
|
237
|
+
}[];
|
|
238
|
+
global_settings?: {
|
|
239
|
+
enable_fallback_detection?: boolean | undefined;
|
|
240
|
+
strict_import_matching?: boolean | undefined;
|
|
241
|
+
custom_patterns?: string[] | undefined;
|
|
242
|
+
} | undefined;
|
|
243
|
+
}>;
|
|
244
|
+
export type FeatureFlagConfig = z.infer<typeof FeatureFlagConfigSchema>;
|
|
245
|
+
export interface TreeSitterFeatureFlagConfig {
|
|
246
|
+
packagePath: string;
|
|
247
|
+
interfaceName: string;
|
|
248
|
+
methodNames: string[];
|
|
249
|
+
keyParameterIndex: number;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Parses and validates a raw YAML config object (already parsed from YAML string).
|
|
253
|
+
* Returns a validated FeatureFlagConfig or throws a ZodError.
|
|
254
|
+
*/
|
|
255
|
+
export declare function parseConfig(raw: unknown): FeatureFlagConfig;
|
|
256
|
+
/**
|
|
257
|
+
* Safely parses a raw config object, returning success/error result.
|
|
258
|
+
*/
|
|
259
|
+
export declare function safeParseConfig(raw: unknown): z.SafeParseReturnType<{
|
|
260
|
+
version: string;
|
|
261
|
+
providers: {
|
|
262
|
+
name: string;
|
|
263
|
+
methods: {
|
|
264
|
+
name: string;
|
|
265
|
+
flag_key_index?: number | undefined;
|
|
266
|
+
context_index?: number | undefined;
|
|
267
|
+
min_params?: number | undefined;
|
|
268
|
+
examples?: string[] | undefined;
|
|
269
|
+
return_type?: "" | "string" | "boolean" | "integer" | "float" | "json" | undefined;
|
|
270
|
+
default_value_index?: number | undefined;
|
|
271
|
+
}[];
|
|
272
|
+
languages?: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[] | undefined;
|
|
273
|
+
import_pattern?: string | undefined;
|
|
274
|
+
import_aliases?: string[] | undefined;
|
|
275
|
+
description?: string | undefined;
|
|
276
|
+
enabled?: boolean | undefined;
|
|
277
|
+
}[];
|
|
278
|
+
global_settings?: {
|
|
279
|
+
enable_fallback_detection?: boolean | undefined;
|
|
280
|
+
strict_import_matching?: boolean | undefined;
|
|
281
|
+
custom_patterns?: string[] | undefined;
|
|
282
|
+
} | undefined;
|
|
283
|
+
}, {
|
|
284
|
+
version: string;
|
|
285
|
+
providers: {
|
|
286
|
+
name: string;
|
|
287
|
+
languages: ("go" | "typescript" | "javascript" | "python" | "java" | "kotlin" | "swift" | "ruby" | "csharp" | "php" | "rust" | "cpp" | "objc" | "all")[];
|
|
288
|
+
import_pattern: string;
|
|
289
|
+
methods: {
|
|
290
|
+
name: string;
|
|
291
|
+
flag_key_index: number;
|
|
292
|
+
context_index: number;
|
|
293
|
+
min_params: number;
|
|
294
|
+
examples: string[];
|
|
295
|
+
return_type: "" | "string" | "boolean" | "integer" | "float" | "json";
|
|
296
|
+
default_value_index: number;
|
|
297
|
+
}[];
|
|
298
|
+
import_aliases: string[];
|
|
299
|
+
description: string;
|
|
300
|
+
enabled: boolean;
|
|
301
|
+
}[];
|
|
302
|
+
global_settings: {
|
|
303
|
+
enable_fallback_detection: boolean;
|
|
304
|
+
strict_import_matching: boolean;
|
|
305
|
+
custom_patterns: string[];
|
|
306
|
+
};
|
|
307
|
+
}>;
|
|
308
|
+
/** Returns the effective return type for a method, defaulting to "boolean". */
|
|
309
|
+
export declare function getMethodReturnType(method: MethodConfig): string;
|
|
310
|
+
/** Returns the effective default value index (-1 when unset). */
|
|
311
|
+
export declare function getMethodDefaultValueIndex(method: MethodConfig): number;
|
|
312
|
+
/** Checks if a provider applies to a given language. */
|
|
313
|
+
export declare function providerAppliesToLanguage(provider: FeatureFlagProvider, lang: SupportedLanguage): boolean;
|
|
314
|
+
/** Returns only the enabled providers from a config. */
|
|
315
|
+
export declare function getEnabledProviders(config: FeatureFlagConfig): FeatureFlagProvider[];
|
|
316
|
+
/** Returns enabled providers for a specific language. */
|
|
317
|
+
export declare function getProvidersForLanguage(config: FeatureFlagConfig, lang: SupportedLanguage): FeatureFlagProvider[];
|
|
318
|
+
/** Converts a FeatureFlagConfig to tree-sitter configs. */
|
|
319
|
+
export declare function toTreeSitterConfigs(config: FeatureFlagConfig): TreeSitterFeatureFlagConfig[];
|
|
320
|
+
/** Converts config to tree-sitter configs for a specific language. */
|
|
321
|
+
export declare function toTreeSitterConfigsForLanguage(config: FeatureFlagConfig, lang: SupportedLanguage): TreeSitterFeatureFlagConfig[];
|
|
322
|
+
/** Merges new providers into an existing config (mutates). */
|
|
323
|
+
export declare function mergeProviders(config: FeatureFlagConfig, newProviders: FeatureFlagProvider[]): void;
|
|
324
|
+
/**
|
|
325
|
+
* Lints a config for potential misconfigurations.
|
|
326
|
+
* Returns non-fatal warnings (unlike parse which throws on errors).
|
|
327
|
+
*/
|
|
328
|
+
export declare function lintConfig(config: FeatureFlagConfig): string[];
|
|
329
|
+
/**
|
|
330
|
+
* Known config file locations to search for auto-detection.
|
|
331
|
+
*/
|
|
332
|
+
export declare const CONFIG_FILE_LOCATIONS: readonly [".flagshark.yaml", ".flagshark.yml", "flagshark.yaml", "flagshark.yml", ".github/flagshark.yaml", ".github/flagshark.yml", "config/flagshark.yaml", "config/flagshark.yml", ".config/flagshark.yaml", ".config/flagshark.yml"];
|
|
333
|
+
//# sourceMappingURL=yaml-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-config.d.ts","sourceRoot":"","sources":["../../src/detection/yaml-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,uBAAuB,2IAelC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAEvE,eAAO,MAAM,gBAAgB,4DAA6D,CAAA;AAE1F,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAW7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQpC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQlC,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAIvE,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAE3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAE3C;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEhE;AAED,iEAAiE;AACjE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAKvE;AAED,wDAAwD;AACxD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAKT;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,EAAE,CAEpF;AAED,yDAAyD;AACzD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,iBAAiB,GACtB,mBAAmB,EAAE,CAEvB;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,2BAA2B,EAAE,CAmB5F;AAED,sEAAsE;AACtE,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,iBAAiB,GACtB,2BAA2B,EAAE,CAmB/B;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,CAC5B,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,mBAAmB,EAAE,GAClC,IAAI,CAcN;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAsD9D;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,0OAWxB,CAAA"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAML Config -- .flagshark.yml config file parsing with Zod validation.
|
|
3
|
+
* Ported from Go: internal/config/flagconfig.go + internal/processor/yaml_config_integration.go
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// -- Zod schemas --
|
|
7
|
+
export const SupportedLanguageSchema = z.enum([
|
|
8
|
+
'go',
|
|
9
|
+
'typescript',
|
|
10
|
+
'javascript',
|
|
11
|
+
'python',
|
|
12
|
+
'java',
|
|
13
|
+
'kotlin',
|
|
14
|
+
'swift',
|
|
15
|
+
'ruby',
|
|
16
|
+
'csharp',
|
|
17
|
+
'php',
|
|
18
|
+
'rust',
|
|
19
|
+
'cpp',
|
|
20
|
+
'objc',
|
|
21
|
+
'all',
|
|
22
|
+
]);
|
|
23
|
+
export const ValidReturnTypes = ['boolean', 'string', 'integer', 'float', 'json'];
|
|
24
|
+
export const MethodConfigSchema = z.object({
|
|
25
|
+
name: z.string().min(1, 'name is required'),
|
|
26
|
+
flag_key_index: z.number().int().min(-1).default(0),
|
|
27
|
+
context_index: z.number().int().optional().default(0),
|
|
28
|
+
min_params: z.number().int().nonnegative().optional().default(0),
|
|
29
|
+
examples: z.array(z.string()).optional().default([]),
|
|
30
|
+
return_type: z
|
|
31
|
+
.enum(['', ...ValidReturnTypes])
|
|
32
|
+
.optional()
|
|
33
|
+
.default(''),
|
|
34
|
+
default_value_index: z.number().int().nonnegative().optional().default(0),
|
|
35
|
+
});
|
|
36
|
+
export const FeatureFlagProviderSchema = z.object({
|
|
37
|
+
name: z.string().min(1, 'name is required'),
|
|
38
|
+
languages: z.array(SupportedLanguageSchema).optional().default([]),
|
|
39
|
+
import_pattern: z.string().default(''),
|
|
40
|
+
methods: z.array(MethodConfigSchema).min(1, 'at least one method must be configured'),
|
|
41
|
+
import_aliases: z.array(z.string()).optional().default([]),
|
|
42
|
+
description: z.string().optional().default(''),
|
|
43
|
+
enabled: z.boolean().default(true),
|
|
44
|
+
});
|
|
45
|
+
export const GlobalConfigSchema = z.object({
|
|
46
|
+
enable_fallback_detection: z.boolean().default(false),
|
|
47
|
+
strict_import_matching: z.boolean().default(false),
|
|
48
|
+
custom_patterns: z.array(z.string()).optional().default([]),
|
|
49
|
+
});
|
|
50
|
+
export const FeatureFlagConfigSchema = z.object({
|
|
51
|
+
version: z.string().min(1, 'version is required'),
|
|
52
|
+
providers: z.array(FeatureFlagProviderSchema).min(1, 'at least one provider must be configured'),
|
|
53
|
+
global_settings: GlobalConfigSchema.optional().default({
|
|
54
|
+
enable_fallback_detection: false,
|
|
55
|
+
strict_import_matching: false,
|
|
56
|
+
custom_patterns: [],
|
|
57
|
+
}),
|
|
58
|
+
});
|
|
59
|
+
// -- Functions --
|
|
60
|
+
/**
|
|
61
|
+
* Parses and validates a raw YAML config object (already parsed from YAML string).
|
|
62
|
+
* Returns a validated FeatureFlagConfig or throws a ZodError.
|
|
63
|
+
*/
|
|
64
|
+
export function parseConfig(raw) {
|
|
65
|
+
return FeatureFlagConfigSchema.parse(raw);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Safely parses a raw config object, returning success/error result.
|
|
69
|
+
*/
|
|
70
|
+
export function safeParseConfig(raw) {
|
|
71
|
+
return FeatureFlagConfigSchema.safeParse(raw);
|
|
72
|
+
}
|
|
73
|
+
/** Returns the effective return type for a method, defaulting to "boolean". */
|
|
74
|
+
export function getMethodReturnType(method) {
|
|
75
|
+
return method.return_type || 'boolean';
|
|
76
|
+
}
|
|
77
|
+
/** Returns the effective default value index (-1 when unset). */
|
|
78
|
+
export function getMethodDefaultValueIndex(method) {
|
|
79
|
+
if ((method.default_value_index ?? 0) === 0 && !method.return_type) {
|
|
80
|
+
return -1;
|
|
81
|
+
}
|
|
82
|
+
return method.default_value_index ?? 0;
|
|
83
|
+
}
|
|
84
|
+
/** Checks if a provider applies to a given language. */
|
|
85
|
+
export function providerAppliesToLanguage(provider, lang) {
|
|
86
|
+
if (provider.languages.length === 0) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return provider.languages.includes('all') || provider.languages.includes(lang);
|
|
90
|
+
}
|
|
91
|
+
/** Returns only the enabled providers from a config. */
|
|
92
|
+
export function getEnabledProviders(config) {
|
|
93
|
+
return config.providers.filter((p) => p.enabled);
|
|
94
|
+
}
|
|
95
|
+
/** Returns enabled providers for a specific language. */
|
|
96
|
+
export function getProvidersForLanguage(config, lang) {
|
|
97
|
+
return config.providers.filter((p) => p.enabled && providerAppliesToLanguage(p, lang));
|
|
98
|
+
}
|
|
99
|
+
/** Converts a FeatureFlagConfig to tree-sitter configs. */
|
|
100
|
+
export function toTreeSitterConfigs(config) {
|
|
101
|
+
const configs = [];
|
|
102
|
+
for (const provider of getEnabledProviders(config)) {
|
|
103
|
+
for (const method of provider.methods) {
|
|
104
|
+
if (method.flag_key_index < 0) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
configs.push({
|
|
108
|
+
packagePath: provider.import_pattern,
|
|
109
|
+
interfaceName: provider.name,
|
|
110
|
+
methodNames: [method.name],
|
|
111
|
+
keyParameterIndex: method.flag_key_index,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return configs;
|
|
116
|
+
}
|
|
117
|
+
/** Converts config to tree-sitter configs for a specific language. */
|
|
118
|
+
export function toTreeSitterConfigsForLanguage(config, lang) {
|
|
119
|
+
const configs = [];
|
|
120
|
+
for (const provider of getProvidersForLanguage(config, lang)) {
|
|
121
|
+
for (const method of provider.methods) {
|
|
122
|
+
if (method.flag_key_index < 0) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
configs.push({
|
|
126
|
+
packagePath: provider.import_pattern,
|
|
127
|
+
interfaceName: provider.name,
|
|
128
|
+
methodNames: [method.name],
|
|
129
|
+
keyParameterIndex: method.flag_key_index,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return configs;
|
|
134
|
+
}
|
|
135
|
+
/** Merges new providers into an existing config (mutates). */
|
|
136
|
+
export function mergeProviders(config, newProviders) {
|
|
137
|
+
const existing = new Map();
|
|
138
|
+
for (let i = 0; i < config.providers.length; i++) {
|
|
139
|
+
existing.set(config.providers[i].import_pattern, i);
|
|
140
|
+
}
|
|
141
|
+
for (const newProvider of newProviders) {
|
|
142
|
+
const idx = existing.get(newProvider.import_pattern);
|
|
143
|
+
if (idx !== undefined) {
|
|
144
|
+
config.providers[idx] = newProvider;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
config.providers.push(newProvider);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Lints a config for potential misconfigurations.
|
|
153
|
+
* Returns non-fatal warnings (unlike parse which throws on errors).
|
|
154
|
+
*/
|
|
155
|
+
export function lintConfig(config) {
|
|
156
|
+
const warnings = [];
|
|
157
|
+
const nonBooleanHints = {
|
|
158
|
+
string: 'string',
|
|
159
|
+
int: 'integer',
|
|
160
|
+
float: 'float',
|
|
161
|
+
double: 'float',
|
|
162
|
+
json: 'json',
|
|
163
|
+
variant: 'string',
|
|
164
|
+
value: 'string',
|
|
165
|
+
payload: 'json',
|
|
166
|
+
config: 'json',
|
|
167
|
+
};
|
|
168
|
+
for (const provider of config.providers) {
|
|
169
|
+
if (!provider.enabled) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
for (const method of provider.methods) {
|
|
173
|
+
if (method.flag_key_index < 0) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (method.return_type) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const nameLower = method.name.toLowerCase();
|
|
180
|
+
// Skip clearly boolean methods
|
|
181
|
+
if (nameLower.includes('enabled') ||
|
|
182
|
+
nameLower.includes('isbool') ||
|
|
183
|
+
nameLower.startsWith('is_') ||
|
|
184
|
+
(nameLower.startsWith('is') &&
|
|
185
|
+
method.name.length > 2 &&
|
|
186
|
+
method.name[2] >= 'A' &&
|
|
187
|
+
method.name[2] <= 'Z')) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
for (const [hint, expectedType] of Object.entries(nonBooleanHints)) {
|
|
191
|
+
if (nameLower.includes(hint)) {
|
|
192
|
+
warnings.push(`${provider.name}: method "${method.name}" may return ${expectedType} but has no return_type set (defaults to boolean)`);
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return warnings;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Known config file locations to search for auto-detection.
|
|
202
|
+
*/
|
|
203
|
+
export const CONFIG_FILE_LOCATIONS = [
|
|
204
|
+
'.flagshark.yaml',
|
|
205
|
+
'.flagshark.yml',
|
|
206
|
+
'flagshark.yaml',
|
|
207
|
+
'flagshark.yml',
|
|
208
|
+
'.github/flagshark.yaml',
|
|
209
|
+
'.github/flagshark.yml',
|
|
210
|
+
'config/flagshark.yaml',
|
|
211
|
+
'config/flagshark.yml',
|
|
212
|
+
'.config/flagshark.yaml',
|
|
213
|
+
'.config/flagshark.yml',
|
|
214
|
+
];
|
|
215
|
+
//# sourceMappingURL=yaml-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-config.js","sourceRoot":"","sources":["../../src/detection/yaml-config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './detection/index.js';
|
|
2
|
+
export { analyzeStaleness } from './staleness.js';
|
|
3
|
+
export type { StaleFlag, StalenessOptions, StalenessSignal } from './staleness.js';
|
|
4
|
+
export { collectFiles } from './scanner.js';
|
|
5
|
+
export type { ScanOptions } from './scanner.js';
|
|
6
|
+
export { scanRepo } from './scan-repo.js';
|
|
7
|
+
export type { ScanRepoOptions, ScanRepoResult, ScanLogger } from './scan-repo.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,sBAAsB,CAAA;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGlF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Re-export the entire detection module
|
|
2
|
+
export * from './detection/index.js';
|
|
3
|
+
// Re-export staleness analysis
|
|
4
|
+
export { analyzeStaleness } from './staleness.js';
|
|
5
|
+
// Re-export scanner (low-level file collection)
|
|
6
|
+
export { collectFiles } from './scanner.js';
|
|
7
|
+
// Re-export scanRepo orchestrator
|
|
8
|
+
export { scanRepo } from './scan-repo.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,cAAc,sBAAsB,CAAA;AAEpC,+BAA+B;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGjD,gDAAgD;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,kCAAkC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level orchestrator: walk the repo, detect flags, analyse staleness,
|
|
3
|
+
* return a single result object that consumers can render however they like.
|
|
4
|
+
*/
|
|
5
|
+
import type { StaleFlag } from './staleness.js';
|
|
6
|
+
export interface ScanLogger {
|
|
7
|
+
debug: (...args: unknown[]) => void;
|
|
8
|
+
info: (...args: unknown[]) => void;
|
|
9
|
+
warn: (...args: unknown[]) => void;
|
|
10
|
+
error: (...args: unknown[]) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface ScanRepoOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Absolute path to the repository being scanned. Typically `process.cwd()`,
|
|
15
|
+
* but can be a different directory when scanning a path other than where
|
|
16
|
+
* the consumer process was started.
|
|
17
|
+
*/
|
|
18
|
+
cwd: string;
|
|
19
|
+
/**
|
|
20
|
+
* Staleness threshold in months. A flag is considered stale if its
|
|
21
|
+
* git-blame age exceeds this value. Default: 6.
|
|
22
|
+
*/
|
|
23
|
+
threshold?: number;
|
|
24
|
+
/**
|
|
25
|
+
* If set, only scan files changed since this git ref (e.g., `HEAD~1`,
|
|
26
|
+
* `origin/main`). Otherwise, walk the entire `cwd` tree.
|
|
27
|
+
*/
|
|
28
|
+
diff?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Optional cancellation signal. Aborting cancels file *analysis* (the
|
|
31
|
+
* detection phase). It does NOT cancel staleness analysis (`git blame`
|
|
32
|
+
* subprocesses), which always runs to completion once started.
|
|
33
|
+
*/
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
/**
|
|
36
|
+
* Optional logger for debug/info/warn/error messages. Defaults to a no-op.
|
|
37
|
+
*/
|
|
38
|
+
logger?: ScanLogger;
|
|
39
|
+
}
|
|
40
|
+
export interface ScanRepoResult {
|
|
41
|
+
/** Total count of unique flag names detected across the repository. */
|
|
42
|
+
totalFlags: number;
|
|
43
|
+
/** Number of source files actually read and analyzed. */
|
|
44
|
+
filesScanned: number;
|
|
45
|
+
/**
|
|
46
|
+
* Flags that tripped at least one staleness signal (age, low-usage, etc.).
|
|
47
|
+
* One entry per stale flag occurrence; a single flag name may appear
|
|
48
|
+
* multiple times if found in multiple locations.
|
|
49
|
+
*/
|
|
50
|
+
staleFlags: StaleFlag[];
|
|
51
|
+
/**
|
|
52
|
+
* Unique provider identifiers detected (e.g., `launchdarkly-node-server-sdk`,
|
|
53
|
+
* `posthog-node`). Order is undefined.
|
|
54
|
+
*/
|
|
55
|
+
detectedProviders: string[];
|
|
56
|
+
/** Map of language identifier (e.g. `typescript`, `go`) to file count. */
|
|
57
|
+
languageBreakdown: Record<string, number>;
|
|
58
|
+
/**
|
|
59
|
+
* 0–100. Calculated as `100 - round((unique stale names / totalFlags) * 100)`.
|
|
60
|
+
* Returns 100 for repos with no flags detected.
|
|
61
|
+
*/
|
|
62
|
+
healthScore: number;
|
|
63
|
+
/** Wall-clock duration of the scan in milliseconds. */
|
|
64
|
+
scanDuration: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function scanRepo(opts: ScanRepoOptions): Promise<ScanRepoResult>;
|
|
67
|
+
//# sourceMappingURL=scan-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-repo.d.ts","sourceRoot":"","sources":["../src/scan-repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAA;IAElB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,UAAU,EAAE,SAAS,EAAE,CAAA;IAEvB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAE3B,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEzC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAA;CACrB;AASD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD7E"}
|