@bleedingdev/modern-js-renderer-solid 0.0.0-stage → 3.9.3-ultramodern.1
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/esm/actions.js +283 -0
- package/dist/esm/application-router.js +25 -0
- package/dist/esm/client.js +49 -0
- package/dist/esm/entry-application.js +60 -0
- package/dist/esm/entry-client.js +23 -0
- package/dist/esm/federation-context.js +25 -0
- package/dist/esm/federation-ssr.js +84 -0
- package/dist/esm/federation.js +83 -0
- package/dist/esm/i18n/I18nProvider.js +33 -0
- package/dist/esm/i18n/LocalizedLink.js +74 -0
- package/dist/esm/i18n/context.js +3 -0
- package/dist/esm/i18n/index.js +8 -0
- package/dist/esm/i18n/languageSync.js +50 -0
- package/dist/esm/i18n/types.js +0 -0
- package/dist/esm/i18n/useI18n.js +74 -0
- package/dist/esm/index.js +58 -0
- package/dist/esm/manifest.js +150 -0
- package/dist/esm/route-completion.js +150 -0
- package/dist/esm/route-data-error.js +108 -0
- package/dist/esm/router-binding/Asset.js +201 -0
- package/dist/esm/router-binding/CatchBoundary.js +94 -0
- package/dist/esm/router-binding/ClientOnly.js +26 -0
- package/dist/esm/router-binding/HeadContent.js +8 -0
- package/dist/esm/router-binding/LICENSE +21 -0
- package/dist/esm/router-binding/Match.js +319 -0
- package/dist/esm/router-binding/Matches.js +117 -0
- package/dist/esm/router-binding/PROVENANCE.json +94 -0
- package/dist/esm/router-binding/RouterProvider.js +51 -0
- package/dist/esm/router-binding/SafeFragment.js +5 -0
- package/dist/esm/router-binding/ScriptOnce.js +15 -0
- package/dist/esm/router-binding/Scripts.js +30 -0
- package/dist/esm/router-binding/ScrollRestoration.js +16 -0
- package/dist/esm/router-binding/Transitioner.js +103 -0
- package/dist/esm/router-binding/awaited.js +48 -0
- package/dist/esm/router-binding/fileRoute.js +83 -0
- package/dist/esm/router-binding/flightData.js +23 -0
- package/dist/esm/router-binding/headContentUtils.js +162 -0
- package/dist/esm/router-binding/history.js +0 -0
- package/dist/esm/router-binding/index.js +35 -0
- package/dist/esm/router-binding/lazyRouteComponent.js +30 -0
- package/dist/esm/router-binding/link.js +389 -0
- package/dist/esm/router-binding/matchContext.js +7 -0
- package/dist/esm/router-binding/nonRouteComponentContext.js +13 -0
- package/dist/esm/router-binding/not-found.js +35 -0
- package/dist/esm/router-binding/publicMatchData.js +447 -0
- package/dist/esm/router-binding/registryTransfer.js +210 -0
- package/dist/esm/router-binding/renderRouteNotFound.js +23 -0
- package/dist/esm/router-binding/route.js +143 -0
- package/dist/esm/router-binding/router.js +13 -0
- package/dist/esm/router-binding/routerContext.js +3 -0
- package/dist/esm/router-binding/routerStores.js +50 -0
- package/dist/esm/router-binding/scroll-restoration.js +13 -0
- package/dist/esm/router-binding/typePrimitives.js +0 -0
- package/dist/esm/router-binding/useBlocker.js +152 -0
- package/dist/esm/router-binding/useCanGoBack.js +7 -0
- package/dist/esm/router-binding/useLoaderData.js +9 -0
- package/dist/esm/router-binding/useLoaderDeps.js +8 -0
- package/dist/esm/router-binding/useLocation.js +14 -0
- package/dist/esm/router-binding/useMatch.js +28 -0
- package/dist/esm/router-binding/useNavigate.js +19 -0
- package/dist/esm/router-binding/useParams.js +13 -0
- package/dist/esm/router-binding/useRouteContext.js +8 -0
- package/dist/esm/router-binding/useRouter.js +10 -0
- package/dist/esm/router-binding/useRouterState.js +19 -0
- package/dist/esm/router-binding/useSearch.js +13 -0
- package/dist/esm/router-binding/utils.js +23 -0
- package/dist/esm/router.js +187 -0
- package/dist/esm-node/actions.js +263 -0
- package/dist/esm-node/application-router.js +25 -0
- package/dist/esm-node/client.js +49 -0
- package/dist/esm-node/entry-application.js +110 -0
- package/dist/esm-node/entry-client.js +23 -0
- package/dist/esm-node/entry-server.js +47 -0
- package/dist/esm-node/federation-context.js +25 -0
- package/dist/esm-node/federation-ssr.js +84 -0
- package/dist/esm-node/federation.js +83 -0
- package/dist/esm-node/i18n/I18nProvider.js +42 -0
- package/dist/esm-node/i18n/LocalizedLink.js +142 -0
- package/dist/esm-node/i18n/context.js +3 -0
- package/dist/esm-node/i18n/index.js +8 -0
- package/dist/esm-node/i18n/languageSync.js +50 -0
- package/dist/esm-node/i18n/types.js +1 -0
- package/dist/esm-node/i18n/useI18n.js +74 -0
- package/dist/esm-node/index.js +58 -0
- package/dist/esm-node/manifest.js +150 -0
- package/dist/esm-node/native-promise-serialization.js +113 -0
- package/dist/esm-node/plugin/compiler.js +209 -0
- package/dist/esm-node/plugin/create.js +235 -0
- package/dist/esm-node/plugin/index.js +73 -0
- package/dist/esm-node/plugin/profile.js +52 -0
- package/dist/esm-node/route-completion.js +160 -0
- package/dist/esm-node/route-data-error.js +108 -0
- package/dist/esm-node/router-binding/Asset.js +171 -0
- package/dist/esm-node/router-binding/CatchBoundary.js +136 -0
- package/dist/esm-node/router-binding/ClientOnly.js +46 -0
- package/dist/esm-node/router-binding/HeadContent.js +8 -0
- package/dist/esm-node/router-binding/LICENSE +21 -0
- package/dist/esm-node/router-binding/Match.js +660 -0
- package/dist/esm-node/router-binding/Matches.js +161 -0
- package/dist/esm-node/router-binding/PROVENANCE.json +94 -0
- package/dist/esm-node/router-binding/RouterProvider.js +87 -0
- package/dist/esm-node/router-binding/SafeFragment.js +5 -0
- package/dist/esm-node/router-binding/ScriptOnce.js +16 -0
- package/dist/esm-node/router-binding/Scripts.js +49 -0
- package/dist/esm-node/router-binding/ScrollRestoration.js +16 -0
- package/dist/esm-node/router-binding/Transitioner.js +103 -0
- package/dist/esm-node/router-binding/awaited.js +75 -0
- package/dist/esm-node/router-binding/fileRoute.js +83 -0
- package/dist/esm-node/router-binding/flightData.js +23 -0
- package/dist/esm-node/router-binding/headContentUtils.js +162 -0
- package/dist/esm-node/router-binding/history.js +1 -0
- package/dist/esm-node/router-binding/index.js +35 -0
- package/dist/esm-node/router-binding/lazyRouteComponent.js +30 -0
- package/dist/esm-node/router-binding/link.js +399 -0
- package/dist/esm-node/router-binding/matchContext.js +7 -0
- package/dist/esm-node/router-binding/nonRouteComponentContext.js +22 -0
- package/dist/esm-node/router-binding/not-found.js +49 -0
- package/dist/esm-node/router-binding/publicMatchData.js +447 -0
- package/dist/esm-node/router-binding/registryTransfer.js +210 -0
- package/dist/esm-node/router-binding/renderRouteNotFound.js +22 -0
- package/dist/esm-node/router-binding/route.js +162 -0
- package/dist/esm-node/router-binding/router.js +13 -0
- package/dist/esm-node/router-binding/routerContext.js +3 -0
- package/dist/esm-node/router-binding/routerStores.js +50 -0
- package/dist/esm-node/router-binding/scroll-restoration.js +12 -0
- package/dist/esm-node/router-binding/typePrimitives.js +1 -0
- package/dist/esm-node/router-binding/useBlocker.js +152 -0
- package/dist/esm-node/router-binding/useCanGoBack.js +7 -0
- package/dist/esm-node/router-binding/useLoaderData.js +9 -0
- package/dist/esm-node/router-binding/useLoaderDeps.js +8 -0
- package/dist/esm-node/router-binding/useLocation.js +14 -0
- package/dist/esm-node/router-binding/useMatch.js +28 -0
- package/dist/esm-node/router-binding/useNavigate.js +19 -0
- package/dist/esm-node/router-binding/useParams.js +13 -0
- package/dist/esm-node/router-binding/useRouteContext.js +8 -0
- package/dist/esm-node/router-binding/useRouter.js +10 -0
- package/dist/esm-node/router-binding/useRouterState.js +19 -0
- package/dist/esm-node/router-binding/useSearch.js +13 -0
- package/dist/esm-node/router-binding/utils.js +23 -0
- package/dist/esm-node/router.js +187 -0
- package/dist/esm-node/server.js +396 -0
- package/dist/types/actions.d.ts +45 -0
- package/dist/types/application-router.d.ts +5 -0
- package/dist/types/client.d.ts +23 -0
- package/dist/types/entry-application.d.ts +10 -0
- package/dist/types/entry-client.d.ts +5 -0
- package/dist/types/entry-server.d.ts +5 -0
- package/dist/types/federation-context.d.ts +16 -0
- package/dist/types/federation-ssr.d.ts +21 -0
- package/dist/types/federation.d.ts +30 -0
- package/dist/types/i18n/I18nProvider.d.ts +21 -0
- package/dist/types/i18n/LocalizedLink.d.ts +43 -0
- package/dist/types/i18n/context.d.ts +11 -0
- package/dist/types/i18n/index.d.ts +9 -0
- package/dist/types/i18n/languageSync.d.ts +31 -0
- package/dist/types/i18n/types.d.ts +33 -0
- package/dist/types/i18n/useI18n.d.ts +24 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/manifest.d.ts +55 -0
- package/dist/types/native-promise-serialization.d.ts +9 -0
- package/dist/types/plugin/compiler.d.ts +6 -0
- package/dist/types/plugin/create.d.ts +21 -0
- package/dist/types/plugin/index.d.ts +3 -0
- package/dist/types/plugin/lazy-modules.d.cts +15 -0
- package/dist/types/plugin/preserve-import-loader.d.cts +3 -0
- package/dist/types/plugin/profile.d.ts +2 -0
- package/dist/types/plugin/solid-loader.d.cts +2 -0
- package/dist/types/plugin/svg-component-template.d.cts +6 -0
- package/dist/types/route-completion.d.ts +21 -0
- package/dist/types/route-data-error.d.ts +17 -0
- package/dist/types/router-binding/Asset.d.ts +3 -0
- package/dist/types/router-binding/CatchBoundary.d.ts +13 -0
- package/dist/types/router-binding/ClientOnly.d.ts +31 -0
- package/dist/types/router-binding/HeadContent.d.ts +13 -0
- package/dist/types/router-binding/Match.d.ts +6 -0
- package/dist/types/router-binding/Matches.d.ts +26 -0
- package/dist/types/router-binding/RouterProvider.d.ts +10 -0
- package/dist/types/router-binding/SafeFragment.d.ts +2 -0
- package/dist/types/router-binding/ScriptOnce.d.ts +6 -0
- package/dist/types/router-binding/Scripts.d.ts +2 -0
- package/dist/types/router-binding/ScrollRestoration.d.ts +14 -0
- package/dist/types/router-binding/Transitioner.d.ts +2 -0
- package/dist/types/router-binding/awaited.d.ts +11 -0
- package/dist/types/router-binding/fileRoute.d.ts +54 -0
- package/dist/types/router-binding/flightData.d.ts +38 -0
- package/dist/types/router-binding/headContentUtils.d.ts +15 -0
- package/dist/types/router-binding/history.d.ts +8 -0
- package/dist/types/router-binding/index.d.ts +45 -0
- package/dist/types/router-binding/lazyRouteComponent.d.ts +2 -0
- package/dist/types/router-binding/link.d.ts +43 -0
- package/dist/types/router-binding/matchContext.d.ts +7 -0
- package/dist/types/router-binding/nonRouteComponentContext.d.ts +5 -0
- package/dist/types/router-binding/not-found.d.ts +11 -0
- package/dist/types/router-binding/publicMatchData.d.ts +19 -0
- package/dist/types/router-binding/registryTransfer.d.ts +47 -0
- package/dist/types/router-binding/renderRouteNotFound.d.ts +11 -0
- package/dist/types/router-binding/route.d.ts +105 -0
- package/dist/types/router-binding/router.d.ts +70 -0
- package/dist/types/router-binding/routerContext.d.ts +3 -0
- package/dist/types/router-binding/routerStores.d.ts +2 -0
- package/dist/types/router-binding/scroll-restoration.d.ts +2 -0
- package/dist/types/router-binding/typePrimitives.d.ts +10 -0
- package/dist/types/router-binding/useBlocker.d.ts +70 -0
- package/dist/types/router-binding/useCanGoBack.d.ts +2 -0
- package/dist/types/router-binding/useLoaderData.d.ts +8 -0
- package/dist/types/router-binding/useLoaderDeps.d.ts +8 -0
- package/dist/types/router-binding/useLocation.d.ts +7 -0
- package/dist/types/router-binding/useMatch.d.ts +10 -0
- package/dist/types/router-binding/useNavigate.d.ts +5 -0
- package/dist/types/router-binding/useParams.d.ts +9 -0
- package/dist/types/router-binding/useRouteContext.d.ts +4 -0
- package/dist/types/router-binding/useRouter.d.ts +4 -0
- package/dist/types/router-binding/useRouterState.d.ts +8 -0
- package/dist/types/router-binding/useSearch.d.ts +9 -0
- package/dist/types/router-binding/utils.d.ts +25 -0
- package/dist/types/router.d.ts +31 -0
- package/dist/types/server.d.ts +47 -0
- package/package.json +123 -4
- package/src/actions.tsx +437 -0
- package/src/application-router.tsx +41 -0
- package/src/client.ts +106 -0
- package/src/entry-application.tsx +73 -0
- package/src/entry-client.tsx +48 -0
- package/src/entry-server.tsx +85 -0
- package/src/federation-context.ts +47 -0
- package/src/federation-ssr.ts +117 -0
- package/src/federation.tsx +193 -0
- package/src/i18n/I18nProvider.tsx +54 -0
- package/src/i18n/LocalizedLink.tsx +122 -0
- package/src/i18n/context.ts +13 -0
- package/src/i18n/index.ts +35 -0
- package/src/i18n/languageSync.ts +113 -0
- package/src/i18n/types.ts +35 -0
- package/src/i18n/useI18n.ts +121 -0
- package/src/index.ts +41 -0
- package/src/manifest.ts +337 -0
- package/src/native-promise-serialization.ts +167 -0
- package/src/plugin/compiler.ts +320 -0
- package/src/plugin/create.ts +270 -0
- package/src/plugin/index.ts +72 -0
- package/src/plugin/lazy-modules.cjs +146 -0
- package/src/plugin/preserve-import-loader.cjs +46 -0
- package/src/plugin/profile.ts +42 -0
- package/src/plugin/solid-loader.cjs +83 -0
- package/src/plugin/svg-component-template.cjs +19 -0
- package/src/route-completion.tsx +222 -0
- package/src/route-data-error.ts +175 -0
- package/src/router-binding/Asset.tsx +283 -0
- package/src/router-binding/CatchBoundary.tsx +130 -0
- package/src/router-binding/ClientOnly.tsx +76 -0
- package/src/router-binding/HeadContent.tsx +23 -0
- package/src/router-binding/LICENSE +21 -0
- package/src/router-binding/Match.tsx +397 -0
- package/src/router-binding/Matches.tsx +242 -0
- package/src/router-binding/PROVENANCE.json +94 -0
- package/src/router-binding/RouterProvider.tsx +129 -0
- package/src/router-binding/SafeFragment.tsx +5 -0
- package/src/router-binding/ScriptOnce.tsx +23 -0
- package/src/router-binding/Scripts.tsx +44 -0
- package/src/router-binding/ScrollRestoration.tsx +49 -0
- package/src/router-binding/Transitioner.tsx +172 -0
- package/src/router-binding/awaited.tsx +71 -0
- package/src/router-binding/fileRoute.ts +268 -0
- package/src/router-binding/flightData.ts +90 -0
- package/src/router-binding/headContentUtils.tsx +290 -0
- package/src/router-binding/history.ts +9 -0
- package/src/router-binding/index.tsx +318 -0
- package/src/router-binding/lazyRouteComponent.tsx +70 -0
- package/src/router-binding/link.tsx +865 -0
- package/src/router-binding/matchContext.tsx +15 -0
- package/src/router-binding/nonRouteComponentContext.tsx +23 -0
- package/src/router-binding/not-found.tsx +65 -0
- package/src/router-binding/publicMatchData.ts +674 -0
- package/src/router-binding/registryTransfer.ts +383 -0
- package/src/router-binding/renderRouteNotFound.tsx +53 -0
- package/src/router-binding/route.tsx +665 -0
- package/src/router-binding/router.ts +121 -0
- package/src/router-binding/routerContext.tsx +6 -0
- package/src/router-binding/routerStores.ts +85 -0
- package/src/router-binding/scroll-restoration.tsx +15 -0
- package/src/router-binding/typePrimitives.ts +74 -0
- package/src/router-binding/useBlocker.tsx +359 -0
- package/src/router-binding/useCanGoBack.ts +9 -0
- package/src/router-binding/useLoaderData.tsx +50 -0
- package/src/router-binding/useLoaderDeps.tsx +46 -0
- package/src/router-binding/useLocation.tsx +43 -0
- package/src/router-binding/useMatch.tsx +111 -0
- package/src/router-binding/useNavigate.tsx +43 -0
- package/src/router-binding/useParams.tsx +72 -0
- package/src/router-binding/useRouteContext.ts +30 -0
- package/src/router-binding/useRouter.tsx +17 -0
- package/src/router-binding/useRouterState.tsx +50 -0
- package/src/router-binding/useSearch.tsx +72 -0
- package/src/router-binding/utils.ts +59 -0
- package/src/router.ts +376 -0
- package/src/server.ts +645 -0
- package/README.md +0 -3
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createPlugin,
|
|
3
|
+
type SerovalNode,
|
|
4
|
+
type StreamParsePluginContext,
|
|
5
|
+
} from '@solidjs/web/serialization';
|
|
6
|
+
|
|
7
|
+
const nativeThen = Promise.prototype.then;
|
|
8
|
+
|
|
9
|
+
class ResolverToken {}
|
|
10
|
+
|
|
11
|
+
class SettlementToken {
|
|
12
|
+
constructor(
|
|
13
|
+
readonly resolver: ResolverToken,
|
|
14
|
+
readonly value: unknown,
|
|
15
|
+
readonly fulfilled: boolean,
|
|
16
|
+
) {}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface NativePromise extends Promise<unknown> {
|
|
20
|
+
s?: 1 | 2;
|
|
21
|
+
v?: unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface NativeResolver {
|
|
25
|
+
p: NativePromise;
|
|
26
|
+
s(value: unknown): void;
|
|
27
|
+
f(value: unknown): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** This function is emitted as source: it may only reference its own locals
|
|
31
|
+
* and JavaScript globals. The observer belongs to the exact native promise
|
|
32
|
+
* returned to Solid, including before any hydration consumer subscribes. */
|
|
33
|
+
function mintNativeResolver(): NativeResolver {
|
|
34
|
+
let accept!: (value: unknown) => void;
|
|
35
|
+
let reject!: (reason: unknown) => void;
|
|
36
|
+
const promise: NativePromise = new Promise((resolve, fail) => {
|
|
37
|
+
accept = resolve;
|
|
38
|
+
reject = fail;
|
|
39
|
+
});
|
|
40
|
+
const resolver = {
|
|
41
|
+
p: promise,
|
|
42
|
+
s(value: unknown) {
|
|
43
|
+
accept(value);
|
|
44
|
+
promise.s = 1;
|
|
45
|
+
promise.v = value;
|
|
46
|
+
},
|
|
47
|
+
f(value: unknown) {
|
|
48
|
+
reject(value);
|
|
49
|
+
promise.s = 2;
|
|
50
|
+
promise.v = value;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
Promise.prototype.then.call(promise, undefined, () => undefined);
|
|
54
|
+
return resolver;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function requireStreamingHydration(): never {
|
|
58
|
+
throw new Error(
|
|
59
|
+
'The Solid native Promise serializer only supports streaming SSR hydration.',
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const resolverPlugin = createPlugin<ResolverToken, Record<string, never>>({
|
|
64
|
+
tag: 'ultramodern/solid/native-promise-resolver-v1',
|
|
65
|
+
test: value => value instanceof ResolverToken,
|
|
66
|
+
parse: {
|
|
67
|
+
sync: requireStreamingHydration,
|
|
68
|
+
async: requireStreamingHydration,
|
|
69
|
+
stream: () => ({}),
|
|
70
|
+
},
|
|
71
|
+
serialize: () => `(${mintNativeResolver.toString()})()`,
|
|
72
|
+
deserialize: requireStreamingHydration,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
type SettlementInfo = {
|
|
76
|
+
resolver: SerovalNode;
|
|
77
|
+
value: SerovalNode;
|
|
78
|
+
fulfilled: SerovalNode;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const settlementPlugin = createPlugin<SettlementToken, SettlementInfo>({
|
|
82
|
+
tag: 'ultramodern/solid/native-promise-settlement-v1',
|
|
83
|
+
test: value => value instanceof SettlementToken,
|
|
84
|
+
parse: {
|
|
85
|
+
sync: requireStreamingHydration,
|
|
86
|
+
async: requireStreamingHydration,
|
|
87
|
+
stream: (value, context) => ({
|
|
88
|
+
resolver: context.parse(value.resolver),
|
|
89
|
+
value: context.parse(value.value),
|
|
90
|
+
fulfilled: context.parse(value.fulfilled),
|
|
91
|
+
}),
|
|
92
|
+
},
|
|
93
|
+
serialize: (node, context) =>
|
|
94
|
+
`(${context.serialize(node.resolver)})[${context.serialize(node.fulfilled)}?"s":"f"](${context.serialize(node.value)})`,
|
|
95
|
+
deserialize: requireStreamingHydration,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
type PromiseInfo = {
|
|
99
|
+
resolver: SerovalNode;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
interface PendingSerialization {
|
|
103
|
+
context: StreamParsePluginContext;
|
|
104
|
+
resolver: ResolverToken;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Internal SSR-only native plugin. It is deliberately not an application
|
|
108
|
+
* codec or a public client decoder. Seroval owns indexing and settlement
|
|
109
|
+
* chunks; Solid retains its ordinary Promise, s/v and truncation semantics. */
|
|
110
|
+
export const nativePromiseSerializationPlugin = createPlugin<
|
|
111
|
+
Promise<unknown>,
|
|
112
|
+
PromiseInfo
|
|
113
|
+
>({
|
|
114
|
+
tag: 'ultramodern/solid/native-promise-v1',
|
|
115
|
+
extends: [resolverPlugin, settlementPlugin],
|
|
116
|
+
test: value => value instanceof Promise,
|
|
117
|
+
parse: {
|
|
118
|
+
sync: requireStreamingHydration,
|
|
119
|
+
async: requireStreamingHydration,
|
|
120
|
+
stream(value, context) {
|
|
121
|
+
const resolver = new ResolverToken();
|
|
122
|
+
const node = context.parse(resolver);
|
|
123
|
+
context.pushPendingState();
|
|
124
|
+
let pending: PendingSerialization | undefined = { context, resolver };
|
|
125
|
+
context.addCleanup(() => {
|
|
126
|
+
// Native close/onDone owns completion. Popping here would reenter
|
|
127
|
+
// onDone, and late source reactions must retain neither scope nor token.
|
|
128
|
+
pending = undefined;
|
|
129
|
+
});
|
|
130
|
+
const settle = (result: unknown, fulfilled: boolean) => {
|
|
131
|
+
const current = pending;
|
|
132
|
+
if (!current) return;
|
|
133
|
+
pending = undefined;
|
|
134
|
+
try {
|
|
135
|
+
if (!current.context.isAlive()) return;
|
|
136
|
+
const settlement = current.context.parseWithError(
|
|
137
|
+
new SettlementToken(current.resolver, result, fulfilled),
|
|
138
|
+
);
|
|
139
|
+
if (settlement && current.context.isAlive()) {
|
|
140
|
+
current.context.onParse(settlement);
|
|
141
|
+
}
|
|
142
|
+
} finally {
|
|
143
|
+
if (current.context.isAlive()) {
|
|
144
|
+
current.context.popPendingState();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
try {
|
|
149
|
+
const bridge = nativeThen.call(
|
|
150
|
+
value,
|
|
151
|
+
result => settle(result, true),
|
|
152
|
+
reason => settle(reason, false),
|
|
153
|
+
);
|
|
154
|
+
// Parse/serialize failures already reach the native error hook. If that
|
|
155
|
+
// hook throws, consume the reaction bridge after its native delivery.
|
|
156
|
+
nativeThen.call(bridge, undefined, () => undefined);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
pending = undefined;
|
|
159
|
+
if (context.isAlive()) context.popPendingState();
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
return { resolver: node };
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
serialize: (node, context) => `(${context.serialize(node.resolver)}).p`,
|
|
166
|
+
deserialize: requireStreamingHydration,
|
|
167
|
+
});
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { identityCacheKey } from '@modern-js/renderer-core';
|
|
6
|
+
import type { NativeRendererCompilerOptions } from '@modern-js/renderer-core/adapter';
|
|
7
|
+
import type { RsbuildPlugin, Rspack } from '@rsbuild/core';
|
|
8
|
+
import {
|
|
9
|
+
SOLID_COMPILER_VERSION,
|
|
10
|
+
type SolidAssetManifest,
|
|
11
|
+
type SolidModuleManifest,
|
|
12
|
+
solidModuleManifestFilename,
|
|
13
|
+
} from '../manifest';
|
|
14
|
+
|
|
15
|
+
interface LazyModule {
|
|
16
|
+
key: string;
|
|
17
|
+
filename: string;
|
|
18
|
+
request: string;
|
|
19
|
+
entryName: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface LazyDiscoveryDependencies {
|
|
23
|
+
files: { add(filename: string): unknown };
|
|
24
|
+
contexts: { add(directory: string): unknown };
|
|
25
|
+
missing: { add(filename: string): unknown };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface LazyDiscovery {
|
|
29
|
+
compilation: Rspack.Compilation;
|
|
30
|
+
modules: LazyModule[];
|
|
31
|
+
applicationEntries: string[];
|
|
32
|
+
failed: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const nativeDependencySources = [
|
|
36
|
+
/[/\\]node_modules[/\\]\.modern-js[/\\]solid[/\\]/u,
|
|
37
|
+
/[/\\]node_modules[/\\]@modern-js[/\\]renderer-solid[/\\]/u,
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
/** Private loaders remain in the package's shipped src tree in every format. */
|
|
41
|
+
export function pluginSourceDirectory(): string {
|
|
42
|
+
let directory = path.dirname(fileURLToPath(import.meta.url));
|
|
43
|
+
while (true) {
|
|
44
|
+
const manifest = path.join(directory, 'package.json');
|
|
45
|
+
const compiler = path.join(directory, 'src/plugin');
|
|
46
|
+
if (
|
|
47
|
+
fs.existsSync(manifest) &&
|
|
48
|
+
fs.existsSync(path.join(compiler, 'solid-loader.cjs'))
|
|
49
|
+
) {
|
|
50
|
+
return compiler;
|
|
51
|
+
}
|
|
52
|
+
const parent = path.dirname(directory);
|
|
53
|
+
if (parent === directory) {
|
|
54
|
+
throw new Error('Cannot locate the UltraModern Solid compiler package');
|
|
55
|
+
}
|
|
56
|
+
directory = parent;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Own Solid's native compiler, refresh and lazy assets. */
|
|
61
|
+
export function pluginSolidRenderer(
|
|
62
|
+
options: NativeRendererCompilerOptions,
|
|
63
|
+
): RsbuildPlugin {
|
|
64
|
+
return {
|
|
65
|
+
name: 'ultramodern:solid:compiler',
|
|
66
|
+
setup(api) {
|
|
67
|
+
if (typeof options?.rendererIdentities !== 'function') {
|
|
68
|
+
throw new Error(
|
|
69
|
+
'Solid compiler requires identities from the native UltraModern infrastructure. Select renderer: solid through defineConfig.',
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
const directory = pluginSourceDirectory();
|
|
73
|
+
const require = createRequire(path.join(directory, 'index.cjs'));
|
|
74
|
+
const { collectLazyModules } = require('./lazy-modules.cjs') as {
|
|
75
|
+
collectLazyModules(
|
|
76
|
+
projectRoot: string,
|
|
77
|
+
entryDirectories?: string[],
|
|
78
|
+
sourceExtensions?: string[],
|
|
79
|
+
dependencies?: LazyDiscoveryDependencies,
|
|
80
|
+
): LazyModule[];
|
|
81
|
+
};
|
|
82
|
+
const projectRoot = api.context.rootPath;
|
|
83
|
+
api.modifyRsbuildConfig(config => {
|
|
84
|
+
config.html ??= {};
|
|
85
|
+
config.html.scriptLoading = 'module';
|
|
86
|
+
config.source ??= {};
|
|
87
|
+
config.source.include = [
|
|
88
|
+
...(config.source.include ?? []),
|
|
89
|
+
...nativeDependencySources,
|
|
90
|
+
];
|
|
91
|
+
return config;
|
|
92
|
+
});
|
|
93
|
+
api.modifyRspackConfig((config, { environment, isProd, rspack }) => {
|
|
94
|
+
const target = environment.config.output.target;
|
|
95
|
+
// The Cloudflare SSR worker is a `web` module bundle that renders
|
|
96
|
+
// server documents; select its transform by environment, not target.
|
|
97
|
+
const ssrWorker = environment.name === options.workerEnvironmentName;
|
|
98
|
+
const client = target === 'web' && !ssrWorker;
|
|
99
|
+
const worker = target === 'web-worker' || ssrWorker;
|
|
100
|
+
const server = !client;
|
|
101
|
+
config.resolve ??= {};
|
|
102
|
+
config.resolve.conditionNames = [
|
|
103
|
+
'solid',
|
|
104
|
+
client ? 'browser' : worker ? 'worker' : 'node',
|
|
105
|
+
...(!isProd ? ['development'] : []),
|
|
106
|
+
'import',
|
|
107
|
+
'default',
|
|
108
|
+
];
|
|
109
|
+
const sourceExtensions = (
|
|
110
|
+
config.resolve.extensions ?? ['.tsx', '.ts', '.jsx', '.js']
|
|
111
|
+
).filter(extension =>
|
|
112
|
+
['.tsx', '.ts', '.jsx', '.js'].includes(extension),
|
|
113
|
+
);
|
|
114
|
+
config.module ??= {};
|
|
115
|
+
config.module.rules ??= [];
|
|
116
|
+
config.module.rules.unshift({
|
|
117
|
+
test: /\.[jt]sx?$/u,
|
|
118
|
+
exclude: /\.d\.[cm]?ts$/u,
|
|
119
|
+
// Bundler virtual modules, such as the Module Federation runtime
|
|
120
|
+
// entry, have no source file for the Solid compiler to own.
|
|
121
|
+
include: (filename: string) =>
|
|
122
|
+
path.isAbsolute(filename) &&
|
|
123
|
+
(!filename.includes(`${path.sep}node_modules${path.sep}`) ||
|
|
124
|
+
nativeDependencySources.some(source => source.test(filename))),
|
|
125
|
+
enforce: 'pre',
|
|
126
|
+
use: [
|
|
127
|
+
{
|
|
128
|
+
loader: path.join(directory, 'solid-loader.cjs'),
|
|
129
|
+
options: { projectRoot, server, isProd, sourceExtensions },
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
if (!client) return config;
|
|
134
|
+
|
|
135
|
+
config.module.rules.unshift({
|
|
136
|
+
test: /[/\\]@solidjs[/\\]web[/\\]dist[/\\]web(?:\.dev)?\.js$/u,
|
|
137
|
+
enforce: 'pre',
|
|
138
|
+
use: [path.join(directory, 'preserve-import-loader.cjs')],
|
|
139
|
+
});
|
|
140
|
+
config.output = {
|
|
141
|
+
...config.output,
|
|
142
|
+
module: true,
|
|
143
|
+
chunkFormat: 'module',
|
|
144
|
+
chunkLoading: 'import',
|
|
145
|
+
iife: false,
|
|
146
|
+
scriptType: 'module',
|
|
147
|
+
library: { type: 'module' },
|
|
148
|
+
};
|
|
149
|
+
config.optimization ??= {};
|
|
150
|
+
config.optimization.runtimeChunk = { name: 'runtime' };
|
|
151
|
+
|
|
152
|
+
let currentDiscovery: LazyDiscovery | undefined;
|
|
153
|
+
const originalEntry = config.entry;
|
|
154
|
+
config.entry = async () => {
|
|
155
|
+
const discovery = currentDiscovery;
|
|
156
|
+
if (!discovery) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
'Solid lazy discovery requires an active Rspack compilation',
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
const entries =
|
|
162
|
+
typeof originalEntry === 'function'
|
|
163
|
+
? await originalEntry()
|
|
164
|
+
: originalEntry;
|
|
165
|
+
if (
|
|
166
|
+
!entries ||
|
|
167
|
+
typeof entries !== 'object' ||
|
|
168
|
+
Array.isArray(entries)
|
|
169
|
+
) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
'Solid lazy modules require named application entries',
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const entryDirectories = Object.values(entries).flatMap(entry => {
|
|
175
|
+
const imports =
|
|
176
|
+
typeof entry === 'object' && !Array.isArray(entry)
|
|
177
|
+
? entry.import
|
|
178
|
+
: entry;
|
|
179
|
+
return (Array.isArray(imports) ? imports : [imports])
|
|
180
|
+
.filter(
|
|
181
|
+
(file): file is string =>
|
|
182
|
+
typeof file === 'string' && /\.[jt]sx?$/u.test(file),
|
|
183
|
+
)
|
|
184
|
+
.map(file => path.dirname(path.resolve(projectRoot, file)));
|
|
185
|
+
});
|
|
186
|
+
discovery.applicationEntries = Object.keys(entries);
|
|
187
|
+
for (const directory of entryDirectories) {
|
|
188
|
+
discovery.compilation.contextDependencies.add(directory);
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
discovery.modules = collectLazyModules(
|
|
192
|
+
projectRoot,
|
|
193
|
+
entryDirectories,
|
|
194
|
+
sourceExtensions,
|
|
195
|
+
{
|
|
196
|
+
files: discovery.compilation.fileDependencies,
|
|
197
|
+
contexts: discovery.compilation.contextDependencies,
|
|
198
|
+
missing: discovery.compilation.missingDependencies,
|
|
199
|
+
},
|
|
200
|
+
);
|
|
201
|
+
} catch (error) {
|
|
202
|
+
discovery.failed = true;
|
|
203
|
+
discovery.modules = [];
|
|
204
|
+
discovery.compilation.errors.push(
|
|
205
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
206
|
+
);
|
|
207
|
+
return entries;
|
|
208
|
+
}
|
|
209
|
+
const next = { ...entries };
|
|
210
|
+
for (const module of discovery.modules) {
|
|
211
|
+
if (Object.hasOwn(next, module.entryName)) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`Reserved Solid lazy entry ${module.entryName} conflicts with an application entry`,
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
next[module.entryName] = { import: module.request };
|
|
217
|
+
}
|
|
218
|
+
return next;
|
|
219
|
+
};
|
|
220
|
+
config.plugins ??= [];
|
|
221
|
+
config.plugins.push({
|
|
222
|
+
apply(compiler: Rspack.Compiler) {
|
|
223
|
+
compiler.hooks.thisCompilation.tap(
|
|
224
|
+
'UltraModernSolidModuleManifest',
|
|
225
|
+
compilation => {
|
|
226
|
+
const discovery: LazyDiscovery = {
|
|
227
|
+
compilation,
|
|
228
|
+
modules: [],
|
|
229
|
+
applicationEntries: [],
|
|
230
|
+
failed: false,
|
|
231
|
+
};
|
|
232
|
+
currentDiscovery = discovery;
|
|
233
|
+
compilation.contextDependencies.add(
|
|
234
|
+
path.join(projectRoot, 'src'),
|
|
235
|
+
);
|
|
236
|
+
compilation.hooks.processAssets.tap(
|
|
237
|
+
{
|
|
238
|
+
name: 'UltraModernSolidModuleManifest',
|
|
239
|
+
stage: rspack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE,
|
|
240
|
+
},
|
|
241
|
+
() => {
|
|
242
|
+
if (discovery.failed || compilation.errors.length > 0) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const assets: SolidAssetManifest = {};
|
|
246
|
+
const publicPath = compilation.outputOptions.publicPath;
|
|
247
|
+
if (
|
|
248
|
+
typeof publicPath === 'string' &&
|
|
249
|
+
publicPath !== 'auto'
|
|
250
|
+
) {
|
|
251
|
+
assets._base = publicPath;
|
|
252
|
+
}
|
|
253
|
+
for (const module of discovery.modules) {
|
|
254
|
+
const entry = compilation.entrypoints.get(
|
|
255
|
+
module.entryName,
|
|
256
|
+
);
|
|
257
|
+
const files = entry?.getFiles() ?? [];
|
|
258
|
+
const chunk = entry?.getEntrypointChunk();
|
|
259
|
+
const entryFiles = chunk ? [...chunk.files] : [];
|
|
260
|
+
const file = entryFiles.find(asset =>
|
|
261
|
+
/\.(?:m)?js$/u.test(asset),
|
|
262
|
+
);
|
|
263
|
+
if (!file) {
|
|
264
|
+
throw new Error(
|
|
265
|
+
`Solid lazy module ${module.key} has no native ESM entry asset`,
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
const css = files.filter(asset => /\.css$/u.test(asset));
|
|
269
|
+
assets[module.key] = {
|
|
270
|
+
file,
|
|
271
|
+
...(css.length ? { css } : {}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const identities = options.rendererIdentities();
|
|
275
|
+
if (
|
|
276
|
+
!identities ||
|
|
277
|
+
typeof identities !== 'object' ||
|
|
278
|
+
Array.isArray(identities)
|
|
279
|
+
) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
'Solid compiler requires the current native application entry identity map',
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
for (const entryName of discovery.applicationEntries) {
|
|
285
|
+
const rendererIdentity = identities[entryName];
|
|
286
|
+
if (
|
|
287
|
+
!rendererIdentity ||
|
|
288
|
+
rendererIdentity.renderer !== 'solid' ||
|
|
289
|
+
rendererIdentity.entryName !== entryName
|
|
290
|
+
) {
|
|
291
|
+
throw new Error(
|
|
292
|
+
`Solid compiler requires the current source-build identity for entry ${entryName}`,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
identityCacheKey(rendererIdentity);
|
|
296
|
+
const manifest: SolidModuleManifest = {
|
|
297
|
+
schemaVersion: 1,
|
|
298
|
+
renderer: 'solid',
|
|
299
|
+
compilerVersion: SOLID_COMPILER_VERSION,
|
|
300
|
+
rendererIdentity,
|
|
301
|
+
modules: assets,
|
|
302
|
+
};
|
|
303
|
+
compilation.emitAsset(
|
|
304
|
+
solidModuleManifestFilename(entryName),
|
|
305
|
+
new rspack.sources.RawSource(
|
|
306
|
+
JSON.stringify(manifest, null, 2),
|
|
307
|
+
),
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
);
|
|
312
|
+
},
|
|
313
|
+
);
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
return config;
|
|
317
|
+
});
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|