diff --git a/src/spectaql/index.js b/src/spectaql/index.js index f517ac4e..b2338627 100644 --- a/src/spectaql/index.js +++ b/src/spectaql/index.js @@ -67,14 +67,15 @@ async function run(opts) { return fileExists(path.normalize(`${themeDir}/${pathSuffix}`)) }) - let arrangeDataModule = arrangeDataDefaultFn + let arrangeData = takeDefaultExport(arrangeDataDefaultFn) if (customDataArrangerSuffixThatExists) { try { - arrangeDataModule = await dynamicImport( + const arrangeDataModule = await dynamicImport( url.pathToFileURL( path.normalize(`${themeDir}/${customDataArrangerSuffixThatExists}`) ) ) + arrangeData = takeDefaultExport(arrangeDataModule) } catch (err) { console.error(err) if ( @@ -100,8 +101,6 @@ async function run(opts) { } } - const arrangeData = takeDefaultExport(arrangeDataModule) - const items = arrangeData({ introspectionResponse, graphQLSchema, diff --git a/src/spectaql/utils.js b/src/spectaql/utils.js index 8c9052c0..22725773 100644 --- a/src/spectaql/utils.js +++ b/src/spectaql/utils.js @@ -40,6 +40,18 @@ export async function dynamicImport(path) { ) { return mojule.default } + // In Node.js 23+, when dynamically importing a CommonJS module that was transpiled + // by Babel with module.exports, the structure can be: + // { __esModule: true, default: { default: [Function] }, 'module.exports': { default: [Function] } } + // In this case, we want to return mojule.default (which contains { default: [Function] }) + // so that takeDefaultExport can properly extract the function + if ( + mojule.__esModule === true && + mojule.default?.default && + mojule['module.exports']?.default + ) { + return mojule.default + } return mojule }