@jay-framework/stack-server-runtime 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.
@@ -0,0 +1,31 @@
1
+ import { AnyJayStackComponentDefinition, PageProps, AnySlowlyRenderResult, UrlParams, JayStackComponentDefinition, AnyFastRenderResult } from '@jay-framework/fullstack-component';
2
+ import { JayComponentCore } from '@jay-framework/component';
3
+ import { ViteDevServer } from 'vite';
4
+ import { JayRoute } from '@jay-framework/stack-route-scanner';
5
+ import { WithValidations } from '@jay-framework/compiler-shared';
6
+ import { JayRollupConfig } from '@jay-framework/rollup-plugin';
7
+
8
+ interface DevServerPagePart {
9
+ compDefinition: AnyJayStackComponentDefinition;
10
+ key?: string;
11
+ clientImport: string;
12
+ clientPart: string;
13
+ }
14
+ declare function loadPageParts(vite: ViteDevServer, route: JayRoute, pagesBase: string, jayRollupConfig: JayRollupConfig): Promise<WithValidations<DevServerPagePart[]>>;
15
+
16
+ interface SlowlyChangingPhase {
17
+ runSlowlyForPage(pageParams: object, pageProps: PageProps, parts: Array<DevServerPagePart>): Promise<AnySlowlyRenderResult>;
18
+ }
19
+ declare class DevSlowlyChangingPhase implements SlowlyChangingPhase {
20
+ private dontCacheSlowly;
21
+ constructor(dontCacheSlowly: boolean);
22
+ runSlowlyForPage(pageParams: UrlParams, pageProps: PageProps, parts: Array<DevServerPagePart>): Promise<AnySlowlyRenderResult>;
23
+ }
24
+ declare function runLoadParams<StaticViewState extends object, ViewState extends object, Refs extends object, ServerContexts extends Array<any>, ClientContexts extends Array<any>, PropsT extends object, Params extends UrlParams, CompCore extends JayComponentCore<PropsT, ViewState>>(compDefinition: JayStackComponentDefinition<StaticViewState, ViewState, Refs, ServerContexts, ClientContexts, PropsT, Params, CompCore>, serverContexts: ServerContexts): Promise<void>;
25
+ declare function runSlowlyChangingRender<StaticViewState extends object, ViewState extends object, Refs extends object, ServerContexts extends Array<any>, ClientContexts extends Array<any>, PropsT extends object, Params extends UrlParams, CompCore extends JayComponentCore<PropsT, ViewState>>(compDefinition: JayStackComponentDefinition<StaticViewState, ViewState, Refs, ServerContexts, ClientContexts, PropsT, Params, CompCore>): void;
26
+
27
+ declare function renderFastChangingData(pageParams: object, pageProps: PageProps, carryForward: object, parts: Array<DevServerPagePart>): Promise<AnyFastRenderResult>;
28
+
29
+ declare function generateClientScript(defaultViewState: object, fastCarryForward: object, parts: DevServerPagePart[], jayHtmlPath: string): string;
30
+
31
+ export { DevSlowlyChangingPhase, type SlowlyChangingPhase, generateClientScript, loadPageParts, renderFastChangingData, runLoadParams, runSlowlyChangingRender };
package/dist/index.js ADDED
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
+ const fullstackComponent = require("@jay-framework/fullstack-component");
26
+ const fs = require("node:fs/promises");
27
+ const path = require("node:path");
28
+ const compilerJayHtml = require("@jay-framework/compiler-jay-html");
29
+ function isLeftSideParamsSubsetOfRightSideParams(left, right) {
30
+ return Object.keys(left).reduce((prev, curr) => prev && left[curr] === right[curr], true);
31
+ }
32
+ async function findMatchingParams(search, searchTarget) {
33
+ for await (const paramsArray of searchTarget) {
34
+ if (paramsArray.find((params) => isLeftSideParamsSubsetOfRightSideParams(search, params)))
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ class DevSlowlyChangingPhase {
40
+ constructor(dontCacheSlowly) {
41
+ this.dontCacheSlowly = dontCacheSlowly;
42
+ }
43
+ async runSlowlyForPage(pageParams, pageProps, parts) {
44
+ for (const part of parts) {
45
+ const { compDefinition } = part;
46
+ if (compDefinition.loadParams) {
47
+ const compParams = compDefinition.loadParams([]);
48
+ if (!await findMatchingParams(pageParams, compParams))
49
+ return fullstackComponent.notFound();
50
+ }
51
+ }
52
+ let slowlyViewState = {};
53
+ let carryForward = {};
54
+ for (const part of parts) {
55
+ const { compDefinition, key } = part;
56
+ if (compDefinition.slowlyRender) {
57
+ const slowlyRenderedPart = await compDefinition.slowlyRender(
58
+ { ...pageProps, ...pageParams },
59
+ []
60
+ );
61
+ if (slowlyRenderedPart.kind === "PartialRender") {
62
+ if (!key) {
63
+ slowlyViewState = { ...slowlyViewState, ...slowlyRenderedPart.rendered };
64
+ carryForward = { ...carryForward, ...slowlyRenderedPart.carryForward };
65
+ } else {
66
+ slowlyViewState[key] = slowlyRenderedPart.rendered;
67
+ carryForward[key] = slowlyRenderedPart.carryForward;
68
+ }
69
+ } else
70
+ return slowlyRenderedPart;
71
+ }
72
+ }
73
+ return fullstackComponent.partialRender(slowlyViewState, carryForward);
74
+ }
75
+ }
76
+ async function runLoadParams(compDefinition, serverContexts) {
77
+ compDefinition.loadParams(serverContexts);
78
+ }
79
+ function runSlowlyChangingRender(compDefinition) {
80
+ }
81
+ async function renderFastChangingData(pageParams, pageProps, carryForward, parts) {
82
+ let fastViewState = {};
83
+ let fastCarryForward = {};
84
+ for (const part of parts) {
85
+ const { compDefinition, key } = part;
86
+ if (compDefinition.fastRender) {
87
+ const partSlowlyCarryForward = key ? carryForward[key] : carryForward;
88
+ const fastRenderedPart = await compDefinition.fastRender(
89
+ { ...pageProps, ...pageParams },
90
+ ...[partSlowlyCarryForward]
91
+ );
92
+ if (fastRenderedPart.kind === "PartialRender") {
93
+ if (!key) {
94
+ fastViewState = { ...fastViewState, ...fastRenderedPart.rendered };
95
+ fastCarryForward = { ...fastCarryForward, ...fastRenderedPart.carryForward };
96
+ } else {
97
+ fastViewState[key] = fastRenderedPart.rendered;
98
+ fastCarryForward[key] = fastRenderedPart.carryForward;
99
+ }
100
+ } else
101
+ return fastRenderedPart;
102
+ }
103
+ }
104
+ return Promise.resolve(fullstackComponent.partialRender(fastViewState, fastCarryForward));
105
+ }
106
+ function generateClientScript(defaultViewState, fastCarryForward, parts, jayHtmlPath) {
107
+ const imports = parts.length > 1 ? parts.map((part) => part.clientImport).join("\n") + "\n" : "";
108
+ const compositeParts = parts.length > 1 ? `[
109
+ ${parts.map((part) => " " + part.clientPart).join(",\n")}
110
+ ]` : "[]";
111
+ return `<!doctype html>
112
+ <html lang="en">
113
+ <head>
114
+ <meta charset="UTF-8" />
115
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
116
+ <title>Vite + TS</title>
117
+ </head>
118
+ <body>
119
+ <div id="target"></div>
120
+ <script type="module">
121
+ import {makeCompositeJayComponent} from "@jay-framework/stack-client-runtime";
122
+ import { render } from '${jayHtmlPath}';
123
+ ${imports}
124
+ const viewState = ${JSON.stringify(defaultViewState)};
125
+ const fastCarryForward = ${JSON.stringify(fastCarryForward)};
126
+
127
+ const target = document.getElementById('target');
128
+ const pageComp = makeCompositeJayComponent(render, viewState, fastCarryForward, ${compositeParts})
129
+
130
+ const instance = pageComp({...viewState, ...fastCarryForward})
131
+ target.appendChild(instance.element.dom);
132
+ <\/script>
133
+ </body>
134
+ </html>`;
135
+ }
136
+ async function loadPageParts(vite, route, pagesBase, jayRollupConfig) {
137
+ const exists = await fs.access(route.compPath, fs.constants.F_OK).then(() => true).catch(() => false);
138
+ const parts = [];
139
+ const pageCode = path.resolve(pagesBase, "./page.ts");
140
+ if (exists) {
141
+ const pageComponent = (await vite.ssrLoadModule(route.compPath)).page;
142
+ parts.push({
143
+ compDefinition: pageComponent,
144
+ clientImport: `import {page} from '${pageCode}'`,
145
+ clientPart: `{comp: page.comp, contextMarkers: []}`
146
+ });
147
+ }
148
+ const jayHtmlSource = (await fs.readFile(route.jayHtmlPath)).toString();
149
+ const fileName = path.basename(route.jayHtmlPath);
150
+ const dirName = path.dirname(route.jayHtmlPath);
151
+ const module2 = await import("@jay-framework/compiler-jay-html");
152
+ const JAY_IMPORT_RESOLVER = module2.JAY_IMPORT_RESOLVER;
153
+ const jayHtmlWithValidations = await compilerJayHtml.parseJayFile(
154
+ jayHtmlSource,
155
+ fileName,
156
+ dirName,
157
+ {
158
+ relativePath: jayRollupConfig.tsConfigFilePath
159
+ },
160
+ JAY_IMPORT_RESOLVER
161
+ );
162
+ return jayHtmlWithValidations.mapAsync(async (jayHtml) => {
163
+ for await (const headlessImport of jayHtml.headlessImports) {
164
+ const module22 = headlessImport.codeLink.module;
165
+ const name = headlessImport.codeLink.names[0].name;
166
+ const modulePath = module22[0] === "." ? path.resolve(dirName, module22) : require.resolve(module22, { paths: require.resolve.paths(dirName) });
167
+ const compDefinition = (await vite.ssrLoadModule(modulePath))[name];
168
+ const moduleImport = module22.startsWith("./") ? path.resolve(pagesBase, module22) : module22;
169
+ const key = headlessImport.key;
170
+ const part = {
171
+ key,
172
+ compDefinition,
173
+ clientImport: `import {${name}} from '${moduleImport}'`,
174
+ clientPart: `{comp: ${name}.comp, contextMarkers: [], key: '${headlessImport.key}'}`
175
+ };
176
+ parts.push(part);
177
+ }
178
+ return parts;
179
+ });
180
+ }
181
+ exports.DevSlowlyChangingPhase = DevSlowlyChangingPhase;
182
+ exports.generateClientScript = generateClientScript;
183
+ exports.loadPageParts = loadPageParts;
184
+ exports.renderFastChangingData = renderFastChangingData;
185
+ exports.runLoadParams = runLoadParams;
186
+ exports.runSlowlyChangingRender = runSlowlyChangingRender;
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@jay-framework/stack-server-runtime",
3
+ "version": "0.5.0",
4
+ "license": "Apache-2.0",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.mts",
7
+ "directories": {
8
+ "lib": "lib"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "readme.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "npm run build:js && npm run build:types",
16
+ "build:watch": "npm run build:js -- --watch & npm run build:types -- --watch",
17
+ "build:js": "vite build",
18
+ "build:types": "tsup lib/index.ts --dts-only --format esm",
19
+ "build:check-types": "tsc",
20
+ "test-definitions": "jay-cli definitions test",
21
+ "test-runtime": "jay-cli runtime test",
22
+ "clean": "rimraf dist",
23
+ "confirm": "npm run clean && npm run build && npm run build:check-types && npm run test",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest"
26
+ },
27
+ "dependencies": {
28
+ "@jay-framework/compiler-jay-html": "workspace:^",
29
+ "@jay-framework/component": "workspace:^",
30
+ "@jay-framework/fullstack-component": "workspace:^",
31
+ "@jay-framework/runtime": "workspace:^",
32
+ "@jay-framework/stack-route-scanner": "workspace:^"
33
+ },
34
+ "devDependencies": {
35
+ "@jay-framework/dev-environment": "workspace:^",
36
+ "@jay-framework/jay-cli": "workspace:^",
37
+ "@jay-framework/stack-client-runtime": "workspace:^",
38
+ "@types/express": "^5.0.2",
39
+ "@types/node": "^22.15.21",
40
+ "nodemon": "^3.0.3",
41
+ "replace-in-file": "^7.1.0",
42
+ "rimraf": "^5.0.5",
43
+ "tsup": "^8.0.1",
44
+ "typescript": "^5.3.3",
45
+ "vite": "^5.0.11",
46
+ "vitest": "^1.2.1"
47
+ }
48
+ }