remult 0.27.22 → 0.27.23-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/index.js CHANGED
@@ -5,6 +5,7 @@ export { getEntityRef } from './src/remult3/getEntityRef.js';
5
5
  export { Field, Fields, Relations, } from './src/remult3/Fields.js';
6
6
  export { IdEntity } from './src/remult3/IdEntity.js';
7
7
  export { describeClass, describeBackendMethods, describeEntity, } from './src/remult3/classDescribers.js';
8
+ export { EntityError, } from './src/data-interfaces.js'; //V
8
9
  export { RestDataProvider } from './src/data-providers/rest-data-provider.js'; //V
9
10
  export { InMemoryDataProvider } from './src/data-providers/in-memory-database.js'; //V
10
11
  export { SqlDatabase } from './src/data-providers/sql-database.js'; //V
@@ -833,10 +833,11 @@ class ResponseBridgeToDataApiResponse {
833
833
  url: this.genReq?.url,
834
834
  method: this.genReq?.method,
835
835
  });
836
- this.setStatus(httpStatusCode).json(body);
836
+ const json = { ...body, message: body.message };
837
+ this.setStatus(httpStatusCode).json(json);
837
838
  };
838
839
  await this.handleError?.({
839
- httpStatusCode,
840
+ httpStatusCode: httpStatusCode,
840
841
  req: this.req,
841
842
  entity,
842
843
  exception,
@@ -1,4 +1,5 @@
1
1
  import { doTransaction } from './context.js';
2
+ import { EntityError } from './data-interfaces.js';
2
3
  import { findOptionsToJson, liveQueryAction, } from './data-providers/rest-data-provider.js';
3
4
  import { Filter, buildFilterFromRequestParameters, customUrlToken, } from './filter/filter-interfaces.js';
4
5
  import { getRelationFieldInfo } from './remult3/relationInfoMember.js';
@@ -490,7 +491,10 @@ export function determineSort(sortUrlParm, dirUrlParam) {
490
491
  return result;
491
492
  }
492
493
  export function serializeError(data) {
493
- if (data instanceof TypeError) {
494
+ if (data instanceof EntityError) {
495
+ data = { message: data.message, modelState: data.modelState };
496
+ }
497
+ else if (data instanceof Error) {
494
498
  data = { message: data.message, stack: data.stack };
495
499
  }
496
500
  let x = JSON.parse(JSON.stringify(data));
@@ -9,3 +9,13 @@ export function extractSort(sort) {
9
9
  }
10
10
  return sort;
11
11
  }
12
+ export class EntityError extends Error {
13
+ constructor(errorInfo) {
14
+ super(errorInfo.message);
15
+ Object.assign(this, errorInfo);
16
+ }
17
+ modelState;
18
+ stack;
19
+ exception;
20
+ httpStatusCode;
21
+ }
@@ -5,6 +5,7 @@ import { Filter } from '../filter/filter-interfaces.js';
5
5
  import { Sort } from '../sort.js';
6
6
  import { GroupByForApiKey, } from './remult3.js';
7
7
  import { assign } from '../../assign.js';
8
+ import { EntityError, } from '../data-interfaces.js';
8
9
  import { ValueConverters } from '../valueConverters.js';
9
10
  import { findOptionsToJson } from '../data-providers/rest-data-provider.js';
10
11
  import { remult as defaultRemult } from '../remult-proxy.js';
@@ -1194,7 +1195,7 @@ class rowHelperBase {
1194
1195
  }
1195
1196
  }
1196
1197
  }
1197
- return error;
1198
+ return new EntityError(error);
1198
1199
  }
1199
1200
  catchSaveErrors(err) {
1200
1201
  let e = err;
@@ -1987,12 +1988,12 @@ export class columnDefsImpl {
1987
1988
  }
1988
1989
  catch (err) {
1989
1990
  const error = `${String(prop)} failed for value ${args?.[0]}. Error: ${typeof err === 'string' ? err : err.message}`;
1990
- throw {
1991
+ throw new EntityError({
1991
1992
  message: this.caption + ': ' + error,
1992
1993
  modelState: {
1993
1994
  [this.key]: error,
1994
1995
  },
1995
- };
1996
+ });
1996
1997
  }
1997
1998
  };
