remult 0.14.7 → 0.14.10

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/esm/assign.d.ts +1 -0
  3. package/esm/assign.js +5 -0
  4. package/esm/classType.d.ts +3 -0
  5. package/esm/classType.js +1 -0
  6. package/esm/graphql.d.ts +5 -0
  7. package/esm/graphql.js +102 -0
  8. package/esm/index.d.ts +36 -0
  9. package/esm/index.js +30 -0
  10. package/esm/inputTypes.d.ts +9 -0
  11. package/esm/inputTypes.js +9 -0
  12. package/esm/postgres/index.d.ts +2 -0
  13. package/esm/postgres/index.js +2 -0
  14. package/esm/postgres/postgres-data-provider.d.ts +28 -0
  15. package/esm/postgres/postgres-data-provider.js +97 -0
  16. package/esm/postgres/schema-builder.d.ts +15 -0
  17. package/esm/postgres/schema-builder.js +128 -0
  18. package/esm/remult-express.d.ts +5 -0
  19. package/esm/remult-express.js +16 -0
  20. package/esm/remult-knex/index.d.ts +51 -0
  21. package/esm/remult-knex/index.js +381 -0
  22. package/esm/remult-middleware.d.ts +2 -0
  23. package/esm/remult-middleware.js +63 -0
  24. package/esm/remult-mongo.d.ts +9 -0
  25. package/esm/remult-mongo.js +220 -0
  26. package/esm/server/JsonEntityFileStorage.d.ts +7 -0
  27. package/esm/server/JsonEntityFileStorage.js +20 -0
  28. package/esm/server/expressBridge.d.ts +140 -0
  29. package/esm/server/expressBridge.js +668 -0
  30. package/esm/server/index.d.ts +4 -0
  31. package/esm/server/index.js +4 -0
  32. package/esm/server/register-actions-on-server.d.ts +3 -0
  33. package/esm/server/register-actions-on-server.js +24 -0
  34. package/esm/server/register-entities-on-server.d.ts +3 -0
  35. package/esm/server/register-entities-on-server.js +15 -0
  36. package/esm/src/__EntityValueProvider.d.ts +10 -0
  37. package/esm/src/__EntityValueProvider.js +1 -0
  38. package/esm/src/__RowsOfDataForTesting.d.ts +3 -0
  39. package/esm/src/__RowsOfDataForTesting.js +1 -0
  40. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +5 -0
  41. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +113 -0
  42. package/esm/src/backend-tests/my-test.backend-spec.d.ts +1 -0
  43. package/esm/src/backend-tests/my-test.backend-spec.js +49 -0
  44. package/esm/src/column-interfaces.d.ts +95 -0
  45. package/esm/src/column-interfaces.js +7 -0
  46. package/esm/src/column.d.ts +49 -0
  47. package/esm/src/column.js +133 -0
  48. package/esm/src/context.d.ts +124 -0
  49. package/esm/src/context.js +285 -0
  50. package/esm/src/data-api.d.ts +33 -0
  51. package/esm/src/data-api.js +204 -0
  52. package/esm/src/data-interfaces.d.ts +37 -0
  53. package/esm/src/data-interfaces.js +12 -0
  54. package/esm/src/data-providers/array-entity-data-provider.d.ts +22 -0
  55. package/esm/src/data-providers/array-entity-data-provider.js +264 -0
  56. package/esm/src/data-providers/in-memory-database.d.ts +9 -0
  57. package/esm/src/data-providers/in-memory-database.js +16 -0
  58. package/esm/src/data-providers/json-data-provider.d.ts +12 -0
  59. package/esm/src/data-providers/json-data-provider.js +52 -0
  60. package/esm/src/data-providers/rest-data-provider.d.ts +35 -0
  61. package/esm/src/data-providers/rest-data-provider.js +188 -0
  62. package/esm/src/data-providers/sql-database.d.ts +16 -0
  63. package/esm/src/data-providers/sql-database.js +261 -0
  64. package/esm/src/data-providers/web-sql-data-provider.d.ts +18 -0
  65. package/esm/src/data-providers/web-sql-data-provider.js +121 -0
  66. package/esm/src/entity.d.ts +82 -0
  67. package/esm/src/entity.js +1 -0
  68. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  69. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +139 -0
  70. package/esm/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  71. package/esm/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  72. package/esm/src/filter/filter-interfaces.d.ts +85 -0
  73. package/esm/src/filter/filter-interfaces.js +467 -0
  74. package/esm/src/id-entity.d.ts +4 -0
  75. package/esm/src/id-entity.js +8 -0
  76. package/esm/src/remult3/RepositoryImplementation.d.ts +326 -0
  77. package/esm/src/remult3/RepositoryImplementation.js +1806 -0
  78. package/esm/src/remult3/index.d.ts +2 -0
  79. package/esm/src/remult3/index.js +2 -0
  80. package/esm/src/remult3/remult3.d.ts +312 -0
  81. package/esm/src/remult3/remult3.js +1 -0
  82. package/esm/src/server-action.d.ts +70 -0
  83. package/esm/src/server-action.js +365 -0
  84. package/esm/src/shared-tests/db-tests-setup.d.ts +23 -0
  85. package/esm/src/shared-tests/db-tests-setup.js +66 -0
  86. package/esm/src/shared-tests/db-tests.db-tests.d.ts +26 -0
  87. package/esm/src/shared-tests/db-tests.db-tests.js +723 -0
  88. package/esm/src/shared-tests/deleteAll.d.ts +2 -0
  89. package/esm/src/shared-tests/deleteAll.js +4 -0
  90. package/esm/src/shared-tests/entityWithValidations.d.ts +14 -0
  91. package/esm/src/shared-tests/entityWithValidations.js +53 -0
  92. package/esm/src/shared-tests/index.d.ts +4 -0
  93. package/esm/src/shared-tests/index.js +4 -0
  94. package/esm/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  95. package/esm/src/shared-tests/test-custom-id-column.spec.js +62 -0
  96. package/esm/src/shared-tests/test-special-value.spec.d.ts +10 -0
  97. package/esm/src/shared-tests/test-special-value.spec.js +88 -0
  98. package/esm/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  99. package/esm/src/shared-tests/test-update-with-null.spec.js +47 -0
  100. package/esm/src/sort.d.ts +15 -0
  101. package/esm/src/sort.js +82 -0
  102. package/esm/src/sql-command.d.ts +15 -0
  103. package/esm/src/sql-command.js +1 -0
  104. package/esm/src/tests/Done.d.ts +5 -0
  105. package/esm/src/tests/Done.js +11 -0
  106. package/esm/src/tests/TestDataApiResponse.d.ts +10 -0
  107. package/esm/src/tests/TestDataApiResponse.js +22 -0
  108. package/esm/src/tests/c.d.ts +8 -0
  109. package/esm/src/tests/c.js +22 -0
  110. package/esm/src/tests/createData.d.ts +7 -0
  111. package/esm/src/tests/createData.js +22 -0
  112. package/esm/src/tests/d.d.ts +6 -0
  113. package/esm/src/tests/d.js +19 -0
  114. package/esm/src/tests/dWithPrefilter.d.ts +7 -0
  115. package/esm/src/tests/dWithPrefilter.js +32 -0
  116. package/esm/src/tests/entityForCustomFilter.d.ts +16 -0
  117. package/esm/src/tests/entityForCustomFilter.js +44 -0
  118. package/esm/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  119. package/esm/src/tests/entityWithValidationsOnColumn.js +21 -0
  120. package/esm/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  121. package/esm/src/tests/frontend-database-tests-setup.spec.js +38 -0
  122. package/esm/src/tests/h.d.ts +6 -0
  123. package/esm/src/tests/h.js +35 -0
  124. package/esm/src/tests/remult-3-entities.d.ts +23 -0
  125. package/esm/src/tests/remult-3-entities.js +72 -0
  126. package/esm/src/tests/tasks.d.ts +6 -0
  127. package/esm/src/tests/tasks.js +24 -0
  128. package/esm/src/tests/testHelper.spec.d.ts +34 -0
  129. package/esm/src/tests/testHelper.spec.js +217 -0
  130. package/esm/src/tests/testModel/models.d.ts +16 -0
  131. package/esm/src/tests/testModel/models.js +31 -0
  132. package/esm/src/validators.d.ts +14 -0
  133. package/esm/src/validators.js +33 -0
  134. package/esm/urlBuilder.d.ts +6 -0
  135. package/esm/urlBuilder.js +19 -0
  136. package/esm/valueConverters.d.ts +12 -0
  137. package/esm/valueConverters.js +169 -0
  138. package/index.d.ts +1 -0
  139. package/index.js +1 -0
  140. package/package.json +22 -1
  141. package/postgres/index.d.ts +1 -0
  142. package/postgres/index.js +1 -0
  143. package/postgres/postgres-data-provider.d.ts +1 -13
  144. package/postgres/postgres-data-provider.js +28 -262
  145. package/postgres/schema-builder.d.ts +15 -0
  146. package/postgres/schema-builder.js +270 -0
  147. package/readme.md +68 -30
  148. package/src/data-providers/web-sql-data-provider.js +4 -3
  149. package/src/entity.d.ts +9 -2
  150. package/src/remult3/RepositoryImplementation.js +11 -3
  151. package/src/shared-tests/test-update-with-null.spec.js +38 -0
  152. package/valueConverters.js +4 -0
