Skip to content

Commit 0b45155

Browse files
author
Daniel Del Core
committed
Promotes the experimental loader as the defeault module loading mechanism
1 parent 68206cd commit 0b45155

File tree

7 files changed

+73
-94
lines changed

7 files changed

+73
-94
lines changed

packages/cli/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
"fs-extra": "^9.1.0",
3131
"inquirer": "^8.2.4",
3232
"jscodeshift": "^0.13.1",
33-
"live-plugin-manager": "^0.18.1",
3433
"lodash": "^4.17.21",
3534
"ora": "^5.4.1",
3635
"semver": "^7.3.5",

packages/cli/src/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,6 @@ program
7070
'--registryToken <value>',
7171
'Define an authentication token to use as credentials for the registry',
7272
)
73-
.option(
74-
'--experimental-loader',
75-
'Enables the experimental package downloader',
76-
)
7773
.addOption(
7874
new Option(
7975
'--verbose <parser>',

packages/cli/src/list.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
import chalk from 'chalk';
2-
import { PluginManager } from 'live-plugin-manager';
32

43
import { fetchPackages } from './utils/fetch-package.js';
54
import { getHypermodPackageName } from './utils/package-names.js';
65

76
export default async function list(packages: string[]) {
8-
const packageManager = new PluginManager();
97
const configs = [];
108

119
for (const packageName of packages) {
1210
try {
13-
const { community, remote } = await fetchPackages(
14-
packageName,
15-
packageManager,
16-
);
11+
const { community, remote } = await fetchPackages(packageName);
1712
community &&
1813
configs.push({
1914
packageName: getHypermodPackageName(packageName),

packages/cli/src/main.ts

Lines changed: 2 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@ import semver from 'semver';
33
import chalk from 'chalk';
44
import findUp from 'find-up';
55
import inquirer from 'inquirer';
6-
import fs from 'fs-extra';
7-
import { PluginManager, PluginManagerOptions } from 'live-plugin-manager';
8-
import { installPackage } from '@antfu/install-pkg';
6+
import { PluginManagerOptions } from 'live-plugin-manager';
97

108
import * as core from '@hypermod/core';
119
import { fetchConfigAtPath } from '@hypermod/fetcher';
@@ -19,57 +17,6 @@ import {
1917
} from './utils/file-system.js';
2018
import { getConfigPrompt, getMultiConfigPrompt } from './prompt.js';
2119

22-
const ExperimentalModuleLoader = () => {
23-
const getInfo = async (packageName: string) => {
24-
// @ts-expect-error Experimental loader
25-
const entryPath = import.meta.resolve(packageName);
26-
// @ts-expect-error Experimental loader
27-
const location = (entryPath.split(packageName)[0] + packageName).replace(
28-
'file://',
29-
'',
30-
);
31-
const pkgJsonRaw = fs.readFileSync(
32-
path.join(location.replace('file://', ''), 'package.json'),
33-
'utf8',
34-
);
35-
const pkgJson = JSON.parse(pkgJsonRaw);
36-
37-
return { location, entryPath, pkgJson };
38-
};
39-
40-
const install = async (packageName: string) => {
41-
const __dirname = path.dirname(new URL(import.meta.url).pathname);
42-
await installPackage(packageName, {
43-
cwd: __dirname,
44-
packageManager: 'npm',
45-
additionalArgs: ['--force'],
46-
});
47-
48-
const { pkgJson } = await getInfo(packageName);
49-
50-
// Install whitelisted devDependencies
51-
if (pkgJson?.hypermod?.dependencies) {
52-
await Promise.all(
53-
pkgJson.hypermod.dependencies.map((dep: string) => {
54-
const version = pkgJson.devDependencies[dep];
55-
if (!version) return;
56-
return installPackage(`${dep}@${version}`, {
57-
cwd: __dirname,
58-
packageManager: 'npm',
59-
additionalArgs: ['--force'],
60-
});
61-
}),
62-
);
63-
}
64-
};
65-
66-
return {
67-
install,
68-
getInfo,
69-
require: async (packageName: string) => import(packageName),
70-
};
71-
};
72-
7320
export default async function main(
7421
paths: string[],
7522
flags: Partial<core.Flags>,
@@ -100,10 +47,6 @@ export default async function main(
10047
};
10148
}
10249

103-
const packageManager = flags.experimentalLoader
104-
? ExperimentalModuleLoader()
105-
: new PluginManager(pluginManagerConfig);
106-
10750
let transforms: string[] = [];
10851

10952
if (!flags.transform && !flags.packages) {
@@ -254,11 +197,7 @@ export default async function main(
254197
.filter(id => id.startsWith('#'))
255198
.map(id => id.substring(1));
256199

257-
const { community, remote } = await fetchPackages(
258-
pkgName,
259-
// @ts-expect-error Experimental loader
260-
packageManager,
261-
);
200+
const { community, remote } = await fetchPackages(pkgName);
262201

263202
const config = mergeConfigs(community, remote);
264203

packages/cli/src/utils/fetch-package.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import ora from 'ora';
22
import chalk from 'chalk';
3-
import { PluginManager } from 'live-plugin-manager';
43

54
import {
65
fetchPackage,
@@ -11,10 +10,7 @@ import { isValidConfig } from '@hypermod/validator';
1110

1211
import { getHypermodPackageName } from './package-names.js';
1312

14-
export async function fetchPackages(
15-
packageName: string,
16-
packageManager: PluginManager,
17-
) {
13+
export async function fetchPackages(packageName: string) {
1814
const hypermodPackageName = getHypermodPackageName(packageName);
1915
let hypermodPackage: ConfigMeta | undefined;
2016
let remotePackage: ConfigMeta | undefined;
@@ -24,7 +20,7 @@ export async function fetchPackages(
2420
).start();
2521

2622
try {
27-
hypermodPackage = await fetchPackage(hypermodPackageName, packageManager);
23+
hypermodPackage = await fetchPackage(hypermodPackageName);
2824
spinner.succeed(
2925
`${chalk.green('Found Hypermod package:')} ${hypermodPackageName}`,
3026
);
@@ -46,7 +42,7 @@ export async function fetchPackages(
4642
spinner.info(
4743
`${chalk.green(`Attempting to download npm package:`)} ${packageName}`,
4844
);
49-
remotePackage = await fetchRemotePackage(packageName, packageManager);
45+
remotePackage = await fetchRemotePackage(packageName);
5046
spinner.succeed(
5147
`${chalk.green('Found remote Hypermod package:')} ${packageName}`,
5248
);

packages/fetcher/src/index.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22
import fs from 'fs';
33
import path from 'path';
44
import globby from 'globby';
5-
import { PluginManager } from 'live-plugin-manager';
65

76
import { Config } from '@hypermod/types';
8-
import { register } from 'tsx/esm/api';
7+
8+
import ModuleLoader from './module-loader.js';
99

1010
/**
1111
* Register the TSX plugin to allow require TS(X) files.
1212
*/
13+
import { register } from 'tsx/esm/api';
1314
register();
1415

16+
const moduleLoader = ModuleLoader();
17+
1518
export interface ConfigMeta {
1619
filePath: string;
1720
config: Config;
@@ -80,13 +83,10 @@ export async function fetchConfigAtPath(filePath: string): Promise<Config> {
8083
return requireConfig(filePath, resolvedFilePath);
8184
}
8285

83-
export async function fetchPackage(
84-
packageName: string,
85-
packageManager: PluginManager,
86-
): Promise<ConfigMeta> {
87-
await packageManager.install(packageName);
88-
const pkg = await packageManager.require(packageName);
89-
const info = await packageManager.getInfo(packageName);
86+
export async function fetchPackage(packageName: string): Promise<ConfigMeta> {
87+
await moduleLoader.install(packageName);
88+
const pkg = await moduleLoader.require(packageName);
89+
const info = await moduleLoader.getInfo(packageName);
9090

9191
if (!info) {
9292
throw new Error(`Unable to find package info for: ${packageName}`);
@@ -100,14 +100,13 @@ export async function fetchPackage(
100100

101101
export async function fetchRemotePackage(
102102
packageName: string,
103-
packageManager: PluginManager,
104103
): Promise<ConfigMeta | undefined> {
105104
if (['javascript', 'typescript'].includes(packageName)) {
106105
throw new Error(`'${packageName}' is ignored as a remote package.`);
107106
}
108107

109-
await packageManager.install(packageName);
110-
const info = await packageManager.getInfo(packageName);
108+
await moduleLoader.install(packageName);
109+
const info = await moduleLoader.getInfo(packageName);
111110

112111
if (!info) {
113112
throw new Error(
@@ -117,7 +116,7 @@ export async function fetchRemotePackage(
117116

118117
// Search main entrypoint for transform/presets from the default import
119118
try {
120-
const pkg = await packageManager.require(packageName);
119+
const pkg = await moduleLoader.require(packageName);
121120
const configExport = resolveConfigExport(pkg);
122121

123122
if (configExport.transforms || configExport.presets) {

packages/fetcher/src/module-loader.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import path from 'path';
2+
import fs from 'fs-extra';
3+
import { installPackage } from '@antfu/install-pkg';
4+
5+
const ModuleLoader = () => {
6+
const getInfo = async (packageName: string) => {
7+
// @ts-expect-error Experimental loader
8+
const entryPath = await import.meta.resolve(packageName);
9+
const location = (entryPath.split(packageName)[0] + packageName).replace(
10+
'file://',
11+
'',
12+
);
13+
const pkgJsonRaw = fs.readFileSync(
14+
path.join(location.replace('file://', ''), 'package.json'),
15+
'utf8',
16+
);
17+
const pkgJson = JSON.parse(pkgJsonRaw);
18+
19+
return { location, entryPath, pkgJson };
20+
};
21+
22+
const install = async (packageName: string) => {
23+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
24+
await installPackage(packageName, {
25+
cwd: __dirname,
26+
packageManager: 'npm',
27+
additionalArgs: ['--force'],
28+
});
29+
30+
const { pkgJson } = await getInfo(packageName);
31+
32+
// Install whitelisted devDependencies
33+
if (pkgJson?.hypermod?.dependencies) {
34+
await Promise.all(
35+
pkgJson.hypermod.dependencies.map((dep: string) => {
36+
const version = pkgJson.devDependencies[dep];
37+
if (!version) return;
38+
return installPackage(`${dep}@${version}`, {
39+
cwd: __dirname,
40+
packageManager: 'npm',
41+
additionalArgs: ['--force'],
42+
});
43+
}),
44+
);
45+
}
46+
};
47+
48+
return {
49+
install,
50+
getInfo,
51+
require: async (packageName: string) => import(packageName),
52+
};
53+
};
54+
55+
export default ModuleLoader;

0 commit comments

Comments
 (0)