autosuspense 0.1.13 → 0.1.14

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.
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  export declare const AutoSuspense: ({ children, prefab, }: {
3
3
  children: React.ReactNode;
4
- prefab?: Record<string, React.ReactElement>;
4
+ prefab?: Record<string, React.ReactElement | React.ComponentType<any>>;
5
5
  }) => JSX.Element;
6
6
  //# sourceMappingURL=AutoSuspense.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutoSuspense.d.ts","sourceRoot":"","sources":["../../../src/components/suspense/AutoSuspense.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,eAAO,MAAM,YAAY,GAAI,uBAG1B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;CAC7C,gBAqBA,CAAC"}
1
+ {"version":3,"file":"AutoSuspense.d.ts","sourceRoot":"","sources":["../../../src/components/suspense/AutoSuspense.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,eAAO,MAAM,YAAY,GAAI,uBAG1B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;CACxE,gBAqBA,CAAC"}
@@ -1,3 +1,4 @@
1
1
  import { useSuspenseFallback } from "./useSuspenseFallback";
2
- export { useSuspenseFallback };
2
+ import { useSuspenseBoundary } from "./useSuspenseBoundary";
3
+ export { useSuspenseFallback, useSuspenseBoundary };
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,2 +1,3 @@
1
1
  import { useSuspenseFallback } from "./useSuspenseFallback";
2
- export { useSuspenseFallback };
2
+ import { useSuspenseBoundary } from "./useSuspenseBoundary";
3
+ export { useSuspenseFallback, useSuspenseBoundary };
@@ -0,0 +1,3 @@
1
+ import { FallbackDescriptor } from "../types/FallbackRegistry";
2
+ export declare function useSuspenseBoundary(element: FallbackDescriptor): void;
3
+ //# sourceMappingURL=useSuspenseBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSuspenseBoundary.d.ts","sourceRoot":"","sources":["../../src/hooks/useSuspenseBoundary.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGhF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAiBrE"}
@@ -0,0 +1,19 @@
1
+ import { useContext } from "react";
2
+ import { FallbackContext } from "../types/FallbackRegistry";
3
+ import { useCompatId } from "./useCompatId";
4
+ export function useSuspenseBoundary(element) {
5
+ const registry = useContext(FallbackContext);
6
+ const id = useCompatId();
7
+ if (!registry)
8
+ return;
9
+ if (registry.nodes.has(id))
10
+ return;
11
+ const parentId = registry.currentParent;
12
+ registry.nodes.set(id, {
13
+ id,
14
+ element,
15
+ parent: parentId,
16
+ isBoundary: true,
17
+ });
18
+ registry.currentParent = id;
19
+ }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { AutoSuspense } from "./components";
2
- export { useSuspenseFallback } from "./hooks";
2
+ export * from "./hooks";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export { AutoSuspense } from "./components";
2
- export { useSuspenseFallback } from "./hooks";
2
+ export * from "./hooks";
@@ -3,6 +3,7 @@ export type Node = {
3
3
  id: string;
4
4
  element: FallbackDescriptor;
5
5
  parent: string | null;
6
+ isBoundary?: boolean;
6
7
  };
7
8
  export type FallbackRegistry = {
8
9
  nodes: Map<string, Node>;
@@ -1 +1 @@
1
- {"version":3,"file":"FallbackRegistry.d.ts","sourceRoot":"","sources":["../../src/types/FallbackRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,CAAC,YAAY,GAClB,KAAK,CAAC,aAAa,CAAC;AAExB,eAAO,MAAM,eAAe,wCAE3B,CAAC"}
1
+ {"version":3,"file":"FallbackRegistry.d.ts","sourceRoot":"","sources":["../../src/types/FallbackRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,KAAK,CAAC,YAAY,GAClB,KAAK,CAAC,aAAa,CAAC;AAExB,eAAO,MAAM,eAAe,wCAE3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderNode.d.ts","sourceRoot":"","sources":["../../src/utils/renderNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAGxE,wBAAgB,UAAU,CAExB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EACpC,QAAQ,EAAE,gBAAgB,GACzB,KAAK,CAAC,YAAY,GAAG,IAAI,CAU3B"}
1
+ {"version":3,"file":"renderNode.d.ts","sourceRoot":"","sources":["../../src/utils/renderNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAIxE,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EACpC,QAAQ,EAAE,gBAAgB,GACzB,KAAK,CAAC,YAAY,GAAG,IAAI,CAqB3B"}
@@ -1,9 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import React from "react";
2
3
  import { resolveElement } from "./resolveElement";
4
+ import { AutoSuspense } from "../components";
3
5
  export function renderNode(node, childMap, registry) {
4
6
  const children = childMap.get(node.id) ?? [];
5
7
  const resolvedEle = resolveElement(node.element, registry);
6
8
  if (!resolvedEle)
7
9
  return null;
8
- return React.cloneElement(resolvedEle, { key: node.id }, children.map((child) => renderNode(child, childMap, registry)));
10
+ const renderedChildren = children.map((child) => renderNode(child, childMap, registry));
11
+ if (node.isBoundary) {
12
+ return (_jsx(AutoSuspense, { prefab: Object.fromEntries(registry.prebuild), children: React.cloneElement(resolvedEle, {}, renderedChildren) }, node.id));
13
+ }
14
+ return React.cloneElement(resolvedEle, { key: node.id }, renderedChildren);
9
15
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autosuspense",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "Automatic suspense wiring block for React.",
5
5
  "license": "ISC",
6
6
  "type": "commonjs",
@@ -6,14 +6,13 @@ import {
6
6
  FallbackRegistry,
7
7
  } from "../../types/FallbackRegistry";
8
8
  import { defaultPrefab } from "../prefabs/defaultPrefab";
9
- import { PrefabFactory } from "../../types/PrefabFactory";
10
9
 
11
10
  export const AutoSuspense = ({
12
11
  children,
13
12
  prefab = defaultPrefab,
14
13
  }: {
15
14
  children: React.ReactNode;
16
- prefab?: Record<string, React.ReactElement>;
15
+ prefab?: Record<string, React.ReactElement | React.ComponentType<any>>;
17
16
  }) => {
18
17
  const registryRef = React.useRef<FallbackRegistry>({
19
18
  nodes: new Map(),
@@ -32,7 +31,7 @@ export const AutoSuspense = ({
32
31
 
33
32
  return (
34
33
  <FallbackContext.Provider value={registryRef.current}>
35
- <React.Suspense fallback={fallback}>{children}</React.Suspense>
34
+ <React.Suspense fallback={fallback}>{children}</React.Suspense>
36
35
  </FallbackContext.Provider>
37
36
  );
38
37
  };
@@ -1,2 +1,3 @@
1
1
  import { useSuspenseFallback } from "./useSuspenseFallback";
2
- export { useSuspenseFallback };
2
+ import { useSuspenseBoundary } from "./useSuspenseBoundary";
3
+ export { useSuspenseFallback, useSuspenseBoundary };
@@ -0,0 +1,22 @@
1
+ import { useContext } from "react";
2
+ import { FallbackContext, FallbackDescriptor } from "../types/FallbackRegistry";
3
+ import { useCompatId } from "./useCompatId";
4
+
5
+ export function useSuspenseBoundary(element: FallbackDescriptor): void {
6
+ const registry = useContext(FallbackContext);
7
+ const id = useCompatId();
8
+
9
+ if (!registry) return;
10
+ if (registry.nodes.has(id)) return;
11
+
12
+ const parentId = registry.currentParent;
13
+
14
+ registry.nodes.set(id, {
15
+ id,
16
+ element,
17
+ parent: parentId,
18
+ isBoundary: true,
19
+ });
20
+
21
+ registry.currentParent = id;
22
+ }
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { AutoSuspense } from "./components";
2
- export { useSuspenseFallback } from "./hooks";
2
+ export * from "./hooks";
@@ -4,6 +4,7 @@ export type Node = {
4
4
  id: string;
5
5
  element: FallbackDescriptor;
6
6
  parent: string | null;
7
+ isBoundary?: boolean;
7
8
  };
8
9
 
9
10
  export type FallbackRegistry = {
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import type { FallbackRegistry, Node } from "../types/FallbackRegistry";
3
+ import { resolveElement } from "./resolveElement";
4
+ import { AutoSuspense } from "../components";
5
+
6
+ export function renderNode(
7
+ node: Node,
8
+ childMap: Map<string | null, Node[]>,
9
+ registry: FallbackRegistry,
10
+ ): React.ReactElement | null {
11
+ const children = childMap.get(node.id) ?? [];
12
+ const resolvedEle = resolveElement(node.element, registry);
13
+ if (!resolvedEle) return null;
14
+
15
+ const renderedChildren = children.map((child) =>
16
+ renderNode(child, childMap, registry),
17
+ );
18
+
19
+ if (node.isBoundary) {
20
+ return (
21
+ <AutoSuspense
22
+ key={node.id}
23
+ prefab={Object.fromEntries(registry.prebuild)}
24
+ >
25
+ {React.cloneElement(resolvedEle, {}, renderedChildren)}
26
+ </AutoSuspense>
27
+ );
28
+ }
29
+
30
+ return React.cloneElement(resolvedEle, { key: node.id }, renderedChildren);
31
+ }
File without changes
@@ -1,5 +0,0 @@
1
- import * as React from "react";
2
-
3
- export type PrefabFactory = (props: {
4
- children?: React.ReactNode;
5
- }) => React.ReactElement;
@@ -1,20 +0,0 @@
1
- import React from "react";
2
- import type { FallbackRegistry, Node } from "../types/FallbackRegistry";
3
- import { resolveElement } from "./resolveElement";
4
-
5
- export function renderNode(
6
-
7
- node: Node,
8
- childMap: Map<string | null, Node[]>,
9
- registry: FallbackRegistry,
10
- ): React.ReactElement | null {
11
- const children = childMap.get(node.id) ?? [];
12
- const resolvedEle = resolveElement(node.element, registry);
13
- if (!resolvedEle) return null;
14
-
15
- return React.cloneElement(
16
- resolvedEle,
17
- { key: node.id },
18
- children.map((child) => renderNode(child, childMap, registry)),
19
- );
20
- }