@quatrain/core 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/lib/Backend.d.ts +5 -0
  2. package/lib/Backend.js +7 -0
  3. package/lib/Core.d.ts +23 -3
  4. package/lib/Core.js +24 -5
  5. package/lib/backends/AbstractAdapter.d.ts +29 -13
  6. package/lib/backends/AbstractAdapter.js +31 -3
  7. package/lib/backends/Filter.d.ts +5 -3
  8. package/lib/backends/Filter.js +1 -1
  9. package/lib/backends/MockAdapter.d.ts +11 -12
  10. package/lib/backends/MockAdapter.js +126 -35
  11. package/lib/backends/NotFoundError.d.ts +2 -0
  12. package/lib/backends/NotFoundError.js +6 -0
  13. package/lib/backends/Query.d.ts +11 -3
  14. package/lib/backends/Query.js +30 -4
  15. package/lib/backends/middlewares/AbstractMiddleware.d.ts +0 -0
  16. package/lib/backends/middlewares/AbstractMiddleware.js +1 -0
  17. package/lib/backends/middlewares/InjectMetaMiddleware.d.ts +11 -0
  18. package/lib/backends/middlewares/InjectMetaMiddleware.js +50 -0
  19. package/lib/components/AbstractObject.d.ts +13 -10
  20. package/lib/components/AbstractObject.js +11 -2
  21. package/lib/components/BaseObject.d.ts +10 -11
  22. package/lib/components/BaseObject.js +42 -33
  23. package/lib/components/BaseObjectProperties.d.ts +6 -8
  24. package/lib/components/BaseObjectProperties.js +14 -9
  25. package/lib/components/DataObject.d.ts +25 -18
  26. package/lib/components/DataObject.js +63 -33
  27. package/lib/components/Entity.d.ts +6 -0
  28. package/lib/components/Entity.js +26 -0
  29. package/lib/components/EntityProperties.d.ts +1 -0
  30. package/lib/components/EntityProperties.js +47 -0
  31. package/lib/components/ObjectUri.d.ts +5 -2
  32. package/lib/components/ObjectUri.js +23 -8
  33. package/lib/components/User.d.ts +6 -4
  34. package/lib/components/User.js +78 -8
  35. package/lib/components/UserProperties.d.ts +1 -0
  36. package/lib/components/UserProperties.js +103 -0
  37. package/lib/components/index.d.ts +6 -3
  38. package/lib/components/index.js +5 -2
  39. package/lib/components/types/AbstractObjectClass.d.ts +6 -0
  40. package/lib/components/types/AbstractObjectClass.js +2 -0
  41. package/lib/components/types/BaseObjectClass.d.ts +6 -0
  42. package/lib/components/types/BaseObjectClass.js +2 -0
  43. package/lib/components/types/DataObjectClass.d.ts +23 -0
  44. package/lib/components/types/DataObjectClass.js +2 -0
  45. package/lib/components/types/EntityClass.d.ts +3 -0
  46. package/lib/components/types/EntityClass.js +2 -0
  47. package/lib/components/types/UserClass.d.ts +3 -0
  48. package/lib/components/types/UserClass.js +2 -0
  49. package/lib/index.d.ts +5 -1
  50. package/lib/index.js +7 -1
  51. package/lib/properties/ArrayProperty.d.ts +1 -0
  52. package/lib/properties/ArrayProperty.js +6 -5
  53. package/lib/properties/BaseProperty.d.ts +10 -4
  54. package/lib/properties/BaseProperty.js +11 -1
  55. package/lib/properties/BooleanProperty.d.ts +2 -1
  56. package/lib/properties/BooleanProperty.js +3 -2
  57. package/lib/properties/CollectionProperty.d.ts +32 -0
  58. package/lib/properties/CollectionProperty.js +63 -0
  59. package/lib/properties/DateTimeProperty.d.ts +1 -0
  60. package/lib/properties/DateTimeProperty.js +1 -0
  61. package/lib/properties/EnumProperty.d.ts +2 -0
  62. package/lib/properties/EnumProperty.js +5 -1
  63. package/lib/properties/HashProperty.d.ts +1 -0
  64. package/lib/properties/HashProperty.js +1 -0
  65. package/lib/properties/MapProperty.d.ts +8 -0
  66. package/lib/properties/MapProperty.js +17 -0
  67. package/lib/properties/NumberProperty.d.ts +1 -0
  68. package/lib/properties/NumberProperty.js +1 -0
  69. package/lib/properties/ObjectProperty.d.ts +4 -7
  70. package/lib/properties/ObjectProperty.js +4 -1
  71. package/lib/properties/Property.d.ts +3 -7
  72. package/lib/properties/Property.js +13 -15
  73. package/lib/properties/StringProperty.d.ts +10 -0
  74. package/lib/properties/StringProperty.js +42 -21
  75. package/lib/properties/index.d.ts +4 -2
  76. package/lib/properties/index.js +5 -1
  77. package/lib/properties/types/PropertyClassType.d.ts +4 -2
  78. package/lib/properties/types/PropertyHTMLType.d.ts +10 -0
  79. package/lib/properties/types/PropertyHTMLType.js +14 -0
  80. package/lib/properties/types/PropertyTypes.d.ts +4 -1
  81. package/lib/utils/DataGenerator.d.ts +9 -0
  82. package/lib/utils/DataGenerator.js +98 -0
  83. package/lib/utils/index.d.ts +2 -0
  84. package/lib/utils/index.js +5 -0
  85. package/package.json +3 -1
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.InjectMetaMiddleware = void 0;
27
+ const actions = __importStar(require("../../Backend"));
28
+ class InjectMetaMiddleware {
29
+ constructor(params) {
30
+ this._user = params.user;
31
+ }
32
+ execute(dataObject, action) {
33
+ switch (action) {
34
+ // add properties existence validation
35
+ case actions.CREATE:
36
+ dataObject.set('createdBy', this._user);
37
+ dataObject.set('createdAt', Date.now());
38
+ case actions.UPDATE:
39
+ dataObject.set('updatedBy', this._user);
40
+ dataObject.set('updatedAt', Date.now());
41
+ case actions.DELETE:
42
+ dataObject.set('deletedBy', this._user);
43
+ dataObject.set('deleteddAt', Date.now());
44
+ default:
45
+ break;
46
+ }
47
+ return;
48
+ }
49
+ }
50
+ exports.InjectMetaMiddleware = InjectMetaMiddleware;
@@ -1,23 +1,26 @@
1
- import { DataObject } from './DataObject';
1
+ import { DataObjectClass } from './types/DataObjectClass';
2
2
  import { DataObjectProperties } from '../properties/';
