@bleedingdev/modern-js-renderer-solid 0.0.0-stage → 3.9.3-ultramodern.10
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 +282 -0
- package/dist/esm/application-router.js +30 -0
- package/dist/esm/client.js +49 -0
- package/dist/esm/entry-application.js +60 -0
- package/dist/esm/entry-client.js +24 -0
- package/dist/esm/federation-context.js +25 -0
- package/dist/esm/federation-ssr.js +92 -0
- package/dist/esm/federation.js +87 -0
- package/dist/esm/i18n/I18nProvider.js +33 -0
- package/dist/esm/i18n/LocalizedLink.js +52 -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 +151 -0
- package/dist/esm/route-data-error.js +108 -0
- package/dist/esm/router-binding/Asset.js +202 -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 +124 -0
- package/dist/esm/router-binding/PROVENANCE.json +94 -0
- package/dist/esm/router-binding/RouterProvider.js +52 -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 +109 -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 +168 -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 +387 -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 +223 -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 +14 -0
- package/dist/esm/router-binding/routerContext.js +3 -0
- package/dist/esm/router-binding/routerOptions.js +0 -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 +8 -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 +25 -0
- package/dist/esm/router-binding/useParams.js +11 -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 +11 -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 +30 -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 +24 -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 +92 -0
- package/dist/esm-node/federation.js +87 -0
- package/dist/esm-node/i18n/I18nProvider.js +42 -0
- package/dist/esm-node/i18n/LocalizedLink.js +88 -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 +236 -0
- package/dist/esm-node/plugin/index.js +70 -0
- package/dist/esm-node/plugin/profile.js +51 -0
- package/dist/esm-node/route-completion.js +161 -0
- package/dist/esm-node/route-data-error.js +108 -0
- package/dist/esm-node/router-binding/Asset.js +172 -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 +88 -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 +109 -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 +168 -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 +223 -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 +14 -0
- package/dist/esm-node/router-binding/routerContext.js +3 -0
- package/dist/esm-node/router-binding/routerOptions.js +1 -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 +8 -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 +25 -0
- package/dist/esm-node/router-binding/useParams.js +11 -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 +11 -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 +19 -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 +15 -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 +11 -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 +46 -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 +49 -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/routerOptions.d.ts +6 -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 +130 -4
- package/src/actions.tsx +441 -0
- package/src/application-router.tsx +47 -0
- package/src/client.ts +106 -0
- package/src/entry-application.tsx +73 -0
- package/src/entry-client.tsx +49 -0
- package/src/entry-server.tsx +85 -0
- package/src/federation-context.ts +47 -0
- package/src/federation-ssr.ts +136 -0
- package/src/federation.tsx +197 -0
- package/src/i18n/I18nProvider.tsx +54 -0
- package/src/i18n/LocalizedLink.tsx +83 -0
- package/src/i18n/context.ts +13 -0
- package/src/i18n/index.ts +31 -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 +271 -0
- package/src/plugin/index.ts +69 -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 +226 -0
- package/src/route-data-error.ts +175 -0
- package/src/router-binding/Asset.tsx +284 -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 +128 -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 +177 -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 +292 -0
- package/src/router-binding/history.ts +9 -0
- package/src/router-binding/index.tsx +315 -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 +400 -0
- package/src/router-binding/renderRouteNotFound.tsx +53 -0
- package/src/router-binding/route.tsx +665 -0
- package/src/router-binding/router.ts +123 -0
- package/src/router-binding/routerContext.tsx +6 -0
- package/src/router-binding/routerOptions.ts +26 -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 +51 -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 +45 -0
- package/src/router-binding/useParams.tsx +70 -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 +70 -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,236 @@
|
|
|
1
|
+
function generateSolidAppSources(options) {
|
|
2
|
+
const entryName = options.entryName ?? 'main';
|
|
3
|
+
if ('main' !== entryName) throw new Error('The Solid app template supports the main entry only. The create-time workspace writer places src/modern-app-env.d.ts, src/routes/index.css and the package manifest at the app root regardless of entryName, so it cannot yet route a second entry into src/<entryName>/. Add that entry by hand after generation (mirror src/routes under src/<entryName>/routes) until an admitted native multi-entry create template exists; the native entry generator itself already supports arbitrary entry names.');
|
|
4
|
+
if (!options.appId.trim() || !options.title.trim()) throw new Error('The Solid app template requires an appId and title.');
|
|
5
|
+
if ('boolean' != typeof options.capabilities.ssr || 'boolean' != typeof options.capabilities.federation) throw new Error('The Solid app template requires admitted capabilities.');
|
|
6
|
+
const title = JSON.stringify(options.title);
|
|
7
|
+
const aboutTitle = JSON.stringify(`${options.title} - About`);
|
|
8
|
+
const appId = JSON.stringify(options.appId);
|
|
9
|
+
return {
|
|
10
|
+
sourceExtension: '.tsx',
|
|
11
|
+
jsxImportSource: '@solidjs/web',
|
|
12
|
+
artifacts: [
|
|
13
|
+
{
|
|
14
|
+
path: 'src/routes/layout.tsx',
|
|
15
|
+
content: `import type { JSX } from '@solidjs/web';
|
|
16
|
+
import { Link, Outlet } from '@modern-js/renderer-solid/router';
|
|
17
|
+
import Stable from '../components/Stable';
|
|
18
|
+
import './index.css';
|
|
19
|
+
|
|
20
|
+
const appTitle = ${title};
|
|
21
|
+
|
|
22
|
+
export default function Layout(): JSX.Element {
|
|
23
|
+
return (
|
|
24
|
+
<main data-testid="native-layout">
|
|
25
|
+
<header>
|
|
26
|
+
<p>{appTitle}</p>
|
|
27
|
+
<nav aria-label="Application">
|
|
28
|
+
<Link to="/">Home</Link>
|
|
29
|
+
<Link to="/about">About</Link>
|
|
30
|
+
${options.capabilities.federation ? ' <Link to="/remotes">Federated applications</Link>\n' : ''}
|
|
31
|
+
</nav>
|
|
32
|
+
</header>
|
|
33
|
+
<Stable />
|
|
34
|
+
<Outlet />
|
|
35
|
+
</main>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
`
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
path: 'src/routes/page.tsx',
|
|
42
|
+
content: `import type { JSX } from '@solidjs/web';
|
|
43
|
+
import {
|
|
44
|
+
ActionForm,
|
|
45
|
+
Link,
|
|
46
|
+
useLoaderData,
|
|
47
|
+
useRouteAction,
|
|
48
|
+
} from '@modern-js/renderer-solid/router';
|
|
49
|
+
import Counter from '../components/Counter';
|
|
50
|
+
|
|
51
|
+
const appId = ${appId};
|
|
52
|
+
const appTitle = ${title};
|
|
53
|
+
|
|
54
|
+
export default function HomePage(): JSX.Element {
|
|
55
|
+
const data = useLoaderData({ strict: false });
|
|
56
|
+
const action = useRouteAction();
|
|
57
|
+
return (
|
|
58
|
+
<section data-app-id={appId} data-testid="native-route" data-renderer="solid">
|
|
59
|
+
<h1>{appTitle}</h1>
|
|
60
|
+
<Counter />
|
|
61
|
+
<pre data-testid="native-loader-value">{JSON.stringify(data())}</pre>
|
|
62
|
+
<ActionForm action={action}>
|
|
63
|
+
<label>
|
|
64
|
+
Name <input name="name" />
|
|
65
|
+
</label>
|
|
66
|
+
<button type="submit" disabled={action.pending()}>
|
|
67
|
+
Save
|
|
68
|
+
</button>
|
|
69
|
+
<button type="submit" name="intent" value="redirect">
|
|
70
|
+
Save and redirect
|
|
71
|
+
</button>
|
|
72
|
+
</ActionForm>
|
|
73
|
+
<pre data-testid="native-action-value">
|
|
74
|
+
{JSON.stringify(action.outcome())}
|
|
75
|
+
</pre>
|
|
76
|
+
<output data-testid="native-action-error">
|
|
77
|
+
{action.error()?.message}
|
|
78
|
+
</output>
|
|
79
|
+
<Link to="/about">Open native about route</Link>
|
|
80
|
+
</section>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
`
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
path: 'src/routes/page.head.ts',
|
|
87
|
+
content: `import type { FileSystemRouteModule } from '@modern-js/renderer-solid/router';
|
|
88
|
+
|
|
89
|
+
export const head: NonNullable<FileSystemRouteModule['head']> = () => ({
|
|
90
|
+
meta: [
|
|
91
|
+
{ title: ${title} },
|
|
92
|
+
{ name: 'description', content: 'Built with the native Solid renderer' },
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
`
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
path: 'src/routes/about/page.tsx',
|
|
99
|
+
content: `import type { JSX } from '@solidjs/web';
|
|
100
|
+
import { Link } from '@modern-js/renderer-solid/router';
|
|
101
|
+
|
|
102
|
+
export default function AboutPage(): JSX.Element {
|
|
103
|
+
return (
|
|
104
|
+
<section data-testid="native-about">
|
|
105
|
+
<h1>Native Solid navigation</h1>
|
|
106
|
+
<Link to="/">Home</Link>
|
|
107
|
+
</section>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
`
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
path: 'src/routes/about/page.head.ts',
|
|
114
|
+
content: `import type { FileSystemRouteModule } from '@modern-js/renderer-solid/router';
|
|
115
|
+
|
|
116
|
+
export const head: NonNullable<FileSystemRouteModule['head']> = () => ({
|
|
117
|
+
meta: [
|
|
118
|
+
{ title: ${aboutTitle} },
|
|
119
|
+
{ name: 'description', content: 'Built with the native Solid renderer' },
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
`
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
path: 'src/routes/page.data.ts',
|
|
126
|
+
content: `import type { DataHandlerInput } from '@modern-js/renderer-core/data';
|
|
127
|
+
|
|
128
|
+
export function loader({ request }: DataHandlerInput) {
|
|
129
|
+
const url = new URL(request.url);
|
|
130
|
+
if (url.searchParams.get('case') === 'not-found')
|
|
131
|
+
throw new Response('Native route not found', { status: 404 });
|
|
132
|
+
if (url.searchParams.get('case') === 'error')
|
|
133
|
+
throw new Error('Native loader failure');
|
|
134
|
+
if (url.searchParams.get('case') === 'redirect')
|
|
135
|
+
return new Response(null, { status: 302, headers: { location: '/about' } });
|
|
136
|
+
return {
|
|
137
|
+
message: 'Native loader value',
|
|
138
|
+
privateValue: request.headers.get('x-conformance-private'),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function action({ request }: DataHandlerInput) {
|
|
143
|
+
return request.formData().then(form => {
|
|
144
|
+
const name = form.get('name');
|
|
145
|
+
if (typeof name !== 'string' || name.trim().length === 0)
|
|
146
|
+
return Response.json(
|
|
147
|
+
{ fieldErrors: { name: 'Name required' } },
|
|
148
|
+
{ status: 422 },
|
|
149
|
+
);
|
|
150
|
+
if (form.get('intent') === 'redirect')
|
|
151
|
+
return new Response(null, {
|
|
152
|
+
status: 303,
|
|
153
|
+
headers: {
|
|
154
|
+
location: '/about',
|
|
155
|
+
'set-cookie': 'conformance-saved=1; Path=/; SameSite=Lax',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
if (form.get('intent') === 'throw') throw new Error('Native action failure');
|
|
159
|
+
return {
|
|
160
|
+
saved: name,
|
|
161
|
+
privateValue: request.headers.get('x-conformance-private'),
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
`
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
path: 'src/routes/error.tsx',
|
|
169
|
+
content: `import type { ErrorRouteComponent } from '@modern-js/renderer-solid/router';
|
|
170
|
+
|
|
171
|
+
const ErrorBoundary: ErrorRouteComponent = props => (
|
|
172
|
+
<section data-testid="native-error">
|
|
173
|
+
<h1>Something went wrong</h1>
|
|
174
|
+
<output>
|
|
175
|
+
{props.error instanceof Error ? props.error.message : String(props.error)}
|
|
176
|
+
</output>
|
|
177
|
+
</section>
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
export default ErrorBoundary;
|
|
181
|
+
`
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
path: 'src/routes/not-found.tsx',
|
|
185
|
+
content: `import type { NotFoundRouteComponent } from '@modern-js/renderer-solid/router';
|
|
186
|
+
|
|
187
|
+
const NotFound: NotFoundRouteComponent = () => (
|
|
188
|
+
<section data-testid="native-not-found">
|
|
189
|
+
<h1>Page not found</h1>
|
|
190
|
+
</section>
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
export default NotFound;
|
|
194
|
+
`
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
path: 'src/components/Counter.tsx',
|
|
198
|
+
content: `import type { JSX } from '@solidjs/web';
|
|
199
|
+
import { createSignal } from 'solid-js';
|
|
200
|
+
|
|
201
|
+
export default function Counter(): JSX.Element {
|
|
202
|
+
const [count, setCount] = createSignal(0);
|
|
203
|
+
return (
|
|
204
|
+
<section data-testid="native-edited-component">
|
|
205
|
+
<span data-testid="native-hmr-marker">Counter before native edit</span>
|
|
206
|
+
<button type="button" onClick={() => setCount(count() + 1)}>
|
|
207
|
+
Increment
|
|
208
|
+
</button>
|
|
209
|
+
<output data-testid="native-count">{count()}</output>
|
|
210
|
+
</section>
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
`
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
path: 'src/components/Stable.tsx',
|
|
217
|
+
content: `import type { JSX } from '@solidjs/web';
|
|
218
|
+
import { createSignal } from 'solid-js';
|
|
219
|
+
|
|
220
|
+
export default function Stable(): JSX.Element {
|
|
221
|
+
const [count, setCount] = createSignal(0);
|
|
222
|
+
return (
|
|
223
|
+
<section data-testid="native-unaffected-component">
|
|
224
|
+
<button type="button" onClick={() => setCount(count() + 1)}>
|
|
225
|
+
Increment stable state
|
|
226
|
+
</button>
|
|
227
|
+
<output data-testid="native-unaffected-count">{count()}</output>
|
|
228
|
+
</section>
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
`
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
export { generateSolidAppSources };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import node_path from "node:path";
|
|
2
|
+
import { defineRendererAdapter, nativeRendererDependencies } from "@modern-js/renderer-core/adapter";
|
|
3
|
+
import { compilerArtifacts } from "../manifest.js";
|
|
4
|
+
import { pluginSolidRenderer, pluginSourceDirectory } from "./compiler.js";
|
|
5
|
+
import { generateSolidAppSources } from "./create.js";
|
|
6
|
+
import { solidProfile } from "./profile.js";
|
|
7
|
+
const rendererAdapter = defineRendererAdapter({
|
|
8
|
+
name: 'solid',
|
|
9
|
+
kind: 'native',
|
|
10
|
+
profile: solidProfile,
|
|
11
|
+
routerFrameworks: [
|
|
12
|
+
'solid'
|
|
13
|
+
],
|
|
14
|
+
runtime: {
|
|
15
|
+
package: 'solid-js',
|
|
16
|
+
bootstrap: '@modern-js/renderer-solid',
|
|
17
|
+
entryClient: '@modern-js/renderer-solid/entry-client',
|
|
18
|
+
entryServer: '@modern-js/renderer-solid/entry-server',
|
|
19
|
+
router: '@modern-js/renderer-solid/router',
|
|
20
|
+
i18n: '@modern-js/renderer-solid/i18n',
|
|
21
|
+
manifest: '@modern-js/renderer-solid/manifest'
|
|
22
|
+
},
|
|
23
|
+
federation: {
|
|
24
|
+
library: 'module',
|
|
25
|
+
ssr: true,
|
|
26
|
+
shared: [
|
|
27
|
+
'solid-js',
|
|
28
|
+
'@solidjs/web',
|
|
29
|
+
'@solidjs/signals',
|
|
30
|
+
'@modern-js/renderer-solid',
|
|
31
|
+
'@modern-js/renderer-solid/client',
|
|
32
|
+
'@modern-js/renderer-solid/router',
|
|
33
|
+
'@modern-js/renderer-solid/federation',
|
|
34
|
+
'@modern-js/renderer-core',
|
|
35
|
+
'@modern-js/renderer-core/',
|
|
36
|
+
'@tanstack/router-core',
|
|
37
|
+
'@tanstack/history'
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
worker: {
|
|
41
|
+
nativeDocuments: true,
|
|
42
|
+
rsc: false
|
|
43
|
+
},
|
|
44
|
+
lazyStyles: 'renderer',
|
|
45
|
+
svgComponentTemplate: ()=>node_path.join(pluginSourceDirectory(), 'svg-component-template.cjs'),
|
|
46
|
+
compiler: pluginSolidRenderer,
|
|
47
|
+
artifacts: compilerArtifacts,
|
|
48
|
+
create: {
|
|
49
|
+
templates: {
|
|
50
|
+
federation: true,
|
|
51
|
+
workers: false
|
|
52
|
+
},
|
|
53
|
+
dependencies: (profile)=>({
|
|
54
|
+
frameworkDependencies: [
|
|
55
|
+
'@modern-js/renderer-core',
|
|
56
|
+
'@modern-js/renderer-solid'
|
|
57
|
+
],
|
|
58
|
+
dependencies: {
|
|
59
|
+
...nativeRendererDependencies(profile),
|
|
60
|
+
'solid-js': profile.hydration.version,
|
|
61
|
+
'@solidjs/signals': profile.hydration.version
|
|
62
|
+
},
|
|
63
|
+
devDependencies: {
|
|
64
|
+
[profile.compiler.name]: profile.compiler.version
|
|
65
|
+
}
|
|
66
|
+
}),
|
|
67
|
+
generateAppSources: generateSolidAppSources
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
export { rendererAdapter };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const solidProfile = {
|
|
2
|
+
renderer: 'solid',
|
|
3
|
+
status: 'preview',
|
|
4
|
+
protocolVersion: 1,
|
|
5
|
+
minimumNode: '26.12.0',
|
|
6
|
+
hmr: {
|
|
7
|
+
editedBoundary: 'may-reset',
|
|
8
|
+
unaffectedComponents: 'preserved',
|
|
9
|
+
document: 'preserved',
|
|
10
|
+
roots: 'single',
|
|
11
|
+
cleanup: 'exactly-once'
|
|
12
|
+
},
|
|
13
|
+
compiler: {
|
|
14
|
+
name: '@solidjs/compiler',
|
|
15
|
+
version: '2.0.0-rc.15'
|
|
16
|
+
},
|
|
17
|
+
hydration: {
|
|
18
|
+
name: '@solidjs/web',
|
|
19
|
+
version: '2.0.0-rc.15'
|
|
20
|
+
},
|
|
21
|
+
router: {
|
|
22
|
+
name: '@modern-js/renderer-solid',
|
|
23
|
+
version: '3.8.3',
|
|
24
|
+
coreName: '@tanstack/router-core',
|
|
25
|
+
coreVersion: '1.171.38'
|
|
26
|
+
},
|
|
27
|
+
sourceExtensions: [
|
|
28
|
+
'.tsx',
|
|
29
|
+
'.ts',
|
|
30
|
+
'.jsx',
|
|
31
|
+
'.js'
|
|
32
|
+
],
|
|
33
|
+
jsxImportSource: '@solidjs/web',
|
|
34
|
+
dependencies: {
|
|
35
|
+
'@tanstack/router-core': 'https://github.com/BleedingDev/router/releases/download/ultramodern-router-core-585d3233f7f5/tanstack-router-core-1.171.38.tgz',
|
|
36
|
+
'solid-js': '2.0.0-rc.15',
|
|
37
|
+
'@solidjs/web': '2.0.0-rc.15',
|
|
38
|
+
'@solidjs/signals': '2.0.0-rc.15',
|
|
39
|
+
'@solidjs/compiler': '2.0.0-rc.15',
|
|
40
|
+
'@modern-js/renderer-solid': '3.8.3'
|
|
41
|
+
},
|
|
42
|
+
capabilities: {
|
|
43
|
+
worker: true,
|
|
44
|
+
moduleFederation: true,
|
|
45
|
+
rsc: false,
|
|
46
|
+
ssg: true,
|
|
47
|
+
i18n: true,
|
|
48
|
+
svgComponent: true
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export { solidProfile };
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { DataProtocolError } from "@modern-js/renderer-core/data";
|
|
2
|
+
import { Dynamic } from "@solidjs/web";
|
|
3
|
+
import { createEffect, createMemo, createSignal, onCleanup } from "solid-js";
|
|
4
|
+
import { createRouter, preparePublicContextData, useMatch } from "./router-binding/index.js";
|
|
5
|
+
import { assertNativeSerializationOptions, registerPublicRouteDataOwner } from "./router-binding/registryTransfer.js";
|
|
6
|
+
var _m$ = Symbol();
|
|
7
|
+
var _d$ = {
|
|
8
|
+
get () {
|
|
9
|
+
const ready = this[_m$];
|
|
10
|
+
return ready();
|
|
11
|
+
},
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true
|
|
14
|
+
};
|
|
15
|
+
function _P$(_p) {
|
|
16
|
+
this[_m$] = _p;
|
|
17
|
+
Object.defineProperty(this, "component", _d$);
|
|
18
|
+
}
|
|
19
|
+
_P$.prototype = Object.prototype;
|
|
20
|
+
const routeScopes = new WeakMap();
|
|
21
|
+
const routerScopes = new WeakMap();
|
|
22
|
+
function assertManagedRouteData(route) {
|
|
23
|
+
if (!route) return;
|
|
24
|
+
if (route.options.loader || route.options.beforeLoad || route.options.context) throw new DataProtocolError("Custom native Solid loader/beforeLoad/context routes are unsupported by the immutable public-data profile; use createFileSystemRouteTree");
|
|
25
|
+
for (const child of route.children ?? [])assertManagedRouteData(child);
|
|
26
|
+
}
|
|
27
|
+
function registerRouteCompletionScope(route, scope) {
|
|
28
|
+
routeScopes.set(route, scope);
|
|
29
|
+
}
|
|
30
|
+
const createApplicationRouter = (options)=>{
|
|
31
|
+
assertNativeSerializationOptions(options);
|
|
32
|
+
const scope = options.routeTree ? routeScopes.get(options.routeTree) : void 0;
|
|
33
|
+
if (!scope) assertManagedRouteData(options.routeTree);
|
|
34
|
+
if (scope && options.routeTree) registerPublicRouteDataOwner(options.routeTree, scope.hydrationOwner, scope.privateRoots);
|
|
35
|
+
const context = preparePublicContextData(options.context, scope?.hydrationOwner);
|
|
36
|
+
if (void 0 !== context && (!context || "object" != typeof context || Array.isArray(context))) throw new DataProtocolError("The native Solid router context must be a public record");
|
|
37
|
+
const router = createRouter({
|
|
38
|
+
...options,
|
|
39
|
+
context
|
|
40
|
+
});
|
|
41
|
+
if (scope) {
|
|
42
|
+
scope.attach(router);
|
|
43
|
+
routerScopes.set(router, scope);
|
|
44
|
+
}
|
|
45
|
+
return router;
|
|
46
|
+
};
|
|
47
|
+
function ownApplicationRouteData(router) {
|
|
48
|
+
const scope = routerScopes.get(router);
|
|
49
|
+
if (scope) onCleanup(()=>scope.dispose());
|
|
50
|
+
else assertManagedRouteData(router.options.routeTree);
|
|
51
|
+
}
|
|
52
|
+
function createRouteCompletionScope(privateRoots = [], session) {
|
|
53
|
+
const records = new WeakMap();
|
|
54
|
+
const pending = new Set();
|
|
55
|
+
const hydration = new AbortController();
|
|
56
|
+
let router;
|
|
57
|
+
function begin(signal, cancel) {
|
|
58
|
+
if (!router) throw new Error("Use createApplicationRouter to own progressive Solid route data");
|
|
59
|
+
const [failure, setFailure] = createSignal();
|
|
60
|
+
const native = router;
|
|
61
|
+
let value;
|
|
62
|
+
let leases = 0;
|
|
63
|
+
let settled = false;
|
|
64
|
+
let failed = false;
|
|
65
|
+
const stop = ()=>{
|
|
66
|
+
if (!settled) {
|
|
67
|
+
pending.delete(stop);
|
|
68
|
+
if (value && "object" == typeof value) native.clearCache({
|
|
69
|
+
filter: (match)=>match.loaderData === value
|
|
70
|
+
});
|
|
71
|
+
cancel();
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const fail = (reason)=>{
|
|
75
|
+
if (failed) return;
|
|
76
|
+
failed = true;
|
|
77
|
+
settled = true;
|
|
78
|
+
pending.delete(stop);
|
|
79
|
+
if (value && "object" == typeof value) native.clearCache({
|
|
80
|
+
filter: (match)=>match.loaderData === value
|
|
81
|
+
});
|
|
82
|
+
setFailure({
|
|
83
|
+
reason
|
|
84
|
+
});
|
|
85
|
+
cancel();
|
|
86
|
+
};
|
|
87
|
+
const record = {
|
|
88
|
+
failure,
|
|
89
|
+
acquire () {
|
|
90
|
+
leases++;
|
|
91
|
+
let released = false;
|
|
92
|
+
return ()=>{
|
|
93
|
+
if (released) return;
|
|
94
|
+
released = true;
|
|
95
|
+
if (0 === --leases && !native.state.matches.some((match)=>match.loaderData === value)) stop();
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
owner: {
|
|
101
|
+
signal,
|
|
102
|
+
fail
|
|
103
|
+
},
|
|
104
|
+
publish (publicValue, completion) {
|
|
105
|
+
value = publicValue;
|
|
106
|
+
const deferred = value && "object" == typeof value ? Reflect.ownKeys(value).flatMap((key)=>{
|
|
107
|
+
const entry = Object.getOwnPropertyDescriptor(value, key);
|
|
108
|
+
return entry && !entry.get && entry.value instanceof Promise ? [
|
|
109
|
+
entry.value
|
|
110
|
+
] : [];
|
|
111
|
+
}) : [];
|
|
112
|
+
if (!completion && 0 === deferred.length) return;
|
|
113
|
+
if (value && "object" == typeof value) {
|
|
114
|
+
records.set(value, record);
|
|
115
|
+
pending.add(stop);
|
|
116
|
+
} else if (completion) throw new DataProtocolError("Progressive route data requires its native value object");
|
|
117
|
+
if (completion) completion.then(()=>{
|
|
118
|
+
settled = true;
|
|
119
|
+
pending.delete(stop);
|
|
120
|
+
}, fail);
|
|
121
|
+
else Promise.allSettled(deferred).then(()=>{
|
|
122
|
+
settled = true;
|
|
123
|
+
pending.delete(stop);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
privateRoots,
|
|
130
|
+
hydrationOwner: session ?? {
|
|
131
|
+
signal: hydration.signal,
|
|
132
|
+
fail: (error)=>hydration.abort(error)
|
|
133
|
+
},
|
|
134
|
+
attach (native) {
|
|
135
|
+
if (router && router !== native) throw new Error("A Solid data scope already owns its native router");
|
|
136
|
+
router = native;
|
|
137
|
+
},
|
|
138
|
+
begin,
|
|
139
|
+
component (component) {
|
|
140
|
+
return function() {
|
|
141
|
+
const record = useMatch({
|
|
142
|
+
strict: false,
|
|
143
|
+
select: (match)=>match.loaderData && "object" == typeof match.loaderData ? records.get(match.loaderData) : void 0
|
|
144
|
+
});
|
|
145
|
+
createEffect(record, (current)=>current?.acquire());
|
|
146
|
+
const ready = createMemo(()=>{
|
|
147
|
+
const failure = record()?.failure();
|
|
148
|
+
if (failure) throw failure.reason;
|
|
149
|
+
return component;
|
|
150
|
+
});
|
|
151
|
+
return Dynamic(new _P$(ready));
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
dispose () {
|
|
155
|
+
hydration.abort();
|
|
156
|
+
for (const stop of pending)stop();
|
|
157
|
+
pending.clear();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export { createApplicationRouter, createRouteCompletionScope, ownApplicationRouteData, registerRouteCompletionScope };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DataProtocolError, assertPublicData } from "@modern-js/renderer-core/data";
|
|
2
|
+
import { RouteDataError } from "@modern-js/renderer-core/router";
|
|
3
|
+
function invalid(message) {
|
|
4
|
+
throw new DataProtocolError(message);
|
|
5
|
+
}
|
|
6
|
+
function publicFields(value, required, optional = [], allowStackAccessor = false) {
|
|
7
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
8
|
+
for (const key of Reflect.ownKeys(descriptors)){
|
|
9
|
+
if ("string" != typeof key || !required.includes(key) && !optional.includes(key)) invalid("Route data errors must not contain undeclared fields");
|
|
10
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
11
|
+
if (descriptor.get || descriptor.set) {
|
|
12
|
+
if (allowStackAccessor && "stack" === key) continue;
|
|
13
|
+
invalid("Route data errors must not contain accessors");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
for (const key of required)if (!Object.hasOwn(descriptors, key)) invalid("Route data errors are missing a declared field");
|
|
17
|
+
return descriptors;
|
|
18
|
+
}
|
|
19
|
+
function validateFields(routeId, status, name, message) {
|
|
20
|
+
if ("string" != typeof routeId || 0 === routeId.length) invalid("Route data errors require a nonempty route identifier");
|
|
21
|
+
if ("number" != typeof status || !Number.isInteger(status) || status < 200 || status > 599) invalid("Route data errors require a valid public HTTP status");
|
|
22
|
+
if ("string" != typeof name || "string" != typeof message) invalid("Route data errors require public name and message strings");
|
|
23
|
+
return {
|
|
24
|
+
routeId,
|
|
25
|
+
status,
|
|
26
|
+
name,
|
|
27
|
+
message
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function projectRouteDataError(error, production = true) {
|
|
31
|
+
if (!error || "object" != typeof error || Object.getPrototypeOf(error) !== RouteDataError.prototype) invalid("Only the exact RouteDataError class has a route error projection");
|
|
32
|
+
const descriptors = publicFields(error, [
|
|
33
|
+
"routeId",
|
|
34
|
+
"status",
|
|
35
|
+
"data",
|
|
36
|
+
"name",
|
|
37
|
+
"message"
|
|
38
|
+
], [
|
|
39
|
+
"stack"
|
|
40
|
+
], true);
|
|
41
|
+
const routeId = descriptors.routeId.value;
|
|
42
|
+
const status = descriptors.status.value;
|
|
43
|
+
const name = descriptors.name.value;
|
|
44
|
+
const message = descriptors.message.value;
|
|
45
|
+
const fields = validateFields(routeId, status, name, message);
|
|
46
|
+
const snapshot = {
|
|
47
|
+
kind: "ultramodern-route-data-error",
|
|
48
|
+
version: 1,
|
|
49
|
+
routeId: fields.routeId,
|
|
50
|
+
status: fields.status,
|
|
51
|
+
data: descriptors.data.value,
|
|
52
|
+
error: {
|
|
53
|
+
name: fields.name,
|
|
54
|
+
message: fields.message
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const stack = descriptors.stack;
|
|
58
|
+
if (stack && !stack.get && !stack.set) {
|
|
59
|
+
if ("string" != typeof stack.value) invalid("Route data error stacks must be strings");
|
|
60
|
+
if (!production) snapshot.error.stack = stack.value;
|
|
61
|
+
}
|
|
62
|
+
assertPublicData(snapshot);
|
|
63
|
+
return snapshot;
|
|
64
|
+
}
|
|
65
|
+
function plainRecord(value) {
|
|
66
|
+
if (!value || "object" != typeof value) invalid("Malformed route data error snapshot");
|
|
67
|
+
const prototype = Object.getPrototypeOf(value);
|
|
68
|
+
if (prototype !== Object.prototype && null !== prototype) invalid("Route data error snapshots require plain records");
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
function restoreRouteDataError(snapshot) {
|
|
72
|
+
const descriptors = publicFields(plainRecord(snapshot), [
|
|
73
|
+
"kind",
|
|
74
|
+
"version",
|
|
75
|
+
"routeId",
|
|
76
|
+
"status",
|
|
77
|
+
"data",
|
|
78
|
+
"error"
|
|
79
|
+
]);
|
|
80
|
+
if ("ultramodern-route-data-error" !== descriptors.kind.value || 1 !== descriptors.version.value) invalid("Unsupported route data error snapshot");
|
|
81
|
+
const error = publicFields(plainRecord(descriptors.error.value), [
|
|
82
|
+
"name",
|
|
83
|
+
"message"
|
|
84
|
+
], [
|
|
85
|
+
"stack"
|
|
86
|
+
]);
|
|
87
|
+
const routeId = descriptors.routeId.value;
|
|
88
|
+
const fields = validateFields(routeId, descriptors.status.value, error.name.value, error.message.value);
|
|
89
|
+
if (error.stack && "string" != typeof error.stack.value) invalid("Route data error stacks must be strings");
|
|
90
|
+
assertPublicData(snapshot);
|
|
91
|
+
const restored = new RouteDataError(fields.routeId, {
|
|
92
|
+
kind: "error",
|
|
93
|
+
status: fields.status,
|
|
94
|
+
data: descriptors.data.value,
|
|
95
|
+
error: {
|
|
96
|
+
name: fields.name,
|
|
97
|
+
message: fields.message
|
|
98
|
+
},
|
|
99
|
+
thrown: true
|
|
100
|
+
});
|
|
101
|
+
if (error.stack) Object.defineProperty(restored, "stack", {
|
|
102
|
+
value: error.stack.value,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true
|
|
105
|
+
});
|
|
106
|
+
return restored;
|
|
107
|
+
}
|
|
108
|
+
export { projectRouteDataError, restoreRouteDataError };
|