zuby 1.0.73 → 1.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.
@@ -39,6 +39,11 @@ export interface GlobalContext {
39
39
  * The build ID of the site.
40
40
  */
41
41
  buildId: string;
42
+ /**
43
+ * The environment of the site.
44
+ * @example development
45
+ */
46
+ environment?: 'development' | 'production' | string;
42
47
  /**
43
48
  * The internalization config from ZubyConfig.
44
49
  * @example {
@@ -58,6 +58,17 @@ export declare class PageContext {
58
58
  * Returns true if the current environment is browser.
59
59
  */
60
60
  get isBrowserEnv(): boolean;
61
+ /**
62
+ * Returns true if app
63
+ * is running in production environment.
64
+ */
65
+ get isProductionEnv(): boolean;
66
+ /**
67
+ * Returns the current environment
68
+ * where the app is running.
69
+ * @example development
70
+ */
71
+ get environment(): string | undefined;
61
72
  /**
62
73
  * The value of 'site' property from the ZubyConfig.
63
74
  * @example https://example.com
@@ -85,6 +85,21 @@ export class PageContext {
85
85
  get isBrowserEnv() {
86
86
  return typeof window !== 'undefined';
87
87
  }
88
+ /**
89
+ * Returns true if app
90
+ * is running in production environment.
91
+ */
92
+ get isProductionEnv() {
93
+ return this._globalContext.environment === 'production';
94
+ }
95
+ /**
96
+ * Returns the current environment
97
+ * where the app is running.
98
+ * @example development
99
+ */
100
+ get environment() {
101
+ return this._globalContext.environment;
102
+ }
88
103
  /**
89
104
  * The value of 'site' property from the ZubyConfig.
90
105
  * @example https://example.com
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zuby",
3
- "version": "1.0.73",
3
+ "version": "1.0.75",
4
4
  "description": "Zuby.js is a framework for building modern apps using Preact or React.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -17,16 +17,16 @@
17
17
  "linkDirectory": true
18
18
  },
19
19
  "dependencies": {
20
- "@vercel/nft": "^0.26.3",
21
- "bundle-require": "^4.0.2",
20
+ "@vercel/nft": "^0.26.4",
21
+ "bundle-require": "^4.1.0",
22
22
  "chalk": "^5.3.0",
23
23
  "chokidar": "^3.6.0",
24
24
  "commander": "^12.0.0",
25
- "esbuild": "^0.20.0",
26
- "glob": "^10.3.10",
27
- "inquirer": "^9.2.14",
28
- "rollup": "^4.10.0",
29
- "vite": "^5.1.1"
25
+ "esbuild": "^0.20.2",
26
+ "glob": "^10.3.12",
27
+ "inquirer": "^9.2.20",
28
+ "rollup": "^4.17.2",
29
+ "vite": "^5.2.11"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/inquirer": "^9.0.7"
@@ -36,6 +36,7 @@ export async function generateCompileTimeContextCode(ssr) {
36
36
  generator: 'Zuby.js ${version}',
37
37
  version: '${version}',
38
38
  buildId: '${buildId}',
39
+ environment: '${process.env.NODE_ENV || 'development'}',
39
40
  props: ${JSON.stringify(props)},
40
41
  image: ${await generateImageCode()},
41
42
  serverProps: ${JSON.stringify(ssr ? serverProps : {})},
package/preload/index.js CHANGED
@@ -59,6 +59,10 @@ export function preloadPage(href, onHandle = () => { }) {
59
59
  preload(href);
60
60
  return;
61
61
  }
62
+ // Do nothing if app runs in development mode
63
+ if (context.environment === 'development') {
64
+ return;
65
+ }
62
66
  window.requestIdleCallback(async () => {
63
67
  const preloadManifest = await getPreloadManifest();
64
68
  // Preload assets such as scripts and styles
package/server/index.js CHANGED
@@ -1927,6 +1927,21 @@ var PageContext = class {
1927
1927
  get isBrowserEnv() {
1928
1928
  return typeof window !== "undefined";
1929
1929
  }
1930
+ /**
1931
+ * Returns true if app
1932
+ * is running in production environment.
1933
+ */
1934
+ get isProductionEnv() {
1935
+ return this._globalContext.environment === "production";
1936
+ }
1937
+ /**
1938
+ * Returns the current environment
1939
+ * where the app is running.
1940
+ * @example development
1941
+ */
1942
+ get environment() {
1943
+ return this._globalContext.environment;
1944
+ }
1930
1945
  /**
1931
1946
  * The value of 'site' property from the ZubyConfig.
1932
1947
  * @example https://example.com
package/server/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- /// <reference types="node" resolution-mode="require"/>
1
+ /// <reference types="node" />
2
2
  import { ZubyLogger } from '../logger/types.js';
3
3
  import { IncomingMessage, ServerResponse } from 'node:http';
4
4
  import ZubyRenderer from './zubyRenderer.js';
@@ -12,6 +12,6 @@ export default class ZubyDevRenderer extends ZubyRenderer {
12
12
  getJs(_templates: LazyTemplate[]): Promise<string[]>;
13
13
  getTemplateMods(template: LazyTemplate): Set<ModuleNode>;
14
14
  collectCss(mod: ModuleNode | undefined, cssUrls: Set<string>, visitedModules: Set<string>): void;
15
- errorHtmlResponse(_error: any): Response;
15
+ errorHtmlResponse(error: any): Response;
16
16
  errorJsonResponse(error: any): Response;
17
17
  }
@@ -66,7 +66,8 @@ export default class ZubyDevRenderer extends ZubyRenderer {
66
66
  this.collectCss(dep, cssUrls, visitedModules);
67
67
  });
68
68
  }
69
- errorHtmlResponse(_error) {
69
+ errorHtmlResponse(error) {
70
+ console.error(`[Zuby.js] Internal Server Error:`, error.stack || error.toString());
70
71
  return new Response(`<!DOCTYPE html>
71
72
  <html>
72
73
  <head>
@@ -1,6 +1,6 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
- /// <reference types="node" resolution-mode="require"/>
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
4
  import { Server as HttpsServer } from 'node:https';
5
5
  import { Server as HttpServer, ServerResponse } from 'node:http';
6
6
  import { ZubyHeaders, ZubyServerOptions, NodeResponse, NodeRequest, ZubyMiddleware, Encoding } from './types.js';
package/types.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- /// <reference types="node" resolution-mode="require"/>
1
+ /// <reference types="node" />
2
2
  import type { UserConfig as ViteUserConfig, InlineConfig as ViteInlineConfig, PluginOption as VitePluginOption, Plugin as VitePlugin } from 'vite';
3
3
  import { ZubyLogger } from './logger/types.js';
4
- import ReadableStream = NodeJS.ReadableStream;
5
4
  import { PathParamsType, Template, TemplateFile } from './templates/types.js';
6
5
  import ZubyDevServer from './server/zubyDevServer.js';
7
6
  import { GlobalContext } from './contexts/index.js';
7
+ import ReadableStream = NodeJS.ReadableStream;
8
+ import WritableStream = NodeJS.WritableStream;
8
9
  export interface ZubyConfig {
9
10
  /**
10
11
  * The JSX provider which will be used to render the pages.
@@ -335,8 +336,34 @@ export interface JsxProvider {
335
336
  errorTemplateFile: string;
336
337
  loaderTemplateFile: string;
337
338
  }
339
+ export interface PipeableStream {
340
+ abort: (reason?: unknown) => void;
341
+ pipe: <Writable extends WritableStream>(destination: Writable) => Writable;
342
+ }
343
+ /**
344
+ * Function that renders the passed JSX vnode to a string.
345
+ * NOTE: This follows the pattern of the `renderToString` from `react-dom/server`
346
+ * but unlike the original function, it should support waiting for Suspense and re-hydratation.
347
+ * See https://react.dev/reference/react-dom/server/renderToString
348
+ */
338
349
  export type RenderToString = (vnode: any) => Promise<string> | string;
350
+ /**
351
+ * Function that renders the passed JSX vnode to static Node.js stream.
352
+ * NOTE: This follows the pattern of the `renderToStaticNodeStream` from `react-dom/server` (deprecated from React 18.3.0).
353
+ * See https://react.dev/reference/react-dom/server/renderToStaticNodeStream
354
+ */
339
355
  export type RenderToStream = (vnode: any) => Promise<ReadableStream> | ReadableStream;
356
+ /**
357
+ * Function that renders the passed JSX vnode to a pipeable Node.js stream.
358
+ * NOTE: This follows the pattern of the `renderToPipeableStream` from `react-dom/server`.
359
+ * See https://react.dev/reference/react-dom/server/renderToPipeableStream
360
+ */
361
+ export type RenderToPipeableStream = (vnode: any) => Promise<PipeableStream> | PipeableStream;
362
+ export type JsxRenderer = {
363
+ renderToString?: RenderToString;
364
+ renderToStream?: RenderToStream;
365
+ renderToPipeableStream?: RenderToPipeableStream;
366
+ };
340
367
  /**
341
368
  * Export this property with boolean value from page module
342
369
  * to enable/disable the pre-rendering of the page.