@quatrain/core 1.0.0-beta7 → 1.0.0-beta9

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 (48) hide show
  1. package/lib/Backend.d.ts +3 -1
  2. package/lib/Backend.js +1 -0
  3. package/lib/backends/AbstractAdapter.d.ts +2 -1
  4. package/lib/backends/AbstractAdapter.js +2 -2
  5. package/lib/backends/Query.d.ts +2 -2
  6. package/lib/backends/Query.js +2 -2
  7. package/lib/backends/middlewares/InjectMetaMiddleware.d.ts +2 -1
  8. package/lib/backends/middlewares/InjectMetaMiddleware.js +7 -4
  9. package/lib/backends/middlewares/Middleware.d.ts +1 -1
  10. package/lib/backends/middlewares/types/MiddlewareParams.d.ts +3 -0
  11. package/lib/backends/middlewares/types/MiddlewareParams.js +2 -0
  12. package/lib/components/AbstractObject.d.ts +1 -0
  13. package/lib/components/AbstractObject.js +1 -0
  14. package/lib/components/BaseObject.js +1 -0
  15. package/lib/components/DataObject.d.ts +9 -2
  16. package/lib/components/DataObject.js +39 -6
  17. package/lib/components/types/DataObjectClass.d.ts +3 -1
  18. package/lib/components/types/toJSONParams.d.ts +8 -0
  19. package/lib/components/types/toJSONParams.js +2 -0
  20. package/lib/index.d.ts +2 -1
  21. package/lib/index.js +3 -1
  22. package/lib/properties/ArrayProperty.d.ts +1 -1
  23. package/lib/properties/ArrayProperty.js +2 -2
  24. package/lib/properties/BaseProperty.d.ts +4 -1
  25. package/lib/properties/BaseProperty.js +15 -3
  26. package/lib/properties/BooleanProperty.d.ts +1 -1
  27. package/lib/properties/BooleanProperty.js +2 -2
  28. package/lib/properties/CollectionProperty.d.ts +1 -1
  29. package/lib/properties/CollectionProperty.js +2 -2
  30. package/lib/properties/DateTimeProperty.d.ts +1 -1
  31. package/lib/properties/DateTimeProperty.js +2 -2
  32. package/lib/properties/EnumProperty.d.ts +1 -1
  33. package/lib/properties/EnumProperty.js +2 -2
  34. package/lib/properties/HashProperty.d.ts +1 -1
  35. package/lib/properties/HashProperty.js +2 -2
  36. package/lib/properties/MapProperty.d.ts +1 -1
  37. package/lib/properties/MapProperty.js +2 -2
  38. package/lib/properties/NumberProperty.d.ts +1 -1
  39. package/lib/properties/NumberProperty.js +2 -2
  40. package/lib/properties/ObjectProperty.d.ts +1 -1
  41. package/lib/properties/ObjectProperty.js +2 -2
  42. package/lib/properties/StringProperty.d.ts +1 -1
  43. package/lib/properties/StringProperty.js +2 -2
  44. package/lib/properties/types/AbstractPropertyType.d.ts +1 -0
  45. package/lib/properties/types/PropertyClassType.d.ts +3 -1
  46. package/lib/wrappers/cloud/AbstractCloudWrapper.d.ts +4 -0
  47. package/lib/wrappers/cloud/AbstractCloudWrapper.js +9 -0
  48. package/package.json +1 -1
package/lib/Backend.d.ts CHANGED
@@ -3,7 +3,8 @@ export declare enum BackendAction {
3
3
  CREATE = "create",
4
4
  READ = "read",
5
5
  UPDATE = "update",
6
- DELETE = "delete"
6
+ DELETE = "delete",
7
+ WRITE = "write"
7
8
  }
