├── .gitignore ├── test2.ts ├── oxc-register.js ├── README.md ├── test.ts ├── package.json ├── oxc-hook.js └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /test2.ts: -------------------------------------------------------------------------------- 1 | export function err() { 2 | throw new Error('err') 3 | } 4 | -------------------------------------------------------------------------------- /oxc-register.js: -------------------------------------------------------------------------------- 1 | import { register } from 'node:module' 2 | 3 | register('./oxc-hook.js', import.meta.url) 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Run TS files in Node with oxc transform 2 | 3 | ``` 4 | node --import ./oxc-register.js --enable-source-maps test.ts 5 | ``` 6 | -------------------------------------------------------------------------------- /test.ts: -------------------------------------------------------------------------------- 1 | import { err } from './test2.ts' 2 | 3 | const a: number = 1 4 | 5 | console.log(a) 6 | 7 | // uncomment the following line to assert correct stack trace in source maps 8 | err() 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "dependencies": { 4 | "oxc-transform": "^0.16.3" 5 | }, 6 | "scripts": { 7 | "test": "node --import ./oxc-register.js --enable-source-maps test.ts" 8 | }, 9 | "packageManager": "pnpm@9.4.0" 10 | } 11 | -------------------------------------------------------------------------------- /oxc-hook.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url' 2 | import { transform } from 'oxc-transform' 3 | 4 | const extensionsRegex = /\.tsx?$/ 5 | 6 | // TODO use oxc-resolver & respect tsconfig.json 7 | // export async function resolve(specifier, context, nextResolve) { 8 | // console.log(specifier, context) 9 | // if (extensionsRegex.test(context.parentURL)) { 10 | 11 | // } 12 | // return nextResolve(specifier, context) 13 | // } 14 | 15 | export async function load(url, context, nextLoad) { 16 | if (extensionsRegex.test(url)) { 17 | const { source: rawSource } = await nextLoad(url, { 18 | ...context, 19 | format: 'module' 20 | }) 21 | 22 | const { sourceText: transformedSource, map } = transform( 23 | fileURLToPath(url), 24 | rawSource.toString(), 25 | { sourcemap: true } 26 | ) 27 | 28 | // TODO this should be handled by oxc with an inline sourcemap option 29 | const mapString = JSON.stringify(map) 30 | const sourceWithMap = 31 | transformedSource + 32 | `\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,` + 33 | Buffer.from(mapString).toString('base64') 34 | 35 | return { 36 | format: 'module', 37 | shortCircuit: true, 38 | source: sourceWithMap 39 | } 40 | } 41 | 42 | // Let Node.js handle all other URLs. 43 | return nextLoad(url) 44 | } 45 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | oxc-transform: 12 | specifier: ^0.16.3 13 | version: 0.16.3 14 | 15 | packages: 16 | 17 | '@oxc-transform/binding-darwin-arm64@0.16.3': 18 | resolution: {integrity: sha512-PShqNXHeGAT1UUMoqgsVV5d2cAjqNSKt4fniMhGMiaQU/gTJVmSor9L0ai/Zw0tM4yqPc/49Um6+FLzOCnU/dg==} 19 | cpu: [arm64] 20 | os: [darwin] 21 | 22 | '@oxc-transform/binding-darwin-x64@0.16.3': 23 | resolution: {integrity: sha512-x8VojH5rPTMWZXY/SWTX5WIb1RzOBrbPdXeNN/o28MUbb0Kb2lD8JhQwTI8SpDpEjv+RBag/vnEJiBPDnfQVdA==} 24 | cpu: [x64] 25 | os: [darwin] 26 | 27 | '@oxc-transform/binding-linux-arm64-gnu@0.16.3': 28 | resolution: {integrity: sha512-F5d0cKy3t+NzUjmT+IJ0uMLMo1ZjtzCWI6Lyyph6Dl4R1ZL/BhA1RaBnCEEWBSfHYs3mGnqSM8nqsBx+1aASdA==} 29 | cpu: [arm64] 30 | os: [linux] 31 | 32 | '@oxc-transform/binding-linux-arm64-musl@0.16.3': 33 | resolution: {integrity: sha512-cV19dC6Ajgw2UDbgZ6eoWMlg4cfGRFiwCz9YBlt0qzLl88wixDthPergZBXJxkopgv/jLFSOSIR6DHQNqeurYg==} 34 | cpu: [arm64] 35 | os: [linux] 36 | 37 | '@oxc-transform/binding-linux-x64-gnu@0.16.3': 38 | resolution: {integrity: sha512-7JgHGqycjA9dv41ELQ55HHcGTO+UJcYL91/tXoEY4qwuWLpXDekLRg+qUgmFI93jUxyknCB6+zC7H6VgJkij4A==} 39 | cpu: [x64] 40 | os: [linux] 41 | 42 | '@oxc-transform/binding-linux-x64-musl@0.16.3': 43 | resolution: {integrity: sha512-b0V06PFnLK3CAwa+F/4dMDxqY5Jn9bbH6haeOgWNzayJLA6wKxYknbSpU6ZHjdmu/sy6Q0Ez62Cp1ioyFYlrTg==} 44 | cpu: [x64] 45 | os: [linux] 46 | 47 | '@oxc-transform/binding-win32-arm64-msvc@0.16.3': 48 | resolution: {integrity: sha512-dXHhIcbjX61jpmXBMx1Vvna2vyFJDgl/EcPFbZfhAgcGIHOoMJ+w5xrhH+WnKS2w+BEcfrjoBiF1gKg08gOcIA==} 49 | cpu: [arm64] 50 | os: [win32] 51 | 52 | '@oxc-transform/binding-win32-x64-msvc@0.16.3': 53 | resolution: {integrity: sha512-tYqmHGGSYbNUnnN4nACNCxi/zDLyZu5DGcr2Cif89GZboxX2SjWOv15hRnu+Ku/H3ctTxTsHSt4PxnSCF2axEg==} 54 | cpu: [x64] 55 | os: [win32] 56 | 57 | oxc-transform@0.16.3: 58 | resolution: {integrity: sha512-0VzI9MtIdsU46G73qCo+tIHP9sO+Ok8a68htz80eX0+aROONEKcCzJcyRXrJo0NBtiaD4Gx+GqbhthfZdJxDgw==} 59 | 60 | snapshots: 61 | 62 | '@oxc-transform/binding-darwin-arm64@0.16.3': 63 | optional: true 64 | 65 | '@oxc-transform/binding-darwin-x64@0.16.3': 66 | optional: true 67 | 68 | '@oxc-transform/binding-linux-arm64-gnu@0.16.3': 69 | optional: true 70 | 71 | '@oxc-transform/binding-linux-arm64-musl@0.16.3': 72 | optional: true 73 | 74 | '@oxc-transform/binding-linux-x64-gnu@0.16.3': 75 | optional: true 76 | 77 | '@oxc-transform/binding-linux-x64-musl@0.16.3': 78 | optional: true 79 | 80 | '@oxc-transform/binding-win32-arm64-msvc@0.16.3': 81 | optional: true 82 | 83 | '@oxc-transform/binding-win32-x64-msvc@0.16.3': 84 | optional: true 85 | 86 | oxc-transform@0.16.3: 87 | optionalDependencies: 88 | '@oxc-transform/binding-darwin-arm64': 0.16.3 89 | '@oxc-transform/binding-darwin-x64': 0.16.3 90 | '@oxc-transform/binding-linux-arm64-gnu': 0.16.3 91 | '@oxc-transform/binding-linux-arm64-musl': 0.16.3 92 | '@oxc-transform/binding-linux-x64-gnu': 0.16.3 93 | '@oxc-transform/binding-linux-x64-musl': 0.16.3 94 | '@oxc-transform/binding-win32-arm64-msvc': 0.16.3 95 | '@oxc-transform/binding-win32-x64-msvc': 0.16.3 96 | --------------------------------------------------------------------------------