{"version":3,"file":"hooks.mjs","sourceRoot":"","sources":["../../../src/hooks/hooks.mts"],"names":[],"mappings":"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","sourcesContent":["import { writeSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport type {\n  GlobalPreloadHook,\n  InitializeHook,\n  LoadHook,\n  ResolveHook,\n} from 'node:module'\nimport { resolve as pathResolve } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { format } from 'node:util'\nimport { MessagePort } from 'node:worker_threads'\nimport { classifyModule } from '../classify-module.js'\nimport { DaemonClient } from '../client.js'\nimport { getDiagMode } from '../diagnostic-mode.js'\n\n// in some cases on the loader thread, console.error doesn't actually\n// print. sync write to fd 1 instead.\nconst consoleError = (...msg: any[]) =>\n  writeSync(1, format(...msg) + '\\n')\n\nconst diagMode = getDiagMode()\nlet client: DaemonClient\nconst getClient = () => client ?? (client = new DaemonClient())\n\nlet pretty = !!process.stderr.isTTY\nexport const getPretty = () => !!pretty\nexport const globalPreload: GlobalPreloadHook = ({ port }) => {\n  const base = String(new URL(import.meta.url))\n  port.on('message', ({ stderrIsTTY }) => (pretty = stderrIsTTY))\n  port.unref()\n  return `\nprocess.setSourceMapsEnabled(true)\nconst { createRequire } = getBuiltin('module')\nconst { fileURLToPath } = getBuiltin('url')\nconst require = createRequire(${JSON.stringify(base)})\nrequire('../../commonjs/hooks/require.js')\nport?.postMessage({ stderrIsTTY: !!process.stderr.isTTY })\nport?.unref()\n  `\n}\n\nexport const initialize: InitializeHook = ({\n  port,\n}: {\n  port: MessagePort\n}) => {\n  port.on('message', ({ stderrIsTTY }) => (pretty = stderrIsTTY))\n  port.unref()\n}\n\nexport const resolve: ResolveHook = async (\n  url,\n  context,\n  nextResolve,\n) => {\n  const { parentURL } = context\n  const target =\n    /* c8 ignore start */\n    parentURL && (url.startsWith('./') || url.startsWith('../')) ?\n      /* c8 ignore stop */\n      String(new URL(url, parentURL))\n    : url\n  return nextResolve(\n    target.startsWith('file://') && !startsWithCS(target, nm) ?\n      await getClient().resolve(url, parentURL)\n    : url,\n    context,\n  )\n}\n\n// case (in-)sensitive String.startsWith\nconst cs =\n  process.platform !== 'win32' && process.platform !== 'darwin'\n/* c8 ignore start */\nconst startsWithCS =\n  cs ?\n    (haystack: string, needle: string) => haystack.startsWith(needle)\n  : (haystack: string, needle: string) =>\n      haystack.toUpperCase().startsWith(needle.toUpperCase())\n/* c8 ignore stop */\n\n// ts programs have import filenames like ./x.js, but the source\n// lives in ./x.ts. Find the source and compile it.\nconst nm = String(pathToFileURL(pathResolve('node_modules'))) + '/'\nconst proj = String(pathToFileURL(process.cwd())) + '/'\nlet hookedCJS = false\nexport const load: LoadHook = async (url, context, nextLoad) => {\n  if (startsWithCS(url, proj) && !startsWithCS(url, nm)) {\n    const inputFile = fileURLToPath(url)\n    const { fileName, diagnostics } = await getClient().compile(\n      inputFile,\n      diagMode,\n      pretty,\n    )\n    for (const d of diagnostics) consoleError(d)\n    if (!fileName) {\n      throw Object.assign(new Error('compile failure'), {\n        code: 'E_TSIMP_COMPILE_FAILURE',\n        url,\n        context,\n      })\n    }\n    const format = classifyModule(inputFile)\n    hookedCJS ||= format === 'commonjs'\n    return {\n      source: await readFile(fileName, 'utf8'),\n      shortCircuit: true,\n      format,\n    }\n  }\n\n  // if we return a source for commonjs ever, we MUST return sources\n  // for all commonjs resolutions thereafter.\n  // See: https://github.com/nodejs/node/issues/50435\n  const result = await nextLoad(url, context)\n  if (hookedCJS && result.format === 'commonjs' && !result.source) {\n    result.source = await readFile(fileURLToPath(url), 'utf8')\n  }\n  return result\n}\n"]}