Skip to content

Commit 948f617

Browse files
author
Daniel Del Core
committed
Promotes the experimental loader as the defeault module loading mechanism
1 parent 5646215 commit 948f617

File tree

7 files changed

+73
-93
lines changed

7 files changed

+73
-93
lines changed

packages/cli/package.json

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

packages/cli/src/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ program
6666
'--registryToken <value>',
6767
'Define an authentication token to use as credentials for the registry',
6868
)
69-
.option(
70-
'--experimental-loader',
71-
'Enables the experimental package downloader',
72-
)
7369
.addOption(
7470
new Option(
7571
'--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';
54
import { getHypermodPackageName } from './utils/package-names';
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 & 62 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';
@@ -16,56 +14,6 @@ import { mergeConfigs } from './utils/merge-configs';
1614
import { fetchConfigsForWorkspaces, getPackageJson } from './utils/file-system';
1715
import { getConfigPrompt, getMultiConfigPrompt } from './prompt';
1816

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

95-
const packageManager = flags.experimentalLoader
96-
? ExperimentalModuleLoader()
97-
: new PluginManager(pluginManagerConfig);
98-
9943
let transforms: string[] = [];
10044

10145
if (!flags.transform && !flags.packages) {
@@ -234,11 +178,7 @@ export default async function main(
234178
.filter(id => id.startsWith('#'))
235179
.map(id => id.substring(1));
236180

237-
const { community, remote } = await fetchPackages(
238-
pkgName,
239-
// @ts-expect-error Experimental loader
240-
packageManager,
241-
);
181+
const { community, remote } = await fetchPackages(pkgName);
242182

243183
const config = mergeConfigs(community, remote);
244184

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';
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) {
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)