UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

462 lines (455 loc) 23.3 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: !0 }); }, __copyProps = (to, from, except, desc) => { if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__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: !0 }) : target, mod )), __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod); var build_exports = {}; __export(build_exports, { build: () => build }); module.exports = __toCommonJS(build_exports); var import_fs_extra = __toESM(require("fs-extra"), 1), import_micromatch = __toESM(require("micromatch"), 1), import_node_module = require("node:module"), import_node_path = __toESM(require("node:path"), 1), import_vite = require("vite"), import_vxrn = require("vxrn"), constants = __toESM(require("../constants"), 1), import_setServerGlobals = require("../server/setServerGlobals"), import_toAbsolute = require("../utils/toAbsolute"), import_getManifest = require("../vite/getManifest"), import_loadConfig = require("../vite/loadConfig"), import_one_server_only = require("../vite/one-server-only"), import_buildVercelOutputDirectory = require("../vercel/build/buildVercelOutputDirectory"), import_getRouterRootFromOneOptions = require("../utils/getRouterRootFromOneOptions"), import_buildPage = require("./buildPage"), import_checkNodeVersion = require("./checkNodeVersion"), import_label_process = require("./label-process"), import_getPathnameFromFilePath = require("../utils/getPathnameFromFilePath"); const import_meta = {}; var { ensureDir, writeJSON } = import_fs_extra.default; process.on("uncaughtException", function(err) { console.error((err == null ? void 0 : err.message) || err); }); async function build(args) { var _oneOptions_build, _oneOptions_build_server, _oneOptions_build1, _oneOptions_build2, _oneOptions_web; process.env.IS_VXRN_CLI = "true", process.env.NODE_ENV = "production", (0, import_label_process.labelProcess)("build"), (0, import_checkNodeVersion.checkNodeVersion)(), (0, import_setServerGlobals.setServerGlobals)(); var { oneOptions } = await (0, import_loadConfig.loadUserOneOptions)("build"), routerRoot = (0, import_getRouterRootFromOneOptions.getRouterRootFromOneOptions)(oneOptions), routerRootRegexp = new RegExp(`^${routerRoot}`), manifest = (0, import_getManifest.getManifest)({ routerRoot }), _oneOptions_build_server_outputFormat, serverOutputFormat = ((_oneOptions_build = oneOptions.build) === null || _oneOptions_build === void 0 ? void 0 : _oneOptions_build.server) === !1 ? "esm" : (_oneOptions_build_server_outputFormat = (_oneOptions_build1 = oneOptions.build) === null || _oneOptions_build1 === void 0 || (_oneOptions_build_server = _oneOptions_build1.server) === null || _oneOptions_build_server === void 0 ? void 0 : _oneOptions_build_server.outputFormat) !== null && _oneOptions_build_server_outputFormat !== void 0 ? _oneOptions_build_server_outputFormat : "esm", vxrnOutput = await (0, import_vxrn.build)({ server: oneOptions.server, build: { analyze: !0, server: ((_oneOptions_build2 = oneOptions.build) === null || _oneOptions_build2 === void 0 ? void 0 : _oneOptions_build2.server) === !1 ? !1 : { outputFormat: serverOutputFormat } } }, args); if (!vxrnOutput || args.platform !== "web") return; var options = await (0, import_vxrn.fillOptions)(vxrnOutput.options), { optimizeDeps } = (0, import_vxrn.getOptimizeDeps)("build"), apiBuildConfig = (0, import_vite.mergeConfig)( // feels like this should build off the *server* build config not web vxrnOutput.webBuildConfig, { configFile: !1, appType: "custom", optimizeDeps } ); async function buildCustomRoutes(subFolder, routes) { var _oneOptions_build_api, _oneOptions_build3, _oneOptions_build_api1, _oneOptions_build12, _oneOptions_build_api2, _oneOptions_build22, input = routes.reduce(function(entries, param) { var { page, file } = param; return entries[page.slice(1) + ".js"] = (0, import_node_path.join)(routerRoot, file), entries; }, {}), _oneOptions_build_api_outputFormat, outputFormat = (_oneOptions_build_api_outputFormat = oneOptions == null || (_oneOptions_build3 = oneOptions.build) === null || _oneOptions_build3 === void 0 || (_oneOptions_build_api = _oneOptions_build3.api) === null || _oneOptions_build_api === void 0 ? void 0 : _oneOptions_build_api.outputFormat) !== null && _oneOptions_build_api_outputFormat !== void 0 ? _oneOptions_build_api_outputFormat : serverOutputFormat, treeshake = oneOptions == null || (_oneOptions_build12 = oneOptions.build) === null || _oneOptions_build12 === void 0 || (_oneOptions_build_api1 = _oneOptions_build12.api) === null || _oneOptions_build_api1 === void 0 ? void 0 : _oneOptions_build_api1.treeshake, mergedConfig = (0, import_vite.mergeConfig)(apiBuildConfig, { appType: "custom", configFile: !1, // plugins: [ // nodeExternals({ // exclude: optimizeDeps.include, // }) as any, // ], define: { ...vxrnOutput.processEnvDefines }, ssr: { noExternal: !0, external: [ "react", "react-dom" ], optimizeDeps }, build: { ssr: !0, emptyOutDir: !1, outDir: `dist/${subFolder}`, copyPublicDir: !1, minify: !1, rollupOptions: { treeshake: treeshake ?? { moduleSideEffects: !1 }, plugins: [ // otherwise rollup is leaving commonjs-only top level imports... outputFormat === "esm" ? import_vxrn.rollupRemoveUnusedImportsPlugin : null ].filter(Boolean), // too many issues // treeshake: { // moduleSideEffects: false, // }, // prevents it from shaking out the exports preserveEntrySignatures: "strict", input, external: function(id) { return !1; }, output: { entryFileNames: "[name]", exports: "auto", ...outputFormat === "esm" ? { format: "esm", esModule: !0 } : { format: "cjs", // Preserve folder structure and use .cjs extension entryFileNames: function(chunkInfo) { var name = chunkInfo.name.replace(/\.js$/, ".cjs"); return name; }, chunkFileNames: function(chunkInfo) { var dir = import_node_path.default.dirname(chunkInfo.name), name = import_node_path.default.basename(chunkInfo.name, import_node_path.default.extname(chunkInfo.name)); return import_node_path.default.join(dir, `${name}-[hash].cjs`); }, assetFileNames: function(assetInfo) { var _assetInfo_name, name = (_assetInfo_name = assetInfo.name) !== null && _assetInfo_name !== void 0 ? _assetInfo_name : "", dir = import_node_path.default.dirname(name), baseName = import_node_path.default.basename(name, import_node_path.default.extname(name)), ext = import_node_path.default.extname(name); return import_node_path.default.join(dir, `${baseName}-[hash]${ext}`); } } } } } }), userApiBuildConf = (_oneOptions_build22 = oneOptions.build) === null || _oneOptions_build22 === void 0 || (_oneOptions_build_api2 = _oneOptions_build22.api) === null || _oneOptions_build_api2 === void 0 ? void 0 : _oneOptions_build_api2.config, finalApiBuildConf = userApiBuildConf ? (0, import_vite.mergeConfig)(mergedConfig, userApiBuildConf) : mergedConfig, output = await (0, import_vite.build)( // allow user merging api build config finalApiBuildConf ); return output; } var apiOutput = null; manifest.apiRoutes.length && (console.info(` \u{1F528} build api routes `), apiOutput = await buildCustomRoutes("api", manifest.apiRoutes)); var builtMiddlewares = {}; if (manifest.middlewareRoutes.length) { console.info(` \u{1F528} build middlewares `); var middlewareBuildInfo = await buildCustomRoutes("middlewares", manifest.middlewareRoutes), _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _loop = function() { var middleware = _step.value, absoluteRoot = (0, import_node_path.resolve)(process.cwd(), options.root), fullPath = (0, import_node_path.join)(absoluteRoot, routerRoot, middleware.file), outChunks = middlewareBuildInfo.output.filter(function(x) { return x.type === "chunk"; }), chunk = outChunks.find(function(x) { return x.facadeModuleId === fullPath; }); if (!chunk) throw new Error("internal err finding middleware"); builtMiddlewares[middleware.file] = (0, import_node_path.join)("dist", "middlewares", chunk.fileName); }, _iterator = manifest.middlewareRoutes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) _loop(); } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } } globalThis.require = (0, import_node_module.createRequire)((0, import_node_path.join)(import_meta.url, "..")); var assets = [], builtRoutes = []; console.info(` \u{1F528} build static routes `); var staticDir = (0, import_node_path.join)("dist/static"), clientDir = (0, import_node_path.join)("dist/client"); if (await ensureDir(staticDir), !vxrnOutput.serverOutput) throw new Error("No server output"); var outputEntries = [ ...vxrnOutput.serverOutput.entries() ], _iteratorNormalCompletion1 = !0, _didIteratorError1 = !1, _iteratorError1 = void 0; try { for (var _loop1 = async function() { var [index, output] = _step1.value, _vxrnOutput_buildArgs, _foundRoute_layouts, _exported_generateStaticParams; if (output.type === "asset") return assets.push(output), "continue"; var id = output.facadeModuleId || "", file = import_node_path.default.basename(id); if (!id || file[0] === "_" || file.includes("entry-server") || id.includes("+api") || !id.includes(`/${routerRoot}/`)) return "continue"; var relativeId = (0, import_node_path.relative)(process.cwd(), id).replace(`${routerRoot}/`, "/"), onlyBuild = (_vxrnOutput_buildArgs = vxrnOutput.buildArgs) === null || _vxrnOutput_buildArgs === void 0 ? void 0 : _vxrnOutput_buildArgs.only; if (onlyBuild && !import_micromatch.default.contains(relativeId, onlyBuild)) return "continue"; var clientManifestKey = Object.keys(vxrnOutput.clientManifest).find(function(key) { return id.endsWith(key); }) || ""; if (!clientManifestKey) return "continue"; var clientManifestEntry = vxrnOutput.clientManifest[clientManifestKey], foundRoute = manifest.pageRoutes.find(function(route2) { return route2.file && clientManifestKey.replace(routerRootRegexp, "") === route2.file.slice(1); }); if (!foundRoute) return "continue"; foundRoute.loaderServerPath = output.fileName; function collectImports(param) { var { imports = [], css } = param, { type = "js" } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; return [ ...new Set([ ...type === "js" ? imports : css || [], ...imports.flatMap(function(name) { var found = vxrnOutput.clientManifest[name]; return found || console.warn("No found imports", name, vxrnOutput.clientManifest), collectImports(found, { type }); }) ].flat().filter(function(x) { return x && (type === "css" || x.endsWith(".js")); }).map(function(x) { return type === "css" || x.startsWith("assets/") ? x : `assets/${x.slice(1)}`; })) ]; } clientManifestEntry || console.warn(`No client manifest entry found: ${clientManifestKey} in manifest ${JSON.stringify(vxrnOutput.clientManifest, null, 2)}`); var entryImports = collectImports(clientManifestEntry || {}), _foundRoute_layouts_flatMap, layoutEntries = (_foundRoute_layouts_flatMap = (_foundRoute_layouts = foundRoute.layouts) === null || _foundRoute_layouts === void 0 ? void 0 : _foundRoute_layouts.flatMap(function(layout) { var clientKey = `${routerRoot}${layout.contextKey.slice(1)}`; return vxrnOutput.clientManifest[clientKey]; })) !== null && _foundRoute_layouts_flatMap !== void 0 ? _foundRoute_layouts_flatMap : [], layoutImports = layoutEntries.flatMap(function(entry) { return [ entry.file, ...collectImports(entry) ]; }), preloadSetupFilePreloads = function() { if (oneOptions.setupFile) { var needle = oneOptions.setupFile.replace(/^\.\//, ""); for (var file2 in vxrnOutput.clientManifest) if (file2 === needle) { var entry = vxrnOutput.clientManifest[file2]; return [ entry.file ]; } } return []; }(), preloads2 = [ .../* @__PURE__ */ new Set([ ...preloadSetupFilePreloads, // add the route entry js (like ./app/index.ts) clientManifestEntry.file, // add the virtual entry vxrnOutput.clientManifest["virtual:one-entry"].file, ...entryImports, ...layoutImports ]) ].map(function(path) { return `/${path}`; }), allEntries = [ clientManifestEntry, ...layoutEntries ], allCSS = allEntries.flatMap(function(entry) { return collectImports(entry, { type: "css" }); }).map(function(path) { return `/${path}`; }); process.env.DEBUG && console.info("[one] building routes", { foundRoute, layoutEntries, allEntries, allCSS }); var serverJsPath = (0, import_node_path.join)("dist/server", output.fileName), exported = void 0; try { exported = await import((0, import_toAbsolute.toAbsolute)(serverJsPath)); } catch (err) { throw console.error("Error importing page (original error)", err), new Error(`Error importing page: ${serverJsPath}`, { cause: err }); } var isDynamic = !!Object.keys(foundRoute.routeKeys).length; if (foundRoute.type === "ssg" && isDynamic && !foundRoute.page.includes("+not-found") && !foundRoute.page.includes("_sitemap") && !exported.generateStaticParams) throw new Error(`[one] Error: Missing generateStaticParams Route ${foundRoute.page} of type ${foundRoute.type} must export generateStaticParams so build can complete. See docs on generateStaticParams: https://onestack.dev/docs/routing-exports#generatestaticparams `); var _ref, paramsList = (_ref = await ((_exported_generateStaticParams = exported.generateStaticParams) === null || _exported_generateStaticParams === void 0 ? void 0 : _exported_generateStaticParams.call(exported))) !== null && _ref !== void 0 ? _ref : [ {} ]; console.info(` [build] page ${relativeId} (with ${paramsList.length} routes) `), process.env.DEBUG && console.info("paramsList", JSON.stringify(paramsList, null, 2)); var _iteratorNormalCompletion4 = !0, _didIteratorError4 = !1, _iteratorError4 = void 0; try { for (var _loop2 = async function() { var params = _step4.value, path = (0, import_getPathnameFromFilePath.getPathnameFromFilePath)(relativeId, params, foundRoute.type === "ssg"); console.info(` \u21A6 route ${path}`); var built = await (0, import_one_server_only.runWithAsyncLocalContext)(async function() { return await (0, import_buildPage.buildPage)(vxrnOutput.serverEntry, path, relativeId, params, foundRoute, clientManifestEntry, staticDir, clientDir, builtMiddlewares, serverJsPath, preloads2, allCSS); }); builtRoutes.push(built); }, _iterator4 = paramsList[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = !0) await _loop2(); } catch (err) { _didIteratorError4 = !0, _iteratorError4 = err; } finally { try { !_iteratorNormalCompletion4 && _iterator4.return != null && _iterator4.return(); } finally { if (_didIteratorError4) throw _iteratorError4; } } }, _iterator1 = outputEntries[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) await _loop1(); } catch (err) { _didIteratorError1 = !0, _iteratorError1 = err; } finally { try { !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return(); } finally { if (_didIteratorError1) throw _iteratorError1; } } await moveAllFiles(staticDir, clientDir), await import_fs_extra.default.rm(staticDir, { force: !0, recursive: !0 }); var routeMap = {}, routeToBuildInfo = {}, pathToRoute = {}, preloads = {}, loaders = {}, _iteratorNormalCompletion2 = !0, _didIteratorError2 = !1, _iteratorError2 = void 0; try { for (var _iterator2 = builtRoutes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) { var route = _step2.value; route.cleanPath.includes("*") || (routeMap[route.cleanPath] = route.htmlPath); var { // dont include loaderData it can be huge loaderData: _loaderData, ...rest } = route; routeToBuildInfo[route.routeFile] = rest; var _iteratorNormalCompletion3 = !0, _didIteratorError3 = !1, _iteratorError3 = void 0; try { for (var _iterator3 = getCleanPaths([ route.path, route.cleanPath ])[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = !0) { var p = _step3.value; pathToRoute[p] = route.routeFile; } } catch (err) { _didIteratorError3 = !0, _iteratorError3 = err; } finally { try { !_iteratorNormalCompletion3 && _iterator3.return != null && _iterator3.return(); } finally { if (_didIteratorError3) throw _iteratorError3; } } preloads[route.preloadPath] = !0, loaders[route.loaderPath] = !0; } } catch (err) { _didIteratorError2 = !0, _iteratorError2 = err; } finally { try { !_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return(); } finally { if (_didIteratorError2) throw _iteratorError2; } } function createBuildManifestRoute(route2) { var { layouts, ...built } = route2, buildInfo = builtRoutes.find(function(x) { return x.routeFile === route2.file; }); if (built.middlewares && (buildInfo != null && buildInfo.middlewares)) { var _iteratorNormalCompletion4 = !0, _didIteratorError4 = !1, _iteratorError4 = void 0; try { for (var _iterator4 = built.middlewares.entries()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = !0) { var [index, mw] = _step4.value; mw.contextKey = buildInfo.middlewares[index]; } } catch (err) { _didIteratorError4 = !0, _iteratorError4 = err; } finally { try { !_iteratorNormalCompletion4 && _iterator4.return != null && _iterator4.return(); } finally { if (_didIteratorError4) throw _iteratorError4; } } } return buildInfo && (built.loaderPath = buildInfo.loaderPath), built; } var buildInfoForWriting = { oneOptions, routeToBuildInfo, pathToRoute, manifest: { pageRoutes: manifest.pageRoutes.map(createBuildManifestRoute), apiRoutes: manifest.apiRoutes.map(createBuildManifestRoute), allRoutes: manifest.allRoutes.map(createBuildManifestRoute) }, routeMap, constants: JSON.parse(JSON.stringify({ ...constants })), preloads, loaders }; await writeJSON((0, import_toAbsolute.toAbsolute)("dist/buildInfo.json"), buildInfoForWriting); var postBuildLogs = [], platform = (_oneOptions_web = oneOptions.web) === null || _oneOptions_web === void 0 ? void 0 : _oneOptions_web.deploy; switch (platform && postBuildLogs.push(`[one.build] platform ${platform}`), platform) { case "vercel": { await (0, import_buildVercelOutputDirectory.buildVercelOutputDirectory)({ apiOutput, buildInfoForWriting, clientDir, oneOptionsRoot: options.root, postBuildLogs }); break; } } process.env.VXRN_ANALYZE_BUNDLE && postBuildLogs.push(`client build report: ${(0, import_toAbsolute.toAbsolute)("dist/report.html")}`), postBuildLogs.length && (console.info(` `), postBuildLogs.forEach(function(log) { console.info(` \xB7 ${log}`); })), console.info(` \u{1F49B} build complete `); } var TRAILING_INDEX_REGEX = /\/index(\.(web))?/; function getCleanPaths(possiblePaths) { return Array.from(new Set(Array.from(new Set(possiblePaths)).flatMap(function(p) { var paths = [ p ]; if (p.match(TRAILING_INDEX_REGEX)) { var pathWithTrailingIndexRemoved = p.replace(TRAILING_INDEX_REGEX, ""); paths.push(pathWithTrailingIndexRemoved), paths.push(pathWithTrailingIndexRemoved + "/"); } return paths; }))); } async function moveAllFiles(src, dest) { try { await import_fs_extra.default.copy(src, dest, { overwrite: !0, errorOnExist: !1 }); } catch (err) { console.error("Error moving files:", err); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { build }); //# sourceMappingURL=build.js.map