kiru 0.54.0-preview.1 → 0.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/components/derive.d.ts +1 -1
  2. package/dist/components/derive.d.ts.map +1 -1
  3. package/dist/components/derive.js +2 -3
  4. package/dist/components/derive.js.map +1 -1
  5. package/dist/components/memo.d.ts +1 -3
  6. package/dist/components/memo.d.ts.map +1 -1
  7. package/dist/components/memo.js +2 -2
  8. package/dist/components/memo.js.map +1 -1
  9. package/dist/context.d.ts.map +1 -1
  10. package/dist/context.js +1 -23
  11. package/dist/context.js.map +1 -1
  12. package/dist/dom.d.ts.map +1 -1
  13. package/dist/dom.js +111 -78
  14. package/dist/dom.js.map +1 -1
  15. package/dist/error.d.ts.map +1 -1
  16. package/dist/error.js +2 -4
  17. package/dist/error.js.map +1 -1
  18. package/dist/form/index.d.ts.map +1 -1
  19. package/dist/form/index.js +6 -10
  20. package/dist/form/index.js.map +1 -1
  21. package/dist/globals.d.ts +1 -1
  22. package/dist/globals.d.ts.map +1 -1
  23. package/dist/globals.js.map +1 -1
  24. package/dist/hmr.d.ts +1 -0
  25. package/dist/hmr.d.ts.map +1 -1
  26. package/dist/hmr.js +11 -3
  27. package/dist/hmr.js.map +1 -1
  28. package/dist/hooks/useEffectEvent.d.ts.map +1 -1
  29. package/dist/hooks/useEffectEvent.js.map +1 -1
  30. package/dist/hooks/usePromise.d.ts +1 -2
  31. package/dist/hooks/usePromise.d.ts.map +1 -1
  32. package/dist/hooks/usePromise.js +62 -31
  33. package/dist/hooks/usePromise.js.map +1 -1
  34. package/dist/hooks/utils.d.ts.map +1 -1
  35. package/dist/hooks/utils.js +10 -10
  36. package/dist/hooks/utils.js.map +1 -1
  37. package/dist/hydration.d.ts +6 -13
  38. package/dist/hydration.d.ts.map +1 -1
  39. package/dist/hydration.js +20 -50
  40. package/dist/hydration.js.map +1 -1
  41. package/dist/index.js +2 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/reconciler.d.ts.map +1 -1
  44. package/dist/reconciler.js +3 -6
  45. package/dist/reconciler.js.map +1 -1
  46. package/dist/recursiveRender.d.ts.map +1 -1
  47. package/dist/recursiveRender.js +9 -8
  48. package/dist/recursiveRender.js.map +1 -1
  49. package/dist/renderToString.d.ts.map +1 -1
  50. package/dist/renderToString.js.map +1 -1
  51. package/dist/router/client/index.d.ts +2 -4
  52. package/dist/router/client/index.d.ts.map +1 -1
  53. package/dist/router/client/index.js +13 -59
  54. package/dist/router/client/index.js.map +1 -1
  55. package/dist/router/context.d.ts +5 -2
  56. package/dist/router/context.d.ts.map +1 -1
  57. package/dist/router/context.js +1 -5
  58. package/dist/router/context.js.map +1 -1
  59. package/dist/router/fileRouter.d.ts.map +1 -1
  60. package/dist/router/fileRouter.js +2 -4
  61. package/dist/router/fileRouter.js.map +1 -1
  62. package/dist/router/fileRouterController.d.ts +2 -2
  63. package/dist/router/fileRouterController.d.ts.map +1 -1
  64. package/dist/router/fileRouterController.js +135 -214
  65. package/dist/router/fileRouterController.js.map +1 -1
  66. package/dist/router/globals.d.ts +0 -3
  67. package/dist/router/globals.d.ts.map +1 -1
  68. package/dist/router/globals.js +0 -3
  69. package/dist/router/globals.js.map +1 -1
  70. package/dist/router/head.d.ts.map +1 -1
  71. package/dist/router/head.js +7 -5
  72. package/dist/router/head.js.map +1 -1
  73. package/dist/router/index.d.ts +1 -2
  74. package/dist/router/index.d.ts.map +1 -1
  75. package/dist/router/index.js +1 -2
  76. package/dist/router/index.js.map +1 -1
  77. package/dist/router/link.js +3 -3
  78. package/dist/router/link.js.map +1 -1
  79. package/dist/router/{ssg → server}/index.d.ts +4 -4
  80. package/dist/router/server/index.d.ts.map +1 -0
  81. package/dist/router/{ssg → server}/index.js +7 -9
  82. package/dist/router/server/index.js.map +1 -0
  83. package/dist/router/types.d.ts +16 -42
  84. package/dist/router/types.d.ts.map +1 -1
  85. package/dist/router/types.internal.d.ts +0 -4
  86. package/dist/router/types.internal.d.ts.map +1 -1
  87. package/dist/router/utils/index.d.ts +3 -8
  88. package/dist/router/utils/index.d.ts.map +1 -1
  89. package/dist/router/utils/index.js +8 -40
  90. package/dist/router/utils/index.js.map +1 -1
  91. package/dist/scheduler.d.ts +3 -14
  92. package/dist/scheduler.d.ts.map +1 -1
  93. package/dist/scheduler.js +64 -56
  94. package/dist/scheduler.js.map +1 -1
  95. package/dist/signals/base.d.ts +0 -2
  96. package/dist/signals/base.d.ts.map +1 -1
  97. package/dist/signals/base.js +0 -6
  98. package/dist/signals/base.js.map +1 -1
  99. package/dist/signals/computed.d.ts +3 -0
  100. package/dist/signals/computed.d.ts.map +1 -1
  101. package/dist/signals/computed.js +29 -20
  102. package/dist/signals/computed.js.map +1 -1
  103. package/dist/signals/for.d.ts +3 -3
  104. package/dist/signals/for.d.ts.map +1 -1
  105. package/dist/signals/for.js +2 -1
  106. package/dist/signals/for.js.map +1 -1
  107. package/dist/signals/utils.d.ts.map +1 -1
  108. package/dist/signals/utils.js +2 -1
  109. package/dist/signals/utils.js.map +1 -1
  110. package/dist/signals/watch.d.ts.map +1 -1
  111. package/dist/signals/watch.js +18 -22
  112. package/dist/signals/watch.js.map +1 -1
  113. package/dist/ssr/client.d.ts +1 -1
  114. package/dist/ssr/client.d.ts.map +1 -1
  115. package/dist/ssr/client.js +0 -2
  116. package/dist/ssr/client.js.map +1 -1
  117. package/dist/ssr/server.d.ts +3 -9
  118. package/dist/ssr/server.d.ts.map +1 -1
  119. package/dist/ssr/server.js +30 -37
  120. package/dist/ssr/server.js.map +1 -1
  121. package/dist/types.d.ts +0 -7
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/types.dom.d.ts +3 -3
  124. package/dist/types.dom.d.ts.map +1 -1
  125. package/dist/utils/format.d.ts +1 -2
  126. package/dist/utils/format.d.ts.map +1 -1
  127. package/dist/utils/format.js +1 -4
  128. package/dist/utils/format.js.map +1 -1
  129. package/dist/utils/index.d.ts +1 -1
  130. package/dist/utils/index.d.ts.map +1 -1
  131. package/dist/utils/index.js +1 -1
  132. package/dist/utils/index.js.map +1 -1
  133. package/dist/utils/promise.d.ts +0 -2
  134. package/dist/utils/promise.d.ts.map +1 -1
  135. package/dist/utils/promise.js +1 -45
  136. package/dist/utils/promise.js.map +1 -1
  137. package/dist/utils/runtime.d.ts +3 -2
  138. package/dist/utils/runtime.d.ts.map +1 -1
  139. package/dist/utils/runtime.js +5 -2
  140. package/dist/utils/runtime.js.map +1 -1
  141. package/dist/utils/vdom.d.ts.map +1 -1
  142. package/dist/utils/vdom.js +2 -2
  143. package/dist/utils/vdom.js.map +1 -1
  144. package/package.json +4 -8
  145. package/src/components/derive.ts +3 -5
  146. package/src/components/memo.ts +3 -11
  147. package/src/context.ts +1 -24
  148. package/src/dom.ts +146 -101
  149. package/src/error.ts +2 -4
  150. package/src/form/index.ts +6 -9
  151. package/src/globals.ts +1 -1
  152. package/src/hmr.ts +14 -5
  153. package/src/hooks/useEffectEvent.ts +0 -1
  154. package/src/hooks/usePromise.ts +77 -58
  155. package/src/hooks/utils.ts +12 -12
  156. package/src/hydration.ts +21 -57
  157. package/src/index.ts +1 -1
  158. package/src/reconciler.ts +2 -6
  159. package/src/recursiveRender.ts +10 -9
  160. package/src/renderToString.ts +0 -1
  161. package/src/router/client/index.ts +16 -114
  162. package/src/router/context.ts +6 -7
  163. package/src/router/fileRouter.ts +2 -6
  164. package/src/router/fileRouterController.ts +161 -324
  165. package/src/router/globals.ts +0 -4
  166. package/src/router/head.ts +7 -5
  167. package/src/router/index.ts +1 -12
  168. package/src/router/link.ts +3 -3
  169. package/src/router/{ssg → server}/index.ts +13 -18
  170. package/src/router/types.internal.ts +0 -5
  171. package/src/router/types.ts +16 -53
  172. package/src/router/utils/index.ts +16 -79
  173. package/src/scheduler.ts +85 -89
  174. package/src/signals/base.ts +0 -8
  175. package/src/signals/computed.ts +30 -18
  176. package/src/signals/for.ts +15 -10
  177. package/src/signals/utils.ts +2 -1
  178. package/src/signals/watch.ts +27 -22
  179. package/src/ssr/client.ts +1 -4
  180. package/src/ssr/server.ts +34 -59
  181. package/src/types.dom.ts +4 -5
  182. package/src/types.ts +0 -10
  183. package/src/utils/format.ts +0 -5
  184. package/src/utils/index.ts +1 -1
  185. package/src/utils/promise.ts +1 -70
  186. package/src/utils/runtime.ts +6 -2
  187. package/src/utils/vdom.ts +2 -7
  188. package/dist/router/constants.d.ts +0 -2
  189. package/dist/router/constants.d.ts.map +0 -1
  190. package/dist/router/constants.js +0 -2
  191. package/dist/router/constants.js.map +0 -1
  192. package/dist/router/guard.d.ts +0 -17
  193. package/dist/router/guard.d.ts.map +0 -1
  194. package/dist/router/guard.js +0 -45
  195. package/dist/router/guard.js.map +0 -1
  196. package/dist/router/ssg/index.d.ts.map +0 -1
  197. package/dist/router/ssg/index.js.map +0 -1
  198. package/dist/router/ssr/index.d.ts +0 -20
  199. package/dist/router/ssr/index.d.ts.map +0 -1
  200. package/dist/router/ssr/index.js +0 -163
  201. package/dist/router/ssr/index.js.map +0 -1
  202. package/src/router/constants.ts +0 -1
  203. package/src/router/guard.ts +0 -72
  204. package/src/router/ssr/index.ts +0 -252
