@kestack/kabuki 0.0.1 → 0.0.2

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 (234) hide show
  1. package/README.md +156 -33
  2. package/dist/core/actor/actor.d.ts +24 -13
  3. package/dist/core/actor/actor.d.ts.map +1 -1
  4. package/dist/core/actor/actor.js +37 -26
  5. package/dist/core/actor/index.d.ts +2 -2
  6. package/dist/core/actor/index.d.ts.map +1 -1
  7. package/dist/core/actor/types.d.ts +91 -47
  8. package/dist/core/actor/types.d.ts.map +1 -1
  9. package/dist/core/history/history.d.ts +11 -3
  10. package/dist/core/history/history.d.ts.map +1 -1
  11. package/dist/core/history/history.js +106 -27
  12. package/dist/core/history/replay.d.ts +2 -0
  13. package/dist/core/history/replay.d.ts.map +1 -1
  14. package/dist/core/history/replay.js +1 -0
  15. package/dist/core/history/saved.d.ts +1 -1
  16. package/dist/core/history/saved.d.ts.map +1 -1
  17. package/dist/core/history/saved.js +13 -9
  18. package/dist/core/index.d.ts +1 -1
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/snapshot/invoke.d.ts +2 -3
  21. package/dist/core/snapshot/invoke.d.ts.map +1 -1
  22. package/dist/core/snapshot/invoke.js +42 -49
  23. package/dist/core/snapshot/restore.js +8 -7
  24. package/dist/core/snapshot/tree.d.ts +1 -1
  25. package/dist/core/snapshot/tree.d.ts.map +1 -1
  26. package/dist/core/snapshot/tree.js +1 -1
  27. package/dist/react/app.d.ts +30 -3
  28. package/dist/react/app.d.ts.map +1 -1
  29. package/dist/react/app.js +119 -40
  30. package/dist/react/drawn.d.ts +1 -1
  31. package/dist/react/drawn.d.ts.map +1 -1
  32. package/dist/react/drawn.js +2 -1
  33. package/dist/react/index.d.ts +3 -0
  34. package/dist/react/index.d.ts.map +1 -1
  35. package/dist/react/index.js +2 -0
  36. package/dist/react/lazy.d.ts +30 -0
  37. package/dist/react/lazy.d.ts.map +1 -0
  38. package/dist/react/lazy.js +56 -0
  39. package/dist/react/live.d.ts +7 -0
  40. package/dist/react/live.d.ts.map +1 -0
  41. package/dist/react/live.js +13 -0
  42. package/dist/react/view.d.ts +26 -6
  43. package/dist/react/view.d.ts.map +1 -1
  44. package/dist/react/view.js +17 -5
  45. package/dist/routing/adapter/adapter.d.ts +38 -0
  46. package/dist/routing/adapter/adapter.d.ts.map +1 -0
  47. package/dist/routing/adapter/adapter.js +10 -0
  48. package/dist/routing/adapter/browser/browser.d.ts +8 -0
  49. package/dist/routing/adapter/browser/browser.d.ts.map +1 -0
  50. package/dist/routing/adapter/browser/browser.js +33 -0
  51. package/dist/routing/adapter/browser/index.d.ts +2 -0
  52. package/dist/routing/adapter/browser/index.d.ts.map +1 -0
  53. package/dist/routing/adapter/browser/index.js +1 -0
  54. package/dist/routing/adapter/index.d.ts +3 -0
  55. package/dist/routing/adapter/index.d.ts.map +1 -0
  56. package/dist/routing/adapter/index.js +1 -0
  57. package/dist/routing/adapter/tanstack/index.d.ts +3 -0
  58. package/dist/routing/adapter/tanstack/index.d.ts.map +1 -0
  59. package/dist/routing/adapter/tanstack/index.js +1 -0
  60. package/dist/routing/adapter/tanstack/tanstack.d.ts +27 -0
  61. package/dist/routing/adapter/tanstack/tanstack.d.ts.map +1 -0
  62. package/dist/routing/adapter/tanstack/tanstack.js +38 -0
  63. package/dist/routing/capability/cache.d.ts +12 -0
  64. package/dist/routing/capability/cache.d.ts.map +1 -0
  65. package/dist/routing/capability/cache.js +170 -0
  66. package/dist/routing/capability/index.d.ts +6 -0
  67. package/dist/routing/capability/index.d.ts.map +1 -0
  68. package/dist/routing/capability/index.js +3 -0
  69. package/dist/routing/capability/loading.d.ts +82 -0
  70. package/dist/routing/capability/loading.d.ts.map +1 -0
  71. package/dist/routing/capability/loading.js +53 -0
  72. package/dist/routing/capability/navigation.d.ts +66 -0
  73. package/dist/routing/capability/navigation.d.ts.map +1 -0
  74. package/dist/routing/capability/navigation.js +65 -0
  75. package/dist/routing/index.d.ts +10 -0
  76. package/dist/routing/index.d.ts.map +1 -0
  77. package/dist/routing/index.js +4 -0
  78. package/dist/routing/page/index.d.ts +5 -0
  79. package/dist/routing/page/index.d.ts.map +1 -0
  80. package/dist/routing/page/index.js +2 -0
  81. package/dist/routing/page/page.d.ts +151 -0
  82. package/dist/routing/page/page.d.ts.map +1 -0
  83. package/dist/routing/page/page.js +121 -0
  84. package/dist/routing/page/status.d.ts +121 -0
  85. package/dist/routing/page/status.d.ts.map +1 -0
  86. package/dist/routing/page/status.js +69 -0
  87. package/dist/routing/route/index.d.ts +11 -0
  88. package/dist/routing/route/index.d.ts.map +1 -0
  89. package/dist/routing/route/index.js +6 -0
  90. package/dist/routing/route/loader.d.ts +98 -0
  91. package/dist/routing/route/loader.d.ts.map +1 -0
  92. package/dist/routing/route/loader.js +17 -0
  93. package/dist/routing/route/metadata.d.ts +44 -0
  94. package/dist/routing/route/metadata.d.ts.map +1 -0
  95. package/dist/routing/route/metadata.js +53 -0
  96. package/dist/routing/route/node.d.ts +162 -0
  97. package/dist/routing/route/node.d.ts.map +1 -0
  98. package/dist/routing/route/node.js +3 -0
  99. package/dist/routing/route/places.d.ts +15 -0
  100. package/dist/routing/route/places.d.ts.map +1 -0
  101. package/dist/routing/route/places.js +87 -0
  102. package/dist/routing/route/route.d.ts +53 -0
  103. package/dist/routing/route/route.d.ts.map +1 -0
  104. package/dist/routing/route/route.js +148 -0
  105. package/dist/routing/route/url.d.ts +13 -0
  106. package/dist/routing/route/url.d.ts.map +1 -0
  107. package/dist/routing/route/url.js +79 -0
  108. package/dist/routing/route/values.d.ts +12 -0
  109. package/dist/routing/route/values.d.ts.map +1 -0
  110. package/dist/routing/route/values.js +47 -0
  111. package/dist/routing/router/context.d.ts +123 -0
  112. package/dist/routing/router/context.d.ts.map +1 -0
  113. package/dist/routing/router/context.js +156 -0
  114. package/dist/routing/router/data.d.ts +117 -0
  115. package/dist/routing/router/data.d.ts.map +1 -0
  116. package/dist/routing/router/data.js +247 -0
  117. package/dist/routing/router/define.d.ts +52 -0
  118. package/dist/routing/router/define.d.ts.map +1 -0
  119. package/dist/routing/router/define.js +48 -0
  120. package/dist/routing/router/frame.d.ts +10 -0
  121. package/dist/routing/router/frame.d.ts.map +1 -0
  122. package/dist/routing/router/frame.js +10 -0
  123. package/dist/routing/router/index.d.ts +7 -0
  124. package/dist/routing/router/index.d.ts.map +1 -0
  125. package/dist/routing/router/index.js +3 -0
  126. package/dist/routing/router/router.d.ts +165 -0
  127. package/dist/routing/router/router.d.ts.map +1 -0
  128. package/dist/routing/router/router.js +801 -0
  129. package/dist/routing/routing.d.ts +72 -0
  130. package/dist/routing/routing.d.ts.map +1 -0
  131. package/dist/routing/routing.js +53 -0
  132. package/dist/routing/scroll/index.d.ts +4 -0
  133. package/dist/routing/scroll/index.d.ts.map +1 -0
  134. package/dist/routing/scroll/index.js +2 -0
  135. package/dist/routing/scroll/script.d.ts +6 -0
  136. package/dist/routing/scroll/script.d.ts.map +1 -0
  137. package/dist/routing/scroll/script.js +52 -0
  138. package/dist/routing/scroll/scroll.d.ts +75 -0
  139. package/dist/routing/scroll/scroll.d.ts.map +1 -0
  140. package/dist/routing/scroll/scroll.js +201 -0
  141. package/dist/routing/scroll/selector.d.ts +14 -0
  142. package/dist/routing/scroll/selector.d.ts.map +1 -0
  143. package/dist/routing/scroll/selector.js +40 -0
  144. package/dist/routing/scroll/session.d.ts +6 -0
  145. package/dist/routing/scroll/session.d.ts.map +1 -0
  146. package/dist/routing/scroll/session.js +23 -0
  147. package/dist/start/client/client.d.ts +11 -0
  148. package/dist/start/client/client.d.ts.map +1 -0
  149. package/dist/start/client/client.js +24 -0
  150. package/dist/start/client/index.d.ts +3 -0
  151. package/dist/start/client/index.d.ts.map +1 -0
  152. package/dist/start/client/index.js +2 -0
  153. package/dist/start/client/rpc.d.ts +14 -0
  154. package/dist/start/client/rpc.d.ts.map +1 -0
  155. package/dist/start/client/rpc.js +70 -0
  156. package/dist/start/common/app.d.ts +66 -0
  157. package/dist/start/common/app.d.ts.map +1 -0
  158. package/dist/start/common/app.js +23 -0
  159. package/dist/start/common/common.d.ts +26 -0
  160. package/dist/start/common/common.d.ts.map +1 -0
  161. package/dist/start/common/common.js +19 -0
  162. package/dist/start/common/document.d.ts +44 -0
  163. package/dist/start/common/document.d.ts.map +1 -0
  164. package/dist/start/common/document.js +58 -0
  165. package/dist/start/common/index.d.ts +9 -0
  166. package/dist/start/common/index.d.ts.map +1 -0
  167. package/dist/start/common/index.js +5 -0
  168. package/dist/start/common/page.d.ts +67 -0
  169. package/dist/start/common/page.d.ts.map +1 -0
  170. package/dist/start/common/page.js +29 -0
  171. package/dist/start/common/wire.d.ts +37 -0
  172. package/dist/start/common/wire.d.ts.map +1 -0
  173. package/dist/start/common/wire.js +73 -0
  174. package/dist/start/platform/cloudflare/cloudflare.d.ts +8 -0
  175. package/dist/start/platform/cloudflare/cloudflare.d.ts.map +1 -0
  176. package/dist/start/platform/cloudflare/cloudflare.js +31 -0
  177. package/dist/start/platform/cloudflare/index.d.ts +2 -0
  178. package/dist/start/platform/cloudflare/index.d.ts.map +1 -0
  179. package/dist/start/platform/cloudflare/index.js +1 -0
  180. package/dist/start/platform/index.d.ts +2 -0
  181. package/dist/start/platform/index.d.ts.map +1 -0
  182. package/dist/start/platform/index.js +1 -0
  183. package/dist/start/platform/platform.d.ts +31 -0
  184. package/dist/start/platform/platform.d.ts.map +1 -0
  185. package/dist/start/platform/platform.js +13 -0
  186. package/dist/start/server/cache.d.ts +4 -0
  187. package/dist/start/server/cache.d.ts.map +1 -0
  188. package/dist/start/server/cache.js +26 -0
  189. package/dist/start/server/draw.d.ts +10 -0
  190. package/dist/start/server/draw.d.ts.map +1 -0
  191. package/dist/start/server/draw.js +75 -0
  192. package/dist/start/server/index.d.ts +3 -0
  193. package/dist/start/server/index.d.ts.map +1 -0
  194. package/dist/start/server/index.js +2 -0
  195. package/dist/start/server/layers.d.ts +97 -0
  196. package/dist/start/server/layers.d.ts.map +1 -0
  197. package/dist/start/server/layers.js +37 -0
  198. package/dist/start/server/respond.d.ts +15 -0
  199. package/dist/start/server/respond.d.ts.map +1 -0
  200. package/dist/start/server/respond.js +35 -0
  201. package/dist/start/server/rpc.d.ts +11 -0
  202. package/dist/start/server/rpc.d.ts.map +1 -0
  203. package/dist/start/server/rpc.js +51 -0
  204. package/dist/start/server/server.d.ts +13 -0
  205. package/dist/start/server/server.d.ts.map +1 -0
  206. package/dist/start/server/server.js +138 -0
  207. package/dist/start/server/tiers.d.ts +14 -0
  208. package/dist/start/server/tiers.d.ts.map +1 -0
  209. package/dist/start/server/tiers.js +31 -0
  210. package/dist/start/vite/dev.d.ts +5 -0
  211. package/dist/start/vite/dev.d.ts.map +1 -0
  212. package/dist/start/vite/dev.js +56 -0
  213. package/dist/start/vite/entries.d.ts +27 -0
  214. package/dist/start/vite/entries.d.ts.map +1 -0
  215. package/dist/start/vite/entries.js +66 -0
  216. package/dist/start/vite/files.d.ts +22 -0
  217. package/dist/start/vite/files.d.ts.map +1 -0
  218. package/dist/start/vite/files.js +23 -0
  219. package/dist/start/vite/index.d.ts +2 -0
  220. package/dist/start/vite/index.d.ts.map +1 -0
  221. package/dist/start/vite/index.js +1 -0
  222. package/dist/start/vite/lazy.d.ts +4 -0
  223. package/dist/start/vite/lazy.d.ts.map +1 -0
  224. package/dist/start/vite/lazy.js +30 -0
  225. package/dist/start/vite/manifest.d.ts +18 -0
  226. package/dist/start/vite/manifest.d.ts.map +1 -0
  227. package/dist/start/vite/manifest.js +42 -0
  228. package/dist/start/vite/styles.d.ts +7 -0
  229. package/dist/start/vite/styles.d.ts.map +1 -0
  230. package/dist/start/vite/styles.js +58 -0
  231. package/dist/start/vite/vite.d.ts +11 -0
  232. package/dist/start/vite/vite.d.ts.map +1 -0
  233. package/dist/start/vite/vite.js +217 -0
  234. package/package.json +53 -3
