@flagshark/core 1.3.0 → 1.4.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 (157) hide show
  1. package/README.md +124 -18
  2. package/dist/config/excluder.d.ts.map +1 -1
  3. package/dist/config/excluder.js +1 -0
  4. package/dist/config/excluder.js.map +1 -1
  5. package/dist/config/loader.js +1 -0
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/schema.d.ts +25 -12
  8. package/dist/config/schema.d.ts.map +1 -1
  9. package/dist/config/schema.js +1 -0
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/detection/detectors/cpp.d.ts.map +1 -1
  12. package/dist/detection/detectors/cpp.js +6 -2
  13. package/dist/detection/detectors/cpp.js.map +1 -1
  14. package/dist/detection/detectors/go.d.ts +2 -2
  15. package/dist/detection/detectors/go.d.ts.map +1 -1
  16. package/dist/detection/detectors/javascript.d.ts +2 -2
  17. package/dist/detection/detectors/javascript.d.ts.map +1 -1
  18. package/dist/detection/detectors/javascript.js +6 -2
  19. package/dist/detection/detectors/javascript.js.map +1 -1
  20. package/dist/detection/detectors/php.d.ts.map +1 -1
  21. package/dist/detection/detectors/php.js +6 -2
  22. package/dist/detection/detectors/php.js.map +1 -1
  23. package/dist/detection/detectors/python.d.ts +2 -2
  24. package/dist/detection/detectors/python.d.ts.map +1 -1
  25. package/dist/detection/detectors/python.js +6 -2
  26. package/dist/detection/detectors/python.js.map +1 -1
  27. package/dist/detection/detectors/ruby.d.ts.map +1 -1
  28. package/dist/detection/detectors/ruby.js +7 -4
  29. package/dist/detection/detectors/ruby.js.map +1 -1
  30. package/dist/detection/detectors/typescript.d.ts +2 -2
  31. package/dist/detection/detectors/typescript.d.ts.map +1 -1
  32. package/dist/detection/detectors/typescript.js +6 -2
  33. package/dist/detection/detectors/typescript.js.map +1 -1
  34. package/dist/detection/feature-flag.d.ts.map +1 -1
  35. package/dist/detection/helpers.d.ts.map +1 -1
  36. package/dist/detection/helpers.js +11 -1
  37. package/dist/detection/helpers.js.map +1 -1
  38. package/dist/detection/index.d.ts +1 -1
  39. package/dist/detection/index.d.ts.map +1 -1
  40. package/dist/detection/interface.d.ts +2 -0
  41. package/dist/detection/interface.d.ts.map +1 -1
  42. package/dist/detection/polyglot-analyzer.d.ts.map +1 -1
  43. package/dist/detection/polyglot-analyzer.js +50 -0
  44. package/dist/detection/polyglot-analyzer.js.map +1 -1
  45. package/dist/detection/tree-sitter/const-resolver.d.ts.map +1 -1
  46. package/dist/detection/tree-sitter/const-resolver.js +2 -2
  47. package/dist/detection/tree-sitter/const-resolver.js.map +1 -1
  48. package/dist/detection/tree-sitter/engine.d.ts.map +1 -1
  49. package/dist/detection/tree-sitter/engine.js +2 -14
  50. package/dist/detection/tree-sitter/engine.js.map +1 -1
  51. package/dist/detection/tree-sitter/module-url.d.ts +25 -0
  52. package/dist/detection/tree-sitter/module-url.d.ts.map +1 -0
  53. package/dist/detection/tree-sitter/module-url.js +38 -0
  54. package/dist/detection/tree-sitter/module-url.js.map +1 -0
  55. package/dist/detection/tree-sitter/parser-cache.d.ts +4 -0
  56. package/dist/detection/tree-sitter/parser-cache.d.ts.map +1 -1
  57. package/dist/detection/tree-sitter/parser-cache.js +30 -6
  58. package/dist/detection/tree-sitter/parser-cache.js.map +1 -1
  59. package/dist/detection/tree-sitter/queries-inline.d.ts +13 -0
  60. package/dist/detection/tree-sitter/queries-inline.d.ts.map +1 -0
  61. package/dist/detection/tree-sitter/queries-inline.js +17 -0
  62. package/dist/detection/tree-sitter/queries-inline.js.map +1 -0
  63. package/dist/detection/tree-sitter/query-runner.d.ts +14 -1
  64. package/dist/detection/tree-sitter/query-runner.d.ts.map +1 -1
  65. package/dist/detection/tree-sitter/query-runner.js +28 -11
  66. package/dist/detection/tree-sitter/query-runner.js.map +1 -1
  67. package/dist/detection/yaml-config.js +2 -2
  68. package/dist/detection/yaml-config.js.map +1 -1
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +4 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/output/csv.d.ts +9 -0
  74. package/dist/output/csv.d.ts.map +1 -0
  75. package/dist/output/csv.js +31 -0
  76. package/dist/output/csv.js.map +1 -0
  77. package/dist/output/index.d.ts +8 -0
  78. package/dist/output/index.d.ts.map +1 -0
  79. package/dist/output/index.js +8 -0
  80. package/dist/output/index.js.map +1 -0
  81. package/dist/output/json.d.ts +13 -0
  82. package/dist/output/json.d.ts.map +1 -0
  83. package/dist/output/json.js +43 -0
  84. package/dist/output/json.js.map +1 -0
  85. package/dist/output/markdown.d.ts +23 -0
  86. package/dist/output/markdown.d.ts.map +1 -0
  87. package/dist/output/markdown.js +94 -0
  88. package/dist/output/markdown.js.map +1 -0
  89. package/dist/output/sarif.d.ts +16 -0
  90. package/dist/output/sarif.d.ts.map +1 -0
  91. package/dist/output/sarif.js +104 -0
  92. package/dist/output/sarif.js.map +1 -0
  93. package/dist/output/select.d.ts +23 -0
  94. package/dist/output/select.d.ts.map +1 -0
  95. package/dist/output/select.js +36 -0
  96. package/dist/output/select.js.map +1 -0
  97. package/dist/output/shared.d.ts +13 -0
  98. package/dist/output/shared.d.ts.map +1 -0
  99. package/dist/output/shared.js +28 -0
  100. package/dist/output/shared.js.map +1 -0
  101. package/dist/output/text.d.ts +11 -0
  102. package/dist/output/text.d.ts.map +1 -0
  103. package/dist/output/text.js +104 -0
  104. package/dist/output/text.js.map +1 -0
  105. package/dist/providers/cache.d.ts +28 -0
  106. package/dist/providers/cache.d.ts.map +1 -0
  107. package/dist/providers/cache.js +84 -0
  108. package/dist/providers/cache.js.map +1 -0
  109. package/dist/providers/cross-reference.d.ts +19 -0
  110. package/dist/providers/cross-reference.d.ts.map +1 -0
  111. package/dist/providers/cross-reference.js +48 -0
  112. package/dist/providers/cross-reference.js.map +1 -0
  113. package/dist/providers/index.d.ts +5 -0
  114. package/dist/providers/index.d.ts.map +1 -0
  115. package/dist/providers/index.js +4 -0
  116. package/dist/providers/index.js.map +1 -0
  117. package/dist/providers/interface.d.ts +37 -0
  118. package/dist/providers/interface.d.ts.map +1 -0
  119. package/dist/providers/interface.js +2 -0
  120. package/dist/providers/interface.js.map +1 -0
  121. package/dist/providers/launchdarkly/client.d.ts +13 -0
  122. package/dist/providers/launchdarkly/client.d.ts.map +1 -0
  123. package/dist/providers/launchdarkly/client.js +44 -0
  124. package/dist/providers/launchdarkly/client.js.map +1 -0
  125. package/dist/providers/launchdarkly/definition.d.ts +22 -0
  126. package/dist/providers/launchdarkly/definition.d.ts.map +1 -0
  127. package/dist/providers/launchdarkly/definition.js +24 -0
  128. package/dist/providers/launchdarkly/definition.js.map +1 -0
  129. package/dist/providers/launchdarkly/errors.d.ts +5 -0
  130. package/dist/providers/launchdarkly/errors.d.ts.map +1 -0
  131. package/dist/providers/launchdarkly/errors.js +9 -0
  132. package/dist/providers/launchdarkly/errors.js.map +1 -0
  133. package/dist/providers/launchdarkly/types.d.ts +154 -0
  134. package/dist/providers/launchdarkly/types.d.ts.map +1 -0
  135. package/dist/providers/launchdarkly/types.js +17 -0
  136. package/dist/providers/launchdarkly/types.js.map +1 -0
  137. package/dist/providers/orchestrate.d.ts +24 -0
  138. package/dist/providers/orchestrate.d.ts.map +1 -0
  139. package/dist/providers/orchestrate.js +44 -0
  140. package/dist/providers/orchestrate.js.map +1 -0
  141. package/dist/providers/registry.d.ts +8 -0
  142. package/dist/providers/registry.d.ts.map +1 -0
  143. package/dist/providers/registry.js +15 -0
  144. package/dist/providers/registry.js.map +1 -0
  145. package/dist/scan-repo.d.ts +2 -0
  146. package/dist/scan-repo.d.ts.map +1 -1
  147. package/dist/scan-repo.js +15 -6
  148. package/dist/scan-repo.js.map +1 -1
  149. package/dist/staleness.d.ts +4 -1
  150. package/dist/staleness.d.ts.map +1 -1
  151. package/dist/staleness.js +15 -11
  152. package/dist/staleness.js.map +1 -1
  153. package/package.json +6 -2
  154. package/dist/detection/tree-sitter/query-builder.d.ts +0 -3
  155. package/dist/detection/tree-sitter/query-builder.d.ts.map +0 -1
  156. package/dist/detection/tree-sitter/query-builder.js +0 -7
  157. package/dist/detection/tree-sitter/query-builder.js.map +0 -1
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @flagshark/core
2
2
 
