1import { Discovery } from "@effect/api-diff/Discovery"
2import * as NodeServices from "@effect/platform-node/NodeServices"
3import { assert, describe, it } from "@effect/vitest"
4import * as Effect from "effect/Effect"
5import * as FileSystem from "effect/FileSystem"
6import * as Layer from "effect/Layer"
7import { writeFixturePackage } from "./utils.ts"
8
9const MainLayer = Discovery.layer.pipe(
10 Layer.provideMerge(NodeServices.layer)
11)
12
13describe("entrypoint discovery", () => {
14 it.effect("expands wildcards and respects null exclusions", () =>
15 Effect.gen(function*() {
16 const fs = yield* FileSystem.FileSystem
17 const discovery = yield* Discovery
18 const root = yield* fs.makeTempDirectoryScoped({ prefix: "api-diff-discovery-" })
19 yield* writeFixturePackage(root, {
20 "index.d.ts": `export * as Foo from "./Foo.js"\n`,
21 "Foo.d.ts": `export declare const value: string\n`,
22 "internal/Secret.d.ts": `export declare const secret: string\n`
23 })
24
25 const result = yield* discovery.discoverEntrypoints(root, [
26 "@fixture/sample",
27 "@fixture/sample/Foo",
28 "@fixture/sample/internal/Secret"
29 ])
30 assert.deepStrictEqual(result.entrypoints.map((entrypoint) => entrypoint.module), [
31 "@fixture/sample",
32 "@fixture/sample/Foo"
33 ])
34 assert.deepStrictEqual(result.missing, ["@fixture/sample/internal/Secret"])
35
36 const all = yield* discovery.discoverEntrypoints(root)
37 assert.deepStrictEqual(all.entrypoints.map((entrypoint) => entrypoint.module), [
38 "@fixture/sample",
39 "@fixture/sample/Foo",
40 "@fixture/sample/index"
41 ])
42 assert.deepStrictEqual(all.missing, [])
43 }).pipe(Effect.provide(MainLayer)))
44
45 it.effect("supports conditional export targets", () =>
46 Effect.gen(function*() {
47 const fs = yield* FileSystem.FileSystem
48 const discovery = yield* Discovery
49 const root = yield* fs.makeTempDirectoryScoped({ prefix: "api-diff-discovery-" })
50 yield* writeFixturePackage(root, {
51 "Foo.d.ts": `export declare const value: string\n`
52 }, {
53 "./Foo": {
54 types: "./Foo.d.ts",
55 import: "./Foo.js"
56 }
57 })
58 const result = yield* discovery.discoverEntrypoints(root, ["@fixture/sample/Foo"])
59 assert.strictEqual(result.missing.length, 0)
60 assert.strictEqual(result.entrypoints[0]?.module, "@fixture/sample/Foo")
61 }).pipe(Effect.provide(MainLayer)))
62})