remult 0.26.23 → 0.27.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.
Files changed (126) hide show
  1. package/SseSubscriptionServer.d.ts +3 -4
  2. package/assign.js +1 -2
  3. package/esm/graphql.js +1 -1
  4. package/esm/remult-hono.js +3 -1
  5. package/esm/remult-knex/index.js +3 -1
  6. package/esm/remult-sqlite3.js +4 -1
  7. package/esm/remult-sveltekit.js +1 -0
  8. package/esm/server/index.js +3 -2
  9. package/esm/server/initAsyncHooks.js +3 -3
  10. package/esm/server/remult-admin.js +1 -4
  11. package/esm/server/remult-api-server.js +47 -48
  12. package/esm/src/CompoundIdField.js +9 -9
  13. package/esm/src/data-api.js +1 -1
  14. package/esm/src/data-providers/json-entity-opfs-storage.js +9 -5
  15. package/esm/src/data-providers/sql-database.js +9 -9
  16. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +3 -1
  17. package/esm/src/filter/filter-interfaces.js +1 -1
  18. package/esm/src/live-query/LiveQueryClient.js +0 -1
  19. package/esm/src/remult-proxy.js +1 -3
  20. package/esm/src/remult-static.js +1 -0
  21. package/esm/src/remult3/Fields.js +15 -7
  22. package/esm/src/remult3/RepositoryImplementation.js +165 -125
  23. package/esm/src/remult3/entity.js +1 -1
  24. package/esm/src/remult3/relation-loader.js +2 -2
  25. package/esm/src/remult3/remult3.js +15 -0
  26. package/esm/src/server-action.js +16 -12
  27. package/esm/src/sort.js +0 -2
  28. package/esm/src/validators.js +3 -3
  29. package/esm/src/valueConverters.js +2 -2
  30. package/graphql.js +3 -4
  31. package/index.js +2 -2
  32. package/live-query/data-provider-live-query-storage.js +6 -6
  33. package/migrations/compare-migration-snapshots.js +48 -49
  34. package/migrations/generate-migrations.js +1 -2
  35. package/migrations/migrate.js +2 -3
  36. package/migrations/migration-types.d.ts +1 -1
  37. package/migrations/migration-types.js +4 -4
  38. package/migrations/update-migrations-ts-file.js +1 -2
  39. package/myLog.js +1 -2
  40. package/package.json +1 -1
  41. package/postgres/postgres-data-provider.d.ts +2 -2
  42. package/postgres/postgres-data-provider.js +5 -5
  43. package/postgres/schema-builder.d.ts +1 -1
  44. package/postgres/schema-builder.js +3 -3
  45. package/remult-express.js +4 -3
  46. package/remult-fastify.js +4 -3
  47. package/remult-fresh.js +1 -2
  48. package/remult-hapi.js +4 -3
  49. package/remult-hono.js +6 -3
  50. package/remult-knex/index.d.ts +2 -2
  51. package/remult-knex/index.js +7 -5
  52. package/remult-mongo.d.ts +1 -1
  53. package/remult-next.d.ts +5 -6
  54. package/remult-next.js +11 -6
  55. package/remult-nuxt.js +1 -2
  56. package/remult-solid-start.js +1 -2
  57. package/remult-sqlite3.js +4 -1
  58. package/remult-sveltekit.d.ts +1 -1
  59. package/remult-sveltekit.js +33 -35
  60. package/server/JsonEntityFileStorage.d.ts +1 -1
  61. package/server/get-remult-admin-html.js +1 -2
  62. package/server/index.js +4 -3
  63. package/server/initAsyncHooks.d.ts +10 -10
  64. package/server/initAsyncHooks.js +5 -2
  65. package/server/initDataProvider.js +1 -2
  66. package/server/initDataProviderOrJson.js +1 -2
  67. package/server/remult-admin.js +3 -7
  68. package/server/remult-api-server.d.ts +21 -21
  69. package/server/remult-api-server.js +54 -48
  70. package/src/CompoundIdField.d.ts +2 -2
  71. package/src/CompoundIdField.js +9 -0
  72. package/src/buildRestDataProvider.d.ts +1 -1
  73. package/src/buildRestDataProvider.js +8 -8
  74. package/src/column-interfaces.d.ts +4 -4
  75. package/src/column-interfaces.js +1 -2
  76. package/src/column.d.ts +4 -4
  77. package/src/column.js +2 -2
  78. package/src/context.d.ts +4 -4
  79. package/src/context.js +5 -5
  80. package/src/data-api.d.ts +4 -4
  81. package/src/data-api.js +4 -4
  82. package/src/data-interfaces.d.ts +1 -1
  83. package/src/data-interfaces.js +1 -2
  84. package/src/data-providers/json-entity-opfs-storage.js +30 -16
  85. package/src/data-providers/rest-data-provider.d.ts +3 -3
  86. package/src/data-providers/rest-data-provider.js +4 -4
  87. package/src/data-providers/sql-database.d.ts +1 -1
  88. package/src/data-providers/sql-database.js +11 -11
  89. package/src/data-providers/web-sql-data-provider.d.ts +2 -2
  90. package/src/entity.d.ts +1 -1
  91. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +3 -3
  92. package/src/filter/filter-consumer-bridge-to-sql-request.js +21 -19
  93. package/src/filter/filter-interfaces.d.ts +2 -1
  94. package/src/filter/filter-interfaces.js +10 -7
  95. package/src/isOfType.js +2 -3
  96. package/src/live-query/SubscriptionServer.js +95 -97
  97. package/src/remult-proxy.js +1 -3
  98. package/src/remult-static.d.ts +2 -2
  99. package/src/remult-static.js +7 -4
  100. package/src/remult3/Fields.d.ts +17 -17
  101. package/src/remult3/Fields.js +22 -13
  102. package/src/remult3/RepositoryImplementation.d.ts +51 -46
  103. package/src/remult3/RepositoryImplementation.js +421 -368
  104. package/src/remult3/__updateEntityBasedOnWhere.js +1 -2
  105. package/src/remult3/addValidator.d.ts +1 -1
  106. package/src/remult3/addValidator.js +1 -2
  107. package/src/remult3/classDescribers.d.ts +4 -4
  108. package/src/remult3/classDescribers.js +3 -4
  109. package/src/remult3/columnInfo.d.ts +1 -1
  110. package/src/remult3/entity.js +2 -4
  111. package/src/remult3/getEntityRef.js +4 -4
  112. package/src/remult3/relation-loader.d.ts +1 -1
  113. package/src/remult3/relationInfoMember.d.ts +3 -3
  114. package/src/remult3/relationInfoMember.js +4 -5
  115. package/src/remult3/remult3.d.ts +23 -20
  116. package/src/remult3/remult3.js +15 -0
  117. package/src/remult3/repository-internals.d.ts +3 -3
  118. package/src/remult3/repository-internals.js +2 -2
  119. package/src/server-action.d.ts +2 -2
  120. package/src/server-action.js +65 -58
  121. package/src/sort.d.ts +1 -1
  122. package/src/sort.js +0 -2
  123. package/src/sql-command.d.ts +1 -1
  124. package/src/validators.d.ts +1 -1
  125. package/src/validators.js +13 -11
  126. package/src/valueConverters.js +3 -2
@@ -29,20 +29,20 @@ export declare class RepositoryImplementation<entityType> implements Repository<
29
29
  returnNull: boolean;
30
30
  returnUndefined: boolean;
31
31
  };
32
- private __edp;
32
+ private __edp?;
33
33
  private get _edp();
34
- constructor(_entity: ClassType<entityType>, _remult: Remult, _dataProvider: DataProvider, _info: EntityFullInfo<entityType>, _defaultFindOptions?: FindOptions<entityType>);
34
+ constructor(_entity: ClassType<entityType>, _remult: Remult, _dataProvider: DataProvider, _info: EntityFullInfo<entityType>, _defaultFindOptions?: FindOptions<entityType> | undefined);
35
35
  _idCache: Map<any, any>;
36
- _getCachedById(id: any, doNotLoadIfNotFound: boolean): entityType;
37
- _getCachedByIdAsync(id: any, doNotLoadIfNotFound: boolean): Promise<entityType>;
36
+ _getCachedById(id: any, doNotLoadIfNotFound: boolean): entityType | undefined;
37
+ _getCachedByIdAsync(id: any, doNotLoadIfNotFound: boolean): Promise<entityType | undefined>;
38
38
  _addToCache(item: entityType): void;
39
39
  get metadata(): EntityMetadata<entityType>;
