@reckona/mreact-router 0.0.74 → 0.0.75

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/README.md CHANGED
@@ -291,6 +291,8 @@ MREACT_ROUTER_LOG=requests mreact-router dev
291
291
 
292
292
  Each line includes method, path, status, duration, and runtime. Query strings, headers, and request bodies are intentionally omitted.
293
293
 
294
+ Built Node output binds to `127.0.0.1` by default. Use `mreact-router start .mreact --host 0.0.0.0 --host-policy=strict` or `HOST=0.0.0.0 MREACT_ROUTER_HOST_POLICY=strict mreact-router start .mreact` inside containers behind explicit port publishing or a reverse proxy. This bind address is separate from Host header trust; configure `--allowed-hosts`, `MREACT_ROUTER_ALLOWED_HOSTS`, or `hostPolicy` for public deployments.
295
+
294
296
  Use `mreact-router --help`, `mreact-router help build`, or command-level help such as `mreact-router build --help` to inspect supported commands, build targets, and generated artifacts.
295
297
 
296
298
  Server-only pages can opt into the lightweight navigation runtime without becoming hydrated client routes:
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
package/dist/build.js CHANGED
@@ -65,7 +65,7 @@ export async function buildApp(options) {
65
65
  routes,
66
66
  vitePlugins,
67
67
  });
