UNPKG

dumi

Version:

📖 Documentation Generator of React Component

255 lines (253 loc) • 8.72 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/features/compile/utoopackLoaders.ts var utoopackLoaders_exports = {}; __export(utoopackLoaders_exports, { LOADER_CTX_FILENAME: () => LOADER_CTX_FILENAME, UTOOPACK_LOADER_CTX_KEY: () => UTOOPACK_LOADER_CTX_KEY, buildLoaderContextContent: () => buildLoaderContextContent, getUtoopackRules: () => getUtoopackRules }); module.exports = __toCommonJS(utoopackLoaders_exports); var import_path = __toESM(require("path")); var import_utils = require("./utils"); var mdLoaderPath = require.resolve("../../loaders/markdown"); var UTOOPACK_LOADER_CTX_KEY = "__dumiLoaderContextPath"; var LOADER_CTX_FILENAME = "dumi-loader-ctx.cjs"; function toSerializable(value) { return JSON.parse(JSON.stringify(value)); } function findInRequireCache(target) { for (const [filename, mod] of Object.entries(require.cache)) { if (!(mod == null ? void 0 : mod.exports)) continue; const exp = mod.exports; if (exp === target) return { modulePath: filename, exportName: "module.exports" }; if ((exp == null ? void 0 : exp.default) === target) return { modulePath: filename, exportName: "default" }; for (const [k, v] of Object.entries(exp)) { if (v === target) return { modulePath: filename, exportName: k }; } } return null; } function buildLoaderContextContent(techStacks, builtins = {}, routes = {}) { const refs = []; for (const ts of techStacks) { const ctor = ts.constructor; if (ctor !== Object) { const found = findInRequireCache(ctor); if (found) { const modRef = `require(${JSON.stringify(found.modulePath)})`; const ctorRef = found.exportName === "module.exports" ? modRef : `(${modRef})[${JSON.stringify(found.exportName)}]`; refs.push(`new (${ctorRef})()`); } } else { const found = findInRequireCache(ts); if (found) { const modRef = `require(${JSON.stringify(found.modulePath)})`; const ref = found.exportName === "module.exports" ? modRef : `(${modRef})[${JSON.stringify(found.exportName)}]`; refs.push(ref); } } } return `'use strict'; exports.techStacks = [${refs.join(", ")}]; exports.builtins = ${JSON.stringify(builtins)}; exports.routes = ${JSON.stringify(routes)}; `; } var getUtoopackRules = (api, config = api.config) => { const disableLiveDemo = (0, import_utils.shouldDisabledLiveDemo)(api); const loaderContextPath = import_path.default.join( api.paths.absTmpPath, LOADER_CTX_FILENAME ); const cfgResolve = config.resolve ?? {}; const serializableBaseOpts = toSerializable({ cwd: api.cwd, alias: config.alias || {}, resolve: { atomDirs: cfgResolve.atomDirs ?? [{ type: "component", dir: "src" }], docDirs: cfgResolve.docDirs ?? ["docs"], codeBlockMode: cfgResolve.codeBlockMode ?? "active", forceKebabCaseRouting: cfgResolve.forceKebabCaseRouting ?? true, ...cfgResolve.entryFile ? { entryFile: cfgResolve.entryFile } : {} }, routes: {}, builtins: {}, locales: config.locales || [], pkg: api.pkg, disableLiveDemo, [UTOOPACK_LOADER_CTX_KEY]: loaderContextPath }); const externalDemoLoader = { loader: require.resolve("../../loaders/demo"), options: toSerializable({ cwd: api.cwd, [UTOOPACK_LOADER_CTX_KEY]: loaderContextPath }) }; return { // handle ?watch=parent virtual module: return empty content to establish file-watching dependency "**/*": [ { condition: { query: /^\?watch=parent$/ }, loaders: [require.resolve("../../loaders/null")], as: "*.js" }, // handle raw content for demo source display (?dumi-raw) { condition: { query: /^\?dumi-raw$/ }, loaders: [ require.resolve("../../loaders/post-raw"), require.resolve("raw-loader"), require.resolve("../../loaders/pre-raw") ], as: "*.js" }, // handle external demo component files (?techStack=xxx) // techStacks are NOT serializable; pass loaderContextPath and hydrate in the loader { condition: { all: [{ query: /^\?techStack=.*$/ }, { path: /\.tsx$/ }] }, loaders: [externalDemoLoader], as: "*.tsx" }, { condition: { all: [{ query: /^\?techStack=.*$/ }, { path: /\.ts$/ }] }, loaders: [externalDemoLoader], as: "*.ts" }, { condition: { all: [{ query: /^\?techStack=.*$/ }, { path: /\.jsx$/ }] }, loaders: [externalDemoLoader], as: "*.jsx" }, { condition: { all: [ { query: /^\?techStack=.*$/ }, { not: { path: /\.(tsx?|jsx)$/ } } ] }, loaders: [externalDemoLoader], as: "*.js" } ], // extract frontmatter/toc metadata from JS/TS page components (?type=frontmatter) // NOTE: // - Markdown ?type=frontmatter is already handled by the '*.md' rule below. // - After the md loader outputs JS, utoopack will expose that virtual module as // '*.md.js?type=frontmatter'. Without the extra path guard here, this JS rule // runs again and page-loader overwrites markdown frontmatter with filename-based // fallbacks like "Docs" / "C Md". // - Excluding '*.md.js' keeps the markdown frontmatter result intact while still // allowing real JS/TS page components to use page-loader. "*.{js,jsx,ts,tsx}": { condition: { all: [ { query: /^\?type=frontmatter$/ }, { not: { path: /\.md\.js$/ } } ] }, loaders: [require.resolve("../../loaders/page")], as: "*.js" }, // handle markdown files with different modes based on query type "*.md": [ { condition: { query: /^\?type=frontmatter$/ }, loaders: [ { loader: mdLoaderPath, options: { ...serializableBaseOpts, mode: "frontmatter" } } ], as: "*.js" }, // extract plain text for full-text search { condition: { query: /^\?type=text$/ }, loaders: [ { loader: mdLoaderPath, options: { ...serializableBaseOpts, mode: "text" } } ], as: "*.js" }, // extract demo index metadata from markdown { condition: { query: /^\?type=demo-index$/ }, loaders: [ { loader: mdLoaderPath, options: { ...serializableBaseOpts, mode: "demo-index" } } ], as: "*.js" }, // compile inline demo code blocks { condition: { query: /^\?type=demo$/ }, loaders: [ { loader: mdLoaderPath, options: { ...serializableBaseOpts, mode: "demo" } } ], as: "*.js" }, // default: transform markdown into a React page component { loaders: [ { loader: mdLoaderPath, options: serializableBaseOpts } ], as: "*.js" } ] }; }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { LOADER_CTX_FILENAME, UTOOPACK_LOADER_CTX_KEY, buildLoaderContextContent, getUtoopackRules });