Skip to content

Add support for custom transformers (similar to ts-node) #856

@patroza

Description

@patroza

Issue description or question

Why does Quokka not respect the custom typescript compiler, which is used fine by ts-node --esm from the console?
So far it seems errors occur even before ts-node/typescript parser/compiler is leveraged.
How do I fix this behaviour?

Is this issue related to Quokka not outputting the expected results of your code?: Yes

https://github.com/effect-ts-app/playground/blob/main/starter-traced/src/main.ts

import "@effect-app/prelude/_global"

export interface Name {
  getName: Effect<never, never, string>;
}

export const Name: Tag<Name> = Tag<Name>();

export const program: Effect<Name, never, void> = Effect.gen(function* ($) {
  const { getName } = yield* $(Effect.service(Name));

  yield* $(Effect.log(`Hello ${yield* $(getName)}`));
  yield* $(Effect.die("Error"));
});

export const NameLive: Layer<never, never, Name> = Layer.effect(Name)(
  Effect.sync(() => ({
    getName: Effect.succeed("Mike"),
  }))
);

  program
  .provideLayer(NameLive)
  .tapErrorCause(_ => Effect.logErrorCauseMessage("Error", _))
  .unsafeFork

Several globals and extension methods are at play here, which are auto provided through the extended compiler.
It is important that ts-node's transpileOnly is false.

Compiled output (for reference)

import * as tracer_1 from "@effect/io/Debug";
const fileName_1 = "~/Projects/effect-ts-app/playground/starter-traced/src/main.ts";
import * as tsplus_module_1 from "@fp-ts/data/Context";
import * as tsplus_module_2 from "@effect/io/Effect";
import * as tsplus_module_3 from "@effect-app/core/Effect";
import "@effect-app/prelude/_global";
export const Name = tsplus_module_1.Tag();
export const program = tracer_1.withCallTrace(fileName_1 + ":9:58")(tsplus_module_2.gen(function* ($) {
    const { getName } = yield* $(tracer_1.withCallTrace(fileName_1 + ":10:39")(tsplus_module_2.service(Name)));
    yield* $(tracer_1.withCallTrace(fileName_1 + ":12:19")(tsplus_module_2.log(`Hello ${yield* $(getName)}`)));
    yield* $(tracer_1.withCallTrace(fileName_1 + ":13:19")(tsplus_module_2.die("Error")));
}));
export const NameLive = tsplus_module_3.LayerFromEffect(Name)(tracer_1.withCallTrace(fileName_1 + ":17:10")(tsplus_module_2.sync(() => ({
    getName: tracer_1.withCallTrace(fileName_1 + ":18:21")(tsplus_module_2.succeed("Mike")),
}))));
tsplus_module_2.unsafeFork(tracer_1.withCallTrace(fileName_1 + ":24:4")(tsplus_module_2.tapErrorCause(_ => tracer_1.withCallTrace(fileName_1 + ":24:30")(tsplus_module_2.logErrorCauseMessage("Error", _))))(tracer_1.withCallTrace(fileName_1 + ":23:4")(tsplus_module_2.provideLayer(NameLive))(program)));

Sample repository link

timestamp=2023-01-20T09:45:05.240Z level=INFO fiber=#0 message="Hello Mike"
timestamp=2023-01-20T09:45:05.242Z level=ERROR fiber=#0 message=Error cause="
An unchecked error was produced.

\"Error\"

Stack:

~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:9:58
~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:24:4

Execution:

~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:13:19
~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:9:58
~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:12:19
~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:9:58
~/Projects/effect-ts-app/playground/starter-traced/src/main.ts:18:21

"
  • open vscode from within the starter-traced folder
  • Set VS Code Typescript compiler to the node_modules one
  • Open main.ts
  • Quokka: Start on Current File

Quokka console output

​​​​​Quokka PRO 'main.ts' (node: v18.12.1, TypeScript: v5.0.0-tsplus.20230113)​​​​
 
Tag is not defined 
  ​​​​​at ​​​​​​starter-traced/src/main.ts:7​

Code editor version

Visual Studio Code v1.74.1

OS name and version

OSX Ventura 13.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions