Skip to content

Commit 4b1ccbf

Browse files
committed
fix: resolve NodeNext declaration imports
1 parent 13028ec commit 4b1ccbf

4 files changed

Lines changed: 65 additions & 7 deletions

File tree

‎package.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,13 @@
101101
"compile": "father build && node scripts/rewrite-esm-imports.js && lessc assets/index.less assets/index.css",
102102
"browser-field": "node scripts/update-browser-field.js",
103103
"gh-pages": "cross-env GH_PAGES=1 npm run docs:build && npm run docs:deploy",
104-
"prepublishOnly": "npm run compile && npm run test:node-exports && npm run browser-field && rc-np",
104+
"prepublishOnly": "npm run compile && npm run test:node-exports && npm run test:node-types && npm run browser-field && rc-np",
105105
"lint": "eslint src/ --ext .ts,.tsx,.jsx,.js,.md",
106106
"lint:tsc": "tsc -p tsconfig.json --noEmit",
107107
"prettier": "prettier --write --ignore-unknown .",
108108
"test": "rc-test",
109109
"test:node-exports": "node scripts/test-node-exports.js",
110+
"test:node-types": "node scripts/test-node-types.js",
110111
"coverage": "father test --coverage",
111112
"prepare": "husky",
112113
"tsc": "tsc --noEmit"

‎scripts/rewrite-esm-imports.js‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@ const fs = require('node:fs');
22
const path = require('node:path');
33

44
const esDirectory = path.resolve(__dirname, '../es');
5-
const moduleSpecifierPattern = /(\b(?:from|import)\s*(?:\(\s*)?)(['"])(\.\.?\/[^'"]+)\2(\s*\)?)/g;
5+
const moduleSpecifierPattern =
6+
/(\b(?:from|import)\s*(?:\(\s*)?)(['"])(\.\.?\/[^'"]+|\.\.?)\2(\s*\)?)/g;
67

78
fs.writeFileSync(path.join(esDirectory, 'package.json'), '{\n "type": "module"\n}\n');
89

9-
function collectJavaScriptFiles(directory) {
10+
function collectModuleFiles(directory) {
1011
return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
1112
const entryPath = path.join(directory, entry.name);
1213

1314
if (entry.isDirectory()) {
14-
return collectJavaScriptFiles(entryPath);
15+
return collectModuleFiles(entryPath);
1516
}
1617

17-
return entry.isFile() && entry.name.endsWith('.js') ? [entryPath] : [];
18+
return entry.isFile() && (entry.name.endsWith('.js') || entry.name.endsWith('.d.ts'))
19+
? [entryPath]
20+
: [];
1821
});
1922
}
2023

@@ -36,7 +39,7 @@ function resolveModuleSpecifier(filePath, specifier) {
3639

3740
let rewriteCount = 0;
3841

39-
collectJavaScriptFiles(esDirectory).forEach((filePath) => {
42+
collectModuleFiles(esDirectory).forEach((filePath) => {
4043
const source = fs.readFileSync(filePath, 'utf8');
4144
const rewrittenSource = source.replace(
4245
moduleSpecifierPattern,

‎scripts/test-node-types.js‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const fs = require('node:fs');
2+
const os = require('node:os');
3+
const path = require('node:path');
4+
const { execFileSync } = require('node:child_process');
5+
6+
const packageDirectory = path.resolve(__dirname, '..');
7+
const temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'rc-picker-node-types-'));
8+
const scopedModulesDirectory = path.join(temporaryDirectory, 'node_modules/@rc-component');
9+
10+
try {
11+
fs.mkdirSync(scopedModulesDirectory, { recursive: true });
12+
fs.symlinkSync(
13+
packageDirectory,
14+
path.join(scopedModulesDirectory, 'picker'),
15+
process.platform === 'win32' ? 'junction' : 'dir',
16+
);
17+
18+
fs.writeFileSync(
19+
path.join(temporaryDirectory, 'package.json'),
20+
JSON.stringify({ private: true, type: 'module' }),
21+
);
22+
fs.writeFileSync(
23+
path.join(temporaryDirectory, 'tsconfig.json'),
24+
JSON.stringify({
25+
compilerOptions: {
26+
module: 'NodeNext',
27+
moduleResolution: 'NodeNext',
28+
noEmit: true,
29+
skipLibCheck: false,
30+
strict: true,
31+
},
32+
include: ['index.ts'],
33+
}),
34+
);
35+
fs.writeFileSync(
36+
path.join(temporaryDirectory, 'index.ts'),
37+
`import Picker from '@rc-component/picker';
38+
import momentGenerateConfig from '@rc-component/picker/generate/moment';
39+
import enUS from '@rc-component/picker/locale/en_US';
40+
41+
void Picker;
42+
void momentGenerateConfig;
43+
void enUS;
44+
`,
45+
);
46+
47+
execFileSync(
48+
process.execPath,
49+
[path.join(packageDirectory, 'node_modules/typescript/bin/tsc'), '-p', 'tsconfig.json'],
50+
{ cwd: temporaryDirectory, stdio: 'inherit' },
51+
);
52+
} finally {
53+
fs.rmSync(temporaryDirectory, { recursive: true, force: true });
54+
}

‎src/PickerPanel/index.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export interface BasePickerPanelProps<DateType extends object = any>
6464
| 'superPrevIcon'
6565
| 'superNextIcon'
6666
>,
67-
SharedTimeProps<DateType>,
67+
Omit<SharedTimeProps<DateType>, 'defaultValue'>,
6868
Pick<React.HTMLAttributes<HTMLDivElement>, 'tabIndex'> {
6969
// Style
7070
prefixCls?: string;

0 commit comments

Comments
 (0)