kiru 0.53.0 → 0.54.0-preview.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 (118) 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 +3 -2
  4. package/dist/components/derive.js.map +1 -1
  5. package/dist/dom.d.ts.map +1 -1
  6. package/dist/dom.js +6 -2
  7. package/dist/dom.js.map +1 -1
  8. package/dist/globals.d.ts +1 -1
  9. package/dist/globals.d.ts.map +1 -1
  10. package/dist/globals.js.map +1 -1
  11. package/dist/hooks/usePromise.d.ts +2 -1
  12. package/dist/hooks/usePromise.d.ts.map +1 -1
  13. package/dist/hooks/usePromise.js +31 -62
  14. package/dist/hooks/usePromise.js.map +1 -1
  15. package/dist/index.js +1 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/router/client/index.d.ts +4 -2
  18. package/dist/router/client/index.d.ts.map +1 -1
  19. package/dist/router/client/index.js +59 -13
  20. package/dist/router/client/index.js.map +1 -1
  21. package/dist/router/constants.d.ts +2 -0
  22. package/dist/router/constants.d.ts.map +1 -0
  23. package/dist/router/constants.js +2 -0
  24. package/dist/router/constants.js.map +1 -0
  25. package/dist/router/context.d.ts +2 -0
  26. package/dist/router/context.d.ts.map +1 -1
  27. package/dist/router/context.js +5 -1
  28. package/dist/router/context.js.map +1 -1
  29. package/dist/router/fileRouterController.d.ts +2 -0
  30. package/dist/router/fileRouterController.d.ts.map +1 -1
  31. package/dist/router/fileRouterController.js +195 -107
  32. package/dist/router/fileRouterController.js.map +1 -1
  33. package/dist/router/globals.d.ts +3 -0
  34. package/dist/router/globals.d.ts.map +1 -1
  35. package/dist/router/globals.js +3 -0
  36. package/dist/router/globals.js.map +1 -1
  37. package/dist/router/guard.d.ts +17 -0
  38. package/dist/router/guard.d.ts.map +1 -0
  39. package/dist/router/guard.js +45 -0
  40. package/dist/router/guard.js.map +1 -0
  41. package/dist/router/head.d.ts.map +1 -1
  42. package/dist/router/head.js +5 -7
  43. package/dist/router/head.js.map +1 -1
  44. package/dist/router/index.d.ts +2 -1
  45. package/dist/router/index.d.ts.map +1 -1
  46. package/dist/router/index.js +2 -1
  47. package/dist/router/index.js.map +1 -1
  48. package/dist/router/{server → ssg}/index.d.ts +4 -3
  49. package/dist/router/ssg/index.d.ts.map +1 -0
  50. package/dist/router/{server → ssg}/index.js +8 -5
  51. package/dist/router/ssg/index.js.map +1 -0
  52. package/dist/router/ssr/index.d.ts +20 -0
  53. package/dist/router/ssr/index.d.ts.map +1 -0
  54. package/dist/router/ssr/index.js +163 -0
  55. package/dist/router/ssr/index.js.map +1 -0
  56. package/dist/router/types.d.ts +42 -16
  57. package/dist/router/types.d.ts.map +1 -1
  58. package/dist/router/types.internal.d.ts +4 -0
  59. package/dist/router/types.internal.d.ts.map +1 -1
  60. package/dist/router/utils/index.d.ts +8 -3
  61. package/dist/router/utils/index.d.ts.map +1 -1
  62. package/dist/router/utils/index.js +38 -6
  63. package/dist/router/utils/index.js.map +1 -1
  64. package/dist/scheduler.d.ts +14 -3
  65. package/dist/scheduler.d.ts.map +1 -1
  66. package/dist/scheduler.js +3 -4
  67. package/dist/scheduler.js.map +1 -1
  68. package/dist/ssr/client.d.ts +1 -1
  69. package/dist/ssr/client.d.ts.map +1 -1
  70. package/dist/ssr/server.d.ts +9 -3
  71. package/dist/ssr/server.d.ts.map +1 -1
  72. package/dist/ssr/server.js +37 -30
  73. package/dist/ssr/server.js.map +1 -1
  74. package/dist/types.d.ts +3 -0
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/utils/format.d.ts +2 -1
  77. package/dist/utils/format.d.ts.map +1 -1
  78. package/dist/utils/format.js +4 -1
  79. package/dist/utils/format.js.map +1 -1
  80. package/dist/utils/index.d.ts +1 -1
  81. package/dist/utils/index.d.ts.map +1 -1
  82. package/dist/utils/index.js +1 -1
  83. package/dist/utils/index.js.map +1 -1
  84. package/dist/utils/promise.d.ts +2 -0
  85. package/dist/utils/promise.d.ts.map +1 -1
  86. package/dist/utils/promise.js +45 -1
  87. package/dist/utils/promise.js.map +1 -1
  88. package/dist/utils/runtime.d.ts +1 -1
  89. package/dist/utils/runtime.js +1 -1
  90. package/package.json +8 -4
  91. package/src/components/derive.ts +5 -3
  92. package/src/dom.ts +5 -1
  93. package/src/globals.ts +1 -1
  94. package/src/hooks/usePromise.ts +57 -77
  95. package/src/index.ts +1 -1
  96. package/src/router/client/index.ts +114 -16
  97. package/src/router/constants.ts +1 -0
  98. package/src/router/context.ts +7 -1
  99. package/src/router/fileRouterController.ts +304 -132
  100. package/src/router/globals.ts +4 -0
  101. package/src/router/guard.ts +72 -0
  102. package/src/router/head.ts +5 -7
  103. package/src/router/index.ts +12 -1
  104. package/src/router/{server → ssg}/index.ts +17 -10
  105. package/src/router/ssr/index.ts +252 -0
  106. package/src/router/types.internal.ts +5 -0
  107. package/src/router/types.ts +53 -16
  108. package/src/router/utils/index.ts +74 -8
  109. package/src/scheduler.ts +20 -3
  110. package/src/ssr/client.ts +1 -1
  111. package/src/ssr/server.ts +58 -34
  112. package/src/types.ts +3 -0
  113. package/src/utils/format.ts +5 -0
  114. package/src/utils/index.ts +1 -1
  115. package/src/utils/promise.ts +70 -1
  116. package/src/utils/runtime.ts +1 -1
  117. package/dist/router/server/index.d.ts.map +0 -1
  118. package/dist/router/server/index.js.map +0 -1