40
- listeners: entityEventListener<entityType>[];
40
+ listeners?: entityEventListener<entityType>[];
41
41
  addEventListener(listener: entityEventListener<entityType>): () => void;
42
42
  query(options?: QueryOptions<entityType>): QueryResult<entityType>;
43
43
  getEntityRef(entity: entityType): EntityRef<entityType>;
44
44
  delete(id: idType<entityType>): Promise<void>;
45
- delete(item: entityType): Promise<void>;
45
+ delete(item: Partial<MembersOnly<entityType>>): Promise<void>;
46
46
  insert(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
47
47
  insert(item: Partial<MembersOnly<entityType>>): Promise<entityType>;
48
48
  get fields(): FieldsMetadata<entityType>;
@@ -57,26 +57,28 @@ export declare class RepositoryImplementation<entityType> implements Repository<
57
57
  save(item: Partial<MembersOnly<entityType>>[]): Promise<entityType[]>;
58
58
  save(item: Partial<MembersOnly<entityType>>): Promise<entityType>;
59
59
  liveQuery(options?: FindOptions<entityType>): LiveQuery<entityType>;
60
- _rawFind(options: FindOptions<entityType>, skipOrderByAndLimit: boolean, loader: RelationLoader): Promise<entityType[]>;
61
- find(options: FindOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType[]>;
60
+ _rawFind(options: FindOptions<entityType> | undefined, skipOrderByAndLimit: boolean | undefined, loader: RelationLoader): Promise<entityType[]>;
61
+ find(options?: FindOptions<entityType>): Promise<entityType[]>;
62
+ find(options?: FindOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType[]>;
62
63
  _buildEntityDataProviderFindOptions(options: FindOptions<entityType>): Promise<EntityDataProviderFindOptions>;
63
64
  _fromJsonArray(jsonItems: any[], loadOptions: LoadOptions<entityType>): Promise<entityType[]>;
64
65
  private _loadManyToOneForManyRows;
65
66
  private _mapRawDataToResult;
66
67
  toJson(item: entityType | entityType[] | Promise<entityType> | Promise<entityType[]>): any;
67
- fromJson(json: any, newRow?: boolean): any;
68
+ fromJson(x: any[], isNew?: boolean): entityType[];
69
+ fromJson(x: any, isNew?: boolean): entityType;
68
70
  count(where?: EntityFilter<entityType>): Promise<number>;
69
71
  deleteMany({ where, }: {
70
72
  where: EntityFilter<entityType>;
71
73
  }): Promise<number>;
72
74
  private _cache;
73
- findOne(options?: FindFirstOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType>;
74
- findFirst(where?: EntityFilter<entityType>, options?: FindFirstOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType>;
75
+ findOne(pOptions?: FindFirstOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType | undefined>;
76
+ findFirst(where?: EntityFilter<entityType>, options?: FindFirstOptions<entityType>, skipOrderByAndLimit?: boolean): Promise<entityType | undefined>;
75
77
  private _fieldsOf;
76
78
  create(item?: Partial<MembersOnly<entityType>>): entityType;
77
79
  _fixTypes(item: any): Promise<any>;
78
- findId(id: any, options?: FindFirstOptionsBase<entityType>): Promise<entityType>;
79
- _translateWhereToFilter(where: EntityFilter<entityType>): Promise<Filter>;
80
+ findId(id: any, options?: FindFirstOptionsBase<entityType>): Promise<entityType | undefined | null>;
81
+ _translateWhereToFilter(where?: EntityFilter<entityType>): Promise<Filter>;
80
82
  }
81
83
  export type EntityOptionsFactory = (remult: Remult) => EntityOptions;
82
84
  export declare function createOldEntity<T>(entity: ClassType<T>, remult: Remult): EntityFullInfo<T>;
@@ -85,11 +87,11 @@ declare abstract class rowHelperBase<T> {
85
87
  instance: T;
86
88
  remult: Remult;
87
89
  isNewRow: boolean;
88
- _error: string;
89
- get error(): string;
90
- set error(val: string);
90
+ _error?: string;
91
+ get error(): string | undefined;
92
+ set error(val: string | undefined);
91
93
  constructor(fieldsMetadata: FieldMetadata[], instance: T, remult: Remult, isNewRow: boolean);
92
- _subscribers: SubscribableImp;
94
+ _subscribers?: SubscribableImp;
93
95
  subscribe(listener: RefSubscriber): Unsubscribe;
94
96
  _isLoading: boolean;
95
97
  initSubscribers(): void;
@@ -97,11 +99,11 @@ declare abstract class rowHelperBase<T> {
97
99
  set isLoading(val: boolean);
98
100
  lookups: Map<string, LookupColumn<any>>;
99
101
  waitLoad(): Promise<void>;
100
- errors: {
101
- [key: string]: string;
102
+ errors?: {
103
+ [key: string]: string | undefined;
102
104
  };
103
105
  protected __assertValidity(): void;
104
- buildErrorInfoObject(): ErrorInfo<any>;
106
+ buildErrorInfoObject(): ErrorInfo<unknown>;
105
107
  abstract get fields(): FieldsRef<T>;
106
108
  catchSaveErrors(err: any): any;
107
109
  __clearErrorsAndReportChanged(): void;
@@ -111,7 +113,7 @@ declare abstract class rowHelperBase<T> {
111
113
  originalValues: any;
112
114
  saveOriginalData(): void;
113
115
  saveMoreOriginalData(): void;
114
- validate(): Promise<ErrorInfo<any>>;
116
+ validate(): Promise<ErrorInfo<unknown> | undefined>;
115
117
  __validateEntity(): Promise<void>;
116
118
  __performColumnAndEntityValidations(): Promise<void>;
117
119
  toApiJson(includeRelatedEntities?: boolean, notJustApi?: boolean): any;
@@ -119,11 +121,12 @@ declare abstract class rowHelperBase<T> {
119
121
  }
120
122
  export declare class rowHelperImplementation<T> extends rowHelperBase<T> implements EntityRef<T> {
121
123
  private info;
122
- repository: RepositoryImplementation<T>;
124
+ private repo;
123
125
  private edp;
124
126
  private _isNew;
125
- constructor(info: EntityFullInfo<T>, instance: T, repository: RepositoryImplementation<T>, edp: EntityDataProvider, remult: Remult, _isNew: boolean);
126
- clone(): any;
127
+ constructor(info: EntityFullInfo<T>, instance: T, repo: RepositoryImplementation<T>, edp: EntityDataProvider, remult: Remult, _isNew: boolean);
128
+ repository: Repository<unknown>;
129
+ clone(): T;
127
130
  get relations(): RepositoryRelations<T>;
128
131
  get apiUpdateAllowed(): boolean;
129
132
  get apiDeleteAllowed(): boolean;
@@ -135,7 +138,7 @@ export declare class rowHelperImplementation<T> extends rowHelperBase<T> impleme
135
138
  wasDeleted(): boolean;
136
139
  undoChanges(): void;
137
140
  reload(): Promise<T>;
138
- private _columns;
141
+ private _columns?;
139
142
  get fields(): FieldsRef<T>;
140
143
  private _saving;
141
144
  save(onlyTheseFieldsSentOnlyInTheCaseOfProxySaveWithPartialObject?: string[]): Promise<T>;
@@ -145,8 +148,8 @@ export declare class rowHelperImplementation<T> extends rowHelperBase<T> impleme
145
148
  private getIdFilter;
146
149
  delete(): Promise<void>;
147
150
  loadDataFrom(data: any, loadItems?: FieldMetadata[]): Promise<void>;
148
- id: any;
149
- originalId: any;
151
+ id?: any;
152
+ originalId?: any;
150
153
  getOriginalId(): any;
151
154
  private calcServerExpression;
152
155
  isNew(): boolean;
@@ -155,28 +158,30 @@ export declare class rowHelperImplementation<T> extends rowHelperBase<T> impleme
155
158
  }
156
159
  export declare function getFields<fieldsContainerType>(container: fieldsContainerType, remult?: Remult): FieldsRef<fieldsContainerType>;
157
160
  export declare function getControllerRef<fieldsContainerType>(container: fieldsContainerType, remultArg?: Remult): ControllerRef<fieldsContainerType>;
158
- export declare class controllerRefImpl<T = any> extends rowHelperBase<T> implements ControllerRef<T> {
161
+ export declare class controllerRefImpl<T = unknown> extends rowHelperBase<T> implements ControllerRef<T> {
159
162
  constructor(columnsInfo: FieldMetadata[], instance: any, remult: Remult);
160
163
  __performColumnAndEntityValidations(): Promise<void>;
161
164
  fields: FieldsRef<T>;
162
165
  }
163
166
  export declare class FieldRefImplementation<entityType, valueType> implements FieldRef<entityType, valueType> {
164
167
  private settings;
165
- metadata: FieldMetadata;
168
+ metadata: FieldMetadata<valueType, entityType>;
166
169
  container: any;
167
170
  private helper;
168
171
  private rowBase;
169
- constructor(settings: FieldOptions, metadata: FieldMetadata, container: any, helper: EntityRef<entityType>, rowBase: rowHelperBase<entityType>);
170
- _subscribers: SubscribableImp;
172
+ constructor(settings: FieldOptions, metadata: FieldMetadata<valueType, entityType>, container: any, helper: EntityRef<entityType> | undefined, rowBase: rowHelperBase<entityType>);
173
+ _subscribers?: SubscribableImp;
171
174
  subscribe(listener: RefSubscriber): Unsubscribe;
172
175
  valueIsNull(): boolean;
173
176
  originalValueIsNull(): boolean;
177
+ get key(): keyof entityType;
178
+ get repo(): Repository<entityType>;
174
179
  load(): Promise<valueType>;
175
- target: ClassType<any>;
180
+ target?: ClassType<any>;
176
181
  reportObserved(): void;
177
182
  reportChanged(): void;
178
- get error(): string;
179
- set error(error: string);
183
+ get error(): string | undefined;
184
+ set error(error: string | undefined);
180
185
  get displayValue(): string;
181
186
  get value(): any;
182
187
  set value(value: any);
@@ -223,19 +228,19 @@ export declare const CaptionTransformer: {
223
228
  */
224
229
  transformCaption: (remult: Remult, key: string, caption: string, entityMetaData: EntityMetadata<any>) => string;
225
230
  };
226
- export declare function buildCaption(caption: string | ((remult: Remult) => string), key: string, remult: Remult, metaData: EntityMetadata<any>): string;
231
+ export declare function buildCaption(caption: string | ((remult: Remult) => string) | undefined, key: string, remult: Remult, metaData: EntityMetadata<any>): string;
227
232
  export declare class columnDefsImpl implements FieldMetadata {
228
233
  private settings;
229
234
  private entityDefs;
230
235
  private remult;
231
- constructor(settings: FieldOptions, entityDefs: EntityFullInfo<any>, remult: Remult);
236
+ constructor(settings: FieldOptions<unknown, unknown>, entityDefs: EntityFullInfo<any>, remult: Remult);
232
237
  apiUpdateAllowed(item?: any): boolean;
233
238
  displayValue(item: any): string;
234
239
  includedInApi(item?: any): boolean;
235
240
  toInput(value: any, inputType?: string): string;
236
241
  fromInput(inputValue: string, inputType?: string): any;
237
242
  getDbName(): Promise<string>;
238
- options: FieldOptions<any, any>;
243
+ options: FieldOptions<unknown, unknown>;
239
244
  target: ClassType<any>;
240
245
  readonly: boolean;
241
246
  valueConverter: Required<ValueConverter<any>>;
@@ -249,13 +254,13 @@ export declare class columnDefsImpl implements FieldMetadata {
249
254
  valueType: any;
250
255
  }
251
256
  declare class EntityFullInfo<T> implements EntityMetadata<T> {
252
- entityInfo: EntityOptions;
257
+ entityInfo: EntityOptions<T>;
253
258
  private remult;
254
259
  readonly entityType: ClassType<T>;
255
260
  readonly key: string;
256
- options: EntityOptions<T>;
261
+ options: EntityOptions<unknown>;
257
262
  fieldsMetadata: FieldMetadata[];
258
- constructor(columnsInfo: FieldOptions[], entityInfo: EntityOptions, remult: Remult, entityType: ClassType<T>, key: string);
263
+ constructor(columnsInfo: FieldOptions<unknown, unknown>[], entityInfo: EntityOptions<T>, remult: Remult, entityType: ClassType<T>, key: string);
259
264
  apiUpdateAllowed(item: T): boolean;
260
265
  get apiReadAllowed(): boolean;
261
266
  apiDeleteAllowed(item: T): boolean;
@@ -267,9 +272,9 @@ declare class EntityFullInfo<T> implements EntityMetadata<T> {
267
272
  dbName: string;
268
273
  caption: string;
269
274
  }
270
- export declare function FieldType<valueType = any>(...options: (FieldOptions<any, valueType> | ((options: FieldOptions<any, valueType>, remult: Remult) => void))[]): (target: any, context?: any) => any;
275
+ export declare function FieldType<valueType = unknown>(...options: (FieldOptions<any, valueType> | ((options: FieldOptions<any, valueType>, remult: Remult) => void))[]): (target: any, context?: any) => any;
271
276
  export declare function isAutoIncrement(f: FieldMetadata): boolean;
272
- export declare function ValueListFieldType<valueType extends ValueListItem = any>(...options: (ValueListFieldOptions<any, valueType> | ((options: FieldOptions<any, valueType>, remult: Remult) => void))[]): (type: ClassType<valueType>, context?: any) => void;
277
+ export declare function ValueListFieldType<valueType extends ValueListItem = ValueListItem>(...options: (ValueListFieldOptions<any, valueType> | ((options: FieldOptions<any, valueType>, remult: Remult) => void))[]): (type: ClassType<valueType>, context?: any) => void;
273
278
  export interface ValueListFieldOptions<entityType, valueType> extends FieldOptions<entityType, valueType> {
274
279
  getValues?: () => valueType[];
275
280
  }
@@ -281,7 +286,7 @@ export declare class ValueListInfo<T extends ValueListItem> implements ValueConv
281
286
  isNumeric: boolean;
282
287
  private constructor();
283
288
  getValues(): T[];
284
- byId(key: any): T;
289
+ byId(key: any): T | undefined;
285
290
  fromJson(val: any): T;
286
291
  toJson(val: T): any;
287
292
  fromDb(val: any): T;
@@ -297,8 +302,8 @@ export declare function getValueList<T>(field: FieldMetadata<T>): T[];
297
302
  export declare function getValueList<T>(type: ClassType<T>): T[];
298
303
  export declare const storableMember: unique symbol;
299
304
  export declare const fieldOptionalValuesFunctionKey: unique symbol;
300
- export declare function buildOptions<entityType = any, valueType = any>(options: (FieldOptions<entityType, valueType> | ((options: FieldOptions<entityType, valueType>, remult: Remult) => void))[], remult: Remult): FieldOptions<entityType, valueType>;
301
- export declare function decorateColumnSettings<valueType>(settings: FieldOptions<any, valueType>, remult: Remult): FieldOptions<any, valueType>;
305
+ export declare function buildOptions<entityType = unknown, valueType = unknown>(options: (FieldOptions<entityType, valueType> | ((options: FieldOptions<entityType, valueType>, remult: Remult) => void))[], remult: Remult): FieldOptions<entityType, valueType>;
306
+ export declare function decorateColumnSettings<valueType>(settings: FieldOptions<unknown, valueType>, remult: Remult): FieldOptions<unknown, valueType>;
302
307
  export declare class EntityBase {
303
308
  get _(): EntityRefForEntityBase<this>;
304
309
  save(): Promise<this>;
@@ -317,7 +322,7 @@ export declare class ControllerBase {
317
322
  declare class SubscribableImp implements Subscribable {
318
323
  reportChanged(): void;
319
324
  reportObserved(): void;
320
- private _subscribers;
325
+ private _subscribers?;
321
326
  subscribe(listener: (() => void) | {
322
327
  reportChanged: () => void;
323
328
  reportObserved: () => void;