1998
1999
  }
@@ -17,6 +17,8 @@ const wnn = [
17
17
  export const flags = {
18
18
  error500RetryCount: 4,
19
19
  };
20
+ //p1 - make error info an actual error, important for exception handling, and also for auth.js errors that were mistic
21
+ //p1 - add validators min,max,between(range)
20
22
  //p1 - allow experimental route registration on remult server, with at least get route, and support redirect, read header and set header - (and the existing get html etc...)
21
23
  //p2 - add parameter all to deleteMany, and updateMany
22
24
  //p2 filter.apply ApiPreFilter
@@ -45,6 +45,8 @@ export class Validators {
45
45
  return true;
46
46
  return Boolean(await e.load());
47
47
  }, 'Relation value does not exist');
48
+ static min = createValueValidatorWithArgs((val, minValue) => val >= minValue, (minValue) => `Value must be bigger than or equal to ${minValue}`);
49
+ static max = createValueValidatorWithArgs((val, maxValue) => val <= maxValue, (maxValue) => `Value must be smaller than or equal to ${maxValue}`);
48
50
  static maxLength = createValueValidatorWithArgs((val, maxLength) => val.length <= maxLength, (maxLength) => `Value must be at most ${maxLength} characters`);
49
51
  static minLength = createValueValidatorWithArgs((val, minLength) => val.length >= minLength, (maxLength) => `Value must be at least ${maxLength} characters`);
50
52
  static defaultMessage = 'Invalid value';
package/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { Field, Fields, StringFieldOptions, Relations, } from './src/remult3/Fie
11
11
  export { IdEntity } from './src/remult3/IdEntity.js';
12
12
  export { describeClass, describeBackendMethods, describeEntity, } from './src/remult3/classDescribers.js';
13
13
  export { EntityOptions, PreprocessFilterEvent } from './src/entity.js';
14
- export { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo, RestDataProviderHttpProvider, } from './src/data-interfaces.js';
14
+ export { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo, EntityError, RestDataProviderHttpProvider, } from './src/data-interfaces.js';
15
15
  export { SqlCommand, SqlCommandWithParameters, SqlImplementation, SqlResult, } from './src/sql-command.js';
16
16
  export { FieldMetadata, FieldOptions, FieldValidator, ValueConverter, ValueListItem, // reconsider, maybe it should go to remult angular as the abstraction ?
17
17
  ValueOrExpression, } from './src/column-interfaces.js';
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = exports.createValueValidator = exports.createValueValidatorWithArgs = exports.createValidatorWithArgs = exports.createValidator = exports.valueValidator = exports.Validators = exports.UrlBuilder = exports.Filter = exports.CompoundIdField = exports.Sort = exports.EventSource = exports.isBackend = exports.withRemult = exports.Remult = exports.Allow = exports.ForbiddenError = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonEntityIndexedDbStorage = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.InMemoryDataProvider = exports.RestDataProvider = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.ArrayEntityDataProvider = void 0;
3
+ exports.SubscriptionChannel = exports.InMemoryLiveQueryStorage = exports.remult = exports.ValueConverters = exports.createValueValidator = exports.createValueValidatorWithArgs = exports.createValidatorWithArgs = exports.createValidator = exports.valueValidator = exports.Validators = exports.UrlBuilder = exports.Filter = exports.CompoundIdField = exports.Sort = exports.EventSource = exports.isBackend = exports.withRemult = exports.Remult = exports.Allow = exports.ForbiddenError = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonEntityIndexedDbStorage = exports.JsonEntityOpfsStorage = exports.JsonDataProvider = exports.dbNamesOf = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.InMemoryDataProvider = exports.RestDataProvider = exports.EntityError = exports.describeEntity = exports.describeBackendMethods = exports.describeClass = exports.IdEntity = exports.Relations = exports.Fields = exports.Field = exports.getEntityRef = exports.Entity = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.ArrayEntityDataProvider = void 0;
4
4
  exports.repo = repo;