3
+ import { Query } from '../backends/Query';
3
4
  export declare abstract class AbstractObject {
4
5
  static PROPS_DEFINITION: DataObjectProperties;
5
6
  static COLLECTION: string;
6
7
  static LABEL_KEY: string;
7
- protected _dataObject: DataObject;
8
- constructor(dao: DataObject);
8
+ protected _dataObject: DataObjectClass<any>;
9
+ constructor(dao: DataObjectClass<any>);
9
10
  get(key: string): any;
10
- set(key: string, val: any): DataObject;
11
+ set(key: string, val: any): any;
11
12
  val(key: string): any;
12
- get backend(): string | undefined;
13
+ get backend(): any;
13
14
  get path(): string;
14
- get uid(): string | undefined;
15
- get dataObject(): DataObject;
15
+ get uid(): any;
16
+ get dataObject(): DataObjectClass<any>;
16
17
  get uri(): import("./ObjectUri").ObjectUri;
17
18
  toJSON(): {
18
- literal: string;
19
+ backend: string;
19
20
  ref: string;
20
- label: string | undefined;
21
+ label: string;
21
22
  };
22
- save(uid?: string | undefined): Promise<DataObject>;
23
+ save(): Promise<DataObjectClass<any>>;
24
+ delete(): Promise<DataObjectClass<any>>;
25
+ static query(): Query<typeof AbstractObject>;
23
26
  }
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  var _a;
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.AbstractObject = void 0;
14
+ const Query_1 = require("../backends/Query");
14
15
  class AbstractObject {
15
16
  constructor(dao) {
16
17
  this._dataObject = dao;
@@ -49,11 +50,19 @@ class AbstractObject {
49
50
  var _b;
50
51
  return typeof this.uri === 'string' ? this.uri : (_b = this.uri) === null || _b === void 0 ? void 0 : _b.toJSON();
51
52
  }
52
- save(uid = undefined) {
53
+ save() {
53
54
  return __awaiter(this, void 0, void 0, function* () {
54
- return yield this._dataObject.save(uid);
55
+ return yield this._dataObject.save();
55
56
  });
56
57
  }
58
+ delete() {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ return yield this._dataObject.delete();
61
+ });
62
+ }
63
+ static query() {
64
+ return new Query_1.Query(this);
65
+ }
57
66
  }
