Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit69f0029

Browse files
committed
fix(resolver): correct Node major parsing and tighten polyfill types
- resolver: parse process.versions.node major correctly- resolver: add NodeModuleLike/ModuleWithInternals typings and remove any casts- resolver: use ResolveHookContext in polyfill resolve; type _resolveFilename/_extensions- resolver: type legacy loader signature and maintain original loaders map- config/index: import TransformerHook from t-packer; refresh mergeConfig TSDoc- config/loader: align comments with actual behavior (no extra error wrapping)
1 parentd3d4381 commit69f0029

File tree

7 files changed

+77
-192
lines changed

7 files changed

+77
-192
lines changed

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
"license":"ISC",
8181
"dependencies": {
8282
"@swc/core":"^1.13.3",
83-
"t-packer":"^0.0.1"
83+
"t-packer":"^0.0.2"
8484
},
8585
"devDependencies": {
8686
"@biomejs/biome":"^2.1.3",

‎pnpm-lock.yaml‎

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎src/config/index.ts‎

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
importtype{TransformerHook}from"../resolver";
1+
importtype{TransformerHook}from"t-packer";
22

33
/**
44
* Configuration options for the RTS (Runtime Transformer System)
@@ -11,36 +11,25 @@ export interface RTSOptions {
1111
}
1212

1313
/**
14-
* Deepmerge two configuration objects
14+
* Deep-merge twoRTSconfiguration objects into a new object.
1515
*
16-
* This function performs a deep merge of configuration objects, allowing
17-
* for partial configuration updates. It recursively merges nested objects
18-
* and overwrites primitive values.
16+
* - Does not mutate the `oldConfig` or `newConfig` inputs.
17+
* - Shallow-merges non-object fields.
18+
* - For known fields:
19+
* - `alias`: merged with later values overwriting earlier ones per key
20+
* - `transformers`: concatenated in order
1921
*
20-
* The merge is performed in-place on the oldConfig object.
21-
*
22-
*@param oldConfig - The base configuration object (will be modified)
23-
*@param newConfig - The configuration object to merge
24-
*@returns Merged configuration object (same reference as oldConfig)
22+
*@param oldConfig - Base configuration (left-side)
23+
*@param newConfig - Configuration to apply (right-side)
24+
*@returns A new merged configuration object
2525
*
2626
*@example
2727
* ```typescript
28-
* const baseConfig = {
29-
* aliases: { '@components': './src/components' },
30-
* transformers: ['ts', 'jsx']
31-
* };
32-
*
33-
* const newConfig = {
34-
* aliases: { '@utils': './src/utils' },
35-
* debug: true
36-
* };
37-
*
38-
* const merged = mergeConfig(baseConfig, newConfig);
39-
* // Result: {
40-
* // aliases: { '@components': './src/components', '@utils': './src/utils'},
41-
* // transformers: ['ts', 'jsx'],
42-
* // debug: true
43-
* //}
28+
* const baseConfig = { alias: { '@components': './src/components' }};
29+
* const addlConfig = { alias: { '@utils': './src/utils' }, debug: true as any};
30+
* const merged = mergeConfig(baseConfig, addlConfig);
31+
* // alias => { '@components': './src/components', '@utils': './src/utils'}
32+
* // debug => true
4433
* ```
4534
*/
4635
exportfunctionmergeConfig(

‎src/config/loader.ts‎

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,13 @@ const loadConfig = (file: string) => {
2424
};
2525

2626
/**
27-
* Load configuration filewith error handling
27+
* Load configuration filewithout additional wrapping.
2828
*
29-
* This function provides a safe way to load configuration files with proper
30-
* error handling. It wraps the loadConfig function to catch and handle
31-
* common errors like missing files or invalid JSON.
29+
* This function simply delegates to `loadConfig` so callers can decide how
30+
* to handle errors (missing files, invalid JSON, etc.).
3231
*
3332
*@param file - Path to the configuration file
3433
*@returns Configuration object
35-
*@throws {Error} If the file cannot be loaded or parsed
36-
*
37-
*@example
38-
* ```typescript
39-
* try {
40-
* const config = loadConfigFile('./rts.config.json');
41-
* // Use config
42-
* } catch (error) {
43-
* console.error('Failed to load config:', error.message);
44-
* }
45-
* ```
4634
*/
4735
constloadConfigFile=(file:string)=>{
4836
constconfig=loadConfig(file);

‎src/index.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import{loadConfigFromCwd,mergeConfig,typeRTSOptions}from"./config";
22
import{ModuleResolver}from"./resolver";
3-
import{TSHook}from"./transformer/ts";
43

54
// Create a module resolver instance for handling module resolution
65
// This resolver will handle TypeScript, JSX, TSX, and CSS file transformations
7-
constresolver=newModuleResolver([TSHook]);
6+
constresolver=newModuleResolver();
87

98
/**
109
* Register RTS (Runtime Transformer System) hooks for Node.js module loading

‎src/resolver/index.ts‎

Lines changed: 52 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,26 @@ import fs from "node:fs";
22
importModule,{typeResolveHookContext}from"node:module";
33
importpathfrom"node:path";
44
importprocessfrom"node:process";
5+
import{ModuleTransformer,typeTransformerHook}from"t-packer";
56

67
// Get Node.js major version for compatibility handling
7-
constmajor=Number(process.versions.node.split(".")[0].slice(1));
8+
// `process.versions.node` is like "20.11.1"; take the first segment as a number
9+
constmajorVersion=process.versions.node.split(".")[0];
10+
constmajor=Number(
11+
majorVersion[0]==="v" ?majorVersion.slice(1) :majorVersion,
12+
);
813

9-
/**
10-
* Interface for transformer hooks that can transform specific file types
11-
* Each transformer defines which file extensions it can handle and provides
12-
* a transformation function to convert the source code
13-
*/
14-
exportinterfaceTransformerHook{
15-
/** File extensions this transformer can handle (e.g., ['.ts', '.tsx']) */
16-
exts:string[];
17-
/** The transformation function that converts source code */
18-
hook:TransformProgram;
14+
interfaceNodeModuleLike{
15+
_compile:(code:string,filename:string)=>unknown;
1916
}
2017

21-
/** Type definition for the transformation function */
22-
exporttypeTransformProgram=(code:string,src:string)=>string;
18+
interfaceModuleWithInternals{
19+
_resolveFilename:(request:string,parent:unknown)=>string;
20+
_extensions:Record<
21+
string,
22+
(mod:NodeModuleLike,filename:string)=>unknown
23+
>;
24+
}
2325

2426
/**
2527
* Module resolver class that handles module path resolution and caching
@@ -33,16 +35,17 @@ export type TransformProgram = (code: string, src: string) => string;
3335
* The resolver integrates with Node.js module system by overriding
3436
* the module resolution and loading mechanisms.
3537
*/
36-
exportclassModuleResolver{
38+
exportclassModuleResolverextendsModuleTransformer{
3739
/** Cache for resolved module paths to improve performance */
3840
privatecache:Map<string,string>=newMap();
3941
/** Map of module aliases to their target paths */
4042
privatealiases:Map<string,string[]>=newMap();
41-
/** List of registered transformers for different file types */
42-
privatetransformers:TransformerHook[]=[];
43+
4344
/** Store original loaders for cleanup */
44-
privateoldLoaders:Map<string,(mod:any,filename:string)=>any>=
45-
newMap();
45+
privateoldLoaders:Map<
46+
string,
47+
(mod:NodeModuleLike,filename:string)=>unknown
48+
>=newMap();
4649
/** Registration cleanup function */
4750
privaterevertRegister?:{
4851
deregister:()=>void;
@@ -53,6 +56,7 @@ export class ModuleResolver {
5356
*@param transformers - Initial list of transformers to register
5457
*/
5558
constructor(transformers:TransformerHook[]=[]){
59+
super();
5660
for(consttransformeroftransformers){
5761
this.addTransformer(transformer);
5862
}
@@ -83,26 +87,6 @@ export class ModuleResolver {
8387
}
8488
}
8589

86-
/**
87-
* Register a transformer hook for specific file types
88-
*
89-
* Transformers are responsible for converting source code from one format
90-
* to another (e.g., TypeScript to JavaScript, CSS to JS modules).
91-
*
92-
*@param transformer - The transformer hook to register
93-
*/
94-
addTransformer(transformer:TransformerHook){
95-
this.transformers.push(transformer);
96-
}
97-
98-
/**
99-
* Remove a previously registered transformer
100-
*@param transformer - The transformer hook to remove
101-
*/
102-
removeTransformer(transformer:TransformerHook){
103-
this.transformers=this.transformers.filter((t)=>t!==transformer);
104-
}
105-
10690
/**
10791
* Register hooks with Node.js module system
10892
*
@@ -128,27 +112,41 @@ export class ModuleResolver {
128112
});
129113
}else{
130114
// Polyfill for Node.js <24
131-
constorigResolve=(Moduleasany)._resolveFilename;
132-
(Moduleasany)._resolveFilename=(specifier,context)=>{
133-
const{ url}=this.resolve(specifier,context);
115+
constorigResolve=(ModuleasunknownasModuleWithInternals)
116+
._resolveFilename;
117+
(ModuleasunknownasModuleWithInternals)._resolveFilename=(
118+
specifier,
119+
context,
120+
)=>{
121+
const{ url}=this.resolve(specifier,contextasResolveHookContext);
134122
returnorigResolve.apply(this,[url??specifier,context]);
135123
};
136124

137125
// Register custom loaders for supported file extensions
138-
constextensions=this.transformers.flatMap((t)=>t.exts);
139-
constoriginJSLoader=(Moduleasany)._extensions[".js"];
126+
constextensions=Array.from(this.transformers.keys());
127+
constoriginJSLoader=(ModuleasunknownasModuleWithInternals)
128+
._extensions[".js"];
140129
extensions.forEach((ext)=>{
141-
constoriginLoader=(Moduleasany)._extensions[ext]||originJSLoader;
142-
(Moduleasany)._extensions[ext]=(mod,filename)=>
143-
this.loader(mod,filename,ext);
130+
constoriginLoader=
131+
(ModuleasunknownasModuleWithInternals)._extensions[ext]||
132+
originJSLoader;
133+
(ModuleasunknownasModuleWithInternals)._extensions[ext]=(
134+
mod,
135+
filename,
136+
)=>this.loader(mod,filename,ext);
144137
this.oldLoaders.set(ext,originLoader);
145138
});
146139

147140
this.revertRegister={
148141
deregister:()=>{
149-
(Moduleasany)._resolveFilename=origResolve;
142+
(ModuleasunknownasModuleWithInternals)._resolveFilename=
143+
origResolve;
150144
extensions.forEach((ext)=>{
151-
(Moduleasany)._extensions[ext]=this.oldLoaders.get(ext);
145+
(ModuleasunknownasModuleWithInternals)._extensions[ext]=
146+
this.oldLoaders.get(ext)as(
147+
mod:NodeModuleLike,
148+
filename:string,
149+
)=>unknown;
152150
});
153151
},
154152
};
@@ -226,7 +224,7 @@ export class ModuleResolver {
226224
*@param filename - The filename being loaded
227225
*@param ext - The file extension
228226
*/
229-
privateloader(mod:any,filename:string,ext:string){
227+
privateloader(mod:NodeModuleLike,filename:string,ext:string){
230228
constcompile=mod._compile;
231229
constoldLoader=this.oldLoaders.get(ext);
232230
mod._compile=(code,filename)=>{
@@ -248,14 +246,12 @@ export class ModuleResolver {
248246
*@returns Transformed code, or empty string if no transformers match
249247
*/
250248
privatetransformCode(code:string,filename:string){
251-
consttransformers=this.transformers.filter((t)=>
252-
t.exts.includes(path.extname(filename)),
253-
);
254-
if(transformers.length===0){
249+
if(!this.transformers.has(path.extname(filename))){
255250
return"";
256251
}
257-
returntransformers.reduce((code,transformer)=>{
258-
returntransformer.hook(code,filename);
259-
},code);
252+
returnthis.transformSync(Buffer.from(code),filename,{
253+
target:"es2022",
254+
module:"commonjs",
255+
}).code.toString();
260256
}
261257
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp