@actdim/dynstruct 0.9.0
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/LICENSE +8 -0
- package/README.md +2 -0
- package/dist/appDomain/appContracts.d.ts +113 -0
- package/dist/appDomain/appContracts.d.ts.map +1 -0
- package/dist/appDomain/appContracts.es.js +12 -0
- package/dist/appDomain/appContracts.es.js.map +1 -0
- package/dist/appDomain/navigation.d.ts +8 -0
- package/dist/appDomain/navigation.d.ts.map +1 -0
- package/dist/appDomain/navigation.es.js +18 -0
- package/dist/appDomain/navigation.es.js.map +1 -0
- package/dist/appDomain/security/securityContracts.d.ts +94 -0
- package/dist/appDomain/security/securityContracts.d.ts.map +1 -0
- package/dist/appDomain/security/securityContracts.es.js +15 -0
- package/dist/appDomain/security/securityContracts.es.js.map +1 -0
- package/dist/appDomain/security/securityProvider.d.ts +31 -0
- package/dist/appDomain/security/securityProvider.d.ts.map +1 -0
- package/dist/appDomain/security/securityProvider.es.js +265 -0
- package/dist/appDomain/security/securityProvider.es.js.map +1 -0
- package/dist/componentModel/componentModel.d.ts +129 -0
- package/dist/componentModel/componentModel.d.ts.map +1 -0
- package/dist/componentModel/componentModel.es.js +198 -0
- package/dist/componentModel/componentModel.es.js.map +1 -0
- package/dist/componentModel/scope.d.ts +34 -0
- package/dist/componentModel/scope.d.ts.map +1 -0
- package/dist/componentModel/scope.es.js +139 -0
- package/dist/componentModel/scope.es.js.map +1 -0
- package/dist/net/apiError.d.ts +22 -0
- package/dist/net/apiError.d.ts.map +1 -0
- package/dist/net/apiError.es.js +47 -0
- package/dist/net/apiError.es.js.map +1 -0
- package/dist/net/client.d.ts +20 -0
- package/dist/net/client.d.ts.map +1 -0
- package/dist/net/client.es.js +146 -0
- package/dist/net/client.es.js.map +1 -0
- package/dist/net/request.d.ts +44 -0
- package/dist/net/request.d.ts.map +1 -0
- package/dist/net/request.es.js +33 -0
- package/dist/net/request.es.js.map +1 -0
- package/dist/reactHooks.d.ts +2 -0
- package/dist/reactHooks.d.ts.map +1 -0
- package/dist/reactHooks.es.js +9 -0
- package/dist/reactHooks.es.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityProvider.es.js","sources":["../../../src/appDomain/security/securityProvider.ts"],"sourcesContent":["import {\r\n AccessLevel,\r\n IAccessDescriptor,\r\n ISecurable,\r\n BaseSecurityDomainConfig,\r\n UserCredentials,\r\n SecurityTokens,\r\n SecurityContext\r\n} from \"./securityContracts\";\r\nimport { getValuePrefixer } from \"@actdim/utico/typeCore\";\r\nimport { jwtDecode } from \"jwt-decode\";\r\nimport { getResponseResult, IRequestParams, IRequestState, IResponseState } from \"@/net/request\";\r\nimport { ApiError } from \"@/net/apiError\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseAppBusStruct } from \"@/appDomain/appContracts\";\r\n\r\nconst userNameClaim = \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\";\r\n\r\n// JwtTokenPayload\r\ntype TokenPayload = {\r\n [userNameClaim]: string;\r\n};\r\n\r\n// Access denied\r\n// Insufficient privileges to perform this operation\r\nconst defaultAccessDeniedReason = \"Insufficient privileges. Contact your system Administrator.\";\r\n\r\nconst storageKeys = {\r\n accessToken: \"ACCESS_TOKEN\",\r\n refreshToken: \"REFRESH_TOKEN\",\r\n acl: \"ACL\",\r\n userCredentials: \"USER_CREDENTIALS\",\r\n userInfo: \"USER_INFO\"\r\n};\r\n\r\nfunction decodeJWTToken<T extends TokenPayload>(token: string): T {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n return jwtDecode<T>(this.accessToken);\r\n } catch {\r\n // something wrong with the token\r\n return null;\r\n }\r\n}\r\n\r\nexport class SecurityProvider<TUserInfo = any> {\r\n // private isAuthenticated: boolean;\r\n\r\n // private isExpired: boolean;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private domainConfig: BaseSecurityDomainConfig;\r\n\r\n private storageKeys: typeof storageKeys;\r\n\r\n private accessToken: string;\r\n\r\n private refreshToken: string;\r\n\r\n private userCredentials: UserCredentials;\r\n\r\n private userInfo: TUserInfo;\r\n\r\n // private authority: string;\r\n private authProvider: string;\r\n\r\n private tokenExpiresAt: string;\r\n\r\n // RBAC vs ABAC vs PBAC: https://habr.com/ru/companies/otus/articles/698080/\r\n private acl: any;\r\n\r\n private fetcher: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> } = window;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(msgBus: MsgBus<BaseAppBusStruct>) {\r\n this.msgBus = msgBus;\r\n\r\n this.init = this.updateConfigAsync();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONTEXT\",\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-ACL\",\r\n callback: (msg) => {\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n callback: (msg) => {\r\n return this.signInAsync(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n callback: (msg) => {\r\n return this.signOutAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\",\r\n callback: (msg) => {\r\n return this.refreshAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\",\r\n callback: (msg) => {\r\n return this.requestAuthorize();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONFIG\",\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n })\r\n ).payload?.security;\r\n }\r\n });\r\n }\r\n\r\n public getContext(): SecurityContext {\r\n return {\r\n accessToken: this.accessToken,\r\n refreshToken: this.refreshToken,\r\n userInfo: this.userInfo,\r\n authProvider: this.authProvider,\r\n domain: this.domain,\r\n tokenExpiresAt: this.tokenExpiresAt\r\n };\r\n }\r\n\r\n private async updateConfigAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n this.domainConfig = msg.payload.security;\r\n const prefixer = getValuePrefixer<typeof storageKeys>(this.domainConfig.id);\r\n this.storageKeys = prefixer(storageKeys);\r\n }\r\n\r\n async restoreDataAsync() {\r\n this.accessToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload;\r\n this.refreshToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload;\r\n let value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload;\r\n\r\n this.userCredentials = value\r\n ? JSON.parse(value)\r\n : {\r\n username: undefined,\r\n password: undefined\r\n };\r\n\r\n value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload;\r\n\r\n this.acl = value ? JSON.parse(value) : {};\r\n\r\n if (this.accessToken) {\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n payload: this.getContext()\r\n });\r\n }\r\n }\r\n\r\n public get domain(): string {\r\n return this.domainConfig.id;\r\n }\r\n\r\n // cleanUserAndActionsStorage = (): void => {\r\n // const obsoleteKeysRegexMatch = /^(user|actions)@.+$/;\r\n // for (let i = localStorage.length - 1; i >= 0; i--) {\r\n // const key = localStorage.key(i);\r\n // if (key && obsoleteKeysRegexMatch.test(key)) {\r\n // localStorage.removeItem(key);\r\n // }\r\n // }\r\n // };\r\n\r\n // removeSavedData\r\n async clearSavedDataAsync() {\r\n this.accessToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.refreshToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.userCredentials = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async requestAuthorize() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n group: \"out\"\r\n });\r\n throw new Error(\"Auth failed: login aborted\");\r\n };\r\n\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-REQUEST-AUTH-SIGNIN\",\r\n payload: {\r\n callbackUrl: window.location.pathname + window.location.search\r\n }\r\n });\r\n await Promise.race([signIn, signOut]);\r\n }\r\n\r\n async signInAsync(credentials: UserCredentials) {\r\n let url = this.domainConfig.routes?.authSignIn;\r\n\r\n url = url.replace(/[?&]$/, \"\");\r\n\r\n const content = JSON.stringify(credentials);\r\n\r\n // application/x-www-form-urlencoded?\r\n // username=&password=\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n let tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.userCredentials = credentials;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveDataAsync() {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.accessToken,\r\n value: this.accessToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken,\r\n value: this.refreshToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? JSON.stringify(this.userCredentials) : \"\"\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? JSON.stringify(this.acl) : \"\"\r\n }\r\n });\r\n }\r\n\r\n async signOutAsync() {\r\n let url = this.domainConfig.routes?.authSignOut;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n // this.accessToken = null;\r\n // this.refreshToken = null;\r\n // this.userCredentials = null;\r\n // this.acl = null;\r\n // this.saveDataAsync();\r\n this.clearSavedDataAsync();\r\n }\r\n\r\n async refreshAsync() {\r\n let url = this.domainConfig.routes?.authRefresh;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n let tokens: SecurityTokens = {\r\n refreshToken: this.refreshToken\r\n };\r\n\r\n const content = JSON.stringify(tokens);\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n // useAuth: true,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.userInfo = ...; // TODO\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async getAcl<T extends ISecurable>(obj: T) {\r\n // TODO: read from this.acl\r\n\r\n return {\r\n [AccessLevel.Full]: \"\"\r\n } as IAccessDescriptor;\r\n }\r\n\r\n // authorize\r\n async verifyAccess<T extends ISecurable>(obj: T, accessLevel = AccessLevel.Full) {\r\n const acl = this.getAcl(obj);\r\n\r\n // TODO: check accessDescriptors\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["storageKeys","SecurityProvider","msgBus","__publicField","msg","_a","prefixer","getValuePrefixer","value","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { PropsWithChildren, FC, ReactNode } from 'react';
|
|
2
|
+
import { $CG_IN, $CG_OUT, MsgBus, MsgBusProviderParams, MsgBusStruct, MsgBusSubscriberParams } from '@actdim/msgmesh/msgBusCore';
|
|
3
|
+
import { MaybePromise, SafeKey, Skip } from '@actdim/utico/typeCore';
|
|
4
|
+
export type MsgBusChannelGroupProviderParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN> = Skip<MsgBusProviderParams<TStruct, TChannel, TGroup>, "channel" | "group">;
|
|
5
|
+
export type MsgBusChannelGroupSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, "channel" | "group">;
|
|
6
|
+
export type MsgBusBrokerScope<TStruct extends MsgBusStruct, TKeysToProvide extends keyof TStruct = keyof TStruct, TKeysToSubscribe extends keyof TStruct = keyof TStruct, TKeysToPublish extends keyof TStruct = keyof TStruct> = {
|
|
7
|
+
provide?: TKeysToProvide;
|
|
8
|
+
subscribe?: TKeysToSubscribe;
|
|
9
|
+
publish?: TKeysToPublish;
|
|
10
|
+
};
|
|
11
|
+
export type ComponentPropStruct = Record<string, any>;
|
|
12
|
+
export type ComponentMethodStruct = Record<string, Function>;
|
|
13
|
+
export type ComponentRefStruct = {
|
|
14
|
+
[name: string]: ComponentStruct | ((params: any) => ComponentStruct);
|
|
15
|
+
};
|
|
16
|
+
export type ComponentStructBase<TMsgBusStruct extends MsgBusStruct = MsgBusStruct, TPropStruct extends ComponentPropStruct = ComponentPropStruct, TMsgScope extends MsgBusBrokerScope<TMsgBusStruct> = MsgBusBrokerScope<TMsgBusStruct>> = {
|
|
17
|
+
props?: TPropStruct;
|
|
18
|
+
methods?: ComponentMethodStruct;
|
|
19
|
+
children?: ComponentRefStruct;
|
|
20
|
+
msgScope?: TMsgScope;
|
|
21
|
+
};
|
|
22
|
+
export type ComponentStruct<TMsgBusStruct extends MsgBusStruct = MsgBusStruct, T extends ComponentStructBase<TMsgBusStruct> = ComponentStructBase<TMsgBusStruct>> = T & {
|
|
23
|
+
msgBus: TMsgBusStruct;
|
|
24
|
+
};
|
|
25
|
+
export type MsgBusBroker<TStructToProvide extends MsgBusStruct = MsgBusStruct, TStructToSubscribe extends MsgBusStruct = MsgBusStruct> = {
|
|
26
|
+
provide?: {
|
|
27
|
+
[TChannel in keyof TStructToProvide]: {
|
|
28
|
+
[TGroup in keyof Skip<TStructToProvide[TChannel], typeof $CG_OUT>]?: MsgBusChannelGroupProviderParams<TStructToProvide, TChannel, TGroup>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
subscribe?: {
|
|
32
|
+
[TChannel in keyof TStructToSubscribe]: {
|
|
33
|
+
[TGroup in keyof TStructToSubscribe[TChannel]]?: MsgBusChannelGroupSubscriberParams<TStructToSubscribe, TChannel, TGroup>;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
type ValueConverter<TTo, TFrom> = {
|
|
38
|
+
convert(value: TFrom): TTo;
|
|
39
|
+
convertBack(value: TTo): TFrom;
|
|
40
|
+
};
|
|
41
|
+
type ValidationResult = {
|
|
42
|
+
valid: boolean;
|
|
43
|
+
message: string;
|
|
44
|
+
};
|
|
45
|
+
type Validator<T> = {
|
|
46
|
+
options: {
|
|
47
|
+
blur: boolean;
|
|
48
|
+
};
|
|
49
|
+
validate: (value: T) => MaybePromise<ValidationResult>;
|
|
50
|
+
};
|
|
51
|
+
export declare const symbols: {
|
|
52
|
+
$isBinding: symbol;
|
|
53
|
+
};
|
|
54
|
+
export interface IBinding<T = any, TFrom = any> {
|
|
55
|
+
readonly get: () => T;
|
|
56
|
+
readonly set: (value: T) => void;
|
|
57
|
+
readonly converter: ValueConverter<T, TFrom>;
|
|
58
|
+
readonly validator: Validator<T>;
|
|
59
|
+
readonly readOnly: boolean;
|
|
60
|
+
}
|
|
61
|
+
declare class Binding<T = any, TFrom = any> implements IBinding<any, any> {
|
|
62
|
+
[symbols.$isBinding]: boolean;
|
|
63
|
+
readonly get: () => T;
|
|
64
|
+
readonly set: (value: T) => void;
|
|
65
|
+
readonly converter: ValueConverter<T, TFrom>;
|
|
66
|
+
readonly validator: Validator<T>;
|
|
67
|
+
readonly readOnly: boolean;
|
|
68
|
+
constructor(get: () => T, set?: (value: T) => void, converter?: ValueConverter<T, TFrom>, validator?: Validator<T>);
|
|
69
|
+
}
|
|
70
|
+
export declare function isBinding(obj: any): obj is IBinding;
|
|
71
|
+
export declare function bind<T, TFrom = any>(get: () => T, set?: (value: T) => void, converter?: ValueConverter<T, TFrom>, validator?: Validator<T>): Binding<T, TFrom>;
|
|
72
|
+
export declare function bindProp<T extends object, P extends keyof T>(obj: T, prop: P): Binding<T[P], any>;
|
|
73
|
+
export type ComponentPropSource<T> = T | Binding<T>;
|
|
74
|
+
export type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {
|
|
75
|
+
[P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;
|
|
76
|
+
};
|
|
77
|
+
declare const $ON_GET = "onGet";
|
|
78
|
+
declare const $ON_CHANGING = "onChanging";
|
|
79
|
+
declare const $ON_CHANGE = "onChange";
|
|
80
|
+
type PropValueChangingHandler<TProp = PropKey> = (prop: TProp, oldValue: any, newValue: any) => boolean;
|
|
81
|
+
type PropValueChangeHandler<TProp = PropKey> = (prop: TProp, value: any) => void;
|
|
82
|
+
type ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;
|
|
83
|
+
type ValueChangeHandler<T = any> = (value: T) => void;
|
|
84
|
+
type ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {
|
|
85
|
+
onPropChanging?: PropValueChangingHandler<keyof TStruct["props"]>;
|
|
86
|
+
onPropChange?: PropValueChangeHandler<keyof TStruct["props"]>;
|
|
87
|
+
onInit?: (model: ComponentModel<TStruct>) => void;
|
|
88
|
+
onLayout?: (model: ComponentModel<TStruct>) => void;
|
|
89
|
+
onReady?: (model: ComponentModel<TStruct>) => void;
|
|
90
|
+
onLayoutDestroy?: (model: ComponentModel<TStruct>) => void;
|
|
91
|
+
onDestroy?: (model: ComponentModel<TStruct>) => void;
|
|
92
|
+
onError?: (model: ComponentModel<TStruct>, error: any) => void;
|
|
93
|
+
} & {
|
|
94
|
+
[P in keyof TStruct["props"] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct["props"][P];
|
|
95
|
+
} & {
|
|
96
|
+
[P in keyof TStruct["props"] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<TStruct["props"]>;
|
|
97
|
+
} & {
|
|
98
|
+
[P in keyof TStruct["props"] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<TStruct["props"]>;
|
|
99
|
+
};
|
|
100
|
+
type ComponentViewProps = {
|
|
101
|
+
render?: boolean;
|
|
102
|
+
} & PropsWithChildren;
|
|
103
|
+
type ComponentViewFn = (props?: ComponentViewProps) => ReactNode;
|
|
104
|
+
export type Component<TStruct extends ComponentStruct> = {
|
|
105
|
+
props?: TStruct["props"];
|
|
106
|
+
methods?: TStruct["methods"];
|
|
107
|
+
children?: ComponentChildren<TStruct["children"]>;
|
|
108
|
+
events?: ComponentEvents<TStruct>;
|
|
109
|
+
msgBroker?: MsgBusBroker<Pick<TStruct["msgBus"], SafeKey<TStruct["msgBus"], TStruct["msgScope"]["provide"]>>, Pick<TStruct["msgBus"], SafeKey<TStruct["msgBus"], TStruct["msgScope"]["subscribe"]>>>;
|
|
110
|
+
msgBus?: MsgBus<Pick<TStruct["msgBus"], SafeKey<TStruct["msgBus"], TStruct["msgScope"]["provide"]> | SafeKey<TStruct["msgBus"], TStruct["msgScope"]["subscribe"]> | SafeKey<TStruct["msgBus"], TStruct["msgScope"]["publish"]>>>;
|
|
111
|
+
view?: ComponentViewFn;
|
|
112
|
+
};
|
|
113
|
+
type ComponentChildren<TRefStruct extends ComponentRefStruct> = {
|
|
114
|
+
[P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T ? T extends ComponentStruct ? (params: TParams) => ComponentModel<T> : never : TRefStruct[P] extends ComponentStruct ? ComponentModel<TRefStruct[P]> : never;
|
|
115
|
+
};
|
|
116
|
+
type ComponentModelChildren<TRefStruct extends ComponentRefStruct> = {
|
|
117
|
+
[P in keyof TRefStruct as TRefStruct[P] extends Function ? `${Capitalize<P & string>}` : P]: TRefStruct[P] extends (params: infer TParams) => infer T ? T extends ComponentStruct ? FC<ComponentParams<T> & TParams> : never : TRefStruct[P] extends ComponentStruct ? ComponentModel<TRefStruct[P]> : never;
|
|
118
|
+
};
|
|
119
|
+
export type ComponentModelBase<TStruct extends ComponentStruct = ComponentStruct> = {
|
|
120
|
+
readonly msgBus?: MsgBus<Pick<TStruct["msgBus"], SafeKey<TStruct["msgBus"], TStruct["msgScope"]["provide"]> | SafeKey<TStruct["msgBus"], TStruct["msgScope"]["subscribe"]> | SafeKey<TStruct["msgBus"], TStruct["msgScope"]["publish"]>>>;
|
|
121
|
+
readonly View: ComponentViewFn;
|
|
122
|
+
};
|
|
123
|
+
export type ComponentModel<TStruct extends ComponentStruct = ComponentStruct> = TStruct["props"] & TStruct["methods"] & ComponentModelChildren<TStruct["children"]> & ComponentModelBase<TStruct>;
|
|
124
|
+
type PropKey = string | symbol;
|
|
125
|
+
export type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> = ComponentPropParams<TStruct["props"]> & ComponentEvents<TStruct>;
|
|
126
|
+
export declare function useComponent<TStruct extends ComponentStruct = ComponentStruct>(component: Component<TStruct>, params: ComponentParams<TStruct>): ComponentModel<TStruct>;
|
|
127
|
+
export declare function getFC<TStruct extends ComponentStruct>(factory: (params: ComponentParams<TStruct>) => ComponentModel<TStruct>): FC<ComponentParams<TStruct>>;
|
|
128
|
+
export {};
|
|
129
|
+
//# sourceMappingURL=componentModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentModel.d.ts","sourceRoot":"","sources":["../../src/componentModel/componentModel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
var I = Object.defineProperty;
|
|
2
|
+
var L = (n, e, o) => e in n ? I(n, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : n[e] = o;
|
|
3
|
+
var P = (n, e, o) => L(n, typeof e != "symbol" ? e + "" : e, o);
|
|
4
|
+
import { jsx as G, Fragment as N } from "react/jsx-runtime";
|
|
5
|
+
import { useLayoutEffect as S, useEffect as D } from "react";
|
|
6
|
+
import { observer as F } from "mobx-react-lite";
|
|
7
|
+
import { observable as j, runInAction as A } from "mobx";
|
|
8
|
+
import { useLazyRef as M } from "../reactHooks.es.js";
|
|
9
|
+
const w = {
|
|
10
|
+
$isBinding: Symbol("$isBinding")
|
|
11
|
+
};
|
|
12
|
+
var E;
|
|
13
|
+
E = w.$isBinding;
|
|
14
|
+
class R {
|
|
15
|
+
constructor(e, o, r, d) {
|
|
16
|
+
// getter
|
|
17
|
+
P(this, "get");
|
|
18
|
+
// setter
|
|
19
|
+
P(this, "set");
|
|
20
|
+
P(this, "converter");
|
|
21
|
+
P(this, "validator");
|
|
22
|
+
P(this, "readOnly");
|
|
23
|
+
P(this, E);
|
|
24
|
+
this.get = e, this.set = o, this.converter = r, this.validator = d, this.readOnly = !!o, this[w.$isBinding] = !0;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function V(n) {
|
|
28
|
+
return n[w.$isBinding] === !0;
|
|
29
|
+
}
|
|
30
|
+
function X(n, e, o, r) {
|
|
31
|
+
return new R(n, e, o, r);
|
|
32
|
+
}
|
|
33
|
+
function Y(n, e) {
|
|
34
|
+
return new R(
|
|
35
|
+
() => n[e],
|
|
36
|
+
(o) => {
|
|
37
|
+
n[e] = o;
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
const _ = "onGet", z = "onChanging", H = "onChange";
|
|
42
|
+
function x(n, e, o) {
|
|
43
|
+
const r = o.onPropChanging, d = o.onPropChange;
|
|
44
|
+
return new Proxy(n, {
|
|
45
|
+
get(g, s, f) {
|
|
46
|
+
var c;
|
|
47
|
+
const y = (c = o[s]) == null ? void 0 : c.onGet;
|
|
48
|
+
if (y)
|
|
49
|
+
return y();
|
|
50
|
+
const v = e.get(String(s));
|
|
51
|
+
return v ? v.get() : Reflect.get(g, s, f);
|
|
52
|
+
},
|
|
53
|
+
set(g, s, f, y) {
|
|
54
|
+
var k, t;
|
|
55
|
+
const v = g[s], c = (k = o[s]) == null ? void 0 : k.onChanging;
|
|
56
|
+
if (c && !c(v, f) || r && !r(s, v, f))
|
|
57
|
+
return !0;
|
|
58
|
+
const O = A(() => Reflect.set(g, s, f, y)), b = e.get(s);
|
|
59
|
+
b != null && b.set && b.set(f);
|
|
60
|
+
const $ = (t = o[s]) == null ? void 0 : t.onChange;
|
|
61
|
+
return $ && $(f), d && d(s, f), O;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function B(n) {
|
|
66
|
+
return n.replace(/^./, n[0].toUpperCase());
|
|
67
|
+
}
|
|
68
|
+
function T(n, e) {
|
|
69
|
+
var b, $, k;
|
|
70
|
+
const o = n.msgBus, r = n.view, d = F((t) => typeof r == "function" ? r(t) : /* @__PURE__ */ G(N, { children: t.children }));
|
|
71
|
+
let g = {
|
|
72
|
+
...n.props,
|
|
73
|
+
...n.methods,
|
|
74
|
+
// view: component.view,
|
|
75
|
+
// View: ViewerFC,
|
|
76
|
+
View: d,
|
|
77
|
+
msgBus: o
|
|
78
|
+
};
|
|
79
|
+
if (n.children)
|
|
80
|
+
for (const [t, i] of Object.entries(n.children))
|
|
81
|
+
if (typeof i == "function") {
|
|
82
|
+
const l = (h) => {
|
|
83
|
+
const u = i(h);
|
|
84
|
+
return /* @__PURE__ */ G(u.View, {});
|
|
85
|
+
};
|
|
86
|
+
Reflect.set(g, B(t), l);
|
|
87
|
+
} else
|
|
88
|
+
Reflect.set(g, t, i);
|
|
89
|
+
if (n.msgBroker) {
|
|
90
|
+
const t = n.msgBroker.provide;
|
|
91
|
+
if (t)
|
|
92
|
+
for (const [l, h] of Object.entries(t))
|
|
93
|
+
for (const [u, C] of Object.entries(h))
|
|
94
|
+
o.provide({
|
|
95
|
+
...C,
|
|
96
|
+
channel: l,
|
|
97
|
+
group: u
|
|
98
|
+
});
|
|
99
|
+
const i = n.msgBroker.subscribe;
|
|
100
|
+
if (i)
|
|
101
|
+
for (const [l, h] of Object.entries(i))
|
|
102
|
+
for (const [u, C] of Object.entries(h))
|
|
103
|
+
o.on({
|
|
104
|
+
...C,
|
|
105
|
+
channel: l,
|
|
106
|
+
group: u
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const s = /* @__PURE__ */ new Map();
|
|
110
|
+
for (const [t, i] of Object.entries(e))
|
|
111
|
+
V(i) ? s.set(t, i) : Reflect.set(g, t, i);
|
|
112
|
+
const f = {};
|
|
113
|
+
if (n.props)
|
|
114
|
+
for (const t of Object.keys(n.props))
|
|
115
|
+
f[t] = j.ref;
|
|
116
|
+
if (n.methods)
|
|
117
|
+
for (const t of Object.keys(n.methods))
|
|
118
|
+
f[t] = !1;
|
|
119
|
+
f.View = !1, f.msgBus = !1;
|
|
120
|
+
const y = {
|
|
121
|
+
onPropChanging: e != null && e.onPropChanging || (b = n.events) != null && b.onPropChanging ? (t, i, l) => {
|
|
122
|
+
var C;
|
|
123
|
+
let h = !0, u = e.onPropChanging;
|
|
124
|
+
return u && (h = u(String(t), i, l)), h && (u = (C = n.events) == null ? void 0 : C.onPropChanging, u && (h = u(String(t), i, l))), h;
|
|
125
|
+
} : void 0,
|
|
126
|
+
onPropChange: e != null && e.onPropChange || ($ = n.events) != null && $.onPropChange ? (t, i) => {
|
|
127
|
+
var l, h, u;
|
|
128
|
+
(l = e.onPropChange) == null || l.call(e, String(t), i), (u = (h = n.events).onPropChange) == null || u.call(h, String(t), i);
|
|
129
|
+
} : void 0
|
|
130
|
+
};
|
|
131
|
+
function v(t) {
|
|
132
|
+
const i = `${_}${B(t)}`;
|
|
133
|
+
return e[i] || n.events[i];
|
|
134
|
+
}
|
|
135
|
+
function c(t) {
|
|
136
|
+
const i = `${z}${B(t)}`;
|
|
137
|
+
return (l, h) => {
|
|
138
|
+
let u = !0, C = e[i];
|
|
139
|
+
return C && (u = C(l, h)), u && (C = n.events[i], C && (u = C(l, h))), u;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function O(t) {
|
|
143
|
+
const i = `${H}${B(t)}`;
|
|
144
|
+
return (l) => {
|
|
145
|
+
var h, u, C;
|
|
146
|
+
(h = e[i]) == null || h.call(e, l), (C = (u = n.events)[i]) == null || C.call(u, l);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (n.props)
|
|
150
|
+
for (const t of Object.keys(n.props))
|
|
151
|
+
y[t] = {
|
|
152
|
+
onGet: v(t),
|
|
153
|
+
onChanging: c(t),
|
|
154
|
+
onChange: O(t)
|
|
155
|
+
};
|
|
156
|
+
return g = j(g, f), g = x(g, s, y), (k = n.events) != null && k.onInit && n.events.onInit(g), e != null && e.onInit && e.onInit(g), g;
|
|
157
|
+
}
|
|
158
|
+
function Z(n, e) {
|
|
159
|
+
const o = M(() => T(n, e)), r = o.current;
|
|
160
|
+
return S(() => {
|
|
161
|
+
var d, g, s, f, y, v;
|
|
162
|
+
try {
|
|
163
|
+
(g = (d = n.events) == null ? void 0 : d.onLayout) == null || g.call(d, r), (s = e == null ? void 0 : e.onLayout) == null || s.call(e, r);
|
|
164
|
+
} catch (c) {
|
|
165
|
+
(y = (f = n.events) == null ? void 0 : f.onError) == null || y.call(f, r, c), (v = e == null ? void 0 : e.onError) == null || v.call(e, r, c);
|
|
166
|
+
}
|
|
167
|
+
return () => {
|
|
168
|
+
var c, O, b;
|
|
169
|
+
(O = (c = n.events) == null ? void 0 : c.onLayoutDestroy) == null || O.call(c, r), (b = e == null ? void 0 : e.onLayoutDestroy) == null || b.call(e, r), o.current = null;
|
|
170
|
+
};
|
|
171
|
+
}, []), D(() => {
|
|
172
|
+
var d, g, s, f, y, v;
|
|
173
|
+
try {
|
|
174
|
+
(g = (d = n.events) == null ? void 0 : d.onReady) == null || g.call(d, r), (s = e == null ? void 0 : e.onReady) == null || s.call(e, r);
|
|
175
|
+
} catch (c) {
|
|
176
|
+
(y = (f = n.events) == null ? void 0 : f.onError) == null || y.call(f, r, c), (v = e == null ? void 0 : e.onError) == null || v.call(e, r, c);
|
|
177
|
+
}
|
|
178
|
+
return () => {
|
|
179
|
+
var c, O, b;
|
|
180
|
+
(O = (c = n.events) == null ? void 0 : c.onDestroy) == null || O.call(c, r), (b = e == null ? void 0 : e.onDestroy) == null || b.call(e, r);
|
|
181
|
+
};
|
|
182
|
+
}, []), o.current;
|
|
183
|
+
}
|
|
184
|
+
function m(n) {
|
|
185
|
+
return (o) => {
|
|
186
|
+
const r = n(o);
|
|
187
|
+
return /* @__PURE__ */ G(r.View, { ...o });
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export {
|
|
191
|
+
X as bind,
|
|
192
|
+
Y as bindProp,
|
|
193
|
+
m as getFC,
|
|
194
|
+
V as isBinding,
|
|
195
|
+
w as symbols,
|
|
196
|
+
Z as useComponent
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=componentModel.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentModel.es.js","sources":["../../src/componentModel/componentModel.tsx"],"sourcesContent":["import {\r\n AllHTMLAttributes,\r\n PropsWithChildren,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n FC,\r\n ReactNode,\r\n CSSProperties\r\n} from \"react\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { $CG_IN, $CG_OUT, MsgBus, MsgBusProviderParams, MsgBusStruct, MsgBusSubscriberParams } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { MaybePromise, SafeKey, Skip } from \"@actdim/utico/typeCore\";\r\nimport { observer } from \"mobx-react-lite\";\r\nimport { observable, observe, runInAction } from \"mobx\";\r\nimport { useLazyRef } from \"@/reactHooks\";\r\n\r\nexport type MsgBusChannelGroupProviderParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusProviderParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\nexport type MsgBusChannelGroupSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN // keyof TStruct[TChannel]\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, \"channel\" | \"group\">;\r\n\r\n// MsgBusScope\r\nexport type MsgBusBrokerScope<\r\n TStruct extends MsgBusStruct /*= MsgBusStruct*/,\r\n TKeysToProvide extends keyof TStruct = keyof TStruct,\r\n TKeysToSubscribe extends keyof TStruct = keyof TStruct,\r\n TKeysToPublish extends keyof TStruct = keyof TStruct\r\n> = {\r\n provide?: TKeysToProvide;\r\n // consume\r\n subscribe?: TKeysToSubscribe;\r\n // produce\r\n publish?: TKeysToPublish;\r\n};\r\n\r\nexport type ComponentPropStruct = Record<string, any>;\r\n// export type ComponentPropStruct = {\r\n// [prop: string]: any;\r\n// };\r\n\r\nexport type ComponentMethodStruct = Record<string, Function>;\r\n// export type ComponentMethodStruct = {\r\n// [action: string]: Function;\r\n// };\r\n\r\n// export type ComponentRefStruct = Record<string, ComponentStruct<TMsgBusStruct, T>>;\r\nexport type ComponentRefStruct = {\r\n [name: string]: ComponentStruct | ((params: any) => ComponentStruct);\r\n};\r\n\r\nexport type ComponentStructBase<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n TPropStruct extends ComponentPropStruct = ComponentPropStruct,\r\n TMsgScope extends MsgBusBrokerScope<TMsgBusStruct> = MsgBusBrokerScope<TMsgBusStruct>\r\n> = {\r\n props?: TPropStruct;\r\n methods?: ComponentMethodStruct;\r\n children?: ComponentRefStruct;\r\n msgScope?: TMsgScope;\r\n};\r\n\r\n// ComponentShape\r\nexport type ComponentStruct<\r\n TMsgBusStruct extends MsgBusStruct = MsgBusStruct,\r\n T extends ComponentStructBase<TMsgBusStruct> = ComponentStructBase<TMsgBusStruct>\r\n> = T & {\r\n msgBus: TMsgBusStruct;\r\n};\r\n\r\nexport type MsgBusBroker<TStructToProvide extends MsgBusStruct = MsgBusStruct, TStructToSubscribe extends MsgBusStruct = MsgBusStruct> = {\r\n // providers\r\n provide?: {\r\n [TChannel in keyof TStructToProvide]: {\r\n [TGroup in keyof Skip<TStructToProvide[TChannel], typeof $CG_OUT>]?: MsgBusChannelGroupProviderParams<\r\n TStructToProvide,\r\n TChannel,\r\n TGroup\r\n >;\r\n };\r\n };\r\n // subscribers\r\n subscribe?: {\r\n [TChannel in keyof TStructToSubscribe]: {\r\n [TGroup in keyof TStructToSubscribe[TChannel]]?: MsgBusChannelGroupSubscriberParams<TStructToSubscribe, TChannel, TGroup>;\r\n };\r\n };\r\n};\r\n\r\ntype ValueConverter<TTo, TFrom> = {\r\n // ConvertFrom\r\n convert(value: TFrom): TTo;\r\n // ConvertTo\r\n convertBack(value: TTo): TFrom;\r\n};\r\n\r\ntype ValidationResult = {\r\n valid: boolean;\r\n message: string;\r\n};\r\n\r\ntype Validator<T> = {\r\n options: {\r\n blur: boolean;\r\n };\r\n validate: (value: T) => MaybePromise<ValidationResult>;\r\n};\r\n\r\nexport const symbols = {\r\n $isBinding: Symbol(\"$isBinding\")\r\n};\r\n\r\nexport interface IBinding<T = any, TFrom = any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nclass Binding<T = any, TFrom = any> implements IBinding<any, any> {\r\n // getter\r\n readonly get: () => T;\r\n // setter\r\n readonly set: (value: T) => void;\r\n readonly converter: ValueConverter<T, TFrom>;\r\n readonly validator: Validator<T>;\r\n readonly readOnly: boolean;\r\n constructor(get: () => T, set?: (value: T) => void, converter?: ValueConverter<T, TFrom>, validator?: Validator<T>) {\r\n this.get = get;\r\n this.set = set;\r\n this.converter = converter;\r\n this.validator = validator;\r\n this.readOnly = !!set;\r\n this[symbols.$isBinding] = true;\r\n }\r\n [symbols.$isBinding]: boolean;\r\n}\r\n\r\nexport function isBinding(obj: any): obj is IBinding {\r\n return obj[symbols.$isBinding] === true;\r\n}\r\n\r\nexport function bind<T, TFrom = any>(\r\n get: () => T,\r\n set?: (value: T) => void,\r\n converter?: ValueConverter<T, TFrom>,\r\n validator?: Validator<T>\r\n) {\r\n return new Binding(get, set, converter, validator);\r\n}\r\n\r\nexport function bindProp<T extends object, P extends keyof T>(obj: T, prop: P) {\r\n return new Binding(\r\n () => obj[prop],\r\n (value: T[P]) => {\r\n obj[prop] = value;\r\n }\r\n );\r\n}\r\n\r\nexport type ComponentPropSource<T> = T | Binding<T>;\r\n\r\nexport type ComponentPropParams<TPropStruct extends ComponentPropStruct> = {\r\n [P in keyof TPropStruct]?: ComponentPropSource<TPropStruct[P]>;\r\n};\r\n\r\n// const $ON_PROP_CHANGING = \"onPropChanging\";\r\n// const $ON_PROP_CHANGE = \"onPropChange\";\r\n\r\nconst $ON_GET = \"onGet\";\r\n// const $ON_BEFORE_SET = \"onBeforeSet\";\r\nconst $ON_CHANGING = \"onChanging\";\r\nconst $ON_CHANGE = \"onChange\";\r\n// const $ON_SET = \"onSet\";\r\n\r\ntype PropValueChangingHandler<TProp = PropKey> = (prop: TProp, oldValue: any, newValue: any) => boolean;\r\ntype PropValueChangeHandler<TProp = PropKey> = (prop: TProp, value: any) => void;\r\n\r\n// BeforeValueSetHandler\r\ntype ValueChangingHandler<T = any> = (oldValue: T, newValue: T) => boolean;\r\n// ValueSetHandler\r\ntype ValueChangeHandler<T = any> = (value: T) => void;\r\n\r\ntype ComponentEvents<TStruct extends ComponentStruct = ComponentStruct> = {\r\n onPropChanging?: PropValueChangingHandler<keyof TStruct[\"props\"]>;\r\n onPropChange?: PropValueChangeHandler<keyof TStruct[\"props\"]>;\r\n onInit?: (model: ComponentModel<TStruct>) => void;\r\n onLayout?: (model: ComponentModel<TStruct>) => void;\r\n onReady?: (model: ComponentModel<TStruct>) => void;\r\n onLayoutDestroy?: (model: ComponentModel<TStruct>) => void; // onLayoutCleanup\r\n onDestroy?: (model: ComponentModel<TStruct>) => void; // onDispose/onCleanup\r\n onError?: (model: ComponentModel<TStruct>, error: any) => void;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_GET}${Capitalize<P & string>}`]?: () => TStruct[\"props\"][P];\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGING}${Capitalize<P & string>}`]?: ValueChangingHandler<TStruct[\"props\"]>;\r\n} & {\r\n [P in keyof TStruct[\"props\"] as `${typeof $ON_CHANGE}${Capitalize<P & string>}`]?: ValueChangeHandler<TStruct[\"props\"]>;\r\n};\r\n\r\n// AllHTMLAttributes<JSX.Element>\r\n\r\n// type ComponentViewerProps = {\r\n// render?: boolean;\r\n// view?: () => ReactNode;\r\n// } & PropsWithChildren;\r\n\r\ntype ComponentViewProps = {\r\n render?: boolean;\r\n} & PropsWithChildren;\r\n\r\ntype ComponentViewFn = (props?: ComponentViewProps) => ReactNode; // JSX.Element\r\n\r\ntype PublicKeys<T> = {\r\n [K in keyof T]: K extends `_${string}` ? never : K;\r\n}[keyof T];\r\n\r\nexport type Component<TStruct extends ComponentStruct> = {\r\n props?: TStruct[\"props\"];\r\n methods?: TStruct[\"methods\"];\r\n children?: ComponentChildren<TStruct[\"children\"]>;\r\n events?: ComponentEvents<TStruct>;\r\n // msgs?\r\n msgBroker?: MsgBusBroker<\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>>,\r\n Pick<TStruct[\"msgBus\"], SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>>\r\n >;\r\n msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n view?: ComponentViewFn;\r\n};\r\n\r\ntype ComponentChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct]: TRefStruct[P] extends (params: infer TParams) => infer T\r\n ? T extends ComponentStruct\r\n ? (params: TParams) => ComponentModel<T>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\ntype ComponentModelChildren<TRefStruct extends ComponentRefStruct> = {\r\n [P in keyof TRefStruct as TRefStruct[P] extends Function ? `${Capitalize<P & string>}` : P]: TRefStruct[P] extends (\r\n params: infer TParams\r\n ) => infer T\r\n ? T extends ComponentStruct\r\n ? FC<ComponentParams<T> & TParams>\r\n : never\r\n : TRefStruct[P] extends ComponentStruct\r\n ? ComponentModel<TRefStruct[P]>\r\n : never;\r\n};\r\n\r\nexport type ComponentModelBase<TStruct extends ComponentStruct = ComponentStruct> = {\r\n readonly msgBus?: MsgBus<\r\n // TStruct[\"msgBus\"]\r\n Pick<\r\n TStruct[\"msgBus\"],\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"provide\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"subscribe\"]>\r\n | SafeKey<TStruct[\"msgBus\"], TStruct[\"msgScope\"][\"publish\"]>\r\n >\r\n >;\r\n\r\n readonly View: ComponentViewFn;\r\n};\r\n\r\nexport type ComponentModel<TStruct extends ComponentStruct = ComponentStruct> = TStruct[\"props\"] &\r\n TStruct[\"methods\"] &\r\n ComponentModelChildren<TStruct[\"children\"]> &\r\n ComponentModelBase<TStruct>;\r\n\r\n// style: CSSProperties;\r\n\r\ntype PropEventHandlers = {\r\n onGet?: () => any;\r\n onChanging?: (oldValue: any, newValue: any) => boolean;\r\n onChange?: (value: any) => void;\r\n};\r\n\r\ntype PropKey = string | symbol;\r\ntype ProxyEventHandlers = {\r\n onPropChanging?: PropValueChangingHandler<PropKey>;\r\n onPropChange?: PropValueChangeHandler<PropKey>;\r\n} & Record<PropKey, PropEventHandlers>;\r\n\r\n// ComponentConfig\r\nexport type ComponentParams<TStruct extends ComponentStruct = ComponentStruct> = ComponentPropParams<TStruct[\"props\"]> &\r\n ComponentEvents<TStruct>; // & PropsWithChildren\r\n\r\nconst blankView = () => null;\r\n\r\nfunction createProxy(state: any, bindings: Map<PropKey, IBinding>, proxyEventHandlers: ProxyEventHandlers) {\r\n const onPropChanging = proxyEventHandlers.onPropChanging;\r\n const onPropChange = proxyEventHandlers.onPropChange;\r\n return new Proxy(state, {\r\n get(obj, prop, receiver) {\r\n const onGet = proxyEventHandlers[prop]?.onGet;\r\n if (onGet) {\r\n return onGet();\r\n }\r\n const binding = bindings.get(String(prop));\r\n if (binding) {\r\n return binding.get();\r\n }\r\n return Reflect.get(obj, prop, receiver);\r\n },\r\n set(obj, prop, value, receiver) {\r\n const oldValue = obj[prop];\r\n\r\n const onChanging = proxyEventHandlers[prop]?.onChanging;\r\n if (onChanging) {\r\n const shouldChange = onChanging(oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n if (onPropChanging) {\r\n const shouldChange = onPropChanging(prop, oldValue, value);\r\n if (!shouldChange) {\r\n return true;\r\n }\r\n }\r\n\r\n const result = runInAction(() => {\r\n return Reflect.set(obj, prop, value, receiver);\r\n });\r\n\r\n const binding = bindings.get(prop);\r\n\r\n if (binding?.set) {\r\n binding.set(value);\r\n }\r\n\r\n const onChange = proxyEventHandlers[prop]?.onChange;\r\n if (onChange) {\r\n onChange(value);\r\n }\r\n\r\n if (onPropChange) {\r\n onPropChange(prop, value);\r\n }\r\n\r\n return result;\r\n }\r\n });\r\n}\r\n\r\nfunction capitalize(name: string) {\r\n return name.replace(/^./, name[0].toUpperCase());\r\n}\r\n\r\nfunction asyncToGeneratorFlow(asyncFn: (...args: any[]) => Promise<any>) {\r\n return function* (...args: any[]) {\r\n const result = yield asyncFn(...args);\r\n return result;\r\n };\r\n}\r\n\r\n// const ViewerFC = observer((props: ComponentViewerProps) => {\r\n// if (typeof props.view === \"function\") {\r\n// return props.view();\r\n// }\r\n// return <>{props.children}</>;\r\n// });\r\n\r\nfunction createModel<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const msgBus = component.msgBus;\r\n const view = component.view;\r\n\r\n const ViewFC = observer((props: ComponentViewProps) => {\r\n if (typeof view === \"function\") {\r\n return view(props);\r\n }\r\n return <>{props.children}</>;\r\n });\r\n\r\n let model: ComponentModel<TStruct> = {\r\n ...component.props,\r\n ...component.methods,\r\n // view: component.view,\r\n // View: ViewerFC,\r\n View: ViewFC,\r\n msgBus: msgBus\r\n };\r\n if (component.children) {\r\n for (const [key, value] of Object.entries(component.children)) {\r\n if (typeof value == \"function\") {\r\n // observer\r\n const ChildViewFC: ComponentViewFn = (props) => {\r\n const model = value(props) as ComponentModel;\r\n return <model.View />;\r\n // if (typeof model.view === \"function\") {\r\n // return model.view(props);\r\n // }\r\n // return <>{props.children}</>;\r\n // return <ViewerFC view={model.view} />;\r\n };\r\n Reflect.set(model, capitalize(key), ChildViewFC);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n }\r\n if (component.msgBroker) {\r\n const providers = component.msgBroker.provide;\r\n if (providers) {\r\n for (const [channel, providerGroups] of Object.entries(providers)) {\r\n for (const [group, provider] of Object.entries(providerGroups)) {\r\n msgBus.provide({\r\n ...provider,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n const subscribers = component.msgBroker.subscribe;\r\n if (subscribers) {\r\n for (const [channel, subscriberGroups] of Object.entries(subscribers)) {\r\n for (const [group, subscriber] of Object.entries(subscriberGroups)) {\r\n msgBus.on({\r\n ...subscriber,\r\n channel: channel,\r\n group: group\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n const bindings = new Map<PropKey, IBinding>();\r\n // Reflect.ownKeys\r\n for (const [key, value] of Object.entries(params)) {\r\n if (isBinding(value)) {\r\n bindings.set(key, value);\r\n } else {\r\n Reflect.set(model, key, value);\r\n }\r\n }\r\n\r\n // decorators\r\n const annotationMap: Record<string, any> = {};\r\n\r\n if (component.props) {\r\n for (const key of Object.keys(component.props)) {\r\n annotationMap[key] = observable.ref;\r\n }\r\n }\r\n if (component.methods) {\r\n for (const key of Object.keys(component.methods)) {\r\n annotationMap[key] = false;\r\n }\r\n }\r\n\r\n annotationMap[\"View\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n annotationMap[\"msgBus\" satisfies keyof ComponentModelBase<TStruct>] = false;\r\n // annotationMap[\"view\" satisfies keyof Component<TStruct>] = false;\r\n\r\n const proxyEventHandlers: Pick<ProxyEventHandlers, \"onPropChanging\" | \"onPropChange\"> = {\r\n onPropChanging:\r\n params?.onPropChanging || component.events?.onPropChanging\r\n ? (prop, oldValue, newValue) => {\r\n let result = true;\r\n let handler = params.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events?.onPropChanging;\r\n if (handler) {\r\n result = handler(String(prop), oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }\r\n : undefined,\r\n onPropChange:\r\n params?.onPropChange || component.events?.onPropChange\r\n ? (prop, value) => {\r\n params.onPropChange?.(String(prop), value);\r\n component.events.onPropChange?.(String(prop), value);\r\n }\r\n : undefined\r\n };\r\n\r\n function resolveOnGetEventHandler(prop: string) {\r\n const key = `${$ON_GET}${capitalize(prop)}`;\r\n return params[key] || component.events[key];\r\n }\r\n\r\n function resolveOnChangingEventHandler(prop: string) {\r\n const key = `${$ON_CHANGING}${capitalize(prop)}`;\r\n return ((oldValue: any, newValue: any) => {\r\n let result = true;\r\n let handler = params[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n if (result) {\r\n handler = component.events[key] as ValueChangingHandler<any>;\r\n if (handler) {\r\n result = handler(oldValue, newValue);\r\n }\r\n }\r\n return result;\r\n }) as ValueChangingHandler;\r\n }\r\n\r\n function resolveOnChangeEventHandler(prop: string) {\r\n const key = `${$ON_CHANGE}${capitalize(prop)}`;\r\n return ((value: any) => {\r\n (params[key] as ValueChangeHandler<any>)?.(value);\r\n (component.events[key] as ValueChangeHandler<any>)?.(value);\r\n }) as ValueChangeHandler;\r\n }\r\n\r\n if (component.props) {\r\n for (const prop of Object.keys(component.props)) {\r\n proxyEventHandlers[prop] = {\r\n onGet: resolveOnGetEventHandler(prop),\r\n onChanging: resolveOnChangingEventHandler(prop),\r\n onChange: resolveOnChangeEventHandler(prop)\r\n };\r\n }\r\n }\r\n\r\n model = observable(model, annotationMap);\r\n\r\n model = createProxy(model, bindings, proxyEventHandlers);\r\n\r\n if (component.events?.onInit) {\r\n component.events.onInit(model);\r\n }\r\n\r\n if (params?.onInit) {\r\n params.onInit(model);\r\n }\r\n\r\n return model;\r\n}\r\n\r\nexport function useComponent<TStruct extends ComponentStruct = ComponentStruct>(\r\n component: Component<TStruct>,\r\n params: ComponentParams<TStruct>\r\n): ComponentModel<TStruct> {\r\n const ref = useLazyRef(() => createModel(component, params));\r\n const model = ref.current;\r\n\r\n useLayoutEffect(() => {\r\n try {\r\n component.events?.onLayout?.(model);\r\n params?.onLayout?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n\r\n return () => {\r\n component.events?.onLayoutDestroy?.(model);\r\n params?.onLayoutDestroy?.(model);\r\n // ref.current?.dispose();\r\n ref.current = null;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n try {\r\n component.events?.onReady?.(model);\r\n params?.onReady?.(model);\r\n } catch (err) {\r\n component.events?.onError?.(model, err);\r\n params?.onError?.(model, err);\r\n }\r\n return () => {\r\n component.events?.onDestroy?.(model);\r\n params?.onDestroy?.(model);\r\n };\r\n }, []);\r\n\r\n return ref.current;\r\n}\r\n\r\n// asFC/toFC\r\nexport function getFC<TStruct extends ComponentStruct>(\r\n factory: (params: ComponentParams<TStruct>) => ComponentModel<TStruct>\r\n): FC<ComponentParams<TStruct>> {\r\n // observer\r\n const fc = (params: ComponentParams<TStruct> & PropsWithChildren) => {\r\n // modelHook\r\n const model = factory(params); // without useRef!\r\n // return model.view();\r\n return <model.View {...params} />;\r\n // return <ViewerFC {...params} view={model.view} />;\r\n };\r\n return fc;\r\n}\r\n"],"names":["symbols","_a","Binding","get","set","converter","validator","__publicField","isBinding","obj","bind","bindProp","prop","value","$ON_GET","$ON_CHANGING","$ON_CHANGE","createProxy","state","bindings","proxyEventHandlers","onPropChanging","onPropChange","receiver","onGet","binding","oldValue","onChanging","result","runInAction","onChange","_b","capitalize","name","createModel","component","params","msgBus","view","ViewFC","observer","props","jsx","Fragment","model","key","ChildViewFC","providers","channel","providerGroups","group","provider","subscribers","subscriberGroups","subscriber","annotationMap","observable","newValue","handler","_c","resolveOnGetEventHandler","resolveOnChangingEventHandler","resolveOnChangeEventHandler","useComponent","ref","useLazyRef","useLayoutEffect","err","_e","_d","_f","useEffect","getFC","factory"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Lambda, IReactionPublic, IReactionOptions, IReactionDisposer, IObjectDidChange, IArraySplice, IMapDidChange, IAutorunOptions } from 'mobx';
|
|
2
|
+
import { IDisposer } from 'mobx-utils';
|
|
3
|
+
export type IObjectChange<T> = IObjectDidChange & {
|
|
4
|
+
name: keyof T;
|
|
5
|
+
object: T;
|
|
6
|
+
};
|
|
7
|
+
export interface IDisposable {
|
|
8
|
+
dispose: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class DisposableComponent implements IDisposable {
|
|
11
|
+
protected readonly finalizers: IDisposer[];
|
|
12
|
+
protected isDisposed: boolean;
|
|
13
|
+
handlers: Set<Promise<any>>;
|
|
14
|
+
constructor();
|
|
15
|
+
protected deepObserve<T = any>(target: T, listener: (change: IObjectDidChange | IArraySplice | IMapDidChange, path: string, root: T) => void): IDisposer;
|
|
16
|
+
protected autorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions): IReactionDisposer;
|
|
17
|
+
protected observe<T = Object>(object: T, listener: (change: IObjectChange<T>) => void, registerDisposer?: boolean): Lambda;
|
|
18
|
+
allHandlersAsync(): Promise<void>;
|
|
19
|
+
protected validateState(): void;
|
|
20
|
+
protected observeAsync<T = Object>(object: T, listener: (change: IObjectChange<T>) => Promise<any>, registerDisposer?: boolean, handlers?: Set<Promise<any>>): Lambda;
|
|
21
|
+
protected multiObserve(objects: Object[], listener: (change: IObjectDidChange) => void, fireImmediately?: boolean, registerDisposer?: (d: () => void) => void): Lambda[];
|
|
22
|
+
protected reaction<T>(expression: (r: IReactionPublic) => T, effect: (arg: T, prev: T, r: IReactionPublic) => void, opts?: IReactionOptions<T, boolean>): IReactionDisposer;
|
|
23
|
+
protected multiReaction<T>(expressions: ((r: IReactionPublic) => T)[], effect: (arg: T, prev: T, r: IReactionPublic) => void, opts?: IReactionOptions<T, boolean>, registerDisposer?: (d: () => void) => void): IReactionDisposer[];
|
|
24
|
+
protected registerFinalizers(...actions: (() => void)[]): void;
|
|
25
|
+
protected registerFinalizer(action: () => void): () => void;
|
|
26
|
+
protected registerDisposable(disposable: IDisposable): () => void;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare class DisposableModel extends DisposableComponent {
|
|
30
|
+
isBusy: boolean;
|
|
31
|
+
protected withBusyAsync<T>(asyncAction: () => Promise<T>): Promise<T>;
|
|
32
|
+
protected withBusy<T>(action: () => T): T;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/componentModel/scope.ts"],"names":[],"mappings":"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"}
|