@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 +2 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +107 -8
- package/dist/build.js.map +1 -1
- package/dist/cli-options.d.ts +13 -0
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +73 -0
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/package.json +11 -11
- package/src/build.ts +153 -10
- package/src/cli-options.ts +103 -0
- package/src/cli.ts +6 -0
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:
|
package/dist/build.d.ts.map
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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) &&
|
|
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("@")) {
|