@mittwald/react-tunnel 0.2.0-alpha.73 → 0.2.0-alpha.731

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/index.js CHANGED
@@ -1,67 +1,86 @@
1
1
  "use client"
2
2
  /* */
3
- var m = Object.defineProperty;
4
- var g = (s, e, r) => e in s ? m(s, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : s[e] = r;
5
- var c = (s, e, r) => g(s, typeof e != "symbol" ? e + "" : e, r);
6
- import { jsx as C } from "react/jsx-runtime";
7
- import { useState as b, createContext as E, useContext as f, useId as v, useRef as w, useEffect as x } from "react";
8
- import { observable as a, makeObservable as y, action as p } from "mobx";
9
- import { observer as T } from "mobx-react-lite";
3
+ import { jsx as x } from "react/jsx-runtime";
4
+ import { useState as E, useRef as h, createContext as g, useContext as m, useId as v, useEffect as p } from "react";
5
+ import { observable as f, makeObservable as b, action as C } from "mobx";
6
+ import { observer as w } from "mobx-react-lite";
10
7
  const l = "default";
11
8
  class o {
9
+ children = f.map(
10
+ {},
11
+ {
12
+ deep: !1
13
+ }
14
+ );
15
+ preparedChildren = /* @__PURE__ */ new Map();
16
+ nextIndex = 0;
12
17
  constructor() {
13
- c(this, "children", a.map(
14
- {},
15
- {
16
- deep: !1
17
- }
18
- ));
19
- c(this, "preparedChildren", /* @__PURE__ */ new Map());
20
- y(this, {
21
- deleteChildren: p.bound,
22
- setChildren: p.bound
18
+ b(this, {
19
+ deleteChildren: C.bound,
20
+ setChildren: C.bound
23
21
  });
24
22
  }
25
23
  static useNew() {
26
- return b(() => new o())[0];
24
+ const e = E(() => new o())[0];
25
+ return e.resetIndex(), e;
27
26
  }
28
- setChildren(e = l, r, n) {
29
- var i;
30
- const t = this.children.get(e) ?? a.map({}, { deep: !1 });
31
- t.set(r, n), (i = this.preparedChildren.get(e)) == null || i.delete(r), this.children.set(e, t);
27
+ resetIndex() {
28
+ this.nextIndex = 0;
32
29
  }
33
- prepareChildren(e = l, r, n) {
34
- const t = this.preparedChildren.get(e) ?? /* @__PURE__ */ new Map();
35
- t.set(r, n), this.preparedChildren.set(e, t);
30
+ useEntryIndex() {
31
+ const e = h(this), t = h(null);
32
+ return (t.current === null || e.current !== this) && (e.current = this, t.current = this.nextIndex++), t.current;
36
33
  }
37
- deleteChildren(e = l, r) {
38
- var n, t;
39
- (n = this.children.get(e)) == null || n.delete(r), (t = this.preparedChildren.get(e)) == null || t.delete(r);
34
+ setChildren(e = l, t, r, n) {
35
+ const i = {
36
+ id: t,
37
+ index: r,
38
+ children: n
39
+ }, s = this.children.get(e) ?? f.map({}, { deep: !1 });
40
+ s.set(t, i), this.preparedChildren.get(e)?.delete(t), this.children.set(e, s);
40
41
  }
41
- getChildren(e = l) {
42
- var n, t;
43
- const r = ((n = this.children.get(e)) == null ? void 0 : n.entries()) ?? ((t = this.preparedChildren.get(e)) == null ? void 0 : t.entries());
44
- if (r)
45
- return Array.from(r);
42
+ prepareChildren(e = l, t, r, n) {
43
+ const i = {
44
+ id: t,
45
+ index: r,
46
+ children: n
47
+ }, s = this.preparedChildren.get(e) ?? /* @__PURE__ */ new Map();
48
+ s.set(t, i), this.preparedChildren.set(e, s);
49
+ }
50
+ deleteChildrenFromMap(e, t, r) {
51
+ const n = e.get(t);
52
+ n?.delete(r), n?.size === 0 && e.delete(t);
53
+ }
54
+ deleteChildren(e = l, t) {
55
+ this.deleteChildrenFromMap(this.children, e, t), this.deleteChildrenFromMap(this.preparedChildren, e, t);
56
+ }
57
+ getEntries(e = l) {
58
+ const t = this.children.get(e)?.values() ?? this.preparedChildren.get(e)?.values();
59
+ if (t)
60
+ return Array.from(t).sort(
61
+ (r, n) => r.index - n.index
62
+ );
46
63
  }
47
64
  }
48
- const h = E(new o()), A = (s) => {
49
- const { children: e } = s;
50
- return /* @__PURE__ */ C(h.Provider, { value: o.useNew(), children: e });
51
- }, O = (s) => {
52
- const { children: e, id: r, staticEntryId: n } = s, t = f(h), i = v(), d = n ?? i, u = w(!1);
53
- return u.current || t.prepareChildren(r, d, e), x(() => (u.current = !0, t.setChildren(r, d, e), () => {
54
- t.deleteChildren(r, d);
55
- }), [e, r, d]), null;
56
- }, M = (s) => {
57
- const { children: e } = s;
65
+ const u = g(new o()), I = (d) => {
66
+ const { children: e } = d;
67
+ return /* @__PURE__ */ x(u.Provider, { value: o.useNew(), children: e });
68
+ }, R = (d) => {
69
+ const { children: e, id: t, staticEntryId: r } = d, n = m(u), i = v(), s = r ?? i, c = n.useEntryIndex(), a = h(!1);
70
+ return a.current || n.prepareChildren(t, s, c, e), p(() => {
71
+ a.current = !0, n.setChildren(t, s, c, e);
72
+ }, [e, t, s, c]), p(() => () => {
73
+ n.deleteChildren(t, s);
74
+ }, [t, s]), null;
75
+ }, y = (d) => {
76
+ const { children: e } = d;
58
77
  return typeof e == "function" ? e() : e;
59
- }, S = T((s) => {
60
- const { children: e, id: r } = s, n = f(h).getChildren(r);
61
- return n ? n.map(([t, i]) => /* @__PURE__ */ C(M, { children: i }, t)) : e;
78
+ }, N = w((d) => {
79
+ const { children: e, id: t } = d, r = m(u).getEntries(t), n = r ? r.map((i) => /* @__PURE__ */ x(y, { children: i.children }, i.id)) : null;
80
+ return typeof e == "function" ? e(n) : n ?? e;
62
81
  });
63
82
  export {
64
- O as TunnelEntry,
65
- S as TunnelExit,
66
- A as TunnelProvider
83
+ R as TunnelEntry,
84
+ N as TunnelExit,
85
+ I as TunnelProvider
67
86
  };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Tunnel.browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tunnel.browser.test.d.ts","sourceRoot":"","sources":["../../src/Tunnel.browser.test.tsx"],"names":[],"mappings":""}
@@ -1,13 +1,24 @@
1
+ import { ReactNode } from 'react';
1
2
  import { ObservableMap } from 'mobx';
2
- import { TunnelChildren } from './types';
3
+ export type TunnelChildren = ReactNode | undefined | ((tunnelChildren?: ReactNode | undefined) => ReactNode | undefined);
4
+ interface TunnelEntryState {
5
+ index: number;
6
+ id: string;
7
+ children: TunnelChildren;
8
+ }
3
9
  export declare class TunnelState {
4
- readonly children: ObservableMap<string, ObservableMap<string, TunnelChildren>>;
10
+ readonly children: ObservableMap<string, ObservableMap<string, TunnelEntryState>>;
5
11
  private readonly preparedChildren;
12
+ private nextIndex;
6
13
  constructor();
7
14
  static useNew(): TunnelState;
8
- setChildren(tunnelId: string | undefined, entryId: string, children: TunnelChildren): void;
9
- prepareChildren(tunnelId: string | undefined, entryId: string, children: TunnelChildren): void;
15
+ resetIndex(): void;
16
+ useEntryIndex(): number;
17
+ setChildren(tunnelId: string | undefined, entryId: string, index: number, children: TunnelChildren): void;
18
+ prepareChildren(tunnelId: string | undefined, entryId: string, index: number, children: TunnelChildren): void;
19
+ private deleteChildrenFromMap;
10
20
  deleteChildren(tunnelId: string | undefined, entryId: string): void;
11
- getChildren(tunnelId?: string): [string, TunnelChildren][] | undefined;
21
+ getEntries(tunnelId?: string): TunnelEntryState[] | undefined;
12
22
  }
23
+ export {};
13
24
  //# sourceMappingURL=TunnelState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TunnelState.d.ts","sourceRoot":"","sources":["../../src/TunnelState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,qBAAa,WAAW;IACtB,SAAgB,QAAQ,+DAQtB;IAEF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;;WASU,MAAM,IAAI,WAAW;IAI5B,WAAW,CAChB,QAAQ,EAAE,MAAM,YAAY,EAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,GACvB,IAAI;IAWA,eAAe,CACpB,QAAQ,EAAE,MAAM,YAAY,EAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,GACvB,IAAI;IASA,cAAc,CAAC,QAAQ,EAAE,MAAM,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnE,WAAW,CAChB,QAAQ,GAAE,MAAkB,GAC3B,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,SAAS;CAQ1C"}
1
+ {"version":3,"file":"TunnelState.d.ts","sourceRoot":"","sources":["../../src/TunnelState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAK1C,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,CAAC,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS,CAAC,CAAC;AAExE,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,SAAgB,QAAQ,iEAQtB;IAEF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IAEJ,OAAO,CAAC,SAAS,CAAK;;WASR,MAAM,IAAI,WAAW;IAM5B,UAAU;IAIV,aAAa;IAUb,WAAW,CAChB,QAAQ,EAAE,MAAM,YAAY,EAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,GACvB,IAAI;IAiBA,eAAe,CACpB,QAAQ,EAAE,MAAM,YAAY,EAC5B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,GACvB,IAAI;IAgBP,OAAO,CAAC,qBAAqB;IAYtB,cAAc,CAAC,QAAQ,EAAE,MAAM,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnE,UAAU,CACf,QAAQ,GAAE,MAAkB,GAC3B,gBAAgB,EAAE,GAAG,SAAS;CAUlC"}
@@ -1,11 +1,11 @@
1
- import { FC } from 'react';
2
- import { TunnelChildren } from '../types';
3
- interface Props {
1
+ import { FC, ReactNode } from 'react';
2
+ export type TunnelEntryChildren = ReactNode | undefined | (() => ReactNode | undefined);
3
+ export interface TunnelEntryProps {
4
4
  id?: string;
5
- children?: TunnelChildren;
5
+ children?: TunnelEntryChildren;
6
6
  /** Static entry ID instead of generated ID by `useId` */
7
7
  staticEntryId?: string;
8
8
  }
9
- export declare const TunnelEntry: FC<Props>;
9
+ export declare const TunnelEntry: FC<TunnelEntryProps>;
10
10
  export default TunnelEntry;
11
11
  //# sourceMappingURL=TunnelEntry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TunnelEntry.d.ts","sourceRoot":"","sources":["../../../src/components/TunnelEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,UAAU,KAAK;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,KAAK,CAqBjC,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"TunnelEntry.d.ts","sourceRoot":"","sources":["../../../src/components/TunnelEntry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3C,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,SAAS,GACT,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA+B5C,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,7 +1,10 @@
1
- import { FC, PropsWithChildren } from 'react';
2
- interface Props extends PropsWithChildren {
1
+ import { FC } from 'react';
2
+ import { TunnelChildren } from '../TunnelState';
3
+ export type TunnelExitChildren = TunnelChildren;
4
+ export interface TunnelExitProps {
3
5
  id?: string;
6
+ children?: TunnelExitChildren;
4
7
  }
5
- export declare const TunnelExit: FC<Props>;
8
+ export declare const TunnelExit: FC<TunnelExitProps>;
6
9
  export default TunnelExit;
7
10
  //# sourceMappingURL=TunnelExit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TunnelExit.d.ts","sourceRoot":"","sources":["../../../src/components/TunnelExit.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAOnD,UAAU,KAAM,SAAQ,iBAAiB;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAOD,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,KAAK,CAU/B,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"TunnelExit.d.ts","sourceRoot":"","sources":["../../../src/components/TunnelExit.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAOD,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAezC,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -1,4 +1,4 @@
1
- export { TunnelProvider } from './components/TunnelProvider';
2
- export { TunnelEntry } from './components/TunnelEntry';
3
- export { TunnelExit } from './components/TunnelExit';
1
+ export * from './components/TunnelProvider';
2
+ export * from './components/TunnelEntry';
3
+ export * from './components/TunnelExit';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/react-tunnel",
3
- "version": "0.2.0-alpha.73",
3
+ "version": "0.2.0-alpha.731",
4
4
  "type": "module",
5
5
  "description": "It's like a Portal – but with React components",
6
6
  "keywords": [
@@ -25,40 +25,39 @@
25
25
  "scripts": {
26
26
  "build": "vite build --config vite.build.config.ts",
27
27
  "clean": "rimraf dist",
28
- "test": "exit 0",
29
- "test:compile": "tsc --noEmit",
30
- "test:unit": "vitest run"
28
+ "test:browser": "vitest run --project=browser --browser.headless",
29
+ "test:browser:dev": "vitest dev --project=browser",
30
+ "test:compile": "tsc --noEmit"
31
31
  },
32
32
  "dependencies": {
33
- "mobx": "^6.13.6",
34
- "mobx-react-lite": "^4.1.0"
33
+ "mobx": "^6.15.0",
34
+ "mobx-react-lite": "^4.1.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@mittwald/typescript-config": "workspace:*",
38
- "@testing-library/dom": "^10.4.0",
39
- "@testing-library/react": "^16.2.0",
40
- "@types/node": "^22.13.4",
41
- "@types/react": "^19",
42
- "@types/react-dom": "^19",
43
- "@vitejs/plugin-react": "^4.3.4",
44
- "@vitest/coverage-v8": "^2.1.9",
45
- "happy-dom": "^16.8.1",
46
- "nx": "^20.4.5",
47
- "prettier": "^3.5.1",
48
- "react": "^19",
49
- "react-dom": "^19",
50
- "rimraf": "^6.0.1",
51
- "typescript": "^5.7.3",
52
- "vite": "^6.1.1",
53
- "vite-plugin-banner": "^0.8.0",
54
- "vite-plugin-checker": "^0.8.0",
55
- "vite-plugin-dts": "^4.5.0",
56
- "vite-plugin-externalize-deps": "^0.9.0",
57
- "vitest": "^2.1.9"
38
+ "@types/node": "^24.10.9",
39
+ "@types/react": "^19.2",
40
+ "@types/react-dom": "^19.2",
41
+ "@vitejs/plugin-react": "^5.1.3",
42
+ "@vitest/browser-playwright": "^4.0.18",
43
+ "@vitest/coverage-v8": "^4.0.18",
44
+ "nx": "^22.4.4",
45
+ "prettier": "^3.8.1",
46
+ "react": "^19.2.0",
47
+ "react-dom": "^19.2.0",
48
+ "rimraf": "^6.1.2",
49
+ "typescript": "^5.9.3",
50
+ "vite": "^7.3.1",
51
+ "vite-plugin-banner": "^0.8.1",
52
+ "vite-plugin-checker": "^0.12.0",
53
+ "vite-plugin-dts": "^4.5.4",
54
+ "vite-plugin-externalize-deps": "^0.10.0",
55
+ "vitest": "^4.0.18",
56
+ "vitest-browser-react": "^2.0.2"
58
57
  },
59
58
  "peerDependencies": {
60
- "react": "^19",
61
- "react-dom": "^19"
59
+ "react": "^19.2.0",
60
+ "react-dom": "^19.2.0"
62
61
  },
63
- "gitHead": "60af39ad8b760192353ccf8a99178e8222276a1c"
62
+ "gitHead": "b35bbe67e91ec7ea4e224d668cc70152ae0c258a"
64
63
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Tunnel.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tunnel.test.d.ts","sourceRoot":"","sources":["../../src/Tunnel.test.tsx"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import { ReactNode } from 'react';
2
- export type TunnelChildren = ReactNode | undefined | (() => ReactNode | undefined);
3
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC"}