storybook
Version:
Storybook: Develop, document, and test UI components in isolation
121 lines (117 loc) • 4.66 kB
JavaScript
import CJS_COMPAT_NODE_URL_ret6ivvuly from 'node:url';
import CJS_COMPAT_NODE_PATH_ret6ivvuly from 'node:path';
import CJS_COMPAT_NODE_MODULE_ret6ivvuly from "node:module";
var __filename = CJS_COMPAT_NODE_URL_ret6ivvuly.fileURLToPath(import.meta.url);
var __dirname = CJS_COMPAT_NODE_PATH_ret6ivvuly.dirname(__filename);
var require = CJS_COMPAT_NODE_MODULE_ret6ivvuly.createRequire(import.meta.url);
// ------------------------------------------------------------
// end of CJS compatibility banner, injected by Storybook's esbuild configuration
// ------------------------------------------------------------
import {
NODE_TARGET
} from "../_node-chunks/chunk-UEFVJ4BB.js";
import {
require_dist
} from "../_node-chunks/chunk-XSYEGQMM.js";
import {
__toESM
} from "../_node-chunks/chunk-5IHDTMLC.js";
// src/bin/loader.ts
var import_ts_dedent = __toESM(require_dist(), 1);
import { readdirSync } from "node:fs";
import { readFile } from "node:fs/promises";
import * as path from "node:path";
import { fileURLToPath } from "node:url";
import { deprecate } from "storybook/internal/node-logger";
import { transform } from "esbuild";
var supportedExtensions = [
".js",
".mjs",
".cjs",
".jsx",
".ts",
".mts",
".cts",
".tsx"
], jsToTsExtensionMap = {
".js": [".ts", ".tsx"],
".mjs": [".mts"],
".cjs": [".cts"],
".jsx": [".tsx"]
}, directoryCache = /* @__PURE__ */ new Map();
function clearDirectoryCache() {
directoryCache.clear();
}
function getDirectoryFiles(dir) {
if (!directoryCache.has(dir))
try {
directoryCache.set(dir, new Set(readdirSync(dir)));
} catch {
directoryCache.set(dir, /* @__PURE__ */ new Set());
}
return directoryCache.get(dir);
}
function resolveWithExtension(importPath, currentFilePath) {
let extImportPath = path.extname(importPath), currentDir = path.dirname(currentFilePath);
if (extImportPath && extImportPath in jsToTsExtensionMap) {
let basePath = importPath.slice(0, -extImportPath.length), tsExtensions = jsToTsExtensionMap[extImportPath], absoluteBase = path.resolve(currentDir, basePath), dirFiles2 = getDirectoryFiles(path.dirname(absoluteBase)), baseFileName2 = path.basename(absoluteBase);
for (let tsExt of tsExtensions)
if (dirFiles2.has(`${baseFileName2}${tsExt}`))
return `${basePath}${tsExt}`;
return importPath;
}
if (extImportPath)
return importPath;
deprecate(import_ts_dedent.dedent`
One or more extensionless imports detected: "${importPath}" in file "${currentFilePath}".
For more information on how to resolve the issue:
https://storybook.js.org/docs/faq#extensionless-imports-in-storybookmaints-and-required-ts-extensions
`);
let absolutePath = path.resolve(currentDir, importPath), dirFiles = getDirectoryFiles(path.dirname(absolutePath)), baseFileName = path.basename(absolutePath);
for (let ext of supportedExtensions)
if (dirFiles.has(`${baseFileName}${ext}`))
return `${importPath}${ext}`;
return importPath;
}
function addExtensionsToRelativeImports(source, filePath) {
let patterns = [
// import/export ... from './path' or "../path" (including side-effect imports)
/(\b(?:import|export)\s+(?:[^'"]*?\s+from\s+)?['"])(\.[^'"]+)(['"])/g,
// import('./path') or import("../path") - dynamic imports with quotes (with closing paren, no concatenation)
/(\bimport\s*\(\s*['"])(\.[^'"]+)(['"]\s*\))/g,
// import(`./path`) - dynamic imports with backticks (with closing paren, no template interpolation)
/(\bimport\s*\(\s*`)(\.[^`$]+)(`\s*\))/g
], result = source;
for (let pattern of patterns)
result = result.replace(pattern, (match, prefix, path2, suffix) => {
if (path2.startsWith("./") || path2.startsWith("../")) {
let resolvedPath = resolveWithExtension(path2, filePath);
return `${prefix}${resolvedPath}${suffix}`;
}
return match;
});
return result;
}
var load = async (url, context, nextLoad) => {
if (url.endsWith(".ts") || url.endsWith(".tsx") || url.endsWith(".mts") || url.endsWith(".cts") || url.endsWith(".mtsx") || url.endsWith(".ctsx")) {
let filePath = fileURLToPath(url), rawSource = await readFile(filePath, "utf-8"), transformedSource = await transform(rawSource, {
loader: "ts",
target: NODE_TARGET,
format: "esm",
platform: "neutral"
});
return {
format: "module",
shortCircuit: !0,
source: addExtensionsToRelativeImports(transformedSource.code, filePath)
};
}
return nextLoad(url, context);
};
export {
addExtensionsToRelativeImports,
clearDirectoryCache,
load,
resolveWithExtension,
supportedExtensions
};