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) =>