toiljs 0.0.11 → 0.0.14

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.
Files changed (120) hide show
  1. package/README.md +3 -1
  2. package/build/cli/.tsbuildinfo +1 -1
  3. package/build/cli/configure.js +10 -4
  4. package/build/cli/create.js +58 -30
  5. package/build/cli/diagnostics.d.ts +55 -0
  6. package/build/cli/diagnostics.js +333 -0
  7. package/build/cli/doctor.d.ts +6 -0
  8. package/build/cli/doctor.js +249 -0
  9. package/build/cli/index.js +26 -0
  10. package/build/cli/proc.d.ts +5 -0
  11. package/build/cli/proc.js +20 -0
  12. package/build/cli/ui.d.ts +1 -0
  13. package/build/cli/ui.js +1 -0
  14. package/build/cli/update.d.ts +7 -0
  15. package/build/cli/update.js +117 -0
  16. package/build/cli/updates.d.ts +10 -0
  17. package/build/cli/updates.js +45 -0
  18. package/build/client/.tsbuildinfo +1 -1
  19. package/build/client/dev/error-overlay.js +1 -1
  20. package/build/client/head/metadata.js +3 -1
  21. package/build/client/index.d.ts +5 -1
  22. package/build/client/index.js +2 -0
  23. package/build/client/navigation/navigation.js +1 -1
  24. package/build/client/routing/Router.js +2 -2
  25. package/build/client/search/search.d.ts +26 -0
  26. package/build/client/search/search.js +101 -0
  27. package/build/client/search/use-page-search.d.ts +8 -0
  28. package/build/client/search/use-page-search.js +21 -0
  29. package/build/compiler/.tsbuildinfo +1 -1
  30. package/build/compiler/generate.js +33 -24
  31. package/build/compiler/index.d.ts +2 -0
  32. package/build/compiler/index.js +1 -0
  33. package/build/compiler/pages.d.ts +8 -0
  34. package/build/compiler/pages.js +37 -0
  35. package/build/compiler/plugin.js +3 -1
  36. package/build/compiler/prerender.d.ts +1 -0
  37. package/build/compiler/prerender.js +11 -5
  38. package/build/compiler/seo.js +10 -3
  39. package/build/io/.tsbuildinfo +1 -1
  40. package/examples/basic/client/components/Header.tsx +43 -41
  41. package/examples/basic/client/components/HoneycombBackground.tsx +223 -230
  42. package/examples/basic/client/public/index.html +18 -16
  43. package/examples/basic/client/routes/(legal)/privacy.tsx +18 -19
  44. package/examples/basic/client/routes/(legal)/terms.tsx +15 -16
  45. package/examples/basic/client/routes/about.tsx +21 -22
  46. package/examples/basic/client/routes/blog/[id].tsx +26 -18
  47. package/examples/basic/client/routes/features/actions.tsx +67 -67
  48. package/examples/basic/client/routes/features/error/index.tsx +27 -27
  49. package/examples/basic/client/routes/features/head.tsx +38 -38
  50. package/examples/basic/client/routes/features/index.tsx +83 -75
  51. package/examples/basic/client/routes/features/realtime.tsx +34 -32
  52. package/examples/basic/client/routes/features/script.tsx +31 -31
  53. package/examples/basic/client/routes/features/seo.tsx +39 -39
  54. package/examples/basic/client/routes/features/template/index.tsx +20 -20
  55. package/examples/basic/client/routes/features/template/template.tsx +16 -18
  56. package/examples/basic/client/routes/gallery/@modal/(.)photo/[id].tsx +23 -23
  57. package/examples/basic/client/routes/gallery/index.tsx +42 -42
  58. package/examples/basic/client/routes/gallery/photo/[id].tsx +18 -18
  59. package/examples/basic/client/routes/get-started.tsx +157 -84
  60. package/examples/basic/client/routes/index.tsx +137 -96
  61. package/examples/basic/client/routes/loader-demo/index.tsx +59 -52
  62. package/examples/basic/client/routes/search.tsx +61 -0
  63. package/examples/basic/client/routes/test.tsx +7 -8
  64. package/examples/basic/client/styles/main.css +624 -552
  65. package/package.json +2 -2
  66. package/presets/eslint.js +10 -3
  67. package/src/cli/configure.ts +363 -353
  68. package/src/cli/create.ts +563 -530
  69. package/src/cli/diagnostics.ts +421 -0
  70. package/src/cli/doctor.ts +318 -0
  71. package/src/cli/features.ts +166 -160
  72. package/src/cli/index.ts +242 -211
  73. package/src/cli/proc.ts +30 -0
  74. package/src/cli/ui.ts +111 -103
  75. package/src/cli/update.ts +150 -0
  76. package/src/cli/updates.ts +69 -0
  77. package/src/client/components/Image.tsx +91 -89
  78. package/src/client/dev/error-overlay.tsx +193 -197
  79. package/src/client/head/metadata.ts +94 -92
  80. package/src/client/index.ts +79 -64
  81. package/src/client/navigation/Link.tsx +94 -100
  82. package/src/client/navigation/navigation.ts +215 -218
  83. package/src/client/routing/Router.tsx +210 -193
  84. package/src/client/routing/hooks.ts +110 -114
  85. package/src/client/routing/lazy.ts +77 -81
  86. package/src/client/search/search.ts +189 -0
  87. package/src/client/search/use-page-search.ts +73 -0
  88. package/src/compiler/config.ts +173 -171
  89. package/src/compiler/fonts.ts +89 -87
  90. package/src/compiler/generate.ts +45 -27
  91. package/src/compiler/image-report.ts +88 -85
  92. package/src/compiler/index.ts +2 -0
  93. package/src/compiler/pages.ts +70 -0
  94. package/src/compiler/plugin.ts +51 -47
  95. package/src/compiler/prerender.ts +152 -130
  96. package/src/compiler/routes.ts +132 -131
  97. package/src/compiler/seo.ts +381 -356
  98. package/src/compiler/vite.ts +155 -145
  99. package/src/io/FastSet.ts +99 -96
  100. package/test/configure.test.ts +94 -90
  101. package/test/doctor.test.ts +140 -0
  102. package/test/dom/Image.test.tsx +73 -46
  103. package/test/dom/Script.test.tsx +48 -45
  104. package/test/dom/action.test.tsx +146 -129
  105. package/test/dom/error-overlay.test.tsx +1 -1
  106. package/test/dom/loader.test.tsx +2 -2
  107. package/test/dom/revalidate.test.tsx +1 -1
  108. package/test/dom/route-head.test.tsx +1 -2
  109. package/test/dom/router-loading.test.tsx +1 -1
  110. package/test/dom/slot.test.tsx +131 -109
  111. package/test/dom/view-transitions.test.tsx +53 -51
  112. package/test/features.test.ts +149 -142
  113. package/test/fonts.test.ts +28 -26
  114. package/test/head.test.ts +45 -35
  115. package/test/metadata.test.ts +42 -41
  116. package/test/pages.test.ts +105 -0
  117. package/test/prerender.test.ts +54 -46
  118. package/test/search.test.ts +114 -0
  119. package/test/seo.test.ts +30 -8
  120. package/test/update.test.ts +44 -0