8
9
  /**
9
10
  * Default interface for a backend record
@@ -33,5 +34,6 @@ export interface BackendParameters {
33
34
  config?: any;
34
35
  fixtures?: any;
35
36
  softDelete?: boolean;
37
+ useNativeForeignKeys?: boolean;
36
38
  debug?: boolean;
37
39
  }
package/lib/Backend.js CHANGED
@@ -7,4 +7,5 @@ var BackendAction;
7
7
  BackendAction["READ"] = "read";
8
8
  BackendAction["UPDATE"] = "update";
9
9
  BackendAction["DELETE"] = "delete";
10
+ BackendAction["WRITE"] = "write";
10
11
  })(BackendAction || (exports.BackendAction = BackendAction = {}));
@@ -6,6 +6,7 @@ import { Filters } from './Filters';
6
6
  import { Query, QueryResultType } from './Query';
7
7
  import { SortAndLimit } from './SortAndLimit';
8
8
  import Middleware from './middlewares/Middleware';
9
+ import { MiddlewareParams } from './middlewares/types/MiddlewareParams';
9
10
  export declare abstract class AbstractAdapter implements BackendInterface {
10
11
  static PKEY_IDENTIFIER: any;
11
12
  protected _alias: string;
@@ -37,5 +38,5 @@ export declare abstract class AbstractAdapter implements BackendInterface {
37
38
  query(query: Query<any>): Promise<QueryResultType<DataObjectClass<any>>>;
38
39
  abstract find(dataObject: DataObjectClass<any>, filters: Filters | Filter[] | undefined, pagination: SortAndLimit | undefined, parent: any): Promise<QueryResultType<any>>;
39
40
  log(message: string): void;
40
- executeMiddlewares(dataObject: DataObjectClass<any>, action: BackendAction): Promise<DataObjectClass<any>>;
41
+ executeMiddlewares(dataObject: DataObjectClass<any>, action: BackendAction, params?: MiddlewareParams): Promise<DataObjectClass<any>>;
41
42
  }
@@ -73,10 +73,10 @@ class AbstractAdapter {
73
73
  console.log(message);
74
74
  }
75
75
  }
76
- executeMiddlewares(dataObject, action) {
76
+ executeMiddlewares(dataObject, action, params) {
77
77
  return __awaiter(this, void 0, void 0, function* () {
78
78
  for (const middleware of this._middlewares) {
79
- yield middleware.execute(dataObject, action);
79
+ yield middleware.execute(dataObject, action, params);
80
80
  }
81
81
  return dataObject;
82
82
  });
@@ -33,14 +33,14 @@ export declare class Query<T extends typeof BaseObjectCore> {
33
33
  sortings: Sorting[];
34
34
  limits: Limits;
35
35
  meta: any;
36
- constructor(obj: T, parent?: T | undefined);
36
+ constructor(obj: T, parent?: T);
37
37
  get obj(): T;
38
38
  get parent(): T | undefined;
39
39
  /**
40
40
  * Declare query parent record
41
41
  * This may be need in some NoSQL backend to query subcollections
42
42
  */
43
- set parent(parent: T);
43
+ set parent(parent: T | undefined);
44
44
  where(param: Filter | string, value?: any, operator?: any): this;
45
45
  sortBy(param: Sorting | string, order?: any): this;
46
46
  setLimits(limits: Limits): this;
@@ -26,7 +26,7 @@ var returnAs;
26
26
  returnAs["AS_IS"] = "asIs";
27
27
  })(returnAs || (exports.returnAs = returnAs = {}));
