kiru 0.49.2 → 0.50.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.
- package/dist/components/errorBoundary.d.ts +7 -0
- package/dist/components/errorBoundary.d.ts.map +1 -0
- package/dist/components/errorBoundary.js +6 -0
- package/dist/components/errorBoundary.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/lazy.d.ts.map +1 -1
- package/dist/components/lazy.js +11 -136
- package/dist/components/lazy.js.map +1 -1
- package/dist/components/suspense.d.ts +34 -0
- package/dist/components/suspense.d.ts.map +1 -0
- package/dist/components/suspense.js +110 -0
- package/dist/components/suspense.js.map +1 -0
- package/dist/constants.d.ts +4 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -2
- package/dist/constants.js.map +1 -1
- package/dist/hmr.d.ts +1 -0
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +7 -0
- package/dist/hmr.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/recursiveRender.d.ts +6 -0
- package/dist/recursiveRender.d.ts.map +1 -0
- package/dist/recursiveRender.js +109 -0
- package/dist/recursiveRender.js.map +1 -0
- package/dist/renderToString.d.ts.map +1 -1
- package/dist/renderToString.js +10 -59
- package/dist/renderToString.js.map +1 -1
- package/dist/router/config.d.ts +3 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +13 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/context.d.ts +15 -0
- package/dist/router/context.d.ts.map +1 -0
- package/dist/router/context.js +11 -0
- package/dist/router/context.js.map +1 -0
- package/dist/router/errors.d.ts +4 -0
- package/dist/router/errors.d.ts.map +1 -0
- package/dist/router/errors.js +7 -0
- package/dist/router/errors.js.map +1 -0
- package/dist/router/fileRouter.d.ts +48 -0
- package/dist/router/fileRouter.d.ts.map +1 -0
- package/dist/router/fileRouter.js +311 -0
- package/dist/router/fileRouter.js.map +1 -0
- package/dist/router/globals.d.ts +5 -0
- package/dist/router/globals.d.ts.map +1 -0
- package/dist/router/globals.js +4 -0
- package/dist/router/globals.js.map +1 -0
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +7 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/link.d.ts +8 -0
- package/dist/router/link.d.ts.map +1 -0
- package/dist/router/link.js +15 -0
- package/dist/router/link.js.map +1 -0
- package/dist/router/types.d.ts +63 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.internal.d.ts +12 -0
- package/dist/router/types.internal.d.ts.map +1 -0
- package/dist/router/types.internal.js +2 -0
- package/dist/router/types.internal.js.map +1 -0
- package/dist/router/types.js +2 -0
- package/dist/router/types.js.map +1 -0
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +35 -10
- package/dist/scheduler.js.map +1 -1
- package/dist/ssr/server.d.ts +4 -1
- package/dist/ssr/server.d.ts.map +1 -1
- package/dist/ssr/server.js +50 -82
- package/dist/ssr/server.js.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.utils.d.ts +6 -7
- package/dist/types.utils.d.ts.map +1 -1
- package/dist/utils/runtime.d.ts +1 -1
- package/dist/utils/runtime.d.ts.map +1 -1
- package/dist/utils/runtime.js.map +1 -1
- package/dist/utils/vdom.d.ts +3 -1
- package/dist/utils/vdom.d.ts.map +1 -1
- package/dist/utils/vdom.js +6 -5
- package/dist/utils/vdom.js.map +1 -1
- package/package.json +4 -8
- package/src/components/errorBoundary.ts +16 -0
- package/src/components/index.ts +2 -0
- package/src/components/lazy.ts +12 -169
- package/src/components/suspense.ts +191 -0
- package/src/constants.ts +6 -2
- package/src/hmr.ts +8 -0
- package/src/index.ts +1 -0
- package/src/recursiveRender.ts +127 -0
- package/src/renderToString.ts +10 -73
- package/src/router/config.ts +15 -0
- package/src/router/context.ts +23 -0
- package/src/router/errors.ts +6 -0
- package/src/router/fileRouter.ts +475 -0
- package/src/router/globals.ts +5 -0
- package/src/router/index.ts +6 -0
- package/src/router/link.ts +32 -0
- package/src/router/types.internal.ts +14 -0
- package/src/router/types.ts +81 -0
- package/src/scheduler.ts +45 -12
- package/src/ssr/server.ts +58 -95
- package/src/types.ts +11 -2
- package/src/types.utils.ts +6 -11
- package/src/utils/runtime.ts +1 -1
- package/src/utils/vdom.ts +11 -4
- package/dist/components/router/index.d.ts +0 -3
- package/dist/components/router/index.d.ts.map +0 -1
- package/dist/components/router/index.js +0 -3
- package/dist/components/router/index.js.map +0 -1
- package/dist/components/router/route.d.ts +0 -46
- package/dist/components/router/route.d.ts.map +0 -1
- package/dist/components/router/route.js +0 -8
- package/dist/components/router/route.js.map +0 -1
- package/dist/components/router/router.d.ts +0 -62
- package/dist/components/router/router.d.ts.map +0 -1
- package/dist/components/router/router.js +0 -181
- package/dist/components/router/router.js.map +0 -1
- package/dist/components/router/routerUtils.d.ts +0 -5
- package/dist/components/router/routerUtils.d.ts.map +0 -1
- package/dist/components/router/routerUtils.js +0 -39
- package/dist/components/router/routerUtils.js.map +0 -1
- package/dist/ssr/hydrationBoundary.d.ts +0 -27
- package/dist/ssr/hydrationBoundary.d.ts.map +0 -1
- package/dist/ssr/hydrationBoundary.js +0 -30
- package/dist/ssr/hydrationBoundary.js.map +0 -1
- package/dist/ssr/index.d.ts +0 -2
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js +0 -2
- package/dist/ssr/index.js.map +0 -1
- package/src/components/router/index.ts +0 -2
- package/src/components/router/route.ts +0 -51
- package/src/components/router/router.ts +0 -280
- package/src/components/router/routerUtils.ts +0 -49
- package/src/ssr/hydrationBoundary.ts +0 -63
- package/src/ssr/index.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.utils.d.ts","sourceRoot":"","sources":["../src/types.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.utils.d.ts","sourceRoot":"","sources":["../src/types.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAClD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAA;AACrD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AAClD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AAE1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,KAAK;IAC/C,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,GAAG,EAAE,WAAW,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AACD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,KAAK;IAC1C,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,KAAK;IACxD,IAAI,EAAE,OAAO,iBAAiB,CAAA;IAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAC3B,KAAK,EAAE,CAAC,CAAA;QACR,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACpB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK;IACnD,IAAI,EAAE,OAAO,eAAe,CAAA;IAC5B,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,KAAK;IAC9C,IAAI,EAAE,OAAO,SAAS,CAAA;CACvB;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAA;AAEN,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;AAEzC,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IACjD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IACE,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,KAAK,CAAA;CACf,GACD;IACE,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,CAAC,CAAA;IACR,OAAO,EAAE,KAAK,CAAA;CACf,CAAA"}
|
package/dist/utils/runtime.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { latest, sideEffectsEnabled };
|
|
|
3
3
|
* This is a no-op in production. It is used to get the latest
|
|
4
4
|
* iteration of a component or signal after HMR has happened.
|
|
5
5
|
*/
|
|
6
|
-
declare function latest<T
|
|
6
|
+
declare function latest<T extends Exclude<object, null>>(thing: T): T;
|
|
7
7
|
/**
|
|
8
8
|
* Returns false if called during "stream" or "string" render modes.
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,iBAAS,MAAM,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ5D;AAED;;GAEG;AACH,iBAAS,kBAAkB,IAAI,OAAO,CAErC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;AAErC;;;GAGG;AACH,SAAS,MAAM,CAAkC,KAAQ;IACvD,IAAI,GAAG,GAAQ,KAAK,CAAA;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,QAAQ,IAAI,GAAG,EAAE,CAAC;YACvB,GAAG,GAAG,GAAG,CAAC,MAAoB,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,UAAU,CAAC,OAAO,KAAK,KAAK,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,CAAA;AACzE,CAAC"}
|
package/dist/utils/vdom.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { $FRAGMENT, $CONTEXT_PROVIDER } from "../constants.js";
|
|
2
2
|
import type { AppContext } from "../appContext.js";
|
|
3
|
-
|
|
3
|
+
import type { ErrorBoundaryNode } from "../types.utils.js";
|
|
4
|
+
export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, findParentErrorBoundary, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
|
|
4
5
|
declare function cloneVNode(vNode: Kiru.VNode): Kiru.VNode;
|
|
5
6
|
declare function isVNodeDeleted(vNode: Kiru.VNode): boolean;
|
|
6
7
|
declare function isVNode(thing: unknown): thing is Kiru.VNode;
|
|
@@ -19,6 +20,7 @@ declare function commitSnapshot(vNode: Kiru.VNode): void;
|
|
|
19
20
|
declare function vNodeContains(haystack: Kiru.VNode, needle: Kiru.VNode): boolean;
|
|
20
21
|
declare function traverseApply(vNode: Kiru.VNode, func: (node: Kiru.VNode) => void): void;
|
|
21
22
|
declare function findParent(vNode: Kiru.VNode, predicate: (n: Kiru.VNode) => boolean): Kiru.VNode | null;
|
|
23
|
+
declare function findParentErrorBoundary(vNode: Kiru.VNode): ErrorBoundaryNode | null;
|
|
22
24
|
declare function assertValidElementProps(vNode: Kiru.VNode): void;
|
|
23
25
|
declare function isValidElementKeyProp(thing: unknown): thing is string | number;
|
|
24
26
|
declare function isValidElementRefProp(thing: unknown): thing is Kiru.Ref<any>;
|
package/dist/utils/vdom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,iBAAiB,EAIlB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,iBAAiB,EAIlB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,UAAU,EACV,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,CAAA;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAUjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAElD;AAED,iBAAS,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAEpD;AAED,iBAAS,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,CAIzE;AAED,iBAAS,UAAU,CACjB,KAAK,EAAE,IAAI,CAAC,KAAK,GAChB,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,SAAS,CAAA;CAAE,CAElD;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAM1C;AAED,iBAAS,iBAAiB,CACxB,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,iBAAiB,CAAA;CAAE,CAE1D;AAED,iBAAS,eAAe,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAE5C;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAUhE;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAQ/C;AAED,iBAAS,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAaxE;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,GAC/B,IAAI,CAUN;AAED,iBAAS,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,KAAK,OAAO,qBAO3E;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,iBAAiB,GAAG,IAAI,CAK5E;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,QAgBjD;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,GAAG,MAAM,CAEvE;AAED,iBAAS,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAMrE"}
|
package/dist/utils/vdom.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Signal } from "../signals/index.js";
|
|
2
|
-
import { FLAG_DELETION, $FRAGMENT, $CONTEXT_PROVIDER,
|
|
2
|
+
import { FLAG_DELETION, $FRAGMENT, $CONTEXT_PROVIDER, FLAG_PLACEMENT, FLAG_UPDATE, $ERROR_BOUNDARY, } from "../constants.js";
|
|
3
3
|
import { createElement } from "../index.js";
|
|
4
4
|
import { KiruError } from "../error.js";
|
|
5
5
|
import { node } from "../globals.js";
|
|
6
|
-
export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
|
|
6
|
+
export { cloneVNode, isVNodeDeleted, isVNode, isExoticType, isFragment, isLazy, isMemo, isContextProvider, vNodeContains, getCurrentVNode, getVNodeAppContext, commitSnapshot, traverseApply, findParent, findParentErrorBoundary, assertValidElementProps, isValidElementKeyProp, isValidElementRefProp, };
|
|
7
7
|
function cloneVNode(vNode) {
|
|
8
8
|
const children = vNode.props.children;
|
|
9
9
|
let clonedChildren;
|
|
@@ -22,9 +22,7 @@ function isVNode(thing) {
|
|
|
22
22
|
return typeof thing === "object" && thing !== null && "type" in thing;
|
|
23
23
|
}
|
|
24
24
|
function isExoticType(type) {
|
|
25
|
-
return (type === $FRAGMENT ||
|
|
26
|
-
type === $CONTEXT_PROVIDER ||
|
|
27
|
-
type === $HYDRATION_BOUNDARY);
|
|
25
|
+
return (type === $FRAGMENT || type === $CONTEXT_PROVIDER || type === $ERROR_BOUNDARY);
|
|
28
26
|
}
|
|
29
27
|
function isFragment(vNode) {
|
|
30
28
|
return vNode.type === $FRAGMENT;
|
|
@@ -97,6 +95,9 @@ function findParent(vNode, predicate) {
|
|
|
97
95
|
}
|
|
98
96
|
return null;
|
|
99
97
|
}
|
|
98
|
+
function findParentErrorBoundary(vNode) {
|
|
99
|
+
return findParent(vNode, (n) => n.type === $ERROR_BOUNDARY);
|
|
100
|
+
}
|
|
100
101
|
function assertValidElementProps(vNode) {
|
|
101
102
|
if ("children" in vNode.props && vNode.props.innerHTML) {
|
|
102
103
|
throw new KiruError({
|
package/dist/utils/vdom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EACL,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"vdom.js","sourceRoot":"","sources":["../../src/utils/vdom.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kiru",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.50.0-preview.1",
|
|
4
4
|
"description": "A batteries-included, easy-to-use rendering library with a tiny footprint",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -14,10 +14,6 @@
|
|
|
14
14
|
"types": "./dist/form/index.d.ts",
|
|
15
15
|
"default": "./dist/form/index.js"
|
|
16
16
|
},
|
|
17
|
-
"./router": {
|
|
18
|
-
"types": "./dist/components/router/index.d.ts",
|
|
19
|
-
"default": "./dist/components/router/index.js"
|
|
20
|
-
},
|
|
21
17
|
"./swr": {
|
|
22
18
|
"types": "./dist/swr.d.ts",
|
|
23
19
|
"default": "./dist/swr.js"
|
|
@@ -26,9 +22,9 @@
|
|
|
26
22
|
"types": "./dist/utils/index.d.ts",
|
|
27
23
|
"default": "./dist/utils/index.js"
|
|
28
24
|
},
|
|
29
|
-
"./
|
|
30
|
-
"types": "./dist/
|
|
31
|
-
"default": "./dist/
|
|
25
|
+
"./router": {
|
|
26
|
+
"types": "./dist/router/index.d.ts",
|
|
27
|
+
"default": "./dist/router/index.js"
|
|
32
28
|
},
|
|
33
29
|
"./ssr/client": {
|
|
34
30
|
"types": "./dist/ssr/client.d.ts",
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { $ERROR_BOUNDARY } from "../constants.js"
|
|
2
|
+
import { createElement } from "../index.js"
|
|
3
|
+
|
|
4
|
+
export interface ErrorBoundaryProps {
|
|
5
|
+
children?: JSX.Children
|
|
6
|
+
fallback?: JSX.Element | ((error: Error) => JSX.Element)
|
|
7
|
+
onError?: (error: Error) => void
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function ErrorBoundary({
|
|
11
|
+
children,
|
|
12
|
+
fallback,
|
|
13
|
+
onError,
|
|
14
|
+
}: ErrorBoundaryProps) {
|
|
15
|
+
return createElement($ERROR_BOUNDARY, { children, fallback, onError })
|
|
16
|
+
}
|
package/src/components/index.ts
CHANGED
package/src/components/lazy.ts
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import { createElement } from "../element.js"
|
|
2
2
|
import { __DEV__ } from "../env.js"
|
|
3
|
-
import {
|
|
4
|
-
import { node, renderMode } from "../globals.js"
|
|
5
|
-
import { useContext } from "../hooks/useContext.js"
|
|
6
|
-
import { useRef } from "../hooks/useRef.js"
|
|
3
|
+
import { renderMode } from "../globals.js"
|
|
7
4
|
import { useRequestUpdate } from "../hooks/utils.js"
|
|
8
|
-
import { hydrationStack } from "../hydration.js"
|
|
9
|
-
import { flushSync, nextIdle } from "../scheduler.js"
|
|
10
|
-
import {
|
|
11
|
-
HYDRATION_BOUNDARY_MARKER,
|
|
12
|
-
HydrationBoundaryContext,
|
|
13
|
-
} from "../ssr/hydrationBoundary.js"
|
|
14
|
-
import { noop } from "../utils/index.js"
|
|
15
|
-
import type { SomeDom } from "../types.utils"
|
|
16
5
|
|
|
17
6
|
interface FCModule {
|
|
18
7
|
default: Kiru.FC<any>
|
|
@@ -25,7 +14,6 @@ type InferLazyImportProps<T extends LazyImportValue> = T extends FCModule
|
|
|
25
14
|
: Kiru.InferProps<T>
|
|
26
15
|
|
|
27
16
|
interface LazyState {
|
|
28
|
-
fn: string
|
|
29
17
|
promise: Promise<LazyImportValue>
|
|
30
18
|
result: Kiru.FC | null
|
|
31
19
|
}
|
|
@@ -40,191 +28,46 @@ const lazyCache: Map<string, LazyState> =
|
|
|
40
28
|
(window.__KIRU_LAZY_CACHE ??= new Map<string, LazyState>())
|
|
41
29
|
: new Map<string, LazyState>()
|
|
42
30
|
|
|
43
|
-
function consumeHydrationBoundaryChildren(parentNode: Kiru.VNode): {
|
|
44
|
-
parent: HTMLElement
|
|
45
|
-
childNodes: Node[]
|
|
46
|
-
startIndex: number
|
|
47
|
-
} {
|
|
48
|
-
const boundaryStart = hydrationStack.currentChild()
|
|
49
|
-
if (
|
|
50
|
-
boundaryStart?.nodeType !== Node.COMMENT_NODE ||
|
|
51
|
-
boundaryStart.nodeValue !== HYDRATION_BOUNDARY_MARKER
|
|
52
|
-
) {
|
|
53
|
-
throw new KiruError({
|
|
54
|
-
message: "Invalid HydrationBoundary node. This is likely a bug in Kiru.",
|
|
55
|
-
fatal: true,
|
|
56
|
-
vNode: parentNode,
|
|
57
|
-
})
|
|
58
|
-
}
|
|
59
|
-
const parent = boundaryStart.parentElement!
|
|
60
|
-
const childNodes: Node[] = []
|
|
61
|
-
const isBoundaryEnd = (n: Node) => {
|
|
62
|
-
return (
|
|
63
|
-
n.nodeType === Node.COMMENT_NODE &&
|
|
64
|
-
n.nodeValue === "/" + HYDRATION_BOUNDARY_MARKER
|
|
65
|
-
)
|
|
66
|
-
}
|
|
67
|
-
let n = boundaryStart.nextSibling
|
|
68
|
-
boundaryStart.remove()
|
|
69
|
-
const startIndex =
|
|
70
|
-
hydrationStack.childIdxStack[hydrationStack.childIdxStack.length - 1]
|
|
71
|
-
while (n && !isBoundaryEnd(n)) {
|
|
72
|
-
childNodes.push(n)
|
|
73
|
-
hydrationStack.bumpChildIndex()
|
|
74
|
-
n = n.nextSibling
|
|
75
|
-
}
|
|
76
|
-
const boundaryEnd = hydrationStack.currentChild()
|
|
77
|
-
if (!isBoundaryEnd(boundaryEnd)) {
|
|
78
|
-
throw new KiruError({
|
|
79
|
-
message: "Invalid HydrationBoundary node. This is likely a bug in Kiru.",
|
|
80
|
-
fatal: true,
|
|
81
|
-
vNode: parentNode,
|
|
82
|
-
})
|
|
83
|
-
}
|
|
84
|
-
boundaryEnd.remove()
|
|
85
|
-
return { parent, childNodes, startIndex }
|
|
86
|
-
}
|
|
87
|
-
|
|
88
31
|
export function lazy<T extends LazyImportValue>(
|
|
89
32
|
componentPromiseFn: () => Promise<T>
|
|
90
33
|
): Kiru.FC<LazyComponentProps<T>> {
|
|
91
34
|
function LazyComponent(props: LazyComponentProps<T>) {
|
|
92
35
|
const { fallback = null, ...rest } = props
|
|
93
|
-
const hydrationCtx = useContext(HydrationBoundaryContext, false)
|
|
94
|
-
const needsHydration = useRef(
|
|
95
|
-
hydrationCtx && renderMode.current === "hydrate"
|
|
96
|
-
)
|
|
97
|
-
const abortHydration = useRef(noop)
|
|
98
36
|
const requestUpdate = useRequestUpdate()
|
|
99
37
|
if (renderMode.current === "string" || renderMode.current === "stream") {
|
|
100
38
|
return fallback
|
|
101
39
|
}
|
|
102
40
|
|
|
103
|
-
const fn = componentPromiseFn.toString()
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
if (!cachedState
|
|
41
|
+
const fn = removeQueryString(componentPromiseFn.toString())
|
|
42
|
+
const cachedState = lazyCache.get(fn)
|
|
43
|
+
|
|
44
|
+
if (!cachedState) {
|
|
107
45
|
const promise = componentPromiseFn()
|
|
108
46
|
const state: LazyState = {
|
|
109
|
-
fn,
|
|
110
47
|
promise,
|
|
111
48
|
result: null,
|
|
112
49
|
}
|
|
113
|
-
lazyCache.set(
|
|
114
|
-
|
|
115
|
-
const ready = promise.then((componentOrModule) => {
|
|
50
|
+
lazyCache.set(fn, state)
|
|
51
|
+
promise.then((componentOrModule) => {
|
|
116
52
|
state.result =
|
|
117
53
|
typeof componentOrModule === "function"
|
|
118
54
|
? componentOrModule
|
|
119
55
|
: componentOrModule.default
|
|
56
|
+
requestUpdate()
|
|
120
57
|
})
|
|
121
|
-
|
|
122
|
-
if (!needsHydration.current) {
|
|
123
|
-
ready.then(() => requestUpdate())
|
|
124
|
-
return fallback
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const thisNode = node.current!
|
|
128
|
-
|
|
129
|
-
abortHydration.current = () => {
|
|
130
|
-
for (const child of childNodes) {
|
|
131
|
-
if (child instanceof Element) {
|
|
132
|
-
hydrationStack.resetEvents(child)
|
|
133
|
-
}
|
|
134
|
-
child.parentNode?.removeChild(child)
|
|
135
|
-
}
|
|
136
|
-
needsHydration.current = false
|
|
137
|
-
delete thisNode.lastChildDom
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (__DEV__) {
|
|
141
|
-
window.__kiru?.HMRContext?.onHmr(() => {
|
|
142
|
-
if (needsHydration.current) {
|
|
143
|
-
abortHydration.current()
|
|
144
|
-
}
|
|
145
|
-
})
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const { parent, childNodes, startIndex } =
|
|
149
|
-
consumeHydrationBoundaryChildren(thisNode)
|
|
150
|
-
|
|
151
|
-
thisNode.lastChildDom = childNodes[childNodes.length - 1] as SomeDom
|
|
152
|
-
|
|
153
|
-
for (const child of childNodes) {
|
|
154
|
-
if (child instanceof Element) {
|
|
155
|
-
hydrationStack.captureEvents(child)
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
const hydrate = () => {
|
|
159
|
-
if (needsHydration.current === false) return
|
|
160
|
-
|
|
161
|
-
nextIdle(() => {
|
|
162
|
-
delete thisNode.lastChildDom
|
|
163
|
-
needsHydration.current = false
|
|
164
|
-
hydrationStack.push(parent)
|
|
165
|
-
hydrationStack.childIdxStack[
|
|
166
|
-
hydrationStack.childIdxStack.length - 1
|
|
167
|
-
] = startIndex
|
|
168
|
-
const prev = renderMode.current
|
|
169
|
-
/**
|
|
170
|
-
* must call requestUpdate before setting renderMode
|
|
171
|
-
* to hydrate, otherwise the update will be postponed
|
|
172
|
-
* and flushSync will have no effect
|
|
173
|
-
*/
|
|
174
|
-
requestUpdate()
|
|
175
|
-
renderMode.current = "hydrate"
|
|
176
|
-
flushSync()
|
|
177
|
-
renderMode.current = prev
|
|
178
|
-
for (const child of childNodes) {
|
|
179
|
-
if (child instanceof Element) {
|
|
180
|
-
hydrationStack.releaseEvents(child)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* once the promise resolves, we need to act according
|
|
188
|
-
* to the HydrationBoundaryContext 'mode'.
|
|
189
|
-
*
|
|
190
|
-
* - with 'eager', we just hydrate the children immediately
|
|
191
|
-
* - with 'lazy', we'll wait for user interaction before hydrating
|
|
192
|
-
*/
|
|
193
|
-
|
|
194
|
-
if (hydrationCtx.mode === "eager") {
|
|
195
|
-
ready.then(hydrate)
|
|
196
|
-
return null
|
|
197
|
-
}
|
|
198
|
-
const interactionEvents = hydrationCtx.events
|
|
199
|
-
const onInteraction = (e: Event) => {
|
|
200
|
-
const tgt = e.target
|
|
201
|
-
if (
|
|
202
|
-
tgt instanceof Element &&
|
|
203
|
-
childNodes.some((child) => child.contains(tgt))
|
|
204
|
-
) {
|
|
205
|
-
interactionEvents.forEach((evtName) => {
|
|
206
|
-
window.removeEventListener(evtName, onInteraction)
|
|
207
|
-
})
|
|
208
|
-
ready.then(hydrate)
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
interactionEvents.forEach((evtName) => {
|
|
212
|
-
window.addEventListener(evtName, onInteraction)
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
return null
|
|
58
|
+
return fallback
|
|
216
59
|
}
|
|
217
60
|
|
|
218
61
|
if (cachedState.result === null) {
|
|
219
62
|
cachedState.promise.then(requestUpdate)
|
|
220
63
|
return fallback
|
|
221
64
|
}
|
|
222
|
-
if (
|
|
223
|
-
|
|
65
|
+
if (__DEV__) {
|
|
66
|
+
return createElement(cachedState.result, rest)
|
|
224
67
|
}
|
|
225
68
|
return createElement(cachedState.result, rest)
|
|
226
69
|
}
|
|
227
|
-
LazyComponent.displayName = "
|
|
70
|
+
LazyComponent.displayName = "Kaioken.lazy"
|
|
228
71
|
return LazyComponent
|
|
229
72
|
}
|
|
230
73
|
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { requestUpdate } from "../scheduler.js"
|
|
2
|
+
import { renderMode } from "../globals.js"
|
|
3
|
+
import {
|
|
4
|
+
cleanupHook,
|
|
5
|
+
depsRequireChange,
|
|
6
|
+
useHook,
|
|
7
|
+
useId,
|
|
8
|
+
} from "../hooks/index.js"
|
|
9
|
+
import { __DEV__ } from "../env.js"
|
|
10
|
+
import { getCurrentVNode } from "../utils/index.js"
|
|
11
|
+
import { $SUSPENSE_THROW, PREFETCHED_DATA_EVENT } from "../constants.js"
|
|
12
|
+
import { Signal, useSignal } from "../signals/index.js"
|
|
13
|
+
|
|
14
|
+
export type { SuspenseProps, UsePromiseCallbackContext, UsePromiseState }
|
|
15
|
+
export { Suspense, isSuspenseThrowValue, usePromise }
|
|
16
|
+
|
|
17
|
+
type StatefulPromiseValues<T extends readonly Kiru.StatefulPromise<unknown>[]> =
|
|
18
|
+
{
|
|
19
|
+
[I in keyof T]: T[I] extends Kiru.StatefulPromise<infer V> ? V : never
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type SuspenseChildrenArgs<
|
|
23
|
+
T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
|
|
24
|
+
> = T extends Kiru.StatefulPromise<any>[]
|
|
25
|
+
? StatefulPromiseValues<T>
|
|
26
|
+
: [T extends Kiru.StatefulPromise<infer V> ? V : never]
|
|
27
|
+
|
|
28
|
+
interface SuspenseProps<
|
|
29
|
+
T extends Kiru.StatefulPromise<any> | Kiru.StatefulPromise<any>[]
|
|
30
|
+
> {
|
|
31
|
+
data: T
|
|
32
|
+
children: (...data: SuspenseChildrenArgs<T>) => JSX.Element
|
|
33
|
+
fallback?: JSX.Element
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function Suspense<
|
|
37
|
+
const T extends
|
|
38
|
+
| Kiru.StatefulPromise<unknown>
|
|
39
|
+
| Kiru.StatefulPromise<unknown>[]
|
|
40
|
+
>({ data, children, fallback }: SuspenseProps<T>) {
|
|
41
|
+
const promiseArray: Kiru.StatefulPromise<unknown>[] = Array.isArray(data)
|
|
42
|
+
? data
|
|
43
|
+
: [data]
|
|
44
|
+
|
|
45
|
+
switch (renderMode.current) {
|
|
46
|
+
case "stream":
|
|
47
|
+
case "string":
|
|
48
|
+
throw {
|
|
49
|
+
[$SUSPENSE_THROW]: { fallback, pending: promiseArray },
|
|
50
|
+
} satisfies SuspenseThrowValue
|
|
51
|
+
|
|
52
|
+
case "dom":
|
|
53
|
+
case "hydrate":
|
|
54
|
+
for (const p of promiseArray) {
|
|
55
|
+
if (p.state === "rejected") throw p.error
|
|
56
|
+
if (p.state === "pending") {
|
|
57
|
+
const n = getCurrentVNode()!
|
|
58
|
+
Promise.allSettled(promiseArray).then(() => requestUpdate(n))
|
|
59
|
+
return fallback
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const values = promiseArray.map((p) => p.value) as SuspenseChildrenArgs<T>
|
|
63
|
+
|
|
64
|
+
return children(...values)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface SuspenseThrowValue {
|
|
69
|
+
[$SUSPENSE_THROW]: {
|
|
70
|
+
fallback?: JSX.Element
|
|
71
|
+
pending: Kiru.StatefulPromise<unknown>[]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Returns true if the value was thrown by a Suspense component.
|
|
77
|
+
*/
|
|
78
|
+
function isSuspenseThrowValue(value: unknown): value is SuspenseThrowValue {
|
|
79
|
+
return typeof value === "object" && !!value && $SUSPENSE_THROW in value
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
interface PromiseResolveEventDetail<T> {
|
|
83
|
+
id: string
|
|
84
|
+
data?: T
|
|
85
|
+
error?: string
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function resolveHydrationPromise<T>(
|
|
89
|
+
id: string,
|
|
90
|
+
signal: AbortSignal
|
|
91
|
+
): Promise<T> {
|
|
92
|
+
return new Promise<T>((resolve, reject) => {
|
|
93
|
+
const prefetchCache: Map<string, { data?: T; error?: string }> = // @ts-ignore
|
|
94
|
+
(window[PREFETCHED_DATA_EVENT] ??= new Map())
|
|
95
|
+
|
|
96
|
+
const existing = prefetchCache.get(id)
|
|
97
|
+
if (existing) {
|
|
98
|
+
const { data, error } = existing
|
|
99
|
+
prefetchCache.delete(id)
|
|
100
|
+
if (error) return reject(error)
|
|
101
|
+
return resolve(data!)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const onDataEvent = (event: Event) => {
|
|
105
|
+
const { detail } = event as CustomEvent<PromiseResolveEventDetail<T>>
|
|
106
|
+
if (detail.id === id) {
|
|
107
|
+
prefetchCache.delete(id)
|
|
108
|
+
window.removeEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
|
|
109
|
+
const { data, error } = detail
|
|
110
|
+
if (error) return reject(error)
|
|
111
|
+
resolve(data!)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
window.addEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
|
|
116
|
+
signal.addEventListener("abort", () => {
|
|
117
|
+
window.removeEventListener(PREFETCHED_DATA_EVENT, onDataEvent)
|
|
118
|
+
reject()
|
|
119
|
+
})
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const nodeToPromiseIndex = new WeakMap<Kiru.VNode, number>()
|
|
124
|
+
|
|
125
|
+
interface UsePromiseCallbackContext {
|
|
126
|
+
signal: AbortSignal
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface UsePromiseState<T> {
|
|
130
|
+
data: Kiru.StatefulPromise<T>
|
|
131
|
+
refresh: () => void
|
|
132
|
+
pending: Signal<boolean>
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function usePromise<T>(
|
|
136
|
+
callback: (ctx: UsePromiseCallbackContext) => Promise<T>,
|
|
137
|
+
deps: unknown[]
|
|
138
|
+
): UsePromiseState<T> {
|
|
139
|
+
const id = useId()
|
|
140
|
+
const pending = useSignal(true)
|
|
141
|
+
|
|
142
|
+
return useHook(
|
|
143
|
+
"usePromise",
|
|
144
|
+
{} as {
|
|
145
|
+
promise: Kiru.StatefulPromise<T>
|
|
146
|
+
abortController?: AbortController
|
|
147
|
+
deps?: unknown[]
|
|
148
|
+
},
|
|
149
|
+
({ hook, isInit, vNode }) => {
|
|
150
|
+
if (isInit || depsRequireChange(deps, hook.deps)) {
|
|
151
|
+
pending.value = true
|
|
152
|
+
hook.deps = deps
|
|
153
|
+
cleanupHook(hook)
|
|
154
|
+
|
|
155
|
+
const controller = (hook.abortController = new AbortController())
|
|
156
|
+
hook.cleanup = () => controller.abort()
|
|
157
|
+
|
|
158
|
+
const index = nodeToPromiseIndex.get(vNode) ?? 0
|
|
159
|
+
nodeToPromiseIndex.set(vNode, index + 1)
|
|
160
|
+
|
|
161
|
+
const promiseId = `${id}:data:${index}`
|
|
162
|
+
const state: Kiru.PromiseState<T> = { id: promiseId, state: "pending" }
|
|
163
|
+
const promise =
|
|
164
|
+
renderMode.current === "hydrate"
|
|
165
|
+
? resolveHydrationPromise<T>(promiseId, controller.signal)
|
|
166
|
+
: callback({ signal: controller.signal })
|
|
167
|
+
|
|
168
|
+
const p = (hook.promise = Object.assign(promise, state))
|
|
169
|
+
p.then((value) => {
|
|
170
|
+
p.state = "fulfilled"
|
|
171
|
+
p.value = value
|
|
172
|
+
})
|
|
173
|
+
.catch((error) => {
|
|
174
|
+
p.state = "rejected"
|
|
175
|
+
p.error = error instanceof Error ? error : new Error(error)
|
|
176
|
+
})
|
|
177
|
+
.finally(() => {
|
|
178
|
+
pending.value = false
|
|
179
|
+
})
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
data: hook.promise,
|
|
183
|
+
refresh: () => {
|
|
184
|
+
hook.deps = undefined
|
|
185
|
+
requestUpdate(vNode)
|
|
186
|
+
},
|
|
187
|
+
pending,
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
}
|
package/src/constants.ts
CHANGED
|
@@ -6,8 +6,10 @@ export {
|
|
|
6
6
|
$KIRU_ERROR,
|
|
7
7
|
$HMR_ACCEPT,
|
|
8
8
|
$MEMO,
|
|
9
|
-
$
|
|
9
|
+
$ERROR_BOUNDARY,
|
|
10
|
+
$SUSPENSE_THROW,
|
|
10
11
|
CONSECUTIVE_DIRTY_LIMIT,
|
|
12
|
+
PREFETCHED_DATA_EVENT,
|
|
11
13
|
EVENT_PREFIX_REGEX,
|
|
12
14
|
FLAG_UPDATE,
|
|
13
15
|
FLAG_PLACEMENT,
|
|
@@ -27,9 +29,11 @@ const $FRAGMENT = Symbol.for("kiru.fragment")
|
|
|
27
29
|
const $KIRU_ERROR = Symbol.for("kiru.error")
|
|
28
30
|
const $HMR_ACCEPT = Symbol.for("kiru.hmrAccept")
|
|
29
31
|
const $MEMO = Symbol.for("kiru.memo")
|
|
30
|
-
const $
|
|
32
|
+
const $ERROR_BOUNDARY = Symbol.for("kiru.errorBoundary")
|
|
33
|
+
const $SUSPENSE_THROW = Symbol.for("kiru.suspenseThrow")
|
|
31
34
|
|
|
32
35
|
const CONSECUTIVE_DIRTY_LIMIT = 50
|
|
36
|
+
const PREFETCHED_DATA_EVENT = "kiru:prefetched"
|
|
33
37
|
|
|
34
38
|
const FLAG_UPDATE = 1 << 1
|
|
35
39
|
const FLAG_PLACEMENT = 1 << 2
|
package/src/hmr.ts
CHANGED
|
@@ -51,6 +51,7 @@ type HotVarRegistrationEntry = {
|
|
|
51
51
|
export function createHMRContext() {
|
|
52
52
|
type FilePath = string
|
|
53
53
|
const moduleMap = new Map<FilePath, ModuleMemory>()
|
|
54
|
+
let currentModuleFilePath: string | null = null
|
|
54
55
|
let currentModuleMemory: ModuleMemory | null = null
|
|
55
56
|
let isModuleReplacementExecution = false
|
|
56
57
|
const isReplacement = () => isModuleReplacementExecution
|
|
@@ -75,6 +76,7 @@ export function createHMRContext() {
|
|
|
75
76
|
while (onHmrCallbacks.length) onHmrCallbacks.shift()!()
|
|
76
77
|
}
|
|
77
78
|
currentModuleMemory = mod!
|
|
79
|
+
currentModuleFilePath = filePath
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
const register = (
|
|
@@ -150,6 +152,9 @@ export function createHMRContext() {
|
|
|
150
152
|
currentModuleMemory.unnamedWatchers.length = tmpUnnamedWatchers.length
|
|
151
153
|
tmpUnnamedWatchers.length = 0
|
|
152
154
|
}
|
|
155
|
+
|
|
156
|
+
currentModuleMemory = null
|
|
157
|
+
currentModuleFilePath = null
|
|
153
158
|
}
|
|
154
159
|
|
|
155
160
|
const signals = {
|
|
@@ -171,5 +176,8 @@ export function createHMRContext() {
|
|
|
171
176
|
isReplacement,
|
|
172
177
|
signals,
|
|
173
178
|
onHmr,
|
|
179
|
+
getCurrentFilePath() {
|
|
180
|
+
return currentModuleFilePath
|
|
181
|
+
},
|
|
174
182
|
}
|
|
175
183
|
}
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from "./appContext.js"
|
|
|
8
8
|
export * from "./context.js"
|
|
9
9
|
export * from "./customEvents.js"
|
|
10
10
|
export * from "./element.js"
|
|
11
|
+
export * from "./error.js"
|
|
11
12
|
export * from "./hooks/index.js"
|
|
12
13
|
export * from "./components/index.js"
|
|
13
14
|
export * from "./renderToString.js"
|