58
67
  exports.AbstractObject = AbstractObject;
59
68
  _a = AbstractObject;
@@ -1,16 +1,15 @@
1
1
  import { ObjectUri } from './ObjectUri';
2
+ import { DataObjectClass } from './types/DataObjectClass';
3
+ import { BaseObjectClass } from './types/BaseObjectClass';
2
4
  import { AbstractObject } from './AbstractObject';
3
- import { DataObjectProperties } from '../properties';
4
- import { Query } from '../backends';
5
- export declare class BaseObject extends AbstractObject {
6
- static PROPS_DEFINITION: DataObjectProperties;
5
+ import { Query } from '../backends/Query';
6
+ export declare class BaseObject extends AbstractObject implements BaseObjectClass {
7
+ static PROPS_DEFINITION: any;
8
+ static getProperty(key: string): any;
7
9
  get status(): string;
8
10
  set status(status: string);
9
- static factory<T extends BaseObject>(src?: string | ObjectUri | object | undefined): Promise<T | BaseObject>;
10
- asReference(): {
11
- label: any;
12
- ref: string;
13
- uri: string;
14
- };
15
- query(): Query<this>;
11
+ static daoFactory(src?: string | ObjectUri | DataObjectClass<any> | undefined, child?: any): Promise<DataObjectClass<any>>;
12
+ static factory<T extends BaseObject>(src?: string | ObjectUri | DataObjectClass<any> | undefined, child?: any): Promise<T | BaseObject>;
13
+ asReference(): any;
14
+ query(): Query<any>;
16
15
  }
@@ -10,51 +10,60 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.BaseObject = void 0;
13
- const DataObject_1 = require("./DataObject");
14
13
  const ObjectUri_1 = require("./ObjectUri");
15
14
  const AbstractObject_1 = require("./AbstractObject");
16
15
  const BaseObjectProperties_1 = require("./BaseObjectProperties");
17
- const backends_1 = require("../backends");
16
+ const Query_1 = require("../backends/Query");
17
+ const DataObject_1 = require("./DataObject");
18
18
  class BaseObject extends AbstractObject_1.AbstractObject {
19
+ static getProperty(key) {
20
+ return BaseObject.PROPS_DEFINITION.find((prop) => prop.name === key);
21
+ }
19
22
  get status() {
20
23
  return this._dataObject.val('status');
21
24
  }
22
25
  set status(status) {
23
26
  this._dataObject.set('status', status);
24
27
  }
25
- static factory(src = undefined) {
28
+ static daoFactory(src = undefined, child = this) {
26
29
  return __awaiter(this, void 0, void 0, function* () {
27
- try {
28
- // merge base properties with additional or redefined ones
29
- const base = BaseObjectProperties_1.BaseObjectProperties;
30
- // this.PROPS_DEFINITION &&
31
- this.PROPS_DEFINITION.forEach((property) => {
32
- // manage parent properties potential redeclaration
33
- const found = base.findIndex((el) => el.name === property.name);
34
- if (found !== -1) {
35
- base[found] = Object.assign(base[found], property);
36
- }
37
- else {
38
- base.push(property);
39
- }
40
- });
41
- //console.log('props to add', JSON.stringify(base))
42
- // create data object
43
- const dao = yield DataObject_1.DataObject.factory(this.prototype, base);
44
- if (src instanceof ObjectUri_1.ObjectUri) {
45
- dao.uri = src;
46
- yield dao.populate();
47
- }
48
- else if (typeof src === 'string') {
49
- dao.uri.path = src;
50
- yield dao.populate();
30
+ // merge base properties with additional or redefined ones
31
+ const base = BaseObjectProperties_1.BaseObjectProperties;
32
+ // this.PROPS_DEFINITION &&
33
+ this.PROPS_DEFINITION.forEach((property) => {
34
+ // manage parent properties potential redeclaration
35
+ const found = base.findIndex((el) => el.name === property.name);
36
+ if (found !== -1) {
37
+ base[found] = Object.assign(base[found], property);
51
38
  }
52
- else if (src instanceof Object) {
53
- dao.uri = new ObjectUri_1.ObjectUri(`${this.COLLECTION}${ObjectUri_1.ObjectUri.DEFAULT}`, Reflect.get(src, 'name'));
54
- dao.uri.collection = this.COLLECTION;
55
- yield dao.populate(src);
39
+ else {
40
+ base.push(property);
56
41
  }
57
- return new this(dao);
42
+ });
43
+ // create data object
44
+ const dao = yield DataObject_1.DataObject.factory({ properties: base });
45
+ dao.uri.class = child;
46
+ if (src instanceof ObjectUri_1.ObjectUri) {
47
+ dao.uri = src;
48
+ yield dao.read();
49
+ }
50
+ else if (typeof src === 'string') {
51
+ dao.uri.path = src;
52
+ yield dao.read();
53
+ }
54
+ else if (src instanceof Object) {
55
+ dao.uri = new ObjectUri_1.ObjectUri(`${this.COLLECTION}${ObjectUri_1.ObjectUri.DEFAULT}`, Reflect.get(src, 'name'));
56
+ dao.uri.collection = this.COLLECTION;
57
+ yield dao.populate(src);
58
+ }
59
+ return dao;
60
+ });
61
+ }
62
+ static factory(src = undefined, child = this) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ try {
65
+ const dao = yield this.daoFactory(src, child);
66
+ return Reflect.construct(this, [dao]);
58
67
  }
59
68
  catch (err) {
60
69
  console.log(err.message);
@@ -66,7 +75,7 @@ class BaseObject extends AbstractObject_1.AbstractObject {
66
75
  return this._dataObject.toReference();
67
76
  }
68
77
  query() {
69
- return new backends_1.Query(this);
78
+ return new Query_1.Query(this.constructor.prototype);
70
79
  }
71
80
  }
72
81
  exports.BaseObject = BaseObject;
@@ -1,15 +1,13 @@
1
- import { DataObjectProperties } from '../properties';
2
- import * as statuses from '../statuses';
3
- import { User } from './User';
1
+ import { UserClass } from './types/UserClass';
4
2
  import { ObjectUri } from './ObjectUri';
5
3
  export interface BaseObjectType {
6
4
  name: string;
7
- status: typeof statuses.CREATED | typeof statuses.PENDING | typeof statuses.ACTIVE | typeof statuses.DELETED;
8
- createdBy?: User | ObjectUri;
5
+ status: string;
6
+ createdBy?: UserClass | ObjectUri;
9
7
  createdAt?: number;
10
- updatedBy?: User | ObjectUri;
8
+ updatedBy?: UserClass | ObjectUri;
11
9
  updatedAt?: number;
12
- deletedBy?: User | ObjectUri;
10
+ deletedBy?: UserClass | ObjectUri;
13
11
  deletedAt?: number;
14
12
  }
15
- export declare const BaseObjectProperties: DataObjectProperties;
13
+ export declare const BaseObjectProperties: any;
@@ -24,20 +24,25 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.BaseObjectProperties = void 0;
27
- const Property_1 = require("../properties/Property");
28
27
  const statuses = __importStar(require("../statuses"));
28
+ const StringProperty_1 = require("../properties/StringProperty");
29
+ const ObjectProperty_1 = require("../properties/ObjectProperty");
30
+ const EnumProperty_1 = require("../properties/EnumProperty");
31
+ const DateTimeProperty_1 = require("../properties/DateTimeProperty");
32
+ const htmlType = __importStar(require("../properties/types/PropertyHTMLType"));
29
33
  exports.BaseObjectProperties = [
30
34
  {
31
35
  name: 'name',
32
36
  mandatory: true,
33
- type: Property_1.Property.TYPE_STRING,
37
+ type: StringProperty_1.StringProperty.TYPE,
34
38
  minLength: 1,
35
39
  maxLength: 100,
40
+ htmlType: htmlType.NAME,
36
41
  },
37
42
  {
38
43
  name: 'status',
39
44
  mandatory: true,
40
- type: Property_1.Property.TYPE_ENUM,
45
+ type: EnumProperty_1.EnumProperty.TYPE,
41
46
  values: [
42
47
  statuses.CREATED,
43
48
  statuses.PENDING,
@@ -48,35 +53,35 @@ exports.BaseObjectProperties = [
48
53
  },
49
54
  {
50
55
  name: 'createdBy',
51
- type: Property_1.Property.TYPE_OBJECT,
56
+ type: ObjectProperty_1.ObjectProperty.TYPE,
52
57
  instanceOf: 'User',
53
58
  mandatory: true,
54
59
  protected: true,
55
60
  },
56
61
  {
57
62
  name: 'createdAt',
58
- type: Property_1.Property.TYPE_DATETIME,
63
+ type: DateTimeProperty_1.DateTimeProperty.TYPE,
59
64
  mandatory: true,
60
65
  protected: true,
61
66
  },
62
67
  {
63
68
  name: 'updatedBy',
64
- type: Property_1.Property.TYPE_OBJECT,
69
+ type: ObjectProperty_1.ObjectProperty.TYPE,
65
70
  instanceOf: 'User',
66
71
  },
67
72
  {
68
73
  name: 'updatedAt',
69
- type: Property_1.Property.TYPE_DATETIME,
74
+ type: DateTimeProperty_1.DateTimeProperty.TYPE,
70
75
  },
71
76
  {
72
77
  name: 'deletedBy',
73
- type: Property_1.Property.TYPE_OBJECT,
78
+ type: ObjectProperty_1.ObjectProperty.TYPE,
74
79
  instanceOf: 'User',
75
80
  protected: true,
76
81
  },
77
82
  {
78
83
  name: 'deletedAt',
79
- type: Property_1.Property.TYPE_DATETIME,
84
+ type: DateTimeProperty_1.DateTimeProperty.TYPE,
80
85
  protected: true,
81
86
  },
82
87
  ];
@@ -1,23 +1,29 @@
1
+ import { DataObjectProperties } from '../properties';
2
+ import { PropertyClassType } from '../properties/types/PropertyClassType';
1
3
  import { AbstractObject } from './AbstractObject';
2
4
  import { ObjectUri } from './ObjectUri';
5
+ import { DataObjectClass } from './types/DataObjectClass';
6
+ export declare type CoreObject<T extends AbstractObject> = T;
7
+ export declare type Properties = {
8
+ [x: string]: PropertyClassType;
9
+ };
3
10
  export interface DataObjectFactoryType {
4
11
  path: string;
5
12
  [x: string]: any;
6
13
  }
7
- export declare type CoreObject<T extends AbstractObject> = T;
14
+ export interface DataObjectParams {
15
+ uri?: string | ObjectUri;
16
+ properties: DataObjectProperties;
17
+ }
8
18
  /**
9
19
  * Data objects constitute the agnostic glue between objects and backends.
10
20
  * They handle data and identifiers in a protected registry
11
21
  * This is what backends and objects manipulate, oblivious of the other.
12
22
  */
13
- export declare class DataObject {
14
- protected _class: CoreObject<any>;
23
+ export declare class DataObject implements DataObjectClass<any> {
15
24
  protected _objectUri: ObjectUri;
16
- protected _obj: any;
17
25
  protected _uid: string | undefined;
18
- protected _properties: {
19
- [x: string]: any;
20
- };
26
+ protected _properties: Properties;
21
27
  protected _persisted: boolean;
22
28
  protected _populated: boolean;
23
29
  /**
@@ -26,11 +32,11 @@ export declare class DataObject {
26
32
  protected _modified: boolean;
27
33
  /**
28
34
  * Constructor is protected, use factory() instead
29
- * @param objClass AbstractObject
30
- * @param properties array of properties instances
35
+ * @param params object of parameters
31
36
  */
32
- protected constructor(objClass: AbstractObject, properties: any[] | undefined);
37
+ protected constructor(params: DataObjectParams | undefined);
33
38
  protected _init(properties: any[]): void;
39
+ setProperties(properties: Properties): void;
34
40
  /**
35
41
  * Populate data object from instant data or backend query
36
42
  * @param data
@@ -38,23 +44,22 @@ export declare class DataObject {
38
44
  populate(data?: any): Promise<DataObject>;
39
45
  isPopulated(): boolean;
40
46
  isPersisted(): boolean;
41
- get properties(): {
42
- [x: string]: any;
43
- };
47
+ get properties(): Properties;
44
48
  get backend(): string | undefined;
45
- get class(): any;
46
49
  get path(): string;
47
50
  set uid(uid: string | undefined);
48
51
  get uid(): string | undefined;
49
52
  get data(): any;
50
53
  set uri(uri: string | ObjectUri | undefined);
51
54
  get uri(): ObjectUri;
55
+ get class(): any;
56
+ has(key: string): boolean;
52
57
  /**
53
58
  * Returns property matching key or throw
54
59
  * @param key string
55
60
  * @returns BaseProperty
56
61
  */
57
- get(key: string): any;
62
+ get(key: string): PropertyClassType;
58
63
  set(key: string, val: any): this;
59
64
  /**
60
65
  * Get value of given property
@@ -71,13 +76,15 @@ export declare class DataObject {
71
76
  uri: string;
72
77
  };
73
78
  protected _dataToJSON(): {};
74
- read(): Promise<DataObject>;
75
- save(desiredUid?: string | undefined): Promise<DataObject>;
79
+ read(): Promise<DataObjectClass<any>>;
80
+ save(): Promise<DataObjectClass<any>>;
81
+ delete(): Promise<DataObjectClass<any>>;
76
82
  /**
77
83
  * Data object must be created from factory in order for async-loaded data to be available
78
84
  * @param className
79
85
  * @param param
80
86
  * @returns DataObject
81
87
  */
82
- static factory(className: any, param?: any[] | undefined): Promise<DataObject>;
88
+ static factory(param?: DataObjectParams | undefined): Promise<DataObject>;
89
+ clone(data?: any): Promise<DataObject>;
83
90
  }
@@ -21,10 +21,9 @@ const ObjectUri_1 = require("./ObjectUri");
21
21
  class DataObject {
22
22
  /**
23
23
  * Constructor is protected, use factory() instead
24
- * @param objClass AbstractObject
25
- * @param properties array of properties instances
24
+ * @param params object of parameters
26
25
  */
27
- constructor(objClass, properties) {
26
+ constructor(params) {
28
27
  this._uid = undefined;
29
28
  this._properties = {};
30
29
  this._persisted = false;
@@ -33,20 +32,30 @@ class DataObject {
33
32
  * Has data been modified since last backend operation?
34
33
  */
35
34
  this._modified = false;
36
- this._class = objClass;
37
- this._objectUri = new ObjectUri_1.ObjectUri();
38
- if (Array.isArray(properties)) {
39
- this._init(properties);
35
+ if (params) {
36
+ if (typeof params.uri !== 'object') {
37
+ this._objectUri = new ObjectUri_1.ObjectUri(params.uri);
38
+ }
39
+ else {
40
+ this._objectUri = params.uri;
41
+ }
42
+ }
43
+ else {
44
+ this._objectUri = new ObjectUri_1.ObjectUri();
45
+ }
46
+ if (params && Array.isArray(params.properties)) {
47
+ this._init(params.properties);
40
48
  }
41
49
  }
42
50
  _init(properties) {
43
- // console.log(
44
- // `Preparing properties for instance of ${this._class.constructor.name}`
45
- // )
46
51
  properties.forEach((prop) => {
47
52
  this._properties[prop.name] = Property_1.Property.factory(prop, this);
48
53
  });
49
54
  }
55
+ setProperties(properties) {
56
+ // TODO check if doable
57
+ this._properties = properties;
58
+ }
50
59
  /**
51
60
  * Populate data object from instant data or backend query
52
61
  * @param data
@@ -84,9 +93,6 @@ class DataObject {
84
93
  get backend() {
85
94
  return this._objectUri ? this._objectUri.backend : undefined;
86
95
  }
87
- get class() {
88
- return this._class;
89
- }
90
96
  get path() {
91
97
  return this._objectUri ? this._objectUri.path : '';
92
98
  }
@@ -104,10 +110,20 @@ class DataObject {
104
110
  }
105
111
  set uri(uri) {
106
112
  this._objectUri = uri instanceof ObjectUri_1.ObjectUri ? uri : new ObjectUri_1.ObjectUri(uri);
113
+ if (this._objectUri.collection !== ObjectUri_1.ObjectUri.MISSING_COLLECTION) {
114
+ this._persisted = true;
115
+ }
107
116
  }
108
117
  get uri() {
109
118
  return this._objectUri;
110
119
  }
120
+ get class() {
121
+ // TODO get class type
122
+ return this.uri.class;
123
+ }
124
+ has(key) {
125
+ return Reflect.has(this._properties, key);
126
+ }
111
127
  /**
112
128
  * Returns property matching key or throw
113
129
  * @param key string
@@ -122,7 +138,7 @@ class DataObject {
122
138
  }
123
139
  }
124
140
  set(key, val) {
125
- if (!Reflect.has(this._properties, key)) {
141
+ if (!this.has(key)) {
126
142
  throw new Error(`Unknown property in data object: ${key}`);
127
143
  }
128
144
  this._properties[key].set(val);
@@ -136,7 +152,7 @@ class DataObject {
136
152
  * @returns any
137
153
  */
138
154
  val(key) {
139
- if (Reflect.get(this._properties, key)) {
155
+ if (this.has(key)) {
140
156
  return Reflect.get(this._properties, key).val();
141
157
  }
142
158
  else {
@@ -147,19 +163,19 @@ class DataObject {
147
163
  return Object.assign(Object.assign({}, (this._uid && { uid: this._uid })), this._dataToJSON());
148
164
  }
149
165
  toReference() {
150
- var _a;
151
- return Object.assign(Object.assign({}, (_a = this._objectUri) === null || _a === void 0 ? void 0 : _a.toReference()), { label: this.val('name') });
166
+ return Object.assign(Object.assign({}, this._objectUri.toReference()), { label: this.val('name') || '' });
152
167
  }
153
168
  _dataToJSON() {
154
169
  const data = {};
155
170
  Object.keys(this._properties).forEach((key) => {
156
171
  const prop = Reflect.get(this._properties, key);
157
- if (typeof prop.val() === 'object' &&
158
- Reflect.has(prop.val(), 'toJSON')) {
159
- Reflect.set(data, key, prop.val().toJSON());
160
- }
161
- else if (prop !== undefined) {
162
- Reflect.set(data, key, prop.val());
172
+ const value = prop.val();
173
+ switch (prop.constructor.name) {
174
+ case 'ObjectProperty':
175
+ Reflect.set(data, key, value ? value.toJSON() : null);
176
+ break;
177
+ default:
178
+ Reflect.set(data, key, value || null);
163
179
  }
164
180
  });
165
181
  return data;
@@ -167,7 +183,7 @@ class DataObject {
167
183
  read() {
168
184
  return __awaiter(this, void 0, void 0, function* () {
169
185
  try {
170
- return this.populate(Core_1.Core.getBackend().read(this));
186
+ return this.populate(yield Core_1.Core.getBackend().read(this));
171
187
  }
172
188
  catch (err) {
173
189
  console.log(err.message);
@@ -175,14 +191,20 @@ class DataObject {
175
191
  }
176
192
  });
177
193
  }
178
- save(desiredUid = undefined) {
194
+ save() {
179
195
  return __awaiter(this, void 0, void 0, function* () {
180
196
  const backend = Core_1.Core.getBackend(this.backend || Core_1.Core.defaultBackend);
181
197
  this._persisted = true;
182
198
  this._modified = false;
183
- return this._uid
184
- ? yield backend.update(this)
185
- : yield backend.create(this, desiredUid);
199
+ return this.uid ? backend.update(this) : backend.create(this);
200
+ });
201
+ }
202
+ delete() {
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ const backend = Core_1.Core.getBackend(this.backend || Core_1.Core.defaultBackend);
205
+ this._persisted = false;
206
+ this._modified = false;
207
+ return yield backend.delete(this);
186
208
  });
187
209
  }
188
210
  /**
@@ -191,13 +213,10 @@ class DataObject {
191
213
  * @param param
192
214
  * @returns DataObject
193
215
  */
194
- static factory(className, param = undefined) {
216
+ static factory(param = undefined) {
195
217
  return __awaiter(this, void 0, void 0, function* () {
196
- if (className === undefined) {
197
- throw new Error(`className is a require value`);
198
- }
199
218
  try {
200
- return new this(className, param);
219
+ return new this(param);
201
220
  }
202
221
  catch (err) {
203
222
  console.log(err);
@@ -205,5 +224,16 @@ class DataObject {
205
224
  }
206
225
  });
207
226
  }
227
+ clone(data = {}) {
228
+ return __awaiter(this, void 0, void 0, function* () {
229
+ const cloned = yield DataObject.factory();
230
+ cloned.uri.class = this.uri.class;
231
+ cloned.setProperties(this._properties);
232
+ if (data) {
233
+ yield cloned.populate(data);
234
+ }
235
+ return cloned;
236
+ });
237
+ }
208
238
  }
209
239
  exports.DataObject = DataObject;
@@ -0,0 +1,6 @@
1
+ import { BaseObject } from './BaseObject';
2
+ import { EntityClass } from './types/EntityClass';
3
+ export declare class Entity extends BaseObject implements EntityClass {
4
+ static PROPS_DEFINITION: any;
5
+ static factory(src?: any): Promise<Entity>;
6
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Entity = void 0;
13
+ const BaseObject_1 = require("./BaseObject");
14
+ const EntityProperties_1 = require("./EntityProperties");
15
+ class Entity extends BaseObject_1.BaseObject {
16
+ static factory(src = undefined) {
17
+ const _super = Object.create(null, {
18
+ factory: { get: () => super.factory }
19
+ });
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ return _super.factory.call(this, src, Entity);
22
+ });
23
+ }
24
+ }
25
+ exports.Entity = Entity;
26
+ Entity.PROPS_DEFINITION = EntityProperties_1.EntityProperties;
@@ -0,0 +1 @@
1
+ export declare const EntityProperties: any;