@@ -0,0 +1,24 @@
1
+ import { serverActionField, actionInfo, classBackendMethodsArray } from '../src/server-action';
2
+ export function registerActionsOnServer(area, controllers) {
3
+ var addAction = (a) => {
4
+ let x = a[serverActionField];
5
+ if (!x) {
6
+ throw 'failed to set server action, did you forget the BackendMethod Decorator?';
7
+ }
8
+ area.addAction(x);
9
+ };
10
+ actionInfo.runningOnServer = true;
11
+ if (controllers && controllers.length > 0) {
12
+ for (const c of controllers) {
13
+ let z = c[classBackendMethodsArray];
14
+ if (z)
15
+ for (const a of z) {
16
+ addAction(a);
17
+ }
18
+ }
19
+ }
20
+ else
21
+ actionInfo.allActions.forEach((a) => {
22
+ addAction(a);
23
+ });
24
+ }
@@ -0,0 +1,3 @@
1
+ import { SiteArea } from "./expressBridge";
2
+ import { ClassType } from "../classType";
3
+ export declare function registerEntitiesOnServer(area: SiteArea, entities?: ClassType<any>[]): void;
@@ -0,0 +1,15 @@
1
+ import { getEntityKey } from "../src/remult3";
2
+ import { allEntities } from "../src/context";
3
+ import { DataApi } from "../src/data-api";
4
+ export function registerEntitiesOnServer(area, entities) {
5
+ if (!entities)
6
+ entities = allEntities;
7
+ //add Api Entries
8
+ entities.forEach(e => {
9
+ let key = getEntityKey(e);
10
+ if (key != undefined)
11
+ area.add(key, c => {
12
+ return new DataApi(c.repo(e), c);
13
+ });
14
+ });
15
+ }
@@ -0,0 +1,10 @@
1
+ export interface packedRowInfo {
2
+ data: any;
3
+ isNewRow: boolean;
4
+ id: string;
5
+ wasChanged: boolean;
6
+ }
7
+ export interface entityEventListener<entityType> {
8
+ deleted?: (entity: entityType) => void;
9
+ validating?: (entity: entityType) => Promise<any> | any;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export interface __RowsOfDataForTesting {
2
+ rows: any;
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import { dbTestWhatSignature } from "../shared-tests/db-tests-setup";
2
+ export declare const testKnexPGSqlImpl: (key: string, what: dbTestWhatSignature, focus?: boolean) => void;
3
+ export declare function testPostgresImplementation(key: string, what: dbTestWhatSignature, focus?: boolean): void;
4
+ export declare function testMongo(key: string, what: dbTestWhatSignature, focus?: boolean): void;
5
+ import '../shared-tests';
@@ -0,0 +1,113 @@
1
+ import { Remult } from "../context";
2
+ import { KnexDataProvider, KnexSchemaBuilder } from '../../remult-knex';
3
+ import * as Knex from 'knex';
4
+ import { MongoClient } from 'mongodb';
5
+ import { config } from 'dotenv';
6
+ import { createPostgresConnection, PostgresSchemaBuilder } from "../../postgres";
7
+ import { addDatabaseToTest, itWithFocus, testAll } from "../shared-tests/db-tests-setup";
8
+ config();
9
+ function testKnexSqlImpl(knex, name) {
10
+ return (key, what, focus = false) => {
11
+ itWithFocus(key + " " + name + " - knex", async () => {
12
+ let db = new KnexDataProvider(knex);
13
+ let remult = new Remult(db);
14
+ await what({
15
+ db, remult,
16
+ createEntity: async (entity) => {
17
+ let repo = remult.repo(entity);
18
+ let sb = new KnexSchemaBuilder(knex);
19
+ await knex.schema.dropTableIfExists(await repo.metadata.getDbName());
20
+ await sb.createIfNotExist(repo.metadata);
21
+ await sb.verifyAllColumns(repo.metadata);
22
+ await knex(await repo.metadata.getDbName()).delete();
23
+ return repo;
24
+ }
25
+ });
26
+ }, focus);
27
+ };
28
+ }
29
+ export const testKnexPGSqlImpl = testKnexSqlImpl(Knex.default({
30
+ client: 'pg',
31
+ connection: process.env.DATABASE_URL,
32
+ }), "postgres");
33
+ addDatabaseToTest(testKnexPGSqlImpl);
34
+ if (process.env['TESTS_SQL_SERVER'])
35
+ addDatabaseToTest(testKnexSqlImpl(Knex.default({
36
+ client: 'mssql',
37
+ connection: {
38
+ server: '127.0.0.1',
39
+ database: 'test2',
40
+ user: 'sa',
41
+ password: 'MASTERKEY',
42
+ options: {
43
+ enableArithAbort: true,
44
+ encrypt: false,
45
+ instanceName: 'sqlexpress'
46
+ }
47
+ } //,debug: true
48
+ }), "sql server"));
49
+ if (true)
50
+ addDatabaseToTest(testKnexSqlImpl(Knex.default({
51
+ client: 'better-sqlite3',
52
+ connection: {
53
+ filename: ":memory:"
54
+ },
55
+ }), "sqlite3"));
56
+ let pg = createPostgresConnection({
57
+ autoCreateTables: false
58
+ });
59
+ export function testPostgresImplementation(key, what, focus = false) {
60
+ itWithFocus(key + " - postgres", async () => {
61
+ let db = await pg;
62
+ let remult = new Remult(db);
63
+ await what({
64
+ db, remult,
65
+ createEntity: async (entity) => {
66
+ let repo = remult.repo(entity);
67
+ let sb = new PostgresSchemaBuilder(db);
68
+ await db.execute("drop table if exists " + await repo.metadata.getDbName());
69
+ await sb.createIfNotExist(repo.metadata);
70
+ await sb.verifyAllColumns(repo.metadata);
71
+ await db.execute("delete from " + await repo.metadata.getDbName());
72
+ return repo;
73
+ }
74
+ });
75
+ }, focus);
76
+ }
77
+ addDatabaseToTest(testPostgresImplementation);
78
+ import { Categories } from "../tests/remult-3-entities";
79
+ import { MongoDataProvider } from "../../remult-mongo";
80
+ testAll("transactions", async ({ db, createEntity }) => {
81
+ let x = await createEntity(Categories);
82
+ await db.transaction(async (db) => {
83
+ let remult = new Remult(db);
84
+ expect(await remult.repo(Categories).count()).toBe(0);
85
+ });
86
+ });
87
+ let client = new MongoClient("mongodb://localhost:27017/local");
88
+ let done;
89
+ let mongoDbPromise = client.connect().then(c => {
90
+ done = c;
91
+ return c.db("test");
92
+ });
93
+ afterAll(async () => {
94
+ if (done)
95
+ done.close();
96
+ });
97
+ export function testMongo(key, what, focus = false) {
98
+ itWithFocus(key + " - mongo", async () => {
99
+ let mongoDb = await mongoDbPromise;
100
+ let db = new MongoDataProvider(mongoDb, client);
101
+ let remult = new Remult(db);
102
+ await what({
103
+ db, remult,
104
+ createEntity: async (entity) => {
105
+ let repo = remult.repo(entity);
106
+ await mongoDb.collection(await repo.metadata.getDbName()).deleteMany({});
107
+ return repo;
108
+ }
109
+ });
110
+ }, focus);
111
+ }
112
+ addDatabaseToTest(testMongo);
113
+ import '../shared-tests';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ import { KnexDataProvider } from '../../remult-knex';
2
+ import { config } from 'dotenv';
3
+ import { testKnexPGSqlImpl, testPostgresImplementation } from "./backend-database-test-setup.backend-spec";
4
+ import { entityWithValidations } from "../shared-tests/entityWithValidations";
5
+ import { SqlDatabase } from "../data-providers/sql-database";
6
+ config();
7
+ testPostgresImplementation("sql filter", async ({ createEntity }) => {
8
+ let s = await entityWithValidations.create4RowsInDp(createEntity);
9
+ expect((await s.find({
10
+ where: SqlDatabase.customFilter(async (build) => {
11
+ build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
12
+ })
13
+ })).length).toBe(2);
14
+ }, false);
15
+ testPostgresImplementation("sql filter2", async ({ createEntity }) => {
16
+ let s = await entityWithValidations.create4RowsInDp(createEntity);
17
+ expect((await s.find({
18
+ where: {
19
+ $or: [
20
+ SqlDatabase.customFilter(async (build) => {
21
+ build.sql = s.metadata.fields.myId.options.dbName + ' in (1,3)';
22
+ }),
23
+ {
24
+ myId: 2
25
+ }
26
+ ]
27
+ }
28
+ })).length).toBe(3);
29
+ }, false);
30
+ testKnexPGSqlImpl("knex filter", async ({ createEntity }) => {
31
+ let s = await entityWithValidations.create4RowsInDp(createEntity);
32
+ expect((await s.find({
33
+ where: KnexDataProvider.customFilter(async () => {
34
+ return build => build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]);
35
+ })
36
+ })).length).toBe(2);
37
+ }, false);
38
+ testKnexPGSqlImpl("knex filter2", async ({ createEntity }) => {
39
+ let s = await entityWithValidations.create4RowsInDp(createEntity);
40
+ expect((await s.find({
41
+ where: {
42
+ $or: [KnexDataProvider.customFilter(async () => {
43
+ return build => build.whereIn(s.metadata.fields.myId.options.dbName, [1, 3]);
44
+ }), {
45
+ myId: 4
46
+ }]
47
+ }
48
+ })).length).toBe(3);
49
+ }, false);
@@ -0,0 +1,95 @@
1
+ import { ClassType } from '../classType';
2
+ import { Allowed, AllowedForInstance } from './context';
3
+ import { EntityMetadata, FieldRef } from './remult3';
4
+ export interface FieldOptions<entityType = any, valueType = any> {
5
+ /**A human readable name for the field */
6
+ caption?: string;
7
+ /** If it can store null in the database */
8
+ allowNull?: boolean;
9
+ /** If this field data is included in the api.
10
+ * @see [allowed](http://remult.dev/docs/allowed.html)*/
11
+ includeInApi?: Allowed;
12
+ /** If this field data can be updated in the api.
13
+ * @see [allowed](http://remult.dev/docs/allowed.html)*/
14
+ allowApiUpdate?: AllowedForInstance<entityType>;
15
+ /** An arrow function that'll be used to perform validations on it
16
+ * @example
17
+ * @Fields.string({
18
+ * validate: Validators.required
19
+ * })
20
+ * @example
21
+ * @Fields.string<Task>({
22
+ * validate: task=>{
23
+ * if (task.title.length<3)
24
+ * throw "Too Short";
25
+ * }
26
+ * })
27
+ * @example
28
+ * @Fields.string({
29
+ * validate: (_, fieldRef)=>{
30
+ * if (fieldRef.value.length<3)
31
+ * fieldRef.error = "Too Short";
32
+ * }
33
+ * })
34
+ */
35
+ validate?: ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>)) | ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>))[];
36
+ /** Will be fired before this field is saved to the server/database */
37
+ saving?: ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>));
38
+ /** An expression that will determine this fields value on the backend and be provided to the front end*/
39
+ serverExpression?: (entity: entityType) => valueType | Promise<valueType>;
40
+ /** The name of the column in the database that holds the data for this field. If no name is set, the key will be used instead. */
41
+ dbName?: string;
42
+ /** Used or fields that are based on an sql expressions, instead of a physical table column */
43
+ sqlExpression?: string | ((entity: EntityMetadata<entityType>) => string | Promise<string>);
44
+ /** For fields that shouldn't be part of an update or insert statement */
45
+ dbReadOnly?: boolean;
46
+ /** The value converter to be used when loading and saving this field */
47
+ valueConverter?: ValueConverter<valueType>;
48
+ /** an arrow function that translates the value to a display value */
49
+ displayValue?: (entity: entityType, value: valueType) => string;
50
+ /** an arrow function that determines the default value of the field, when the entity is created using the `repo.create` method */
51
+ defaultValue?: (entity: entityType) => valueType | Promise<valueType>;
52
+ /** The html input type for this field */
53
+ inputType?: string;
54
+ /** Determines if the referenced entity will be loaded immediately or on demand.
55
+ * @see[Lazy loading of related entities](http://remult.dev/docs/lazy-loading-of-related-entities.html)
56
+ */
57
+ lazy?: boolean;
58
+ /** The value type for this field */
59
+ valueType?: any;
60
+ /** The entity type to which this field belongs */
61
+ target?: ClassType<entityType>;
62
+ /** The key to be used for this field */
63
+ key?: string;
64
+ }
65
+ export interface FieldMetadata<valueType = any> {
66
+ readonly key: string;
67
+ readonly target: ClassType<valueType>;
68
+ readonly valueType: any;
69
+ readonly caption: string;
70
+ readonly inputType: string;
71
+ readonly allowNull: boolean;
72
+ getDbName(): Promise<string>;
73
+ readonly isServerExpression: boolean;
74
+ readonly dbReadOnly: boolean;
75
+ readonly valueConverter: ValueConverter<valueType>;
76
+ readonly options: FieldOptions;
77
+ }
78
+ export interface ValueConverter<valueType> {
79
+ fromJson?(val: any): valueType;
80
+ toJson?(val: valueType): any;
81
+ fromDb?(val: any): valueType;
82
+ toDb?(val: valueType): any;
83
+ toInput?(val: valueType, inputType: string): string;
84
+ fromInput?(val: string, inputType: string): valueType;
85
+ displayValue?(val: valueType): string;
86
+ readonly fieldTypeInDb?: string;
87
+ readonly inputType?: string;
88
+ }
89
+ export declare type FieldValidator<entityType = any, valueType = any> = (entity: entityType, col: FieldRef<entityType, valueType>) => void | Promise<void>;
90
+ export declare type ValueOrExpression<valueType> = valueType | (() => valueType);
91
+ export declare function valueOrExpressionToValue<valueType>(f: ValueOrExpression<valueType>): valueType;
92
+ export interface ValueListItem {
93
+ id?: any;
94
+ caption?: any;
95
+ }
@@ -0,0 +1,7 @@
1
+ export function valueOrExpressionToValue(f) {
2
+ if (typeof f === 'function') {
3
+ let x = f;
4
+ return x();
5
+ }
6
+ return f;
7
+ }
@@ -0,0 +1,49 @@
1
+ import { ClassType } from '../classType';
2
+ import { FieldMetadata, FieldOptions, ValueConverter } from './column-interfaces';
3
+ import { Filter } from './filter/filter-interfaces';
4
+ import { EntityFilter, FindOptions, Repository, RepositoryImplementation } from './remult3';
5
+ export declare function makeTitle(name: string): string;
6
+ export declare class CompoundIdField implements FieldMetadata<string> {
7
+ fields: FieldMetadata[];
8
+ constructor(...columns: FieldMetadata[]);
9
+ getDbName(): Promise<string>;
10
+ getId(instance: any): string;
11
+ options: FieldOptions<any, any>;
12
+ get valueConverter(): ValueConverter<string>;
13
+ target: ClassType<any>;
14
+ readonly: true;
15
+ allowNull: boolean;
16
+ dbReadOnly: boolean;
17
+ isServerExpression: boolean;
18
+ key: string;
19
+ caption: string;
20
+ inputType: string;
21
+ dbName: string;
22
+ valueType: any;
23
+ isEqualTo(value: FieldMetadata<string> | string): EntityFilter<any>;
24
+ resultIdFilter(id: string, data: any): Filter;
25
+ }
26
+ export declare class LookupColumn<T> {
27
+ private repository;
28
+ id: string;
29
+ setId(val: any): void;
30
+ waitLoadOf(id: any): Promise<T>;
31
+ get(id: any): any;
32
+ set(item: T): void;
33
+ constructor(repository: RepositoryImplementation<T>, id: string);
34
+ get item(): T;
35
+ waitLoad(): Promise<T>;
36
+ }
37
+ export declare class OneToMany<T> {
38
+ private provider;
39
+ private settings?;
40
+ constructor(provider: Repository<T>, settings?: {
41
+ create?: (newItem: T) => void;
42
+ } & FindOptions<T>);
43
+ private _items;
44
+ private _currentPromise;
45
+ get lazyItems(): T[];
46
+ load(): Promise<T[]>;
47
+ private find;
48
+ create(item?: Partial<T>): T;
49
+ }
@@ -0,0 +1,133 @@
1
+ import { assign } from '../assign';
2
+ import { Filter } from './filter/filter-interfaces';
3
+ import { getEntityRef, __updateEntityBasedOnWhere } from './remult3';
4
+ export function makeTitle(name) {
5
+ // insert a space before all caps
6
+ return name.replace(/([A-Z])/g, ' $1')
7
+ // uppercase the first character
8
+ .replace(/^./, (str) => str.toUpperCase()).replace('Email', 'eMail').replace(" I D", " ID");
9
+ }
10
+ export class CompoundIdField {
11
+ constructor(...columns) {
12
+ this.fields = columns;
13
+ }
14
+ getDbName() {
15
+ return Promise.resolve("");
16
+ }
17
+ getId(instance) {
18
+ let r = "";
19
+ this.fields.forEach(c => {
20
+ if (r.length > 0)
21
+ r += ',';
22
+ r += instance[c.key];
23
+ });
24
+ return r;
25
+ }
26
+ get valueConverter() {
27
+ throw new Error("cant get value converter of compound id");
28
+ }
29
+ isEqualTo(value) {
30
+ let result = {};
31
+ let val = value.toString();
32
+ let id = val.split(',');
33
+ this.fields.forEach((c, i) => {
34
+ result[c.key] = id[i];
35
+ });
36
+ return result;
37
+ }
38
+ resultIdFilter(id, data) {
39
+ return new Filter(add => {
40
+ let idParts = [];
41
+ if (id != undefined)
42
+ idParts = id.split(',');
43
+ this.fields.forEach((c, i) => {
44
+ let val = undefined;
45
+ if (i < idParts.length)
46
+ val = idParts[i];
47
+ if (data[c.key] != undefined)
48
+ val = data[c.key];
49
+ add.isEqualTo(c, val);
50
+ });
51
+ });
52
+ }
53
+ }
54
+ export class LookupColumn {
55
+ constructor(repository, id) {
56
+ this.repository = repository;
57
+ this.id = id;
58
+ }
59
+ setId(val) {
60
+ if (this.repository.metadata.idMetadata.field.valueType == Number)
61
+ val = +val;
62
+ this.id = val;
63
+ }
64
+ waitLoadOf(id) {
65
+ if (id === undefined || id === null)
66
+ return null;
67
+ return this.repository.getCachedByIdAsync(id);
68
+ }
69
+ get(id) {
70
+ if (id === undefined || id === null)
71
+ return null;
72
+ return this.repository.getCachedById(id);
73
+ }
74
+ set(item) {
75
+ if (item) {
76
+ if (typeof item === "string" || typeof item === "number")
77
+ this.id = item;
78
+ else {
79
+ let eo = getEntityRef(item, false);
80
+ if (eo) {
81
+ this.repository.addToCache(item);
82
+ this.id = eo.getId();
83
+ }
84
+ else {
85
+ this.id = item[this.repository.metadata.idMetadata.field.key];
86
+ }
87
+ }
88
+ }
89
+ else if (item === null) {
90
+ this.id = null;
91
+ }
92
+ else {
93
+ this.id = undefined;
94
+ }
95
+ }
96
+ get item() {
97
+ return this.get(this.id);
98
+ }
99
+ async waitLoad() {
100
+ return this.waitLoadOf(this.id);
101
+ }
102
+ }
103
+ 9000;
104
+ export class OneToMany {
105
+ constructor(provider, settings) {
106
+ this.provider = provider;
107
+ this.settings = settings;
108
+ }
109
+ get lazyItems() {
110
+ this.load();
111
+ return this._items;
112
+ }
113
+ async load() {
114
+ if (this._currentPromise != null)
115
+ return this._currentPromise;
116
+ if (this._items === undefined)
117
+ this._items = [];
118
+ return this._currentPromise = this.find().then(x => {
119
+ this._items.splice(0);
120
+ this._items.push(...x);
121
+ return this._items;
122
+ });
123
+ }
124
+ async find() {
125
+ return this.provider.find(this.settings);
126
+ }
127
+ create(item) {
128
+ let r = this.provider.create();
129
+ __updateEntityBasedOnWhere(this.provider.metadata, this.settings.where, r);
130
+ assign(r, item);
131
+ return r;
132
+ }
133
+ }
@@ -0,0 +1,124 @@
1
+ import { DataProvider, RestDataProviderHttpProvider } from "./data-interfaces";
2
+ import { EntityMetadata, EntityRef, FindOptions, Repository } from "./remult3";
3
+ import { ClassType } from "../classType";
4
+ export interface HttpProvider {
5
+ post(url: string, data: any): Promise<any> | {
6
+ toPromise(): Promise<any>;
7
+ };
8
+ delete(url: string): Promise<void> | {
9
+ toPromise(): Promise<void>;
10
+ };
11
+ put(url: string, data: any): Promise<any> | {
12
+ toPromise(): Promise<any>;
13
+ };
14
+ get(url: string): Promise<any> | {
15
+ toPromise(): Promise<any>;
16
+ };
17
+ }
18
+ export declare class HttpProviderBridgeToRestDataProviderHttpProvider implements RestDataProviderHttpProvider {
19
+ private http;
20
+ constructor(http: HttpProvider);
21
+ post(url: string, data: any): Promise<any>;
22
+ delete(url: string): Promise<void>;
23
+ put(url: string, data: any): Promise<any>;
24
+ get(url: string): Promise<any>;
25
+ }
26
+ export declare function retry<T>(what: () => Promise<T>): Promise<T>;
27
+ export declare function toPromise<T>(p: Promise<T> | {
28
+ toPromise(): Promise<T>;
29
+ }): Promise<any>;
30
+ export declare function processHttpException(ex: any): Promise<any>;
31
+ export declare function isBackend(): boolean;
32
+ export declare class Remult {
33
+ /**Return's a `Repository` of the specific entity type
34
+ * @example
35
+ * const taskRepo = remult.repo(Task);
36
+ * @see [Repository](https://remult.dev/docs/ref_repository.html)
37
+ *
38
+ */
39
+ repo<T>(entity: ClassType<T>, dataProvider?: DataProvider): Repository<T>;
40
+ /** Returns the current user's info */
41
+ get user(): UserInfo;
42
+ /** Set's the current user info */
43
+ setUser(info: UserInfo | {
44
+ sub?: string;
45
+ name?: string;
46
+ permissions?: string[];
47
+ username?: string;
48
+ }): Promise<void>;
49
+ private _user;
50
+ private _userChangeEvent;
51
+ /** Checks if a user was authenticated */
52
+ authenticated(): boolean;
53
+ /** checks if the user has any of the roles specified in the parameters
54
+ * @example
55
+ * remult.isAllowed("admin")
56
+ * @see
57
+ * [Allowed](https://remult.dev/docs/allowed.html)
58
+ */
59
+ isAllowed(roles?: Allowed): boolean;
60
+ /** checks if the user matches the allowedForInstance callback
61
+ * @see
62
+ * [Allowed](https://remult.dev/docs/allowed.html)
63
+ */
64
+ isAllowedForInstance(instance: any, allowed?: AllowedForInstance<any>): boolean;
65
+ /** returns a dispatcher object that fires once a user has changed*/
66
+ get userChange(): EventDispatcher;
67
+ private repCache;
68
+ /** Creates a new instance of the `remult` object.
69
+ *
70
+ * Can receive either an HttpProvider or a DataProvider as a parameter - which will be used to fetch data from.
71
+ *
72
+ * If no provider is specified, `fetch` will be used as an http provider
73
+ */
74
+ constructor(provider?: HttpProvider | DataProvider);
75
+ /** The api Base Url to be used in all remult calls. by default it's set to `/api`.
76
+ *
77
+ * Set this property in case you want to determine a non relative api url
78
+ */
79
+ static apiBaseUrl: string;
80
+ /** The current data provider */
81
+ _dataSource: DataProvider;
82
+ /** sets the current data provider */
83
+ setDataProvider(dataProvider: DataProvider): void;
84
+ /** A helper callback that can be used to debug and trace all find operations. Useful in debugging scenarios */
85
+ static onFind: (metadata: EntityMetadata, options: FindOptions<any>) => void;
86
+ clearAllCache(): any;
87
+ /** A helper callback that is called whenever an entity is created. */
88
+ static entityRefInit?: (ref: EntityRef<any>, row: any) => void;
89
+ }
90
+ export declare const allEntities: ClassType<any>[];
91
+ export interface ControllerOptions {
92
+ key: string;
93
+ }
94
+ export declare const classHelpers: Map<any, ClassHelper>;
95
+ export declare class ClassHelper {
96
+ methods: MethodHelper[];
97
+ }
98
+ export declare class MethodHelper {
99
+ classes: Map<any, ControllerOptions>;
100
+ }
101
+ export declare function setControllerSettings(target: any, options: ControllerOptions): void;
102
+ export interface UserInfo {
103
+ id: string;
104
+ name: string;
105
+ roles: string[];
106
+ }
107
+ export declare type Allowed = boolean | string | string[] | ((c: Remult) => boolean);
108
+ export declare type AllowedForInstance<T> = boolean | string | string[] | ((c: Remult, entity?: T) => boolean);
109
+ export declare class Allow {
110
+ static everyone: () => boolean;
111
+ static authenticated: (remult: Remult) => boolean;
112
+ }
113
+ export declare const queryConfig: {
114
+ defaultPageSize: number;
115
+ };
116
+ export interface EventDispatcher {
117
+ observe(what: () => any | Promise<any>): Promise<Unobserve>;
118
+ }
119
+ export declare type Unobserve = () => void;
120
+ export declare class EventSource {
121
+ listeners: (() => {})[];
122
+ fire(): Promise<void>;
123
+ dispatcher: EventDispatcher;
124
+ }