3
- The detection engine behind [FlagShark](https://github.com/FlagShark/flagshark) — finds feature flag references across 13 languages and 12+ providers, and identifies stale flags via git blame.
3
+ The detection engine behind [FlagShark](https://github.com/FlagShark/flagshark) — finds feature flag references across 13 languages and 13 providers, and identifies stale flags via git blame.
4
4
 
5
- This is the **library**. If you want a CLI or GitHub Action, install [`flagshark`](https://www.npmjs.com/package/flagshark) instead.
5
+ This is the **library**. For a CLI or GitHub Action, install [`flagshark`](https://www.npmjs.com/package/flagshark) instead.
6
6
 
7
7
  ## Install
8
8
 
@@ -25,18 +25,50 @@ console.log(`Health score: ${result.healthScore}/100`)
25
25
  console.log(`Languages: ${Object.keys(result.languageBreakdown).join(', ')}`)
26
26
  ```
27
27
 
28
+ ## Detection
29
+
30
+ For tier-1 languages (TypeScript, JavaScript, Go, Python), detection uses [tree-sitter](https://tree-sitter.github.io/) (via WASM) to parse files into a real AST. That eliminates the false-positive class where regex matched flag-shaped strings inside comments, string literals, or unrelated call expressions. It also handles multi-line calls and resolves const-bound flag keys (`const FLAG = 'X'; client.variation(FLAG, …)`) in TS/JS.
31
+
32
+ The remaining 9 languages currently use regex-based detection; each migrates to tree-sitter in future releases (no API break).
33
+
34
+ The engine is a runtime concern, not a public API surface. Consumers calling `scanRepo()` or `createDefaultRegistry()` get the right engine per-language automatically. Override per-detector if needed (see below).
35
+
36
+ ## Bundling and WASM resolution
37
+
38
+ Detection has two runtime asset dependencies: the four tree-sitter grammar WASMs (~2.5 MB total, binary, must be external) and the four `.scm` query files (~1.4 KB total, text, **inlined into the JS bundle**). The `.scm` files come along for free because we ship them as TypeScript string constants — there is nothing for you to copy, no env var to set, no resolution path that can break. Only the WASMs need attention.
39
+
40
+ For the WASM grammars (`tree-sitter-typescript.wasm`, `tree-sitter-javascript.wasm`, `tree-sitter-go.wasm`, `tree-sitter-python.wasm`), `parser-cache` calls `createRequire(...).resolve(...)` against `node_modules/tree-sitter-*`. The four grammar packages are declared as runtime dependencies of `@flagshark/core` — under normal `npm install` / `bun install` use you don't need to do anything; the grammars sit next to your `node_modules` copy of `@flagshark/core` and resolution Just Works.
41
+
42
+ If you're bundling `@flagshark/core` into a Lambda, container, edge function, or any other distributable artifact, three resolution paths exist:
43
+
44
+ **1. Node target, grammars external (recommended).** Mark the four `tree-sitter-*` packages as external in your bundler and install them next to the bundle. AWS CDK's `lambdaNodejs.NodejsFunction` does this via `nodeModules: ['tree-sitter-typescript', …]`; esbuild does it via `external: [...]` plus a side-by-side `package.json`. The grammars stay on disk in `node_modules/tree-sitter-*` and `parser-cache` resolves them through `__filename` (CJS bundles) or `import.meta.url` (ESM bundles).
45
+
46
+ **2. Node target, grammars flattened.** If your bundling pipeline puts grammars in a custom location, set `FLAGSHARK_WASM_DIR` to that directory and `parser-cache` will read `${FLAGSHARK_WASM_DIR}/<basename>.wasm` directly — bypassing `require.resolve` entirely. The four files must be there with their exact `tree-sitter-<lang>.wasm` names. This is what the GitHub Action uses (`packages/action/scripts/build.mjs` copies them at build time and the entry point exports `FLAGSHARK_WASM_DIR` before importing the engine).
47
+
48
+ **3. Non-Node target (edge runtimes, browsers).** Same as path 2: ship the four WASM files alongside your bundle and set `FLAGSHARK_WASM_DIR` to that directory. There is no working "do nothing" path here — `createRequire` doesn't exist on Workers/Deno/browsers, and the tree-sitter engine has to find the grammars somehow.
49
+
50
+ If neither `import.meta.url` nor `__filename` is available and `FLAGSHARK_WASM_DIR` is unset, `parser-cache` throws with a pointer at this section.
51
+
52
+ `FLAGSHARK_QUERIES_DIR` also exists as an escape hatch for consumers who want to swap out the inlined queries at runtime (custom detection rules, vendored variants). When set, `loadQueryText` reads `${dir}/${lang}.scm` from disk instead of using the inlined string. Most consumers will never need this — the inlined defaults are the same `.scm` files we publish to `dist/detection/tree-sitter/queries/`.
53
+
54
+ ### Visibility into detection failures
55
+
56
+ Every analysis run that produces parse errors emits a deduplicated sample at WARN, alongside the existing `Polyglot analysis completed` summary. If grammar resolution breaks, a WASM file is missing, or a detector throws, you see the underlying error message in the log — not just a `filesWithErrors: N` counter. The per-file `try/catch` in `analyzeFile` stays (one bad file shouldn't fail an entire scan), but the errors no longer disappear into a counter.
57
+
58
+ Pass any `ScanLogger` to `new PolyglotAnalyzer(registry, logger)` and the sample lands on `logger.warn('Parse errors during analysis', { uniqueErrors, sample })`. The top 5 unique error messages are reported with up to 3 example file paths each.
59
+
28
60
  ## API
29
61
 
30
62
  ### `scanRepo(options) → Promise<ScanRepoResult>`
31
63
 
32
- Top-level orchestrator. Walks a checked-out repository, detects flags, and runs staleness analysis.
64
+ Top-level orchestrator. Walks a checked-out repository, detects flags, runs staleness analysis, and returns a summary.
33
65
 
34
66
  ```ts
35
67
  interface ScanRepoOptions {
36
68
  /** Absolute path to the repository being scanned. */
37
69
  cwd: string
38
70
 
39
- /** Staleness threshold in months. Default: 6. */
71
+ /** Staleness threshold in months. Overridden by `config.threshold` if config is supplied. */
40
72
  threshold?: number
41
73
 
42
74
  /** If set, only scan files changed since this git ref (e.g. `origin/main`). */
@@ -48,20 +80,85 @@ interface ScanRepoOptions {
48
80
 
49
81
  /** Optional `{ debug, info, warn, error }` logger. Defaults to no-op. */
50
82
  logger?: ScanLogger
83
+
84
+ /** Explicit FlagsharkConfig. If undefined, scanRepo auto-discovers
85
+ * `.flagshark.yml` walking upward from `cwd`. */
86
+ config?: FlagsharkConfig
87
+
88
+ /** Skip `.flagshark.yml` discovery entirely. */
89
+ noConfig?: boolean
90
+
91
+ /** Skip `.flagsharkignore` discovery entirely. */
92
+ noIgnoreFile?: boolean
93
+
94
+ /** Populate `result.excludedPaths` with the full list of skipped file paths.
95
+ * Off by default — counts only. */
96
+ collectExcludedPaths?: boolean
51
97
  }
52
98
 
53
99
  interface ScanRepoResult {
54
100
  totalFlags: number
55
- filesScanned: number
56
101
  staleFlags: StaleFlag[]
57
102
  detectedProviders: string[]
58
103
  languageBreakdown: Record<string, number>
59
- healthScore: number // 0–100
60
- scanDuration: number // ms
104
+ healthScore: number // 0–100
105
+ scanDuration: number // ms
106
+ excludedCount?: number // files skipped by config + .flagsharkignore
107
+ excludedPaths?: string[] // set when collectExcludedPaths: true
108
+ effectiveExcludes?: EffectiveRules // for debug/verbose output
61
109
  }
62
110
  ```
63
111
 
64
- `scanRepo` walks the local filesystem. If you can't run a git checkout (e.g., serverless function reading from an API), use the lower-level primitives below.
112
+ `scanRepo` walks the local filesystem. If you can't run a git checkout (e.g., a serverless function reading from an API), use the lower-level primitives below.
113
+
114
+ ### Config module
115
+
116
+ The same config used by the CLI is exported as a building block:
117
+
118
+ ```ts
119
+ import {
120
+ buildDefaultConfig,
121
+ loadConfigFile,
122
+ loadIgnoreFile,
123
+ buildExcluder,
124
+ expandPresets,
125
+ PRESETS,
126
+ FlagsharkConfigSchema,
127
+ type FlagsharkConfig,
128
+ } from '@flagshark/core'
129
+
130
+ // Load a .flagshark.yml from disk (validated via zod)
131
+ const loaded = await loadConfigFile('/path/to/repo')
132
+ const config = loaded?.config ?? buildDefaultConfig()
133
+
134
+ // Load a .flagsharkignore (separate file at repo root)
135
+ const ignoreFile = await loadIgnoreFile('/path/to/repo')
136
+
137
+ // Build a unified excluder from all sources
138
+ const excluder = buildExcluder({
139
+ config,
140
+ ignoreFilePatterns: ignoreFile?.patterns ?? [],
141
+ })
142
+
143
+ // Use it directly:
144
+ excluder.shouldExclude('examples/demo.ts') // true
145
+ ```
146
+
147
+ The schema accepts:
148
+
149
+ ```yaml
150
+ threshold: 6
151
+ excludes:
152
+ paths: [] # gitignore-style globs
153
+ files: [] # same — split is purely organizational
154
+ presets: [] # ['test-files', 'snapshots', 'examples', 'stories', 'fixtures', 'generated']
155
+ suppress:
156
+ flags: [] # flag-name globs (post-detection filter)
157
+ paths:
158
+ - match: 'src/critical/**'
159
+ threshold: 3
160
+ providers: [] # custom provider definitions (see Custom Detectors)
161
+ ```
65
162
 
66
163
  ### Lower-level primitives
67
164
 
@@ -71,7 +168,7 @@ For consumers that fetch file contents elsewhere (GitHub API, S3, in-memory, etc
71
168
  import { createDefaultRegistry, PolyglotAnalyzer } from '@flagshark/core'
72
169
 
73
170
  const registry = createDefaultRegistry() // 13 detectors pre-registered
74
- const analyzer = new PolyglotAnalyzer(registry)
171
+ const analyzer = new PolyglotAnalyzer(registry, logger)
75
172
 
76
173
  // `files` is a Map<filePath, content>
77
174
  const result = await analyzer.analyzeFiles(files)
@@ -101,34 +198,43 @@ const registry = createDefaultRegistry()
101
198
  registry.register(new MyCustomDetector())
102
199
  ```
103
200
 
104
- Or import individual detectors and compose your own registry:
201
+ Or import individual detectors and compose your own registry. Each tier-1 detector accepts `{ engine: 'regex' | 'tree-sitter' }`:
105
202
 
106
203
  ```ts
107
- import { LanguageRegistry, GoDetector, TypeScriptDetector } from '@flagshark/core'
204
+ import {
205
+ LanguageRegistry,
206
+ TypeScriptDetector,
207
+ GoDetector,
208
+ type DetectorEngine,
209
+ } from '@flagshark/core'
108
210
 
109
211
  const registry = new LanguageRegistry()
110
- registry.register(new GoDetector())
111
- registry.register(new TypeScriptDetector())
212
+ registry.register(new TypeScriptDetector({ engine: 'tree-sitter' }))
213
+ registry.register(new GoDetector({ engine: 'regex' })) // opt back to regex
112
214
  ```
113
215
 
114
216
  ## Supported languages
115
217
 
116
- TypeScript/JavaScript, Go, Python, Java, Kotlin, Swift, Ruby, C#, PHP, Rust, C/C++, Objective-C.
218
+ TypeScript, JavaScript, Go, Python, Java, Kotlin, Swift, Ruby, C#, PHP, Rust, C/C++, Objective-C.
117
219
 
118
220
  ## Supported providers
119
221
 
120
- Auto-detected from imports — no configuration needed: LaunchDarkly, Unleash, Flipt, Split.io, PostHog, Flagsmith, ConfigCat, Statsig, GrowthBook, DevCycle, Eppo, Optimizely, plus generic custom-flag patterns.
222
+ Auto-detected from imports — no configuration needed:
223
+
224
+ LaunchDarkly · Unleash · Flipt · Split.io · PostHog · Flagsmith · ConfigCat · Statsig · GrowthBook · DevCycle · Eppo · Optimizely · plus generic custom-flag patterns.
121
225
 
122
226
  ## How detection works
123
227
 
124
- For each file, FlagShark looks for an import of a flag SDK. If none is found, the file is skipped — this prevents false positives from generic functions named `isEnabled()` etc. Once a file qualifies, language-specific regex patterns extract flag references along with provider attribution and source location.
228
+ FlagShark only scans files that actually import a flag SDK. A function called `isEnabled()` in a file that doesn't import LaunchDarkly/Unleash/etc. won't be flagged this prevents false positives from generic identifier names.
229
+
230
+ Once a file qualifies, the engine (tree-sitter for tier-1, regex for the rest) walks call expressions and extracts the flag-key argument at the configured position for each provider's method signatures. Provider attribution and source location come along automatically.
125
231
 
126
232
  ## How staleness works
127
233
 
128
234
  A flag is marked stale if **any** signal fires:
129
235
 
130
- 1. **Age:** `git blame` says the flag was added more than `threshold` months ago.
131
- 2. **Single file:** The flag name appears in only one file across the repo, suggesting a completed rollout.
236
+ 1. **`age`** `git blame` shows the flag's line was last modified more than `threshold` months ago.
237
+ 2. **`low-usage`** The flag name appears in only one file across the repo, suggesting a completed rollout.
132
238
 
133
239
  ## License
134
240
 
@@ -1 +1 @@
1
- {"version":3,"file":"excluder.d.ts","sourceRoot":"","sources":["../../src/config/excluder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,CAAA;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAC7B;AAwBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,QAAQ,CA4BjE"}
1
+ {"version":3,"file":"excluder.d.ts","sourceRoot":"","sources":["../../src/config/excluder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,eAAe,CAAA;IACvB,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAC7B;AAwBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,QAAQ,CA4BjE"}
@@ -1,5 +1,6 @@
1
1
  import ignoreModule from 'ignore';
2
2
  import { expandPresets } from './presets.js';
3
+ /* v8 ignore next -- CJS/ESM interop shim; one branch is always taken depending on bundler */
3
4
  const ignore = ignoreModule.default ?? ignoreModule;
4
5
  /**
5
6
  * Convert trailing-slash directory patterns (`examples/`) to recursive globs
@@ -1 +1 @@
1
- {"version":3,"file":"excluder.js","sourceRoot":"","sources":["../../src/config/excluder.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C,MAAM,MAAM,GAAI,YAA6D,CAAC,OAAO,IAAI,YAAY,CAAA;AAoBrG;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IAE5C,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE7D,MAAM,WAAW,GAAa;QAC5B,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK;QACxB,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK;QACxB,GAAG,cAAc;QACjB,GAAG,kBAAkB;KACtB,CAAA;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAE/D,OAAO;QACL,aAAa,CAAC,IAAY;YACxB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC/D,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACpC,CAAC;QACD,cAAc,EAAE;YACd,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrC,cAAc;YACd,UAAU,EAAE,CAAC,GAAG,kBAAkB,CAAC;SACpC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"excluder.js","sourceRoot":"","sources":["../../src/config/excluder.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C,6FAA6F;AAC7F,MAAM,MAAM,GAAI,YAA6D,CAAC,OAAO,IAAI,YAAY,CAAA;AAoBrG;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,IAAI,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IAE5C,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE7D,MAAM,WAAW,GAAa;QAC5B,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK;QACxB,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK;QACxB,GAAG,cAAc;QACjB,GAAG,kBAAkB;KACtB,CAAA;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAE/D,OAAO;QACL,aAAa,CAAC,IAAY;YACxB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC/D,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACpC,CAAC;QACD,cAAc,EAAE;YACd,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACjC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrC,cAAc;YACd,UAAU,EAAE,CAAC,GAAG,kBAAkB,CAAC;SACpC;KACF,CAAA;AACH,CAAC"}
@@ -27,6 +27,7 @@ function readAndValidate(path) {
27
27
  parsed = parseYaml(raw);
28
28
  }
29
29
  catch (err) {
30
+ /* v8 ignore next 5 -- yaml library only throws YAMLParseError; the else-branch is unreachable */
30
31
  if (err instanceof YAMLParseError) {
31
32
  throw new Error(`Invalid YAML in ${path}: ${err.message}`);
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAEzD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,aAAa,CAAA;AAEzE,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AAOvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE3B,SAAS,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACjC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,eAAe,CAAC,SAAS,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC9D,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEvC,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAEzD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,aAAa,CAAA;AAEzE,MAAM,SAAS,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAA;AAOvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE3B,SAAS,CAAC;QACR,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACjC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,eAAe,CAAC,SAAS,CAAC,CAAA;YACnC,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC9D,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAEvC,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iGAAiG;QACjG,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;AACtC,CAAC"}
@@ -6,12 +6,12 @@ export declare const ExcludesSchema: z.ZodDefault<z.ZodObject<{
6
6
  files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
7
7
  presets: z.ZodDefault<z.ZodArray<z.ZodEnum<["test-files", "snapshots", "examples", "stories", "fixtures", "generated"]>, "many">>;
8
8
  }, "strip", z.ZodTypeAny, {
9
- paths: string[];
10
9
  files: string[];
10
+ paths: string[];
11
11
  presets: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[];
12
12
  }, {
13
- paths?: string[] | undefined;
14
13
  files?: string[] | undefined;
14
+ paths?: string[] | undefined;
15
15
  presets?: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[] | undefined;
16
16
  }>>;
17
17
  export declare const SuppressSchema: z.ZodDefault<z.ZodObject<{
@@ -84,13 +84,13 @@ export declare const OutputConfigSchema: z.ZodDefault<z.ZodObject<{
84
84
  }, "strip", z.ZodTypeAny, {
85
85
  format: "json" | "text" | "sarif" | "markdown" | "csv";
86
86
  groupBy: "provider" | "file" | "signal" | "none";
87
- sortBy: "name" | "age" | "count";
87
+ sortBy: "name" | "count" | "age";
88
88
  color: "never" | "auto" | "always";
89
89
  maxDisplay: number;
90
90
  }, {
91
91
  format?: "json" | "text" | "sarif" | "markdown" | "csv" | undefined;
92
92
  groupBy?: "provider" | "file" | "signal" | "none" | undefined;
93
- sortBy?: "name" | "age" | "count" | undefined;
93
+ sortBy?: "name" | "count" | "age" | undefined;
94
94
  color?: "never" | "auto" | "always" | undefined;
95
95
  maxDisplay?: number | undefined;
96
96
  }>>;
@@ -129,12 +129,12 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
129
129
  files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
130
130
  presets: z.ZodDefault<z.ZodArray<z.ZodEnum<["test-files", "snapshots", "examples", "stories", "fixtures", "generated"]>, "many">>;
131
131
  }, "strip", z.ZodTypeAny, {
132
- paths: string[];
133
132
  files: string[];
133
+ paths: string[];
134
134
  presets: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[];
135
135
  }, {
136
- paths?: string[] | undefined;
137
136
  files?: string[] | undefined;
137
+ paths?: string[] | undefined;
138
138
  presets?: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[] | undefined;
139
139
  }>>;
140
140
  suppress: z.ZodDefault<z.ZodObject<{
@@ -197,13 +197,13 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
197
197
  }, "strip", z.ZodTypeAny, {
198
198
  format: "json" | "text" | "sarif" | "markdown" | "csv";
199
199
  groupBy: "provider" | "file" | "signal" | "none";
200
- sortBy: "name" | "age" | "count";
200
+ sortBy: "name" | "count" | "age";
201
201
  color: "never" | "auto" | "always";
202
202
  maxDisplay: number;
203
203
  }, {
204
204
  format?: "json" | "text" | "sarif" | "markdown" | "csv" | undefined;
205
205
  groupBy?: "provider" | "file" | "signal" | "none" | undefined;
206
- sortBy?: "name" | "age" | "count" | undefined;
206
+ sortBy?: "name" | "count" | "age" | undefined;
207
207
  color?: "never" | "auto" | "always" | undefined;
208
208
  maxDisplay?: number | undefined;
209
209
  }>>;
@@ -235,6 +235,13 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
235
235
  } | undefined;
236
236
  }>>;
237
237
  engine: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<["regex", "tree-sitter"]>>>;
238
+ platforms: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
239
+ token_env: z.ZodOptional<z.ZodString>;
240
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
241
+ token_env: z.ZodOptional<z.ZodString>;
242
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
243
+ token_env: z.ZodOptional<z.ZodString>;
244
+ }, z.ZodTypeAny, "passthrough">>>>;
238
245
  }, "strict", z.ZodTypeAny, {
239
246
  providers: {
240
247
  name: string;
@@ -253,8 +260,8 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
253
260
  }[];
254
261
  threshold: number;
255
262
  excludes: {
256
- paths: string[];
257
263
  files: string[];
264
+ paths: string[];
258
265
  presets: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[];
259
266
  };
260
267
  suppress: {
@@ -263,7 +270,7 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
263
270
  output: {
264
271
  format: "json" | "text" | "sarif" | "markdown" | "csv";
265
272
  groupBy: "provider" | "file" | "signal" | "none";
266
- sortBy: "name" | "age" | "count";
273
+ sortBy: "name" | "count" | "age";
267
274
  color: "never" | "auto" | "always";
268
275
  maxDisplay: number;
269
276
  };
@@ -274,6 +281,9 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
274
281
  lowUsage: number;
275
282
  };
276
283
  };
284
+ platforms?: Record<string, z.objectOutputType<{
285
+ token_env: z.ZodOptional<z.ZodString>;
286
+ }, z.ZodTypeAny, "passthrough">> | undefined;
277
287
  }, {
278
288
  providers?: {
279
289
  name: string;
@@ -292,8 +302,8 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
292
302
  }[] | undefined;
293
303
  threshold?: number | undefined;
294
304
  excludes?: {
295
- paths?: string[] | undefined;
296
305
  files?: string[] | undefined;
306
+ paths?: string[] | undefined;
297
307
  presets?: ("examples" | "test-files" | "snapshots" | "stories" | "fixtures" | "generated")[] | undefined;
298
308
  } | undefined;
299
309
  suppress?: {
@@ -302,7 +312,7 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
302
312
  output?: {
303
313
  format?: "json" | "text" | "sarif" | "markdown" | "csv" | undefined;
304
314
  groupBy?: "provider" | "file" | "signal" | "none" | undefined;
305
- sortBy?: "name" | "age" | "count" | undefined;
315
+ sortBy?: "name" | "count" | "age" | undefined;
306
316
  color?: "never" | "auto" | "always" | undefined;
307
317
  maxDisplay?: number | undefined;
308
318
  } | undefined;
@@ -313,6 +323,9 @@ export declare const FlagsharkConfigSchema: z.ZodObject<{
313
323
  lowUsage?: number | undefined;
314
324
  } | undefined;
315
325
  } | undefined;
326
+ platforms?: Record<string, z.objectInputType<{
327
+ token_env: z.ZodOptional<z.ZodString>;
328
+ }, z.ZodTypeAny, "passthrough">> | undefined;
316
329
  }>;
317
330
  export type FlagsharkConfig = z.infer<typeof FlagsharkConfigSchema>;
318
331
  export type ExcludesConfig = z.infer<typeof ExcludesSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAWvB,eAAO,MAAM,gBAAgB,wFAAuB,CAAA;AACpD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAEzD,eAAO,MAAM,cAAc;;;;;;;;;;;;GAIb,CAAA;AAEd,eAAO,MAAM,cAAc;;;;;;GAEb,CAAA;AAEd,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU/B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;GAMjB,CAAA;AAEd,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;GAMhB,CAAA;AAEd,eAAO,MAAM,YAAY,6EAGZ,CAAA;AAEb,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASvB,CAAA;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAWvB,eAAO,MAAM,gBAAgB,wFAAuB,CAAA;AACpD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAEzD,eAAO,MAAM,cAAc;;;;;;;;;;;;GAIb,CAAA;AAEd,eAAO,MAAM,cAAc;;;;;;GAEb,CAAA;AAEd,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU/B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;GAMjB,CAAA;AAEd,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;GAMhB,CAAA;AAEd,eAAO,MAAM,YAAY,6EAGZ,CAAA;AAEb,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAavB,CAAA;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACnE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA"}
@@ -59,5 +59,6 @@ export const FlagsharkConfigSchema = z.object({
59
59
  output: OutputConfigSchema,
60
60
  healthScore: HealthScoreSchema,
61
61
  engine: EngineSchema,
62
+ platforms: z.record(z.string(), z.object({ token_env: z.string().optional() }).passthrough()).optional(),
62
63
  }).strict();
63
64
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cpp.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/cpp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,qBAAa,WAAY,YAAW,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAErC,SAAS,CAAC,EAAE,mBAAmB,EAAE;IAI7C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAI7D,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,EAAE,CAmF3D"}
1
+ {"version":3,"file":"cpp.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/cpp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,qBAAa,WAAY,YAAW,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAErC,SAAS,CAAC,EAAE,mBAAmB,EAAE;IAI7C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAI7D,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,EAAE,CAmF3D"}
@@ -16,8 +16,12 @@ export class CPPDetector {
16
16
  return ['.cpp', '.cc', '.cxx', '.c++', '.hpp', '.hh', '.hxx', '.h++', '.h', '.c'];
17
17
  }
18
18
  supportsFile(filename) {
19
- const ext = filename.toLowerCase().split('.').pop();
20
- return ['cpp', 'cc', 'cxx', 'c++', 'hpp', 'hh', 'hxx', 'h++', 'h', 'c'].includes(ext ?? '');
19
+ const lower = filename.toLowerCase();
20
+ const dotIdx = lower.lastIndexOf('.');
21
+ if (dotIdx === -1)
22
+ return false;
23
+ const ext = lower.slice(dotIdx + 1);
24
+ return ['cpp', 'cc', 'cxx', 'c++', 'hpp', 'hh', 'hxx', 'h++', 'h', 'c'].includes(ext);
21
25
  }
22
26
  detectFlags(filename, content) {
23
27
  return detectFlagsWithRegex(filename, content, this.language(), this.providers);
@@ -1 +1 @@
1
- {"version":3,"file":"cpp.js","sourceRoot":"","sources":["../../../src/detection/detectors/cpp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cpp.js","sourceRoot":"","sources":["../../../src/detection/detectors/cpp.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  * Ported from Go: internal/languages/golang/detector.go
4
4
  */
5
5
  import type { FeatureFlag } from '../feature-flag.js';
6
- import type { FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
7
- export type DetectorEngine = 'regex' | 'tree-sitter';
6
+ import type { DetectorEngine, FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
7
+ export type { DetectorEngine };
8
8
  export interface GoDetectorOptions {
9
9
  providers?: FeatureFlagProvider[];
10
10
  engine?: DetectorEngine;
@@ -1 +1 @@
1
- {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/go.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,CAAA;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,UAAW,YAAW,gBAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,iBAAsB;IAKxC,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAkS1D"}
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/go.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtG,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,UAAW,YAAW,gBAAgB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,iBAAsB;IAKxC,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAkS1D"}
@@ -5,8 +5,8 @@
5
5
  * but reports the language as "javascript".
6
6
  */
7
7
  import type { FeatureFlag } from '../feature-flag.js';
8
- import type { FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
9
- export type DetectorEngine = 'regex' | 'tree-sitter';
8
+ import type { DetectorEngine, FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
9
+ export type { DetectorEngine };
10
10
  export interface JavaScriptDetectorOptions {
11
11
  providers?: FeatureFlagProvider[];
12
12
  engine?: DetectorEngine;
@@ -1 +1 @@
1
- {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/javascript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,CAAA;AAEpD,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,yBAA8B;IAKhD,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC"}
1
+ {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/javascript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtG,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,yBAA8B;IAKhD,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC"}
@@ -22,8 +22,12 @@ export class JavaScriptDetector {
22
22
  return ['.js', '.jsx', '.mjs', '.cjs'];
23
23
  }
24
24
  supportsFile(filename) {
25
- const ext = filename.toLowerCase().split('.').pop();
26
- return ['js', 'jsx', 'mjs', 'cjs'].includes(ext ?? '');
25
+ const lower = filename.toLowerCase();
26
+ const dotIdx = lower.lastIndexOf('.');
27
+ if (dotIdx === -1)
28
+ return false;
29
+ const ext = lower.slice(dotIdx + 1);
30
+ return ['js', 'jsx', 'mjs', 'cjs'].includes(ext);
27
31
  }
28
32
  detectFlags(filename, content) {
29
33
  if (this.engine === 'tree-sitter') {
@@ -1 +1 @@
1
- {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/detection/detectors/javascript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAY5D,MAAM,OAAO,kBAAkB;IACZ,SAAS,CAAuB;IAChC,MAAM,CAAgB;IAEvC,YAAY,OAAkC,EAAE;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,0BAA0B,EAAE,CAAA;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA;IACtC,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;QACnD,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,OAAe;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAClC,OAAO,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACtF,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACjF,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/detection/detectors/javascript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AAEpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAY5D,MAAM,OAAO,kBAAkB;IACZ,SAAS,CAAuB;IAChC,MAAM,CAAgB;IAEvC,YAAY,OAAkC,EAAE;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,0BAA0B,EAAE,CAAA;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA;IACtC,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,CAAC,UAAU,CAAA;IAC7B,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACrC,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACnC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAClD,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,OAAe;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAClC,OAAO,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACtF,CAAC;QACD,OAAO,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACjF,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/php.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,qBAAa,WAAY,YAAW,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAErC,SAAS,CAAC,EAAE,mBAAmB,EAAE;IAI7C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAI7D,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,EAAE,CAoL3D"}
1
+ {"version":3,"file":"php.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/php.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,qBAAa,WAAY,YAAW,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAErC,SAAS,CAAC,EAAE,mBAAmB,EAAE;IAI7C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IAI7D,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,mBAAmB,IAAI,mBAAmB,EAAE,CAoL3D"}
@@ -16,8 +16,12 @@ export class PHPDetector {
16
16
  return ['.php', '.phtml', '.php3', '.php4', '.php5', '.phps'];
17
17
  }
18
18
  supportsFile(filename) {
19
- const ext = filename.toLowerCase().split('.').pop();
20
- return ['php', 'phtml', 'php3', 'php4', 'php5', 'phps'].includes(ext ?? '');
19
+ const lower = filename.toLowerCase();
20
+ const dotIdx = lower.lastIndexOf('.');
21
+ if (dotIdx === -1)
22
+ return false;
23
+ const ext = lower.slice(dotIdx + 1);
24
+ return ['php', 'phtml', 'php3', 'php4', 'php5', 'phps'].includes(ext);
21
25
  }
22
26
  detectFlags(filename, content) {
23
27
  return detectFlagsWithRegex(filename, content, this.language(), this.providers);
@@ -1 +1 @@
1
- {"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/detection/detectors/php.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"php.js","sourceRoot":"","sources":["../../../src/detection/detectors/php.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  * Ported from Go: internal/languages/python/detector.go
4
4
  */
5
5
  import type { FeatureFlag } from '../feature-flag.js';
6
- import type { FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
7
- export type DetectorEngine = 'regex' | 'tree-sitter';
6
+ import type { DetectorEngine, FeatureFlagProvider, Language, LanguageDetector } from '../interface.js';
7
+ export type { DetectorEngine };
8
8
  export interface PythonDetectorOptions {
9
9
  providers?: FeatureFlagProvider[];
10
10
  engine?: DetectorEngine;
@@ -1 +1 @@
1
- {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,aAAa,CAAA;AAEpD,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,cAAe,YAAW,gBAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,qBAA0B;IAK5C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,EAAE,CA8P9D"}
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/detection/detectors/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtG,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAED,qBAAa,cAAe,YAAW,gBAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,IAAI,GAAE,qBAA0B;IAK5C,QAAQ,IAAI,QAAQ;IAIpB,cAAc,IAAI,MAAM,EAAE;IAI1B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQvC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOtF,YAAY,IAAI,mBAAmB,EAAE;CAGtC;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,EAAE,CA8P9D"}
@@ -19,8 +19,12 @@ export class PythonDetector {
19
19
  return ['.py', '.pyw', '.pyx', '.pyi'];
20
20
  }
21
21
  supportsFile(filename) {
22
- const ext = filename.toLowerCase().split('.').pop();
23
- return ['py', 'pyw', 'pyx', 'pyi'].includes(ext ?? '');
22
+ const lower = filename.toLowerCase();
23
+ const dotIdx = lower.lastIndexOf('.');
24
+ if (dotIdx === -1)
25
+ return false;
26
+ const ext = lower.slice(dotIdx + 1);
27
+ return ['py', 'pyw', 'pyx', 'pyi'].includes(ext);
24
28
  }
25
29
  detectFlags(filename, content) {
26
30
  if (this.engine === 'tree-sitter') {