Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit 0d64195

Browse files
feat: support importing package with ts export (#10)
1 parent e3b3b46 commit 0d64195

File tree

6 files changed

+58
-28
lines changed

6 files changed

+58
-28
lines changed

src/loaders.ts

+26-28
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@ const sourcemaps = installSourceMapSupport();
1717
const tsconfig = getTsconfig();
1818
const tsconfigRaw = tsconfig?.config;
1919

20+
type Resolved = {
21+
url: string;
22+
format: ModuleFormat;
23+
};
24+
2025
type resolve = (
2126
specifier: string,
2227
context: {
2328
conditions: string[];
2429
parentURL: string | undefined;
2530
},
2631
defaultResolve: resolve,
27-
) => MaybePromise<{
28-
url: string;
29-
format: ModuleFormat;
30-
}>;
32+
) => MaybePromise<Resolved>;
3133

3234
const hasExtensionPattern = /\.\w+$/;
3335

@@ -69,25 +71,9 @@ export const resolve: resolve = async function (
6971
}
7072
}
7173

72-
if (tsExtensionsPattern.test(specifier)) {
73-
const resolved = await defaultResolve(specifier, context, defaultResolve);
74-
const format = getFormatFromExtension(resolved.url) ?? await getPackageType(resolved.url);
75-
76-
return {
77-
...resolved,
78-
format,
79-
};
80-
}
81-
82-
if (specifier.endsWith('.json')) {
83-
return {
84-
...(await defaultResolve(specifier, context, defaultResolve)),
85-
format: 'json',
86-
};
87-
}
88-
74+
let resolved: Resolved;
8975
try {
90-
return await defaultResolve(specifier, context, defaultResolve);
76+
resolved = await defaultResolve(specifier, context, defaultResolve);
9177
} catch (error) {
9278
if (error instanceof Error) {
9379
if ((error as any).code === 'ERR_UNSUPPORTED_DIR_IMPORT') {
@@ -114,6 +100,23 @@ export const resolve: resolve = async function (
114100

115101
throw error;
116102
}
103+
104+
if (resolved.url.endsWith('.json')) {
105+
return {
106+
...resolved,
107+
format: 'json',
108+
};
109+
}
110+
111+
if (tsExtensionsPattern.test(resolved.url)) {
112+
const format = getFormatFromExtension(resolved.url) ?? await getPackageType(resolved.url);
113+
return {
114+
...resolved,
115+
format,
116+
};
117+
}
118+
119+
return resolved;
117120
};
118121

119122
type load = (
@@ -149,12 +152,7 @@ export const load: load = async function (
149152

150153
const loaded = await defaultLoad(url, context, defaultLoad);
151154

152-
if (
153-
!loaded.source
154-
155-
// node_modules don't need to be transformed
156-
|| url.includes('/node_modules/')
157-
) {
155+
if (!loaded.source) {
158156
return loaded;
159157
}
160158

tests/fixtures/package-module/node_modules/package-module/ts.ts

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/fixtures/package-module/node_modules/package-typescript-export/index.ts

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/fixtures/package-module/node_modules/package-typescript-export/package.json

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { testSuite, expect } from 'manten';
2+
import type { NodeApis } from '../../utils/node-with-loader';
3+
4+
export default testSuite(async ({ describe }, node: NodeApis) => {
5+
describe('Dependencies', ({ describe }) => {
6+
describe('TypeScript dependency', ({ test }) => {
7+
const output = '{"default":"ts default export","namedExport":"ts named export"}';
8+
9+
test('Import', async () => {
10+
const nodeProcess = await node.import('package-module/ts.ts');
11+
expect(nodeProcess.stdout).toBe(output);
12+
});
13+
14+
test('Import', async () => {
15+
const nodeProcess = await node.import('package-typescript-export');
16+
expect(nodeProcess.stdout).toBe(output);
17+
});
18+
});
19+
});
20+
});

tests/specs/typescript/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ export default testSuite(async ({ describe }, node: NodeApis) => {
99
runTestSuite(import('./mts'), node);
1010
runTestSuite(import('./cts'), node);
1111
runTestSuite(import('./tsconfig'), node);
12+
runTestSuite(import('./dependencies'), node);
1213
});
1314
});

0 commit comments

Comments
 (0)