1/**
2 * Discovers the TypeScript entrypoint fixtures used by the bundle-size tools.
3 *
4 * The bundle CLI uses these fixture names to build current bundle reports,
5 * compare them against a base directory, and populate the visualization
6 * selector. Fixtures are intentionally discovered from the package's local
7 * `fixtures` directory as top-level `.ts` files and sorted by name so reports
8 * are deterministic.
9 *
10 * When adding or renaming fixtures, keep in mind that comparison reports match
11 * files by basename between the current fixtures directory and the provided
12 * base directory. New fixtures without a matching base file are reported as
13 * unchanged. Each fixture is bundled as its own Rollup entrypoint, so it should
14 * represent the import shape being measured and avoid depending on incidental
15 * fixture discovery order.
16 *
17 * @since 4.0.0
18 */
19import * as Array from "effect/Array"
20import * as Context from "effect/Context"
21import * as Effect from "effect/Effect"
22import * as Layer from "effect/Layer"
23import * as Order from "effect/Order"
24import * as Glob from "glob"
25import { fileURLToPath } from "node:url"
26
27/**
28 * Context service that discovers and sorts TypeScript fixture files used by the bundle size tooling.
29 *
30 * @category services
31 * @since 4.0.0
32 */
33export class Fixtures extends Context.Service<Fixtures>()(
34 "@effect/bundle/Fixtures",
35 {
36 make: Effect.gen(function*() {
37 const fixturesDir = fileURLToPath(new URL("../fixtures/", import.meta.url))
38
39 const fixtures = yield* Effect.promise(() => Glob.glob("*.ts", { cwd: fixturesDir })).pipe(
40 Effect.map(Array.sort(Order.String)),
41 Effect.orDie
42 )
43
44 return {
45 fixtures,
46 fixturesDir
47 } as const
48 })
49 }
50) {
51 static readonly layer = Layer.effect(this, this.make)
52}