261026.1 · b6bf196ae1e954da44a0f35532cd30b2e0969202
feat: use module.registerHooks for amaro/strip and amaro/transform
Use synchronous module.registerHooks() when available, so the loaders also apply to require() of TypeScript and avoid the loader thread. Fall back to module.register() on Node.js versions without it.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
reading declarations
Changes to src/strip-loader.ts. All files
@@ -3,40 +3,62 @@ import { fileURLToPath } from "node:url"; import { isSwcError, wrapAndReThrowSwcError } from "./errors.js"; import { transformSync } from "./index.js"; +type NextLoad = (+ url: string,+ context?: Partial<LoadHookContext>,+) => LoadFnOutput;++function strip(url: string, format: string, source: LoadFnOutput["source"]) {+ try {+ // biome-ignore lint/style/noNonNullAssertion: If module exists, it will have a source+ const { code } = transformSync(source!.toString(), {+ mode: "strip-only",+ filename: fileURLToPath(url),+ });+ return {+ format: format.replace("-typescript", ""),+ // Source map is not necessary in strip-only mode. However, to map the source+ // file in debuggers to the original TypeScript source, add a sourceURL magic+ // comment to hint that it is a generated source.+ source: `${code}\n\n//# sourceURL=${url}`,+ };+ } catch (error: unknown) {+ if (isSwcError(error)) {+ wrapAndReThrowSwcError(error);+ }+ // If the error is not an SwcError, rethrow it+ throw error;+ }+}++// Synchronous hook for `module.registerHooks()`.+export function loadSync(+ url: string,+ context: LoadHookContext,+ nextLoad: NextLoad,+) {+ const { format } = context;+ if (format?.endsWith("-typescript")) {+ const { source } = nextLoad(url, { ...context, format });+ return strip(url, format, source);+ }+ return nextLoad(url, context);+}++// Asynchronous hook for `module.register()`, used on Node.js versions that+// do not provide `module.registerHooks()`. export async function load( url: string, context: LoadHookContext, nextLoad: ( url: string,- context?: LoadHookContext,+ context?: Partial<LoadHookContext>, ) => LoadFnOutput | Promise<LoadFnOutput>, ) { const { format } = context; if (format?.endsWith("-typescript")) {- try {- const { source } = await nextLoad(url, {- ...context,- format,- });- // biome-ignore lint/style/noNonNullAssertion: If module exists, it will have a source- const { code } = transformSync(source!.toString(), {- mode: "strip-only",- filename: fileURLToPath(url),- });- return {- format: format.replace("-typescript", ""),- // Source map is not necessary in strip-only mode. However, to map the source- // file in debuggers to the original TypeScript source, add a sourceURL magic- // comment to hint that it is a generated source.- source: `${code}\n\n//# sourceURL=${url}`,- };- } catch (error: unknown) {- if (isSwcError(error)) {- wrapAndReThrowSwcError(error);- }- // If the error is not an SwcError, rethrow it- throw error;- }+ const { source } = await nextLoad(url, { ...context, format });+ return strip(url, format, source); } return nextLoad(url, context); }