28
28
  class Query {
29
- constructor(obj, parent = undefined) {
29
+ constructor(obj, parent) {
30
30
  this._obj = obj;
31
31
  this._parent = parent;
32
32
  this.filters = [];
@@ -105,7 +105,7 @@ class Query {
105
105
  return { items: instances, meta };
106
106
  });
107
107
  }
108
- execute(as = returnAs.AS_DATAOBJECTS, backend = Core_1.Core.getBackend()) {
108
+ execute(as = returnAs.AS_DATAOBJECTS, backend = Core_1.Core.getBackend(this._obj.DEFAULT_BACKEND)) {
109
109
  return __awaiter(this, void 0, void 0, function* () {
110
110
  //<DataObjectClass<any>[] | ObjectUri[] | Persisted<BaseObject>[]> {
111
111
  //</any><Array<T2> | Array<DataObject> | Array<ObjectUri>> {
@@ -2,11 +2,12 @@ import { DataObjectClass } from '../../components';
2
2
  import { BackendAction } from '../../Backend';
3
3
  import { User } from '../../components/User';
4
4
  import Middleware from './Middleware';
5
+ import { MiddlewareParams } from './types/MiddlewareParams';
5
6
  export interface InjectMetaMiddlewareParams {
6
7
  user: User;
7
8
  }
8
9
  export declare class InjectMetaMiddleware implements Middleware {
9
10
  protected _user: User;
10
11
  constructor(params: InjectMetaMiddlewareParams);
11
- execute(dataObject: DataObjectClass<any>, action: BackendAction): void;
12
+ execute(dataObject: DataObjectClass<any>, action: BackendAction, params?: MiddlewareParams): void;
12
13
  }
@@ -2,24 +2,27 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InjectMetaMiddleware = void 0;
4
4
  const Backend_1 = require("../../Backend");
5
+ const Core_1 = require("../../Core");
5
6
  class InjectMetaMiddleware {
6
7
  constructor(params) {
7
8
  this._user = params.user;
8
9
  }
9
- execute(dataObject, action) {
10
+ execute(dataObject, action, params) {
11
+ Core_1.Core.log(`[MDW] Executing Middleware ${this.constructor.name}`);
12
+ const date = params && params.useDateFormat ? (new Date()).toISOString() : Date.now();
10
13
  switch (action) {
11
14
  // add properties existence validation
12
15
  case Backend_1.BackendAction.CREATE:
13
16
  dataObject.set('createdBy', this._user);
14
- dataObject.set('createdAt', Date.now());
17
+ dataObject.set('createdAt', date);
15
18
  break;
16
19
  case Backend_1.BackendAction.UPDATE:
17
20
  dataObject.set('updatedBy', this._user);
18
- dataObject.set('updatedAt', Date.now());
21
+ dataObject.set('updatedAt', date);
19
22
  break;
20
23
  case Backend_1.BackendAction.DELETE:
21
24
  dataObject.set('deletedBy', this._user);
22
- dataObject.set('deletedAt', Date.now());
25
+ dataObject.set('deletedAt', date);
23
26
  break;
24
27
  default:
25
28
  break;
@@ -1,5 +1,5 @@
1
1
  import { BackendAction } from '../../Backend';
2
2
  import { DataObjectClass } from '../../components';
3
3
  export default interface Middleware {
4
- execute: (dataObject: DataObjectClass<any>, action: BackendAction) => void;
4
+ execute: (dataObject: DataObjectClass<any>, action: BackendAction, params?: any) => void;
5
5
  }
@@ -0,0 +1,3 @@
1
+ export type MiddlewareParams = {
2
+ useDateFormat?: boolean;
3
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,6 +4,7 @@ export declare abstract class AbstractObject {
4
4
  static PROPS_DEFINITION: DataObjectProperties;
5
5
  static COLLECTION: string | undefined;
6
6
  static PARENT_PROP: string | undefined;
7
+ static DEFAULT_BACKEND: string;
7
8
  static LABEL_KEY: string;
8
9
  protected _dataObject: DataObjectClass<any>;
9
10
  constructor(dao: DataObjectClass<any>);
@@ -70,5 +70,6 @@ class AbstractObject {
70
70
  }
71
71
  exports.AbstractObject = AbstractObject;
72
72
  AbstractObject.PROPS_DEFINITION = [];
73
+ AbstractObject.DEFAULT_BACKEND = 'default';
73
74
  // Which property's value to use in backend as label for object reference
74
75
  AbstractObject.LABEL_KEY = 'name';
@@ -37,6 +37,7 @@ exports.BaseObjectProperties = [
37
37
  type: StringProperty_1.StringProperty.TYPE,
38
38
  minLength: 1,
39
39
  maxLength: 100,
40
+ fullSearch: true,
40
41
  htmlType: htmlType.NAME,
41
42
  },
42
43
  {
@@ -3,6 +3,7 @@ import { PropertyClassType } from '../properties/types/PropertyClassType';
3
3
  import { AbstractObject } from './AbstractObject';
4
4
  import { ObjectUri } from './ObjectUri';
5
5
  import { DataObjectClass } from './types/DataObjectClass';
6
+ import { toJSONParams } from './types/toJSONParams';
6
7
  export type CoreObject<T extends AbstractObject> = T;
7
8
  export type Properties = {
8
9
  [x: string]: PropertyClassType;
@@ -45,6 +46,12 @@ export declare class DataObject implements DataObjectClass<any> {
45
46
  */
46
47
  asProxy(): this;
47
48
  setProperties(properties: Properties): void;
49
+ /**
50
+ * Return a map of all propoerties or only those matching the provided type
51
+ * @param type
52
+ * @returns
53
+ */
54
+ getProperties(type?: string): {};
48
55
  addProperty(property: PropertyClassType): void;
49
56
  /**
50
57
  * Populate data object from instant data or backend query
@@ -92,7 +99,7 @@ export declare class DataObject implements DataObjectClass<any> {
92
99
  * @returns any
93
100
  */
94
101
  val(key: string, transform?: string | undefined): any;
95
- toJSON(objectsAsReferences?: boolean): {
102
+ toJSON(params?: boolean | toJSONParams): {
96
103
  [x: string]: any;
97
104
  };
98
105
  toReference(): {
@@ -100,7 +107,7 @@ export declare class DataObject implements DataObjectClass<any> {
100
107
  ref: string;
101
108
  uri: string;
102
109
  };
103
- protected _dataToJSON(objectsAsReferences?: boolean): {};
110
+ protected _dataToJSON(objectsAsReferences?: boolean, ignoreUnchanged?: boolean, converters?: {}): {};
104
111
  read(): Promise<DataObjectClass<any>>;
105
112
  save(): Promise<DataObjectClass<any>>;
106
113
  delete(): Promise<DataObjectClass<any>>;
@@ -76,9 +76,26 @@ class DataObject {
76
76
  // TODO check if doable
77
77
  this._properties = properties;
78
78
  }
79
+ /**
80
+ * Return a map of all propoerties or only those matching the provided type
81
+ * @param type
82
+ * @returns
83
+ */
84
+ getProperties(type) {
85
+ if (type) {
86
+ const matches = {};
87
+ for (let k of Object.keys(this._properties)) {
88
+ if (this._properties[k].constructor.name === type) {
89
+ Reflect.set(matches, k, this._properties[k]);
90
+ }
91
+ }
92
+ return matches;
93
+ }
94
+ return this._properties;
95
+ }
79
96
  addProperty(property) {
80
97
  if (Object.keys(this._properties).includes(property.name)) {
81
- throw new Error(`Property ${name} already exists`);
98
+ throw new Error(`Property ${property.name} already exists`);
82
99
  }
83
100
  this._properties[property.name] = property;
84
101
  }
@@ -119,10 +136,10 @@ class DataObject {
119
136
  'label' in val &&
120
137
  typeof val.label == 'string') {
121
138
  const { ref, label } = val;
122
- Reflect.get(this._properties, key).set(new ObjectUri_1.ObjectUri(ref, label));
139
+ Reflect.get(this._properties, key).set(new ObjectUri_1.ObjectUri(ref, label), false);
123
140
  }
124
141
  else {
125
- Reflect.get(this._properties, key).set(data[key]);
142
+ Reflect.get(this._properties, key).set(data[key], false);
126
143
  }
127
144
  }
128
145
  }
@@ -230,16 +247,28 @@ class DataObject {
230
247
  throw new Error(`Unknown property '${key}'`);
231
248
  }
232
249
  }
233
- toJSON(objectsAsReferences = false) {
234
- return Object.assign(Object.assign({}, (this.uri && { uid: this.uri.uid, path: this.uri.path })), this._dataToJSON(objectsAsReferences));
250
+ toJSON(params = false) {
251
+ let objectsAsReferences = false, withoutURIData = false, ignoreUnchanged = false, converters = {};
252
+ if (typeof params === 'object') {
253
+ // Any missing parameter should resolve to false
254
+ objectsAsReferences = Boolean(params.objectsAsReferences);
255
+ withoutURIData = Boolean(params.withoutURIData);
256
+ ignoreUnchanged = Boolean(params.ignoreUnchanged);
257
+ converters = params.converters;
258
+ }
259
+ return Object.assign(Object.assign({}, (!withoutURIData &&
260
+ this.uri && { uid: this.uri.uid, path: this.uri.path })), this._dataToJSON(objectsAsReferences, ignoreUnchanged, converters));
235
261
  }
236
262
  toReference() {
237
263
  return Object.assign(Object.assign({}, this._objectUri.toReference()), { label: this.val('name') || '' });
238
264
  }
239
- _dataToJSON(objectsAsReferences = false) {
265
+ _dataToJSON(objectsAsReferences = false, ignoreUnchanged = false, converters = {}) {
240
266
  const data = {};
241
267
  Object.keys(this._properties).forEach((key) => {
242
268
  const prop = Reflect.get(this._properties, key);
269
+ if (ignoreUnchanged && prop.hasChanged === false)
270
+ return;
271
+ console.log(prop.constructor.name);
243
272
  switch (prop.constructor.name) {
244
273
  case 'CollectionProperty':
245
274
  // ignore
@@ -260,8 +289,12 @@ class DataObject {
260
289
  case 'ArrayProperty':
261
290
  Reflect.set(data, key, prop.val() || []);
262
291
  break;
292
+ case 'DateTimeProperty':
293
+ Reflect.set(data, key, prop.val(Reflect.get(converters, 'datetime')) || null);
294
+ break;
263
295
  default:
264
296
  Reflect.set(data, key, prop.val() || null);
297
+ break;
265
298
  }
266
299
  });
267
300
  return data;
@@ -1,5 +1,6 @@
1
1
  import { PropertyClassType } from '../../properties/types/PropertyClassType';
2
2
  import { ObjectUri } from '../ObjectUri';
3
+ import { toJSONParams } from './toJSONParams';
3
4
  export interface DataObjectClass<T extends DataObjectClass<any>> {
4
5
  uri: ObjectUri;
5
6
  uid: any;
@@ -9,6 +10,7 @@ export interface DataObjectClass<T extends DataObjectClass<any>> {
9
10
  properties: any;
10
11
  parentProp: string | undefined;
11
12
  setProperties(properties: any): void;
13
+ getProperties(type: any): any;
12
14
  addProperty(property: PropertyClassType): void;
13
15
  populate(data?: any): Promise<T>;
14
16
  isPopulated(): boolean;
@@ -22,7 +24,7 @@ export interface DataObjectClass<T extends DataObjectClass<any>> {
22
24
  delete(): Promise<T>;
23
25
  clone(data?: any): Promise<T>;
24
26
  toReference(): any;
25
- toJSON(objectsAsReferences?: boolean): any;
27
+ toJSON(params?: boolean | toJSONParams): any;
26
28
  populateFromData(data: {
27
29
  [x: string]: unknown;
28
30
  }): this;
@@ -0,0 +1,8 @@
1
+ export type toJSONParams = {
2
+ objectsAsReferences?: boolean;
3
+ withoutURIData?: boolean;
4
+ ignoreUnchanged?: boolean;
5
+ converters?: {
6
+ [propType: string]: Function;
7
+ };
8
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/lib/index.d.ts CHANGED
@@ -30,4 +30,5 @@ import { AuthAction, AuthParameters, AuthParametersKeys } from './Auth';
30
30
  import { AuthInterface, AbstractAuthAdapter, AuthenticationError } from './authentication';
31
31
  import { AbstractAdapter, MockAdapter, BackendError, Query, QueryMetaType, QueryResultType, Filter, Filters, Limits, Sorting, SortAndLimit } from './backends';
32
32
  import { BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, GoneError } from './common/ResourcesErrors';
33
- export { statuses, utils, Core, Property, BaseProperty, BasePropertyType, BooleanProperty, BooleanPropertyType, DateTimeProperty, DateTimePropertyType, EnumProperty, EnumPropertyType, HashProperty, HashPropertyType, ObjectProperty, ObjectPropertyType, StringProperty, StringPropertyType, AbstractAdapter, RepositoryClass, MockAdapter, ObjectUri, DataObjectClass, DataObject, AbstractObject, BaseObject, BaseObjectCore, BaseObjectProperties, AuthAction, AuthParameters, AuthParametersKeys, AuthInterface, AbstractAuthAdapter, AuthenticationError, BackendParameters, BackendParametersKeys, BackendRecordType, BackendAction, BaseRepository, BackendError, Query, QueryMetaType, QueryResultType, Filter, Filters, Limits, Sorting, SortAndLimit, Middleware, InjectMetaMiddleware, InjectKeywordsMiddleware, User, UserType, Proxy, UserRepository, Entity, EntityType, EntityRepository, BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, GoneError, };
33
+ import { AbstractCloudWrapper } from './wrappers/cloud/AbstractCloudWrapper';
34
+ export { statuses, utils, Core, Property, BaseProperty, BasePropertyType, BooleanProperty, BooleanPropertyType, DateTimeProperty, DateTimePropertyType, EnumProperty, EnumPropertyType, HashProperty, HashPropertyType, ObjectProperty, ObjectPropertyType, StringProperty, StringPropertyType, AbstractAdapter, RepositoryClass, MockAdapter, ObjectUri, DataObjectClass, DataObject, AbstractObject, BaseObject, BaseObjectCore, BaseObjectProperties, AuthAction, AuthParameters, AuthParametersKeys, AuthInterface, AbstractAuthAdapter, AuthenticationError, BackendParameters, BackendParametersKeys, BackendRecordType, BackendAction, BaseRepository, BackendError, Query, QueryMetaType, QueryResultType, Filter, Filters, Limits, Sorting, SortAndLimit, Middleware, InjectMetaMiddleware, InjectKeywordsMiddleware, User, UserType, Proxy, UserRepository, Entity, EntityType, EntityRepository, BadRequestError, UnauthorizedError, ForbiddenError, NotFoundError, GoneError, AbstractCloudWrapper, };
package/lib/index.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.GoneError = exports.NotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.BadRequestError = exports.EntityRepository = exports.Entity = exports.UserRepository = exports.User = exports.InjectKeywordsMiddleware = exports.InjectMetaMiddleware = exports.SortAndLimit = exports.Sorting = exports.Limits = exports.Filters = exports.Filter = exports.Query = exports.BackendError = exports.BaseRepository = exports.BackendAction = exports.AuthenticationError = exports.AbstractAuthAdapter = exports.AuthAction = exports.BaseObjectProperties = exports.BaseObjectCore = exports.AbstractObject = exports.DataObject = exports.ObjectUri = exports.MockAdapter = exports.AbstractAdapter = exports.StringProperty = exports.ObjectProperty = exports.HashProperty = exports.EnumProperty = exports.DateTimeProperty = exports.BooleanProperty = exports.BaseProperty = exports.Property = exports.Core = exports.utils = exports.statuses = void 0;
29
+ exports.AbstractCloudWrapper = exports.GoneError = exports.NotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.BadRequestError = exports.EntityRepository = exports.Entity = exports.UserRepository = exports.User = exports.InjectKeywordsMiddleware = exports.InjectMetaMiddleware = exports.SortAndLimit = exports.Sorting = exports.Limits = exports.Filters = exports.Filter = exports.Query = exports.BackendError = exports.BaseRepository = exports.BackendAction = exports.AuthenticationError = exports.AbstractAuthAdapter = exports.AuthAction = exports.BaseObjectProperties = exports.BaseObjectCore = exports.AbstractObject = exports.DataObject = exports.ObjectUri = exports.MockAdapter = exports.AbstractAdapter = exports.StringProperty = exports.ObjectProperty = exports.HashProperty = exports.EnumProperty = exports.DateTimeProperty = exports.BooleanProperty = exports.BaseProperty = exports.Property = exports.Core = exports.utils = exports.statuses = void 0;
30
30
  const Core_1 = require("./Core");
31
31
  Object.defineProperty(exports, "Core", { enumerable: true, get: function () { return Core_1.Core; } });
32
32
  const statuses = __importStar(require("./common/statuses"));
@@ -96,3 +96,5 @@ Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: fun
96
96
  Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return ResourcesErrors_1.ForbiddenError; } });
97
97
  Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return ResourcesErrors_1.NotFoundError; } });
98
98
  Object.defineProperty(exports, "GoneError", { enumerable: true, get: function () { return ResourcesErrors_1.GoneError; } });
99
+ const AbstractCloudWrapper_1 = require("./wrappers/cloud/AbstractCloudWrapper");
100
+ Object.defineProperty(exports, "AbstractCloudWrapper", { enumerable: true, get: function () { return AbstractCloudWrapper_1.AbstractCloudWrapper; } });
@@ -15,7 +15,7 @@ export declare class ArrayProperty extends BaseProperty {
15
15
  get minLength(): number;
16
16
  set maxLength(max: number);
17
17
  get maxLength(): number;
18
- set(value: Array<any>): this;
18
+ set(value: Array<any>, setChanged?: boolean): this;
19
19
  get(transform?: Function | undefined): any;
20
20
  toJSON(): any[] | undefined;
21
21
  }
@@ -30,7 +30,7 @@ class ArrayProperty extends BaseProperty_1.BaseProperty {
30
30
  get maxLength() {
31
31
  return this._maxLength;
32
32
  }
33
- set(value) {
33
+ set(value, setChanged = true) {
34
34
  if (!Array.isArray(value)) {
35
35
  throw new Error(`value ${JSON.stringify(value)} is not an array`);
36
36
  }
@@ -49,7 +49,7 @@ class ArrayProperty extends BaseProperty_1.BaseProperty {
49
49
  /\d/.test(joined)) {
50
50
  throw new Error(`Numbers are not allowed in value`);
51
51
  }
52
- return super.set(value);
52
+ return super.set(value, setChanged);
53
53
  }
54
54
  get(transform = undefined) {
55
55
  return transform ? transform(this._value) : this._value;
@@ -16,6 +16,7 @@ export declare class BaseProperty implements PropertyClassType {
16
16
  static EVENT_ONCHANGE: string;
17
17
  static EVENT_ONDELETE: string;
18
18
  protected _parent: DataObjectClass<any> | undefined;
19
+ protected _id: string;
19
20
  protected _name: string;
20
21
  protected _value: any;
21
22
  protected _mandatory: boolean;
@@ -23,6 +24,7 @@ export declare class BaseProperty implements PropertyClassType {
23
24
  protected _allows: String[];
24
25
  protected _htmlType: PropertyHTMLType;
25
26
  protected _defaultValue: any;
27
+ protected _hasChanged: boolean;
26
28
  protected _events: {
27
29
  [key: EventTypes]: Function;
28
30
  };
@@ -33,7 +35,8 @@ export declare class BaseProperty implements PropertyClassType {
33
35
  get allows(): String[];
34
36
  set htmlType(type: PropertyHTMLType);
35
37
  get htmlType(): PropertyHTMLType;
36
- set(value: any): this;
38
+ get hasChanged(): boolean;
39
+ set(value: any, setChanged?: boolean): this;
37
40
  val(transform?: any): any;
38
41
  protected _enable(value: boolean | undefined): boolean;
39
42
  toJSON(): any;
@@ -10,11 +10,13 @@ class BaseProperty {
10
10
  this._htmlType = 'off';
11
11
  this._events = {};
12
12
  this._parent = config.parent;
13
+ this._id = config.id || config.name.toLowerCase();
13
14
  this._name = config.name;
14
15
  this._protected = config.protected || false;
15
16
  this._mandatory = config.mandatory || false;
16
17
  this._defaultValue = config.defaultValue;
17
18
  this._value = config.defaultValue;
19
+ this._hasChanged = false;
18
20
  this._htmlType = config.htmlType || 'off';
19
21
  if (typeof config.onChange === 'function') {
20
22
  this._events.onChange = config.onChange;
@@ -38,21 +40,31 @@ class BaseProperty {
38
40
  get htmlType() {
39
41
  return this._htmlType;
40
42
  }
41
- set(value) {
43
+ get hasChanged() {
44
+ return this._hasChanged;
45
+ }
46
+ set(value, setChanged = true) {
42
47
  if (this._value !== undefined &&
43
48
  this._value !== null &&
44
49
  this._value !== this._defaultValue &&
45
50
  this._protected === true) {
46
51
  throw new Error(`Value '${this._name}' already defined as '${this._value}' and protected from change`);
47
52
  }
48
- this._value = value;
53
+ if (value !== this._value) {
54
+ console.log(this.name, value, this._value);
55
+ this._value = value;
56
+ this._hasChanged = setChanged;
57
+ }
49
58
  if (this._events[BaseProperty.EVENT_ONCHANGE]) {
50
59
  this._events[BaseProperty.EVENT_ONCHANGE](this._parent);
51
60
  }
52
61
  return this;
53
62
  }
54
63
  val(transform = undefined) {
55
- return transform ? transform(this._value) : this._value || this._defaultValue;
64
+ console.log(transform && transform(this._value), typeof transform);
65
+ return typeof transform === 'function'
66
+ ? transform(this._value)
67
+ : this._value || this._defaultValue;
56
68
  }
57
69
  _enable(value) {
58
70
  return value === undefined || value === true;
@@ -3,5 +3,5 @@ export interface BooleanPropertyType extends BasePropertyType {
3
3
  }
4
4
  export declare class BooleanProperty extends BaseProperty {
5
5
  static TYPE: string;
6
- set(value: boolean): this;
6
+ set(value: boolean, setChanged?: boolean): this;
7
7
  }
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BooleanProperty = void 0;
4
4
  const BaseProperty_1 = require("./BaseProperty");
5
5
  class BooleanProperty extends BaseProperty_1.BaseProperty {
6
- set(value) {
7
- return super.set(value);
6
+ set(value, setChanged = true) {
7
+ return super.set(value, setChanged);
8
8
  }
9
9
  }
10
10
  exports.BooleanProperty = BooleanProperty;
@@ -20,7 +20,7 @@ export declare class CollectionProperty extends BaseProperty {
20
20
  protected _filters: Filter[] | Filter | undefined;
21
21
  constructor(config: CollectionPropertyType);
22
22
  protected _setQuery(filters?: Filter[]): Query<typeof BaseObjectCore>;
23
- set(value: Array<any>): this;
23
+ set(value: Array<any>, setChanged?: boolean): this;
24
24
  /**
25
25
  * get objects matching collection class and filters
26
26
  * in the requested format
@@ -42,8 +42,8 @@ class CollectionProperty extends BaseProperty_1.BaseProperty {
42
42
  }
43
43
  return query;
44
44
  }
45
- set(value) {
46
- return super.set(value);
45
+ set(value, setChanged = true) {
46
+ return super.set(value, setChanged);
47
47
  }
48
48
  /**
49
49
  * get objects matching collection class and filters
@@ -6,6 +6,6 @@ export declare class DateTimeProperty extends BaseProperty {
6
6
  static TYPE: string;
7
7
  protected _timezone: string;
8
8
  constructor(config: DateTimePropertyType);
9
- set(value: string | Date): this;
9
+ set(value: string | Date, setChanged?: boolean): this;
10
10
  get timezone(): string;
11
11
  }
@@ -7,8 +7,8 @@ class DateTimeProperty extends BaseProperty_1.BaseProperty {
7
7
  super(config);
8
8
  this._timezone = config.timezone || 'Z';
9
9
  }
10
- set(value) {
11
- return super.set(value);
10
+ set(value, setChanged = true) {
11
+ return super.set(value, setChanged);
12
12
  }
13
13
  get timezone() {
14
14
  return this._timezone;
@@ -6,6 +6,6 @@ export declare class EnumProperty extends BaseProperty {
6
6
  static TYPE: string;
7
7
  protected _values: string[];
8
8
  constructor(config: EnumPropertyType);
9
- set(value: string): this;
9
+ set(value: string, setChanged?: boolean): this;
10
10
  get values(): string[];
11
11
  }
@@ -8,11 +8,11 @@ class EnumProperty extends BaseProperty_1.BaseProperty {
8
8
  this._values = [];
9
9
  this._values = config.values || [];
10
10
  }
11
- set(value) {
11
+ set(value, setChanged = true) {
12
12
  if (value !== null && !this._values.includes(value)) {
13
13
  throw new Error(`Value '${value}' is not acceptable`);
14
14
  }
15
- return super.set(value);
15
+ return super.set(value, setChanged);
16
16
  }
17
17
  get values() {
18
18
  return this._values;
@@ -22,6 +22,6 @@ export declare class HashProperty extends StringProperty {
22
22
  * @returns
23
23
  */
24
24
  get(transform?: string | undefined): string | undefined;
25
- set(value: string): this;
25
+ set(value: string, setChanged?: boolean): this;
26
26
  compare(value: string): boolean;
27
27
  }
@@ -42,8 +42,8 @@ class HashProperty extends StringProperty_1.StringProperty {
42
42
  get(transform) {
43
43
  return;
44
44
  }
45
- set(value) {
46
- return super.set(this._hash(value));
45
+ set(value, setChanged = true) {
46
+ return super.set(this._hash(value), setChanged);
47
47
  }
48
48
  compare(value) {
49
49
  return this._hash(value) === this._value;
@@ -3,6 +3,6 @@ export interface MapPropertyType extends BasePropertyType {
3
3
  }
4
4
  export declare class MapProperty extends BaseProperty {
5
5
  static TYPE: string;
6
- set(value: any): this;
6
+ set(value: any, setChanged?: boolean): this;
7
7
  toJSON(): {};
8
8
  }
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MapProperty = void 0;
4
4
  const BaseProperty_1 = require("./BaseProperty");
5
5
  class MapProperty extends BaseProperty_1.BaseProperty {
6
- set(value) {
6
+ set(value, setChanged = true) {
7
7
  if (typeof value !== 'object') {
8
8
  throw new Error(`value ${JSON.stringify(value)} is not an object`);
9
9
  }
10
- return super.set(value);
10
+ return super.set(value, setChanged);
11
11
  }
12
12
  toJSON() {
13
13
  return this._value ? JSON.stringify(this._value) : {};
@@ -27,7 +27,7 @@ export declare class NumberProperty extends BaseProperty {
27
27
  protected _precision: number;
28
28
  protected _value: number | undefined;
29
29
  constructor(config: NumberPropertyType);
30
- set(value: number): this;
30
+ set(value: number, setChanged?: boolean): this;
31
31
  val(transform?: string | undefined): string | number | undefined;
32
32
  set minVal(min: number | undefined);
33
33
  get minVal(): number | undefined;
@@ -27,7 +27,7 @@ class NumberProperty extends BaseProperty_1.BaseProperty {
27
27
  this._sign = config.sign;
28
28
  }
29
29
  }
30
- set(value) {
30
+ set(value, setChanged = true) {
31
31
  if (this._sign === NumberProperty.TYPE_UNSIGNED && value < 0) {
32
32
  throw new Error(`Value must be unsigned`);
33
33
  }
@@ -40,7 +40,7 @@ class NumberProperty extends BaseProperty_1.BaseProperty {
40
40
  if (this._type === NumberProperty.TYPE_INTEGER) {
41
41
  value = Math.floor(value);
42
42
  }
43
- return super.set(value);
43
+ return super.set(value, setChanged);
44
44
  }
45
45
  val(transform = undefined) {
46
46
  switch (transform) {
@@ -10,6 +10,6 @@ export declare class ObjectProperty extends BaseProperty {
10
10
  _instanceOf: any;
11
11
  constructor(config: ObjectPropertyType);
12
12
  val(transform?: string | undefined): any;
13
- set(value: object): this;
13
+ set(value: object, setChanged?: boolean): this;
14
14
  toJSON(): any;
15
15
  }
@@ -63,13 +63,13 @@ class ObjectProperty extends BaseProperty_1.BaseProperty {
63
63
  return this._value;
64
64
  }
65
65
  }
66
- set(value) {
66
+ set(value, setChanged = true) {
67
67
  if (value instanceof ObjectUri_1.ObjectUri &&
68
68
  value instanceof DataObject_1.DataObject &&
69
69
  value.constructor.name !== this._instanceOf.constructor.name) {
70
70
  throw new Error(`value ${JSON.stringify(value)} is not an instance of ${this._instanceOf.constructor.name}`);
71
71
  }
72
- return super.set(value);
72
+ return super.set(value, setChanged);
73
73
  }
74
74
  toJSON() {
75
75
  if (this._value instanceof ObjectUri_1.ObjectUri) {
@@ -26,7 +26,7 @@ export declare class StringProperty extends BaseProperty {
26
26
  */
27
27
  protected _rawValue: boolean;
28
28
  constructor(config: StringPropertyType);
29
- set(value: any): this;
29
+ set(value: any, setChanged?: boolean): this;
30
30
  get(transform?: string | undefined): string | undefined;
31
31
  set minLength(min: number);
32
32
  get minLength(): number;
@@ -27,7 +27,7 @@ class StringProperty extends BaseProperty_1.BaseProperty {
27
27
  this._allows.push(StringProperty.ALLOW_LETTERS);
28
28
  }
29
29
  }
30
- set(value) {
30
+ set(value, setChanged = true) {
31
31
  if (value !== null && value !== undefined) {
32
32
  if (this._allows.includes(StringProperty.ALLOW_DIGITS) === false &&
33
33
  /\d/.test(value)) {
@@ -52,7 +52,7 @@ class StringProperty extends BaseProperty_1.BaseProperty {
52
52
  throw new Error(`${this._name}: value '${value}' is too long`);
53
53
  }
54
54
  }
55
- return super.set(value);
55
+ return super.set(value, setChanged);
56
56
  }
57
57
  get(transform = undefined) {
58
58
  switch (transform) {
@@ -1,5 +1,6 @@
1
1
  import { PropertyTypes } from './PropertyTypes';
2
2
  export interface AbstractPropertyType {
3
3
  name: string;
4
+ id?: string;
4
5
  type?: PropertyTypes;
5
6
  }
@@ -1,8 +1,10 @@
1
1
  import { AbstractPropertyType } from './AbstractPropertyType';
2
2
  export interface PropertyClassType {
3
+ id?: string;
3
4
  name: string;
4
- set(value: any): AbstractPropertyType;
5
+ set(value: any, setCahnged?: boolean): AbstractPropertyType;
5
6
  val(transform?: any): any;
6
7
  toJSON(): any;
7
8
  clone(): PropertyClassType;
9
+ hasChanged?: boolean;
8
10
  }
@@ -0,0 +1,4 @@
1
+ export declare class AbstractCloudWrapper {
2
+ protected _params: any;
3
+ constructor(params: any);
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractCloudWrapper = void 0;
4
+ class AbstractCloudWrapper {
5
+ constructor(params) {
6
+ this._params = params;
7
+ }
8
+ }
9
+ exports.AbstractCloudWrapper = AbstractCloudWrapper;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quatrain/core",
3
- "version": "1.0.0-beta7",
3
+ "version": "1.0.0-beta9",
4
4
  "description": "Core objects for business apps",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",