@@ -1,72 +0,0 @@
1
- import type { NavigationHook } from "./types"
2
- import type { GuardModule } from "./types.internal"
3
-
4
- export type GuardBeforeEach = NavigationHook<
5
- void | string | Promise<void | string>
6
- >
7
- export type GuardAfterEach = NavigationHook<void | Promise<void>>
8
-
9
- export interface NavGuard {
10
- beforeEach: GuardBeforeEach
11
- afterEach: GuardAfterEach
12
- }
13
-
14
- export const $NAVGUARD_INTERNAL = Symbol.for("kiru:navguard")
15
-
16
- export function resolveNavguard(module: GuardModule): NavGuard | null {
17
- if (
18
- "guard" in module &&
19
- $NAVGUARD_INTERNAL in ((module.guard ?? {}) as NavGuardBuilder)
20
- ) {
21
- return (module.guard as NavGuardBuilder)[$NAVGUARD_INTERNAL]
22
- }
23
- return null
24
- }
25
-
26
- export interface NavGuardBuilder {
27
- beforeEach(...fns: GuardBeforeEach[]): NavGuardBuilder
28
- afterEach(...fns: GuardAfterEach[]): NavGuardBuilder
29
- get [$NAVGUARD_INTERNAL](): NavGuard
30
- }
31
-
32
- function createNavGuard_impl(
33
- beforeEach: GuardBeforeEach[],
34
- afterEach: GuardAfterEach[]
35
- ): NavGuard {
36
- return {
37
- beforeEach: async (ctx, to, from) => {
38
- for (const fn of beforeEach) {
39
- const res = await fn(ctx, to, from)
40
- if (typeof res === "string") {
41
- return res
42
- }
43
- }
44
- return
45
- },
46
- afterEach: async (ctx, to, from) => {
47
- for (const fn of afterEach) {
48
- await fn(ctx, to, from)
49
- }
50
- },
51
- }
52
- }
53
-
54
- export function createNavGuard(): NavGuardBuilder {
55
- const beforeEach: GuardBeforeEach[] = []
56
- const afterEach: GuardAfterEach[] = []
57
- const guard = createNavGuard_impl(beforeEach, afterEach)
58
-
59
- return {
60
- beforeEach(...fns: GuardBeforeEach[]) {
61
- beforeEach.push(...fns)
62
- return this
63
- },
64
- afterEach(...fns: GuardAfterEach[]) {
65
- afterEach.push(...fns)
66
- return this
67
- },
68
- get [$NAVGUARD_INTERNAL]() {
69
- return guard
70
- },
71
- }
72
- }
@@ -1,252 +0,0 @@
1
- import path from "path"
2
- import { createElement, Fragment } from "../../element.js"
3
- import { __DEV__ } from "../../env.js"
4
- import { renderToString } from "../../renderToString.js"
5
- import { renderToReadableStream } from "../../ssr/server.js"
6
- import { toArray } from "../../utils/format.js"
7
- import {
8
- matchModules,
9
- matchRoute,
10
- match404Route,
11
- parseQuery,
12
- wrapWithLayouts,
13
- runBeforeEachGuards,
14
- runAfterEachGuards,
15
- runBeforeEnterHooks,
16
- } from "../utils/index.js"
17
- import { RouterContext, RequestContext } from "../context.js"
18
- import type { PageConfig, PageProps, RouterState } from "../types.js"
19
- import type {
20
- FormattedViteImportMap,
21
- GuardModule,
22
- PageModule,
23
- } from "../types.internal.js"
24
- import { createStatefulPromise } from "../../utils/promise.js"
25
- import { PAGE_DATA_PROMISE_ID } from "../constants.js"
26
-
27
- export interface SSRRenderContext {
28
- pages: FormattedViteImportMap<PageModule>
29
- layouts: FormattedViteImportMap
30
- guards: FormattedViteImportMap<GuardModule>
31
- Document: Kiru.FC
32
- userContext: Kiru.RequestContext
33
- registerModule: (moduleId: string) => void
34
- }
35
-
36
- export interface SSRHttpResponse {
37
- html: string
38
- statusCode: number
39
- headers: Array<[string, string]>
40
- stream: ReadableStream | null
41
- }
42
-
43
- export interface SSRRenderResult {
44
- httpResponse: SSRHttpResponse | null
45
- }
46
-
47
- export async function render(
48
- url: string,
49
- ctx: SSRRenderContext
50
- ): Promise<SSRRenderResult> {
51
- const extName = path.extname(url)
52
- if (extName && extName.length > 0) {
53
- return { httpResponse: null }
54
- } else if (url.startsWith("/@")) {
55
- return { httpResponse: null }
56
- }
57
-
58
- const u = new URL(url, "http://localhost")
59
- const pathSegments = u.pathname.split("/").filter(Boolean)
60
- let routeMatch = matchRoute(ctx.pages, pathSegments)
61
-
62
- if (!routeMatch) {
63
- // Try to find a 404 page in parent directories
64
- const fourOhFourMatch = match404Route(ctx.pages, pathSegments)
65
- if (fourOhFourMatch) {
66
- routeMatch = fourOhFourMatch
67
- } else {
68
- // Fallback to root 404 or default fallback
69
- if (url === "/404") {
70
- if (__DEV__) {
71
- console.warn(
72
- "[kiru/router]: No 404 route defined. Using fallback 404 page."
73
- )
74
- }
75
- return {
76
- httpResponse: {
77
- statusCode: 404,
78
- headers: [["Content-Type", "text/html"]],
79
- html: "<!doctype html><html><head><title>Not Found</title></head><body><h1>404</h1></body></html>",
80
- stream: null,
81
- },
82
- }
83
- }
84
- // Recursively render the 404 page
85
- const notFoundResponse = await render("/404", ctx)
86
- return {
87
- httpResponse: {
88
- html: notFoundResponse.httpResponse?.html ?? "",
89
- headers: notFoundResponse.httpResponse?.headers ?? [
90
- ["Content-Type", "text/html"],
91
- ],
92
- ...notFoundResponse,
93
- statusCode: 404,
94
- stream: null,
95
- },
96
- }
97
- }
98
- }
99
- const { pageEntry, routeSegments, params } = routeMatch
100
- const is404Route = routeMatch.routeSegments.includes("404")
101
-
102
- const guardEntries = matchModules(ctx.guards, routeSegments)
103
- const guardModules = await Promise.all(
104
- guardEntries.map((entry) => entry.load() as unknown as Promise<GuardModule>)
105
- )
106
-
107
- const redirectPath = await runBeforeEachGuards(
108
- guardModules,
109
- { ...ctx.userContext },
110
- u.pathname
111
- )
112
-
113
- if (redirectPath !== null) {
114
- return createRedirectResult(redirectPath)
115
- }
116
-
117
- const layoutEntries = matchModules(ctx.layouts, routeSegments)
118
-
119
- // Register all modules for CSS collection
120
- ;[pageEntry, ...layoutEntries].forEach((e) => {
121
- ctx.registerModule(e.filePath)
122
- })
123
-
124
- const [page, ...layouts] = await Promise.all([
125
- pageEntry.load(),
126
- ...layoutEntries.map((layoutEntry) => layoutEntry.load()),
127
- ])
128
-
129
- const onBeforeEnter = page.config?.hooks?.onBeforeEnter
130
- if (onBeforeEnter) {
131
- const redirectPath = await runBeforeEnterHooks(
132
- toArray(onBeforeEnter),
133
- { ...ctx.userContext },
134
- u.pathname
135
- )
136
- if (redirectPath !== null) {
137
- return createRedirectResult(redirectPath)
138
- }
139
- }
140
-
141
- let documentShell = renderToString(createElement(ctx.Document))
142
-
143
- if (
144
- documentShell.includes("</body>") ||
145
- !documentShell.includes("<kiru-body-outlet>")
146
- ) {
147
- throw new Error(
148
- "[kiru/router]: Document is expected to contain a <Body.Outlet> element. See https://kirujs.dev/docs/api/file-router#general-usage"
149
- )
150
- }
151
-
152
- const query = parseQuery(u.search)
153
-
154
- let props = {} as PageProps<PageConfig>
155
- const config = page.config ?? {}
156
- const abortSignal = new AbortController().signal
157
-
158
- const routerState: RouterState = {
159
- params,
160
- query,
161
- pathname: u.pathname,
162
- hash: "",
163
- signal: abortSignal,
164
- }
165
-
166
- let pageDataPromise: Kiru.StatefulPromise<unknown> | null = null
167
- if (config.loader && !config.loader.static) {
168
- props = {
169
- data: null,
170
- error: null,
171
- loading: true,
172
- }
173
- const promise = config.loader.load({
174
- ...routerState,
175
- context: { ...ctx.userContext },
176
- })
177
- pageDataPromise = createStatefulPromise(PAGE_DATA_PROMISE_ID, promise)
178
- }
179
-
180
- const children = wrapWithLayouts(
181
- layouts
182
- .map((layout) => layout.default)
183
- .filter((l) => typeof l === "function"),
184
- page.default,
185
- props
186
- )
187
-
188
- const app = createElement(RouterContext.Provider, {
189
- children: createElement(RequestContext.Provider, {
190
- children: Fragment({ children }),
191
- value: ctx.userContext,
192
- }),
193
- value: { state: routerState },
194
- })
195
-
196
- let { immediate: pageOutletContent, stream } = renderToReadableStream(app, {
197
- data: pageDataPromise ? [pageDataPromise] : [],
198
- })
199
-
200
- const hasHeadContent = pageOutletContent.includes("<kiru-head-content>")
201
- const hasHeadOutlet = documentShell.includes("<kiru-head-outlet>")
202
-
203
- if (hasHeadOutlet && hasHeadContent) {
204
- let [preHeadContent = "", headContentInner = "", postHeadContent = ""] =
205
- pageOutletContent.split(/<kiru-head-content>|<\/kiru-head-content>/)
206
-
207
- documentShell = documentShell.replace(
208
- "<kiru-head-outlet>",
209
- headContentInner
210
- )
211
- pageOutletContent = `${preHeadContent}${postHeadContent}`
212
- } else if (hasHeadContent) {
213
- // remove head content element and everything within it
214
- pageOutletContent = pageOutletContent.replace(
215
- /<kiru-head-content>(.*?)<\/kiru-head-content>/,
216
- ""
217
- )
218
- } else if (hasHeadOutlet) {
219
- // remove head outlet element and everything within it
220
- documentShell = documentShell.replaceAll("<kiru-head-outlet>", "")
221
- }
222
-
223
- const [prePageOutlet, postPageOutlet] =
224
- documentShell.split("<kiru-body-outlet>")
225
-
226
- const html = `<!DOCTYPE html>${prePageOutlet}<body>${pageOutletContent}</body>${postPageOutlet}`
227
- const statusCode = is404Route ? 404 : 200
228
-
229
- queueMicrotask(() => {
230
- runAfterEachGuards(guardModules, { ...ctx.userContext }, u.pathname)
231
- })
232
-
233
- return {
234
- httpResponse: {
235
- html,
236
- statusCode,
237
- headers: [["Content-Type", "text/html;charset=utf-8"]],
238
- stream,
239
- },
240
- }
241
- }
242
-
243
- function createRedirectResult(to: string): SSRRenderResult {
244
- return {
245
- httpResponse: {
246
- statusCode: 302,
247
- headers: [["Location", to]],
248
- html: "",
249
- stream: null,
250
- },
251
- }
252
- }