1import * as NodeServices from "@effect/platform-node/NodeServices"
2import * as Codegen from "@effect/utils/Codegen"
3import * as Glob from "@effect/utils/Glob"
4import { assert, describe, it } from "@effect/vitest"
5import * as Effect from "effect/Effect"
6import * as FileSystem from "effect/FileSystem"
7import * as Layer from "effect/Layer"
8import * as path from "node:path"
9
10const MainLayer = Codegen.layer.pipe(Layer.provide(Glob.layer), Layer.provideMerge(NodeServices.layer))
11
12describe("BarrelGenerator", () => {
13 it.effect("discovers a barrel from an absolute pattern", () =>
14 Effect.gen(function*() {
15 const fs = yield* FileSystem.FileSystem
16 const directory = yield* fs.makeTempDirectoryScoped({ prefix: "codegen-" })
17 const barrel = path.join(directory, "index.ts")
18 yield* fs.writeFileString(barrel, "// @barrel\n")
19
20 const generator = yield* Codegen.BarrelGenerator
21 const files = yield* generator.discoverFiles(barrel, directory)
22
23 assert.deepStrictEqual(files, [{ path: barrel, pattern: "*.ts", offset: 1 }])
24 }).pipe(Effect.provide(MainLayer)))
25
26 it.effect("copies module stability tags into barrel exports", () =>
27 Effect.gen(function*() {
28 const fs = yield* FileSystem.FileSystem
29 const directory = yield* fs.makeTempDirectoryScoped({ prefix: "codegen-" })
30 const barrel = path.join(directory, "index.ts")
31 yield* fs.writeFileString(barrel, "// @barrel\n")
32 yield* fs.writeFileString(
33 path.join(directory, "Experimental.ts"),
34 `/**
35 * Experimental module.
36 *
37 * @stability experimental
38 * @since 3.0.0
39 */
40export const experimental = 1
41`
42 )
43 yield* fs.writeFileString(
44 path.join(directory, "Stable.ts"),
45 `/**
46 * Stable module.
47 *
48 * @since 1.0.0
49 */
50export const stable = 1
51`
52 )
53 yield* fs.writeFileString(
54 path.join(directory, "Unstable.ts"),
55 `/**
56 * Unstable module.
57 *
58 * @stability unstable
59 * @since 2.0.0
60 */
61export const unstable = 1
62`
63 )
64
65 const generator = yield* Codegen.BarrelGenerator
66 yield* generator.processFile({ path: barrel, pattern: "*.ts", offset: 1 })
67
68 assert.strictEqual(
69 yield* fs.readFileString(barrel),
70 `// @barrel
71
72/**
73 * @stability experimental
74 * @since 3.0.0
75 */
76export * as Experimental from "./Experimental.ts"
77
78/**
79 * @since 1.0.0
80 */
81export * as Stable from "./Stable.ts"
82
83/**
84 * @stability unstable
85 * @since 2.0.0
86 */
87export * as Unstable from "./Unstable.ts"
88`
89 )
90 }).pipe(Effect.provide(MainLayer)))
91})