Skip to content

Commit f7b55f1

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

File tree

10 files changed

+440
-438
lines changed

10 files changed

+440
-438
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

+4
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>,

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

+12-4
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',
@@ -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) {

packages/core/lib/Worker.js

+33-54
Original file line numberDiff line numberDiff line change
@@ -1,43 +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');
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';
1010

11-
const getParser = require('jscodeshift/src/getParser');
12-
const jscodeshift = require('jscodeshift/src/core');
11+
import getParser from 'jscodeshift/src/getParser.js';
12+
import jscodeshift from 'jscodeshift/src/core.js';
1313

14-
let presetEnv;
15-
try {
16-
presetEnv = require('@babel/preset-env');
17-
} catch (_) {}
14+
const __filename = fileURLToPath(import.meta.url);
15+
16+
/**
17+
* Register the TSX plugin to allow require TS(X) files.
18+
*/
19+
import { register } from 'tsx/esm/api';
20+
register();
1821

1922
let emitter;
2023
let finish;
2124
let notify;
2225
let transform;
2326
let parserFromTransform;
2427

25-
if (module.parent) {
28+
if (import.meta.url.replace('file://', '') !== process.argv[1]) {
2629
emitter = new EventEmitter();
2730
// @ts-expect-error
2831
emitter.send = data => run(data);
2932
finish = () => emitter.emit('disconnect');
3033
notify = data => emitter.emit('message', data);
31-
32-
module.exports = args => {
33-
setup(args[0], args[1]);
34-
return emitter;
35-
};
3634
} else {
3735
finish = () => setImmediate(() => process.disconnect());
3836
notify = data => process.send(data);
3937
process.on('message', data => run(data));
40-
setup(process.argv[2], process.argv[3]);
38+
await setup(process.argv[2], process.argv[3]);
39+
}
40+
41+
// Used by `run-in-band` to run the worker in the same process
42+
export default async function main(args) {
43+
await setup(args[0], args[1]);
44+
return emitter;
4145
}
4246

4347
function prepareJscodeshift(options) {
@@ -59,59 +63,34 @@ function retrievePath(str) {
5963
}
6064

6165
function getModule(mod) {
62-
return mod.hasOwnProperty('default') ? mod.default : mod;
66+
return Boolean(mod.default) ? mod.default : mod;
6367
}
6468

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-
}
69+
async function getModuleName(path) {
70+
const moduleName = retrievePath(path).split('node_modules/')[1];
71+
const pkg = await import(moduleName);
72+
return getModule(pkg);
73+
}
9674

75+
async function setup(entryPath) {
9776
const transformId = retrieveTransformId(entryPath);
9877
const presetId = retrievePresetId(entryPath);
9978

10079
let transformPkg;
10180
let transformModule;
10281

10382
if (transformId) {
104-
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
83+
transformPkg = await getModuleName(entryPath);
10584
transformModule = transformPkg.transforms[transformId];
10685
}
10786

10887
if (presetId) {
109-
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
88+
transformPkg = await getModuleName(entryPath);
11089
transformModule = transformPkg.presets[presetId];
11190
}
11291

11392
if (!transformId && !presetId) {
114-
transformModule = require(path.resolve(entryPath));
93+
transformModule = await import(path.resolve(entryPath));
11594
}
11695

11796
transform = getModule(transformModule);

0 commit comments

Comments
 (0)