@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
135 lines (133 loc) • 7.1 kB
JavaScript
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import { readFile } from 'node:fs/promises';
import { parseImports } from "../loaderUtils/index.js";
import { resolveImportResultWithFs } from "../loaderUtils/resolveModulePathWithFs.js";
import { processRelativeImports } from "../loaderUtils/processRelativeImports.js";
import { isJavaScriptModule } from "../loaderUtils/resolveModulePath.js";
/**
* Default loadServerSource function that reads a file and extracts its dependencies.
* This function is used to load source files for demos, resolving their imports and dependencies.
* It reads the source file, resolves its imports, and returns the processed source along with any
* additional files and dependencies that were found.
*/
export var loadServerSource = createLoadServerSource();
/**
* Creates a loadSource function that reads a file and extracts its dependencies.
*
* @param options.storeAt - Controls how imports are stored in extraFiles:
* - 'canonical': Full resolved path (e.g., '../Component/index.js')
* - 'import': Import path with file extension (e.g., '../Component.js')
* - 'flat': Flattened to current directory with rewritten imports (e.g., './Component.js')
*/
export function createLoadServerSource() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _options$includeDepen = options.includeDependencies,
includeDependencies = _options$includeDepen === void 0 ? true : _options$includeDepen,
_options$storeAt = options.storeAt,
storeAt = _options$storeAt === void 0 ? 'flat' : _options$storeAt;
return /*#__PURE__*/function () {
var _loadSource = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(url) {
var filePath, source, isJavascriptModuleFile, _yield$parseImports, importResult, externals, transformedExternals, _i, _Object$entries, _Object$entries$_i, modulePath, externalImport, relativeImportsCompatible, _i2, _Object$entries2, _Object$entries2$_i, importPath, _Object$entries2$_i$, path, names, includeTypeDefs, resolvedPathsMap, _processRelativeImpor, processedSource, extraFiles, extraDependencies;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
// Remove file:// prefix if present
filePath = url.replace('file://', ''); // Read the file
_context.next = 3;
return readFile(filePath, 'utf8');
case 3:
source = _context.sent;
if (includeDependencies) {
_context.next = 6;
break;
}
return _context.abrupt("return", {
source: source
});
case 6:
// Check if this is a static asset file (non-JS/TS modules)
isJavascriptModuleFile = isJavaScriptModule(filePath);
if (isJavascriptModuleFile) {
_context.next = 9;
break;
}
return _context.abrupt("return", {
source: source
});
case 9:
_context.next = 11;
return parseImports(source, filePath);
case 11:
_yield$parseImports = _context.sent;
importResult = _yield$parseImports.relative;
externals = _yield$parseImports.externals;
// Transform externals from parseImports format to simplified format
transformedExternals = {};
for (_i = 0, _Object$entries = Object.entries(externals); _i < _Object$entries.length; _i++) {
_Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), modulePath = _Object$entries$_i[0], externalImport = _Object$entries$_i[1];
transformedExternals[modulePath] = externalImport.names.map(function (importName) {
return {
name: importName.name,
type: importName.type,
isType: importName.isType
};
});
}
if (!(Object.keys(importResult).length === 0)) {
_context.next = 18;
break;
}
return _context.abrupt("return", {
source: source,
externals: Object.keys(transformedExternals).length > 0 ? transformedExternals : undefined
});
case 18:
// Convert to format expected by resolveImportResultWithFs and processImports
relativeImportsCompatible = {};
for (_i2 = 0, _Object$entries2 = Object.entries(importResult); _i2 < _Object$entries2.length; _i2++) {
_Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), importPath = _Object$entries2$_i[0], _Object$entries2$_i$ = _Object$entries2$_i[1], path = _Object$entries2$_i$.path, names = _Object$entries2$_i$.names, includeTypeDefs = _Object$entries2$_i$.includeTypeDefs;
relativeImportsCompatible[importPath] = _objectSpread({
path: path,
names: names.map(function (_ref) {
var name = _ref.name,
alias = _ref.alias;
return alias || name;
})
}, includeTypeDefs && {
includeTypeDefs: includeTypeDefs
});
}
// Resolve import paths, handling JS/TS modules and static assets appropriately
_context.next = 22;
return resolveImportResultWithFs(relativeImportsCompatible);
case 22:
resolvedPathsMap = _context.sent;
// Process imports using the consolidated helper function
_processRelativeImpor = processRelativeImports(source, relativeImportsCompatible, resolvedPathsMap, storeAt), processedSource = _processRelativeImpor.processedSource, extraFiles = _processRelativeImpor.extraFiles; // Build dependencies list for recursive loading
extraDependencies = Object.values(importResult).map(function (_ref2) {
var path = _ref2.path;
return resolvedPathsMap.get(path);
}).filter(function (path) {
return path !== undefined;
});
return _context.abrupt("return", {
source: processedSource,
extraFiles: Object.keys(extraFiles).length > 0 ? extraFiles : undefined,
extraDependencies: extraDependencies.length > 0 ? extraDependencies : undefined,
externals: Object.keys(transformedExternals).length > 0 ? transformedExternals : undefined
});
case 26:
case "end":
return _context.stop();
}
}, _callee);
}));
function loadSource(_x) {
return _loadSource.apply(this, arguments);
}
return loadSource;
}();
}