remult 0.22.3 → 0.22.4
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/esm/angular/interfaces/index.d.ts +1 -0
- package/esm/angular/interfaces/index.js +1 -0
- package/esm/angular/interfaces/src/column-collection.d.ts +70 -0
- package/esm/angular/interfaces/src/column-collection.js +341 -0
- package/esm/angular/interfaces/src/data-area-settings.d.ts +15 -0
- package/esm/angular/interfaces/src/data-area-settings.js +35 -0
- package/esm/angular/interfaces/src/data-control-interfaces.d.ts +36 -0
- package/esm/angular/interfaces/src/data-control-interfaces.js +57 -0
- package/esm/angular/interfaces/src/dataList.d.ts +13 -0
- package/esm/angular/interfaces/src/dataList.js +42 -0
- package/esm/angular/interfaces/src/filter-helper.d.ts +13 -0
- package/esm/angular/interfaces/src/filter-helper.js +59 -0
- package/esm/angular/interfaces/src/grid-settings.d.ts +145 -0
- package/esm/angular/interfaces/src/grid-settings.js +387 -0
- package/esm/angular/interfaces/src/public_api.d.ts +4 -0
- package/esm/angular/interfaces/src/public_api.js +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.d.ts +4 -0
- package/esm/angular/src/angular/RemultAngularPluginsService.js +3 -0
- package/esm/angular/src/angular/data-control/data-control2.component.d.ts +49 -0
- package/esm/angular/src/angular/data-control/data-control2.component.js +138 -0
- package/esm/core/SseSubscriptionServer.d.ts +33 -0
- package/esm/core/SseSubscriptionServer.js +107 -0
- package/esm/core/assign.d.ts +1 -0
- package/esm/core/assign.js +5 -0
- package/esm/core/classType.d.ts +3 -0
- package/esm/core/classType.js +1 -0
- package/esm/core/index.d.ts +27 -0
- package/esm/core/index.js +25 -0
- package/esm/core/inputTypes.d.ts +9 -0
- package/esm/core/inputTypes.js +9 -0
- package/esm/core/live-query/data-provider-live-query-storage.d.ts +22 -0
- package/esm/core/live-query/data-provider-live-query-storage.js +71 -0
- package/esm/core/postgres/index.d.ts +2 -0
- package/esm/core/postgres/index.js +2 -0
- package/esm/core/postgres/postgres-data-provider.d.ts +36 -0
- package/esm/core/postgres/postgres-data-provider.js +120 -0
- package/esm/core/postgres/schema-builder.d.ts +17 -0
- package/esm/core/postgres/schema-builder.js +153 -0
- package/esm/core/remult-fresh.d.ts +17 -0
- package/esm/core/remult-fresh.js +29 -0
- package/esm/core/remult-knex/index.d.ts +30 -0
- package/esm/core/remult-knex/index.js +446 -0
- package/esm/core/remult-mongo.d.ts +24 -0
- package/esm/core/remult-mongo.js +254 -0
- package/esm/core/server/JsonEntityFileStorage.d.ts +10 -0
- package/esm/core/server/JsonEntityFileStorage.js +25 -0
- package/esm/core/server/core.d.ts +4 -0
- package/esm/core/server/core.js +4 -0
- package/esm/core/server/expressBridge.d.ts +182 -0
- package/esm/core/server/expressBridge.js +938 -0
- package/esm/core/server/index.d.ts +6 -0
- package/esm/core/server/index.js +9 -0
- package/esm/core/server/initAsyncHooks.d.ts +1 -0
- package/esm/core/server/initAsyncHooks.js +9 -0
- package/esm/core/server/initDataProvider.d.ts +2 -0
- package/esm/core/server/initDataProvider.js +14 -0
- package/esm/core/src/__EntityValueProvider.d.ts +11 -0
- package/esm/core/src/__EntityValueProvider.js +1 -0
- package/esm/core/src/__RowsOfDataForTesting.d.ts +3 -0
- package/esm/core/src/__RowsOfDataForTesting.js +1 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +6 -0
- package/esm/core/src/backend-tests/backend-database-test-setup.backend-spec.js +147 -0
- package/{src → esm/core/src}/backend-tests/my-test.backend-spec.d.ts +1 -1
- package/esm/core/src/backend-tests/my-test.backend-spec.js +197 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.d.ts +1 -0
- package/esm/core/src/backend-tests/test-http-server.backend-spec.js +167 -0
- package/esm/core/src/buildRestDataProvider.d.ts +31 -0
- package/esm/core/src/buildRestDataProvider.js +113 -0
- package/esm/core/src/column-interfaces.d.ts +154 -0
- package/esm/core/src/column-interfaces.js +7 -0
- package/esm/core/src/column.d.ts +58 -0
- package/esm/core/src/column.js +174 -0
- package/esm/core/src/context.d.ts +134 -0
- package/esm/core/src/context.js +286 -0
- package/esm/core/src/data-api.d.ts +39 -0
- package/esm/core/src/data-api.js +279 -0
- package/esm/core/src/data-interfaces.d.ts +41 -0
- package/esm/core/src/data-interfaces.js +12 -0
- package/esm/core/src/data-providers/array-entity-data-provider.d.ts +22 -0
- package/esm/core/src/data-providers/array-entity-data-provider.js +252 -0
- package/esm/core/src/data-providers/in-memory-database.d.ts +9 -0
- package/esm/core/src/data-providers/in-memory-database.js +14 -0
- package/esm/core/src/data-providers/json-data-provider.d.ts +12 -0
- package/esm/core/src/data-providers/json-data-provider.js +55 -0
- package/esm/core/src/data-providers/rest-data-provider.d.ts +49 -0
- package/esm/core/src/data-providers/rest-data-provider.js +256 -0
- package/esm/core/src/data-providers/sql-database.d.ts +33 -0
- package/esm/core/src/data-providers/sql-database.js +384 -0
- package/esm/core/src/data-providers/web-sql-data-provider.d.ts +24 -0
- package/esm/core/src/data-providers/web-sql-data-provider.js +143 -0
- package/esm/core/src/entity.d.ts +91 -0
- package/esm/core/src/entity.js +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-sql-request.js +150 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
- package/esm/core/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
- package/esm/core/src/filter/filter-interfaces.d.ts +85 -0
- package/esm/core/src/filter/filter-interfaces.js +477 -0
- package/esm/core/src/live-query/LiveQueryClient.d.ts +20 -0
- package/esm/core/src/live-query/LiveQueryClient.js +188 -0
- package/esm/core/src/live-query/SseSubscriptionClient.d.ts +5 -0
- package/esm/core/src/live-query/SseSubscriptionClient.js +86 -0
- package/esm/core/src/live-query/SubscriptionChannel.d.ts +72 -0
- package/esm/core/src/live-query/SubscriptionChannel.js +123 -0
- package/esm/core/src/live-query/SubscriptionServer.d.ts +53 -0
- package/esm/core/src/live-query/SubscriptionServer.js +111 -0
- package/esm/core/src/live-query/live-query-tests.spec.d.ts +6 -0
- package/esm/core/src/live-query/live-query-tests.spec.js +952 -0
- package/esm/core/src/remult-proxy.d.ts +35 -0
- package/esm/core/src/remult-proxy.js +113 -0
- package/esm/core/src/remult3/DecoratorReplacer.d.ts +10 -0
- package/esm/core/src/remult3/DecoratorReplacer.js +20 -0
- package/esm/core/src/remult3/RepositoryImplementation.d.ts +355 -0
- package/esm/core/src/remult3/RepositoryImplementation.js +2109 -0
- package/esm/core/src/remult3/index.d.ts +2 -0
- package/esm/core/src/remult3/index.js +2 -0
- package/esm/core/src/remult3/remult3.d.ts +395 -0
- package/esm/core/src/remult3/remult3.js +2 -0
- package/esm/core/src/server-action.d.ts +81 -0
- package/esm/core/src/server-action.js +394 -0
- package/esm/core/src/shared-tests/db-tests-setup.d.ts +32 -0
- package/esm/core/src/shared-tests/db-tests-setup.js +78 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.d.ts +25 -0
- package/esm/core/src/shared-tests/db-tests.db-tests.js +810 -0
- package/esm/core/src/shared-tests/deleteAll.d.ts +2 -0
- package/esm/core/src/shared-tests/deleteAll.js +4 -0
- package/esm/core/src/shared-tests/entityWithValidations.d.ts +14 -0
- package/esm/core/src/shared-tests/entityWithValidations.js +43 -0
- package/esm/core/src/shared-tests/index.d.ts +4 -0
- package/esm/core/src/shared-tests/index.js +4 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-custom-id-column.spec.js +67 -0
- package/esm/core/src/shared-tests/test-special-value.spec.d.ts +10 -0
- package/esm/core/src/shared-tests/test-special-value.spec.js +73 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
- package/esm/core/src/shared-tests/test-update-with-null.spec.js +31 -0
- package/esm/core/src/sort.d.ts +16 -0
- package/esm/core/src/sort.js +103 -0
- package/esm/core/src/sql-command.d.ts +19 -0
- package/esm/core/src/sql-command.js +1 -0
- package/esm/core/src/test.d.ts +3 -0
- package/esm/core/src/test.js +12 -0
- package/esm/core/src/tests/Done.d.ts +5 -0
- package/esm/core/src/tests/Done.js +9 -0
- package/esm/core/src/tests/RowProvider.spec.d.ts +16 -0
- package/esm/core/src/tests/RowProvider.spec.js +631 -0
- package/esm/core/src/tests/TestDataApiResponse.d.ts +10 -0
- package/esm/core/src/tests/TestDataApiResponse.js +22 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.d.ts +8 -0
- package/esm/core/src/tests/basicRowFunctionality.spec.js +2103 -0
- package/esm/core/src/tests/c.d.ts +8 -0
- package/esm/core/src/tests/c.js +13 -0
- package/esm/core/src/tests/createData.d.ts +7 -0
- package/esm/core/src/tests/createData.js +22 -0
- package/esm/core/src/tests/d.d.ts +6 -0
- package/esm/core/src/tests/d.js +11 -0
- package/esm/core/src/tests/dWithPrefilter.d.ts +7 -0
- package/esm/core/src/tests/dWithPrefilter.js +18 -0
- package/esm/core/src/tests/entityForCustomFilter.d.ts +16 -0
- package/esm/core/src/tests/entityForCustomFilter.js +33 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
- package/esm/core/src/tests/entityWithValidationsOnColumn.js +13 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
- package/esm/core/src/tests/frontend-database-tests-setup.spec.js +37 -0
- package/esm/core/src/tests/h.d.ts +6 -0
- package/esm/core/src/tests/h.js +24 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.d.ts +1 -0
- package/esm/core/src/tests/remult-3-basic-tests.spec.js +236 -0
- package/esm/core/src/tests/remult-3-entities.d.ts +23 -0
- package/esm/core/src/tests/remult-3-entities.js +39 -0
- package/esm/core/src/tests/tasks.d.ts +6 -0
- package/esm/core/src/tests/tasks.js +10 -0
- package/esm/core/src/tests/test-context-as-storage.spec.d.ts +0 -0
- package/esm/core/src/tests/test-context-as-storage.spec.js +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.d.ts +1 -0
- package/esm/core/src/tests/test-data-api/predefined-filter.spec.js +389 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.d.ts +5 -0
- package/esm/core/src/tests/test-data-api/test-put-with-validation.spec.js +152 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.d.ts +1 -0
- package/esm/core/src/tests/test-decorator-precedence.spec.js +38 -0
- package/esm/core/src/tests/test-default-value.spec.d.ts +1 -0
- package/esm/core/src/tests/test-default-value.spec.js +33 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.d.ts +14 -0
- package/esm/core/src/tests/test-entity-inheritance.spec.js +82 -0
- package/esm/core/src/tests/test-exceptions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-exceptions.spec.js +375 -0
- package/esm/core/src/tests/test-json.spec.d.ts +1 -0
- package/esm/core/src/tests/test-json.spec.js +115 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.d.ts +9 -0
- package/esm/core/src/tests/test-many-to-one-relation-in-entity.spec.js +809 -0
- package/esm/core/src/tests/test-non-active-record.spec.d.ts +1 -0
- package/esm/core/src/tests/test-non-active-record.spec.js +66 -0
- package/esm/core/src/tests/test-object-column.spec.d.ts +1 -0
- package/esm/core/src/tests/test-object-column.spec.js +189 -0
- package/esm/core/src/tests/test-paged-foreach.spec.d.ts +1 -0
- package/esm/core/src/tests/test-paged-foreach.spec.js +328 -0
- package/esm/core/src/tests/test-remult-angular.spec.d.ts +1 -0
- package/esm/core/src/tests/test-remult-angular.spec.js +23 -0
- package/esm/core/src/tests/test-server-controller.spec.d.ts +7 -0
- package/esm/core/src/tests/test-server-controller.spec.js +489 -0
- package/esm/core/src/tests/test-server-expressions.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-expressions.spec.js +178 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.d.ts +1 -0
- package/esm/core/src/tests/test-server-method-on-entity.spec.js +306 -0
- package/esm/core/src/tests/test-sql-expression.spec.d.ts +5 -0
- package/esm/core/src/tests/test-sql-expression.spec.js +205 -0
- package/esm/core/src/tests/test-sql.spec.d.ts +1 -0
- package/esm/core/src/tests/test-sql.spec.js +170 -0
- package/esm/core/src/tests/test-subscribe.spec.d.ts +1 -0
- package/esm/core/src/tests/test-subscribe.spec.js +135 -0
- package/esm/core/src/tests/test-type-recovery.spec.d.ts +1 -0
- package/esm/core/src/tests/test-type-recovery.spec.js +49 -0
- package/esm/core/src/tests/test-where-api.spec.d.ts +1 -0
- package/esm/core/src/tests/test-where-api.spec.js +434 -0
- package/esm/core/src/tests/testHelper.spec.d.ts +36 -0
- package/esm/core/src/tests/testHelper.spec.js +226 -0
- package/esm/core/src/tests/testModel/models.d.ts +16 -0
- package/esm/core/src/tests/testModel/models.js +25 -0
- package/esm/core/src/validators.d.ts +14 -0
- package/esm/core/src/validators.js +33 -0
- package/{valueConverters.d.ts → esm/core/src/valueConverters.d.ts} +13 -12
- package/esm/core/src/valueConverters.js +197 -0
- package/esm/core/urlBuilder.d.ts +6 -0
- package/esm/core/urlBuilder.js +20 -0
- package/esm/graphql.js +27 -27
- package/esm/postgres/schema-builder.js +4 -4
- package/esm/src/remult3/RepositoryImplementation.d.ts +1 -1
- package/esm/src/remult3/RepositoryImplementation.js +27 -4
- package/esm/src/shared-tests/db-tests.db-tests.js +57 -0
- package/esm/test-servers/shared/Task.d.ts +9 -0
- package/esm/test-servers/shared/Task.js +32 -0
- package/esm/test.d.ts +5 -0
- package/esm/test.js +6 -0
- package/package.json +1 -1
- package/src/remult3/RepositoryImplementation.d.ts +1 -1
- package/src/remult3/RepositoryImplementation.js +88 -63
- package/src/shared-tests/db-tests.db-tests.js +97 -0
- package/esm/src/id-entity.d.ts +0 -4
- package/esm/src/id-entity.js +0 -8
- package/postgres/postgresColumnSyntax.d.ts +0 -2
- package/postgres/postgresColumnSyntax.js +0 -34
- package/remult-middleware.d.ts +0 -2
- package/remult-middleware.js +0 -70
- package/server/register-actions-on-server.d.ts +0 -3
- package/server/register-actions-on-server.js +0 -50
- package/server/register-entities-on-server.d.ts +0 -3
- package/server/register-entities-on-server.js +0 -19
- package/src/backend-tests/my-test.backend-spec.js +0 -217
- package/src/backend-tests/test-http-server.backend-spec.d.ts +0 -6
- package/src/backend-tests/test-http-server.backend-spec.js +0 -342
- package/src/id-entity.d.ts +0 -4
- package/src/id-entity.js +0 -17
- package/valueConverters.js +0 -168
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { ClassType } from "../../classType";
|
|
2
|
+
import { FieldMetadata } from "../column-interfaces";
|
|
3
|
+
import { LiveQueryChange, SubscriptionListener, Unsubscribe } from "../live-query/SubscriptionChannel";
|
|
4
|
+
import { EntityOptions } from "../entity";
|
|
5
|
+
import { SortSegment } from "../sort";
|
|
6
|
+
import { entityEventListener } from "../__EntityValueProvider";
|
|
7
|
+
import { ErrorInfo } from "../..";
|
|
8
|
+
export interface EntityRef<entityType> extends Subscribable {
|
|
9
|
+
hasErrors(): boolean;
|
|
10
|
+
undoChanges(): any;
|
|
11
|
+
save(): Promise<entityType>;
|
|
12
|
+
reload(): Promise<entityType>;
|
|
13
|
+
delete(): Promise<void>;
|
|
14
|
+
isNew(): boolean;
|
|
15
|
+
wasChanged(): boolean;
|
|
16
|
+
wasDeleted(): boolean;
|
|
17
|
+
fields: FieldsRef<entityType>;
|
|
18
|
+
error: string;
|
|
19
|
+
getId(): idType<entityType>;
|
|
20
|
+
getOriginalId(): idType<entityType>;
|
|
21
|
+
repository: Repository<entityType>;
|
|
22
|
+
metadata: EntityMetadata<entityType>;
|
|
23
|
+
toApiJson(): any;
|
|
24
|
+
validate(): Promise<ErrorInfo<entityType> | undefined>;
|
|
25
|
+
readonly apiUpdateAllowed: boolean;
|
|
26
|
+
readonly apiDeleteAllowed: boolean;
|
|
27
|
+
readonly apiInsertAllowed: boolean;
|
|
28
|
+
readonly isLoading: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ControllerRef<entityType> extends Subscribable {
|
|
31
|
+
hasErrors(): boolean;
|
|
32
|
+
fields: FieldsRef<entityType>;
|
|
33
|
+
error: string;
|
|
34
|
+
validate(): Promise<ErrorInfo<entityType> | undefined>;
|
|
35
|
+
readonly isLoading: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface RefSubscriberBase {
|
|
38
|
+
reportChanged: () => void;
|
|
39
|
+
reportObserved: () => void;
|
|
40
|
+
}
|
|
41
|
+
export declare type RefSubscriber = (() => void) | RefSubscriberBase;
|
|
42
|
+
export interface Subscribable {
|
|
43
|
+
subscribe(listener: RefSubscriber): Unsubscribe;
|
|
44
|
+
}
|
|
45
|
+
export type FieldsRef<entityType> = {
|
|
46
|
+
[Properties in keyof OmitEB<entityType>]: entityType[Properties] extends {
|
|
47
|
+
id?: (number | string);
|
|
48
|
+
} ? IdFieldRef<entityType, entityType[Properties]> : FieldRef<entityType, entityType[Properties]>;
|
|
49
|
+
} & {
|
|
50
|
+
find(fieldMetadataOrKey: FieldMetadata | string): FieldRef<entityType, any>;
|
|
51
|
+
[Symbol.iterator]: () => IterableIterator<FieldRef<entityType, any>>;
|
|
52
|
+
toArray(): FieldRef<entityType, any>[];
|
|
53
|
+
};
|
|
54
|
+
export type FieldsMetadata<entityType> = {
|
|
55
|
+
[Properties in keyof OmitEB<entityType>]: FieldMetadata<entityType[Properties], entityType>;
|
|
56
|
+
} & {
|
|
57
|
+
find(fieldMetadataOrKey: FieldMetadata | string): FieldMetadata<any, entityType>;
|
|
58
|
+
[Symbol.iterator]: () => IterableIterator<FieldMetadata<any, entityType>>;
|
|
59
|
+
toArray(): FieldMetadata<any, entityType>[];
|
|
60
|
+
};
|
|
61
|
+
export type SortSegments<entityType> = {
|
|
62
|
+
[Properties in keyof entityType]: SortSegment & {
|
|
63
|
+
descending(): SortSegment;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
export interface IdFieldRef<entityType, valueType> extends FieldRef<entityType, valueType> {
|
|
67
|
+
setId(id: valueType extends {
|
|
68
|
+
id?: number;
|
|
69
|
+
} ? number : valueType extends {
|
|
70
|
+
id?: string;
|
|
71
|
+
} ? string : (string | number)): any;
|
|
72
|
+
getId(): (valueType extends {
|
|
73
|
+
id?: number;
|
|
74
|
+
} ? number : valueType extends {
|
|
75
|
+
id?: string;
|
|
76
|
+
} ? string : (string | number));
|
|
77
|
+
}
|
|
78
|
+
export interface FieldRef<entityType = any, valueType = any> extends Subscribable {
|
|
79
|
+
error: string;
|
|
80
|
+
displayValue: string;
|
|
81
|
+
value: valueType;
|
|
82
|
+
originalValue: valueType;
|
|
83
|
+
inputValue: string;
|
|
84
|
+
valueChanged(): boolean;
|
|
85
|
+
entityRef: EntityRef<entityType>;
|
|
86
|
+
container: entityType;
|
|
87
|
+
metadata: FieldMetadata<valueType>;
|
|
88
|
+
load(): Promise<valueType>;
|
|
89
|
+
valueIsNull(): boolean;
|
|
90
|
+
originalValueIsNull(): boolean;
|
|
91
|
+
validate(): Promise<boolean>;
|
|
92
|
+
}
|
|
93
|
+
export interface IdMetadata<entityType = any> {
|
|
94
|
+
/** Extracts the id value of an entity item. Useful in cases where the id column is not called id
|
|
95
|
+
* @example
|
|
96
|
+
* repo.metadata.idMetadata.getId(task)
|
|
97
|
+
*/
|
|
98
|
+
getId(item: Partial<OmitEB<entityType>>): any;
|
|
99
|
+
field: FieldMetadata<any>;
|
|
100
|
+
getIdFilter(...ids: any[]): EntityFilter<entityType>;
|
|
101
|
+
isIdField(col: FieldMetadata): boolean;
|
|
102
|
+
createIdInFilter(items: Partial<OmitEB<entityType>>[]): EntityFilter<entityType>;
|
|
103
|
+
}
|
|
104
|
+
/** Metadata for an `Entity`, this metadata can be used in the user interface to provide a richer UI experience */
|
|
105
|
+
export interface EntityMetadata<entityType = any> {
|
|
106
|
+
/** The Entity's key also used as it's url */
|
|
107
|
+
readonly key: string;
|
|
108
|
+
/** Metadata for the Entity's fields */
|
|
109
|
+
readonly fields: FieldsMetadata<entityType>;
|
|
110
|
+
/** A human readable caption for the entity. Can be used to achieve a consistent caption for a field throughout the app
|
|
111
|
+
* @example
|
|
112
|
+
* <h1>Create a new item in {taskRepo.metadata.caption}</h1>
|
|
113
|
+
*/
|
|
114
|
+
readonly caption: string;
|
|
115
|
+
/** The options send to the `Entity`'s decorator */
|
|
116
|
+
readonly options: EntityOptions;
|
|
117
|
+
/** The class type of the entity */
|
|
118
|
+
readonly entityType: ClassType<entityType>;
|
|
119
|
+
/** true if the current user is allowed to update an entity instance
|
|
120
|
+
* @example
|
|
121
|
+
* const taskRepo = remult.repo(Task);
|
|
122
|
+
* if (taskRepo.metadata.apiUpdateAllowed(task)){
|
|
123
|
+
* // Allow user to edit the entity
|
|
124
|
+
* }
|
|
125
|
+
*/
|
|
126
|
+
apiUpdateAllowed(item?: entityType): boolean;
|
|
127
|
+
/** true if the current user is allowed to read from entity
|
|
128
|
+
* @example
|
|
129
|
+
* const taskRepo = remult.repo(Task);
|
|
130
|
+
* if (taskRepo.metadata.apiReadAllowed){
|
|
131
|
+
* await taskRepo.find()
|
|
132
|
+
* }
|
|
133
|
+
*/
|
|
134
|
+
readonly apiReadAllowed: boolean;
|
|
135
|
+
/** true if the current user is allowed to delete an entity instance
|
|
136
|
+
* @example
|
|
137
|
+
* const taskRepo = remult.repo(Task);
|
|
138
|
+
* if (taskRepo.metadata.apiDeleteAllowed(task)){
|
|
139
|
+
* // display delete button
|
|
140
|
+
* }
|
|
141
|
+
*/
|
|
142
|
+
apiDeleteAllowed(item?: entityType): boolean;
|
|
143
|
+
/** true if the current user is allowed to create an entity instance
|
|
144
|
+
* @example
|
|
145
|
+
* const taskRepo = remult.repo(Task);
|
|
146
|
+
* if (taskRepo.metadata.apiInsertAllowed(task)){
|
|
147
|
+
* // display insert button
|
|
148
|
+
* }
|
|
149
|
+
*/
|
|
150
|
+
apiInsertAllowed(item?: entityType): boolean;
|
|
151
|
+
/** Returns the dbName - based on it's `dbName` option and it's `sqlExpression` option */
|
|
152
|
+
getDbName(): Promise<string>;
|
|
153
|
+
/** Metadata for the Entity's id */
|
|
154
|
+
readonly idMetadata: IdMetadata<entityType>;
|
|
155
|
+
}
|
|
156
|
+
export declare type OmitEB<T> = Omit<T, keyof import('./RepositoryImplementation').EntityBase>;
|
|
157
|
+
export declare type idType<entityType> = entityType extends {
|
|
158
|
+
id?: number;
|
|
159
|
+
} ? number : entityType extends {
|
|
160
|
+
id?: string;
|
|
161
|
+
} ? string : (string | number);
|
|
162
|
+
/**used to perform CRUD operations on an `entityType` */
|
|
163
|
+
export interface Repository<entityType> {
|
|
164
|
+
/** returns a result array based on the provided options */
|
|
165
|
+
find(options?: FindOptions<entityType>): Promise<entityType[]>;
|
|
166
|
+
/** returns a result array based on the provided options */
|
|
167
|
+
liveQuery(options?: FindOptions<entityType>): LiveQuery<entityType>;
|
|
168
|
+
/** returns the first item that matchers the `where` condition
|
|
169
|
+
* @example
|
|
170
|
+
* await taskRepo.findFirst({ completed:false })
|
|
171
|
+
* @example
|
|
172
|
+
* await taskRepo.findFirst({ completed:false },{ createIfNotFound: true })
|
|
173
|
+
* */
|
|
174
|
+
findFirst(where?: EntityFilter<entityType>, options?: FindFirstOptions<entityType>): Promise<entityType>;
|
|
175
|
+
/** returns the items that matches the idm the result is cached unless specified differently in the `options` parameter */
|
|
176
|
+
findId(id: idType<entityType>, options?: FindFirstOptionsBase<entityType>): Promise<entityType>;
|
|
177
|
+
/** An alternative form of fetching data from the API server, which is intended for operating on large numbers of entity objects.
|
|
178
|
+
*
|
|
179
|
+
* It also has it's own paging mechanism that can be used n paging scenarios.
|
|
180
|
+
*
|
|
181
|
+
* The `query` method doesn't return an array (as the `find` method) and instead returns an `iterable` `QueryResult` object
|
|
182
|
+
* which supports iterations using the JavaScript `for await` statement.
|
|
183
|
+
* @example
|
|
184
|
+
* for await (const task of taskRepo.query()) {
|
|
185
|
+
* // do something.
|
|
186
|
+
* }
|
|
187
|
+
* */
|
|
188
|
+
query(options?: QueryOptions<entityType>): QueryResult<entityType>;
|
|
189
|
+
/** Returns a count of the items matching the criteria.
|
|
190
|
+
* @see [EntityFilter](http://remult.dev/docs/entityFilter.html)
|
|
191
|
+
* @example
|
|
192
|
+
* await taskRepo.count({ completed:false })
|
|
193
|
+
*/
|
|
194
|
+
count(where?: EntityFilter<entityType>): Promise<number>;
|
|
195
|
+
/**Validates an item
|
|
196
|
+
* @example
|
|
197
|
+
* const error = repo.validate(task);
|
|
198
|
+
* if (error){
|
|
199
|
+
* alert(error.message);
|
|
200
|
+
* alert(error.modelState.title);//shows the specific error for the title field
|
|
201
|
+
* }
|
|
202
|
+
* // Can also be used to validate specific fields
|
|
203
|
+
* const error = repo.validate(task,"title")
|
|
204
|
+
*/
|
|
205
|
+
validate(item: Partial<entityType>, ...fields: (Extract<keyof OmitEB<entityType>, string>)[]): Promise<ErrorInfo<entityType> | undefined>;
|
|
206
|
+
/** saves an item or item[] to the data source. It assumes that if an `id` value exists, it's an existing row - otherwise it's a new row
|
|
207
|
+
* @example
|
|
208
|
+
* await taskRepo.save({...task, completed:true })
|
|
209
|
+
*/
|
|
210
|
+
save(item: Partial<OmitEB<entityType>>[]): Promise<entityType[]>;
|
|
211
|
+
save(item: Partial<OmitEB<entityType>>): Promise<entityType>;
|
|
212
|
+
/**Insert an item or item[] to the data source
|
|
213
|
+
* @example
|
|
214
|
+
* await taskRepo.insert({title:"task a"})
|
|
215
|
+
* @example
|
|
216
|
+
* await taskRepo.insert([{title:"task a"}, {title:"task b", completed:true }])
|
|
217
|
+
*/
|
|
218
|
+
insert(item: Partial<OmitEB<entityType>>[]): Promise<entityType[]>;
|
|
219
|
+
insert(item: Partial<OmitEB<entityType>>): Promise<entityType>;
|
|
220
|
+
/** Updates an item, based on its `id`
|
|
221
|
+
* @example
|
|
222
|
+
* taskRepo.update(task.id,{...task,completed:true})
|
|
223
|
+
*/
|
|
224
|
+
update(id: (entityType extends {
|
|
225
|
+
id?: number;
|
|
226
|
+
} ? number : entityType extends {
|
|
227
|
+
id?: string;
|
|
228
|
+
} ? string : (string | number)), item: Partial<OmitEB<entityType>>): Promise<entityType>;
|
|
229
|
+
update(id: Partial<OmitEB<entityType>>, item: Partial<OmitEB<entityType>>): Promise<entityType>;
|
|
230
|
+
/** Deletes an Item*/
|
|
231
|
+
delete(id: (entityType extends {
|
|
232
|
+
id?: number;
|
|
233
|
+
} ? number : entityType extends {
|
|
234
|
+
id?: string;
|
|
235
|
+
} ? string : (string | number))): Promise<void>;
|
|
236
|
+
delete(item: Partial<OmitEB<entityType>>): Promise<void>;
|
|
237
|
+
/** Creates an instance of an item. It'll not be saved to the data source unless `save` or `insert` will be called for that item */
|
|
238
|
+
create(item?: Partial<OmitEB<entityType>>): entityType;
|
|
239
|
+
toJson(item: entityType[]): any[];
|
|
240
|
+
toJson(item: entityType): any;
|
|
241
|
+
/** Translates a json object to an item instance */
|
|
242
|
+
fromJson(x: any[], isNew?: boolean): entityType[];
|
|
243
|
+
fromJson(x: any, isNew?: boolean): entityType;
|
|
244
|
+
/** returns an `entityRef` for an item returned by `create`, `find` etc... */
|
|
245
|
+
getEntityRef(item: entityType): EntityRef<entityType>;
|
|
246
|
+
/** Provides information about the fields of the Repository's entity
|
|
247
|
+
* @example
|
|
248
|
+
* console.log(repo.fields.title.caption) // displays the caption of a specific field
|
|
249
|
+
* console.log(repo.fields.title.options)// writes the options that were defined for this field
|
|
250
|
+
*/
|
|
251
|
+
fields: FieldsMetadata<entityType>;
|
|
252
|
+
/**The metadata for the `entity`
|
|
253
|
+
* @See [EntityMetadata](https://remult.dev/docs/ref_entitymetadata.html)
|
|
254
|
+
*/
|
|
255
|
+
metadata: EntityMetadata<entityType>;
|
|
256
|
+
addEventListener(listener: entityEventListener<entityType>): Unsubscribe;
|
|
257
|
+
}
|
|
258
|
+
export interface LiveQuery<entityType> {
|
|
259
|
+
subscribe(next: (info: LiveQueryChangeInfo<entityType>) => void): Unsubscribe;
|
|
260
|
+
subscribe(listener: Partial<SubscriptionListener<LiveQueryChangeInfo<entityType>>>): Unsubscribe;
|
|
261
|
+
}
|
|
262
|
+
export interface LiveQueryChangeInfo<entityType> {
|
|
263
|
+
items: entityType[];
|
|
264
|
+
changes: LiveQueryChange[];
|
|
265
|
+
applyChanges(prevState: entityType[]): entityType[];
|
|
266
|
+
}
|
|
267
|
+
export interface FindOptions<entityType> extends FindOptionsBase<entityType> {
|
|
268
|
+
/** Determines the number of rows returned by the request, on the browser the default is 100 rows
|
|
269
|
+
* @example
|
|
270
|
+
* await this.remult.repo(Products).find({
|
|
271
|
+
* limit:10,
|
|
272
|
+
* page:2
|
|
273
|
+
* })
|
|
274
|
+
*/
|
|
275
|
+
limit?: number;
|
|
276
|
+
/** Determines the page number that will be used to extract the data
|
|
277
|
+
* @example
|
|
278
|
+
* await this.remult.repo(Products).find({
|
|
279
|
+
* limit:10,
|
|
280
|
+
* page:2
|
|
281
|
+
* })
|
|
282
|
+
*/
|
|
283
|
+
page?: number;
|
|
284
|
+
}
|
|
285
|
+
/** Determines the order of items returned .
|
|
286
|
+
* @example
|
|
287
|
+
* await this.remult.repo(Products).find({ orderBy: { name: "asc" }})
|
|
288
|
+
* @example
|
|
289
|
+
* await this.remult.repo(Products).find({ orderBy: { price: "desc", name: "asc" }})
|
|
290
|
+
*/
|
|
291
|
+
export declare type EntityOrderBy<entityType> = {
|
|
292
|
+
[Properties in keyof Partial<OmitEB<entityType>>]?: "asc" | "desc";
|
|
293
|
+
};
|
|
294
|
+
/**Used to filter the desired result set
|
|
295
|
+
* @see [EntityFilter](http://remult.dev/docs/entityFilter.html)
|
|
296
|
+
*/
|
|
297
|
+
export declare type EntityFilter<entityType> = {
|
|
298
|
+
[Properties in keyof Partial<OmitEB<entityType>>]?: (Partial<OmitEB<entityType>>[Properties] extends (number | Date | undefined) ? ComparisonValueFilter<Partial<OmitEB<entityType>>[Properties]> : Partial<OmitEB<entityType>>[Properties] extends (string | undefined) ? ContainsStringValueFilter & ComparisonValueFilter<string> : Partial<OmitEB<entityType>>[Properties] extends (boolean | undefined) ? ValueFilter<boolean> : Partial<OmitEB<entityType>>[Properties] extends ({
|
|
299
|
+
id?: (string | number);
|
|
300
|
+
} | undefined) ? IdFilter<Partial<OmitEB<entityType>>[Properties]> : ValueFilter<Partial<OmitEB<entityType>>[Properties]>) & ContainsStringValueFilter;
|
|
301
|
+
} & {
|
|
302
|
+
$or?: EntityFilter<entityType>[];
|
|
303
|
+
$and?: EntityFilter<entityType>[];
|
|
304
|
+
};
|
|
305
|
+
export type ValueFilter<valueType> = valueType | valueType[] | {
|
|
306
|
+
$ne?: valueType | valueType[];
|
|
307
|
+
"!="?: valueType | valueType[];
|
|
308
|
+
$in?: valueType[];
|
|
309
|
+
$nin?: valueType[];
|
|
310
|
+
};
|
|
311
|
+
export type ComparisonValueFilter<valueType> = ValueFilter<valueType> & {
|
|
312
|
+
$gt?: valueType;
|
|
313
|
+
">"?: valueType;
|
|
314
|
+
$gte?: valueType;
|
|
315
|
+
">="?: valueType;
|
|
316
|
+
$lt?: valueType;
|
|
317
|
+
"<"?: valueType;
|
|
318
|
+
$lte?: valueType;
|
|
319
|
+
"<="?: valueType;
|
|
320
|
+
};
|
|
321
|
+
export interface ContainsStringValueFilter {
|
|
322
|
+
$contains?: string;
|
|
323
|
+
}
|
|
324
|
+
export type IdFilter<valueType> = ValueFilter<valueType> | {
|
|
325
|
+
$id: ValueFilter<valueType extends {
|
|
326
|
+
id?: number;
|
|
327
|
+
} ? number : string>;
|
|
328
|
+
};
|
|
329
|
+
export interface LoadOptions<entityType> {
|
|
330
|
+
load?: (entity: FieldsMetadata<entityType>) => FieldMetadata[];
|
|
331
|
+
}
|
|
332
|
+
export interface FindOptionsBase<entityType> extends LoadOptions<entityType> {
|
|
333
|
+
/** filters the data
|
|
334
|
+
* @example
|
|
335
|
+
* await taskRepo.find({where: { completed:false }})
|
|
336
|
+
* @see For more usage examples see [EntityFilter](https://remult.dev/docs/entityFilter.html)
|
|
337
|
+
*/
|
|
338
|
+
where?: EntityFilter<entityType>;
|
|
339
|
+
/** Determines the order of items returned .
|
|
340
|
+
* @example
|
|
341
|
+
* await this.remult.repo(Products).find({ orderBy: { name: "asc" }})
|
|
342
|
+
* @example
|
|
343
|
+
* await this.remult.repo(Products).find({ orderBy: { price: "desc", name: "asc" }})
|
|
344
|
+
*/
|
|
345
|
+
orderBy?: EntityOrderBy<entityType>;
|
|
346
|
+
}
|
|
347
|
+
export interface FindFirstOptions<entityType> extends FindOptionsBase<entityType>, FindFirstOptionsBase<entityType> {
|
|
348
|
+
}
|
|
349
|
+
export interface FindFirstOptionsBase<entityType> extends LoadOptions<entityType> {
|
|
350
|
+
/** determines if to cache the result, and return the results from cache.
|
|
351
|
+
*/
|
|
352
|
+
useCache?: boolean;
|
|
353
|
+
/** If set to true and an item is not found, it's created and returned*/
|
|
354
|
+
createIfNotFound?: boolean;
|
|
355
|
+
}
|
|
356
|
+
export interface QueryOptions<entityType> extends FindOptionsBase<entityType> {
|
|
357
|
+
/** The number of items to return in each step */
|
|
358
|
+
pageSize?: number;
|
|
359
|
+
/** A callback method to indicate the progress of the iteration */
|
|
360
|
+
progress?: {
|
|
361
|
+
progress: (progress: number) => void;
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/** The result of a call to the `query` method in the `Repository` object.
|
|
365
|
+
*/
|
|
366
|
+
export interface QueryResult<entityType> {
|
|
367
|
+
/** returns an iterator that iterates the rows in the result using a paging mechanism
|
|
368
|
+
* @example
|
|
369
|
+
* for await (const task of taskRepo.query()) {
|
|
370
|
+
* await taskRepo.save({ ...task, completed });
|
|
371
|
+
* }
|
|
372
|
+
*/
|
|
373
|
+
[Symbol.asyncIterator](): {
|
|
374
|
+
next: () => Promise<IteratorResult<entityType, entityType>>;
|
|
375
|
+
};
|
|
376
|
+
/** returns the number of rows that match the query criteria */
|
|
377
|
+
count(): Promise<number>;
|
|
378
|
+
/** Returns a `Paginator` object that is used for efficient paging */
|
|
379
|
+
paginator(): Promise<Paginator<entityType>>;
|
|
380
|
+
/** gets the items in a specific page */
|
|
381
|
+
getPage(pageNumber?: number): Promise<entityType[]>;
|
|
382
|
+
/** Performs an operation on all the items matching the query criteria */
|
|
383
|
+
forEach(what: (item: entityType) => Promise<any>): Promise<number>;
|
|
384
|
+
}
|
|
385
|
+
/** An interface used to paginating using the `query` method in the `Repository` object */
|
|
386
|
+
export interface Paginator<entityType> {
|
|
387
|
+
/** the items in the current page */
|
|
388
|
+
items: entityType[];
|
|
389
|
+
/** True if next page exists */
|
|
390
|
+
hasNextPage: boolean;
|
|
391
|
+
/** Gets the next page in the `query`'s result set */
|
|
392
|
+
nextPage(): Promise<Paginator<entityType>>;
|
|
393
|
+
/** the count of the total items in the `query`'s result */
|
|
394
|
+
count(): Promise<number>;
|
|
395
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { Remult, AllowedForInstance } from './context';
|
|
3
|
+
import { DataApiResponse } from './data-api';
|
|
4
|
+
import { DataProvider, RestDataProviderHttpProvider } from './data-interfaces';
|
|
5
|
+
interface inArgs {
|
|
6
|
+
args: any[];
|
|
7
|
+
}
|
|
8
|
+
interface result {
|
|
9
|
+
data: any;
|
|
10
|
+
}
|
|
11
|
+
export declare abstract class Action<inParam, outParam> implements ActionInterface {
|
|
12
|
+
private actionUrl;
|
|
13
|
+
private queue;
|
|
14
|
+
private allowed;
|
|
15
|
+
constructor(actionUrl: string, queue: boolean, allowed: AllowedForInstance<any>);
|
|
16
|
+
static apiUrlForJobStatus: string;
|
|
17
|
+
run(pIn: inParam, baseUrl?: string, http?: RestDataProviderHttpProvider): Promise<outParam>;
|
|
18
|
+
doWork: (args: any[], self: any, baseUrl?: string, http?: RestDataProviderHttpProvider) => Promise<any>;
|
|
19
|
+
protected abstract execute(info: inParam, req: Remult, res: DataApiResponse): Promise<outParam>;
|
|
20
|
+
__register(reg: (url: string, queue: boolean, allowed: AllowedForInstance<any>, what: ((data: any, req: Remult, res: DataApiResponse) => void)) => void): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class ForbiddenError extends Error {
|
|
23
|
+
constructor();
|
|
24
|
+
isForbiddenError: true;
|
|
25
|
+
}
|
|
26
|
+
export declare class myServerAction extends Action<inArgs, result> {
|
|
27
|
+
private types;
|
|
28
|
+
private options;
|
|
29
|
+
originalMethod: (args: any[]) => any;
|
|
30
|
+
constructor(name: string, types: any[], options: BackendMethodOptions<any>, originalMethod: (args: any[]) => any);
|
|
31
|
+
protected execute(info: inArgs, remult: Remult, res: DataApiResponse): Promise<result>;
|
|
32
|
+
}
|
|
33
|
+
export interface BackendMethodOptions<type> {
|
|
34
|
+
/**Determines when this `BackendMethod` can execute, see: [Allowed](https://remult.dev/docs/allowed.html) */
|
|
35
|
+
allowed: AllowedForInstance<type>;
|
|
36
|
+
/** Used to determine the route for the BackendMethod.
|
|
37
|
+
* @example
|
|
38
|
+
* {allowed:true, apiPrefix:'someFolder/'}
|
|
39
|
+
*/
|
|
40
|
+
apiPrefix?: string;
|
|
41
|
+
/** EXPERIMENTAL: Determines if this method should be queued for later execution */
|
|
42
|
+
queue?: boolean;
|
|
43
|
+
/** EXPERIMENTAL: Determines if the user should be blocked while this `BackendMethod` is running*/
|
|
44
|
+
blockUser?: boolean;
|
|
45
|
+
paramTypes?: any[];
|
|
46
|
+
}
|
|
47
|
+
export declare const actionInfo: {
|
|
48
|
+
allActions: any[];
|
|
49
|
+
runningOnServer: boolean;
|
|
50
|
+
runActionWithoutBlockingUI: <T>(what: () => Promise<T>) => Promise<T>;
|
|
51
|
+
startBusyWithProgress: () => {
|
|
52
|
+
progress: (percent: number) => void;
|
|
53
|
+
close: () => void;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export declare const serverActionField: unique symbol;
|
|
57
|
+
export declare function Controller(key: string): (target: any, context?: any) => any;
|
|
58
|
+
/** Indicates that the decorated methods runs on the backend. See: [Backend Methods](https://remult.dev/docs/backendMethods.html) */
|
|
59
|
+
export declare function BackendMethod<type = any>(options: BackendMethodOptions<type>): (target: any, context: ClassMethodDecoratorContext<type> | string, descriptor?: any) => any;
|
|
60
|
+
export interface jobWasQueuedResult {
|
|
61
|
+
queuedJobId?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface queuedJobInfoResponse {
|
|
64
|
+
done: boolean;
|
|
65
|
+
result?: any;
|
|
66
|
+
error?: any;
|
|
67
|
+
progress?: number;
|
|
68
|
+
}
|
|
69
|
+
export declare class ProgressListener {
|
|
70
|
+
private res;
|
|
71
|
+
constructor(res: DataApiResponse);
|
|
72
|
+
progress(progress: number): void;
|
|
73
|
+
}
|
|
74
|
+
export declare function prepareArgsToSend(types: any[], args: any[]): any[];
|
|
75
|
+
export declare function prepareReceivedArgs(types: any[], args: any[], remult: Remult, ds: DataProvider, res: DataApiResponse): Promise<any[]>;
|
|
76
|
+
export declare const classBackendMethodsArray: unique symbol;
|
|
77
|
+
export interface ActionInterface {
|
|
78
|
+
doWork: (args: any[], self: any, baseUrl?: string, http?: RestDataProviderHttpProvider) => Promise<any>;
|
|
79
|
+
__register(reg: (url: string, queue: boolean, allowed: AllowedForInstance<any>, what: ((data: any, req: Remult, res: DataApiResponse) => void)) => void): any;
|
|
80
|
+
}
|
|
81
|
+
export {};
|