5
5
  var array_entity_data_provider_js_1 = require("./src/data-providers/array-entity-data-provider.js");
6
6
  Object.defineProperty(exports, "ArrayEntityDataProvider", { enumerable: true, get: function () { return array_entity_data_provider_js_1.ArrayEntityDataProvider; } });
@@ -27,6 +27,8 @@ var classDescribers_js_1 = require("./src/remult3/classDescribers.js");
27
27
  Object.defineProperty(exports, "describeClass", { enumerable: true, get: function () { return classDescribers_js_1.describeClass; } });
28
28
  Object.defineProperty(exports, "describeBackendMethods", { enumerable: true, get: function () { return classDescribers_js_1.describeBackendMethods; } });
29
29
  Object.defineProperty(exports, "describeEntity", { enumerable: true, get: function () { return classDescribers_js_1.describeEntity; } });
30
+ var data_interfaces_js_1 = require("./src/data-interfaces.js"); //V
31
+ Object.defineProperty(exports, "EntityError", { enumerable: true, get: function () { return data_interfaces_js_1.EntityError; } });
30
32
  var rest_data_provider_js_1 = require("./src/data-providers/rest-data-provider.js"); //V
31
33
  Object.defineProperty(exports, "RestDataProvider", { enumerable: true, get: function () { return rest_data_provider_js_1.RestDataProvider; } });
32
34
  var in_memory_database_js_1 = require("./src/data-providers/in-memory-database.js"); //V
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "0.27.22",
3
+ "version": "0.27.23-next.0",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
@@ -1195,7 +1195,8 @@ var ResponseBridgeToDataApiResponse = /** @class */ (function () {
1195
1195
  url: (_b = _this.genReq) === null || _b === void 0 ? void 0 : _b.url,
1196
1196
  method: (_c = _this.genReq) === null || _c === void 0 ? void 0 : _c.method,
1197
1197
  });
1198
- _this.setStatus(httpStatusCode).json(body);
1198
+ var json = tslib_1.__assign(tslib_1.__assign({}, body), { message: body.message });
1199
+ _this.setStatus(httpStatusCode).json(json);
1199
1200
  };
