@contember/bindx-react
Advanced tools
| import { type ReactNode } from 'react'; | ||
| import { GraphQlClient } from '@contember/graphql-client'; | ||
| import { type SchemaNames } from '@contember/client-content'; | ||
| import { SnapshotStore, UndoManager, type SchemaDefinition, type UndoManagerConfig, type UpdateMode } from '@contember/bindx'; | ||
| /** | ||
| * Runtime schema names format (from Contember API / generated code). | ||
| * Used by ContemberBindxProvider for backwards compatibility. | ||
| */ | ||
| export interface SchemaNames { | ||
| readonly entities: { | ||
| readonly [entityName: string]: { | ||
| readonly name: string; | ||
| readonly scalars: readonly string[]; | ||
| readonly fields: { | ||
| readonly [fieldName: string]: { | ||
| readonly type: 'column'; | ||
| readonly enumName?: string; | ||
| readonly columnType?: string; | ||
| } | { | ||
| readonly type: 'many' | 'one'; | ||
| readonly entity: string; | ||
| }; | ||
| }; | ||
| }; | ||
| }; | ||
| readonly enums?: { | ||
| readonly [enumName: string]: readonly string[]; | ||
| }; | ||
| } | ||
| /** | ||
| * Converts SchemaNames (Contember format) to SchemaDefinition (bindx format) | ||
@@ -36,33 +60,4 @@ * so that a SchemaRegistry can be created for standalone hooks. | ||
| * Provider component that combines Contember authentication with bindx data binding. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * import { ContemberBindxProvider, useUndo } from '@contember/bindx-react' | ||
| * import { schema } from './generated/schema' | ||
| * | ||
| * function App() { | ||
| * return ( | ||
| * <ContemberBindxProvider | ||
| * client={graphQlClient} | ||
| * schema={schema} | ||
| * undoManager={true} | ||
| * > | ||
| * <ArticleEditor id="123" /> | ||
| * </ContemberBindxProvider> | ||
| * ) | ||
| * } | ||
| * | ||
| * // Access undo/redo in child components | ||
| * function UndoControls() { | ||
| * const { canUndo, canRedo, undo, redo } = useUndo() | ||
| * return ( | ||
| * <div> | ||
| * <button onClick={undo} disabled={!canUndo}>Undo</button> | ||
| * <button onClick={redo} disabled={!canRedo}>Redo</button> | ||
| * </div> | ||
| * ) | ||
| * } | ||
| * ``` | ||
| */ | ||
| export declare const ContemberBindxProvider: import("react").NamedExoticComponent<ContemberBindxProviderProps>; | ||
| //# sourceMappingURL=ContemberBindxProvider.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ContemberBindxProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/ContemberBindxProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAoB,aAAa,EAAuF,WAAW,EAAkB,KAAK,gBAAgB,EAAiB,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAInQ;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwBnG;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAA;IACnB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,eAAe;IACf,QAAQ,EAAE,SAAS,CAAA;IAEnB,MAAM,EAAE,aAAa,CAAA;IAErB,gHAAgH;IAChH,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAA;IACnC,sFAAsF;IACtF,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAA;IAC9B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,sBAAsB,mEA6DjC,CAAA"} | ||
| {"version":3,"file":"ContemberBindxProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/ContemberBindxProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,OAAO,EAAoB,aAAa,EAAuF,WAAW,EAAkB,KAAK,gBAAgB,EAAiB,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAInQ;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG;YAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;YACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;YACnC,QAAQ,CAAC,MAAM,EAAE;gBAChB,QAAQ,EAAE,SAAS,EAAE,MAAM,GACxB;oBAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;oBAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;iBAAE,GACrF;oBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;oBAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;iBAAE,CAAA;aAC7D,CAAA;SACD,CAAA;KACD,CAAA;IACD,QAAQ,CAAC,KAAK,CAAC,EAAE;QAChB,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;KAC9C,CAAA;CACD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwBnG;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC3C,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAA;IACnB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,eAAe;IACf,QAAQ,EAAE,SAAS,CAAA;IAEnB,MAAM,EAAE,aAAa,CAAA;IAErB,gHAAgH;IAChH,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAA;IACnC,sFAAsF;IACtF,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,UAAU,CAAA;IAC9B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,mEA+DjC,CAAA"} |
| export { BindxProvider, useBackendAdapter, useSnapshotStore, useDispatcher, useBatchPersister, useBindxContext, useSchemaRegistry, type BindxProviderProps, type BindxContextValue, } from './BackendAdapterContext.js'; | ||
| export { usePersist, usePersistEntity, type PersistApi, type EntityPersistApi, type AnyRefWithMeta, } from './usePersist.js'; | ||
| export { useEntity, type UseEntityOptions, type LoadingEntityAccessor, type ErrorEntityAccessor, type NotFoundEntityAccessor, type ReadyEntityAccessor, type EntityAccessorResult, } from './useEntity.js'; | ||
| export { useEntityList, type UseEntityListOptions, type LoadingEntityListAccessor, type ErrorEntityListAccessor, type ReadyEntityListAccessor, type EntityListAccessorResult, } from './useEntityList.js'; | ||
| export { useEntity, type UseEntityOptions, type LoadingEntityResult, type ErrorEntityResult, type NotFoundEntityResult, type ReadyEntityResult, type UseEntityResult, } from './useEntity.js'; | ||
| export { useEntityList, type UseEntityListOptions, type LoadingEntityListResult, type ErrorEntityListResult, type ReadyEntityListResult, type UseEntityListResult, } from './useEntityList.js'; | ||
| export { ContemberBindxProvider, schemaNamesToDef, } from './ContemberBindxProvider.js'; | ||
@@ -6,0 +6,0 @@ export { useUndo, type UndoHookResult } from './useUndo.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACtB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACnB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACN,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GACzB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC7B,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACN,sBAAsB,EACtB,gBAAgB,GAChB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,OAAO,EACN,eAAe,EACf,KAAK,iBAAiB,GACtB,MAAM,gBAAgB,CAAA"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACtB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACnB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACN,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACpB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACxB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EACN,sBAAsB,EACtB,gBAAgB,GAChB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,OAAO,EACN,eAAe,EACf,KAAK,iBAAiB,GACtB,MAAM,gBAAgB,CAAA"} |
@@ -1,2 +0,2 @@ | ||
| import type { EntityDef, EntityUniqueWhere, SelectionInput, SelectionMeta, FieldError, SelectedEntityFields, CommonEntity, EntityForRoles, RoleNames } from '@contember/bindx'; | ||
| import type { EntityDef, EntityUniqueWhere, SelectionInput, SelectionMeta, FieldError, CommonEntity, EntityForRoles, RoleNames, EntityAccessor } from '@contember/bindx'; | ||
| /** | ||
@@ -20,88 +20,56 @@ * Options for useEntity hook | ||
| /** | ||
| * Loading state for entity accessor | ||
| * Common properties on every UseEntityResult state. | ||
| * All prefixed with $ to avoid collision with entity field names. | ||
| */ | ||
| export interface LoadingEntityAccessor { | ||
| readonly status: 'loading'; | ||
| readonly isLoading: true; | ||
| readonly isError: false; | ||
| readonly isNotFound: false; | ||
| readonly isPersisting: false; | ||
| readonly isDirty: false; | ||
| readonly id: string; | ||
| readonly fields: never; | ||
| readonly data: never; | ||
| persist(): Promise<void>; | ||
| reset(): void; | ||
| interface UseEntityResultBase { | ||
| $persist(): Promise<void>; | ||
| $reset(): void; | ||
| } | ||
| /** | ||
| * Error state for entity accessor | ||
| */ | ||
| export interface ErrorEntityAccessor { | ||
| readonly status: 'error'; | ||
| readonly isLoading: false; | ||
| readonly isError: true; | ||
| readonly isNotFound: false; | ||
| readonly error: FieldError; | ||
| readonly isPersisting: false; | ||
| readonly isDirty: false; | ||
| export type LoadingEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'loading'; | ||
| readonly $isLoading: true; | ||
| readonly $isError: false; | ||
| readonly $isNotFound: false; | ||
| readonly $error: null; | ||
| readonly id: string; | ||
| readonly fields: never; | ||
| readonly data: never; | ||
| persist(): Promise<void>; | ||
| reset(): void; | ||
| } | ||
| /** | ||
| * Not found state for entity accessor | ||
| */ | ||
| export interface NotFoundEntityAccessor { | ||
| readonly status: 'not_found'; | ||
| readonly isLoading: false; | ||
| readonly isError: false; | ||
| readonly isNotFound: true; | ||
| readonly isPersisting: false; | ||
| readonly isDirty: false; | ||
| }; | ||
| export type ErrorEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'error'; | ||
| readonly $isLoading: false; | ||
| readonly $isError: true; | ||
| readonly $isNotFound: false; | ||
| readonly $error: FieldError; | ||
| readonly id: string; | ||
| readonly fields: never; | ||
| readonly data: never; | ||
| persist(): Promise<void>; | ||
| reset(): void; | ||
| } | ||
| /** | ||
| * Ready state base interface for entity accessor | ||
| */ | ||
| export interface ReadyEntityAccessorBase<TEntity extends object, TSelected extends object = TEntity> { | ||
| readonly status: 'ready'; | ||
| readonly isLoading: false; | ||
| readonly isError: false; | ||
| readonly isNotFound: false; | ||
| readonly isPersisting: boolean; | ||
| readonly isDirty: boolean; | ||
| }; | ||
| export type NotFoundEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'not_found'; | ||
| readonly $isLoading: false; | ||
| readonly $isError: false; | ||
| readonly $isNotFound: true; | ||
| readonly $error: null; | ||
| readonly id: string; | ||
| readonly fields: SelectedEntityFields<TEntity, TSelected>; | ||
| readonly data: TSelected; | ||
| persist(): Promise<void>; | ||
| reset(): void; | ||
| } | ||
| }; | ||
| /** | ||
| * Ready state for entity accessor with direct field access via Proxy. | ||
| * Ready state — full EntityAccessor with status metadata. | ||
| */ | ||
| export type ReadyEntityAccessor<TEntity extends object, TSelected extends object = TEntity> = ReadyEntityAccessorBase<TEntity, TSelected> & SelectedEntityFields<TEntity, TSelected>; | ||
| export type ReadyEntityResult<TEntity extends object, TSelected extends object = TEntity> = UseEntityResultBase & EntityAccessor<TEntity, TSelected> & { | ||
| readonly $status: 'ready'; | ||
| readonly $isLoading: false; | ||
| readonly $isError: false; | ||
| readonly $isNotFound: false; | ||
| readonly $error: null; | ||
| }; | ||
| /** | ||
| * Union of all entity accessor states | ||
| * Union of all useEntity return states. | ||
| * Discriminated on $status. | ||
| */ | ||
| export type EntityAccessorResult<TEntity extends object, TSelected extends object = TEntity> = LoadingEntityAccessor | ErrorEntityAccessor | NotFoundEntityAccessor | ReadyEntityAccessor<TEntity, TSelected>; | ||
| export type UseEntityResult<TEntity extends object, TSelected extends object = TEntity> = LoadingEntityResult | ErrorEntityResult | NotFoundEntityResult | ReadyEntityResult<TEntity, TSelected>; | ||
| /** | ||
| * Hook to fetch and manage a single entity with role-expanded type inference. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const article = useEntity(schema.Article, { by: { id }, roles: ['admin'] }, e => e.title().internalNotes()) | ||
| * ``` | ||
| */ | ||
| export declare function useEntity<TRoleMap extends Record<string, object>, TRoles extends RoleNames<TRoleMap>, TResult extends object>(entity: EntityDef<TRoleMap>, options: UseEntityOptions & { | ||
| roles: readonly TRoles[]; | ||
| }, definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>): EntityAccessorResult<EntityForRoles<TRoleMap, TRoles>, TResult>; | ||
| }, definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>): UseEntityResult<EntityForRoles<TRoleMap, TRoles>, TResult>; | ||
| /** | ||
| * Hook to fetch and manage a single entity with full type inference. | ||
| * Uses the common (narrowest) entity type when no roles are specified. | ||
| * | ||
@@ -111,10 +79,9 @@ * @example | ||
| * const article = useEntity(schema.Article, { by: { id } }, e => e.title().content()) | ||
| * if (article.status !== 'ready') return <Loading /> | ||
| * if (article.$status !== 'ready') return <Loading /> | ||
| * return <input value={article.title.value} onChange={...} /> | ||
| * ``` | ||
| */ | ||
| export declare function useEntity<TRoleMap extends Record<string, object>, TResult extends object>(entity: EntityDef<TRoleMap>, options: UseEntityOptions, definer: SelectionInput<CommonEntity<TRoleMap>, TResult>): EntityAccessorResult<CommonEntity<TRoleMap>, TResult>; | ||
| export declare function useEntity<TRoleMap extends Record<string, object>, TResult extends object>(entity: EntityDef<TRoleMap>, options: UseEntityOptions, definer: SelectionInput<CommonEntity<TRoleMap>, TResult>): UseEntityResult<CommonEntity<TRoleMap>, TResult>; | ||
| /** | ||
| * Hook to fetch and manage a single entity with pre-resolved selection. | ||
| * | ||
| * Used internally by Entity component that collects selection from JSX. | ||
@@ -124,3 +91,4 @@ */ | ||
| selection: SelectionMeta; | ||
| }): EntityAccessorResult<object, object>; | ||
| }): UseEntityResult<object, object>; | ||
| export {}; | ||
| //# sourceMappingURL=useEntity.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useEntity.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntity.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"useEntity.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntity.ts"],"names":[],"mappings":"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"} |
@@ -23,50 +23,30 @@ import type { EntityDef, EntityAccessor, SelectionInput, SelectionMeta, FieldError, CommonEntity, EntityForRoles, RoleNames } from '@contember/bindx'; | ||
| } | ||
| /** | ||
| * Loading state for entity list accessor | ||
| */ | ||
| export interface LoadingEntityListAccessor { | ||
| readonly status: 'loading'; | ||
| readonly isLoading: true; | ||
| readonly isError: false; | ||
| readonly isDirty: false; | ||
| readonly items: never; | ||
| readonly length: 0; | ||
| add(data?: unknown): string; | ||
| remove(key: string): void; | ||
| move(fromIndex: number, toIndex: number): void; | ||
| interface EntityListResultBase { | ||
| $add(data?: unknown): string; | ||
| $remove(key: string): void; | ||
| $move(fromIndex: number, toIndex: number): void; | ||
| } | ||
| /** | ||
| * Error state for entity list accessor | ||
| */ | ||
| export interface ErrorEntityListAccessor { | ||
| readonly status: 'error'; | ||
| readonly isLoading: false; | ||
| readonly isError: true; | ||
| readonly error: FieldError; | ||
| readonly isDirty: false; | ||
| readonly items: never; | ||
| readonly length: 0; | ||
| add(data?: unknown): string; | ||
| remove(key: string): void; | ||
| move(fromIndex: number, toIndex: number): void; | ||
| } | ||
| /** | ||
| * Ready state for entity list accessor | ||
| */ | ||
| export interface ReadyEntityListAccessor<T extends object> { | ||
| readonly status: 'ready'; | ||
| readonly isLoading: false; | ||
| readonly isError: false; | ||
| readonly isDirty: boolean; | ||
| export type LoadingEntityListResult = EntityListResultBase & { | ||
| readonly $status: 'loading'; | ||
| readonly $isLoading: true; | ||
| readonly $isError: false; | ||
| readonly $error: null; | ||
| }; | ||
| export type ErrorEntityListResult = EntityListResultBase & { | ||
| readonly $status: 'error'; | ||
| readonly $isLoading: false; | ||
| readonly $isError: true; | ||
| readonly $error: FieldError; | ||
| }; | ||
| export type ReadyEntityListResult<T extends object> = EntityListResultBase & { | ||
| readonly $status: 'ready'; | ||
| readonly $isLoading: false; | ||
| readonly $isError: false; | ||
| readonly $error: null; | ||
| readonly $isDirty: boolean; | ||
| readonly items: Array<EntityAccessor<T>>; | ||
| readonly length: number; | ||
| add(data?: Partial<T>): string; | ||
| remove(key: string): void; | ||
| move(fromIndex: number, toIndex: number): void; | ||
| } | ||
| }; | ||
| export type UseEntityListResult<T extends object> = LoadingEntityListResult | ErrorEntityListResult | ReadyEntityListResult<T>; | ||
| /** | ||
| * Union of all entity list accessor states | ||
| */ | ||
| export type EntityListAccessorResult<T extends object> = LoadingEntityListAccessor | ErrorEntityListAccessor | ReadyEntityListAccessor<T>; | ||
| /** | ||
| * Hook to fetch and manage a list of entities with role-expanded type inference. | ||
@@ -81,3 +61,3 @@ * | ||
| roles: readonly TRoles[]; | ||
| }, definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>): EntityListAccessorResult<TResult>; | ||
| }, definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>): UseEntityListResult<TResult>; | ||
| /** | ||
@@ -94,3 +74,3 @@ * Hook to fetch and manage a list of entities with full type inference. | ||
| */ | ||
| export declare function useEntityList<TRoleMap extends Record<string, object>, TResult extends object>(entity: EntityDef<TRoleMap>, options: UseEntityListOptions, definer: SelectionInput<CommonEntity<TRoleMap>, TResult>): EntityListAccessorResult<TResult>; | ||
| export declare function useEntityList<TRoleMap extends Record<string, object>, TResult extends object>(entity: EntityDef<TRoleMap>, options: UseEntityListOptions, definer: SelectionInput<CommonEntity<TRoleMap>, TResult>): UseEntityListResult<TResult>; | ||
| /** | ||
@@ -104,3 +84,4 @@ * Hook to fetch and manage a list of entities with pre-resolved selection. | ||
| selection: SelectionMeta; | ||
| }): EntityListAccessorResult<object>; | ||
| }): UseEntityListResult<object>; | ||
| export {}; | ||
| //# sourceMappingURL=useEntityList.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useEntityList.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityList.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"useEntityList.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityList.ts"],"names":[],"mappings":"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"} |
+1
-1
@@ -8,3 +8,3 @@ /** | ||
| export { scalar, hasOne, hasMany, defineSchema, entityDef, roleEntityDef, DEFAULT_ROLE, SchemaRegistry, createFragment, buildQueryFromSelection, EntityHandle, HasOneHandle, HasManyListHandle, FieldHandle, FIELD_REF_META, MockAdapter, ContemberAdapter, createEntityLoader, resolveSelectionMeta, buildQuery, SnapshotStore, ActionDispatcher, isTempId, isPlaceholderId, isPersistedId, generatePlaceholderId, BatchPersister, ChangeRegistry, UndoManager, EventEmitter, __internal, } from '@contember/bindx'; | ||
| export type { BindxProviderProps, BindxContextValue, UseEntityOptions, UseEntityListOptions, LoadingEntityAccessor, ErrorEntityAccessor, NotFoundEntityAccessor, ReadyEntityAccessor, EntityAccessorResult, LoadingEntityListAccessor, ErrorEntityListAccessor, ReadyEntityListAccessor, EntityListAccessorResult, PersistApi, EntityPersistApi, AnyRefWithMeta, } from './hooks/index.js'; | ||
| export type { BindxProviderProps, BindxContextValue, UseEntityOptions, UseEntityListOptions, LoadingEntityResult, ErrorEntityResult, NotFoundEntityResult, ReadyEntityResult, UseEntityResult, LoadingEntityListResult, ErrorEntityListResult, ReadyEntityListResult, UseEntityListResult, PersistApi, EntityPersistApi, AnyRefWithMeta, } from './hooks/index.js'; | ||
| export type { DirtyEntity, PersistScope, AllScope, EntityScope as EntityPersistScope, FieldsScope, RelationScope, CustomScope, EntityPersistResult, PersistenceResult, BatchPersistOptions, } from '@contember/bindx'; | ||
@@ -11,0 +11,0 @@ export type { EntityAccessor, FieldRefBase, FieldProps, HasManyProps, HasOneProps, IfProps, EntityComponentProps, HasManyComponentOptions, ShowProps, SelectionPropMeta, SelectionProvider, EntityPropKeys, EntityFromProp, SelectionFromProp, ImplicitFragmentProperties, BindxComponentBase, BindxComponent, ComponentBuilder, ComponentBuilderState, CreateComponentOptions, InterfaceEntityPropConfig, ImplicitInterfaceEntityConfig, ExplicitInterfaceEntityConfig, AddInterfaces, InterfaceSelectorsMap, AnyEntityPropConfig, EntityPropConfig, ImplicitEntityConfig, ExplicitEntityConfig, AddImplicitEntity, AddExplicitEntity, AddImplicitInterfaceEntity, AddExplicitInterfaceEntity, SetScalarProps, BuildEntityProps, BuildProps, BuildFragmentProps, InitialBuilderState, } from './jsx/index.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"collectorProxy.d.ts","sourceRoot":"","sources":["../../src/jsx/collectorProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAyB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAEN,KAAK,cAAc,EAOnB,MAAM,YAAY,CAAA;AAQnB;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACrC,KAAK,EAAE,cAAc,EACrB,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,cAAc,GAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAW,GAClE,cAAc,CAAC,CAAC,CAAC,CA0CnB"} | ||
| {"version":3,"file":"collectorProxy.d.ts","sourceRoot":"","sources":["../../src/jsx/collectorProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAyB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAEN,KAAK,cAAc,EAOnB,MAAM,YAAY,CAAA;AAQnB;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACrC,KAAK,EAAE,cAAc,EACrB,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,cAAc,GAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAW,GAClE,cAAc,CAAC,CAAC,CAAC,CA2CnB"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Entity.d.ts","sourceRoot":"","sources":["../../../src/jsx/components/Entity.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAuE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAIrH,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAiB,KAAK,UAAU,EAAgF,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAI1M;;;GAGG;AACH,UAAU,eAAe,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAChE,kCAAkC;IAClC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IAC7E,qBAAqB;IACrB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAA;CAC9C;AAED;;GAEG;AACH,UAAU,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAE,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACjG,sFAAsF;IACtF,EAAE,EAAE,iBAAiB,CAAA;IACrB,MAAM,CAAC,EAAE,KAAK,CAAA;IACd,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,uBAAuB;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;GAEG;AACH,UAAU,iBAAiB,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAE,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACrG,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,8DAA8D;IAC9D,MAAM,EAAE,IAAI,CAAA;IACZ,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,KAAK,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IACrF,aAAa,CAAC,QAAQ,CAAC,GACvB,iBAAiB,CAAC,QAAQ,CAAC,CAAA;AAuO9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,iBAAS,UAAU,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1D,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,GAC1B,YAAY,GAAG,IAAI,CA0BrB;AAGD,eAAO,MAAM,MAAM,EAAkC,OAAO,UAAU,CAAA"} | ||
| {"version":3,"file":"Entity.d.ts","sourceRoot":"","sources":["../../../src/jsx/components/Entity.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAuE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAIrH,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAiB,KAAK,UAAU,EAAgF,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAI1M;;;GAGG;AACH,UAAU,eAAe,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAChE,kCAAkC;IAClC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC3B,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAA;IAC7E,qBAAqB;IACrB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAA;CAC9C;AAED;;GAEG;AACH,UAAU,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAE,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACjG,sFAAsF;IACtF,EAAE,EAAE,iBAAiB,CAAA;IACrB,MAAM,CAAC,EAAE,KAAK,CAAA;IACd,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,uBAAuB;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;GAEG;AACH,UAAU,iBAAiB,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAE,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACrG,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,8DAA8D;IAC9D,MAAM,EAAE,IAAI,CAAA;IACZ,wEAAwE;IACxE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,KAAK,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IACrF,aAAa,CAAC,QAAQ,CAAC,GACvB,iBAAiB,CAAC,QAAQ,CAAC,CAAA;AA6O9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,iBAAS,UAAU,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1D,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,GAC1B,YAAY,GAAG,IAAI,CA0BrB;AAGD,eAAO,MAAM,MAAM,EAAkC,OAAO,UAAU,CAAA"} |
+4
-4
| { | ||
| "name": "@contember/bindx-react", | ||
| "version": "0.1.5", | ||
| "version": "0.1.10", | ||
| "description": "Type-safe React data binding framework", | ||
@@ -18,5 +18,5 @@ "type": "module", | ||
| "dependencies": { | ||
| "@contember/bindx": "0.1.5", | ||
| "@contember/client-content": "^2.1.0-alpha.30", | ||
| "@contember/graphql-client": "^2.1.0-alpha.30", | ||
| "@contember/bindx": "0.1.10", | ||
| "@contember/bindx-client": "0.1.10", | ||
| "@contember/graphql-client": "^2.1.0-beta.1", | ||
| "@radix-ui/primitive": "^1.1.3", | ||
@@ -23,0 +23,0 @@ "@radix-ui/react-slot": "^1.2.4" |
| import { memo, useMemo, type ReactNode } from 'react' | ||
| import { GraphQlClient } from '@contember/graphql-client' | ||
| import { ContentClient, ContentQueryBuilder, type SchemaNames } from '@contember/client-content' | ||
| import { ContentClient } from '@contember/bindx-client' | ||
| import { ContemberAdapter, SnapshotStore, ActionDispatcher, BatchPersister, MutationCollector, ContemberSchemaMutationAdapter, UndoManager, SchemaRegistry, type SchemaDefinition, type FieldDef, type UndoManagerConfig, type UpdateMode } from '@contember/bindx' | ||
@@ -9,2 +9,23 @@ import { BindxContext, type BindxContextValue } from './BackendAdapterContext.js' | ||
| /** | ||
| * Runtime schema names format (from Contember API / generated code). | ||
| * Used by ContemberBindxProvider for backwards compatibility. | ||
| */ | ||
| export interface SchemaNames { | ||
| readonly entities: { | ||
| readonly [entityName: string]: { | ||
| readonly name: string | ||
| readonly scalars: readonly string[] | ||
| readonly fields: { | ||
| readonly [fieldName: string]: | ||
| | { readonly type: 'column'; readonly enumName?: string; readonly columnType?: string } | ||
| | { readonly type: 'many' | 'one'; readonly entity: string } | ||
| } | ||
| } | ||
| } | ||
| readonly enums?: { | ||
| readonly [enumName: string]: readonly string[] | ||
| } | ||
| } | ||
| /** | ||
| * Converts SchemaNames (Contember format) to SchemaDefinition (bindx format) | ||
@@ -14,3 +35,3 @@ * so that a SchemaRegistry can be created for standalone hooks. | ||
| export function schemaNamesToDef(schemaNames: SchemaNames): SchemaDefinition<Record<string, object>> { | ||
| const enumsMap = (schemaNames as { enums?: Record<string, readonly string[]> }).enums ?? {} | ||
| const enumsMap = schemaNames.enums ?? {} | ||
| const entities: Record<string, { fields: Record<string, FieldDef> }> = {} | ||
@@ -21,4 +42,4 @@ for (const [entityName, entity] of Object.entries(schemaNames.entities)) { | ||
| if (fieldDef.type === 'column') { | ||
| const enumName = (fieldDef as { enumName?: string }).enumName | ||
| const columnType = (fieldDef as { columnType?: string }).columnType | ||
| const enumName = fieldDef.enumName | ||
| const columnType = fieldDef.columnType | ||
| const enumValues = enumName ? enumsMap[enumName] : undefined | ||
@@ -70,31 +91,2 @@ if (enumName && enumValues) { | ||
| * Provider component that combines Contember authentication with bindx data binding. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * import { ContemberBindxProvider, useUndo } from '@contember/bindx-react' | ||
| * import { schema } from './generated/schema' | ||
| * | ||
| * function App() { | ||
| * return ( | ||
| * <ContemberBindxProvider | ||
| * client={graphQlClient} | ||
| * schema={schema} | ||
| * undoManager={true} | ||
| * > | ||
| * <ArticleEditor id="123" /> | ||
| * </ContemberBindxProvider> | ||
| * ) | ||
| * } | ||
| * | ||
| * // Access undo/redo in child components | ||
| * function UndoControls() { | ||
| * const { canUndo, canRedo, undo, redo } = useUndo() | ||
| * return ( | ||
| * <div> | ||
| * <button onClick={undo} disabled={!canUndo}>Undo</button> | ||
| * <button onClick={redo} disabled={!canRedo}>Redo</button> | ||
| * </div> | ||
| * ) | ||
| * } | ||
| * ``` | ||
| */ | ||
@@ -115,3 +107,8 @@ export const ContemberBindxProvider = memo(function ContemberBindxProvider({ | ||
| const adapter = new ContemberAdapter(new ContentClient(graphQlClient), new ContentQueryBuilder(schema)) | ||
| // Create schema registry from SchemaNames for standalone hooks | ||
| const schemaRegistry = new SchemaRegistry(schemaNamesToDef(schema)) | ||
| // Create adapter using new bindx-client ContentClient | ||
| const contentClient = new ContentClient(graphQlClient) | ||
| const adapter = new ContemberAdapter(contentClient, schemaRegistry) | ||
| const batcher = new QueryBatcher(adapter) | ||
@@ -132,5 +129,2 @@ | ||
| // Create schema registry from SchemaNames for standalone hooks | ||
| const schemaRegistry = new SchemaRegistry(schemaNamesToDef(schema)) | ||
| // Create mutation collector for proper nested operations | ||
@@ -137,0 +131,0 @@ // Use ContemberSchemaMutationAdapter to wrap SchemaNames |
@@ -24,7 +24,7 @@ export { | ||
| type UseEntityOptions, | ||
| type LoadingEntityAccessor, | ||
| type ErrorEntityAccessor, | ||
| type NotFoundEntityAccessor, | ||
| type ReadyEntityAccessor, | ||
| type EntityAccessorResult, | ||
| type LoadingEntityResult, | ||
| type ErrorEntityResult, | ||
| type NotFoundEntityResult, | ||
| type ReadyEntityResult, | ||
| type UseEntityResult, | ||
| } from './useEntity.js' | ||
@@ -35,6 +35,6 @@ | ||
| type UseEntityListOptions, | ||
| type LoadingEntityListAccessor, | ||
| type ErrorEntityListAccessor, | ||
| type ReadyEntityListAccessor, | ||
| type EntityListAccessorResult, | ||
| type LoadingEntityListResult, | ||
| type ErrorEntityListResult, | ||
| type ReadyEntityListResult, | ||
| type UseEntityListResult, | ||
| } from './useEntityList.js' | ||
@@ -41,0 +41,0 @@ |
+105
-216
@@ -15,2 +15,3 @@ import { useRef, useEffect, useMemo, useCallback } from 'react' | ||
| RoleNames, | ||
| EntityAccessor, | ||
| } from '@contember/bindx' | ||
@@ -55,163 +56,60 @@ import { | ||
| /** | ||
| * Loading state for entity accessor | ||
| * Common properties on every UseEntityResult state. | ||
| * All prefixed with $ to avoid collision with entity field names. | ||
| */ | ||
| export interface LoadingEntityAccessor { | ||
| readonly status: 'loading' | ||
| readonly isLoading: true | ||
| readonly isError: false | ||
| readonly isNotFound: false | ||
| readonly isPersisting: false | ||
| readonly isDirty: false | ||
| readonly id: string | ||
| readonly fields: never | ||
| readonly data: never | ||
| persist(): Promise<void> | ||
| reset(): void | ||
| interface UseEntityResultBase { | ||
| $persist(): Promise<void> | ||
| $reset(): void | ||
| } | ||
| /** | ||
| * Error state for entity accessor | ||
| */ | ||
| export interface ErrorEntityAccessor { | ||
| readonly status: 'error' | ||
| readonly isLoading: false | ||
| readonly isError: true | ||
| readonly isNotFound: false | ||
| readonly error: FieldError | ||
| readonly isPersisting: false | ||
| readonly isDirty: false | ||
| export type LoadingEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'loading' | ||
| readonly $isLoading: true | ||
| readonly $isError: false | ||
| readonly $isNotFound: false | ||
| readonly $error: null | ||
| readonly id: string | ||
| readonly fields: never | ||
| readonly data: never | ||
| persist(): Promise<void> | ||
| reset(): void | ||
| } | ||
| /** | ||
| * Not found state for entity accessor | ||
| */ | ||
| export interface NotFoundEntityAccessor { | ||
| readonly status: 'not_found' | ||
| readonly isLoading: false | ||
| readonly isError: false | ||
| readonly isNotFound: true | ||
| readonly isPersisting: false | ||
| readonly isDirty: false | ||
| export type ErrorEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'error' | ||
| readonly $isLoading: false | ||
| readonly $isError: true | ||
| readonly $isNotFound: false | ||
| readonly $error: FieldError | ||
| readonly id: string | ||
| readonly fields: never | ||
| readonly data: never | ||
| persist(): Promise<void> | ||
| reset(): void | ||
| } | ||
| /** | ||
| * Ready state base interface for entity accessor | ||
| */ | ||
| export interface ReadyEntityAccessorBase<TEntity extends object, TSelected extends object = TEntity> { | ||
| readonly status: 'ready' | ||
| readonly isLoading: false | ||
| readonly isError: false | ||
| readonly isNotFound: false | ||
| readonly isPersisting: boolean | ||
| readonly isDirty: boolean | ||
| export type NotFoundEntityResult = UseEntityResultBase & { | ||
| readonly $status: 'not_found' | ||
| readonly $isLoading: false | ||
| readonly $isError: false | ||
| readonly $isNotFound: true | ||
| readonly $error: null | ||
| readonly id: string | ||
| readonly fields: SelectedEntityFields<TEntity, TSelected> | ||
| readonly data: TSelected | ||
| persist(): Promise<void> | ||
| reset(): void | ||
| } | ||
| /** | ||
| * Ready state for entity accessor with direct field access via Proxy. | ||
| * Ready state — full EntityAccessor with status metadata. | ||
| */ | ||
| export type ReadyEntityAccessor<TEntity extends object, TSelected extends object = TEntity> = | ||
| ReadyEntityAccessorBase<TEntity, TSelected> & SelectedEntityFields<TEntity, TSelected> | ||
| export type ReadyEntityResult<TEntity extends object, TSelected extends object = TEntity> = | ||
| UseEntityResultBase & EntityAccessor<TEntity, TSelected> & { | ||
| readonly $status: 'ready' | ||
| readonly $isLoading: false | ||
| readonly $isError: false | ||
| readonly $isNotFound: false | ||
| readonly $error: null | ||
| } | ||
| /** | ||
| * Union of all entity accessor states | ||
| * Union of all useEntity return states. | ||
| * Discriminated on $status. | ||
| */ | ||
| export type EntityAccessorResult<TEntity extends object, TSelected extends object = TEntity> = | ||
| | LoadingEntityAccessor | ||
| | ErrorEntityAccessor | ||
| | NotFoundEntityAccessor | ||
| | ReadyEntityAccessor<TEntity, TSelected> | ||
| export type UseEntityResult<TEntity extends object, TSelected extends object = TEntity> = | ||
| | LoadingEntityResult | ||
| | ErrorEntityResult | ||
| | NotFoundEntityResult | ||
| | ReadyEntityResult<TEntity, TSelected> | ||
| // ============================================================================ | ||
| // Internal helpers | ||
| // ============================================================================ | ||
| function createLoadingAccessor(id: string): LoadingEntityAccessor { | ||
| return { | ||
| status: 'loading', | ||
| isLoading: true, | ||
| isError: false, | ||
| isNotFound: false, | ||
| isPersisting: false, | ||
| isDirty: false, | ||
| id, | ||
| get fields(): never { | ||
| throw new Error('Cannot access fields while loading') | ||
| }, | ||
| get data(): never { | ||
| throw new Error('Cannot access data while loading') | ||
| }, | ||
| async persist() { | ||
| // No-op while loading | ||
| }, | ||
| reset() { | ||
| // No-op while loading | ||
| }, | ||
| } | ||
| } | ||
| function createErrorAccessor(id: string, error: FieldError): ErrorEntityAccessor { | ||
| return { | ||
| status: 'error', | ||
| isLoading: false, | ||
| isError: true, | ||
| isNotFound: false, | ||
| error, | ||
| isPersisting: false, | ||
| isDirty: false, | ||
| id, | ||
| get fields(): never { | ||
| throw new Error('Cannot access fields after error') | ||
| }, | ||
| get data(): never { | ||
| throw new Error('Cannot access data after error') | ||
| }, | ||
| async persist() { | ||
| // No-op after error | ||
| }, | ||
| reset() { | ||
| // No-op after error | ||
| }, | ||
| } | ||
| } | ||
| function createNotFoundAccessor(id: string): NotFoundEntityAccessor { | ||
| return { | ||
| status: 'not_found', | ||
| isLoading: false, | ||
| isError: false, | ||
| isNotFound: true, | ||
| isPersisting: false, | ||
| isDirty: false, | ||
| id, | ||
| get fields(): never { | ||
| throw new Error('Cannot access fields — entity not found') | ||
| }, | ||
| get data(): never { | ||
| throw new Error('Cannot access data — entity not found') | ||
| }, | ||
| async persist() { | ||
| // No-op for not found | ||
| }, | ||
| reset() { | ||
| // No-op for not found | ||
| }, | ||
| } | ||
| } | ||
| // ============================================================================ | ||
| // Hook overloads | ||
@@ -222,7 +120,2 @@ // ============================================================================ | ||
| * Hook to fetch and manage a single entity with role-expanded type inference. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * const article = useEntity(schema.Article, { by: { id }, roles: ['admin'] }, e => e.title().internalNotes()) | ||
| * ``` | ||
| */ | ||
@@ -237,7 +130,6 @@ export function useEntity< | ||
| definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>, | ||
| ): EntityAccessorResult<EntityForRoles<TRoleMap, TRoles>, TResult> | ||
| ): UseEntityResult<EntityForRoles<TRoleMap, TRoles>, TResult> | ||
| /** | ||
| * Hook to fetch and manage a single entity with full type inference. | ||
| * Uses the common (narrowest) entity type when no roles are specified. | ||
| * | ||
@@ -247,3 +139,3 @@ * @example | ||
| * const article = useEntity(schema.Article, { by: { id } }, e => e.title().content()) | ||
| * if (article.status !== 'ready') return <Loading /> | ||
| * if (article.$status !== 'ready') return <Loading /> | ||
| * return <input value={article.title.value} onChange={...} /> | ||
@@ -256,7 +148,6 @@ * ``` | ||
| definer: SelectionInput<CommonEntity<TRoleMap>, TResult>, | ||
| ): EntityAccessorResult<CommonEntity<TRoleMap>, TResult> | ||
| ): UseEntityResult<CommonEntity<TRoleMap>, TResult> | ||
| /** | ||
| * Hook to fetch and manage a single entity with pre-resolved selection. | ||
| * | ||
| * Used internally by Entity component that collects selection from JSX. | ||
@@ -267,3 +158,3 @@ */ | ||
| options: UseEntityOptions & { selection: SelectionMeta }, | ||
| ): EntityAccessorResult<object, object> | ||
| ): UseEntityResult<object, object> | ||
@@ -274,11 +165,7 @@ // ============================================================================ | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| export function useEntity( | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| entity: EntityDef<any>, | ||
| options: UseEntityOptions, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| definer?: SelectionInput<any, any>, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| ): EntityAccessorResult<any, any> { | ||
| ): UseEntityResult<any, any> { | ||
| const schemaRegistry = useSchemaRegistry() | ||
@@ -420,79 +307,81 @@ const entityType = entity.$name | ||
| // --- EntityHandle --- | ||
| // Include snapshot in deps so handle reference changes when entity data changes. | ||
| // This ensures memo-wrapped children that receive individual field handles re-render. | ||
| const handle = useMemo( | ||
| () => EntityHandle.create(id, entityType, store, dispatcher, schemaRegistry as SchemaRegistry<Record<string, object>>), | ||
| const rawHandle = useMemo( | ||
| () => EntityHandle.createRaw(id, entityType, store, dispatcher, schemaRegistry as SchemaRegistry<Record<string, object>>), | ||
| [id, entityType, store, dispatcher, schemaRegistry, snapshot], | ||
| ) | ||
| const handle = useMemo( | ||
| () => EntityHandle.wrapProxy(rawHandle), | ||
| [rawHandle], | ||
| ) | ||
| useEffect(() => { | ||
| return () => { | ||
| handle.dispose() | ||
| rawHandle.dispose() | ||
| } | ||
| }, [handle]) | ||
| }, [rawHandle]) | ||
| // --- Build accessor --- | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| const accessor = useMemo((): EntityAccessorResult<any, any> => { | ||
| if (!loadState || loadState.status === 'loading') { | ||
| return createLoadingAccessor(id) | ||
| // --- Persist & reset callbacks --- | ||
| const persist = useCallback(async () => { | ||
| await batchPersister.persist(entityType, id) | ||
| }, [batchPersister, entityType, id]) | ||
| const reset = useCallback(() => { | ||
| rawHandle.reset() | ||
| }, [rawHandle]) | ||
| // --- Build result --- | ||
| const result = useMemo((): UseEntityResult<any, any> => { | ||
| if (!loadState || loadState.status === 'loading' || (!snapshot && loadState.status === 'success')) { | ||
| return { $status: 'loading', $isLoading: true, $isError: false, $isNotFound: false, $error: null, id, $persist: persist, $reset: reset } | ||
| } | ||
| if (loadState.status === 'error') { | ||
| return createErrorAccessor(id, loadState.error!) | ||
| return { $status: 'error', $isLoading: false, $isError: true, $isNotFound: false, $error: loadState.error!, id, $persist: persist, $reset: reset } | ||
| } | ||
| if (loadState.status === 'not_found') { | ||
| return createNotFoundAccessor(id) | ||
| return { $status: 'not_found', $isLoading: false, $isError: false, $isNotFound: true, $error: null, id, $persist: persist, $reset: reset } | ||
| } | ||
| if (!snapshot) { | ||
| return createLoadingAccessor(id) | ||
| } | ||
| // Ready — layer status metadata on top of EntityHandle proxy | ||
| return createReadyResult(handle, persist, reset) | ||
| }, [snapshot, loadState, isPersisting, id, handle, persist, reset]) | ||
| // Ready state | ||
| const realId = (snapshot.data as Record<string, unknown>)?.['id'] as string | undefined ?? id | ||
| return result | ||
| } | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| const baseAccessor: ReadyEntityAccessorBase<any, any> = { | ||
| status: 'ready', | ||
| isLoading: false, | ||
| isError: false, | ||
| isNotFound: false, | ||
| isPersisting, | ||
| get isDirty() { | ||
| return handle.$isDirty | ||
| }, | ||
| id: realId, | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| fields: handle.$fields as any, | ||
| data: snapshot.data, | ||
| async persist() { | ||
| await batchPersister.persist(entityType, realId) | ||
| }, | ||
| reset() { | ||
| handle.reset() | ||
| }, | ||
| } | ||
| // ============================================================================ | ||
| // Result factories | ||
| // ============================================================================ | ||
| // Wrap in Proxy for direct field access | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| return new Proxy(baseAccessor as any, { | ||
| get(target: Record<string, unknown>, prop: string | symbol, receiver: unknown) { | ||
| if (prop in target) { | ||
| return Reflect.get(target, prop, receiver) | ||
| } | ||
| if (typeof prop === 'string') { | ||
| const fields = target['fields'] as Record<string, unknown> | ||
| const fieldValue = fields[prop] | ||
| if (fieldValue !== undefined) { | ||
| return fieldValue | ||
| } | ||
| } | ||
| return undefined | ||
| }, | ||
| }) | ||
| }, [snapshot, loadState, isPersisting, id, handle, batchPersister, entityType]) | ||
| function createReadyResult( | ||
| handle: EntityAccessor<object, object>, | ||
| persist: () => Promise<void>, | ||
| reset: () => void, | ||
| ): ReadyEntityResult<any, any> { | ||
| const meta = { | ||
| $status: 'ready' as const, | ||
| $isLoading: false as const, | ||
| $isError: false as const, | ||
| $isNotFound: false as const, | ||
| $error: null, | ||
| $persist: persist, | ||
| $reset: reset, | ||
| } | ||
| return accessor | ||
| return new Proxy(handle as any, { | ||
| get(target, prop, receiver) { | ||
| if (typeof prop === 'string' && prop in meta) { | ||
| return (meta as any)[prop] | ||
| } | ||
| return Reflect.get(target, prop, receiver) | ||
| }, | ||
| has(target, prop) { | ||
| if (typeof prop === 'string' && prop in meta) { | ||
| return true | ||
| } | ||
| return Reflect.has(target, prop) | ||
| }, | ||
| }) as any | ||
| } |
+61
-100
@@ -37,55 +37,36 @@ import { useRef, useEffect, useMemo, useCallback } from 'react' | ||
| /** | ||
| * Loading state for entity list accessor | ||
| */ | ||
| export interface LoadingEntityListAccessor { | ||
| readonly status: 'loading' | ||
| readonly isLoading: true | ||
| readonly isError: false | ||
| readonly isDirty: false | ||
| readonly items: never | ||
| readonly length: 0 | ||
| add(data?: unknown): string | ||
| remove(key: string): void | ||
| move(fromIndex: number, toIndex: number): void | ||
| interface EntityListResultBase { | ||
| $add(data?: unknown): string | ||
| $remove(key: string): void | ||
| $move(fromIndex: number, toIndex: number): void | ||
| } | ||
| /** | ||
| * Error state for entity list accessor | ||
| */ | ||
| export interface ErrorEntityListAccessor { | ||
| readonly status: 'error' | ||
| readonly isLoading: false | ||
| readonly isError: true | ||
| readonly error: FieldError | ||
| readonly isDirty: false | ||
| readonly items: never | ||
| readonly length: 0 | ||
| add(data?: unknown): string | ||
| remove(key: string): void | ||
| move(fromIndex: number, toIndex: number): void | ||
| export type LoadingEntityListResult = EntityListResultBase & { | ||
| readonly $status: 'loading' | ||
| readonly $isLoading: true | ||
| readonly $isError: false | ||
| readonly $error: null | ||
| } | ||
| /** | ||
| * Ready state for entity list accessor | ||
| */ | ||
| export interface ReadyEntityListAccessor<T extends object> { | ||
| readonly status: 'ready' | ||
| readonly isLoading: false | ||
| readonly isError: false | ||
| readonly isDirty: boolean | ||
| export type ErrorEntityListResult = EntityListResultBase & { | ||
| readonly $status: 'error' | ||
| readonly $isLoading: false | ||
| readonly $isError: true | ||
| readonly $error: FieldError | ||
| } | ||
| export type ReadyEntityListResult<T extends object> = EntityListResultBase & { | ||
| readonly $status: 'ready' | ||
| readonly $isLoading: false | ||
| readonly $isError: false | ||
| readonly $error: null | ||
| readonly $isDirty: boolean | ||
| readonly items: Array<EntityAccessor<T>> | ||
| readonly length: number | ||
| add(data?: Partial<T>): string | ||
| remove(key: string): void | ||
| move(fromIndex: number, toIndex: number): void | ||
| } | ||
| /** | ||
| * Union of all entity list accessor states | ||
| */ | ||
| export type EntityListAccessorResult<T extends object> = | ||
| | LoadingEntityListAccessor | ||
| | ErrorEntityListAccessor | ||
| | ReadyEntityListAccessor<T> | ||
| export type UseEntityListResult<T extends object> = | ||
| | LoadingEntityListResult | ||
| | ErrorEntityListResult | ||
| | ReadyEntityListResult<T> | ||
@@ -96,44 +77,23 @@ // ============================================================================ | ||
| function createLoadingListAccessor(): LoadingEntityListAccessor { | ||
| function createLoadingListResult(): LoadingEntityListResult { | ||
| return { | ||
| status: 'loading', | ||
| isLoading: true, | ||
| isError: false, | ||
| isDirty: false, | ||
| get items(): never { | ||
| throw new Error('Cannot access items while loading') | ||
| }, | ||
| length: 0, | ||
| add() { | ||
| throw new Error('Cannot add items while loading') | ||
| }, | ||
| remove() { | ||
| throw new Error('Cannot remove items while loading') | ||
| }, | ||
| move() { | ||
| throw new Error('Cannot move items while loading') | ||
| }, | ||
| $status: 'loading', | ||
| $isLoading: true, | ||
| $isError: false, | ||
| $error: null, | ||
| $add() { throw new Error('Cannot add items while loading') }, | ||
| $remove() { throw new Error('Cannot remove items while loading') }, | ||
| $move() { throw new Error('Cannot move items while loading') }, | ||
| } | ||
| } | ||
| function createErrorListAccessor(error: FieldError): ErrorEntityListAccessor { | ||
| function createErrorListResult(error: FieldError): ErrorEntityListResult { | ||
| return { | ||
| status: 'error', | ||
| isLoading: false, | ||
| isError: true, | ||
| error, | ||
| isDirty: false, | ||
| get items(): never { | ||
| throw new Error('Cannot access items after error') | ||
| }, | ||
| length: 0, | ||
| add() { | ||
| throw new Error('Cannot add items after error') | ||
| }, | ||
| remove() { | ||
| throw new Error('Cannot remove items after error') | ||
| }, | ||
| move() { | ||
| throw new Error('Cannot move items after error') | ||
| }, | ||
| $status: 'error', | ||
| $isLoading: false, | ||
| $isError: true, | ||
| $error: error, | ||
| $add() { throw new Error('Cannot add items after error') }, | ||
| $remove() { throw new Error('Cannot remove items after error') }, | ||
| $move() { throw new Error('Cannot move items after error') }, | ||
| } | ||
@@ -162,3 +122,3 @@ } | ||
| definer: SelectionInput<EntityForRoles<TRoleMap, TRoles>, TResult>, | ||
| ): EntityListAccessorResult<TResult> | ||
| ): UseEntityListResult<TResult> | ||
@@ -180,3 +140,3 @@ /** | ||
| definer: SelectionInput<CommonEntity<TRoleMap>, TResult>, | ||
| ): EntityListAccessorResult<TResult> | ||
| ): UseEntityListResult<TResult> | ||
@@ -192,3 +152,3 @@ /** | ||
| options: UseEntityListOptions & { selection: SelectionMeta }, | ||
| ): EntityListAccessorResult<object> | ||
| ): UseEntityListResult<object> | ||
@@ -205,3 +165,3 @@ // ============================================================================ | ||
| definer?: SelectionInput<any, any>, | ||
| ): EntityListAccessorResult<any> { | ||
| ): UseEntityListResult<any> { | ||
| const schemaRegistry = useSchemaRegistry() | ||
@@ -259,3 +219,3 @@ const entityType = entity.$name | ||
| status: string | ||
| result: EntityListAccessorResult<object> | ||
| result: UseEntityListResult<any> | ||
| } | null>(null) | ||
@@ -320,3 +280,3 @@ | ||
| // --- Snapshot --- | ||
| const getSnapshot = useCallback((): EntityListAccessorResult<object> => { | ||
| const getSnapshot = useCallback((): UseEntityListResult<any> => { | ||
| const state = listStateRef.current | ||
@@ -331,8 +291,8 @@ const version = versionRef.current | ||
| let result: EntityListAccessorResult<object> | ||
| let result: UseEntityListResult<any> | ||
| if (state.status === 'loading') { | ||
| result = createLoadingListAccessor() | ||
| result = createLoadingListResult() | ||
| } else if (state.status === 'error') { | ||
| result = createErrorListAccessor(state.error!) | ||
| result = createErrorListResult(state.error!) | ||
| } else { | ||
@@ -346,15 +306,16 @@ const items = state.items.map((item) => { | ||
| schemaRegistry as SchemaRegistry<Record<string, object>>, | ||
| ) as unknown as EntityAccessor<object> | ||
| ) as unknown as EntityAccessor<any> | ||
| }) | ||
| result = { | ||
| status: 'ready', | ||
| isLoading: false, | ||
| isError: false, | ||
| isDirty: false, | ||
| $status: 'ready', | ||
| $isLoading: false, | ||
| $isError: false, | ||
| $error: null, | ||
| $isDirty: false, | ||
| items, | ||
| length: items.length, | ||
| add: addItem, | ||
| remove: removeItem, | ||
| move: moveItem, | ||
| $add: addItem, | ||
| $remove: removeItem, | ||
| $move: moveItem, | ||
| } | ||
@@ -374,3 +335,3 @@ } | ||
| const isEqual = useCallback( | ||
| (a: EntityListAccessorResult<object>, b: EntityListAccessorResult<object>): boolean => { | ||
| (a: UseEntityListResult<any>, b: UseEntityListResult<any>): boolean => { | ||
| return a === b | ||
@@ -377,0 +338,0 @@ }, |
+9
-9
@@ -189,11 +189,11 @@ /** | ||
| UseEntityListOptions, | ||
| LoadingEntityAccessor, | ||
| ErrorEntityAccessor, | ||
| NotFoundEntityAccessor, | ||
| ReadyEntityAccessor, | ||
| EntityAccessorResult, | ||
| LoadingEntityListAccessor, | ||
| ErrorEntityListAccessor, | ||
| ReadyEntityListAccessor, | ||
| EntityListAccessorResult, | ||
| LoadingEntityResult, | ||
| ErrorEntityResult, | ||
| NotFoundEntityResult, | ||
| ReadyEntityResult, | ||
| UseEntityResult, | ||
| LoadingEntityListResult, | ||
| ErrorEntityListResult, | ||
| ReadyEntityListResult, | ||
| UseEntityListResult, | ||
| // Persistence hook types | ||
@@ -200,0 +200,0 @@ PersistApi, |
@@ -50,2 +50,3 @@ import type { SchemaRegistry } from '@contember/bindx' | ||
| $isDirty: false, | ||
| $isPersisting: false, | ||
| $persistedId: null, | ||
@@ -230,2 +231,3 @@ $isNew: true, | ||
| $data: null, | ||
| $isPersisting: false, | ||
| $isNew: false, | ||
@@ -232,0 +234,0 @@ $persistedId: null, |
@@ -109,14 +109,15 @@ import React, { memo, useCallback, useEffect, useMemo, useRef, useSyncExternalStore, type ReactElement } from 'react' | ||
| // Render based on status | ||
| if (result.status === 'loading') { | ||
| if (result.$status === 'loading') { | ||
| return <>{loading ?? <DefaultLoading />}</> | ||
| } | ||
| if (result.status === 'error') { | ||
| if (result.$status === 'error') { | ||
| const error: FieldError = result.$error ?? { source: 'load', message: 'Unknown error', category: 'unknown', retryable: false } | ||
| if (errorFallback) { | ||
| return <>{errorFallback(result.error)}</> | ||
| return <>{errorFallback(error)}</> | ||
| } | ||
| return <DefaultError error={result.error} /> | ||
| return <DefaultError error={error} /> | ||
| } | ||
| if (result.status === 'not_found') { | ||
| if (result.$status === 'not_found') { | ||
| return <>{notFound ?? <DefaultNotFound entityType={entityType} by={by} />}</> | ||
@@ -275,10 +276,15 @@ } | ||
| const handle = useMemo( | ||
| () => EntityHandle.create(entityId, entityType, store, dispatcher, schemaRegistry, undefined, selection), | ||
| const rawHandle = useMemo( | ||
| () => EntityHandle.createRaw(entityId, entityType, store, dispatcher, schemaRegistry, undefined, selection), | ||
| [entityId, entityType, store, dispatcher, schemaRegistry, selection, version], | ||
| ) | ||
| useEffect(() => () => { handle.dispose() }, [handle]) | ||
| const handle = useMemo( | ||
| () => EntityHandle.wrapProxy(rawHandle), | ||
| [rawHandle], | ||
| ) | ||
| return <>{children(handle as unknown as EntityAccessor<unknown>)}</> | ||
| useEffect(() => () => { rawHandle.dispose() }, [rawHandle]) | ||
| return <>{children(handle as EntityAccessor<unknown>)}</> | ||
| } | ||
@@ -285,0 +291,0 @@ |
@@ -89,11 +89,11 @@ import React, { memo, type ReactElement } from 'react' | ||
| // Render based on status | ||
| if (result.status === 'loading') { | ||
| if (result.$status === 'loading') { | ||
| return <>{loading ?? <DefaultLoading />}</> | ||
| } | ||
| if (result.status === 'error') { | ||
| if (result.$status === 'error') { | ||
| if (errorFallback) { | ||
| return <>{errorFallback(result.error)}</> | ||
| return <>{errorFallback(result.$error)}</> | ||
| } | ||
| return <DefaultError error={result.error} /> | ||
| return <DefaultError error={result.$error} /> | ||
| } | ||
@@ -107,3 +107,3 @@ | ||
| // Phase 3: Runtime render — items are already EntityAccessors from the hook | ||
| const items = result.items.map((item, index) => { | ||
| const items = result.items.map((item: (typeof result.items)[number], index: number) => { | ||
| return ( | ||
@@ -110,0 +110,0 @@ <React.Fragment key={item.id}> |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
348377
-1.49%8224
-2.44%+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
Updated