diff --git a/.changeset/shy-pears-report.md b/.changeset/shy-pears-report.md
new file mode 100644
index 0000000..635d558
--- /dev/null
+++ b/.changeset/shy-pears-report.md
@@ -0,0 +1,5 @@
+---
+"@effect/docgen": patch
+---
+
+add reporting of `tsc` and `tsx` errors, closes #66
diff --git a/docs/modules/Configuration.ts.md b/docs/modules/Configuration.ts.md
index 0d4a704..2b8cfd3 100644
--- a/docs/modules/Configuration.ts.md
+++ b/docs/modules/Configuration.ts.md
@@ -13,30 +13,74 @@ Added in v1.0.0
Table of contents
- [service](#service)
- - [Configuration](#configuration)
- - [Configuration (interface)](#configuration-interface)
+ - [Configuration (class)](#configuration-class)
- [ConfigurationSchema](#configurationschema)
+ - [ConfigurationShape (interface)](#configurationshape-interface)
---
# service
-## Configuration
+## Configuration (class)
**Signature**
```ts
-export declare const Configuration: Context.Tag
+export declare class Configuration
```
Added in v1.0.0
-## Configuration (interface)
+## ConfigurationSchema
+
+**Signature**
+
+```ts
+export declare const ConfigurationSchema: Schema.struct<{
+ $schema: Schema.PropertySignature<"?:", string | undefined, never, "?:", string | undefined, never>
+ projectHomepage: Schema.PropertySignature<"?:", string | undefined, never, "?:", string | undefined, never>
+ srcDir: Schema.PropertySignature<"?:", string | undefined, never, "?:", string | undefined, never>
+ outDir: Schema.PropertySignature<"?:", string | undefined, never, "?:", string | undefined, never>
+ theme: Schema.PropertySignature<"?:", string | undefined, never, "?:", string | undefined, never>
+ enableSearch: Schema.PropertySignature<"?:", boolean | undefined, never, "?:", boolean | undefined, never>
+ enforceDescriptions: Schema.PropertySignature<"?:", boolean | undefined, never, "?:", boolean | undefined, never>
+ enforceExamples: Schema.PropertySignature<"?:", boolean | undefined, never, "?:", boolean | undefined, never>
+ enforceVersion: Schema.PropertySignature<"?:", boolean | undefined, never, "?:", boolean | undefined, never>
+ exclude: Schema.PropertySignature<
+ "?:",
+ readonly string[] | undefined,
+ never,
+ "?:",
+ readonly string[] | undefined,
+ never
+ >
+ parseCompilerOptions: Schema.PropertySignature<
+ "?:",
+ string | { readonly [x: string]: unknown } | undefined,
+ never,
+ "?:",
+ string | { readonly [x: string]: unknown } | undefined,
+ never
+ >
+ examplesCompilerOptions: Schema.PropertySignature<
+ "?:",
+ string | { readonly [x: string]: unknown } | undefined,
+ never,
+ "?:",
+ string | { readonly [x: string]: unknown } | undefined,
+ never
+ >
+}>
+```
+
+Added in v1.0.0
+
+## ConfigurationShape (interface)
**Signature**
```ts
-export interface Configuration {
+export interface ConfigurationShape {
readonly projectName: string
readonly projectHomepage: string
readonly srcDir: string
@@ -54,42 +98,3 @@ export interface Configuration {
```
Added in v1.0.0
-
-## ConfigurationSchema
-
-**Signature**
-
-```ts
-export declare const ConfigurationSchema: Schema.Schema<
- {
- readonly $schema?: string
- readonly projectHomepage?: string
- readonly srcDir?: string
- readonly outDir?: string
- readonly theme?: string
- readonly enableSearch?: boolean
- readonly enforceDescriptions?: boolean
- readonly enforceExamples?: boolean
- readonly enforceVersion?: boolean
- readonly exclude?: readonly string[]
- readonly parseCompilerOptions?: string | { readonly [x: string]: unknown }
- readonly examplesCompilerOptions?: string | { readonly [x: string]: unknown }
- },
- {
- readonly $schema?: string
- readonly projectHomepage?: string
- readonly srcDir?: string
- readonly outDir?: string
- readonly theme?: string
- readonly enableSearch?: boolean
- readonly enforceDescriptions?: boolean
- readonly enforceExamples?: boolean
- readonly enforceVersion?: boolean
- readonly exclude?: readonly string[]
- readonly parseCompilerOptions?: string | { readonly [x: string]: unknown }
- readonly examplesCompilerOptions?: string | { readonly [x: string]: unknown }
- }
->
-```
-
-Added in v1.0.0
diff --git a/docs/modules/File.ts.md b/docs/modules/File.ts.md
index 0bbdabb..b9ec707 100644
--- a/docs/modules/File.ts.md
+++ b/docs/modules/File.ts.md
@@ -42,12 +42,11 @@ Represents a file which can be optionally overwriteable.
**Signature**
```ts
-export interface File
- extends Data.Data<{
- readonly path: string
- readonly content: string
- readonly isOverwriteable: boolean
- }> {}
+export interface File {
+ readonly path: string
+ readonly content: string
+ readonly isOverwriteable: boolean
+}
```
Added in v1.0.0
diff --git a/docs/modules/Markdown.ts.md b/docs/modules/Markdown.ts.md
index 9f314e7..c538523 100644
--- a/docs/modules/Markdown.ts.md
+++ b/docs/modules/Markdown.ts.md
@@ -24,7 +24,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const printModule: (module: Domain.Module, order: number) => Effect.Effect
+export declare const printModule: (module: Domain.Module, order: number) => Effect.Effect
```
**Example**
@@ -36,7 +36,6 @@ import { Option } from "effect"
const doc = Domain.createNamedDoc("tests", Option.none(), Option.some("1.0.0"), false, [], Option.none())
const m = Domain.createModule(doc, ["src", "tests.ts"], [], [], [], [], [], [], [])
-console.log(Markdown.printModule(m, 0))
```
Added in v1.0.0
diff --git a/docs/modules/Parser.ts.md b/docs/modules/Parser.ts.md
index 5e82aaa..fbafc3c 100644
--- a/docs/modules/Parser.ts.md
+++ b/docs/modules/Parser.ts.md
@@ -32,7 +32,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseClasses: Effect.Effect
+export declare const parseClasses: Effect.Effect
```
Added in v1.0.0
@@ -42,7 +42,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseConstants: Effect.Effect
+export declare const parseConstants: Effect.Effect
```
Added in v1.0.0
@@ -52,7 +52,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseExports: Effect.Effect
+export declare const parseExports: Effect.Effect
```
Added in v1.0.0
@@ -64,7 +64,7 @@ Added in v1.0.0
```ts
export declare const parseFiles: (
files: ReadonlyArray
-) => Effect.Effect
+) => Effect.Effect
```
Added in v1.0.0
@@ -74,7 +74,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseFunctions: Effect.Effect
+export declare const parseFunctions: Effect.Effect
```
Added in v1.0.0
@@ -84,7 +84,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseInterfaces: Effect.Effect
+export declare const parseInterfaces: Effect.Effect
```
Added in v1.0.0
@@ -95,9 +95,9 @@ Added in v1.0.0
```ts
export declare const parseModule: Effect.Effect<
- Configuration.Configuration | Path.Path | Source,
+ Domain.Module,
string[],
- Domain.Module
+ Configuration.Configuration | Path.Path | Source
>
```
@@ -108,7 +108,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseNamespaces: Effect.Effect
+export declare const parseNamespaces: Effect.Effect
```
Added in v1.0.0
@@ -118,7 +118,7 @@ Added in v1.0.0
**Signature**
```ts
-export declare const parseTypeAliases: Effect.Effect
+export declare const parseTypeAliases: Effect.Effect
```
Added in v1.0.0
diff --git a/docs/modules/Process.ts.md b/docs/modules/Process.ts.md
index 21c9ba4..509fbcf 100644
--- a/docs/modules/Process.ts.md
+++ b/docs/modules/Process.ts.md
@@ -15,8 +15,8 @@ Added in v1.0.0
- [layer](#layer)
- [layer](#layer-1)
- [service](#service)
- - [Process](#process)
- - [Process (interface)](#process-interface)
+ - [Process (class)](#process-class)
+ - [ProcessShape (interface)](#processshape-interface)
---
@@ -27,34 +27,34 @@ Added in v1.0.0
**Signature**
```ts
-export declare const layer: Layer.Layer
+export declare const layer: Layer.Layer
```
Added in v1.0.0
# service
-## Process
+## Process (class)
**Signature**
```ts
-export declare const Process: Context.Tag
+export declare class Process
```
Added in v1.0.0
-## Process (interface)
+## ProcessShape (interface)
Represents a handle to the currently executing process.
**Signature**
```ts
-export interface Process {
- readonly cwd: Effect.Effect
- readonly platform: Effect.Effect
- readonly argv: Effect.Effect>
+export interface ProcessShape {
+ readonly cwd: Effect.Effect
+ readonly platform: Effect.Effect
+ readonly argv: Effect.Effect>
}
```
diff --git a/src/CLI.ts b/src/CLI.ts
index c095771..e5f9680 100644
--- a/src/CLI.ts
+++ b/src/CLI.ts
@@ -11,6 +11,7 @@ import * as ValidationError from "@effect/cli/ValidationError"
import * as Schema from "@effect/schema/Schema"
import * as TreeFormatter from "@effect/schema/TreeFormatter"
import * as Config from "effect/Config"
+import * as Effect from "effect/Effect"
import * as Either from "effect/Either"
import * as ReadonlyArray from "effect/ReadonlyArray"
import * as Configuration from "./Configuration.js"
@@ -175,7 +176,7 @@ export const docgenCommand = Command.make("docgen", options)
/** @internal */
export const cli = docgenCommand.pipe(
- Command.withHandler(() => Core.program),
+ Command.withHandler(() => Effect.scoped(Core.program)),
Command.provideEffect(Configuration.Configuration, (args) => Configuration.load(args)),
Command.run({
name: "docgen",
diff --git a/src/Core.ts b/src/Core.ts
index 239e668..03036e2 100644
--- a/src/Core.ts
+++ b/src/Core.ts
@@ -8,8 +8,10 @@ import * as CommandExecutor from "@effect/platform/CommandExecutor"
import * as FileSystem from "@effect/platform/FileSystem"
import * as Path from "@effect/platform/Path"
import chalk from "chalk"
+import * as Chunk from "effect/Chunk"
import * as Effect from "effect/Effect"
import * as ReadonlyArray from "effect/ReadonlyArray"
+import * as Stream from "effect/Stream"
import * as String from "effect/String"
import * as Glob from "glob"
import * as Configuration from "./Configuration.js"
@@ -273,8 +275,31 @@ const runTscOnExamples = Effect.gen(function*(_) {
const tsconfig = path.normalize(path.join(cwd, config.outDir, "examples", "tsconfig.json"))
const exe = platform === "win32" ? "tsc.cmd" : "tsc"
const command = Command.make(exe, "--noEmit", "--project", tsconfig)
+
yield* _(Effect.logDebug("Running tsc on examples..."))
- yield* _(Effect.asUnit(executor.exitCode(command)))
+
+ const [stdout, exitCode] = yield* _(
+ executor.start(command),
+ Effect.flatMap((process) =>
+ Effect.all([
+ process.stdout.pipe(
+ Stream.decodeText("utf-8"),
+ Stream.splitLines,
+ Stream.runCollect,
+ Effect.map(Chunk.toReadonlyArray)
+ ),
+ process.exitCode
+ ], { concurrency: 2 })
+ )
+ )
+
+ if (exitCode !== 0) {
+ yield* _(
+ new DocgenError({
+ message: `Something went wrong while running tsc on examples:\n\n${stdout.join("\n")}`
+ })
+ )
+ }
})
/**
@@ -293,8 +318,33 @@ const runTsxOnExamples = Effect.gen(function*(_) {
const index = path.join(examples, "index.ts")
const exe = platform === "win32" ? "tsx.cmd" : "tsx"
const command = Command.make(exe, "--tsconfig", tsconfig, index)
+
yield* _(Effect.logDebug("Running tsx on examples..."))
- yield* _(Effect.asUnit(executor.exitCode(command)))
+
+ const [stdout, exitCode] = yield* _(
+ executor.start(command),
+ Effect.flatMap((process) =>
+ Effect.all([
+ process.stderr.pipe(
+ Stream.decodeText("utf-8"),
+ Stream.splitLines,
+ Stream.runCollect,
+ Effect.map(Chunk.toReadonlyArray)
+ ),
+ process.exitCode
+ ], { concurrency: 2 })
+ )
+ )
+
+ if (exitCode !== 0) {
+ yield* _(
+ Effect.fail(
+ new DocgenError({
+ message: `Something went wrong while running tsx on examples:\n\n${stdout.join("\n")}`
+ })
+ )
+ )
+ }
})
const writeExamplesToOutDir = (examples: ReadonlyArray) =>