1200
1201
  return [4 /*yield*/, ((_a = this.handleError) === null || _a === void 0 ? void 0 : _a.call(this, {
1201
1202
  httpStatusCode: httpStatusCode,
package/src/data-api.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Remult } from './context.js';
2
- import type { ErrorInfo } from './data-interfaces.js';
2
+ import { type ErrorInfo } from './data-interfaces.js';
3
3
  import { type EntityMetadata, type FindOptions, type Repository } from './remult3/remult3.js';
4
4
  import type { rowHelperImplementation } from './remult3/RepositoryImplementation.js';
5
5
  export declare class DataApi<T = unknown> {
package/src/data-api.js CHANGED
@@ -5,6 +5,7 @@ exports.determineSort = determineSort;
5
5
  exports.serializeError = serializeError;
6
6
  var tslib_1 = require("tslib");
7
7
  var context_js_1 = require("./context.js");
8
+ var data_interfaces_js_1 = require("./data-interfaces.js");
8
9
  var rest_data_provider_js_1 = require("./data-providers/rest-data-provider.js");
9
10
  var filter_interfaces_js_1 = require("./filter/filter-interfaces.js");
10
11
  var relationInfoMember_js_1 = require("./remult3/relationInfoMember.js");
@@ -1005,7 +1006,10 @@ function determineSort(sortUrlParm, dirUrlParam) {
1005
1006
  return result;
1006
1007
  }
1007
1008
  function serializeError(data) {
1008
- if (data instanceof TypeError) {
1009
+ if (data instanceof data_interfaces_js_1.EntityError) {
1010
+ data = { message: data.message, modelState: data.modelState };
1011
+ }
1012
+ else if (data instanceof Error) {
1009
1013
  data = { message: data.message, stack: data.stack };
1010
1014
  }
1011
1015
  var x = JSON.parse(JSON.stringify(data));
@@ -67,3 +67,12 @@ export interface ErrorInfo<entityType = unknown> {
67
67
  exception?: any;
68
68
  httpStatusCode?: number;
69
69
  }
70
+ export declare class EntityError<entityType = unknown> extends Error implements ErrorInfo<entityType> {
71
+ constructor(errorInfo: ErrorInfo<entityType>);
72
+ modelState?: {
73
+ [Properties in keyof Partial<MembersOnly<entityType>>]?: string;
74
+ };
75
+ stack?: string;
76
+ exception?: any;
77
+ httpStatusCode?: number;
78
+ }
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityError = void 0;
3
4
  exports.extractSort = extractSort;
5
+ var tslib_1 = require("tslib");
4
6
  var sort_js_1 = require("./sort.js");
5
7
  function extractSort(sort) {
6
8
  if (sort instanceof Array) {
@@ -12,3 +14,13 @@ function extractSort(sort) {
12
14
  }
13
15
  return sort;
14
16
  }
17
+ var EntityError = /** @class */ (function (_super) {
18
+ tslib_1.__extends(EntityError, _super);
19
+ function EntityError(errorInfo) {
20
+ var _this = _super.call(this, errorInfo.message) || this;
21
+ Object.assign(_this, errorInfo);
22
+ return _this;
23
+ }
24
+ return EntityError;
25
+ }(Error));
26
+ exports.EntityError = EntityError;
@@ -7,7 +7,7 @@ import { Filter } from '../filter/filter-interfaces.js';
7
7
  import { type GroupByOptions, type GroupByResult, type ControllerRef, type ControllerRefForControllerBase, type EntityFilter, type EntityMetadata, type EntityOrderBy, type EntityRef, type EntityRefForEntityBase, type FieldRef, type FieldsMetadata, type FieldsRef, type FieldsRefForEntityBase, type FindFirstOptions, type FindFirstOptionsBase, type FindOptions, type IdMetadata, type LiveQuery, type LoadOptions, type MembersOnly, type NumericKeys, type Repository, type RepositoryRelations, type Subscribable, type idType } from './remult3.js';
8
8
  import type { QueryOptions, RefSubscriber, UpsertOptions } from './remult3.js';
9
9
  import type { entityEventListener } from '../__EntityValueProvider.js';
10
- import type { DataProvider, EntityDataProvider, EntityDataProviderGroupByOptions, EntityDataProviderFindOptions, ErrorInfo } from '../data-interfaces.js';
10
+ import { type DataProvider, type EntityDataProvider, type EntityDataProviderGroupByOptions, type EntityDataProviderFindOptions, type ErrorInfo, EntityError } from '../data-interfaces.js';
11
11
  import type { Unsubscribe } from '../live-query/SubscriptionChannel.js';
12
12
  import { RelationLoader } from './relation-loader.js';
13
13
  import { type RepositoryInternal, getInternalKey } from './repository-internals.js';
@@ -114,7 +114,7 @@ declare abstract class rowHelperBase<T> {
114
114
  [key: string]: string | undefined;
115
115
  };
116
116
  protected __assertValidity(): void;
117
- buildErrorInfoObject(): ErrorInfo<unknown>;
117
+ buildErrorInfoObject(): EntityError<unknown>;
118
118
  abstract get fields(): FieldsRef<T>;
119
119
  catchSaveErrors(err: any): any;
120
120
  __clearErrorsAndReportChanged(): void;
@@ -124,7 +124,7 @@ declare abstract class rowHelperBase<T> {
124
124
  originalValues: any;
125
125
  saveOriginalData(): void;
126
126
  saveMoreOriginalData(): void;
127
- validate(): Promise<ErrorInfo<unknown> | undefined>;
127
+ validate(): Promise<EntityError<unknown> | undefined>;
128
128
  __validateEntity(): Promise<void>;
129
129
  __performColumnAndEntityValidations(): Promise<void>;
130
130
  toApiJson(includeRelatedEntities?: boolean, notJustApi?: boolean): any;
@@ -21,6 +21,7 @@ var filter_interfaces_js_1 = require("../filter/filter-interfaces.js");
21
21
  var sort_js_1 = require("../sort.js");
22
22
  var remult3_js_1 = require("./remult3.js");
23
23
  var assign_js_1 = require("../../assign.js");
24
+ var data_interfaces_js_1 = require("../data-interfaces.js");
24
25
  var valueConverters_js_1 = require("../valueConverters.js");
25
26
  var rest_data_provider_js_1 = require("../data-providers/rest-data-provider.js");
26
27
  var remult_proxy_js_1 = require("../remult-proxy.js");
@@ -1966,7 +1967,7 @@ var rowHelperBase = /** @class */ (function () {
1966
1967
  finally { if (e_29) throw e_29.error; }
1967
1968
  }
1968
1969
  }
1969
- return error;
1970
+ return new data_interfaces_js_1.EntityError(error);
1970
1971
  };
1971
1972
  rowHelperBase.prototype.catchSaveErrors = function (err) {
1972
1973
  var _this = this;
@@ -3377,12 +3378,12 @@ var columnDefsImpl = /** @class */ (function () {
3377
3378
  }
3378
3379
  catch (err) {
3379
3380
  var error = "".concat(String(prop), " failed for value ").concat(args === null || args === void 0 ? void 0 : args[0], ". Error: ").concat(typeof err === 'string' ? err : err.message);
3380
- throw {
3381
+ throw new data_interfaces_js_1.EntityError({
3381
3382
  message: _this.caption + ': ' + error,
3382
3383
  modelState: (_a = {},
3383
3384
  _a[_this.key] = error,
3384
3385
  _a),
3385
- };
3386
+ });
3386
3387
  }
3387
3388
  };
3388
3389
  }
@@ -20,6 +20,8 @@ var wnn = [
20
20
  exports.flags = {
21
21
  error500RetryCount: 4,
22
22
  };
23
+ //p1 - make error info an actual error, important for exception handling, and also for auth.js errors that were mistic
24
+ //p1 - add validators min,max,between(range)
23
25
  //p1 - allow experimental route registration on remult server, with at least get route, and support redirect, read header and set header - (and the existing get html etc...)
24
26
  //p2 - add parameter all to deleteMany, and updateMany
25
27
  //p2 filter.apply ApiPreFilter
@@ -20,6 +20,12 @@ export declare class Validators {
20
20
  defaultMessage: ValueValidationMessage<unknown>;
21
21
  };
22
22
  static relationExists: Validator<unknown>;
23
+ static min: ValidatorWithArgs<number, number> & {
24
+ defaultMessage: ValueValidationMessage<number>;
25
+ };
26
+ static max: ValidatorWithArgs<number, number> & {
27
+ defaultMessage: ValueValidationMessage<number>;
28
+ };
23
29
  static maxLength: ValidatorWithArgs<string, number> & {
24
30
  defaultMessage: ValueValidationMessage<number>;
25
31
  };
package/src/validators.js CHANGED
@@ -89,6 +89,8 @@ var Validators = /** @class */ (function () {
89
89
  }
90
90
  });
91
91
  }); }, 'Relation value does not exist');
92
+ Validators.min = createValueValidatorWithArgs(function (val, minValue) { return val >= minValue; }, function (minValue) { return "Value must be bigger than or equal to ".concat(minValue); });
93
+ Validators.max = createValueValidatorWithArgs(function (val, maxValue) { return val <= maxValue; }, function (maxValue) { return "Value must be smaller than or equal to ".concat(maxValue); });
92
94
  Validators.maxLength = createValueValidatorWithArgs(function (val, maxLength) { return val.length <= maxLength; }, function (maxLength) { return "Value must be at most ".concat(maxLength, " characters"); });
93
95
  Validators.minLength = createValueValidatorWithArgs(function (val, minLength) { return val.length >= minLength; }, function (maxLength) { return "Value must be at least ".concat(maxLength, " characters"); });
94
96
  Validators.defaultMessage = 'Invalid value';