Skip to content

Commit 0d84e40

Browse files
author
Daniel Del Core
committed
__dirname
1 parent 10ab803 commit 0d84e40

File tree

11 files changed

+436
-442
lines changed

11 files changed

+436
-442
lines changed

packages/cli/src/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'path';
22
import { readFileSync } from 'fs';
3+
import { fileURLToPath } from 'url';
34
import chalk from 'chalk';
45
import { Command, Option, CommanderError } from 'commander';
56

@@ -9,6 +10,9 @@ import init from './init.js';
910
import validate from './validate.js';
1011
import { InvalidUserInputError, InvalidConfigError } from './errors.js';
1112

13+
const __filename = fileURLToPath(import.meta.url);
14+
const __dirname = path.dirname(__filename);
15+
1216
const packageJson = readFileSync(
1317
path.join(__dirname, '..', 'package.json'),
1418
'utf-8',

packages/cli/src/main.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import semver from 'semver';
33
import chalk from 'chalk';
44
import findUp from 'find-up';
55
import inquirer from 'inquirer';
6+
import { fileURLToPath } from 'url';
67
import { PluginManager, PluginManagerOptions } from 'live-plugin-manager';
78

89
import * as core from '@hypermod/core';
@@ -21,6 +22,9 @@ import {
2122
import ModuleLoader from './utils/module-loader.js';
2223
import { getConfigPrompt, getMultiConfigPrompt } from './prompt.js';
2324

25+
const filename = fileURLToPath(import.meta.url);
26+
const dirname = path.dirname(filename);
27+
2428
export default async function main(
2529
paths: string[],
2630
flags: Partial<core.Flags>,
@@ -32,7 +36,7 @@ export default async function main(
3236
}
3337

3438
const pluginManagerConfig: Partial<PluginManagerOptions> = {
35-
pluginsPath: path.join(__dirname, '..', 'node_modules'),
39+
pluginsPath: path.join(dirname, '..', 'node_modules'),
3640
};
3741

3842
// If a registry is provided in the CLI flags, use it for the pluginManagers configuration.

packages/cli/src/utils/module-loader.ts

+14-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import path from 'path';
22
import fs from 'fs-extra';
3+
import { fileURLToPath } from 'url';
34
import { installPackage } from '@antfu/install-pkg';
45

56
import { ModuleLoader } from '@hypermod/fetcher';
67

8+
const filename = fileURLToPath(import.meta.url);
9+
const dirname = path.dirname(filename);
10+
711
/**
812
* Register the TSX plugin to allow require TS(X) files.
913
*/
@@ -14,9 +18,13 @@ const ModuleLoader = (config: {
1418
npmRegistryUrl?: string;
1519
authToken?: string;
1620
}): ModuleLoader => {
17-
const getInfo = (packageName: string) => {
18-
const entryPath = require.resolve(packageName);
19-
const location = entryPath.split(packageName)[0] + packageName;
21+
const getInfo = async (packageName: string) => {
22+
// @ts-expect-error - TS doesn't know about import.meta
23+
const entryPath = await import.meta.resolve(packageName);
24+
const location = (entryPath.split(packageName)[0] + packageName).replace(
25+
'file://',
26+
'',
27+
);
2028
const pkgJsonRaw = fs.readFileSync(
2129
path.join(location, 'package.json'),
2230
'utf8',
@@ -32,7 +40,7 @@ const ModuleLoader = (config: {
3240

3341
const install = async (packageName: string) => {
3442
await installPackage(packageName, {
35-
cwd: __dirname,
43+
cwd: dirname,
3644
packageManager: 'npm',
3745
additionalArgs: [
3846
'--force',
@@ -44,7 +52,7 @@ const ModuleLoader = (config: {
4452
],
4553
});
4654

47-
const { pkgJson } = getInfo(packageName);
55+
const { pkgJson } = await getInfo(packageName);
4856

4957
// Install whitelisted devDependencies
5058
if (pkgJson?.hypermod?.dependencies) {
@@ -53,7 +61,7 @@ const ModuleLoader = (config: {
5361
const version = pkgJson.devDependencies[dep];
5462
if (!version) return;
5563
return installPackage(`${dep}@${version}`, {
56-
cwd: __dirname,
64+
cwd: dirname,
5765
packageManager: 'npm',
5866
additionalArgs: ['--force'],
5967
});

packages/core/lib/Worker.js

+33-55
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,47 @@
11
/* eslint-disable @typescript-eslint/no-var-requires */
22
'use strict';
33

4-
const path = require('path');
5-
const { EventEmitter } = require('events');
6-
const async = require('neo-async');
7-
const fs = require('graceful-fs');
8-
const writeFileAtomic = require('write-file-atomic');
9-
const { DEFAULT_EXTENSIONS } = require('@babel/core');
10-
11-
const getParser = require('jscodeshift/src/getParser');
12-
const jscodeshift = require('jscodeshift/src/core');
13-
14-
let presetEnv;
15-
try {
16-
presetEnv = require('@babel/preset-env');
17-
} catch (_) {}
4+
import path from 'path';
5+
import { fileURLToPath } from 'url';
6+
import fs from 'graceful-fs';
7+
import { EventEmitter } from 'events';
8+
import async from 'neo-async';
9+
import writeFileAtomic from 'write-file-atomic';
10+
11+
import getParser from 'jscodeshift/src/getParser.js';
12+
import jscodeshift from 'jscodeshift/src/core.js';
13+
14+
/**
15+
* Register the TSX plugin to allow require TS(X) files.
16+
*/
17+
import { register } from 'tsx/esm/api';
18+
register();
1819

1920
let emitter;
2021
let finish;
2122
let notify;
2223
let transform;
2324
let parserFromTransform;
2425

25-
if (module.parent) {
26+
if (import.meta.url.replace('file://', '') !== process.argv[1]) {
2627
emitter = new EventEmitter();
2728
// @ts-expect-error
2829
emitter.send = data => run(data);
2930
finish = () => emitter.emit('disconnect');
3031
notify = data => emitter.emit('message', data);
31-
32-
module.exports = args => {
33-
setup(args[0], args[1]);
34-
return emitter;
35-
};
3632
} else {
3733
finish = () => setImmediate(() => process.disconnect());
3834
notify = data => process.send(data);
3935
process.on('message', data => run(data));
4036
setup(process.argv[2], process.argv[3]);
4137
}
4238

39+
// Used by `run-in-band` to run the worker in the same process
40+
export default async function main(args) {
41+
await setup(args[0], args[1]);
42+
return emitter;
43+
}
44+
4345
function prepareJscodeshift(options) {
4446
const parser =
4547
parserFromTransform || getParser(options.parser, options.parserConfig);
@@ -59,59 +61,34 @@ function retrievePath(str) {
5961
}
6062

6163
function getModule(mod) {
62-
return mod.hasOwnProperty('default') ? mod.default : mod;
64+
return Boolean(mod.default) ? mod.default : mod;
6365
}
6466

65-
function setup(entryPath, babel) {
66-
if (babel === 'babel') {
67-
const presets = [];
68-
if (presetEnv) {
69-
presets.push([presetEnv.default, { targets: { node: true } }]);
70-
}
71-
72-
presets.push(require('@babel/preset-typescript').default);
73-
74-
require('@babel/register')({
75-
configFile: false,
76-
babelrc: false,
77-
presets,
78-
plugins: [
79-
require('@babel/plugin-proposal-class-properties').default,
80-
require('@babel/plugin-proposal-nullish-coalescing-operator').default,
81-
require('@babel/plugin-proposal-optional-chaining').default,
82-
require('@babel/plugin-transform-modules-commonjs').default,
83-
],
84-
extensions: [...DEFAULT_EXTENSIONS, '.ts', '.tsx'],
85-
// By default, babel register only compiles things inside the current working directory.
86-
// https://github.com/babel/babel/blob/2a4f16236656178e84b05b8915aab9261c55782c/packages/babel-register/src/node.js#L140-L157
87-
ignore: [
88-
// Ignore parser related files
89-
/@babel\/parser/,
90-
/\/flow-parser\//,
91-
/\/recast\//,
92-
/\/ast-types\//,
93-
],
94-
});
95-
}
67+
async function getModuleName(path) {
68+
const moduleName = retrievePath(path).split('node_modules/')[1];
69+
const pkg = await import(moduleName);
70+
return getModule(pkg);
71+
}
9672

73+
async function setup(entryPath) {
9774
const transformId = retrieveTransformId(entryPath);
9875
const presetId = retrievePresetId(entryPath);
9976

10077
let transformPkg;
10178
let transformModule;
10279

10380
if (transformId) {
104-
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
81+
transformPkg = await getModuleName(entryPath);
10582
transformModule = transformPkg.transforms[transformId];
10683
}
10784

10885
if (presetId) {
109-
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
86+
transformPkg = await getModuleName(entryPath);
11087
transformModule = transformPkg.presets[presetId];
11188
}
11289

11390
if (!transformId && !presetId) {
114-
transformModule = require(path.resolve(entryPath));
91+
transformModule = await import(path.resolve(entryPath));
11592
}
11693

11794
transform = getModule(transformModule);
@@ -141,6 +118,7 @@ function trimStackTrace(trace) {
141118
// Remove this file from the stack trace of an error thrown in the transformer
142119
const result = [];
143120
trace.split('\n').every(line => {
121+
const __filename = fileURLToPath(import.meta.url);
144122
if (line.indexOf(__filename) === -1) {
145123
result.push(line);
146124
return true;

0 commit comments

Comments
 (0)