nukejs 0.0.17 → 0.0.18
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/Link.d.ts +12 -0
- package/dist/Link.js +15 -0
- package/dist/app.js +112 -0
- package/dist/build-common.js +886 -0
- package/dist/build-node.js +217 -0
- package/dist/build-vercel.js +359 -0
- package/dist/builder.js +95 -0
- package/dist/bundle.d.ts +85 -0
- package/dist/bundle.js +322 -0
- package/dist/bundler.js +112 -0
- package/dist/component-analyzer.js +125 -0
- package/dist/config.js +29 -0
- package/dist/hmr-bundle.js +120 -0
- package/dist/hmr.js +68 -0
- package/dist/html-store.d.ts +128 -0
- package/dist/html-store.js +41 -0
- package/dist/http-server.js +172 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +28 -0
- package/dist/logger.d.ts +59 -0
- package/dist/logger.js +53 -0
- package/dist/metadata.js +42 -0
- package/dist/middleware-loader.js +53 -0
- package/dist/middleware.example.js +57 -0
- package/dist/middleware.js +71 -0
- package/dist/renderer.js +151 -0
- package/dist/request-store.d.ts +80 -0
- package/dist/request-store.js +46 -0
- package/dist/router.js +118 -0
- package/dist/ssr.js +262 -0
- package/dist/store.d.ts +104 -0
- package/dist/store.js +45 -0
- package/dist/use-html.d.ts +64 -0
- package/dist/use-html.js +128 -0
- package/dist/use-request.d.ts +74 -0
- package/dist/use-request.js +48 -0
- package/dist/use-router.d.ts +7 -0
- package/dist/use-router.js +27 -0
- package/dist/utils.d.ts +26 -0
- package/dist/utils.js +61 -0
- package/package.json +1 -1
package/dist/Link.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface LinkProps {
|
|
2
|
+
href: string;
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Client-side navigation link.
|
|
8
|
+
* Intercepts clicks and delegates to useRouter().push() so the SPA router
|
|
9
|
+
* handles the transition without a full page reload.
|
|
10
|
+
*/
|
|
11
|
+
declare const Link: ({ href, children, className }: LinkProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default Link;
|
package/dist/Link.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import useRouter from "./use-router.js";
|
|
4
|
+
const Link = ({ href, children, className }) => {
|
|
5
|
+
const { push } = useRouter();
|
|
6
|
+
const handleClick = (e) => {
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
push(href);
|
|
9
|
+
};
|
|
10
|
+
return /* @__PURE__ */ jsx("a", { href, onClick: handleClick, className, children });
|
|
11
|
+
};
|
|
12
|
+
var Link_default = Link;
|
|
13
|
+
export {
|
|
14
|
+
Link_default as default
|
|
15
|
+
};
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import http from "http";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { existsSync, watch } from "fs";
|
|
4
|
+
import { c, log, setDebugLevel, getDebugLevel } from "./logger.js";
|
|
5
|
+
import { loadConfig } from "./config.js";
|
|
6
|
+
import { discoverApiPrefixes, matchApiPrefix, createApiHandler } from "./http-server.js";
|
|
7
|
+
import { loadMiddleware, runMiddleware } from "./middleware-loader.js";
|
|
8
|
+
import { serveReactBundle, serveNukeBundle, serveClientComponentBundle } from "./bundler.js";
|
|
9
|
+
import { serverSideRender } from "./ssr.js";
|
|
10
|
+
import { watchDir, broadcastRestart } from "./hmr.js";
|
|
11
|
+
const isDev = process.env.ENVIRONMENT !== "production";
|
|
12
|
+
const _startMs = Date.now();
|
|
13
|
+
if (isDev) {
|
|
14
|
+
const React = await import("react");
|
|
15
|
+
global.React = React;
|
|
16
|
+
}
|
|
17
|
+
const config = await loadConfig();
|
|
18
|
+
setDebugLevel(config.debug ?? false);
|
|
19
|
+
const PAGES_DIR = path.resolve("./app/pages");
|
|
20
|
+
const SERVER_DIR = path.resolve(config.serverDir);
|
|
21
|
+
const PORT = config.port;
|
|
22
|
+
log.info("Configuration loaded:");
|
|
23
|
+
log.info(` - Pages directory: ${PAGES_DIR}`);
|
|
24
|
+
log.info(` - Server directory: ${SERVER_DIR}`);
|
|
25
|
+
log.info(` - Port: ${PORT}`);
|
|
26
|
+
log.info(` - Debug level: ${String(getDebugLevel())}`);
|
|
27
|
+
log.info(` - Dev mode: ${String(isDev)}`);
|
|
28
|
+
if (isDev) watchDir(path.resolve("./app"), "App");
|
|
29
|
+
const apiPrefixes = discoverApiPrefixes(SERVER_DIR);
|
|
30
|
+
const handleApiRoute = createApiHandler({ apiPrefixes, port: PORT, isDev });
|
|
31
|
+
log.info(`API prefixes discovered: ${apiPrefixes.length === 0 ? "none" : ""}`);
|
|
32
|
+
apiPrefixes.forEach((p) => {
|
|
33
|
+
log.info(` - ${p.prefix || "/"} -> ${path.relative(process.cwd(), p.directory)}`);
|
|
34
|
+
});
|
|
35
|
+
if (isDev) {
|
|
36
|
+
const RESTART_EXIT_CODE = 75;
|
|
37
|
+
const restartFiles = [
|
|
38
|
+
path.resolve("./middleware.ts"),
|
|
39
|
+
path.resolve("./nuke.config.ts")
|
|
40
|
+
];
|
|
41
|
+
for (const filePath of restartFiles) {
|
|
42
|
+
if (!existsSync(filePath)) continue;
|
|
43
|
+
watch(filePath, async () => {
|
|
44
|
+
log.info(`[Server] ${path.basename(filePath)} changed \u2014 restarting...`);
|
|
45
|
+
await broadcastRestart();
|
|
46
|
+
process.exit(RESTART_EXIT_CODE);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
await loadMiddleware();
|
|
51
|
+
const server = http.createServer(async (req, res) => {
|
|
52
|
+
try {
|
|
53
|
+
const middlewareHandled = await runMiddleware(req, res);
|
|
54
|
+
if (middlewareHandled) return;
|
|
55
|
+
const url = req.url || "/";
|
|
56
|
+
if (url === "/__hmr_ping") {
|
|
57
|
+
res.setHeader("Content-Type", "text/plain");
|
|
58
|
+
res.end("ok");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (url === "/__react.js")
|
|
62
|
+
return await serveReactBundle(res);
|
|
63
|
+
if (url === "/__n.js")
|
|
64
|
+
return await serveNukeBundle(res);
|
|
65
|
+
if (url.startsWith("/__client-component/"))
|
|
66
|
+
return await serveClientComponentBundle(
|
|
67
|
+
url.slice(20).split("?")[0].replace(".js", ""),
|
|
68
|
+
res
|
|
69
|
+
);
|
|
70
|
+
if (matchApiPrefix(url, apiPrefixes))
|
|
71
|
+
return await handleApiRoute(url, req, res);
|
|
72
|
+
return await serverSideRender(url, res, PAGES_DIR, isDev, req);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
log.error("Server error:", error);
|
|
75
|
+
res.statusCode = 500;
|
|
76
|
+
res.end("Internal server error");
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
function tryListen(port) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
server.once("error", (err) => {
|
|
82
|
+
if (err.code === "EADDRINUSE") resolve(tryListen(port + 1));
|
|
83
|
+
else reject(err);
|
|
84
|
+
});
|
|
85
|
+
server.listen(port, () => resolve(port));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function printStartupBanner(port, configuredPort, startMs) {
|
|
89
|
+
const url = `http://localhost:${port}`;
|
|
90
|
+
const level = getDebugLevel();
|
|
91
|
+
const elapsed = Date.now() - startMs;
|
|
92
|
+
const keyW = 5;
|
|
93
|
+
const visible = (s) => s.replace(/\x1b\[[\d;]*m/g, "").length;
|
|
94
|
+
const row = (key, val) => {
|
|
95
|
+
const pad = " ".repeat(Math.max(0, keyW - visible(key)));
|
|
96
|
+
console.log(` ${c("gray", key)}${pad} ${val}`);
|
|
97
|
+
};
|
|
98
|
+
console.log("");
|
|
99
|
+
console.log(` ${c("orange", "NukeJS", true)} ${c("gray", `ready in ${elapsed}ms`)}`);
|
|
100
|
+
console.log("");
|
|
101
|
+
row(
|
|
102
|
+
"Local",
|
|
103
|
+
port !== configuredPort ? `${c("cyan", url, true)} ${c("yellow", `(${configuredPort} was in use)`)}` : c("cyan", url, true)
|
|
104
|
+
);
|
|
105
|
+
row(
|
|
106
|
+
"Debug",
|
|
107
|
+
level === false ? c("gray", "off") : level === true ? c("green", "verbose") : c("yellow", String(level))
|
|
108
|
+
);
|
|
109
|
+
console.log("");
|
|
110
|
+
}
|
|
111
|
+
const actualPort = await tryListen(PORT);
|
|
112
|
+
printStartupBanner(actualPort, PORT, _startMs);
|