toiljs 0.0.15 → 0.0.19
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/.babelrc +13 -13
- package/.gitattributes +2 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
- package/.github/ISSUE_TEMPLATE/bug_report.yml +90 -90
- package/.github/ISSUE_TEMPLATE/config.yml +8 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/PULL_REQUEST_TEMPLATE.md +43 -43
- package/.github/changelog-config.json +45 -45
- package/.github/dependabot.yml +27 -27
- package/.github/workflows/ci.yml +191 -191
- package/.prettierrc.json +11 -11
- package/.vscode/settings.json +9 -9
- package/CHANGELOG.md +116 -5
- package/LICENSE +187 -187
- package/README.md +524 -315
- package/as-pect.asconfig.json +34 -34
- package/as-pect.config.js +65 -65
- package/assets/logo.svg +36 -36
- package/build/backend/.tsbuildinfo +1 -1
- package/build/backend/index.d.ts +1 -0
- package/build/backend/index.js +20 -1
- package/build/cli/.tsbuildinfo +1 -1
- package/build/cli/index.js +1320 -696
- package/build/client/.tsbuildinfo +1 -1
- package/build/client/dev/devtools.d.ts +6 -0
- package/build/client/dev/devtools.js +479 -0
- package/build/client/dev/error-overlay.d.ts +9 -0
- package/build/client/dev/error-overlay.js +19 -4
- package/build/client/errors.d.ts +1 -0
- package/build/client/errors.js +3 -0
- package/build/client/index.d.ts +2 -0
- package/build/client/index.js +2 -0
- package/build/client/navigation/prefetch.d.ts +1 -0
- package/build/client/navigation/prefetch.js +35 -0
- package/build/client/routing/Router.js +1 -1
- package/build/client/routing/hooks.js +6 -2
- package/build/client/routing/loader.d.ts +23 -0
- package/build/client/routing/loader.js +53 -7
- package/build/client/routing/mount.js +4 -3
- package/build/client/rpc.d.ts +1 -0
- package/build/client/rpc.js +37 -0
- package/build/compiler/.tsbuildinfo +1 -1
- package/build/compiler/config.d.ts +16 -0
- package/build/compiler/config.js +9 -0
- package/build/compiler/docs.js +78 -21
- package/build/compiler/generate.js +5 -4
- package/build/compiler/index.d.ts +3 -2
- package/build/compiler/index.js +2 -2
- package/build/compiler/plugin.js +228 -0
- package/build/compiler/prerender.d.ts +1 -0
- package/build/compiler/prerender.js +1 -1
- package/build/compiler/seo.d.ts +1 -1
- package/build/compiler/seo.js +20 -5
- package/build/compiler/ssg.js +39 -2
- package/build/compiler/vite.js +25 -0
- package/build/io/.tsbuildinfo +1 -1
- package/build/io/codec.d.ts +54 -0
- package/build/io/codec.js +143 -0
- package/build/io/index.d.ts +1 -2
- package/build/io/index.js +1 -2
- package/build/logger/.tsbuildinfo +1 -1
- package/build/shared/.tsbuildinfo +1 -1
- package/eslint.config.js +48 -48
- package/examples/basic/client/404.tsx +11 -11
- package/examples/basic/client/components/.gitkeep +1 -1
- package/examples/basic/client/global-error.tsx +13 -13
- package/examples/basic/client/layout.tsx +25 -25
- package/examples/basic/client/public/images/.gitkeep +1 -1
- package/examples/basic/client/public/images/logo.svg +36 -36
- package/examples/basic/client/public/robots.txt +2 -2
- package/examples/basic/client/routes/docs/[...slug].tsx +12 -12
- package/examples/basic/client/routes/features/error/error.tsx +16 -16
- package/examples/basic/client/routes/features/index.tsx +1 -1
- package/examples/basic/client/routes/features/template/b.tsx +14 -14
- package/examples/basic/client/routes/files/[[...slug]].tsx +21 -21
- package/examples/basic/client/routes/gallery/layout.tsx +13 -13
- package/examples/basic/client/routes/io.tsx +23 -24
- package/examples/basic/client/routes/loader-demo/loading.tsx +13 -13
- package/examples/basic/client/routes/rest.tsx +74 -0
- package/examples/basic/client/routes/rpc.tsx +43 -0
- package/examples/basic/client/routes/search.tsx +61 -61
- package/examples/basic/client/toil.tsx +5 -5
- package/package.json +167 -148
- package/presets/eslint.js +88 -88
- package/presets/no-uint8array-tostring.js +200 -200
- package/presets/prettier-plugin.js +51 -0
- package/presets/prettier.json +19 -18
- package/presets/tsconfig.json +37 -37
- package/server/runtime/README.md +97 -0
- package/server/runtime/abort/abort.ts +27 -0
- package/server/runtime/env/Server.ts +61 -0
- package/server/runtime/envelope.ts +191 -0
- package/server/runtime/exports/index.ts +52 -0
- package/server/runtime/handlers/ToilHandler.ts +34 -0
- package/server/runtime/index.ts +26 -0
- package/server/runtime/lang/Potential.ts +5 -0
- package/server/runtime/memory.ts +81 -0
- package/server/runtime/request.ts +55 -0
- package/server/runtime/response.ts +86 -0
- package/server/runtime/rest/Rest.ts +39 -0
- package/server/runtime/rest/RestHandler.ts +20 -0
- package/server/runtime/rest/RouteContext.ts +82 -0
- package/server/runtime/rest/match.ts +48 -0
- package/server/runtime/tsconfig.json +7 -0
- package/src/backend/index.ts +202 -160
- package/src/cli/create.ts +15 -5
- package/src/cli/diagnostics.ts +81 -0
- package/src/cli/doctor.ts +384 -7
- package/src/cli/index.ts +11 -2
- package/src/cli/proc.ts +50 -50
- package/src/cli/updates.ts +69 -69
- package/src/cli/validate.ts +31 -31
- package/src/client/channel/channel.ts +146 -146
- package/src/client/components/Form.tsx +65 -65
- package/src/client/components/Script.tsx +113 -113
- package/src/client/components/Slot.tsx +21 -21
- package/src/client/dev/devtools.tsx +1018 -0
- package/src/client/dev/error-overlay.tsx +30 -4
- package/src/client/errors.ts +11 -0
- package/src/client/head/head.ts +167 -167
- package/src/client/head/metadata.ts +112 -112
- package/src/client/index.ts +91 -89
- package/src/client/navigation/NavLink.tsx +86 -86
- package/src/client/navigation/navigation.ts +235 -235
- package/src/client/navigation/prefetch.ts +169 -130
- package/src/client/navigation/scroll.ts +53 -53
- package/src/client/routing/Router.tsx +8 -2
- package/src/client/routing/action.ts +122 -122
- package/src/client/routing/error-boundary.tsx +43 -43
- package/src/client/routing/hooks.ts +21 -6
- package/src/client/routing/loader.ts +325 -235
- package/src/client/routing/match.ts +47 -47
- package/src/client/routing/mount.tsx +54 -52
- package/src/client/routing/params-context.ts +10 -10
- package/src/client/routing/slot-context.ts +7 -7
- package/src/client/rpc.ts +64 -0
- package/src/client/search/search.ts +189 -189
- package/src/client/search/use-page-search.ts +73 -73
- package/src/client/types.ts +73 -73
- package/src/compiler/config.ts +221 -182
- package/src/compiler/docs.ts +285 -228
- package/src/compiler/generate.ts +395 -394
- package/src/compiler/index.ts +66 -57
- package/src/compiler/pages.ts +70 -70
- package/src/compiler/plugin.ts +258 -2
- package/src/compiler/prerender.ts +156 -156
- package/src/compiler/seo.ts +417 -390
- package/src/compiler/ssg.ts +171 -126
- package/src/compiler/vite.ts +34 -0
- package/src/io/FastMap.ts +151 -127
- package/src/io/FastSet.ts +15 -1
- package/src/io/codec.ts +217 -0
- package/src/io/index.ts +10 -11
- package/src/io/lengths.ts +14 -14
- package/src/io/types.ts +19 -18
- package/src/logger/index.ts +22 -22
- package/src/shared/index.ts +10 -10
- package/std/client/index.d.ts +15 -15
- package/std/client/package.json +3 -3
- package/test/assembly/example.spec.ts +17 -7
- package/test/channel.test.ts +21 -21
- package/test/doctor.test.ts +65 -0
- package/test/dom/Link.test.tsx +47 -47
- package/test/dom/NavLink.test.tsx +37 -37
- package/test/dom/error-overlay.test.tsx +44 -44
- package/test/dom/loader.test.tsx +121 -121
- package/test/dom/navigation.test.ts +59 -59
- package/test/dom/revalidate.test.tsx +38 -38
- package/test/dom/route-head.test.tsx +78 -78
- package/test/dom/router-loading.test.tsx +44 -44
- package/test/dom/scroll.test.ts +56 -56
- package/test/dom/use-metadata.test.tsx +58 -58
- package/test/errors.test.ts +21 -0
- package/test/io.test.ts +117 -93
- package/test/navlink.test.ts +28 -28
- package/test/placeholder.test.ts +9 -9
- package/test/prettier-plugin.test.ts +46 -0
- package/test/routes.test.ts +76 -76
- package/test/rpc.test.ts +50 -0
- package/test/seo.test.ts +175 -164
- package/test/slot-layouts.test.ts +69 -69
- package/test/ssg.test.ts +36 -36
- package/test/update.test.ts +44 -44
- package/test/validate.test.ts +42 -42
- package/tests/data-parity/generated-parity.ts +99 -0
- package/tests/data-parity/parity.ts +80 -0
- package/tests/data-parity/spec.ts +46 -0
- package/toil-routes.d.ts +7 -0
- package/tsconfig.backend.json +13 -13
- package/tsconfig.base.json +35 -35
- package/tsconfig.cli.json +13 -13
- package/tsconfig.client.json +14 -14
- package/tsconfig.compiler.json +13 -13
- package/tsconfig.io.json +12 -12
- package/tsconfig.json +22 -22
- package/tsconfig.logger.json +12 -12
- package/tsconfig.server.json +10 -10
- package/tsconfig.shared.json +12 -12
- package/vitest.config.ts +26 -26
- package/.idea/codeStyles/Project.xml +0 -54
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/inspectionProfiles/Project_Default.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -7
- package/.idea/toiljs.iml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.toil/entry.tsx +0 -9
- package/.toil/index.html +0 -12
- package/.toil/routes.ts +0 -9
- package/build/cli/configure.d.ts +0 -16
- package/build/cli/configure.js +0 -272
- package/build/cli/create.d.ts +0 -16
- package/build/cli/create.js +0 -420
- package/build/cli/diagnostics.d.ts +0 -55
- package/build/cli/diagnostics.js +0 -333
- package/build/cli/doctor.d.ts +0 -6
- package/build/cli/doctor.js +0 -249
- package/build/cli/features.d.ts +0 -25
- package/build/cli/features.js +0 -107
- package/build/cli/index.d.ts +0 -2
- package/build/cli/proc.d.ts +0 -6
- package/build/cli/proc.js +0 -31
- package/build/cli/ui.d.ts +0 -9
- package/build/cli/ui.js +0 -75
- package/build/cli/update.d.ts +0 -7
- package/build/cli/update.js +0 -117
- package/build/cli/updates.d.ts +0 -10
- package/build/cli/updates.js +0 -45
- package/build/cli/validate.d.ts +0 -4
- package/build/cli/validate.js +0 -19
- package/build/client/Link.d.ts +0 -8
- package/build/client/Link.js +0 -44
- package/build/client/NavLink.d.ts +0 -14
- package/build/client/NavLink.js +0 -37
- package/build/client/Router.d.ts +0 -7
- package/build/client/Router.js +0 -55
- package/build/client/channel.d.ts +0 -23
- package/build/client/channel.js +0 -94
- package/build/client/error-boundary.d.ts +0 -16
- package/build/client/error-boundary.js +0 -19
- package/build/client/head.d.ts +0 -26
- package/build/client/head.js +0 -87
- package/build/client/hooks.d.ts +0 -17
- package/build/client/hooks.js +0 -48
- package/build/client/lazy.d.ts +0 -16
- package/build/client/lazy.js +0 -53
- package/build/client/match.d.ts +0 -2
- package/build/client/match.js +0 -32
- package/build/client/mount.d.ts +0 -2
- package/build/client/mount.js +0 -13
- package/build/client/navigation.d.ts +0 -13
- package/build/client/navigation.js +0 -97
- package/build/client/params-context.d.ts +0 -2
- package/build/client/params-context.js +0 -2
- package/build/client/prefetch.d.ts +0 -11
- package/build/client/prefetch.js +0 -100
- package/build/client/runtime.d.ts +0 -31
- package/build/client/runtime.js +0 -112
- package/build/client/scroll.d.ts +0 -8
- package/build/client/scroll.js +0 -36
- package/build/io/BinaryReader.d.ts +0 -44
- package/build/io/BinaryReader.js +0 -244
- package/build/io/BinaryWriter.d.ts +0 -44
- package/build/io/BinaryWriter.js +0 -297
- package/build/server/release.wasm +0 -0
- package/build/server/release.wat +0 -9
- package/src/io/BinaryReader.ts +0 -340
- package/src/io/BinaryWriter.ts +0 -385
- package/src/server/index.ts +0 -10
- package/src/server/main.ts +0 -13
- package/src/server/tsconfig.json +0 -4
- package/toil-env.d.ts +0 -16
- package/toilconfig.json +0 -30
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/** Extracted dynamic route parameters, e.g. `{ id: "42" }` for `/blog/:id` matching `/blog/42`. */
|
|
2
|
-
export type RouteParams = Record<string, string>;
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Matches a route pattern against a pathname, returning extracted params or `null` if no match.
|
|
6
|
-
* Pure and runtime-agnostic (used by the router and unit-tested directly).
|
|
7
|
-
* matchRoute('/', '/') -> {}
|
|
8
|
-
* matchRoute('/blog/:id', '/blog/42') -> { id: '42' }
|
|
9
|
-
* matchRoute('/docs/*slug', '/docs/a/b') -> { slug: 'a/b' } (catch-all, 1+ segments)
|
|
10
|
-
* matchRoute('/docs/**slug', '/docs') -> { slug: '' } (optional catch-all, 0+ segments)
|
|
11
|
-
* matchRoute('/about', '/x') -> null
|
|
12
|
-
*/
|
|
13
|
-
export function matchRoute(pattern: string, pathname: string): RouteParams | null {
|
|
14
|
-
const patternSegs = pattern.split('/').filter(Boolean);
|
|
15
|
-
const pathSegs = pathname.split('/').filter(Boolean);
|
|
16
|
-
|
|
17
|
-
const params: RouteParams = {};
|
|
18
|
-
for (let i = 0; i < patternSegs.length; i++) {
|
|
19
|
-
const p = patternSegs[i];
|
|
20
|
-
|
|
21
|
-
// Optional catch-all (`**slug`): captures the rest of the path, matching zero or more segments.
|
|
22
|
-
if (p.startsWith('**')) {
|
|
23
|
-
params[p.slice(2)] = pathSegs
|
|
24
|
-
.slice(i)
|
|
25
|
-
.map((s) => decodeURIComponent(s))
|
|
26
|
-
.join('/');
|
|
27
|
-
return params;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (p.startsWith('*')) {
|
|
31
|
-
const rest = pathSegs.slice(i);
|
|
32
|
-
if (rest.length === 0) return null;
|
|
33
|
-
params[p.slice(1)] = rest.map((s) => decodeURIComponent(s)).join('/');
|
|
34
|
-
return params;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (i >= pathSegs.length) return null;
|
|
38
|
-
const value = pathSegs[i];
|
|
39
|
-
if (p.startsWith(':')) {
|
|
40
|
-
params[p.slice(1)] = decodeURIComponent(value);
|
|
41
|
-
} else if (p !== value) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return patternSegs.length === pathSegs.length ? params : null;
|
|
47
|
-
}
|
|
1
|
+
/** Extracted dynamic route parameters, e.g. `{ id: "42" }` for `/blog/:id` matching `/blog/42`. */
|
|
2
|
+
export type RouteParams = Record<string, string>;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Matches a route pattern against a pathname, returning extracted params or `null` if no match.
|
|
6
|
+
* Pure and runtime-agnostic (used by the router and unit-tested directly).
|
|
7
|
+
* matchRoute('/', '/') -> {}
|
|
8
|
+
* matchRoute('/blog/:id', '/blog/42') -> { id: '42' }
|
|
9
|
+
* matchRoute('/docs/*slug', '/docs/a/b') -> { slug: 'a/b' } (catch-all, 1+ segments)
|
|
10
|
+
* matchRoute('/docs/**slug', '/docs') -> { slug: '' } (optional catch-all, 0+ segments)
|
|
11
|
+
* matchRoute('/about', '/x') -> null
|
|
12
|
+
*/
|
|
13
|
+
export function matchRoute(pattern: string, pathname: string): RouteParams | null {
|
|
14
|
+
const patternSegs = pattern.split('/').filter(Boolean);
|
|
15
|
+
const pathSegs = pathname.split('/').filter(Boolean);
|
|
16
|
+
|
|
17
|
+
const params: RouteParams = {};
|
|
18
|
+
for (let i = 0; i < patternSegs.length; i++) {
|
|
19
|
+
const p = patternSegs[i];
|
|
20
|
+
|
|
21
|
+
// Optional catch-all (`**slug`): captures the rest of the path, matching zero or more segments.
|
|
22
|
+
if (p.startsWith('**')) {
|
|
23
|
+
params[p.slice(2)] = pathSegs
|
|
24
|
+
.slice(i)
|
|
25
|
+
.map((s) => decodeURIComponent(s))
|
|
26
|
+
.join('/');
|
|
27
|
+
return params;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (p.startsWith('*')) {
|
|
31
|
+
const rest = pathSegs.slice(i);
|
|
32
|
+
if (rest.length === 0) return null;
|
|
33
|
+
params[p.slice(1)] = rest.map((s) => decodeURIComponent(s)).join('/');
|
|
34
|
+
return params;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (i >= pathSegs.length) return null;
|
|
38
|
+
const value = pathSegs[i];
|
|
39
|
+
if (p.startsWith(':')) {
|
|
40
|
+
params[p.slice(1)] = decodeURIComponent(value);
|
|
41
|
+
} else if (p !== value) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return patternSegs.length === pathSegs.length ? params : null;
|
|
47
|
+
}
|
|
@@ -1,52 +1,54 @@
|
|
|
1
|
-
import { createRoot } from 'react-dom/client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
} from '../dev/error-overlay.js';
|
|
9
|
-
import { initNavigation } from '../navigation/navigation.js';
|
|
10
|
-
import { startPrefetcher } from '../navigation/prefetch.js';
|
|
11
|
-
import { Router } from './Router.js';
|
|
12
|
-
import type { ErrorComponentLoader, LayoutLoader, NotFoundLoader, RouteDef } from '../types.js';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Mounts the toil client app into `#root` and starts idle link prefetching. Called by the
|
|
16
|
-
* compiler-generated `.toil/entry.tsx`.
|
|
17
|
-
*/
|
|
18
|
-
export function mount(
|
|
19
|
-
routes: RouteDef[],
|
|
20
|
-
layout: LayoutLoader = null,
|
|
21
|
-
notFound: NotFoundLoader = null,
|
|
22
|
-
globalError: ErrorComponentLoader = null,
|
|
23
|
-
slots: Record<string, RouteDef[]> = {},
|
|
24
|
-
): void {
|
|
25
|
-
const el = document.getElementById('root');
|
|
26
|
-
if (!el) throw new Error('toil: #root element not found');
|
|
27
|
-
initNavigation();
|
|
28
|
-
const app = (
|
|
29
|
-
<Router
|
|
30
|
-
routes={routes}
|
|
31
|
-
layout={layout}
|
|
32
|
-
notFound={notFound}
|
|
33
|
-
globalError={globalError}
|
|
34
|
-
slots={slots}
|
|
35
|
-
/>
|
|
36
|
-
);
|
|
37
|
-
// In dev, wrap the app in the error overlay so uncaught
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
import { createRoot } from 'react-dom/client';
|
|
2
|
+
|
|
3
|
+
import { DevToolbar } from '../dev/devtools.js';
|
|
4
|
+
import {
|
|
5
|
+
DevErrorBoundary,
|
|
6
|
+
DevErrorOverlay,
|
|
7
|
+
initDevErrorOverlay,
|
|
8
|
+
} from '../dev/error-overlay.js';
|
|
9
|
+
import { initNavigation } from '../navigation/navigation.js';
|
|
10
|
+
import { startPrefetcher } from '../navigation/prefetch.js';
|
|
11
|
+
import { Router } from './Router.js';
|
|
12
|
+
import type { ErrorComponentLoader, LayoutLoader, NotFoundLoader, RouteDef } from '../types.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Mounts the toil client app into `#root` and starts idle link prefetching. Called by the
|
|
16
|
+
* compiler-generated `.toil/entry.tsx`.
|
|
17
|
+
*/
|
|
18
|
+
export function mount(
|
|
19
|
+
routes: RouteDef[],
|
|
20
|
+
layout: LayoutLoader = null,
|
|
21
|
+
notFound: NotFoundLoader = null,
|
|
22
|
+
globalError: ErrorComponentLoader = null,
|
|
23
|
+
slots: Record<string, RouteDef[]> = {},
|
|
24
|
+
): void {
|
|
25
|
+
const el = document.getElementById('root');
|
|
26
|
+
if (!el) throw new Error('toil: #root element not found');
|
|
27
|
+
initNavigation();
|
|
28
|
+
const app = (
|
|
29
|
+
<Router
|
|
30
|
+
routes={routes}
|
|
31
|
+
layout={layout}
|
|
32
|
+
notFound={notFound}
|
|
33
|
+
globalError={globalError}
|
|
34
|
+
slots={slots}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
// In dev, wrap the app in the error overlay + dev toolbar so uncaught errors surface and dev info
|
|
38
|
+
// is available. The guard is the literal `import.meta.env.DEV` (not `isDevMode()`) so the whole
|
|
39
|
+
// branch, and the dev-only imports, are dead-code-eliminated and tree-shaken from production.
|
|
40
|
+
if ((import.meta as unknown as { env: { DEV: boolean } }).env.DEV) {
|
|
41
|
+
initDevErrorOverlay();
|
|
42
|
+
createRoot(el).render(
|
|
43
|
+
<>
|
|
44
|
+
<DevErrorBoundary>{app}</DevErrorBoundary>
|
|
45
|
+
<DevErrorOverlay />
|
|
46
|
+
<DevToolbar routes={routes} slots={slots} />
|
|
47
|
+
</>,
|
|
48
|
+
);
|
|
49
|
+
} else {
|
|
50
|
+
createRoot(el).render(app);
|
|
51
|
+
}
|
|
52
|
+
// Prefetch across the main tree and every slot tree (one prefetcher owns the whole table).
|
|
53
|
+
startPrefetcher([...routes, ...Object.values(slots).flat()]);
|
|
54
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* React context carrying the current route's dynamic params. The provider is set by {@link Router};
|
|
3
|
-
* read it with the {@link useParams} hook rather than consuming the context directly.
|
|
4
|
-
*/
|
|
5
|
-
import { createContext } from 'react';
|
|
6
|
-
|
|
7
|
-
import type { RouteParams } from './match.js';
|
|
8
|
-
|
|
9
|
-
/** Holds the params extracted from the active route (e.g. `{ id }` for `/blog/:id`). */
|
|
10
|
-
export const ParamsContext = createContext<RouteParams>({});
|
|
1
|
+
/**
|
|
2
|
+
* React context carrying the current route's dynamic params. The provider is set by {@link Router};
|
|
3
|
+
* read it with the {@link useParams} hook rather than consuming the context directly.
|
|
4
|
+
*/
|
|
5
|
+
import { createContext } from 'react';
|
|
6
|
+
|
|
7
|
+
import type { RouteParams } from './match.js';
|
|
8
|
+
|
|
9
|
+
/** Holds the params extracted from the active route (e.g. `{ id }` for `/blog/:id`). */
|
|
10
|
+
export const ParamsContext = createContext<RouteParams>({});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context carrying the rendered element for each parallel-route slot (`@slot`), keyed by name.
|
|
3
|
-
* Provided by the Router for the current URL, consumed by {@link Slot}.
|
|
4
|
-
*/
|
|
5
|
-
import { createContext, type ReactNode } from 'react';
|
|
6
|
-
|
|
7
|
-
export const SlotContext = createContext<Record<string, ReactNode>>({});
|
|
1
|
+
/**
|
|
2
|
+
* Context carrying the rendered element for each parallel-route slot (`@slot`), keyed by name.
|
|
3
|
+
* Provided by the Router for the current URL, consumed by {@link Slot}.
|
|
4
|
+
*/
|
|
5
|
+
import { createContext, type ReactNode } from 'react';
|
|
6
|
+
|
|
7
|
+
export const SlotContext = createContext<Record<string, ReactNode>>({});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The client-callable server surface (`Server`). Its TYPED shape is generated by
|
|
3
|
+
* the toilscript server build into the project's `shared/server.ts`
|
|
4
|
+
* (`declare global { const Server }`); this module is the runtime behind it.
|
|
5
|
+
*
|
|
6
|
+
* Two surfaces live under `Server`:
|
|
7
|
+
* - `Server.REST.<controller>.<route>(args)` is a WORKING fetch client. The
|
|
8
|
+
* generated `shared/server.ts` attaches it to `globalThis.__toilRest` when
|
|
9
|
+
* imported; the proxy below surfaces it under `Server.REST`.
|
|
10
|
+
* - `Server.<service>.<method>()` (RPC) is not wired yet, so any call throws.
|
|
11
|
+
* The pipeline (tags -> generated types -> proxy) is in place; only the
|
|
12
|
+
* network dispatch is a TODO. Build the server (`npm run build:server`) to
|
|
13
|
+
* (re)generate the typed surface.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** A recursive proxy that throws on call, used when the REST client hasn't loaded. */
|
|
17
|
+
function restMissingStub(path: string): unknown {
|
|
18
|
+
const call = (): never => {
|
|
19
|
+
throw new Error(
|
|
20
|
+
`toiljs REST: ${path}() is unavailable. The generated REST client has not loaded - ` +
|
|
21
|
+
`import a type from your 'shared/server' (so the client attaches), or run 'npm run build:server'.`,
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
return new Proxy(call, {
|
|
25
|
+
get(_target, prop) {
|
|
26
|
+
if (typeof prop === 'symbol' || prop === 'then') return undefined;
|
|
27
|
+
return restMissingStub(`${path}.${String(prop)}`);
|
|
28
|
+
},
|
|
29
|
+
apply() {
|
|
30
|
+
return call();
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Builds a recursive proxy that throws on call, supporting `Server.svc.method()`. */
|
|
36
|
+
function rpcStub(path: string): unknown {
|
|
37
|
+
const call = (): never => {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`toiljs RPC: ${path}() is not available yet. The client<->server transport ` +
|
|
40
|
+
`is not wired; this is a generated stub. Remote calls will work once transport lands.`,
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
return new Proxy(call, {
|
|
44
|
+
get(_target, prop) {
|
|
45
|
+
// Not thenable, and ignore symbol probes (e.g. from awaiting/inspection).
|
|
46
|
+
if (typeof prop === 'symbol' || prop === 'then') return undefined;
|
|
47
|
+
// `Server.REST` surfaces the generated fetch client attached by shared/server.ts.
|
|
48
|
+
if (path === 'Server' && prop === 'REST') {
|
|
49
|
+
const rest = (globalThis as { __toilRest?: unknown }).__toilRest;
|
|
50
|
+
return rest !== undefined ? rest : restMissingStub('Server.REST');
|
|
51
|
+
}
|
|
52
|
+
return rpcStub(`${path}.${prop}`);
|
|
53
|
+
},
|
|
54
|
+
apply() {
|
|
55
|
+
return call();
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Runtime value for the global `Server`. Typed as `unknown` here; the real types
|
|
62
|
+
* come from the generated `shared/server.ts`. toiljs assigns this to `globalThis`.
|
|
63
|
+
*/
|
|
64
|
+
export const Server: unknown = rpcStub('Server');
|