@bleedingdev/modern-js-server-core 3.5.0-ultramodern.1 → 3.5.0-ultramodern.100
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/cjs/adapters/node/plugins/static.js +14 -60
- package/dist/cjs/adapters/node/plugins/staticModuleFederation.js +41 -37
- package/dist/cjs/adapters/node/plugins/staticPrecompressed.js +0 -3
- package/dist/cjs/adapters/node/plugins/staticServing.js +183 -0
- package/dist/cjs/plugins/render/render.js +5 -2
- package/dist/cjs/utils/storage.js +12 -8
- package/dist/esm/adapters/node/plugins/static.mjs +16 -62
- package/dist/esm/adapters/node/plugins/staticModuleFederation.mjs +37 -33
- package/dist/esm/adapters/node/plugins/staticPrecompressed.mjs +1 -1
- package/dist/esm/adapters/node/plugins/staticServing.mjs +129 -0
- package/dist/esm/plugins/render/render.mjs +5 -5
- package/dist/esm/utils/storage.mjs +12 -8
- package/dist/esm-node/adapters/node/plugins/static.mjs +16 -62
- package/dist/esm-node/adapters/node/plugins/staticModuleFederation.mjs +37 -33
- package/dist/esm-node/adapters/node/plugins/staticPrecompressed.mjs +1 -1
- package/dist/esm-node/adapters/node/plugins/staticServing.mjs +130 -0
- package/dist/esm-node/plugins/render/render.mjs +3 -3
- package/dist/esm-node/utils/storage.mjs +12 -8
- package/dist/types/adapters/node/plugins/staticModuleFederation.d.ts +3 -3
- package/dist/types/adapters/node/plugins/staticPrecompressed.d.ts +1 -2
- package/dist/types/adapters/node/plugins/staticServing.d.ts +25 -0
- package/dist/types/plugins/render/render.d.ts +4 -0
- package/dist/types/types/config/dev.d.ts +6 -0
- package/dist/types/utils/storage.d.ts +2 -1
- package/package.json +13 -15
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { fileReader } from "@modern-js/runtime-utils/fileReader";
|
|
3
|
+
import { fs } from "@modern-js/utils";
|
|
4
|
+
import { getMimeType } from "hono/utils/mime";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { applyModuleFederationAssetHeaders, getModuleFederationAssetList, getModuleFederationRequestPath, isBackendModuleFederationManifestRequest, isModuleFederationManifestRequest, patchModuleFederationManifestPublicPath, patchModuleFederationRemoteEntryPublicPath } from "./staticModuleFederation.mjs";
|
|
7
|
+
import { applyPreCompressedAssetHeaders, resolvePreCompressedAsset } from "./staticPrecompressed.mjs";
|
|
8
|
+
const getStaticMimeType = (filename)=>getMimeType(filename) ?? ('.cjs' === path.extname(filename).toLowerCase() ? "text/javascript; charset=UTF-8" : void 0);
|
|
9
|
+
const servePreCompressedPublicRouteAsset = async (c, pwd, route)=>{
|
|
10
|
+
const { entryPath } = route;
|
|
11
|
+
const originFilename = path.join(pwd, entryPath);
|
|
12
|
+
const preCompressedAsset = await resolvePreCompressedAsset(c, originFilename);
|
|
13
|
+
const filename = preCompressedAsset.selected?.filepath ?? originFilename;
|
|
14
|
+
const data = await fileReader.readFile(filename, 'buffer');
|
|
15
|
+
const mimeType = getStaticMimeType(originFilename);
|
|
16
|
+
if (null === data) return null;
|
|
17
|
+
const body = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
18
|
+
if (mimeType) c.header('Content-Type', mimeType);
|
|
19
|
+
Object.entries(route.responseHeaders || {}).forEach(([k, v])=>{
|
|
20
|
+
c.header(k, v);
|
|
21
|
+
});
|
|
22
|
+
applyPreCompressedAssetHeaders(c, preCompressedAsset);
|
|
23
|
+
c.header('Content-Length', String(data.byteLength));
|
|
24
|
+
return c.body(body, 200);
|
|
25
|
+
};
|
|
26
|
+
const isPathInside = (target, root)=>{
|
|
27
|
+
const relative = path.relative(path.resolve(root), path.resolve(target));
|
|
28
|
+
return '' === relative || !relative.startsWith(`..${path.sep}`) && '..' !== relative && !path.isAbsolute(relative);
|
|
29
|
+
};
|
|
30
|
+
const resolvePublicDirectoryAsset = async (pwd, pathname)=>{
|
|
31
|
+
let decodedPathname;
|
|
32
|
+
try {
|
|
33
|
+
decodedPathname = decodeURIComponent(pathname).replace(/\\/gu, '/');
|
|
34
|
+
} catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (decodedPathname.includes('\0') || decodedPathname.split('/').includes('..')) return null;
|
|
38
|
+
const publicDirectory = path.join(pwd, 'public');
|
|
39
|
+
const filepath = path.resolve(publicDirectory, decodedPathname.replace(/^\/+/u, ''));
|
|
40
|
+
if (!isPathInside(filepath, publicDirectory)) return null;
|
|
41
|
+
try {
|
|
42
|
+
const [realPublicDirectory, realFilepath, stat] = await Promise.all([
|
|
43
|
+
fs.realpath(publicDirectory),
|
|
44
|
+
fs.realpath(filepath),
|
|
45
|
+
fs.stat(filepath)
|
|
46
|
+
]);
|
|
47
|
+
if (!stat.isFile() || !isPathInside(realFilepath, realPublicDirectory)) return null;
|
|
48
|
+
return realFilepath;
|
|
49
|
+
} catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const servePublicDirectoryAsset = async (c, pwd)=>{
|
|
54
|
+
const method = c.req.raw.method.toUpperCase();
|
|
55
|
+
if ('GET' !== method && 'HEAD' !== method) return null;
|
|
56
|
+
const originFilename = await resolvePublicDirectoryAsset(pwd, c.req.path);
|
|
57
|
+
if (null === originFilename) return null;
|
|
58
|
+
const preCompressedAsset = await resolvePreCompressedAsset(c, originFilename);
|
|
59
|
+
const selectedFilename = preCompressedAsset.selected?.filepath ?? originFilename;
|
|
60
|
+
const publicDirectory = await fs.realpath(path.join(pwd, 'public'));
|
|
61
|
+
let realSelectedFilename;
|
|
62
|
+
try {
|
|
63
|
+
realSelectedFilename = await fs.realpath(selectedFilename);
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (!isPathInside(realSelectedFilename, publicDirectory)) return null;
|
|
68
|
+
const data = await fileReader.readFileFromSystem(realSelectedFilename, 'buffer');
|
|
69
|
+
if (null === data) return null;
|
|
70
|
+
const mimeType = getStaticMimeType(originFilename);
|
|
71
|
+
if (mimeType) c.header('Content-Type', mimeType);
|
|
72
|
+
applyPreCompressedAssetHeaders(c, preCompressedAsset);
|
|
73
|
+
c.header('Content-Length', String(data.byteLength));
|
|
74
|
+
if ('HEAD' === method) return c.body(null, 200);
|
|
75
|
+
const body = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
76
|
+
return c.body(body, 200);
|
|
77
|
+
};
|
|
78
|
+
const createModuleFederationStaticServing = ({ pwd, pathPrefix })=>{
|
|
79
|
+
let moduleFederationAssetsPromise = null;
|
|
80
|
+
const getModuleFederationAssets = async ()=>{
|
|
81
|
+
if (!moduleFederationAssetsPromise) moduleFederationAssetsPromise = getModuleFederationAssetList(pwd);
|
|
82
|
+
return moduleFederationAssetsPromise;
|
|
83
|
+
};
|
|
84
|
+
const resolveRequest = async (pathname)=>{
|
|
85
|
+
const requestPath = getModuleFederationRequestPath(pathname, pathPrefix);
|
|
86
|
+
if (requestPath.includes('..')) return null;
|
|
87
|
+
const moduleFederationAssetMeta = await getModuleFederationAssets();
|
|
88
|
+
return {
|
|
89
|
+
requestPath,
|
|
90
|
+
isModuleFederationAsset: moduleFederationAssetMeta.assets.has(requestPath),
|
|
91
|
+
isModuleFederationRemoteEntry: moduleFederationAssetMeta.remoteEntries.has(requestPath)
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
const serveFile = async (c, filepath, moduleFederationAsset = false, moduleFederationRemoteEntry = false, requestPath = '')=>{
|
|
95
|
+
if (moduleFederationAsset) applyModuleFederationAssetHeaders(c);
|
|
96
|
+
const mimeType = getStaticMimeType(filepath);
|
|
97
|
+
if (mimeType) c.header('Content-Type', mimeType);
|
|
98
|
+
const shouldPatchManifest = moduleFederationAsset && isModuleFederationManifestRequest(requestPath) && !isBackendModuleFederationManifestRequest(requestPath);
|
|
99
|
+
const shouldPatchRemoteEntry = moduleFederationRemoteEntry;
|
|
100
|
+
const canUsePreCompressed = !shouldPatchManifest && !shouldPatchRemoteEntry;
|
|
101
|
+
const preCompressedAsset = canUsePreCompressed ? await resolvePreCompressedAsset(c, filepath) : {
|
|
102
|
+
selected: null,
|
|
103
|
+
hasVariant: false
|
|
104
|
+
};
|
|
105
|
+
const targetFilepath = preCompressedAsset.selected?.filepath ?? filepath;
|
|
106
|
+
const chunk = await fileReader.readFileFromSystem(targetFilepath, 'buffer');
|
|
107
|
+
if (null === chunk) return null;
|
|
108
|
+
const responseChunk = shouldPatchManifest ? patchModuleFederationManifestPublicPath(c, chunk, pathPrefix) : shouldPatchRemoteEntry ? patchModuleFederationRemoteEntryPublicPath(c, chunk, pathPrefix) : chunk;
|
|
109
|
+
applyPreCompressedAssetHeaders(c, preCompressedAsset);
|
|
110
|
+
c.header('Content-Length', String(responseChunk.byteLength));
|
|
111
|
+
const body = new Uint8Array(responseChunk.buffer, responseChunk.byteOffset, responseChunk.byteLength);
|
|
112
|
+
return c.body(body, 200);
|
|
113
|
+
};
|
|
114
|
+
const serveByPath = async (c, filepath, request, moduleFederationAsset = false, moduleFederationRemoteEntry = false)=>{
|
|
115
|
+
if (!isPathInside(filepath, pwd)) return null;
|
|
116
|
+
if (!await fs.pathExists(filepath)) return null;
|
|
117
|
+
return serveFile(c, filepath, moduleFederationAsset, moduleFederationRemoteEntry, request.requestPath);
|
|
118
|
+
};
|
|
119
|
+
const serveStaticHit = (c, request)=>serveByPath(c, path.join(pwd, request.requestPath), request, request.isModuleFederationAsset, request.isModuleFederationRemoteEntry);
|
|
120
|
+
const serveModuleFederationAsset = (c, request)=>{
|
|
121
|
+
if (!request.isModuleFederationAsset) return null;
|
|
122
|
+
return serveByPath(c, path.join(pwd, request.requestPath), request, true, request.isModuleFederationRemoteEntry);
|
|
123
|
+
};
|
|
124
|
+
return {
|
|
125
|
+
resolveRequest,
|
|
126
|
+
serveStaticHit,
|
|
127
|
+
serveModuleFederationAsset
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
export { createModuleFederationStaticServing, servePreCompressedPublicRouteAsset, servePublicDirectoryAsset };
|
|
@@ -9,10 +9,10 @@ import { renderRscHandler } from "./renderRscHandler.mjs";
|
|
|
9
9
|
import { serverActionHandler } from "./serverActionHandler.mjs";
|
|
10
10
|
import { ssrRender } from "./ssrRender.mjs";
|
|
11
11
|
import { __webpack_require__ } from "../../rslib-runtime.mjs";
|
|
12
|
-
import * as
|
|
12
|
+
import * as __rspack_external__modern_js_runtime_utils_router_4aa9f9b0 from "@modern-js/runtime-utils/router";
|
|
13
13
|
__webpack_require__.add({
|
|
14
14
|
"@modern-js/runtime-utils/router" (module) {
|
|
15
|
-
module.exports =
|
|
15
|
+
module.exports = __rspack_external__modern_js_runtime_utils_router_4aa9f9b0;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
@@ -233,4 +233,4 @@ async function csrRender(request, options) {
|
|
|
233
233
|
});
|
|
234
234
|
return csrRscRender(request, options);
|
|
235
235
|
}
|
|
236
|
-
export { createRender };
|
|
236
|
+
export { createRender, matchRoute };
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import * as __rspack_external_async_hooks from "async_hooks";
|
|
3
|
+
const getGlobalStorage = (storageKey)=>{
|
|
4
|
+
const globalStore = globalThis;
|
|
5
|
+
const key = 'string' == typeof storageKey ? Symbol.for(storageKey) : storageKey;
|
|
6
|
+
const sharedStorage = globalStore[key];
|
|
7
|
+
const storage = sharedStorage ?? new __rspack_external_async_hooks.AsyncLocalStorage();
|
|
8
|
+
globalStore[key] = storage;
|
|
9
|
+
return storage;
|
|
10
|
+
};
|
|
3
11
|
const createStorage = (storageKey)=>{
|
|
4
12
|
let storage;
|
|
5
|
-
if (void 0 !== __rspack_external_async_hooks.AsyncLocalStorage)
|
|
6
|
-
const globalStore = globalThis;
|
|
7
|
-
const sharedStorage = globalStore[storageKey];
|
|
8
|
-
storage = sharedStorage ?? new __rspack_external_async_hooks.AsyncLocalStorage();
|
|
9
|
-
globalStore[storageKey] = storage;
|
|
10
|
-
} else storage = new __rspack_external_async_hooks.AsyncLocalStorage();
|
|
13
|
+
if (void 0 !== __rspack_external_async_hooks.AsyncLocalStorage) storage = storageKey ? getGlobalStorage(storageKey) : new __rspack_external_async_hooks.AsyncLocalStorage();
|
|
11
14
|
const run = (context, cb)=>{
|
|
12
15
|
if (!storage) throw new Error(`Unable to use async_hook, please confirm the node version >= 12.17
|
|
13
16
|
`);
|
|
@@ -25,12 +28,13 @@ const createStorage = (storageKey)=>{
|
|
|
25
28
|
if (!storage) throw new Error(`Unable to use async_hook, please confirm the node version >= 12.17
|
|
26
29
|
`);
|
|
27
30
|
const context = storage.getStore();
|
|
28
|
-
if (!context) throw new Error("Can't call
|
|
31
|
+
if (!context) throw new Error("Can't call useContext out of server scope");
|
|
29
32
|
return context;
|
|
30
33
|
};
|
|
31
34
|
return {
|
|
32
35
|
run,
|
|
33
|
-
useContext
|
|
36
|
+
useContext,
|
|
37
|
+
useHonoContext: useContext
|
|
34
38
|
};
|
|
35
39
|
};
|
|
36
40
|
export { createStorage };
|
|
@@ -2,11 +2,11 @@ import type { Middleware } from '../../../types';
|
|
|
2
2
|
export declare const MODULE_FEDERATION_MANIFEST_FILE = "mf-manifest.json";
|
|
3
3
|
export type ModuleFederationServeAssets = {
|
|
4
4
|
assets: Set<string>;
|
|
5
|
-
|
|
5
|
+
remoteEntries: Set<string>;
|
|
6
6
|
};
|
|
7
|
-
export declare const trimLeadingSlash: (value: string) => string;
|
|
8
7
|
export declare const getModuleFederationRequestPath: (pathname: string, pathPrefix: string) => string;
|
|
9
|
-
export declare const isModuleFederationManifestRequest: (requestPath: string) =>
|
|
8
|
+
export declare const isModuleFederationManifestRequest: (requestPath: string) => boolean;
|
|
9
|
+
export declare const isBackendModuleFederationManifestRequest: (requestPath: string) => requestPath is "backend-mf-manifest.json";
|
|
10
10
|
export declare const applyModuleFederationAssetHeaders: (c: Parameters<Middleware>[0]) => void;
|
|
11
11
|
export declare const patchModuleFederationManifestPublicPath: (c: Parameters<Middleware>[0], manifestBuffer: Buffer, pathPrefix: string) => Buffer<ArrayBufferLike>;
|
|
12
12
|
export declare const patchModuleFederationRemoteEntryPublicPath: (c: Parameters<Middleware>[0], remoteEntryBuffer: Buffer, pathPrefix: string) => Buffer<ArrayBufferLike>;
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { Middleware } from '../../../types';
|
|
2
2
|
type SupportedEncoding = 'br' | 'gzip';
|
|
3
|
-
|
|
3
|
+
type ResolvePreCompressedAssetResult = {
|
|
4
4
|
selected: {
|
|
5
5
|
filepath: string;
|
|
6
6
|
encoding: SupportedEncoding;
|
|
7
7
|
} | null;
|
|
8
8
|
hasVariant: boolean;
|
|
9
9
|
};
|
|
10
|
-
export declare const appendVaryHeader: (c: Parameters<Middleware>[0], value: string) => void;
|
|
11
10
|
export declare const resolvePreCompressedAsset: (c: Parameters<Middleware>[0], filepath: string) => Promise<ResolvePreCompressedAssetResult>;
|
|
12
11
|
export declare const applyPreCompressedAssetHeaders: (c: Parameters<Middleware>[0], preCompressedAsset: ResolvePreCompressedAssetResult) => void;
|
|
13
12
|
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ServerRoute } from '@modern-js/types';
|
|
2
|
+
import type { Middleware } from '../../../types';
|
|
3
|
+
type MiddlewareContext = Parameters<Middleware>[0];
|
|
4
|
+
type StaticServingRequest = {
|
|
5
|
+
requestPath: string;
|
|
6
|
+
isModuleFederationAsset: boolean;
|
|
7
|
+
isModuleFederationRemoteEntry: boolean;
|
|
8
|
+
};
|
|
9
|
+
type StaticServingOptions = {
|
|
10
|
+
pwd: string;
|
|
11
|
+
pathPrefix: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const servePreCompressedPublicRouteAsset: (c: MiddlewareContext, pwd: string, route: ServerRoute) => Promise<(Response & import("hono").TypedResponse<Uint8Array<ArrayBuffer>, 200, "body">) | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Serves post-build convention assets generated under dist/public at their
|
|
16
|
+
* root URL. This is intentionally independent of config/public and route.json:
|
|
17
|
+
* the generator runs after the route manifest is built.
|
|
18
|
+
*/
|
|
19
|
+
export declare const servePublicDirectoryAsset: (c: MiddlewareContext, pwd: string) => Promise<(Response & import("hono").TypedResponse<null, 200, "body">) | (Response & import("hono").TypedResponse<Uint8Array<ArrayBuffer>, 200, "body">) | null>;
|
|
20
|
+
export declare const createModuleFederationStaticServing: ({ pwd, pathPrefix, }: StaticServingOptions) => {
|
|
21
|
+
resolveRequest: (pathname: string) => Promise<StaticServingRequest | null>;
|
|
22
|
+
serveStaticHit: (c: MiddlewareContext, request: StaticServingRequest) => Promise<(Response & import("hono").TypedResponse<Uint8Array<ArrayBuffer>, 200, "body">) | null>;
|
|
23
|
+
serveModuleFederationAsset: (c: MiddlewareContext, request: StaticServingRequest) => Promise<(Response & import("hono").TypedResponse<Uint8Array<ArrayBuffer>, 200, "body">) | null> | null;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ServerRoute } from '@modern-js/types';
|
|
2
|
+
import type { Router } from 'hono/router';
|
|
2
3
|
import type { CacheConfig, OnFallback, Render, UserConfig } from '../../types';
|
|
4
|
+
import type { Params } from '../../types/requestHandler';
|
|
3
5
|
interface CreateRenderOptions {
|
|
4
6
|
pwd: string;
|
|
5
7
|
routes: ServerRoute[];
|
|
@@ -12,5 +14,7 @@ interface CreateRenderOptions {
|
|
|
12
14
|
forceCSRMap?: Map<string, boolean>;
|
|
13
15
|
nonce?: string;
|
|
14
16
|
}
|
|
17
|
+
type MatchedRoute = [ServerRoute | undefined, Params];
|
|
18
|
+
export declare function matchRoute(router: Router<ServerRoute>, pathname: string, entryName?: string): MatchedRoute;
|
|
15
19
|
export declare function createRender({ routes, pwd, metaName, staticGenerate, cacheConfig, forceCSR, forceCSRMap, config, onFallback, }: CreateRenderOptions): Promise<Render>;
|
|
16
20
|
export {};
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
export interface DevUserConfig {
|
|
2
2
|
assetPrefix?: string;
|
|
3
|
+
/**
|
|
4
|
+
* Customize the directory containing the Mock API entry file.
|
|
5
|
+
* Relative paths are resolved from the application directory.
|
|
6
|
+
* @default './config/mock'
|
|
7
|
+
*/
|
|
8
|
+
mockDir?: string;
|
|
3
9
|
}
|
|
4
10
|
export type DevNormalizedConfig = DevUserConfig;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
declare const createStorage: <T>(storageKey?: symbol) => {
|
|
1
|
+
declare const createStorage: <T>(storageKey?: string | symbol) => {
|
|
2
2
|
run: <O>(context: T, cb: () => O | Promise<O>) => Promise<O>;
|
|
3
3
|
useContext: () => T;
|
|
4
|
+
useHonoContext: () => T;
|
|
4
5
|
};
|
|
5
6
|
export { createStorage };
|
package/package.json
CHANGED
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.5.0-ultramodern.
|
|
20
|
+
"version": "3.5.0-ultramodern.100",
|
|
21
21
|
"types": "./dist/types/index.d.ts",
|
|
22
22
|
"main": "./dist/cjs/index.js",
|
|
23
23
|
"exports": {
|
|
24
24
|
".": {
|
|
25
25
|
"types": "./dist/types/index.d.ts",
|
|
26
|
-
"modern:source": "./src/index.ts",
|
|
27
26
|
"node": {
|
|
28
27
|
"import": "./dist/esm-node/index.mjs",
|
|
29
28
|
"require": "./dist/cjs/index.js"
|
|
@@ -32,7 +31,6 @@
|
|
|
32
31
|
},
|
|
33
32
|
"./node": {
|
|
34
33
|
"types": "./dist/types/adapters/node/index.d.ts",
|
|
35
|
-
"modern:source": "./src/adapters/node/index.ts",
|
|
36
34
|
"node": {
|
|
37
35
|
"import": "./dist/esm-node/adapters/node/index.mjs",
|
|
38
36
|
"require": "./dist/cjs/adapters/node/index.js"
|
|
@@ -68,31 +66,31 @@
|
|
|
68
66
|
"node": ">=20"
|
|
69
67
|
},
|
|
70
68
|
"dependencies": {
|
|
69
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.100",
|
|
70
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.100",
|
|
71
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.100",
|
|
71
72
|
"@swc/helpers": "^0.5.23",
|
|
72
73
|
"@web-std/fetch": "^4.2.1",
|
|
73
74
|
"@web-std/file": "^3.0.3",
|
|
74
75
|
"@web-std/stream": "^1.0.3",
|
|
75
76
|
"cloneable-readable": "^3.0.0",
|
|
76
77
|
"flatted": "^3.4.2",
|
|
77
|
-
"hono": "^4.12.
|
|
78
|
-
"ts-deepmerge": "8.0.0"
|
|
79
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.1",
|
|
80
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.1",
|
|
81
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.1"
|
|
78
|
+
"hono": "^4.12.28",
|
|
79
|
+
"ts-deepmerge": "8.0.0"
|
|
82
80
|
},
|
|
83
81
|
"devDependencies": {
|
|
84
|
-
"@
|
|
82
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.100",
|
|
83
|
+
"@rslib/core": "0.23.2",
|
|
84
|
+
"@scripts/rstest-config": "2.66.0",
|
|
85
85
|
"@types/cloneable-readable": "^2.0.3",
|
|
86
86
|
"@types/merge-deep": "^3.0.3",
|
|
87
|
-
"@types/node": "^26.
|
|
88
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
89
|
-
"http-proxy-middleware": "^4.
|
|
90
|
-
"
|
|
91
|
-
"@scripts/rstest-config": "2.66.0"
|
|
87
|
+
"@types/node": "^26.1.1",
|
|
88
|
+
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
89
|
+
"http-proxy-middleware": "^4.2.0",
|
|
90
|
+
"typescript": "^7.0.2"
|
|
92
91
|
},
|
|
93
92
|
"sideEffects": false,
|
|
94
93
|
"publishConfig": {
|
|
95
|
-
"registry": "https://registry.npmjs.org/",
|
|
96
94
|
"access": "public"
|
|
97
95
|
},
|
|
98
96
|
"scripts": {
|