kiru 0.54.0-preview.0 → 0.54.0

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