UNPKG

@sanpjs/core

Version:

@sanpjs/core

338 lines 10.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); // @ts-ignore const only_1 = __importDefault(require("only")); const config_1 = require("./config"); const defaultOptions_1 = __importDefault(require("./config/defaultOptions")); const Resolver_1 = __importDefault(require("./Resolver")); const utils_1 = require("@sanpjs/utils"); function generatePages(type, pages, resolver) { switch (type) { case 'spa': case 'spa-ssr': // 收集其余配置项,每个pages内第一个有效的配置的生效 const others = pages.reduce((prev, cur) => { // eslint-disable-next-line no-unused-vars const { name, filepath, ...others } = cur; // 单页多个其余页面配置时,只取第一个有效配置 return Object.keys(prev).length === 0 && others ? others : prev; }, {}); // 单页应用含有路由,只有一个入口可以是.sanp/app.js或.sanp/app/index.js return [ { name: 'index', filepath: resolver.resolveSanp('app/index.js'), ...others } ]; case 'mpa': // 多页应用,多个单文件入口,入口是.sanp/app下的对应js return pages.map((p) => { p.filepath = resolver.resolveSanp(p.filepath, true); return p; }); case 'mpa-ssr': case 'component': default: return pages; } } function createPages({ pagesDir }, logger, resolver) { const directory = resolver.resolveEntry(pagesDir, false); if (!fs_extra_1.default.existsSync(directory)) { logger.warn(`Pages directory ${directory} not exists`); process.exit(24); } const files = fs_extra_1.default.readdirSync(directory); const mayBeEntries = files.map((f) => { const extension = path_1.default.extname(f); return { name: path_1.default.basename(f, extension), filepath: resolver.resolveEntry(path_1.default.resolve(directory, f)) }; }); return mayBeEntries.filter(Boolean); } // TODO 相对路径改绝对 function normalize(inConfigs, oriConfigs, { cwd, logger }) { const build = inConfigs.build || {}; const server = inConfigs.server || {}; const configs = { ...oriConfigs, ...inConfigs, // build build: { ...oriConfigs.build, ...build, // 检查代码,比如检查出现额外的依赖、检查最后代码是不是es5 inspect: { ...oriConfigs.build?.inspect, ...(build.inspect || {}) }, // script script: { ...oriConfigs.build?.script, ...(build.script || {}) }, // style style: { ...oriConfigs.build?.style, ...(build.style || {}) }, optimization: { ...oriConfigs.build?.optimization, ...(build.optimization || {}) } }, server: { ...oriConfigs.server, ...server } }; // 处理root if (configs.root) { if (!path_1.default.isAbsolute(configs.root)) { configs.root = path_1.default.resolve(cwd, configs.root); } } else { configs.root = cwd; } const resolver = new Resolver_1.default(configs.root, configs); // 处理为绝对路径 configs.sanpDir = resolver.resolveEntry(configs.sanpDir, false); // 增加 configs.$pages configs.$pages = configs.pages; if (configs.pages) { // normalize pages if (!Array.isArray(configs.pages)) { configs.pages = [configs.pages]; } configs.pages = configs.pages.map((p) => { if (typeof p === 'string') { // p as name return { filepath: resolver.resolve(p) }; } else if (p.name) { p.filepath = resolver.resolveEntry(p.filepath || path_1.default.join(configs.pagesDir, p.name)); } else { // TODO 报错 理论上不会走到这里 logger.error(`Invalid page config: ${JSON.stringify(p)}`); } return p; }); } else { // create pages // watch pages directory configs.pages = createPages(configs, logger, resolver); } configs.pages = generatePages(configs.type, configs.pages, resolver); // auto load components // if(configs.components){ // } return { config: configs, resolver }; } async function createContext({ configFile, mode, watch, clean, analyze }) { const cwd = process.cwd(); const cached = {}; // 处理 const { configs: rawConfigs, filepath } = await (0, config_1.load)(configFile, cwd); const clonedConfigs = { build: {}, ...rawConfigs }; if (mode) { clonedConfigs.mode = mode; } if (typeof watch === 'boolean') { clonedConfigs.watch = watch; } // merge args // 如果不存在,则使用默认配置 if (rawConfigs.build) { if (!('sourceMap' in rawConfigs.build)) { clonedConfigs.build.sourceMap = clonedConfigs.mode === 'production'; } if (!('hash' in rawConfigs.build)) { clonedConfigs.build.hash = clonedConfigs.mode === 'production'; } } if (clean) { clonedConfigs.build.clean = !!clean; } if (analyze) { clonedConfigs.build.analyze = !!analyze; } // 验证 options schema (0, config_1.validate)(clonedConfigs); const { config, resolver } = normalize(clonedConfigs, defaultOptions_1.default, { cwd, logger: utils_1.logger }); const { root: projectRoot } = config; // read package.json const pkg = fs_extra_1.default.readJsonSync(path_1.default.join(projectRoot, 'package.json'), 'utf-8'); const context = Object.create({ // readonly get logger() { return utils_1.logger; }, get env() { return process.env; }, get cwd() { return cwd; }, get rawConfig() { return rawConfigs; }, get sanpDir() { return config.sanpDir; }, get config() { return config; }, get configFile() { return filepath; }, get resolver() { return resolver; }, get pkg() { return pkg; }, // config alias readonly get pages() { return config.pages; }, // 保存用户原始的 pages 信息 get $pages() { return config.$pages; }, get plugins() { return config.plugins; }, get root() { return config.root; }, get pagesDir() { return config.pagesDir; }, get build() { return config.build; }, get server() { return config.server; }, get ssr() { return config.ssr; }, get mode() { return config.mode; }, get dev() { return config.mode === 'development'; }, get prod() { return config.mode === 'production'; }, // TODO: 实现 get progress() { return config.progress; }, get watch() { return config.watch; }, get type() { return config.type; }, get isSsr() { return ['spa-ssr', 'mpa-ssr'].includes(config.type); }, // writable get builder() { return cached.builder; }, set builder(builder) { if (cached.builder) { // 只能设置一次 throw new Error('builder is already set'); } cached.builder = builder; }, get bundler() { return cached.bundler; }, set bundler(bundler) { if (cached.bundler) { // 只能设置一次 throw new Error('bundler is already set'); } cached.bundler = bundler; }, // mehtods resolve(filepath) { return resolver.resolve(filepath); }, getLayout(pageName, checkExist = true) { const { resolveLayout } = resolver; let page = config.pages.find((p) => p.name === pageName); if (page) { switch (config.type) { case 'spa': case 'spa-ssr': return resolveLayout(page.layout); case 'mpa': // 先找 page.layout // 再找 ${pageName}.ejs // 最后找 .sanp/layouts/default.ejs if (page.layout) { return resolveLayout(page.layout); } const namedLayout = path_1.default.join(config.root, 'layouts', `${pageName}.ejs`); if (!checkExist) { return namedLayout; } return fs_extra_1.default.existsSync(namedLayout) ? namedLayout : resolveLayout(); // case 'spa-ssr': // case 'mpa-ssr': // case 'component': } } }, toJSON() { return (0, only_1.default)(this, [ 'config', 'configFile', 'pkg', 'root', 'pages', 'plugins', 'build', 'server', 'ssr', 'mode', 'dev', 'prod', 'progress', 'watch', 'type' ]); }, inspect() { return this.toJSON(); } }); return context; } exports.default = createContext; //# sourceMappingURL=createContext.js.map