@jay-framework/dev-server 0.5.0

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.cjs ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const vite = require("vite");
4
+ const stackRouteScanner = require("@jay-framework/stack-route-scanner");
5
+ const stackServerRuntime = require("@jay-framework/stack-server-runtime");
6
+ const vitePlugin = require("@jay-framework/vite-plugin");
7
+ const path = require("node:path");
8
+ async function initRoutes(pagesBaseFolder) {
9
+ return await stackRouteScanner.scanRoutes(pagesBaseFolder, {
10
+ jayHtmlFilename: "page.jay-html",
11
+ compFilename: "page.ts"
12
+ });
13
+ }
14
+ function defaults(options) {
15
+ const serverBase = options.serverBase || process.env.BASE || "/";
16
+ const pagesBase = path.resolve(serverBase, options.pagesBase || "./src/pages");
17
+ const tsConfigFilePath = options.jayRollupConfig.tsConfigFilePath || path.resolve(serverBase, "./tsconfig.json");
18
+ return {
19
+ serverBase,
20
+ pagesBase,
21
+ dontCacheSlowly: options.dontCacheSlowly,
22
+ jayRollupConfig: {
23
+ ...options.jayRollupConfig || {},
24
+ tsConfigFilePath
25
+ }
26
+ };
27
+ }
28
+ function handleOtherResponseCodes(res, renderedResult) {
29
+ if (renderedResult.kind === `ServerError`)
30
+ res.status(renderedResult.status).end("server error");
31
+ else if (renderedResult.kind === `ClientError`)
32
+ res.status(renderedResult.status).end("client error");
33
+ else
34
+ res.status(renderedResult.status).end("redirect to " + renderedResult.location);
35
+ }
36
+ function mkRoute(route, vite2, slowlyPhase, options) {
37
+ const path2 = stackRouteScanner.routeToExpressRoute(route);
38
+ const handler = async (req, res) => {
39
+ try {
40
+ const url = req.originalUrl.replace(options.serverBase, "");
41
+ const pageParams = req.params;
42
+ const pageProps = {
43
+ language: "en",
44
+ url
45
+ };
46
+ let viewState, carryForward;
47
+ const pageParts = await stackServerRuntime.loadPageParts(
48
+ vite2,
49
+ route,
50
+ options.pagesBase,
51
+ options.jayRollupConfig
52
+ );
53
+ if (pageParts.val) {
54
+ const renderedSlowly = await slowlyPhase.runSlowlyForPage(
55
+ pageParams,
56
+ pageProps,
57
+ pageParts.val
58
+ );
59
+ if (renderedSlowly.kind === "PartialRender") {
60
+ const renderedFast = await stackServerRuntime.renderFastChangingData(
61
+ pageParams,
62
+ pageProps,
63
+ renderedSlowly.carryForward,
64
+ pageParts.val
65
+ );
66
+ if (renderedFast.kind === "PartialRender") {
67
+ viewState = { ...renderedSlowly.rendered, ...renderedFast.rendered };
68
+ carryForward = renderedFast.carryForward;
69
+ const pageHtml = stackServerRuntime.generateClientScript(
70
+ viewState,
71
+ carryForward,
72
+ pageParts.val,
73
+ route.jayHtmlPath
74
+ );
75
+ const compiledPageHtml = await vite2.transformIndexHtml(
76
+ !!url ? url : "/",
77
+ pageHtml
78
+ );
79
+ res.status(200).set({ "Content-Type": "text/html" }).send(compiledPageHtml);
80
+ } else {
81
+ handleOtherResponseCodes(res, renderedFast);
82
+ }
83
+ } else if (renderedSlowly.kind === "ClientError") {
84
+ handleOtherResponseCodes(res, renderedSlowly);
85
+ }
86
+ } else {
87
+ console.log(pageParts.validations.join("\n"));
88
+ res.status(500).end(pageParts.validations.join("\n"));
89
+ }
90
+ } catch (e) {
91
+ vite2?.ssrFixStacktrace(e);
92
+ console.log(e.stack);
93
+ res.status(500).end(e.stack);
94
+ }
95
+ };
96
+ return { path: path2, handler };
97
+ }
98
+ async function mkDevServer(options) {
99
+ const { serverBase, pagesBase, jayRollupConfig, dontCacheSlowly } = defaults(options);
100
+ const vite$1 = await vite.createServer({
101
+ server: { middlewareMode: true },
102
+ plugins: [vitePlugin.jayRuntime(jayRollupConfig)],
103
+ appType: "custom",
104
+ base: serverBase,
105
+ root: pagesBase
106
+ });
107
+ const routes = await initRoutes(pagesBase);
108
+ const slowlyPhase = new stackServerRuntime.DevSlowlyChangingPhase(dontCacheSlowly);
109
+ const devServerRoutes = routes.map(
110
+ (route) => mkRoute(route, vite$1, slowlyPhase, options)
111
+ );
112
+ return {
113
+ server: vite$1.middlewares,
114
+ viteServer: vite$1,
115
+ routes: devServerRoutes
116
+ };
117
+ }
118
+ exports.mkDevServer = mkDevServer;
@@ -0,0 +1,23 @@
1
+ import { Connect, ViteDevServer } from 'vite';
2
+ import { RequestHandler } from 'express-serve-static-core';
3
+ import { JayRollupConfig } from '@jay-framework/rollup-plugin';
4
+
5
+ interface DevServerOptions {
6
+ serverBase?: string;
7
+ pagesBase?: string;
8
+ jayRollupConfig: JayRollupConfig;
9
+ dontCacheSlowly: boolean;
10
+ }
11
+
12
+ interface DevServerRoute {
13
+ path: string;
14
+ handler: RequestHandler;
15
+ }
16
+ interface DevServer {
17
+ server: Connect.Server;
18
+ viteServer: ViteDevServer;
19
+ routes: DevServerRoute[];
20
+ }
21
+ declare function mkDevServer(options: DevServerOptions): Promise<DevServer>;
22
+
23
+ export { type DevServer, type DevServerOptions, type DevServerRoute, mkDevServer };
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@jay-framework/dev-server",
3
+ "version": "0.5.0",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "main": "dist/index.cjs",
7
+ "files": [
8
+ "dist",
9
+ "readme.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "npm run build:js && npm run build:types",
13
+ "build:watch": "npm run build:js -- --watch & npm run build:types -- --watch",
14
+ "build:js": "vite build",
15
+ "build:types": "tsup lib/index.ts --dts-only --format esm",
16
+ "build:check-types": "tsc",
17
+ "test-definitions": "jay-cli definitions test",
18
+ "test-runtime": "jay-cli runtime test",
19
+ "clean": "rimraf dist",
20
+ "confirm": "npm run clean && npm run build && npm run build:check-types && npm run test",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@jay-framework/component": "workspace:^",
26
+ "@jay-framework/fullstack-component": "workspace:^",
27
+ "@jay-framework/runtime": "workspace:^",
28
+ "@jay-framework/stack-client-runtime": "workspace:^",
29
+ "@jay-framework/stack-route-scanner": "workspace:^",
30
+ "@jay-framework/stack-server-runtime": "workspace:^",
31
+ "vite": "^5.0.11"
32
+ },
33
+ "devDependencies": {
34
+ "@jay-framework/dev-environment": "workspace:^",
35
+ "@jay-framework/jay-cli": "workspace:^",
36
+ "@jay-framework/stack-client-runtime": "workspace:^",
37
+ "@types/express": "^5.0.2",
38
+ "@types/node": "^22.15.21",
39
+ "nodemon": "^3.0.3",
40
+ "replace-in-file": "^7.1.0",
41
+ "rimraf": "^5.0.5",
42
+ "tsup": "^8.0.1",
43
+ "typescript": "^5.3.3",
44
+ "vitest": "^1.2.1"
45
+ }
46
+ }