@@ -0,0 +1,121 @@
1
+ import { Schema } from 'effect';
2
+ import type { Answer } from '../capability/index.ts';
3
+ import type { Codec, RenderMode, Value } from '../route/index.ts';
4
+ /** What is known of a place whatever its data: how it is drawn, and how long its data stays fresh. */
5
+ export interface PlaceInfo {
6
+ readonly render: RenderMode;
7
+ /** Its Stale time, in milliseconds; `null` for a static page, fresh until the next deploy. */
8
+ readonly staleTime: number | null;
9
+ }
10
+ /** Where a place's data came from: the page the server drew, a load by the app, or a copy the Data cache kept. */
11
+ export type From = 'server' | 'browser' | 'cache';
12
+ /** What is known of a place's data once it is there, besides the data. */
13
+ export interface DataInfo extends PlaceInfo {
14
+ readonly from: From;
15
+ /** When it arrived, in milliseconds since the epoch: its Stale time counts from it. */
16
+ readonly arrivedAt: number;
17
+ /** When it goes stale, in milliseconds since the epoch; `null` for a static page. */
18
+ readonly freshUntil: number | null;
19
+ /** How long, in milliseconds, from asking for it to its answer; `null` for a copy. */
20
+ readonly took: number | null;
21
+ }
22
+ /**
23
+ * Where a page's data is: loading, failed, or there. `refreshing` is true
24
+ * while it loads again behind the data shown, after a reload or on a copy
25
+ * the Data cache kept. `notFound` is a Loader's `Page.notFound()`. `info`
26
+ * is good to know, never needed to draw: how the page is drawn, its Stale
27
+ * time, and once its data is there, where it came from and when it goes
28
+ * stale.
29
+ */
30
+ export type Status<D> = {
31
+ readonly _tag: 'Loading';
32
+ readonly info: PlaceInfo;
33
+ } | {
34
+ readonly _tag: 'Failed';
35
+ readonly reason: string;
36
+ readonly notFound: boolean;
37
+ readonly info: PlaceInfo;
38
+ } | {
39
+ readonly _tag: 'Ready';
40
+ readonly data: D;
41
+ readonly refreshing: boolean;
42
+ readonly info: DataInfo;
43
+ };
44
+ export declare const DataInfoSchema: Schema.Struct<{
45
+ readonly render: Schema.Literals<readonly ["static", "dynamic", "client"]>;
46
+ readonly staleTime: Schema.NullOr<Schema.Number>;
47
+ readonly from: Schema.Literals<readonly ["server", "browser", "cache"]>;
48
+ readonly arrivedAt: Schema.Number;
49
+ readonly freshUntil: Schema.NullOr<Schema.Number>;
50
+ readonly took: Schema.NullOr<Schema.Number>;
51
+ }>;
52
+ export declare const statusSchema: <D>(data: Codec<D>) => Codec<Status<D>>;
53
+ /** What is known of a place whatever its data. */
54
+ export declare const placeInfoOf: (place: {
55
+ readonly render: RenderMode;
56
+ readonly staleTime: number;
57
+ }) => PlaceInfo;
58
+ /** What is known of a place's data that arrived `at`, from `from`, in `took`. */
59
+ export declare const dataInfoOf: (place: {
60
+ readonly render: RenderMode;
61
+ readonly staleTime: number;
62
+ }, data: {
63
+ readonly from: From;
64
+ readonly at: number;
65
+ readonly took: number | null;
66
+ }) => DataInfo;
67
+ /**
68
+ * What a place's data starts from, when something is known as it lands:
69
+ * data, stale if the Data cache kept it, with where it came from, when it
70
+ * arrived and how long it took; or why there is none.
71
+ */
72
+ export type Known = {
73
+ readonly _tag: 'Ready';
74
+ readonly data: unknown;
75
+ readonly stale: boolean;
76
+ readonly from: From;
77
+ /** When it arrived, in milliseconds since the epoch: its Stale time counts from it. */
78
+ readonly at: number;
79
+ readonly took: number | null;
80
+ } | {
81
+ readonly _tag: 'Failed';
82
+ readonly reason: string;
83
+ readonly notFound: boolean;
84
+ };
85
+ /**
86
+ * What an answer tells a place's data it starts from: arrived when the
87
+ * Data cache says, else `now`; from a copy if the Data cache kept it, else
88
+ * from `from`. A Redirect tells it nothing, the Router follows it.
89
+ */
90
+ export declare const knownOf: (answer: Answer, now: number, from: From) => Known | undefined;
91
+ /**
92
+ * Kabuki's part of a Page's Props: where it sits. `page` is the Route one
93
+ * level down, if the URL goes on, so a View can tell which of its pages is
94
+ * open.
95
+ */
96
+ export interface Where<Page = Value> {
97
+ /** Its dotted name, `Team.Project`; the root's is `''`. */
98
+ readonly name: string;
99
+ /** The Route one level down, if the URL goes on. */
100
+ readonly page?: Page;
101
+ /** Every path param down to it, its ancestors' too. */
102
+ readonly params: Readonly<Record<string, unknown>>;
103
+ /** The URL's path when it names no place; only the root sees one. */
104
+ readonly notFound: string | null;
105
+ }
106
+ /**
107
+ * What a Page's `route` carries besides, which its pages are made from: out
108
+ * of its type, so a page never reads it.
109
+ */
110
+ export interface Carried<Page = Value> extends Where<Page> {
111
+ /** The status of each place below it, by dotted name, as the Router holds it. */
112
+ readonly data?: Readonly<Record<string, Status<unknown>>>;
113
+ }
114
+ export declare const whereSchema: (page: Codec<unknown> | undefined) => Schema.Struct<{
115
+ readonly name: Schema.String;
116
+ readonly page?: Schema.optionalKey<Codec<unknown>>;
117
+ readonly params: Schema.$Record<Schema.String, Schema.Unknown>;
118
+ readonly notFound: Schema.NullOr<Schema.String>;
119
+ readonly data: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>;
120
+ }>;
121
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/routing/page/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Schema } from 'effect';
2
+ const placeInfo = {
3
+ render: Schema.Literals(['static', 'dynamic', 'client']),
4
+ staleTime: Schema.NullOr(Schema.Number),
5
+ };
6
+ const PlaceInfoSchema = Schema.Struct(placeInfo);
7
+ export const DataInfoSchema = Schema.Struct({
8
+ ...placeInfo,
9
+ from: Schema.Literals(['server', 'browser', 'cache']),
10
+ arrivedAt: Schema.Number,
11
+ freshUntil: Schema.NullOr(Schema.Number),
12
+ took: Schema.NullOr(Schema.Number),
13
+ });
14
+ export const statusSchema = (data) => Schema.TaggedUnion({
15
+ Loading: { info: PlaceInfoSchema },
16
+ Failed: {
17
+ reason: Schema.String,
18
+ notFound: Schema.Boolean,
19
+ info: PlaceInfoSchema,
20
+ },
21
+ Ready: { data, refreshing: Schema.Boolean, info: DataInfoSchema },
22
+ });
23
+ /** What is known of a place whatever its data. */
24
+ export const placeInfoOf = (place) => ({
25
+ render: place.render,
26
+ staleTime: Number.isFinite(place.staleTime) ? place.staleTime : null,
27
+ });
28
+ /** What is known of a place's data that arrived `at`, from `from`, in `took`. */
29
+ export const dataInfoOf = (place, data) => {
30
+ const info = placeInfoOf(place);
31
+ return {
32
+ ...info,
33
+ from: data.from,
34
+ arrivedAt: data.at,
35
+ freshUntil: info.staleTime === null ? null : data.at + info.staleTime,
36
+ took: data.took,
37
+ };
38
+ };
39
+ /**
40
+ * What an answer tells a place's data it starts from: arrived when the
41
+ * Data cache says, else `now`; from a copy if the Data cache kept it, else
42
+ * from `from`. A Redirect tells it nothing, the Router follows it.
43
+ */
44
+ export const knownOf = (answer, now, from) => {
45
+ switch (answer._tag) {
46
+ case 'Loaded':
47
+ return {
48
+ _tag: 'Ready',
49
+ data: answer.data,
50
+ stale: answer.stale === true,
51
+ from: answer.cached ? 'cache' : from,
52
+ at: answer.at ?? now,
53
+ took: answer.cached ? null : (answer.took ?? null),
54
+ };
55
+ case 'NotFound':
56
+ return { _tag: 'Failed', reason: 'Not found', notFound: true };
57
+ case 'Broken':
58
+ return { _tag: 'Failed', reason: answer.reason, notFound: false };
59
+ case 'Redirect':
60
+ return undefined;
61
+ }
62
+ };
63
+ export const whereSchema = (page) => Schema.Struct({
64
+ name: Schema.String,
65
+ ...(page ? { page: Schema.optionalKey(page) } : {}),
66
+ params: Schema.Record(Schema.String, Schema.Unknown),
67
+ notFound: Schema.NullOr(Schema.String),
68
+ data: Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
69
+ });
@@ -0,0 +1,11 @@
1
+ export { routesOf } from './route.ts';
2
+ export type { RoutesApi, RoutesOptions } from './route.ts';
3
+ export { dotted } from './node.ts';
4
+ export type { AnyNode, Children, ChildrenOf, Codec, DataOf, Fields, How, LevelOf, MetadataOf, Node, NotFound, Place, PlaceData, PlaceSchema, PlacesOf, Read, Redirects, RouteOf, Simplify, Tree, Value, ValueOf, } from './node.ts';
5
+ export { levelSchema, paramsKey, pick, valueAt } from './values.ts';
6
+ export { nodesOn } from './places.ts';
7
+ export { NotFoundError, RedirectError } from './loader.ts';
8
+ export type { LoadError, Loaders, Outcome, PlaceType, RedirectTo, RenderMode, StaticOf, } from './loader.ts';
9
+ export { MANAGED, merge, tagsOf } from './metadata.ts';
10
+ export type { Metadata, Tag } from './metadata.ts';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,YAAY,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,KAAK,EACL,MAAM,EACN,MAAM,EACN,GAAG,EACH,OAAO,EACP,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACV,SAAS,EACT,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { routesOf } from './route.js';
2
+ export { dotted } from './node.js';
3
+ export { levelSchema, paramsKey, pick, valueAt } from './values.js';
4
+ export { nodesOn } from './places.js';
5
+ export { NotFoundError, RedirectError } from './loader.js';
6
+ export { MANAGED, merge, tagsOf } from './metadata.js';
@@ -0,0 +1,98 @@
1
+ import { Schema } from 'effect';
2
+ import type { Effect } from 'effect';
3
+ /** Where and when a place is first drawn: static, dynamic or client, each later than the one before. */
4
+ export type RenderMode = 'static' | 'dynamic' | 'client';
5
+ export declare const MODES: ReadonlyArray<RenderMode>;
6
+ declare const NotFoundError_base: Schema.Class<NotFoundError, Schema.TaggedStruct<"NotFound", {}>, import("effect/Cause").YieldableError>;
7
+ /** A Loader's answer: the place it was asked for is not found. */
8
+ export declare class NotFoundError extends NotFoundError_base {
9
+ }
10
+ declare const RedirectError_base: Schema.Class<RedirectError, Schema.TaggedStruct<"Redirect", {
11
+ readonly route: Schema.optionalKey<Schema.Unknown>;
12
+ readonly href: Schema.optionalKey<Schema.String>;
13
+ readonly permanent: Schema.optionalKey<Schema.Boolean>;
14
+ }>, import("effect/Cause").YieldableError>;
15
+ /**
16
+ * A Loader's answer: go elsewhere instead, to a Route of the app or, with
17
+ * `href`, to a URL outside it. Plain data, so it travels as it is; a Routes
18
+ * tree can check the Route with its `route` Schema. `permanent` is a `308`
19
+ * on the server rather than a `302`.
20
+ */
21
+ export declare class RedirectError extends RedirectError_base {
22
+ }
23
+ /** A Redirect to a Route of type `R`, or out of the app: what a Loader of an app whose Routes are `R` may fail with. */
24
+ export type RedirectTo<R> = RedirectError & {
25
+ readonly route?: R;
26
+ };
27
+ /** How a Loader fails: the place is not found, or the app goes elsewhere. */
28
+ export type LoadError<R = unknown> = NotFoundError | RedirectTo<R>;
29
+ /** Where a Redirect goes: a Route of the app, or a URL outside it. */
30
+ export type Target = {
31
+ readonly route: unknown;
32
+ readonly href?: undefined;
33
+ } | {
34
+ readonly href: string;
35
+ readonly route?: undefined;
36
+ };
37
+ /**
38
+ * What loading one place came to: its data, or why there is none: its
39
+ * Loader said not found or Redirected, or something broke on the way.
40
+ */
41
+ export type Outcome = {
42
+ readonly _tag: 'Loaded';
43
+ readonly data: unknown;
44
+ } | {
45
+ readonly _tag: 'NotFound';
46
+ } | ({
47
+ readonly _tag: 'Redirect';
48
+ readonly permanent?: boolean;
49
+ } & Target) | {
50
+ readonly _tag: 'Broken';
51
+ readonly reason: string;
52
+ };
53
+ /** What the types know of one place: its dotted name, every param down to it, its Input, and its Render Mode. */
54
+ export interface PlaceType {
55
+ readonly name: string;
56
+ readonly params: object;
57
+ readonly input: unknown;
58
+ readonly mode: RenderMode;
59
+ }
60
+ /** A place's Loader: a static place's is given its params and query; a dynamic or client place's, the request too. */
61
+ export type LoaderOf<X extends PlaceType, R = unknown> = X['mode'] extends 'static' ? (params: X['params']) => Effect.Effect<X['input'], LoadError<R>, any> : (params: X['params'], request: Request) => Effect.Effect<X['input'], LoadError<R>, any>;
62
+ /** One Loader per place with an Input, by its dotted name, each Redirecting only to a Route of type `R`. */
63
+ export type LoadersOf<X extends PlaceType, R = unknown> = {
64
+ readonly [P in X as [P['input']] extends [never] ? never : P['name']]: LoaderOf<P, R>;
65
+ };
66
+ declare const STATIC: unique symbol;
67
+ /**
68
+ * Loaders as `router.loaders` gives them: the record, and, by type alone,
69
+ * the names of the static places among them. A server hands those nothing
70
+ * made from the request, since what they answer is the same for everyone.
71
+ */
72
+ export type Loaders<L, Static extends string> = L & {
73
+ readonly [STATIC]?: {
74
+ readonly names: Static;
75
+ };
76
+ };
77
+ /**
78
+ * The names of the static places among Loaders. Loaders `router.loaders`
79
+ * did not give say nothing, so every one of them counts as static.
80
+ */
81
+ export type StaticOf<L> = L extends {
82
+ readonly [STATIC]?: {
83
+ readonly names: infer S extends string;
84
+ };
85
+ } ? S : keyof L & string;
86
+ /**
87
+ * A record of Loaders with exactly the `Wanted` names: a name too many, and
88
+ * the names missing, each say so in the error, by name.
89
+ */
90
+ export type Exactly<L, Wanted extends PropertyKey> = L & {
91
+ readonly [K in Exclude<keyof L & string, Wanted>]: {
92
+ readonly 'is not a place with an Input': K;
93
+ };
94
+ } & ([Exclude<Wanted, keyof L>] extends [never] ? unknown : {
95
+ readonly 'these places have an Input and no Loader': Exclude<Wanted, keyof L>;
96
+ });
97
+ export {};
98
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/routing/route/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Schema } from 'effect';
2
+ export const MODES = ['static', 'dynamic', 'client'];
3
+ /** A Loader's answer: the place it was asked for is not found. */
4
+ export class NotFoundError extends Schema.TaggedError()('NotFound', {}) {
5
+ }
6
+ /**
7
+ * A Loader's answer: go elsewhere instead, to a Route of the app or, with
8
+ * `href`, to a URL outside it. Plain data, so it travels as it is; a Routes
9
+ * tree can check the Route with its `route` Schema. `permanent` is a `308`
10
+ * on the server rather than a `302`.
11
+ */
12
+ export class RedirectError extends Schema.TaggedError()('Redirect', {
13
+ route: Schema.optionalKey(Schema.Unknown),
14
+ href: Schema.optionalKey(Schema.String),
15
+ permanent: Schema.optionalKey(Schema.Boolean),
16
+ }) {
17
+ }
@@ -0,0 +1,44 @@
1
+ /** A place's title, description and the tags that link and share it. */
2
+ export interface Metadata {
3
+ readonly title?: string;
4
+ readonly description?: string;
5
+ /** The one URL this page is known by, whole: `https://acme.dev/blog/hello`. */
6
+ readonly canonical?: string;
7
+ readonly openGraph?: {
8
+ readonly title?: string;
9
+ readonly description?: string;
10
+ readonly image?: string;
11
+ readonly type?: string;
12
+ readonly url?: string;
13
+ };
14
+ /** As the `robots` meta tag says it: `noindex, nofollow`. */
15
+ readonly robots?: string;
16
+ /** More `<meta>` tags, as written. */
17
+ readonly meta?: ReadonlyArray<{
18
+ readonly name?: string;
19
+ readonly property?: string;
20
+ readonly content: string;
21
+ }>;
22
+ /** More `<link>` tags, as written. */
23
+ readonly link?: ReadonlyArray<{
24
+ readonly rel: string;
25
+ readonly href: string;
26
+ } & {
27
+ readonly [attribute: string]: string;
28
+ }>;
29
+ }
30
+ /** The attribute on every tag Metadata writes, so only those are replaced after a move. */
31
+ export declare const MANAGED = "data-kabuki";
32
+ /** One tag Metadata writes besides the title: its element and its attributes, `data-kabuki` among them. */
33
+ export interface Tag {
34
+ readonly tag: 'meta' | 'link';
35
+ readonly attributes: Readonly<Record<string, string>>;
36
+ }
37
+ /** `below` over `above`, field by field, Open Graph's fields too. */
38
+ export declare const merge: (above: Metadata, below: Metadata) => Metadata;
39
+ /**
40
+ * Every tag Metadata writes besides the title, in order: what a server draws
41
+ * in the Document's head, and what the browser replaces after each move.
42
+ */
43
+ export declare const tagsOf: (metadata: Metadata) => ReadonlyArray<Tag>;
44
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/routing/route/metadata.ts"],"names":[],"mappings":"AAMA,wEAAwE;AACxE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAC3B;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAChD,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;KACtC,CACF,CAAC;CACH;AAED,2FAA2F;AAC3F,eAAO,MAAM,OAAO,gBAAgB,CAAC;AAErC,2GAA2G;AAC3G,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAED,qEAAqE;AACrE,eAAO,MAAM,KAAK,UAAW,QAAQ,SAAS,QAAQ,KAAG,QAMxD,CAAC;AAOF;;;GAGG;AACH,eAAO,MAAM,MAAM,aAAc,QAAQ,KAAG,aAAa,CAAC,GAAG,CAIxD,CAAC"}
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Metadata: what a place says about itself to the browser and to search.
3
+ * Written in the Routes, as a value or from the place's params and Input,
4
+ * and merged from the root down: the deepest place that says a field wins.
5
+ */
6
+ /** The attribute on every tag Metadata writes, so only those are replaced after a move. */
7
+ export const MANAGED = 'data-kabuki';
8
+ /** `below` over `above`, field by field, Open Graph's fields too. */
9
+ export const merge = (above, below) => {
10
+ const openGraph = above.openGraph || below.openGraph
11
+ ? { ...above.openGraph, ...below.openGraph }
12
+ : undefined;
13
+ return { ...above, ...below, ...(openGraph ? { openGraph } : {}) };
14
+ };
15
+ const meta = (key, name, content) => content === undefined
16
+ ? []
17
+ : [{ tag: 'meta', attributes: { [key]: name, content } }];
18
+ /**
19
+ * Every tag Metadata writes besides the title, in order: what a server draws
20
+ * in the Document's head, and what the browser replaces after each move.
21
+ */
22
+ export const tagsOf = (metadata) => written(metadata).map(({ tag, attributes }) => ({
23
+ tag,
24
+ attributes: { ...attributes, [MANAGED]: '' },
25
+ }));
26
+ const written = (metadata) => {
27
+ const og = metadata.openGraph ?? {};
28
+ return [
29
+ ...meta('name', 'description', metadata.description),
30
+ ...meta('name', 'robots', metadata.robots),
31
+ ...(metadata.canonical === undefined
32
+ ? []
33
+ : [
34
+ {
35
+ tag: 'link',
36
+ attributes: { rel: 'canonical', href: metadata.canonical },
37
+ },
38
+ ]),
39
+ ...meta('property', 'og:title', og.title),
40
+ ...meta('property', 'og:description', og.description),
41
+ ...meta('property', 'og:image', og.image),
42
+ ...meta('property', 'og:type', og.type),
43
+ ...meta('property', 'og:url', og.url),
44
+ ...(metadata.meta ?? []).map((each) => ({
45
+ tag: 'meta',
46
+ attributes: Object.fromEntries(Object.entries(each).filter(([, value]) => value !== undefined)),
47
+ })),
48
+ ...(metadata.link ?? []).map((each) => ({
49
+ tag: 'link',
50
+ attributes: { ...each },
51
+ })),
52
+ ];
53
+ };
@@ -0,0 +1,162 @@
1
+ import type { Schema } from 'effect';
2
+ import type { LoadersOf, RenderMode } from './loader.ts';
3
+ import type { Metadata } from './metadata.ts';
4
+ export type Fields = Schema.Struct.Fields;
5
+ /** A Schema read and written without Capabilities and at once. */
6
+ export type Codec<T> = Schema.Codec<T, unknown, never, never>;
7
+ /**
8
+ * What a node's Metadata is worked out from: its own params and query, and
9
+ * its data once it is there.
10
+ */
11
+ export type MetadataOf<P extends Fields, Q extends Fields, D> = Metadata | ((values: Schema.Struct.Type<P & Q>, data: [D] extends [never] ? undefined : D | undefined) => Metadata);
12
+ /**
13
+ * One node: a path template, its params and query, the data its Loader
14
+ * gives and its Render Mode, its Metadata, and the nodes under it. `I` is
15
+ * `never` for a node with no data, `M` `undefined` for one that draws as
16
+ * its parent.
17
+ */
18
+ export interface Node<P extends Fields = {}, Q extends Fields = {}, C extends object = {}, I = never, M extends RenderMode | undefined = undefined> {
19
+ readonly path: string;
20
+ readonly params: P;
21
+ readonly query: Q;
22
+ /** The Schema of the data its Loader gives. */
23
+ readonly input: Codec<I> | undefined;
24
+ readonly render: M;
25
+ /** How long, in milliseconds, a copy of its data stays fresh: its parent's unless said. */
26
+ readonly staleTime: number | undefined;
27
+ /** Typed where it is written, in `Page.define`'s options. */
28
+ readonly metadata: Metadata | ((values: any, data: any) => Metadata) | undefined;
29
+ readonly children: C;
30
+ }
31
+ export type AnyNode = Node<any, any, any, any, any>;
32
+ export type Children = {
33
+ readonly [tag: string]: AnyNode;
34
+ };
35
+ export type Simplify<T> = {
36
+ [K in keyof T]: T[K];
37
+ } & {};
38
+ type IsEmpty<C> = [keyof C] extends [never] ? true : false;
39
+ type OwnOf<N> = N extends Node<infer P, infer Q, any, any, any> ? Schema.Struct.Type<P & Q> : never;
40
+ type ParamsOf<N> = N extends Node<infer P, any, any, any, any> ? Schema.Struct.Type<P> : never;
41
+ type QueryOf<N> = N extends Node<any, infer Q, any, any, any> ? Schema.Struct.Type<Q> : never;
42
+ export type ChildrenOf<N> = N extends Node<any, any, infer C, any, any> ? C : never;
43
+ export type DataOf<N> = N extends Node<any, any, any, infer I, any> ? I : never;
44
+ /** A node's Render Mode: its own, else its parent's. */
45
+ type ModeOf<N, Parent extends RenderMode> = N extends Node<any, any, any, any, infer M> ? [M] extends [RenderMode] ? M : Parent : Parent;
46
+ /** The value of one node under its tag: `page` is the level below, if the URL goes there. */
47
+ export type ValueOf<T extends string, N> = Simplify<{
48
+ readonly _tag: T;
49
+ } & OwnOf<N> & (IsEmpty<ChildrenOf<N>> extends true ? {} : {
50
+ readonly page?: LevelOf<ChildrenOf<N>>;
51
+ })>;
52
+ /** Every value one level can hold: one case per child. */
53
+ export type LevelOf<C> = {
54
+ [K in keyof C & string]: ValueOf<K, C[K]>;
55
+ }[keyof C & string];
56
+ /** The Route of a URL that names no place. */
57
+ export type NotFound = {
58
+ readonly _tag: 'NotFound';
59
+ readonly path: string;
60
+ };
61
+ /** Every Route of an app. */
62
+ export type RouteOf<C> = LevelOf<C> | NotFound;
63
+ /** Data of the places of a Route, by dotted name. */
64
+ export type PlaceData = {
65
+ readonly [name: string]: unknown;
66
+ };
67
+ type Ctor<Args, R> = {} extends Args ? (args?: Args) => R : (args: Args) => R;
68
+ /**
69
+ * What one node is in the tree a user holds: a function that makes its
70
+ * Route from its own and its ancestors' params and query, with its children's
71
+ * under it. Each has its data's Schema, if it has data, and where it sits.
72
+ */
73
+ export type NodeApi<N, R, Args> = Ctor<Args, R> & {
74
+ /** Where this node sits: the tags from the root. */
75
+ readonly at: ReadonlyArray<string>;
76
+ } & ([DataOf<N>] extends [never] ? {} : {
77
+ /** The Schema of this place's data: what its Loader answers. */
78
+ readonly data: Codec<DataOf<N>>;
79
+ }) & Tree<ChildrenOf<N>, R, Args>;
80
+ /** A NodeApi per node, nested as written. Each constructor takes its own and its ancestors' params and query. */
81
+ export type Tree<C, R, Inherited> = {
82
+ readonly [K in keyof C & string]: NodeApi<C[K], R, Simplify<Inherited & OwnOf<C[K]>>>;
83
+ };
84
+ /**
85
+ * Every place of a tree, as the types know it. A Loader is handed `params`:
86
+ * every path param down to it, and its own query.
87
+ */
88
+ export type PlacesOf<C, Pre extends string = '', Ps = {}, Mode extends RenderMode = 'static'> = [keyof C] extends [never] ? never : {
89
+ [K in keyof C & string]: {
90
+ readonly name: `${Pre}${K}`;
91
+ readonly params: Simplify<Ps & ParamsOf<C[K]> & QueryOf<C[K]>>;
92
+ readonly input: DataOf<C[K]>;
93
+ readonly mode: ModeOf<C[K], Mode>;
94
+ } | PlacesOf<ChildrenOf<C[K]>, `${Pre}${K}.`, Ps & ParamsOf<C[K]>, ModeOf<C[K], Mode>>;
95
+ }[keyof C & string];
96
+ /** The dotted name of every place of a tree with data: each needs a Loader. */
97
+ export type LoaderNames<C> = LoadersOf<PlacesOf<C>> extends infer L ? keyof L & string : never;
98
+ /** The dotted name of every static place with data among `X`. */
99
+ type StaticIn<X> = X extends {
100
+ readonly name: infer N extends string;
101
+ readonly input: infer I;
102
+ readonly mode: 'static';
103
+ } ? [I] extends [never] ? never : N : never;
104
+ /** The dotted name of every static place of a tree with data. */
105
+ export type StaticNames<C> = StaticIn<PlacesOf<C>>;
106
+ /** The dotted name of every place of a tree. */
107
+ export type NameOf<C> = PlacesOf<C> extends {
108
+ readonly name: infer N extends string;
109
+ } ? N : string;
110
+ /** The names of the params a redirect's path template holds: `/posts/:slug` → `slug`. */
111
+ type ParamsIn<T extends string> = T extends `${string}:${infer Name}/${infer Rest}` ? Name | ParamsIn<`/${Rest}`> : T extends `${string}:${infer Name}` ? Name : never;
112
+ /** Paths that are never a place, each with the Route that replaces it, from the params its template names. */
113
+ export type Redirects<C, D> = {
114
+ readonly [K in keyof D & string]: (routes: Tree<C, RouteOf<C>, {}>, params: {
115
+ readonly [P in ParamsIn<K>]: string;
116
+ }) => RouteOf<C>;
117
+ };
118
+ /** What reading a URL gives: the Route it names, or the Route it is replaced by. */
119
+ export type Read<R> = {
120
+ readonly _tag: 'At';
121
+ readonly route: R;
122
+ } | {
123
+ readonly _tag: 'Redirect';
124
+ readonly route: R;
125
+ };
126
+ /**
127
+ * One place on a Route's path: its dotted name, its key, what its Loader is
128
+ * handed, its Render Mode and its data's Schema.
129
+ */
130
+ export interface Place<Name extends string = string> {
131
+ readonly name: Name;
132
+ /** Its name and every path param down to it: a place whose key is the same is the same Instance. */
133
+ readonly key: string;
134
+ /** What its Loader is handed: every path param down to it, and its own query. */
135
+ readonly params: Readonly<Record<string, unknown>>;
136
+ readonly render: RenderMode;
137
+ /** How long, in milliseconds, a copy of its data stays fresh: `Infinity` for a static place. */
138
+ readonly staleTime: number;
139
+ readonly input: Codec<unknown> | undefined;
140
+ }
141
+ /** One place of the tree, as Schemas: what a Loader RPC is made from. */
142
+ export interface PlaceSchema<Name extends string = string> {
143
+ readonly name: Name;
144
+ /** What its Loader is handed: every path param down to it, its own and its ancestors', and its own query. */
145
+ readonly params: Codec<Record<string, unknown>>;
146
+ readonly render: RenderMode;
147
+ /** How long, in milliseconds, a copy of its data stays fresh: `Infinity` for a static place, fresh until the next deploy. */
148
+ readonly staleTime: number;
149
+ readonly input: Codec<unknown> | undefined;
150
+ }
151
+ /** How the app got to where it is. */
152
+ export type How = 'load' | 'push' | 'replace' | 'back' | 'forward';
153
+ /** A value of one level, as the runtime reads it: its tag and its fields. */
154
+ export type Value = {
155
+ readonly _tag: string;
156
+ readonly [field: string]: unknown;
157
+ };
158
+ export declare const segments: (template: string) => string[];
159
+ export declare const hasChildren: (node: AnyNode) => boolean;
160
+ export declare const dotted: (at: ReadonlyArray<string>) => string;
161
+ export {};
162
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/routing/route/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export const segments = (template) => template.split('/').filter(Boolean);
2
+ export const hasChildren = (node) => Object.keys(node.children).length > 0;
3
+ export const dotted = (at) => at.join('.');
@@ -0,0 +1,15 @@
1
+ import type { RenderMode } from './loader.ts';
2
+ import type { AnyNode, Children, Fields, Place, PlaceSchema, Value } from './node.ts';
3
+ /** The places on a Route's path, from the root down. The not-found Route has none. */
4
+ export declare const placesOn: (children: Children, route: Value, staleTimes: ReadonlyMap<string, number>) => ReadonlyArray<Place>;
5
+ /** The nodes on a Route's path, from the root down, each with its dotted name. */
6
+ export declare const nodesOn: (children: Children, route: Value) => ReadonlyArray<readonly [string, AnyNode]>;
7
+ /**
8
+ * Every place of the tree, as Schemas, from the root down. A place's Stale
9
+ * time is its own, else its parent's, else `staleTime`; a static place's is
10
+ * `Infinity`, and one that says its own throws.
11
+ */
12
+ export declare const allPlaces: (children: Children, staleTime?: number, at?: ReadonlyArray<string>, params?: Fields, render?: RenderMode) => ReadonlyArray<PlaceSchema>;
13
+ /** Every path of the tree, as written from the root: `/projects/:id/tasks/:task`. */
14
+ export declare const pathsOf: (children: Children, above?: string) => ReadonlyArray<readonly [string, string]>;
15
+ //# sourceMappingURL=places.d.ts.map