@@ -3,6 +3,20 @@ const path = require("node:path");
33
44const CL = require ( "./libs/ColorLogger.js" ) ;
55
6+ const skipList = new Set ( [
7+ "index.js" , // 自動生成対象自身
8+ "main.js" ,
9+ ] ) ;
10+
11+ function isPlainObjectExport ( modulePath ) {
12+ try {
13+ const mod = require ( modulePath ) ;
14+ return typeof mod === "object" && mod !== null && ! Array . isArray ( mod ) ;
15+ } catch {
16+ return false ;
17+ }
18+ }
19+
620/**
721 * index.jsを生成する
822 * @param {string } dir
@@ -11,34 +25,40 @@ function generateIndex(dir, baseDir = dir) {
1125 const entries = fs . readdirSync ( dir , { withFileTypes : true } ) ;
1226
1327 // jsファイルだけ、かつindex.jsは除外
14- const jsFiles = entries . filter ( ( e ) => e . isFile ( ) && e . name . endsWith ( ".js" ) && e . name !== "index.js" ) ;
28+ const jsFiles = entries . filter ( ( e ) => e . isFile ( ) && e . name . endsWith ( ".js" ) && ! skipList . has ( e . name ) ) ;
1529
1630 // サブディレクトリ
17- const subDirs = entries . filter ( ( e ) => e . isDirectory ( ) ) ;
31+ const subDirs = entries . filter ( ( e ) => e . isDirectory ( ) && ! skipList . has ( e . name ) ) ;
1832
1933 // 先にサブディレクトリも再帰処理(深い階層から順に)
2034 for ( const subDir of subDirs ) {
2135 generateIndex ( path . join ( dir , subDir . name ) , baseDir ) ;
2236 }
2337
2438 // export文を作成
25- let exportsObj = { } ;
39+ const exportLines = [ ] ;
2640
2741 // ファイルのエクスポートを設定
2842 jsFiles . forEach ( ( file ) => {
29- const name = path . basename ( file . name , ".js" ) ;
30- exportsObj [ name ] = `require("./${ file . name } ")` ;
43+ const filePath = path . join ( dir , file . name ) ;
44+ const requirePath = `./${ file . name } ` ;
45+ const key = path . basename ( file . name , ".js" ) ;
46+
47+ const fullRequirePath = path . resolve ( filePath ) ;
48+
49+ if ( isPlainObjectExport ( fullRequirePath ) ) {
50+ exportLines . push ( ` ...require("${ requirePath } ")` ) ;
51+ } else {
52+ exportLines . push ( ` ${ key } : require("${ requirePath } ")` ) ;
53+ }
3154 } ) ;
3255
3356 // サブフォルダのindexもexport
3457 subDirs . forEach ( ( subDir ) => {
35- const name = subDir . name ;
36- exportsObj [ name ] = `require("./${ name } /index.js")` ;
58+ exportLines . push ( ` ${ subDir . name } : require("./${ subDir . name } ")` ) ;
3759 } ) ;
3860
3961 // module.exportsの内容を文字列で作成
40- const exportLines = Object . entries ( exportsObj ) . map ( ( [ key , val ] ) => ` ${ key } : ${ val } ` ) ;
41-
4262 const content = `module.exports = {\n${ exportLines . join ( ",\n" ) } \n};\n` ;
4363
4464 // index.jsを書き込み
0 commit comments