@lolyjs/core 0.2.0-alpha.21 → 0.2.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9871,7 +9871,7 @@ var require_built3 = __commonJS({
9871
9871
  });
9872
9872
 
9873
9873
  // src/server.ts
9874
- import fs16 from "fs";
9874
+ import fs17 from "fs";
9875
9875
  import path23 from "path";
9876
9876
 
9877
9877
  // modules/server/utils/server-dir.ts
@@ -9913,6 +9913,7 @@ async function runInitIfExists(projectRoot, serverData) {
9913
9913
  // modules/server/setup.ts
9914
9914
  import express from "express";
9915
9915
  import path17 from "path";
9916
+ import fs15 from "fs";
9916
9917
 
9917
9918
  // modules/router/loader-pages.ts
9918
9919
  import fs4 from "fs";
@@ -14003,8 +14004,22 @@ function getStaticDir(projectRoot, config) {
14003
14004
  }
14004
14005
 
14005
14006
  // modules/server/setup.ts
14007
+ function setupStaticFiles(app, projectRoot, config) {
14008
+ if (!config) return;
14009
+ const staticDir = getStaticDir(projectRoot, config);
14010
+ if (fs15.existsSync(staticDir)) {
14011
+ app.use(
14012
+ express.static(staticDir, {
14013
+ // In production, add caching headers for better performance
14014
+ maxAge: process.env.NODE_ENV === "production" ? "1y" : 0,
14015
+ immutable: process.env.NODE_ENV === "production"
14016
+ })
14017
+ );
14018
+ }
14019
+ }
14006
14020
  function setupServer(app, options) {
14007
14021
  const { projectRoot, appDir, isDev, config } = options;
14022
+ setupStaticFiles(app, projectRoot, config);
14008
14023
  const routeLoader = isDev ? new FilesystemRouteLoader(appDir, projectRoot) : new ManifestRouteLoader(projectRoot);
14009
14024
  if (isDev) {
14010
14025
  let getRoutes2 = function() {
@@ -15108,7 +15123,7 @@ function handleNotFound(res, urlPath) {
15108
15123
  }
15109
15124
 
15110
15125
  // modules/server/handlers/ssg.ts
15111
- import fs15 from "fs";
15126
+ import fs16 from "fs";
15112
15127
  import path20 from "path";
15113
15128
  var logger3 = createModuleLogger("ssg");
15114
15129
  function getSsgDirForPath(baseDir, urlPath) {
@@ -15125,7 +15140,7 @@ function getSsgDataPath(baseDir, urlPath) {
15125
15140
  }
15126
15141
  function tryServeSsgHtml(res, ssgOutDir, urlPath) {
15127
15142
  const ssgHtmlPath = getSsgHtmlPath(ssgOutDir, urlPath);
15128
- if (!fs15.existsSync(ssgHtmlPath)) {
15143
+ if (!fs16.existsSync(ssgHtmlPath)) {
15129
15144
  return false;
15130
15145
  }
15131
15146
  logger3.info("Serving SSG HTML", { urlPath, ssgHtmlPath });
@@ -15135,17 +15150,17 @@ function tryServeSsgHtml(res, ssgOutDir, urlPath) {
15135
15150
  );
15136
15151
  res.statusCode = 200;
15137
15152
  res.setHeader("Content-Type", "text/html; charset=utf-8");
15138
- const stream = fs15.createReadStream(ssgHtmlPath, { encoding: "utf-8" });
15153
+ const stream = fs16.createReadStream(ssgHtmlPath, { encoding: "utf-8" });
15139
15154
  stream.pipe(res);
15140
15155
  return true;
15141
15156
  }
15142
15157
  function tryServeSsgData(res, ssgOutDir, urlPath) {
15143
15158
  const ssgDataPath = getSsgDataPath(ssgOutDir, urlPath);
15144
- if (!fs15.existsSync(ssgDataPath)) {
15159
+ if (!fs16.existsSync(ssgDataPath)) {
15145
15160
  return false;
15146
15161
  }
15147
15162
  try {
15148
- const raw = fs15.readFileSync(ssgDataPath, "utf-8");
15163
+ const raw = fs16.readFileSync(ssgDataPath, "utf-8");
15149
15164
  res.setHeader("Content-Type", "application/json; charset=utf-8");
15150
15165
  res.status(200).end(raw);
15151
15166
  return true;
@@ -17161,7 +17176,7 @@ var setupApplication = async ({
17161
17176
  // src/server.ts
17162
17177
  import dotenv2 from "dotenv";
17163
17178
  var envPath = path23.join(process.cwd(), ".env");
17164
- if (fs16.existsSync(envPath)) {
17179
+ if (fs17.existsSync(envPath)) {
17165
17180
  dotenv2.config({ path: envPath });
17166
17181
  } else {
17167
17182
  dotenv2.config();
@@ -17183,7 +17198,7 @@ async function startServer(options = {}) {
17183
17198
  const port = options.port ?? (process.env.PORT ? parseInt(process.env.PORT, 10) : void 0) ?? config.server.port;
17184
17199
  const host = process.env.HOST ?? (!isDev ? "0.0.0.0" : void 0) ?? config.server.host;
17185
17200
  const appDir = options.appDir ?? (isDev ? getAppDir(projectRoot, config) : path23.join(getBuildDir(projectRoot, config), "server"));
17186
- if (!isDev && !fs16.existsSync(appDir)) {
17201
+ if (!isDev && !fs17.existsSync(appDir)) {
17187
17202
  logger4.error("Compiled directory not found", void 0, {
17188
17203
  buildDir: config.directories.build,
17189
17204
  appDir,
@@ -17290,7 +17305,7 @@ function pathToOutDir(baseDir, urlPath) {
17290
17305
  }
17291
17306
 
17292
17307
  // modules/build/ssg/renderer.ts
17293
- import fs17 from "fs";
17308
+ import fs18 from "fs";
17294
17309
  import path25 from "path";
17295
17310
  import { renderToString } from "react-dom/server";
17296
17311
  init_globals();
@@ -17414,8 +17429,8 @@ async function renderStaticRoute(projectRoot, ssgOutDir, route, urlPath, params)
17414
17429
  ensureDir(dir);
17415
17430
  const htmlFile = path25.join(dir, "index.html");
17416
17431
  const dataFile = path25.join(dir, "data.json");
17417
- fs17.writeFileSync(htmlFile, html, "utf-8");
17418
- fs17.writeFileSync(dataFile, JSON.stringify(initialData, null, 2), "utf-8");
17432
+ fs18.writeFileSync(htmlFile, html, "utf-8");
17433
+ fs18.writeFileSync(dataFile, JSON.stringify(initialData, null, 2), "utf-8");
17419
17434
  }
17420
17435
 
17421
17436
  // modules/build/ssg/builder.ts
@@ -17477,7 +17492,7 @@ async function buildStaticPages(projectRoot, routes) {
17477
17492
 
17478
17493
  // modules/build/bundler/server.ts
17479
17494
  import path27 from "path";
17480
- import fs18 from "fs";
17495
+ import fs19 from "fs";
17481
17496
  import esbuild from "esbuild";
17482
17497
  init_globals();
17483
17498
  var SERVER_FILES = [INIT_FILE_NAME, CONFIG_FILE_NAME];
@@ -17485,58 +17500,95 @@ function createPathAliasPlugin(projectRoot, outDir) {
17485
17500
  const aliases = loadAliasesFromTsconfig(projectRoot);
17486
17501
  const tsconfigPath = path27.join(projectRoot, "tsconfig.json");
17487
17502
  let baseUrl = ".";
17488
- if (fs18.existsSync(tsconfigPath)) {
17503
+ if (fs19.existsSync(tsconfigPath)) {
17489
17504
  try {
17490
- const tsconfig = JSON.parse(fs18.readFileSync(tsconfigPath, "utf-8"));
17505
+ const tsconfig = JSON.parse(fs19.readFileSync(tsconfigPath, "utf-8"));
17491
17506
  baseUrl = tsconfig.compilerOptions?.baseUrl ?? ".";
17492
17507
  } catch {
17493
17508
  }
17494
17509
  }
17510
+ function resolveAliasToRelative(importPath, sourceFile) {
17511
+ if (importPath.startsWith(".") || importPath.startsWith("/") || path27.isAbsolute(importPath) || importPath.includes("node_modules")) {
17512
+ return null;
17513
+ }
17514
+ for (const [aliasKey, aliasPath] of Object.entries(aliases)) {
17515
+ if (importPath.startsWith(aliasKey + "/") || importPath === aliasKey) {
17516
+ const restPath = importPath.startsWith(aliasKey + "/") ? importPath.slice(aliasKey.length + 1) : "";
17517
+ const resolvedPath = restPath ? path27.join(aliasPath, restPath) : aliasPath;
17518
+ let actualPath = null;
17519
+ const extensions = [".ts", ".tsx", ".js", ".jsx", ".json"];
17520
+ if (fs19.existsSync(resolvedPath) && fs19.statSync(resolvedPath).isDirectory()) {
17521
+ for (const ext of extensions) {
17522
+ const indexPath = path27.join(resolvedPath, `index${ext}`);
17523
+ if (fs19.existsSync(indexPath)) {
17524
+ actualPath = indexPath;
17525
+ break;
17526
+ }
17527
+ }
17528
+ } else {
17529
+ for (const ext of extensions) {
17530
+ const filePath = resolvedPath + ext;
17531
+ if (fs19.existsSync(filePath)) {
17532
+ actualPath = filePath;
17533
+ break;
17534
+ }
17535
+ }
17536
+ if (!actualPath && fs19.existsSync(resolvedPath)) {
17537
+ actualPath = resolvedPath;
17538
+ }
17539
+ }
17540
+ if (actualPath) {
17541
+ const relativePath = path27.relative(outDir, actualPath);
17542
+ const normalizedPath = relativePath.replace(/\\/g, "/");
17543
+ const finalPath = normalizedPath.startsWith(".") ? normalizedPath : `./${normalizedPath}`;
17544
+ const ext = path27.extname(finalPath);
17545
+ const pathWithoutExt = ext === ".json" ? finalPath : finalPath.slice(0, -ext.length);
17546
+ return pathWithoutExt;
17547
+ }
17548
+ }
17549
+ }
17550
+ return null;
17551
+ }
17495
17552
  return {
17496
17553
  name: "path-alias-resolver",
17497
17554
  setup(build) {
17498
- build.onResolve({ filter: /.*/ }, (args) => {
17499
- if (args.path.startsWith(".") || args.path.startsWith("/") || path27.isAbsolute(args.path) || args.path.includes("node_modules")) {
17555
+ build.onLoad({ filter: /\.(ts|tsx|js|jsx)$/ }, (args) => {
17556
+ const fileName = path27.basename(args.path);
17557
+ const isServerFile = SERVER_FILES.some((f) => fileName === `${f}.ts` || fileName === `${f}.tsx` || fileName === `${f}.js` || fileName === `${f}.jsx`);
17558
+ const isInProjectRoot = path27.dirname(args.path) === projectRoot;
17559
+ if (!isServerFile || !isInProjectRoot) {
17500
17560
  return null;
17501
17561
  }
17502
- for (const [aliasKey, aliasPath] of Object.entries(aliases)) {
17503
- if (args.path.startsWith(aliasKey + "/") || args.path === aliasKey) {
17504
- const restPath = args.path.startsWith(aliasKey + "/") ? args.path.slice(aliasKey.length + 1) : "";
17505
- const resolvedPath = restPath ? path27.join(aliasPath, restPath) : aliasPath;
17506
- let actualPath = null;
17507
- const extensions = [".ts", ".tsx", ".js", ".jsx", ".json"];
17508
- if (fs18.existsSync(resolvedPath) && fs18.statSync(resolvedPath).isDirectory()) {
17509
- for (const ext of extensions) {
17510
- const indexPath = path27.join(resolvedPath, `index${ext}`);
17511
- if (fs18.existsSync(indexPath)) {
17512
- actualPath = indexPath;
17513
- break;
17514
- }
17515
- }
17516
- } else {
17517
- for (const ext of extensions) {
17518
- const filePath = resolvedPath + ext;
17519
- if (fs18.existsSync(filePath)) {
17520
- actualPath = filePath;
17521
- break;
17522
- }
17523
- }
17524
- if (!actualPath && fs18.existsSync(resolvedPath)) {
17525
- actualPath = resolvedPath;
17526
- }
17527
- }
17528
- if (actualPath) {
17529
- const relativePath = path27.relative(outDir, actualPath);
17530
- const normalizedPath = relativePath.replace(/\\/g, "/");
17531
- const finalPath = normalizedPath.startsWith(".") ? normalizedPath : `./${normalizedPath}`;
17532
- const ext = path27.extname(finalPath);
17533
- const pathWithoutExt = ext === ".json" ? finalPath : finalPath.slice(0, -ext.length);
17534
- return {
17535
- path: pathWithoutExt,
17536
- namespace: "file"
17537
- };
17562
+ const contents = fs19.readFileSync(args.path, "utf-8");
17563
+ let transformed = contents;
17564
+ const aliasPatterns = Object.keys(aliases).sort((a, b) => b.length - a.length);
17565
+ for (const aliasKey of aliasPatterns) {
17566
+ const escapedAlias = aliasKey.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
17567
+ const aliasInQuotesPattern = new RegExp(
17568
+ `(['"\`])${escapedAlias}(/[^'"\`\\s]*)?(['"\`])`,
17569
+ "g"
17570
+ );
17571
+ transformed = transformed.replace(aliasInQuotesPattern, (match, quote1, rest, quote2) => {
17572
+ const fullPath = aliasKey + (rest || "");
17573
+ const resolved = resolveAliasToRelative(fullPath, args.path);
17574
+ if (resolved) {
17575
+ return `${quote1}${resolved}${quote2}`;
17538
17576
  }
17539
- }
17577
+ return match;
17578
+ });
17579
+ }
17580
+ return {
17581
+ contents: transformed,
17582
+ loader: path27.extname(args.path).slice(1)
17583
+ };
17584
+ });
17585
+ build.onResolve({ filter: /.*/ }, (args) => {
17586
+ const resolved = resolveAliasToRelative(args.path, args.importer || "");
17587
+ if (resolved) {
17588
+ return {
17589
+ path: resolved,
17590
+ namespace: "file"
17591
+ };
17540
17592
  }
17541
17593
  return null;
17542
17594
  });
@@ -17546,7 +17598,7 @@ function createPathAliasPlugin(projectRoot, outDir) {
17546
17598
  function collectAppSources(appDir) {
17547
17599
  const entries = [];
17548
17600
  function walk(dir) {
17549
- const items = fs18.readdirSync(dir, { withFileTypes: true });
17601
+ const items = fs19.readdirSync(dir, { withFileTypes: true });
17550
17602
  for (const item of items) {
17551
17603
  const full = path27.join(dir, item.name);
17552
17604
  if (item.isDirectory()) {
@@ -17590,7 +17642,7 @@ async function buildServerApp(projectRoot, appDir) {
17590
17642
  for (const fileName of SERVER_FILES) {
17591
17643
  const initTS = path27.join(projectRoot, `${fileName}.ts`);
17592
17644
  const initJS = path27.join(outDir, `${fileName}.js`);
17593
- if (fs18.existsSync(initTS)) {
17645
+ if (fs19.existsSync(initTS)) {
17594
17646
  await esbuild.build({
17595
17647
  entryPoints: [initTS],
17596
17648
  outfile: initJS,