@@ -1,64 +1,79 @@
1
- /**
2
- * toiljs client runtime, published as `toiljs/client`. Re-exports the router (mount/Router/Link),
3
- * navigation hooks, prefetching, and the route types consumed by the compiler-generated entry.
4
- * Zero imports needed in user route files beyond this package.
5
- *
6
- * Internals are split by concern: route `types`, history-based `navigation`, the params
7
- * `params-context` + `hooks`, `lazy` component resolution, the `Link`/`Router` components,
8
- * `mount`, `match` (pure matcher), `prefetch` (link prefetcher), and `channel` (WebSocket helper).
9
- */
10
-
11
- export { mount } from './routing/mount.js';
12
- export { Router } from './routing/Router.js';
13
- export { Link } from './navigation/Link.js';
14
- export type { LinkProps } from './navigation/Link.js';
15
- export { NavLink, matchActive } from './navigation/NavLink.js';
16
- export type { NavLinkProps, NavLinkState } from './navigation/NavLink.js';
17
- export { navigate, back, forward, refresh, setViewTransitions } from './navigation/navigation.js';
18
- export type { NavigateOptions } from './navigation/navigation.js';
19
- export {
20
- useParams,
21
- useNavigate,
22
- useLocation,
23
- usePathname,
24
- useSearchParams,
25
- useRouter,
26
- useNavigationPending,
27
- } from './routing/hooks.js';
28
- export type { RouterInstance } from './routing/hooks.js';
29
- export { useLoaderData, revalidate, invalidateLoaderData } from './routing/loader.js';
30
- export type { LoaderArgs, LoaderFunction, LoaderData, Revalidate } from './routing/loader.js';
31
- export { useAction } from './routing/action.js';
32
- export type {
33
- UseActionOptions,
34
- ActionState,
35
- ActionHandle,
36
- RevalidateTarget,
37
- } from './routing/action.js';
38
- export { prefetch } from './navigation/prefetch.js';
39
- export type {
40
- RouteDef,
41
- LayoutLoader,
42
- LayoutComponentLoader,
43
- NotFoundLoader,
44
- RouteErrorProps,
45
- Register,
46
- RoutePath,
47
- Href,
48
- } from './types.js';
49
- export { matchRoute } from './routing/match.js';
50
- export type { RouteParams } from './routing/match.js';
51
- export { connectChannel, useChannel, resolveChannelUrl } from './channel/channel.js';
52
- export type { Channel, ChannelOptions, ChannelHook, ChannelData } from './channel/channel.js';
53
- export { useHead, useTitle, Head, mergeHead } from './head/head.js';
54
- export type { HeadSpec, MetaTag, LinkTag, ResolvedHead } from './head/head.js';
55
- export { resolveMetadata } from './head/metadata.js';
56
- export type { Metadata, GenerateMetadata, GenerateMetadataArgs, OpenGraph } from './head/metadata.js';
57
- export { Image } from './components/Image.js';
58
- export type { ImageProps } from './components/Image.js';
59
- export { Script } from './components/Script.js';
60
- export type { ScriptProps, ScriptStrategy } from './components/Script.js';
61
- export { Form } from './components/Form.js';
62
- export type { FormProps } from './components/Form.js';
63
- export { Slot } from './components/Slot.js';
64
- export type { SlotProps } from './components/Slot.js';
1
+ /**
2
+ * toiljs client runtime, published as `toiljs/client`. Re-exports the router (mount/Router/Link),
3
+ * navigation hooks, prefetching, and the route types consumed by the compiler-generated entry.
4
+ * Zero imports needed in user route files beyond this package.
5
+ *
6
+ * Internals are split by concern: route `types`, history-based `navigation`, the params
7
+ * `params-context` + `hooks`, `lazy` component resolution, the `Link`/`Router` components,
8
+ * `mount`, `match` (pure matcher), `prefetch` (link prefetcher), and `channel` (WebSocket helper).
9
+ */
10
+
11
+ export { mount } from './routing/mount.js';
12
+ export { Router } from './routing/Router.js';
13
+ export { Link } from './navigation/Link.js';
14
+ export type { LinkProps } from './navigation/Link.js';
15
+ export { NavLink, matchActive } from './navigation/NavLink.js';
16
+ export type { NavLinkProps, NavLinkState } from './navigation/NavLink.js';
17
+ export { navigate, back, forward, refresh, setViewTransitions } from './navigation/navigation.js';
18
+ export type { NavigateOptions } from './navigation/navigation.js';
19
+ export {
20
+ useParams,
21
+ useNavigate,
22
+ useLocation,
23
+ usePathname,
24
+ useSearchParams,
25
+ useRouter,
26
+ useNavigationPending,
27
+ } from './routing/hooks.js';
28
+ export type { RouterInstance } from './routing/hooks.js';
29
+ export { useLoaderData, revalidate, invalidateLoaderData } from './routing/loader.js';
30
+ export type { LoaderArgs, LoaderFunction, LoaderData, Revalidate } from './routing/loader.js';
31
+ export { useAction } from './routing/action.js';
32
+ export type {
33
+ UseActionOptions,
34
+ ActionState,
35
+ ActionHandle,
36
+ RevalidateTarget,
37
+ } from './routing/action.js';
38
+ export { prefetch } from './navigation/prefetch.js';
39
+ export type {
40
+ RouteDef,
41
+ LayoutLoader,
42
+ LayoutComponentLoader,
43
+ NotFoundLoader,
44
+ RouteErrorProps,
45
+ Register,
46
+ RoutePath,
47
+ Href,
48
+ } from './types.js';
49
+ export { matchRoute } from './routing/match.js';
50
+ export type { RouteParams } from './routing/match.js';
51
+ export { connectChannel, useChannel, resolveChannelUrl } from './channel/channel.js';
52
+ export type { Channel, ChannelOptions, ChannelHook, ChannelData } from './channel/channel.js';
53
+ export { useHead, useTitle, Head, mergeHead } from './head/head.js';
54
+ export type { HeadSpec, MetaTag, LinkTag, ResolvedHead } from './head/head.js';
55
+ export { resolveMetadata } from './head/metadata.js';
56
+ export type {
57
+ Metadata,
58
+ GenerateMetadata,
59
+ GenerateMetadataArgs,
60
+ OpenGraph,
61
+ } from './head/metadata.js';
62
+ export { searchPages, registerPages, getPages, pagePath } from './search/search.js';
63
+ export type {
64
+ PageMeta,
65
+ PageSearchResult,
66
+ PageSearchOptions,
67
+ SearchField,
68
+ SearchHints,
69
+ } from './search/search.js';
70
+ export { usePageSearch } from './search/use-page-search.js';
71
+ export type { PageSearch } from './search/use-page-search.js';
72
+ export { Image } from './components/Image.js';
73
+ export type { ImageProps } from './components/Image.js';
74
+ export { Script } from './components/Script.js';
75
+ export type { ScriptProps, ScriptStrategy } from './components/Script.js';
76
+ export { Form } from './components/Form.js';
77
+ export type { FormProps } from './components/Form.js';
78
+ export { Slot } from './components/Slot.js';
79
+ export type { SlotProps } from './components/Slot.js';
@@ -1,100 +1,94 @@
1
- import type {
2
- ComponentPropsWithRef,
3
- FocusEvent,
4
- MouseEvent,
5
- PointerEvent,
6
- ReactNode,
7
- } from 'react';
8
-
9
- import { navigate } from './navigation.js';
10
- import { prefetch } from './prefetch.js';
11
- import type { Href } from '../types.js';
12
-
13
- /**
14
- * Props for {@link Link}: every standard `<a>` attribute (`rel`, `target`, `download`,
15
- * `referrerPolicy`, `hrefLang`, `className`, `style`, `ref`, `data-*`, `aria-*`, event handlers …)
16
- * plus toil's `replace` and `prefetch` controls. `href` is required and typed to the project's routes.
17
- */
18
- export interface LinkProps extends Omit<ComponentPropsWithRef<'a'>, 'href'> {
19
- /** Destination. Same-origin hrefs navigate client-side; external / `target` / `download` / `#hash` use the browser. */
20
- href: Href;
21
- /** Replace the current history entry instead of pushing a new one. Default `false`. */
22
- replace?: boolean;
23
- /** Scroll to top after navigating. Default `true`. */
24
- scroll?: boolean;
25
- /** Prefetch the route chunk on hover/focus. Default `true`; `false` opts this link out. */
26
- prefetch?: boolean;
27
- }
28
-
29
- /** True for cross-origin, opaque (`mailto:` / `tel:`), or otherwise non-same-origin hrefs. */
30
- function isExternalHref(href: string): boolean {
31
- try {
32
- return new URL(href, window.location.href).origin !== window.location.origin;
33
- } catch {
34
- return true;
35
- }
36
- }
37
-
38
- /**
39
- * Client-side navigation link. Forwards all anchor attributes to the underlying `<a>`, and
40
- * prefetches the target route's chunk on hover/focus. Intercepts only plain same-origin clicks ,
41
- * modified clicks, `target=_blank`, `download`, in-page `#hash`, and external URLs fall through to
42
- * native browser behavior.
43
- */
44
- export function Link(props: LinkProps): ReactNode {
45
- const {
46
- href,
47
- replace = false,
48
- scroll = true,
49
- prefetch: prefetchProp = true,
50
- onClick,
51
- onPointerEnter,
52
- onFocus,
53
- children,
54
- ...rest
55
- } = props;
56
-
57
- const handleClick = (event: MouseEvent<HTMLAnchorElement>): void => {
58
- onClick?.(event);
59
- if (
60
- event.defaultPrevented ||
61
- event.button !== 0 ||
62
- event.metaKey ||
63
- event.ctrlKey ||
64
- event.shiftKey ||
65
- event.altKey ||
66
- (rest.target !== undefined && rest.target !== '_self') ||
67
- rest.download !== undefined ||
68
- href.startsWith('#') ||
69
- isExternalHref(href)
70
- ) {
71
- return;
72
- }
73
- event.preventDefault();
74
- navigate(href, { replace, scroll });
75
- };
76
-
77
- const warm = (): void => {
78
- if (prefetchProp) prefetch(href);
79
- };
80
- const handlePointerEnter = (event: PointerEvent<HTMLAnchorElement>): void => {
81
- onPointerEnter?.(event);
82
- warm();
83
- };
84
- const handleFocus = (event: FocusEvent<HTMLAnchorElement>): void => {
85
- onFocus?.(event);
86
- warm();
87
- };
88
-
89
- return (
90
- <a
91
- {...rest}
92
- {...(prefetchProp ? {} : { 'data-no-prefetch': '' })}
93
- href={href}
94
- onClick={handleClick}
95
- onPointerEnter={handlePointerEnter}
96
- onFocus={handleFocus}>
97
- {children}
98
- </a>
99
- );
100
- }
1
+ import type { ComponentPropsWithRef, FocusEvent, MouseEvent, PointerEvent, ReactNode } from 'react';
2
+
3
+ import { navigate } from './navigation.js';
4
+ import { prefetch } from './prefetch.js';
5
+ import type { Href } from '../types.js';
6
+
7
+ /**
8
+ * Props for {@link Link}: every standard `<a>` attribute (`rel`, `target`, `download`,
9
+ * `referrerPolicy`, `hrefLang`, `className`, `style`, `ref`, `data-*`, `aria-*`, event handlers …)
10
+ * plus toil's `replace` and `prefetch` controls. `href` is required and typed to the project's routes.
11
+ */
12
+ export interface LinkProps extends Omit<ComponentPropsWithRef<'a'>, 'href'> {
13
+ /** Destination. Same-origin hrefs navigate client-side; external / `target` / `download` / `#hash` use the browser. */
14
+ href: Href;
15
+ /** Replace the current history entry instead of pushing a new one. Default `false`. */
16
+ replace?: boolean;
17
+ /** Scroll to top after navigating. Default `true`. */
18
+ scroll?: boolean;
19
+ /** Prefetch the route chunk on hover/focus. Default `true`; `false` opts this link out. */
20
+ prefetch?: boolean;
21
+ }
22
+
23
+ /** True for cross-origin, opaque (`mailto:` / `tel:`), or otherwise non-same-origin hrefs. */
24
+ function isExternalHref(href: string): boolean {
25
+ try {
26
+ return new URL(href, window.location.href).origin !== window.location.origin;
27
+ } catch {
28
+ return true;
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Client-side navigation link. Forwards all anchor attributes to the underlying `<a>`, and
34
+ * prefetches the target route's chunk on hover/focus. Intercepts only plain same-origin clicks ,
35
+ * modified clicks, `target=_blank`, `download`, in-page `#hash`, and external URLs fall through to
36
+ * native browser behavior.
37
+ */
38
+ export function Link(props: LinkProps): ReactNode {
39
+ const {
40
+ href,
41
+ replace = false,
42
+ scroll = true,
43
+ prefetch: prefetchProp = true,
44
+ onClick,
45
+ onPointerEnter,
46
+ onFocus,
47
+ children,
48
+ ...rest
49
+ } = props;
50
+
51
+ const handleClick = (event: MouseEvent<HTMLAnchorElement>): void => {
52
+ onClick?.(event);
53
+ if (
54
+ event.defaultPrevented ||
55
+ event.button !== 0 ||
56
+ event.metaKey ||
57
+ event.ctrlKey ||
58
+ event.shiftKey ||
59
+ event.altKey ||
60
+ (rest.target !== undefined && rest.target !== '_self') ||
61
+ rest.download !== undefined ||
62
+ href.startsWith('#') ||
63
+ isExternalHref(href)
64
+ ) {
65
+ return;
66
+ }
67
+ event.preventDefault();
68
+ navigate(href, { replace, scroll });
69
+ };
70
+
71
+ const warm = (): void => {
72
+ if (prefetchProp) prefetch(href);
73
+ };
74
+ const handlePointerEnter = (event: PointerEvent<HTMLAnchorElement>): void => {
75
+ onPointerEnter?.(event);
76
+ warm();
77
+ };
78
+ const handleFocus = (event: FocusEvent<HTMLAnchorElement>): void => {
79
+ onFocus?.(event);
80
+ warm();
81
+ };
82
+
83
+ return (
84
+ <a
85
+ {...rest}
86
+ {...(prefetchProp ? {} : { 'data-no-prefetch': '' })}
87
+ href={href}
88
+ onClick={handleClick}
89
+ onPointerEnter={handlePointerEnter}
90
+ onFocus={handleFocus}>
91
+ {children}
92
+ </a>
93
+ );
94
+ }