@bleedingdev/modern-js-runtime 3.2.0-ultramodern.82 → 3.2.0-ultramodern.84
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/cli/ssr/index.js +3 -14
- package/dist/cjs/core/react/wrapper.js +9 -3
- package/dist/cjs/core/server/helmet.js +6 -0
- package/dist/cjs/core/server/stream/beforeTemplate.js +1 -12
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +1 -12
- package/dist/cjs/core/server/stream/createReadableStream.js +3 -0
- package/dist/cjs/core/server/string/index.js +8 -10
- package/dist/cjs/exports/head.js +196 -5
- package/dist/cjs/router/runtime/tanstack/routeTree.js +10 -3
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +9 -8
- package/dist/esm/cli/ssr/index.mjs +3 -14
- package/dist/esm/core/react/wrapper.mjs +9 -3
- package/dist/esm/core/server/helmet.mjs +4 -1
- package/dist/esm/core/server/stream/beforeTemplate.mjs +2 -3
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +2 -3
- package/dist/esm/core/server/stream/createReadableStream.mjs +3 -0
- package/dist/esm/core/server/string/index.mjs +9 -10
- package/dist/esm/exports/head.mjs +189 -4
- package/dist/esm/router/runtime/tanstack/routeTree.mjs +10 -3
- package/dist/esm/ssr/serverRender/renderToString/entry.mjs +9 -6
- package/dist/esm-node/cli/ssr/index.mjs +3 -14
- package/dist/esm-node/core/react/wrapper.mjs +9 -3
- package/dist/esm-node/core/server/helmet.mjs +4 -1
- package/dist/esm-node/core/server/stream/beforeTemplate.mjs +2 -3
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +2 -3
- package/dist/esm-node/core/server/stream/createReadableStream.mjs +3 -0
- package/dist/esm-node/core/server/string/index.mjs +9 -10
- package/dist/esm-node/exports/head.mjs +189 -4
- package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +10 -3
- package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +9 -6
- package/dist/types/core/context/runtime.d.ts +4 -0
- package/dist/types/core/server/helmet.d.ts +5 -3
- package/dist/types/exports/head.d.ts +10 -3
- package/package.json +10 -11
|
@@ -1,6 +1,191 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
"use client";
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import react from "react";
|
|
4
|
+
import { Helmet, HelmetData, HelmetProvider } from "react-helmet-async";
|
|
5
|
+
import { InternalRuntimeContext } from "../core/context/index.mjs";
|
|
6
|
+
const ATTRIBUTE_NAME_MAP = {
|
|
7
|
+
charSet: 'charset',
|
|
8
|
+
className: 'class',
|
|
9
|
+
contentEditable: 'contenteditable',
|
|
10
|
+
httpEquiv: 'http-equiv',
|
|
11
|
+
itemProp: 'itemprop',
|
|
12
|
+
tabIndex: 'tabindex'
|
|
13
|
+
};
|
|
14
|
+
const escapeHtml = (value)=>String(value).replaceAll('&', '&').replaceAll('"', '"').replaceAll('<', '<').replaceAll('>', '>');
|
|
15
|
+
const toHtmlAttributeName = (name)=>ATTRIBUTE_NAME_MAP[name] ?? name;
|
|
16
|
+
const attributesToString = (attributes, includeHelmetAttribute = false)=>{
|
|
17
|
+
const pairs = [];
|
|
18
|
+
if (includeHelmetAttribute) pairs.push('data-rh="true"');
|
|
19
|
+
for (const [name, value] of Object.entries(attributes ?? {})){
|
|
20
|
+
if (false === value || null == value) continue;
|
|
21
|
+
const htmlName = toHtmlAttributeName(name);
|
|
22
|
+
if (true === value) pairs.push(htmlName);
|
|
23
|
+
else pairs.push(`${htmlName}="${escapeHtml(value)}"`);
|
|
24
|
+
}
|
|
25
|
+
return pairs.join(' ');
|
|
26
|
+
};
|
|
27
|
+
const createDatum = (tagName, tags)=>({
|
|
28
|
+
toComponent: ()=>[],
|
|
29
|
+
toString: ()=>tags.map((tag)=>{
|
|
30
|
+
const attrs = attributesToString(tag, true);
|
|
31
|
+
if ("script" === tagName && 'string' == typeof tag.innerHTML) return `<script ${attrs}>${tag.innerHTML}</script>`;
|
|
32
|
+
if ('style' === tagName && 'string' == typeof tag.cssText) return `<style ${attrs}>${tag.cssText}</style>`;
|
|
33
|
+
if ("noscript" === tagName && 'string' == typeof tag.innerHTML) return `<noscript ${attrs}>${tag.innerHTML}</noscript>`;
|
|
34
|
+
return `<${tagName} ${attrs}>`;
|
|
35
|
+
}).join('')
|
|
36
|
+
});
|
|
37
|
+
const createAttributeDatum = (attributes)=>({
|
|
38
|
+
toComponent: ()=>attributes,
|
|
39
|
+
toString: ()=>attributesToString(attributes)
|
|
40
|
+
});
|
|
41
|
+
const createTitleDatum = (title, attributes)=>({
|
|
42
|
+
toComponent: ()=>[],
|
|
43
|
+
toString: ()=>{
|
|
44
|
+
if (!title) return '';
|
|
45
|
+
const attrs = attributesToString(attributes, true);
|
|
46
|
+
return `<title ${attrs}>${escapeHtml(title)}</title>`;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const createEmptyHelmetState = ()=>({
|
|
50
|
+
base: createDatum('base', []),
|
|
51
|
+
bodyAttributes: createAttributeDatum({}),
|
|
52
|
+
htmlAttributes: createAttributeDatum({}),
|
|
53
|
+
link: createDatum('link', []),
|
|
54
|
+
meta: createDatum('meta', []),
|
|
55
|
+
noscript: createDatum("noscript", []),
|
|
56
|
+
priority: createDatum('meta', []),
|
|
57
|
+
script: createDatum("script", []),
|
|
58
|
+
style: createDatum('style', []),
|
|
59
|
+
title: createTitleDatum(void 0, {})
|
|
60
|
+
});
|
|
61
|
+
const mergeAttributes = (current, next)=>({
|
|
62
|
+
...current,
|
|
63
|
+
...next ?? {}
|
|
64
|
+
});
|
|
65
|
+
const collectChildren = (children, draft)=>{
|
|
66
|
+
react.Children.forEach(children, (child)=>{
|
|
67
|
+
if (!react.isValidElement(child)) return;
|
|
68
|
+
if (child.type === react.Fragment) return void collectChildren(child.props.children, draft);
|
|
69
|
+
if ('string' != typeof child.type) return;
|
|
70
|
+
const { children: nestedChildren, ...props } = child.props;
|
|
71
|
+
if ('title' === child.type) {
|
|
72
|
+
draft.title = react.Children.toArray(nestedChildren).join('');
|
|
73
|
+
draft.titleAttributes = mergeAttributes(draft.titleAttributes, props);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if ('html' === child.type || 'body' === child.type) return;
|
|
77
|
+
if ('base' === child.type || 'link' === child.type || 'meta' === child.type || "noscript" === child.type || "script" === child.type || 'style' === child.type) {
|
|
78
|
+
const tag = {
|
|
79
|
+
...props
|
|
80
|
+
};
|
|
81
|
+
if (("script" === child.type || 'style' === child.type || "noscript" === child.type) && 'string' == typeof nestedChildren) tag['style' === child.type ? 'cssText' : 'innerHTML'] = nestedChildren;
|
|
82
|
+
draft[child.type].push(tag);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
const collectHelmetProps = (current, props)=>{
|
|
87
|
+
const baseState = current ?? createEmptyHelmetState();
|
|
88
|
+
const draft = {
|
|
89
|
+
base: [
|
|
90
|
+
...props.base ? [
|
|
91
|
+
props.base
|
|
92
|
+
] : []
|
|
93
|
+
],
|
|
94
|
+
bodyAttributes: props.bodyAttributes,
|
|
95
|
+
htmlAttributes: props.htmlAttributes,
|
|
96
|
+
link: [
|
|
97
|
+
...props.link ?? []
|
|
98
|
+
],
|
|
99
|
+
meta: [
|
|
100
|
+
...props.meta ?? []
|
|
101
|
+
],
|
|
102
|
+
noscript: [
|
|
103
|
+
...props.noscript ?? []
|
|
104
|
+
],
|
|
105
|
+
script: [
|
|
106
|
+
...props.script ?? []
|
|
107
|
+
],
|
|
108
|
+
style: [
|
|
109
|
+
...props.style ?? []
|
|
110
|
+
],
|
|
111
|
+
title: 'string' == typeof props.title ? props.title : Array.isArray(props.title) ? props.title.join('') : void 0,
|
|
112
|
+
titleAttributes: props.titleAttributes ?? {}
|
|
113
|
+
};
|
|
114
|
+
collectChildren(props.children, draft);
|
|
115
|
+
const title = draft.title && props.titleTemplate ? props.titleTemplate.replaceAll('%s', draft.title) : draft.title ?? props.defaultTitle;
|
|
116
|
+
return {
|
|
117
|
+
base: createDatum('base', [
|
|
118
|
+
...baseState.__baseTags ?? [],
|
|
119
|
+
...draft.base
|
|
120
|
+
]),
|
|
121
|
+
bodyAttributes: createAttributeDatum(mergeAttributes(baseState.__bodyAttributes ?? {}, draft.bodyAttributes)),
|
|
122
|
+
htmlAttributes: createAttributeDatum(mergeAttributes(baseState.__htmlAttributes ?? {}, draft.htmlAttributes)),
|
|
123
|
+
link: createDatum('link', [
|
|
124
|
+
...baseState.__linkTags ?? [],
|
|
125
|
+
...draft.link
|
|
126
|
+
]),
|
|
127
|
+
meta: createDatum('meta', [
|
|
128
|
+
...baseState.__metaTags ?? [],
|
|
129
|
+
...draft.meta
|
|
130
|
+
]),
|
|
131
|
+
noscript: createDatum("noscript", [
|
|
132
|
+
...baseState.__noscriptTags ?? [],
|
|
133
|
+
...draft.noscript
|
|
134
|
+
]),
|
|
135
|
+
priority: createDatum('meta', []),
|
|
136
|
+
script: createDatum("script", [
|
|
137
|
+
...baseState.__scriptTags ?? [],
|
|
138
|
+
...draft.script
|
|
139
|
+
]),
|
|
140
|
+
style: createDatum('style', [
|
|
141
|
+
...baseState.__styleTags ?? [],
|
|
142
|
+
...draft.style
|
|
143
|
+
]),
|
|
144
|
+
title: createTitleDatum(title ?? baseState.__title, mergeAttributes(baseState.__titleAttributes ?? {}, draft.titleAttributes)),
|
|
145
|
+
__baseTags: [
|
|
146
|
+
...baseState.__baseTags ?? [],
|
|
147
|
+
...draft.base
|
|
148
|
+
],
|
|
149
|
+
__bodyAttributes: mergeAttributes(baseState.__bodyAttributes ?? {}, draft.bodyAttributes),
|
|
150
|
+
__htmlAttributes: mergeAttributes(baseState.__htmlAttributes ?? {}, draft.htmlAttributes),
|
|
151
|
+
__linkTags: [
|
|
152
|
+
...baseState.__linkTags ?? [],
|
|
153
|
+
...draft.link
|
|
154
|
+
],
|
|
155
|
+
__metaTags: [
|
|
156
|
+
...baseState.__metaTags ?? [],
|
|
157
|
+
...draft.meta
|
|
158
|
+
],
|
|
159
|
+
__noscriptTags: [
|
|
160
|
+
...baseState.__noscriptTags ?? [],
|
|
161
|
+
...draft.noscript
|
|
162
|
+
],
|
|
163
|
+
__scriptTags: [
|
|
164
|
+
...baseState.__scriptTags ?? [],
|
|
165
|
+
...draft.script
|
|
166
|
+
],
|
|
167
|
+
__styleTags: [
|
|
168
|
+
...baseState.__styleTags ?? [],
|
|
169
|
+
...draft.style
|
|
170
|
+
],
|
|
171
|
+
__title: title ?? baseState.__title,
|
|
172
|
+
__titleAttributes: mergeAttributes(baseState.__titleAttributes ?? {}, draft.titleAttributes)
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
const head_Helmet = (props)=>{
|
|
176
|
+
const runtimeContext = react.useContext(InternalRuntimeContext);
|
|
177
|
+
if (runtimeContext && !runtimeContext.isBrowser) {
|
|
178
|
+
runtimeContext._helmetContext ??= {};
|
|
179
|
+
runtimeContext._helmetContext.helmet = collectHelmetProps(runtimeContext._helmetContext.helmet ?? void 0, props);
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return react.createElement(Helmet, props);
|
|
183
|
+
};
|
|
184
|
+
const head = {
|
|
185
|
+
Helmet: head_Helmet,
|
|
186
|
+
HelmetData: HelmetData,
|
|
187
|
+
HelmetProvider: HelmetProvider
|
|
188
|
+
};
|
|
189
|
+
const exports_head = head;
|
|
190
|
+
export default exports_head;
|
|
191
|
+
export { HelmetData, HelmetProvider, head_Helmet as Helmet };
|
|
@@ -45,12 +45,19 @@ function isModernDeferredData(value) {
|
|
|
45
45
|
function normalizeModernLoaderResult(result) {
|
|
46
46
|
return isModernDeferredData(result) ? result.data : result;
|
|
47
47
|
}
|
|
48
|
-
function pickRouteModuleComponent(routeModule) {
|
|
48
|
+
function pickRouteModuleComponent(routeModule, seen = new Set()) {
|
|
49
49
|
if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
|
|
50
50
|
if (!routeModule || 'object' != typeof routeModule) return;
|
|
51
|
+
if (seen.has(routeModule)) return;
|
|
52
|
+
seen.add(routeModule);
|
|
51
53
|
const module = routeModule;
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
+
for (const candidate of [
|
|
55
|
+
module.default,
|
|
56
|
+
module.Component
|
|
57
|
+
]){
|
|
58
|
+
const component = pickRouteModuleComponent(candidate, seen);
|
|
59
|
+
if (component) return component;
|
|
60
|
+
}
|
|
54
61
|
}
|
|
55
62
|
function createServerLazyImportComponent(lazyImport, fallbackComponent) {
|
|
56
63
|
if ("u" > typeof document) return fallbackComponent;
|
|
@@ -2,10 +2,10 @@ import "node:module";
|
|
|
2
2
|
import { sanitizeSSRPayload, serializeJson } from "@modern-js/runtime-utils/node";
|
|
3
3
|
import { time } from "@modern-js/runtime-utils/time";
|
|
4
4
|
import react from "react";
|
|
5
|
-
import
|
|
5
|
+
import { HelmetProvider } from "react-helmet-async";
|
|
6
|
+
import { getHelmetData, helmetReplace } from "../../../core/server/helmet.mjs";
|
|
6
7
|
import { serializeErrors } from "../../../router/runtime/utils.mjs";
|
|
7
8
|
import prefetch from "../../prefetch";
|
|
8
|
-
import helmet from "../helmet";
|
|
9
9
|
import { SSRErrors, SSRTimings } from "../tracker";
|
|
10
10
|
import { RenderLevel } from "../types.mjs";
|
|
11
11
|
import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID, attributesToString } from "../utils";
|
|
@@ -61,8 +61,8 @@ class Entry {
|
|
|
61
61
|
createReplaceSSRDataScript(ssrDataScripts),
|
|
62
62
|
...this.htmlModifiers
|
|
63
63
|
]);
|
|
64
|
-
const helmetData =
|
|
65
|
-
return helmetData ?
|
|
64
|
+
const helmetData = getHelmetData(context);
|
|
65
|
+
return helmetData ? helmetReplace(html, helmetData) : html;
|
|
66
66
|
}
|
|
67
67
|
async prefetch(context) {
|
|
68
68
|
let prefetchData;
|
|
@@ -83,11 +83,14 @@ class Entry {
|
|
|
83
83
|
const end = time();
|
|
84
84
|
const { ssrContext } = context;
|
|
85
85
|
try {
|
|
86
|
-
const
|
|
86
|
+
const helmetContext = context._helmetContext ??= {};
|
|
87
|
+
const App = react.createElement(HelmetProvider, {
|
|
88
|
+
context: helmetContext
|
|
89
|
+
}, react.createElement(this.App, {
|
|
87
90
|
context: Object.assign(context, {
|
|
88
91
|
ssr: true
|
|
89
92
|
})
|
|
90
|
-
});
|
|
93
|
+
}));
|
|
91
94
|
html = await createRender(App).addCollector(createStyledCollector(this.result)).addCollector(createLoadableCollector({
|
|
92
95
|
stats: ssrContext.loadableStats,
|
|
93
96
|
result: this.result,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RouteObject, StaticHandlerContext } from '@modern-js/runtime-utils/router';
|
|
2
|
+
import type { HelmetServerState } from 'react-helmet-async';
|
|
2
3
|
import type { InternalRouterRuntimeState, InternalRouterServerSnapshot, RouteManifest, RouterFramework } from '../../router/runtime/types';
|
|
3
4
|
import type { RequestContext, SSRServerContext } from '../types';
|
|
4
5
|
export interface TRuntimeContext {
|
|
@@ -28,6 +29,9 @@ export interface TInternalRuntimeContext extends TRuntimeContext {
|
|
|
28
29
|
ssrContext?: SSRServerContext;
|
|
29
30
|
_internalContext?: any;
|
|
30
31
|
_internalRouterBaseName?: any;
|
|
32
|
+
_helmetContext?: {
|
|
33
|
+
helmet?: HelmetServerState | null;
|
|
34
|
+
};
|
|
31
35
|
}
|
|
32
36
|
export declare const InternalRuntimeContext: import("react").Context<TInternalRuntimeContext>;
|
|
33
37
|
export declare const RuntimeContext: import("react").Context<TRuntimeContext>;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
1
|
+
import type { HelmetServerState } from 'react-helmet-async';
|
|
2
|
+
import type { TInternalRuntimeContext } from '../context';
|
|
3
|
+
export declare function getHelmetData(runtimeContext: TInternalRuntimeContext): HelmetServerState | undefined;
|
|
4
|
+
export declare function createReplaceHelemt(helmetData?: HelmetServerState): (template: string) => string;
|
|
5
|
+
export declare function helmetReplace(content: string, helmetData: HelmetServerState): string;
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Helmet as AsyncHelmet, HelmetData, type HelmetDatum, type HelmetHTMLBodyDatum, type HelmetHTMLElementDatum, type HelmetProps, HelmetProvider, type HelmetServerState, type HelmetTags } from 'react-helmet-async';
|
|
3
|
+
export declare const Helmet: (props: React.PropsWithChildren<HelmetProps>) => React.CElement<React.PropsWithChildren<HelmetProps>, AsyncHelmet> | null;
|
|
4
|
+
declare const head: {
|
|
5
|
+
Helmet: (props: React.PropsWithChildren<HelmetProps>) => React.CElement<React.PropsWithChildren<HelmetProps>, AsyncHelmet> | null;
|
|
6
|
+
HelmetData: typeof HelmetData;
|
|
7
|
+
HelmetProvider: typeof HelmetProvider;
|
|
8
|
+
};
|
|
2
9
|
export default head;
|
|
3
|
-
export type {
|
|
4
|
-
export {
|
|
10
|
+
export type { HelmetDatum, HelmetHTMLBodyDatum, HelmetHTMLElementDatum, HelmetProps, HelmetServerState as HelmetData, HelmetTags, };
|
|
11
|
+
export { HelmetData, HelmetProvider };
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.2.0-ultramodern.
|
|
20
|
+
"version": "3.2.0-ultramodern.84",
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
23
23
|
},
|
|
@@ -220,26 +220,25 @@
|
|
|
220
220
|
"@loadable/component": "5.16.7",
|
|
221
221
|
"@loadable/server": "5.16.7",
|
|
222
222
|
"@swc/core": "1.15.40",
|
|
223
|
-
"@swc/helpers": "^0.5.
|
|
223
|
+
"@swc/helpers": "^0.5.23",
|
|
224
224
|
"@swc/plugin-loadable-components": "^11.10.0",
|
|
225
225
|
"@tanstack/react-router": "1.170.8",
|
|
226
226
|
"@tanstack/router-core": "1.171.6",
|
|
227
227
|
"@types/loadable__component": "^5.13.10",
|
|
228
|
-
"@types/react-helmet": "^6.1.11",
|
|
229
228
|
"cookie": "1.1.1",
|
|
230
229
|
"entities": "^8.0.0",
|
|
231
230
|
"es-module-lexer": "^2.1.0",
|
|
232
231
|
"esbuild": "^0.28.0",
|
|
233
232
|
"invariant": "^2.2.4",
|
|
234
233
|
"isbot": "5.1.40",
|
|
235
|
-
"react-helmet": "
|
|
234
|
+
"react-helmet-async": "3.0.0",
|
|
236
235
|
"react-is": "^19.2.6",
|
|
237
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.2.0-ultramodern.
|
|
238
|
-
"@modern-js/
|
|
239
|
-
"@modern-js/
|
|
240
|
-
"@modern-js/
|
|
241
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.2.0-ultramodern.
|
|
242
|
-
"@modern-js/
|
|
236
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.2.0-ultramodern.84",
|
|
237
|
+
"@modern-js/render": "npm:@bleedingdev/modern-js-render@3.2.0-ultramodern.84",
|
|
238
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.2.0-ultramodern.84",
|
|
239
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.2.0-ultramodern.84",
|
|
240
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.2.0-ultramodern.84",
|
|
241
|
+
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.2.0-ultramodern.84"
|
|
243
242
|
},
|
|
244
243
|
"peerDependencies": {
|
|
245
244
|
"react": "^19.2.6",
|
|
@@ -258,7 +257,7 @@
|
|
|
258
257
|
"@typescript/native-preview": "7.0.0-dev.20260527.2",
|
|
259
258
|
"react": "^19.2.6",
|
|
260
259
|
"react-dom": "^19.2.6",
|
|
261
|
-
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.2.0-ultramodern.
|
|
260
|
+
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.2.0-ultramodern.84",
|
|
262
261
|
"@scripts/rstest-config": "2.66.0"
|
|
263
262
|
},
|
|
264
263
|
"sideEffects": false,
|