@@ -1,19 +1,27 @@
1
1
  import { createElement } from "../../element.js"
2
2
  import { __DEV__ } from "../../env.js"
3
+ import { resolveNavguard } from "../guard.js"
3
4
  import type {
5
+ DefaultComponentModule,
4
6
  FormattedViteImportMap,
7
+ GuardModule,
5
8
  RouteMatch,
6
9
  ViteImportMap,
7
10
  } from "../types.internal"
11
+ import { OnBeforeEnterHook, OnBeforeLeaveHook } from "../types.js"
8
12
 
9
13
  export {
10
14
  formatViteImportMap,
11
15
  matchRoute,
12
16
  match404Route,
13
- matchLayouts,
17
+ matchModules,
14
18
  normalizePrefixPath,
15
19
  parseQuery,
16
20
  wrapWithLayouts,
21
+ runBeforeLeaveHooks,
22
+ runBeforeEnterHooks,
23
+ runBeforeEachGuards,
24
+ runAfterEachGuards,
17
25
  }
18
26
 
19
27
  function formatViteImportMap(
@@ -177,20 +185,20 @@ function match404Route(
177
185
  return null
178
186
  }
179
187
 
180
- function matchLayouts(
181
- layouts: FormattedViteImportMap,
188
+ function matchModules<T = DefaultComponentModule>(
189
+ modules: FormattedViteImportMap<T>,
182
190
  routeSegments: string[]
183
191
  ) {
184
192
  return ["/", ...routeSegments].reduce((acc, _, i) => {
185
- const layoutPath = "/" + routeSegments.slice(0, i).join("/")
186
- const layout = layouts[layoutPath]
193
+ const modulePath = "/" + routeSegments.slice(0, i).join("/")
194
+ const module = modules[modulePath]
187
195
 
188
- if (!layout) {
196
+ if (!module) {
189
197
  return acc
190
198
  }
191
199
 
192
- return [...acc, layout]
193
- }, [] as FormattedViteImportMap[string][])
200
+ return [...acc, module]
201
+ }, [] as FormattedViteImportMap<T>[string][])
194
202
  }
195
203
 
196
204
  function normalizePrefixPath(path: string) {
@@ -239,3 +247,61 @@ function wrapWithLayouts(
239
247
  createElement(page, props)
240
248
  )
241
249
  }
250
+
251
+ function runBeforeLeaveHooks(
252
+ hooks: OnBeforeLeaveHook[],
253
+ context: Kiru.RequestContext,
254
+ to: string,
255
+ from: string = to
256
+ ): false | void {
257
+ for (const hook of hooks) {
258
+ const res = hook(context, to, from)
259
+ if (res === false) {
260
+ return false
261
+ }
262
+ }
263
+ }
264
+
265
+ async function runBeforeEnterHooks(
266
+ hooks: OnBeforeEnterHook[],
267
+ context: Kiru.RequestContext,
268
+ to: string,
269
+ from: string = to
270
+ ) {
271
+ for (const hook of hooks) {
272
+ const result = await hook(context, to, from)
273
+ if (typeof result === "string") {
274
+ return result
275
+ }
276
+ }
277
+
278
+ return null
279
+ }
280
+
281
+ async function runBeforeEachGuards(
282
+ guardModules: GuardModule[],
283
+ context: Kiru.RequestContext,
284
+ to: string,
285
+ from: string = to
286
+ ): Promise<string | null> {
287
+ const beforeHooks = guardModules
288
+ .map((guardModule) => resolveNavguard(guardModule)?.beforeEach)
289
+ .filter((x) => typeof x === "function")
290
+
291
+ return runBeforeEnterHooks(beforeHooks, context, to, from)
292
+ }
293
+
294
+ async function runAfterEachGuards(
295
+ guardModules: GuardModule[],
296
+ context: Kiru.RequestContext,
297
+ to: string,
298
+ from: string = to
299
+ ): Promise<void> {
300
+ const afterHooks = guardModules
301
+ .map((guardModule) => resolveNavguard(guardModule)?.afterEach)
302
+ .filter((x) => typeof x === "function")
303
+
304
+ for (const hook of afterHooks) {
305
+ await hook(context, to, from)
306
+ }
307
+ }
package/src/scheduler.ts CHANGED
@@ -52,10 +52,27 @@ let postEffects: Array<Function> = []
52
52
  let animationFrameHandle = -1
53
53
 
54
54
  /**
55
- * Runs a function after any existing work has been completed,
56
- * or immediately if the scheduler is already idle.
55
+ * Defers work until the scheduler becomes idle.
56
+ *
57
+ * This works in two modes:
58
+ * - `await nextIdle()` resolves once idle, allowing async/await usage.
59
+ * - `nextIdle(fn)` schedules a callback to run when idle.
60
+ *
61
+ * Callbacks are executed before promises resolve,
62
+ * and multiple calls queue until the scheduler becomes idle.
57
63
  */
58
- export function nextIdle(fn: () => void) {
64
+ export function nextIdle(): Promise<void>
65
+
66
+ /**
67
+ * Schedules `fn` to run once the scheduler becomes idle.
68
+ * If already idle, `fn` executes immediately.
69
+ */
70
+ export function nextIdle<T extends () => void>(fn: T): void
71
+
72
+ export function nextIdle(fn?: () => void): void | Promise<void> {
73
+ if (!fn) {
74
+ return new Promise<void>(nextIdle)
75
+ }
59
76
  if (isRunningOrQueued) {
60
77
  nextIdleEffects.push(fn)
61
78
  return
package/src/ssr/client.ts CHANGED
@@ -10,7 +10,7 @@ interface HydrationAppContextOptions extends AppContextOptions {
10
10
  * - "dynamic": SSR with lazy promise hydration
11
11
  * @default "dynamic"
12
12
  */
13
- hydrationMode?: "static" | "dynamic"
13
+ hydrationMode?: Kiru.HydrationMode
14
14
  }
15
15
 
16
16
  export function hydrate(
package/src/ssr/server.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { Readable } from "node:stream"
2
1
  import { Fragment } from "../element.js"
3
2
  import { renderMode } from "../globals.js"
4
3
  import { STREAMED_DATA_EVENT } from "../constants.js"
@@ -19,54 +18,79 @@ d.querySelectorAll("[k-data]").forEach((p) => {
19
18
  });
20
19
  d.currentScript.remove()
21
20
  </script>
22
- `
21
+ `.replace(/\s+/g, " ")
23
22
 
24
- export function renderToReadableStream(element: JSX.Element): {
23
+ interface RenderToReadableStreamConfig {
24
+ /**
25
+ * Include additional data to stream - must be resolved on the client manually.
26
+ */
27
+ data?: Kiru.StatefulPromise<unknown>[]
28
+ }
29
+
30
+ export function renderToReadableStream(
31
+ element: JSX.Element,
32
+ config: RenderToReadableStreamConfig = {}
33
+ ): {
25
34
  immediate: string
26
- stream: Readable
35
+ stream: ReadableStream | null
27
36
  } {
28
- const stream = new Readable({ read() {} })
29
- const rootNode = Fragment({ children: element })
30
- const streamPromises = new Set<Kiru.StatefulPromise<unknown>>()
31
- const pendingWritePromises: Promise<void>[] = []
37
+ const streamData = createStreamDataHandler()
38
+ if (config.data) {
39
+ streamData.enqueue(config.data)
40
+ }
32
41
 
33
42
  let immediate = ""
34
-
35
43
  const ctx: HeadlessRenderContext = {
36
44
  write: (chunk) => (immediate += chunk),
37
- onStreamData(data) {
38
- for (const promise of data) {
39
- if (streamPromises.has(promise)) continue
40
- streamPromises.add(promise)
41
-
42
- const writePromise = promise
43
- .then(() => ({ data: promise.value }))
44
- .catch(() => ({ error: promise.error?.message }))
45
- .then((value) => {
46
- const content = JSON.stringify(value)
47
- stream.push(
48
- `<script id="${promise.id}" k-data type="application/json">${content}</script>`
49
- )
50
- })
51
-
52
- pendingWritePromises.push(writePromise)
53
- }
54
- },
45
+ onStreamData: streamData.enqueue,
55
46
  }
56
47
 
57
48
  const prev = renderMode.current
58
49
  renderMode.current = "stream"
59
- headlessRender(ctx, rootNode, null, 0)
50
+ headlessRender(ctx, Fragment({ children: element }), null, 0)
60
51
  renderMode.current = prev
61
52
 
62
- if (pendingWritePromises.length > 0) {
63
- Promise.all(pendingWritePromises).then(() => {
64
- stream.push(STREAMED_DATA_SETUP)
65
- stream.push(null)
53
+ let stream: ReadableStream | null = null
54
+ if (streamData.chunks.length > 0) {
55
+ stream = new ReadableStream({
56
+ async pull(controller) {
57
+ for await (const chunk of streamData.chunks) {
58
+ controller.enqueue(chunk)
59
+ }
60
+ controller.enqueue(STREAMED_DATA_SETUP)
61
+ controller.close()
62
+ },
66
63
  })
67
- } else {
68
- stream.push(null)
69
64
  }
70
65
 
71
66
  return { immediate, stream }
72
67
  }
68
+
69
+ interface StreamDataHandler {
70
+ enqueue: NonNullable<HeadlessRenderContext["onStreamData"]>
71
+ chunks: Promise<string>[]
72
+ }
73
+
74
+ function createStreamDataHandler(): StreamDataHandler {
75
+ const seen = new Set<Kiru.StatefulPromise<unknown>>()
76
+ const chunks: Promise<string>[] = []
77
+
78
+ return {
79
+ chunks,
80
+ enqueue: (items) => {
81
+ for (const item of items) {
82
+ if (seen.has(item)) continue
83
+ seen.add(item)
84
+
85
+ const chunk = item
86
+ .then(() => ({ data: item.value }))
87
+ .catch(() => ({ error: item.error?.message }))
88
+ .then(
89
+ (value, content = JSON.stringify(value)) =>
90
+ `<script id="${item.id}" k-data type="application/json">${content}</script>`
91
+ )
92
+ chunks.push(chunk)
93
+ }
94
+ },
95
+ }
96
+ }
package/src/types.ts CHANGED
@@ -117,6 +117,8 @@ declare global {
117
117
  }
118
118
  }
119
119
  namespace Kiru {
120
+ interface RequestContext {}
121
+
120
122
  interface CustomEvents {}
121
123
 
122
124
  interface ProviderProps<T> {
@@ -173,6 +175,7 @@ declare global {
173
175
 
174
176
  interface StatefulPromise<T> extends Promise<T>, PromiseState<T> {}
175
177
 
178
+ type HydrationMode = "static" | "dynamic"
176
179
  type RenderMode = "dom" | "hydrate" | "string" | "stream"
177
180
 
178
181
  type StateSetter<T> = T | ((prev: T) => T)
@@ -2,6 +2,7 @@ import { unwrap } from "../signals/utils.js"
2
2
  import { booleanAttributes, snakeCaseAttributes } from "../constants.js"
3
3
 
4
4
  export {
5
+ toArray,
5
6
  className,
6
7
  encodeHtmlEntities,
7
8
  propFilters,
@@ -20,6 +21,10 @@ const REGEX_DBLQT = /"/g
20
21
  const REGEX_SLASH = /\//g
21
22
  const REGEX_ALPHA_UPPER = /[A-Z]/g
22
23
 
24
+ function toArray<T>(value: T | T[]): T[] {
25
+ return Array.isArray(value) ? value : [value]
26
+ }
27
+
23
28
  function className(...classes: (string | false | null | undefined)[]): string {
24
29
  return classes.filter(Boolean).join(" ")
25
30
  }
@@ -1,6 +1,6 @@
1
1
  export * from "./compare.js"
2
2
  export * from "./dom.js"
3
3
  export * from "./format.js"
4
+ export * from "./generateId.js"
4
5
  export * from "./runtime.js"
5
6
  export * from "./vdom.js"
6
- export * from "./generateId.js"
@@ -1,4 +1,4 @@
1
- import { $STREAM_DATA } from "../constants.js"
1
+ import { $STREAM_DATA, STREAMED_DATA_EVENT } from "../constants.js"
2
2
 
3
3
  export interface StreamDataThrowValue {
4
4
  [$STREAM_DATA]: {
@@ -24,3 +24,72 @@ export function isStatefulPromise(
24
24
  ): thing is Kiru.StatefulPromise<unknown> {
25
25
  return thing instanceof Promise && "id" in thing && "state" in thing
26
26
  }
27
+
28
+ export function createStatefulPromise<T, U extends Record<string, unknown>>(
29
+ id: string,
30
+ promise: Promise<T>,
31
+ extra: U = {} as U,
32
+ _finally: null | (() => void) = null
33
+ ): Kiru.StatefulPromise<T> & U {
34
+ const state: Kiru.PromiseState<T> = { id, state: "pending" }
35
+ const p = Object.assign(promise, state, extra)
36
+ p.then(
37
+ (value) => {
38
+ p.state = "fulfilled"
39
+ p.value = value
40
+ },
41
+ (error) => {
42
+ p.state = "rejected"
43
+ p.error = error instanceof Error ? error : new Error(String(error))
44
+ }
45
+ ).finally(_finally)
46
+
47
+ return p
48
+ }
49
+
50
+ interface StreamedPromiseEventDetail<T> {
51
+ id: string
52
+ data?: T
53
+ error?: string
54
+ }
55
+
56
+ export async function resolveStreamedPromise<T>(
57
+ id: string,
58
+ signal?: AbortSignal
59
+ ): Promise<T> {
60
+ const deferralCache: Map<string, { data?: T; error?: string }> = // @ts-ignore
61
+ (window[STREAMED_DATA_EVENT] ??= new Map())
62
+
63
+ const existing = deferralCache.get(id)
64
+ if (existing) {
65
+ deferralCache.delete(id)
66
+
67
+ const { data, error } = existing
68
+ if (error) {
69
+ return Promise.reject(error)
70
+ }
71
+ return Promise.resolve(data!)
72
+ }
73
+
74
+ return new Promise<T>((resolve, reject) => {
75
+ const onDataEvent = (event: Event) => {
76
+ const { detail } = event as CustomEvent<StreamedPromiseEventDetail<T>>
77
+ if (detail.id === id) {
78
+ deferralCache.delete(id)
79
+ window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
80
+
81
+ const { data, error } = detail
82
+ if (error) {
83
+ return reject(error)
84
+ }
85
+ resolve(data!)
86
+ }
87
+ }
88
+
89
+ window.addEventListener(STREAMED_DATA_EVENT, onDataEvent)
90
+ signal?.addEventListener("abort", () => {
91
+ window.removeEventListener(STREAMED_DATA_EVENT, onDataEvent)
92
+ reject("aborted")
93
+ })
94
+ })
95
+ }
@@ -46,7 +46,7 @@ function setRef<T>(ref: Kiru.Ref<T>, value: T): void {
46
46
  }
47
47
 
48
48
  /**
49
- * Returns false if called during "stream" or "string" render modes.
49
+ * Returns true if called during 'dom' or 'hydrate' mode.
50
50
  */
51
51
  function sideEffectsEnabled(): boolean {
52
52
  return renderMode.current === "dom" || renderMode.current === "hydrate"
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/router/server/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,sBAAsB,EAAc,MAAM,sBAAsB,CAAA;AAKzE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,sBAAsB,CAAA;IAC7B,OAAO,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAA;IACjB,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACrE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,MAAM,CAC1B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,aAAa,EAClB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC,CAuJvB;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,mCAmCtE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/router/server/index.ts"],"names":[],"mappings":"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"}