@owlmeans/client 0.1.18-rc.12 → 0.1.18-rc.13
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/README.md +34 -10
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/client/SKILL.md +25 -11
- package/build/components/modal.d.ts.map +1 -1
- package/build/components/modal.js.map +1 -1
- package/build/components/toggle.d.ts.map +1 -1
- package/build/context.d.ts.map +1 -1
- package/build/context.js +1 -3
- package/build/context.js.map +1 -1
- package/build/debug.d.ts.map +1 -1
- package/build/entrypoint.d.ts +3 -0
- package/build/entrypoint.d.ts.map +1 -0
- package/build/entrypoint.js +4 -0
- package/build/entrypoint.js.map +1 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js.map +1 -1
- package/build/helper.d.ts.map +1 -1
- package/build/helper.js +3 -3
- package/build/helper.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/navigate.d.ts.map +1 -1
- package/build/navigate.js +12 -15
- package/build/navigate.js.map +1 -1
- package/build/router.d.ts.map +1 -1
- package/build/router.js +12 -6
- package/build/router.js.map +1 -1
- package/build/services/debug.d.ts.map +1 -1
- package/build/services/debug.js.map +1 -1
- package/build/store.d.ts +18 -3
- package/build/store.d.ts.map +1 -1
- package/build/store.js +56 -55
- package/build/store.js.map +1 -1
- package/build/types.d.ts +11 -2
- package/build/types.d.ts.map +1 -1
- package/build/utils/entrypoint.d.ts +3 -0
- package/build/utils/entrypoint.d.ts.map +1 -0
- package/build/utils/{module.js → entrypoint.js} +2 -2
- package/build/utils/entrypoint.js.map +1 -0
- package/build/utils/index.d.ts +1 -1
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +1 -1
- package/build/utils/index.js.map +1 -1
- package/build/utils/route.d.ts.map +1 -1
- package/build/utils/route.js +3 -3
- package/build/utils/route.js.map +1 -1
- package/build/utils/router.d.ts +4 -4
- package/build/utils/router.d.ts.map +1 -1
- package/build/utils/router.js +8 -8
- package/build/utils/router.js.map +1 -1
- package/build/value.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/context.ts +1 -4
- package/src/entrypoint.ts +6 -0
- package/src/helper.tsx +6 -6
- package/src/index.ts +1 -1
- package/src/navigate.ts +12 -15
- package/src/router.ts +14 -10
- package/src/services/debug.ts +2 -2
- package/src/store.ts +70 -59
- package/src/types.ts +12 -2
- package/src/utils/{module.ts → entrypoint.ts} +2 -2
- package/src/utils/index.ts +1 -1
- package/src/utils/route.tsx +5 -5
- package/src/utils/router.ts +11 -11
- package/build/module.d.ts +0 -3
- package/build/module.d.ts.map +0 -1
- package/build/module.js +0 -4
- package/build/module.js.map +0 -1
- package/build/utils/module.d.ts +0 -3
- package/build/utils/module.d.ts.map +0 -1
- package/build/utils/module.js.map +0 -1
- package/src/module.ts +0 -6
package/build/store.js
CHANGED
|
@@ -1,60 +1,61 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo, useSyncExternalStore } from 'react';
|
|
2
2
|
import { useContext } from './context.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Turn one state subscription into the pair `useSyncExternalStore` wants.
|
|
5
|
+
*
|
|
6
|
+
* The value is cached rather than rebuilt per render: the hook is asked for a snapshot on every
|
|
7
|
+
* render and must answer with the same reference until something actually changed, or React
|
|
8
|
+
* re-renders forever. A state subscription hands its value over synchronously, so the first
|
|
9
|
+
* snapshot is taken by subscribing and unsubscribing again — no render ever runs without one,
|
|
10
|
+
* and no subscription outlives the call.
|
|
11
|
+
*/
|
|
12
|
+
const bind = (subscribe) => {
|
|
13
|
+
let current;
|
|
14
|
+
let seeded = false;
|
|
15
|
+
const capture = (notify) => (value) => {
|
|
16
|
+
current = value;
|
|
17
|
+
seeded = true;
|
|
18
|
+
notify?.();
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
subscribe: (notify) => subscribe(capture(notify)),
|
|
22
|
+
snapshot: () => {
|
|
23
|
+
if (!seeded) {
|
|
24
|
+
subscribe(capture())();
|
|
25
|
+
}
|
|
26
|
+
return current;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
9
29
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
params.resource = opts;
|
|
20
|
-
}
|
|
21
|
-
else if (typeof opts === 'boolean') {
|
|
22
|
-
params.listen = opts;
|
|
23
|
-
}
|
|
24
|
-
params.listen = params.listen ?? true;
|
|
30
|
+
/**
|
|
31
|
+
* One record from a state resource, live.
|
|
32
|
+
*
|
|
33
|
+
* It never throws for missing data: an id the store knows nothing about yields a model whose
|
|
34
|
+
* `empty` is true — reading `record` gives the resource's configured default, and nothing is
|
|
35
|
+
* written into the store on the way. Pass no id to address the one record of a `single`
|
|
36
|
+
* resource; on any other that is a configuration error and throws.
|
|
37
|
+
*/
|
|
38
|
+
export const useStoreModel = (id, alias) => {
|
|
25
39
|
const context = useContext();
|
|
26
|
-
const resource = useMemo(() => context.getStateResource(
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
params.listen && setModels(models);
|
|
47
|
-
},
|
|
48
|
-
default: params.default,
|
|
49
|
-
query: params.query,
|
|
50
|
-
});
|
|
51
|
-
setModels(_initialModels);
|
|
52
|
-
if (_return.length < 1) {
|
|
53
|
-
_return.push(..._initialModels);
|
|
54
|
-
}
|
|
55
|
-
return unsubscribe;
|
|
56
|
-
}, deps);
|
|
57
|
-
useEffect(() => unsubscribe, deps);
|
|
58
|
-
return _return;
|
|
40
|
+
const resource = useMemo(() => context.getStateResource(alias), [context, alias]);
|
|
41
|
+
const store = useMemo(() => bind(listener => resource.watch(id, listener)), [resource, id]);
|
|
42
|
+
return useSyncExternalStore(store.subscribe, store.snapshot, store.snapshot);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* A live LIST from a state resource: every record the query accepts, re-evaluated on every write
|
|
46
|
+
* that changes the answer, so a screen never recomputes ids and never re-subscribes to keep up.
|
|
47
|
+
* Omitting `query` matches everything.
|
|
48
|
+
*/
|
|
49
|
+
export const useStoreList = (opts) => {
|
|
50
|
+
const context = useContext();
|
|
51
|
+
const resource = useMemo(() => context.getStateResource(opts?.resource), [context, opts?.resource]);
|
|
52
|
+
/**
|
|
53
|
+
* The subscription is keyed on the query's CONTENT, not on whether one was given: a screen
|
|
54
|
+
* that narrows its filter has to re-subscribe, and keyed on identity it kept answering the
|
|
55
|
+
* first filter it ever saw with nothing to say the list had gone stale.
|
|
56
|
+
*/
|
|
57
|
+
const key = JSON.stringify([opts?.query ?? null, opts?.sort ?? null]);
|
|
58
|
+
const store = useMemo(() => bind(listener => resource.query(opts?.query, listener, { sort: opts?.sort })), [resource, key]);
|
|
59
|
+
return useSyncExternalStore(store.subscribe, store.snapshot, store.snapshot);
|
|
59
60
|
};
|
|
60
61
|
//# sourceMappingURL=store.js.map
|
package/build/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAG,CAAI,SAAuD,EAAE,EAAE;IAC1E,IAAI,OAAsB,CAAA;IAC1B,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAE,EAAE,CAAC,CAAC,KAAQ,EAAE,EAAE;QACpD,OAAO,GAAG,KAAK,CAAA;QACf,MAAM,GAAG,IAAI,CAAA;QACb,MAAM,EAAE,EAAE,CAAA;IACZ,CAAC,CAAA;IAED,OAAO;QACL,SAAS,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,QAAQ,EAAE,GAAM,EAAE;YAChB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAA;YACxB,CAAC;YAED,OAAO,OAAY,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,EAAW,EAAE,KAAc,EACZ,EAAE;IACjB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IACpF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,IAAI,CAAgB,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,EACnE,CAAC,QAAQ,EAAE,EAAE,CAAC,CACf,CAAA;IAED,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;AAC9E,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAA6B,EACZ,EAAE;IACnB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAI,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEtG;;;;OAIG;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,IAAI,CACR,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACxE,EACD,CAAC,QAAQ,EAAE,GAAG,CAAC,CAChB,CAAA;IAED,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;AAC9E,CAAC,CAAA"}
|
package/build/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { PropsWithChildren, FC, DependencyList } from 'react';
|
|
2
2
|
import type { AbstractRequest } from '@owlmeans/entrypoint';
|
|
3
3
|
import type { ClientConfig, ClientContext as BasicClientContext } from '@owlmeans/client-context';
|
|
4
|
+
import type { Criteria, ResourceRecord, Sort } from '@owlmeans/resource';
|
|
4
5
|
import type { StateResourceAppend } from '@owlmeans/state';
|
|
5
6
|
import type { ClientEntrypoint } from '@owlmeans/client-entrypoint';
|
|
6
7
|
import type { DebugServiceAppend, ModalServiceAppend } from './components/types.js';
|
|
@@ -29,9 +30,9 @@ export interface AppProps extends PropsWithChildren {
|
|
|
29
30
|
/** Opt out of mounting the router (e.g. when routing is hosted elsewhere). */
|
|
30
31
|
noRouter?: boolean;
|
|
31
32
|
}
|
|
32
|
-
export interface RoutedComponent<ExtraProps = {}> extends FC<PropsWithChildren<
|
|
33
|
+
export interface RoutedComponent<ExtraProps = {}> extends FC<PropsWithChildren<EntrypointContextParams & ExtraProps>> {
|
|
33
34
|
}
|
|
34
|
-
export interface
|
|
35
|
+
export interface EntrypointContextParams<T extends {} = {}> {
|
|
35
36
|
alias: string;
|
|
36
37
|
params: AbstractRequest<T>['params'];
|
|
37
38
|
path: string;
|
|
@@ -62,4 +63,12 @@ export interface UseValueParams<T> {
|
|
|
62
63
|
default?: T;
|
|
63
64
|
deps?: DependencyList;
|
|
64
65
|
}
|
|
66
|
+
/** What `useStoreList` subscribes to. Every field is optional; nothing at all means everything. */
|
|
67
|
+
export interface UseStoreListOptions<T extends ResourceRecord = ResourceRecord> {
|
|
68
|
+
/** The live query. Omitted or `{}` matches every record the resource holds. */
|
|
69
|
+
query?: Criteria<T>;
|
|
70
|
+
sort?: Sort<T>[];
|
|
71
|
+
/** Which state resource to read; the context's default one when omitted. */
|
|
72
|
+
resource?: string;
|
|
73
|
+
}
|
|
65
74
|
//# sourceMappingURL=types.d.ts.map
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AACjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAG7G,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,OAAO,EAAE,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;CACpG;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAChE;AAED,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;CACzC;AAED,MAAM,WAAW,QAAS,SAAQ,iBAAiB;IACjD,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IAC3B,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,eAAe,CAAC,UAAU,GAAG,EAAE,CAAE,SAAQ,EAAE,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrypoint.d.ts","sourceRoot":"","sources":["../../src/utils/entrypoint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAiB,MAAM,aAAa,CAAA;AAMzE,eAAO,MAAM,iBAAiB,sDAK5B,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createContext } from 'react';
|
|
2
|
-
export const
|
|
2
|
+
export const EntrypointContext = createContext({
|
|
3
3
|
alias: '',
|
|
4
4
|
params: {},
|
|
5
5
|
path: '',
|
|
6
6
|
context: {}
|
|
7
7
|
});
|
|
8
|
-
//# sourceMappingURL=
|
|
8
|
+
//# sourceMappingURL=entrypoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entrypoint.js","sourceRoot":"","sources":["../../src/utils/entrypoint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAOrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAA0B;IACtE,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAa;CACvB,CAAC,CAAA"}
|
package/build/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA"}
|
package/build/utils/index.js
CHANGED
package/build/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/utils/route.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/utils/route.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,KAAK,EAA4C,aAAa,EAAE,MAAM,aAAa,CAAA;AAE1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,KAAK,MAAM,GAAG,YAAY,CAAA;AAC1B,UAAU,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAI;AAEzE,eAAO,MAAM,mBAAmB,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,EAyD7D,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAA;AAEvF,UAAU,cAAc;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACjC,WAAW,EAAE,OAAO,CAAA;CACrB"}
|
package/build/utils/route.js
CHANGED
|
@@ -9,7 +9,7 @@ export const createRouteRenderer = ({ context, module, hasChildren }) => () => {
|
|
|
9
9
|
useEffect(() => {
|
|
10
10
|
if (module.guards != null) {
|
|
11
11
|
const guards = module.getGuards().map(guard => context.service(guard));
|
|
12
|
-
const request = provideRequest(module.alias, module.
|
|
12
|
+
const request = provideRequest(module.alias, module.path());
|
|
13
13
|
const reply = provideResponse();
|
|
14
14
|
let canceled = false;
|
|
15
15
|
Promise.all(guards.map(async (guard) => {
|
|
@@ -34,7 +34,7 @@ export const createRouteRenderer = ({ context, module, hasChildren }) => () => {
|
|
|
34
34
|
}
|
|
35
35
|
}, module.guards ?? []);
|
|
36
36
|
let Renderer = module.handle?.({
|
|
37
|
-
alias: module.alias, path: module.
|
|
37
|
+
alias: module.alias, path: module.path(),
|
|
38
38
|
params, body: {}, headers: {}, query: {},
|
|
39
39
|
}, reply);
|
|
40
40
|
if (reply.error != null) {
|
|
@@ -47,7 +47,7 @@ export const createRouteRenderer = ({ context, module, hasChildren }) => () => {
|
|
|
47
47
|
if (isComponent(Renderer)) {
|
|
48
48
|
const EnsuredRenderer = memo(Renderer);
|
|
49
49
|
const props = {
|
|
50
|
-
context, params, alias: module.
|
|
50
|
+
context, params, alias: module.alias, path: module.path()
|
|
51
51
|
};
|
|
52
52
|
if (hasChildren) {
|
|
53
53
|
return _jsx(EnsuredRenderer, { ...props, children: _jsx(Outlet, {}) });
|
package/build/utils/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/utils/route.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAMnD,MAAM,CAAC,MAAM,mBAAmB,GAAmC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE;IAC5G,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAA;IAC3C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAe,KAAK,CAAC,CAAC,CAAA;YACpF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/utils/route.tsx"],"names":[],"mappings":"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"}
|
package/build/utils/router.d.ts
CHANGED
|
@@ -4,13 +4,13 @@ import type { ClientContext } from '../types.js';
|
|
|
4
4
|
type Config = ClientConfig;
|
|
5
5
|
interface Context<C extends Config = Config> extends ClientContext<C> {
|
|
6
6
|
}
|
|
7
|
-
export declare const
|
|
8
|
-
export declare const
|
|
7
|
+
export declare const buildEntrypointTree: <R, C extends Config = Config, T extends Context<C> = Context<C>>(context: T) => EntrypointTree<R>;
|
|
8
|
+
export declare const visitEntrypointTree: <T, R>(tree: EntrypointTree<T>, visitor: EntrypointTreeVisitor<T, R>) => Promise<R[]>;
|
|
9
9
|
export declare const initializeRouter: (context: Context) => Promise<import("@owlmeans/router").RouteObject[]>;
|
|
10
|
-
export interface
|
|
10
|
+
export interface EntrypointTreeVisitor<T, R> {
|
|
11
11
|
(module: ClientEntrypoint<T>, children: R[], alone: boolean): Promise<R>;
|
|
12
12
|
}
|
|
13
|
-
interface
|
|
13
|
+
interface EntrypointTree<T> extends Map<ClientEntrypoint<T>, EntrypointTree<T>> {
|
|
14
14
|
}
|
|
15
15
|
export {};
|
|
16
16
|
//# sourceMappingURL=router.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/utils/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,MAAM,GAAG,YAAY,CAAA;AAC1B,UAAU,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAI;AAEzE,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/utils/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,MAAM,GAAG,YAAY,CAAA;AAC1B,UAAU,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAI;AAEzE,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,KAAG,cAAc,CAAC,CAAC,CA2BjI,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAU,CAAC,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,EAAE,CAKhG,CAAA;AAE3B,eAAO,MAAM,gBAAgB,GAAU,SAAS,OAAO,sDAOtD,CAAA;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACzE;AAED,UAAU,cAAc,CAAC,CAAC,CAAE,SAAQ,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CAC9E"}
|
package/build/utils/router.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { AppType } from '@owlmeans/context';
|
|
2
2
|
import { makeRouterModel } from '../router.js';
|
|
3
|
-
export const
|
|
4
|
-
const
|
|
3
|
+
export const buildEntrypointTree = (context) => {
|
|
4
|
+
const entrypoints = context.entrypoints().filter(module => module.route.route.type === AppType.Frontend
|
|
5
5
|
&& (module.sticky || module.route.route.service == null
|
|
6
6
|
|| module.route.route.service === context.cfg.service));
|
|
7
7
|
const flatTree = new Map();
|
|
8
8
|
const roots = [];
|
|
9
|
-
|
|
10
|
-
const parentAlias = module.
|
|
9
|
+
entrypoints.forEach(module => {
|
|
10
|
+
const parentAlias = module.route.route.parent;
|
|
11
11
|
if (parentAlias == null) {
|
|
12
12
|
roots.push(module);
|
|
13
13
|
}
|
|
@@ -18,12 +18,12 @@ export const buildModuleTree = (context) => {
|
|
|
18
18
|
flatTree.set(parent, list);
|
|
19
19
|
}
|
|
20
20
|
});
|
|
21
|
-
const
|
|
22
|
-
return
|
|
21
|
+
const reduceEntrypoints = (entrypoints) => entrypoints.reduce((tree, module) => tree.set(module, reduceEntrypoints(flatTree.get(module) ?? [])), new Map());
|
|
22
|
+
return reduceEntrypoints(roots);
|
|
23
23
|
};
|
|
24
|
-
export const
|
|
24
|
+
export const visitEntrypointTree = async (tree, visitor) => Array.from(tree.entries()).reduce(async (result, [module, tree], _, source) => [
|
|
25
25
|
...(await result),
|
|
26
|
-
await visitor(module, await
|
|
26
|
+
await visitor(module, await visitEntrypointTree(tree, visitor), source.length === 1)
|
|
27
27
|
], Promise.resolve([]));
|
|
28
28
|
export const initializeRouter = async (context) => {
|
|
29
29
|
if (!context.cfg.ready) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/utils/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAO9C,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/utils/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAO9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAkE,OAAU,EAAqB,EAAE;IACpI,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAuB,CAAC,MAAM,CACnE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,QAAQ;WACjD,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI;eAClD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAC3D,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8C,CAAA;IACtE,MAAM,KAAK,GAA0B,EAAE,CAAA;IAEvC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;QAC7C,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAsB,WAAW,CAAC,CAAA;YACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;YACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACjB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,iBAAiB,GAAG,CAAC,WAAkC,EAAqB,EAAE,CAAC,WAAW,CAAC,MAAM,CACrG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAC7F,CAAA;IAED,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAQ,IAAuB,EAAE,OAAoC,EAAgB,EAAE,CAC7H,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAC/B,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC3C,GAAG,CAAC,MAAM,MAAM,CAAC;IACjB,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;CACrF,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;AAE3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IACzD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAA;QAChC,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAA;IACpC,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAC/B,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC,CAAA"}
|
package/build/value.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../src/value.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAIhD;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../src/value.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAIhD;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1D,MAAM,CAAC,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,EACnD,eAAe,OAAO,KACrB,CAAC,GAAG,IAiDN,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/client",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.13",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -28,17 +28,17 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@owlmeans/auth": "^0.1.18-rc.
|
|
32
|
-
"@owlmeans/client-context": "^0.1.18-rc.
|
|
33
|
-
"@owlmeans/client-entrypoint": "^0.1.18-rc.
|
|
34
|
-
"@owlmeans/client-resource": "^0.1.18-rc.
|
|
35
|
-
"@owlmeans/config": "^0.1.18-rc.
|
|
36
|
-
"@owlmeans/context": "^0.1.18-rc.
|
|
37
|
-
"@owlmeans/error": "^0.1.18-rc.
|
|
38
|
-
"@owlmeans/entrypoint": "^0.1.18-rc.
|
|
39
|
-
"@owlmeans/resource": "^0.1.18-rc.
|
|
40
|
-
"@owlmeans/router": "^0.1.18-rc.
|
|
41
|
-
"@owlmeans/state": "^0.1.18-rc.
|
|
31
|
+
"@owlmeans/auth": "^0.1.18-rc.8",
|
|
32
|
+
"@owlmeans/client-context": "^0.1.18-rc.11",
|
|
33
|
+
"@owlmeans/client-entrypoint": "^0.1.18-rc.11",
|
|
34
|
+
"@owlmeans/client-resource": "^0.1.18-rc.11",
|
|
35
|
+
"@owlmeans/config": "^0.1.18-rc.10",
|
|
36
|
+
"@owlmeans/context": "^0.1.18-rc.7",
|
|
37
|
+
"@owlmeans/error": "^0.1.18-rc.7",
|
|
38
|
+
"@owlmeans/entrypoint": "^0.1.18-rc.9",
|
|
39
|
+
"@owlmeans/resource": "^0.1.18-rc.8",
|
|
40
|
+
"@owlmeans/router": "^0.1.18-rc.7",
|
|
41
|
+
"@owlmeans/state": "^0.1.18-rc.9"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@remix-run/router": "*",
|
package/src/context.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { createContext, useContext as useCtx } from 'react'
|
|
|
3
3
|
import type { Context as ReactContext } from 'react'
|
|
4
4
|
import { makeClientContext as makeBasicContext, PLUGINS } from '@owlmeans/client-context'
|
|
5
5
|
import type { ClientConfig } from '@owlmeans/client-context'
|
|
6
|
-
import { AppType, CONFIG_RECORD
|
|
6
|
+
import { AppType, CONFIG_RECORD } from '@owlmeans/context'
|
|
7
7
|
import type { ClientContext } from './types.js'
|
|
8
8
|
import { appendStateResource } from '@owlmeans/state'
|
|
9
9
|
import { appendModalService } from './components/modal.js'
|
|
@@ -15,7 +15,6 @@ import { ROUTER_SERVICE } from '@owlmeans/router'
|
|
|
15
15
|
const defaultCfg: ClientConfig = {
|
|
16
16
|
services: {},
|
|
17
17
|
brand: {},
|
|
18
|
-
layer: Layer.Service,
|
|
19
18
|
trusted: [],
|
|
20
19
|
[CONFIG_RECORD]: [],
|
|
21
20
|
ready: false,
|
|
@@ -51,8 +50,6 @@ export const makeClientContext = <C extends ClientConfig, T extends ClientContex
|
|
|
51
50
|
|
|
52
51
|
context.router = () => context.service<RouterService>(ROUTER_SERVICE)
|
|
53
52
|
|
|
54
|
-
context.makeContext = makeClientContext as typeof context.makeContext
|
|
55
|
-
|
|
56
53
|
return context
|
|
57
54
|
}
|
|
58
55
|
|
package/src/helper.tsx
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { AbstractRequest, AbstractResponse } from '@owlmeans/entrypoint'
|
|
2
|
-
import type {
|
|
2
|
+
import type { EntrypointContextParams, RoutedComponent, ClientContext } from './types.js'
|
|
3
3
|
import type { RefedEntrypointHandler } from '@owlmeans/client-entrypoint'
|
|
4
4
|
import { HandledRenderer } from './utils/route.js'
|
|
5
5
|
import { isValidElement } from 'react'
|
|
6
6
|
import type { PropsWithChildren } from 'react'
|
|
7
|
-
import {
|
|
7
|
+
import { EntrypointContext } from './utils/entrypoint.js'
|
|
8
8
|
import type { ClientConfig } from '@owlmeans/client-context'
|
|
9
9
|
import { assertContext } from '@owlmeans/context'
|
|
10
10
|
|
|
@@ -17,7 +17,7 @@ export const handler = <T extends {}>(
|
|
|
17
17
|
R extends AbstractRequest = AbstractRequest,
|
|
18
18
|
P extends AbstractResponse<HandledRenderer<T>> = AbstractResponse<HandledRenderer<T>>
|
|
19
19
|
>(req: R, res: P): any => {
|
|
20
|
-
const location = `client-handler:${ref.ref?.
|
|
20
|
+
const location = `client-handler:${ref.ref?.alias ?? 'unknown'}`
|
|
21
21
|
if (ref.ref == null) {
|
|
22
22
|
throw new SyntaxError('Module reference is not provided')
|
|
23
23
|
}
|
|
@@ -40,12 +40,12 @@ export const handler = <T extends {}>(
|
|
|
40
40
|
|
|
41
41
|
const Renderer: RoutedComponent = ({ children, ...props }) => {
|
|
42
42
|
const Renderer = Component as unknown as RendererType
|
|
43
|
-
return <
|
|
43
|
+
return <EntrypointContext.Provider value={props}>
|
|
44
44
|
<Renderer {...props}>{children}</Renderer>
|
|
45
|
-
</
|
|
45
|
+
</EntrypointContext.Provider>
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
return Renderer
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
type RendererType = HandledRenderer<PropsWithChildren<
|
|
51
|
+
type RendererType = HandledRenderer<PropsWithChildren<EntrypointContextParams>> & RoutedComponent
|
package/src/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ export * from './components/index.js'
|
|
|
4
4
|
export * from './services/index.js'
|
|
5
5
|
export * from './helper.js'
|
|
6
6
|
export * from './navigate.js'
|
|
7
|
-
export * from './
|
|
7
|
+
export * from './entrypoint.js'
|
|
8
8
|
export * from './router.js'
|
|
9
9
|
export * from './types.js'
|
|
10
10
|
export * from './store.js'
|
package/src/navigate.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useMemo } from 'react'
|
|
2
2
|
import type { Navigator } from './types.js'
|
|
3
|
-
import { EntrypointOutcome } from '@owlmeans/entrypoint'
|
|
4
3
|
import { useContext } from './context.js'
|
|
5
4
|
import type { ClientEntrypoint } from '@owlmeans/client-entrypoint'
|
|
6
5
|
|
|
@@ -12,20 +11,18 @@ export const useNavigate = (): Navigator => {
|
|
|
12
11
|
const navigator: Navigator = {
|
|
13
12
|
_navigate: navigate,
|
|
14
13
|
|
|
15
|
-
navigate: async (
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
})
|
|
28
|
-
}
|
|
14
|
+
navigate: async (entrypoint, request) => {
|
|
15
|
+
const url = await entrypoint.url(request)
|
|
16
|
+
|
|
17
|
+
if (url.startsWith('http')) {
|
|
18
|
+
globalThis.location.href = url
|
|
19
|
+
} else {
|
|
20
|
+
navigate(url, {
|
|
21
|
+
state: {
|
|
22
|
+
...entrypoint.route.route, silent: request?.silent
|
|
23
|
+
},
|
|
24
|
+
replace: request?.replace ?? false
|
|
25
|
+
})
|
|
29
26
|
}
|
|
30
27
|
},
|
|
31
28
|
|
package/src/router.ts
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import type { FC } from 'react'
|
|
2
2
|
import type { RouterModel, RouterProps, RouterProvider } from './types.js'
|
|
3
3
|
import { createElement, useEffect, useRef, useState } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import { buildEntrypointTree, initializeRouter, visitEntrypointTree } from './utils/router.js'
|
|
5
5
|
import { createRouteRenderer } from './utils/route.js'
|
|
6
6
|
import { useContext } from './context.js'
|
|
7
7
|
import type { ClientConfig } from '@owlmeans/client-context'
|
|
8
8
|
import type { ClientContext } from './types.js'
|
|
9
9
|
import { assertContext } from '@owlmeans/context'
|
|
10
|
-
import type { BasicConfig, BasicContext } from '@owlmeans/context'
|
|
11
10
|
import type { LibraryRouter, RouteObject } from '@owlmeans/router'
|
|
12
11
|
|
|
13
12
|
type Config = ClientConfig
|
|
14
13
|
interface Context<C extends Config = Config> extends ClientContext<C> { }
|
|
15
14
|
|
|
15
|
+
/** A child path that keeps its leading separator reads as absolute, and the router rejects it. */
|
|
16
|
+
const relative = (segment: string): string => {
|
|
17
|
+
segment = segment.trim()
|
|
18
|
+
segment = segment.endsWith('/') ? segment.slice(0, -1) : segment
|
|
19
|
+
|
|
20
|
+
return segment.startsWith('/') ? segment.substring(1) : segment
|
|
21
|
+
}
|
|
22
|
+
|
|
16
23
|
export const Router: FC<RouterProps> = ({ provide }) => {
|
|
17
24
|
const progress = useRef(false)
|
|
18
25
|
const context = useContext()
|
|
@@ -55,21 +62,18 @@ export const makeRouterModel = (): RouterModel => {
|
|
|
55
62
|
routes: [],
|
|
56
63
|
resolve: async (ctx) => {
|
|
57
64
|
const context = assertContext<Config, Context>(ctx as Context, location)
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
const reactRoutes: RouteObject[] = await visitModuleTree(moduleTree, async (module, children) => {
|
|
61
|
-
const ctx = assertContext<BasicConfig, BasicContext<BasicConfig>>(
|
|
62
|
-
(module.ctx ?? context) as BasicContext<BasicConfig>, location
|
|
63
|
-
)
|
|
64
|
-
await module.route.resolve(ctx)
|
|
65
|
+
const entrypointTree = buildEntrypointTree(context as Context)
|
|
65
66
|
|
|
67
|
+
const reactRoutes: RouteObject[] = await visitEntrypointTree(entrypointTree, async (module, children) => {
|
|
66
68
|
const renderer = module.handle != null
|
|
67
69
|
? { Component: createRouteRenderer({ context, module, hasChildren: children.length > 0 }) }
|
|
68
70
|
: undefined
|
|
69
71
|
|
|
72
|
+
// The React tree nests, so each node contributes only its OWN segment — its ancestors are
|
|
73
|
+
// the branches it hangs under and already carry theirs.
|
|
70
74
|
const route: RouteObject = {
|
|
71
75
|
...(module.route.route.default ? { index: true } as any : undefined),
|
|
72
|
-
...(!module.route.route.default ? { path: module.
|
|
76
|
+
...(!module.route.route.default ? { path: relative(module.segment()), children } : undefined),
|
|
73
77
|
...renderer
|
|
74
78
|
}
|
|
75
79
|
|
package/src/services/debug.ts
CHANGED
|
@@ -62,13 +62,13 @@ export const createDebugService = (alias: string = DEF_DEBUG_ALIAS): DebugServic
|
|
|
62
62
|
}, service => async () => {
|
|
63
63
|
service.initialized = true
|
|
64
64
|
const context = assertContext(service.ctx, location) as ClientContext
|
|
65
|
-
const record = await context.getConfigResource().load
|
|
65
|
+
const record = await context.getConfigResource<DebugConfigRecord>().load(DEBUG_CONFIG_KEY)
|
|
66
66
|
if (record?.states != null) {
|
|
67
67
|
service.addItem({
|
|
68
68
|
alias: 'reset-states',
|
|
69
69
|
title: `Reset states`,
|
|
70
70
|
action: async (modal, context) => {
|
|
71
|
-
const record = await context.getConfigResource().load
|
|
71
|
+
const record = await context.getConfigResource<DebugConfigRecord>().load(DEBUG_CONFIG_KEY)
|
|
72
72
|
if (record?.states != null) {
|
|
73
73
|
await service.erase(record.states)
|
|
74
74
|
context.rerender()
|