68
- const generatedImportPolicy = buildGeneratedImportPolicy({
68
+ const generatedImportPolicy = await buildGeneratedImportPolicy({
69
69
  files,
70
70
  projectRoot: project.projectRoot,
71
71
  routes,
@@ -257,15 +257,18 @@ const frameworkRuntimePackages = new Set([
257
257
  "@reckona/mreact-router",
258
258
  "@reckona/mreact-server",
259
259
  ]);
260
- function buildGeneratedImportPolicy(options) {
260
+ const maxRuntimePackageManifestReads = 1000;
261
+ async function buildGeneratedImportPolicy(options) {
261
262
  const routePackages = new Map();
262
263
  const allPackages = new Set();
263
264
  const relativeRoutesDir = relative(options.projectRoot, options.routesDir);
265
+ const packageJsonLookupCache = new Map();
264
266
  for (const route of options.routes) {
265
267
  const file = relative(options.projectRoot, route.file);
266
- const packages = collectRuntimePackagesForFile({
268
+ const packages = await collectRuntimePackagesForFile({
267
269
  file,
268
270
  files: options.files,
271
+ packageJsonLookupCache,
269
272
  projectRoot: options.projectRoot,
270
273
  seen: new Set(),
271
274
  });
@@ -280,9 +283,10 @@ function buildGeneratedImportPolicy(options) {
280
283
  .map((file) => (relativeRoutesDir === "" ? file : `${relativeRoutesDir}/${file}`))
281
284
  .find((file) => options.files[file] !== undefined);
282
285
  if (middlewareFile !== undefined) {
283
- const packages = collectRuntimePackagesForFile({
286
+ const packages = await collectRuntimePackagesForFile({
284
287
  file: middlewareFile,
285
288
  files: options.files,
289
+ packageJsonLookupCache,
286
290
  projectRoot: options.projectRoot,
287
291
  seen: new Set(),
288
292
  });
@@ -299,7 +303,7 @@ function buildGeneratedImportPolicy(options) {
299
303
  version: 1,
300
304
  };
301
305
  }
302
- function collectRuntimePackagesForFile(options) {
306
+ async function collectRuntimePackagesForFile(options) {
303
307
  if (options.seen.has(options.file)) {
304
308
  return [];
305
309
  }
@@ -319,14 +323,22 @@ function collectRuntimePackagesForFile(options) {
319
323
  filename: join(options.projectRoot, options.file),
320
324
  })) {
321
325
  if (isRuntimePackageSpecifier(reference.source)) {
322
- packages.add(runtimePackageNameForSpecifier(reference.source));
326
+ const packageName = runtimePackageNameForSpecifier(reference.source);
327
+ packages.add(packageName);
328
+ for (const optionalPackageName of await collectRuntimeOptionalPackages({
329
+ packageJsonLookupCache: options.packageJsonLookupCache,
330
+ packageName,
331
+ projectRoot: options.projectRoot,
332
+ })) {
333
+ packages.add(optionalPackageName);
334
+ }
323
335
  continue;
324
336
  }
325
337
  const localFile = resolveBuildLocalSourceImport(options.files, options.file, reference.source);
326
338
  if (localFile === undefined) {
327
339
  continue;
328
340
  }
329
- for (const packageName of collectRuntimePackagesForFile({
341
+ for (const packageName of await collectRuntimePackagesForFile({
330
342
  ...options,
331
343
  file: localFile,
332
344
  })) {
@@ -336,12 +348,99 @@ function collectRuntimePackagesForFile(options) {
336
348
  options.seen.delete(options.file);
337
349
  return [...packages].sort();
338
350
  }
351
+ async function collectRuntimeOptionalPackages(options) {
352
+ const optionalPackages = new Set();
353
+ const seenPackageJson = new Set();
354
+ const queue = [
355
+ { packageName: options.packageName, optional: false, startDir: options.projectRoot },
356
+ ];
357
+ for (let index = 0; index < queue.length && seenPackageJson.size < maxRuntimePackageManifestReads; index += 1) {
358
+ const item = queue[index];
359
+ if (item === undefined || !isValidRuntimePackageName(item.packageName)) {
360
+ continue;
361
+ }
362
+ const manifest = await readRuntimePackageManifest({
363
+ cache: options.packageJsonLookupCache,
364
+ packageName: item.packageName,
365
+ startDir: item.startDir,
366
+ });
367
+ if (manifest === undefined || seenPackageJson.has(manifest.packageJsonPath)) {
368
+ continue;
369
+ }
370
+ seenPackageJson.add(manifest.packageJsonPath);
371
+ if (item.optional && isRuntimePackageName(item.packageName)) {
372
+ optionalPackages.add(item.packageName);
373
+ }
374
+ const packageDir = dirname(manifest.packageJsonPath);
375
+ for (const dependencyName of Object.keys(manifest.dependencies ?? {})) {
376
+ if (isValidRuntimePackageName(dependencyName)) {
377
+ queue.push({ packageName: dependencyName, optional: false, startDir: packageDir });
378
+ }
379
+ }
380
+ for (const optionalDependencyName of Object.keys(manifest.optionalDependencies ?? {})) {
381
+ if (isValidRuntimePackageName(optionalDependencyName)) {
382
+ queue.push({ packageName: optionalDependencyName, optional: true, startDir: packageDir });
383
+ }
384
+ }
385
+ }
386
+ return [...optionalPackages].sort();
387
+ }
388
+ async function readRuntimePackageManifest(options) {
389
+ const key = `${options.startDir}\0${options.packageName}`;
390
+ const cached = options.cache.get(key);
391
+ const manifest = cached ??
392
+ findRuntimePackageJson(options.packageName, options.startDir).then(async (packageJsonPath) => {
393
+ if (packageJsonPath === undefined) {
394
+ return undefined;
395
+ }
396
+ try {
397
+ const json = JSON.parse(await readFile(packageJsonPath, "utf8"));
398
+ return { ...json, packageJsonPath };
399
+ }
400
+ catch {
401
+ return undefined;
402
+ }
403
+ });
404
+ if (cached === undefined) {
405
+ options.cache.set(key, manifest);
406
+ }
407
+ return (await manifest);
408
+ }
409
+ async function findRuntimePackageJson(packageName, startDir) {
410
+ if (!isValidRuntimePackageName(packageName)) {
411
+ return undefined;
412
+ }
413
+ let current = startDir;
414
+ while (true) {
415
+ const candidate = join(current, "node_modules", ...packageName.split("/"), "package.json");
416
+ try {
417
+ if ((await stat(candidate)).isFile()) {
418
+ return candidate;
419
+ }
420
+ }
421
+ catch {
422
+ // Keep walking toward the filesystem root.
423
+ }
424
+ const parent = dirname(current);
425
+ if (parent === current) {
426
+ return undefined;
427
+ }
428
+ current = parent;
429
+ }
430
+ }
339
431
  function isRuntimePackageSpecifier(specifier) {
340
432
  if (specifier.startsWith(".") || specifier.startsWith("/") || /^[A-Za-z][A-Za-z0-9+.-]*:/.test(specifier)) {
341
433
  return false;
342
434
  }
343
435
  const packageName = runtimePackageNameForSpecifier(specifier);
344
- return !nodeBuiltinPackages.has(specifier) && !frameworkRuntimePackages.has(packageName);
436
+ return !nodeBuiltinPackages.has(specifier) && isRuntimePackageName(packageName);
437
+ }
438
+ function isRuntimePackageName(packageName) {
439
+ return !frameworkRuntimePackages.has(packageName);
440
+ }
441
+ function isValidRuntimePackageName(packageName) {
442
+ return (/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u.test(packageName) &&
443
+ !packageName.includes(".."));
345
444
  }
346
445
  function runtimePackageNameForSpecifier(specifier) {
347
446
  if (!specifier.startsWith("@")) {