@api-client/core 0.6.13 → 0.6.16

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 (155) hide show
  1. package/build/browser.d.ts +9 -2
  2. package/build/browser.js +12 -2
  3. package/build/browser.js.map +1 -1
  4. package/build/index.d.ts +9 -2
  5. package/build/index.js +12 -2
  6. package/build/index.js.map +1 -1
  7. package/build/src/amf/AmfMixin.d.ts +395 -0
  8. package/build/src/amf/AmfMixin.js +1146 -0
  9. package/build/src/amf/AmfMixin.js.map +1 -0
  10. package/build/src/amf/AmfSerializer.d.ts +136 -0
  11. package/build/src/amf/AmfSerializer.js +1913 -0
  12. package/build/src/amf/AmfSerializer.js.map +1 -0
  13. package/build/src/amf/AmfShapeGenerator.d.ts +85 -0
  14. package/build/src/amf/AmfShapeGenerator.js +385 -0
  15. package/build/src/amf/AmfShapeGenerator.js.map +1 -0
  16. package/build/src/amf/AmfTypes.d.ts +24 -0
  17. package/build/src/amf/AmfTypes.js +122 -0
  18. package/build/src/amf/AmfTypes.js.map +1 -0
  19. package/build/src/amf/ApiExampleGenerator.d.ts +36 -0
  20. package/build/src/amf/ApiExampleGenerator.js +109 -0
  21. package/build/src/amf/ApiExampleGenerator.js.map +1 -0
  22. package/build/src/amf/ApiMonacoSchemaGenerator.d.ts +67 -0
  23. package/build/src/amf/ApiMonacoSchemaGenerator.js +243 -0
  24. package/build/src/amf/ApiMonacoSchemaGenerator.js.map +1 -0
  25. package/build/src/amf/ApiSchemaGenerator.d.ts +55 -0
  26. package/build/src/amf/ApiSchemaGenerator.js +94 -0
  27. package/build/src/amf/ApiSchemaGenerator.js.map +1 -0
  28. package/build/src/amf/ApiSchemaValues.d.ts +98 -0
  29. package/build/src/amf/ApiSchemaValues.js +382 -0
  30. package/build/src/amf/ApiSchemaValues.js.map +1 -0
  31. package/build/src/amf/Utils.d.ts +41 -0
  32. package/build/src/amf/Utils.js +176 -0
  33. package/build/src/amf/Utils.js.map +1 -0
  34. package/build/src/amf/data-node/DataNodeBase.d.ts +31 -0
  35. package/build/src/amf/data-node/DataNodeBase.js +77 -0
  36. package/build/src/amf/data-node/DataNodeBase.js.map +1 -0
  37. package/build/src/amf/data-node/JsonDataNodeGenerator.d.ts +15 -0
  38. package/build/src/amf/data-node/JsonDataNodeGenerator.js +24 -0
  39. package/build/src/amf/data-node/JsonDataNodeGenerator.js.map +1 -0
  40. package/build/src/amf/data-node/UrlEncodedDataNodeGenerator.d.ts +13 -0
  41. package/build/src/amf/data-node/UrlEncodedDataNodeGenerator.js +42 -0
  42. package/build/src/amf/data-node/UrlEncodedDataNodeGenerator.js.map +1 -0
  43. package/build/src/amf/data-node/XmlDataNodeGenerator.d.ts +21 -0
  44. package/build/src/amf/data-node/XmlDataNodeGenerator.js +30 -0
  45. package/build/src/amf/data-node/XmlDataNodeGenerator.js.map +1 -0
  46. package/build/src/amf/definitions/Amf.d.ts +362 -0
  47. package/build/src/amf/definitions/Amf.js +2 -0
  48. package/build/src/amf/definitions/Amf.js.map +1 -0
  49. package/build/src/amf/definitions/Api.d.ts +381 -0
  50. package/build/src/amf/definitions/Api.js +2 -0
  51. package/build/src/amf/definitions/Api.js.map +1 -0
  52. package/build/src/amf/definitions/Base.d.ts +11 -0
  53. package/build/src/amf/definitions/Base.js +2 -0
  54. package/build/src/amf/definitions/Base.js.map +1 -0
  55. package/build/src/amf/definitions/Namespace.d.ts +311 -0
  56. package/build/src/amf/definitions/Namespace.js +330 -0
  57. package/build/src/amf/definitions/Namespace.js.map +1 -0
  58. package/build/src/amf/definitions/Shapes.d.ts +309 -0
  59. package/build/src/amf/definitions/Shapes.js +87 -0
  60. package/build/src/amf/definitions/Shapes.js.map +1 -0
  61. package/build/src/amf/models/AmfDataNode.d.ts +68 -0
  62. package/build/src/amf/models/AmfDataNode.js +188 -0
  63. package/build/src/amf/models/AmfDataNode.js.map +1 -0
  64. package/build/src/amf/shape/ShapeBase.d.ts +75 -0
  65. package/build/src/amf/shape/ShapeBase.js +90 -0
  66. package/build/src/amf/shape/ShapeBase.js.map +1 -0
  67. package/build/src/amf/shape/ShapeJsonSchemaGenerator.d.ts +46 -0
  68. package/build/src/amf/shape/ShapeJsonSchemaGenerator.js +406 -0
  69. package/build/src/amf/shape/ShapeJsonSchemaGenerator.js.map +1 -0
  70. package/build/src/amf/shape/ShapeXmlSchemaGenerator.d.ts +84 -0
  71. package/build/src/amf/shape/ShapeXmlSchemaGenerator.js +820 -0
  72. package/build/src/amf/shape/ShapeXmlSchemaGenerator.js.map +1 -0
  73. package/build/src/models/Thing.d.ts +17 -0
  74. package/build/src/models/Thing.js +19 -1
  75. package/build/src/models/Thing.js.map +1 -1
  76. package/build/src/models/data/Bindings.d.ts +161 -0
  77. package/build/src/models/data/Bindings.js +2 -0
  78. package/build/src/models/data/Bindings.js.map +1 -0
  79. package/build/src/models/data/DataAssociation.d.ts +135 -14
  80. package/build/src/models/data/DataAssociation.js +154 -21
  81. package/build/src/models/data/DataAssociation.js.map +1 -1
  82. package/build/src/models/data/DataAssociationSchema.d.ts +36 -0
  83. package/build/src/models/data/DataEntity.d.ts +76 -4
  84. package/build/src/models/data/DataEntity.js +136 -9
  85. package/build/src/models/data/DataEntity.js.map +1 -1
  86. package/build/src/models/data/DataFile.d.ts +3 -0
  87. package/build/src/models/data/DataFile.js +3 -0
  88. package/build/src/models/data/DataFile.js.map +1 -1
  89. package/build/src/models/data/DataModel.d.ts +1 -1
  90. package/build/src/models/data/DataModel.js.map +1 -1
  91. package/build/src/models/data/DataNamespace.d.ts +6 -0
  92. package/build/src/models/data/DataNamespace.js +11 -1
  93. package/build/src/models/data/DataNamespace.js.map +1 -1
  94. package/build/src/models/data/DataProperty.d.ts +131 -36
  95. package/build/src/models/data/DataProperty.js +200 -17
  96. package/build/src/models/data/DataProperty.js.map +1 -1
  97. package/data/apis/oas-date/oas-date.yaml +28 -0
  98. package/data/apis/oas-types/oas-types.yaml +159 -0
  99. package/data/apis/oas-unions/oas-unions.yaml +75 -0
  100. package/data/apis/raml-date/raml-date.raml +28 -0
  101. package/data/apis/recursive/recursive.raml +14 -0
  102. package/data/apis/schema-api/examples/person.json +14 -0
  103. package/data/apis/schema-api/examples/person.raml +14 -0
  104. package/data/apis/schema-api/examples/person.url.encoded +1 -0
  105. package/data/apis/schema-api/examples/person.xml +14 -0
  106. package/data/apis/schema-api/library/demo-types.raml +43 -0
  107. package/data/apis/schema-api/schema-api.raml +644 -0
  108. package/data/apis/schema-api/schemas/person.json +104 -0
  109. package/data/apis/schema-api/schemas/person.xsd +26 -0
  110. package/data/apis/schema-api/types/DemoPerson.raml +67 -0
  111. package/data/model.js +106 -0
  112. package/data/models/oas-date.json +637 -0
  113. package/data/models/oas-types.json +5352 -0
  114. package/data/models/oas-unions.json +1881 -0
  115. package/data/models/raml-date.json +1096 -0
  116. package/data/models/recursive.json +610 -0
  117. package/data/models/schema-api.json +37319 -0
  118. package/package.json +9 -6
  119. package/src/amf/AmfMixin.ts +1623 -0
  120. package/src/amf/AmfSerializer.ts +2028 -0
  121. package/src/amf/AmfShapeGenerator.ts +400 -0
  122. package/src/amf/AmfTypes.ts +126 -0
  123. package/src/amf/ApiExampleGenerator.ts +112 -0
  124. package/src/amf/ApiMonacoSchemaGenerator.ts +296 -0
  125. package/src/amf/ApiSchemaGenerator.ts +108 -0
  126. package/src/amf/ApiSchemaValues.ts +411 -0
  127. package/src/amf/Utils.ts +182 -0
  128. package/src/amf/data-node/DataNodeBase.ts +81 -0
  129. package/src/amf/data-node/JsonDataNodeGenerator.ts +26 -0
  130. package/src/amf/data-node/README.md +3 -0
  131. package/src/amf/data-node/UrlEncodedDataNodeGenerator.ts +43 -0
  132. package/src/amf/data-node/XmlDataNodeGenerator.ts +38 -0
  133. package/src/amf/definitions/Amf.ts +443 -0
  134. package/src/amf/definitions/Api.ts +427 -0
  135. package/src/amf/definitions/Base.ts +13 -0
  136. package/src/amf/definitions/Namespace.ts +341 -0
  137. package/src/amf/definitions/Shapes.ts +414 -0
  138. package/src/amf/models/AmfDataNode.ts +200 -0
  139. package/src/amf/shape/README.md +4 -0
  140. package/src/amf/shape/ShapeBase.ts +160 -0
  141. package/src/amf/shape/ShapeJsonSchemaGenerator.ts +422 -0
  142. package/src/amf/shape/ShapeXmlSchemaGenerator.ts +876 -0
  143. package/src/models/Thing.ts +25 -1
  144. package/src/models/data/Bindings.ts +186 -0
  145. package/src/models/data/DataAssociation.ts +226 -29
  146. package/src/models/data/DataAssociationSchema.ts +38 -0
  147. package/src/models/data/DataEntity.ts +170 -13
  148. package/src/models/data/DataFile.ts +3 -0
  149. package/src/models/data/DataModel.ts +1 -1
  150. package/src/models/data/DataNamespace.ts +16 -1
  151. package/src/models/data/DataProperty.ts +250 -47
  152. package/build/src/models/data/DataPropertySchema.d.ts +0 -125
  153. package/build/src/models/data/DataPropertySchema.js +0 -33
  154. package/build/src/models/data/DataPropertySchema.js.map +0 -1
  155. package/src/models/data/DataPropertySchema.ts +0 -156
@@ -1,12 +1,24 @@
1
+ import { Core as JsonCore } from '@api-client/json';
2
+ import { AmfShapeGenerator } from '../../amf/AmfShapeGenerator.js';
1
3
  import v4 from '../../lib/uuid.js';
2
4
  import { Thing } from "../Thing.js";
3
5
  export const Kind = 'Core#DataAssociation';
6
+ /**
7
+ * Describes an association between entities. An association is another property of an entity. The `name` is the name of the
8
+ * property and the value is the associated target or targets.
9
+ *
10
+ * An association can have multiple targets to allow describing the model as `allOf`, `anyOf` and `oneOf` schemas.
11
+ * When the association has only one target, then generated schema cannot have union types.
12
+ *
13
+ * Depending on the schema translation an association can be embedded as a sub-object in the generated schema
14
+ * or can be references via a primary key.
15
+ */
4
16
  export class DataAssociation {
5
17
  root;
6
18
  kind = Kind;
7
19
  key = '';
8
20
  /**
9
- * The description of the data namespace.
21
+ * The description of the data association.
10
22
  */
11
23
  info = Thing.fromName('');
12
24
  /**
@@ -18,22 +30,59 @@ export class DataAssociation {
18
30
  */
19
31
  multiple;
20
32
  /**
21
- * The target entity of this association.
33
+ * Whether the attribute is hidden in the schema (not a part of it).
34
+ * The hidden attribute should only appear in the adapted attribute.
35
+ * Has no effect when added to the "main" attribute.
36
+ */
37
+ hidden;
38
+ /**
39
+ * The list of keys associated with the entity through this association.
22
40
  * An association without a target is considered invalid and discarded when processing the values.
23
41
  */
24
- target;
42
+ targets = [];
25
43
  /**
26
44
  * The schema allowing to translate the model into a specific format (like JSON, RAML, XML, etc.)
27
45
  *
28
- * Implementation note, when an entity is removed this property is not changed. The target can't
29
- * be read but it can be tracked to a deleted entity.
46
+ * When this is defined then it is used as the schema. When this is not defined it uses
47
+ * referenced entities schemas. Note, changes in the referenced entities may not be propagated
48
+ * to schemas altered by the user.
49
+ *
50
+ * Note, schema can only occur on an adapted property. Has no effect on the "main"
51
+ * property.
30
52
  */
31
53
  schema;
54
+ /**
55
+ * The key of the association that is adapted by this association.
56
+ * Adapted associations can manipulate the shape of the schema for the association.
57
+ *
58
+ * Each value defined on the adapted association changes the original value defined on
59
+ * the association.
60
+ */
61
+ adapts;
62
+ /**
63
+ * Returns true when the association has 0 or 1 targets.
64
+ */
65
+ get isSingle() {
66
+ return this.targets.length < 2;
67
+ }
68
+ /**
69
+ * Creates an instance of DataAssociation from a target entity key.
70
+ * Note, this entity will have no name. The default name is used instead.
71
+ *
72
+ * @param root The namespace root.
73
+ * @param target The target entity key.
74
+ */
32
75
  static fromTarget(root, target) {
33
76
  const assoc = new DataAssociation(root);
34
- assoc.target = target;
77
+ assoc.targets = [target];
35
78
  return assoc;
36
79
  }
80
+ /**
81
+ * Creates an instance of DataAssociation from a name, without defining a target.
82
+ *
83
+ * @param root The namespace root.
84
+ * @param name The name of the association.
85
+ */
37
86
  static fromName(root, name) {
38
87
  const assoc = new DataAssociation(root);
39
88
  assoc.info = Thing.fromName(name);
@@ -55,7 +104,7 @@ export class DataAssociation {
55
104
  init = {
56
105
  kind: Kind,
57
106
  key: v4(),
58
- info: Thing.fromName('').toJSON(),
107
+ info: Thing.fromName('Unnamed association').toJSON(),
59
108
  };
60
109
  }
61
110
  this.new(init);
@@ -64,7 +113,7 @@ export class DataAssociation {
64
113
  if (!DataAssociation.isDataAssociation(init)) {
65
114
  throw new Error(`Not a data association.`);
66
115
  }
67
- const { info, key = v4(), kind = Kind, schema, multiple, required, target } = init;
116
+ const { info, key = v4(), kind = Kind, schema, multiple, required, targets, adapts, hidden, } = init;
68
117
  this.kind = kind;
69
118
  this.key = key;
70
119
  if (info) {
@@ -74,7 +123,7 @@ export class DataAssociation {
74
123
  this.info = Thing.fromName('');
75
124
  }
76
125
  if (schema) {
77
- this.schema = { ...schema };
126
+ this.schema = JsonCore.clone(schema);
78
127
  }
79
128
  else {
80
129
  this.schema = undefined;
@@ -91,11 +140,23 @@ export class DataAssociation {
91
140
  else {
92
141
  this.required = undefined;
93
142
  }
94
- if (typeof target === 'string') {
95
- this.target = target;
143
+ if (Array.isArray(targets)) {
144
+ this.targets = [...targets];
145
+ }
146
+ else {
147
+ this.targets = [];
148
+ }
149
+ if (typeof hidden === 'boolean') {
150
+ this.hidden = hidden;
151
+ }
152
+ else {
153
+ this.hidden = undefined;
154
+ }
155
+ if (typeof adapts === 'string') {
156
+ this.adapts = adapts;
96
157
  }
97
158
  else {
98
- this.target = undefined;
159
+ this.adapts = undefined;
99
160
  }
100
161
  }
101
162
  static isDataAssociation(input) {
@@ -112,7 +173,7 @@ export class DataAssociation {
112
173
  info: this.info.toJSON(),
113
174
  };
114
175
  if (this.schema) {
115
- result.schema = { ...this.schema };
176
+ result.schema = JsonCore.clone(this.schema);
116
177
  }
117
178
  if (typeof this.multiple === 'boolean') {
118
179
  result.multiple = this.multiple;
@@ -120,17 +181,23 @@ export class DataAssociation {
120
181
  if (typeof this.required === 'boolean') {
121
182
  result.required = this.required;
122
183
  }
123
- if (typeof this.target === 'string') {
124
- result.target = this.target;
184
+ if (Array.isArray(this.targets) && this.targets.length) {
185
+ result.targets = [...this.targets];
186
+ }
187
+ if (typeof this.hidden === 'boolean') {
188
+ result.hidden = this.hidden;
189
+ }
190
+ if (this.adapts) {
191
+ result.adapts = this.adapts;
125
192
  }
126
193
  return result;
127
194
  }
128
- getTarget() {
129
- const { root, target } = this;
130
- if (!target) {
131
- return undefined;
132
- }
133
- return root.definitions.entities.find(i => i.key === target);
195
+ /**
196
+ * @returns The list of DataEntity definitions for the current targets.
197
+ */
198
+ getTargets() {
199
+ const { root, targets } = this;
200
+ return root.definitions.entities.filter(item => targets.some(i => i === item.key));
134
201
  }
135
202
  /**
136
203
  * Removes self from the parent entity and the namespace definition.
@@ -147,5 +214,71 @@ export class DataAssociation {
147
214
  this.root.definitions.associations.splice(defIndex, 1);
148
215
  }
149
216
  }
217
+ /**
218
+ * @param init The key of an entity, its instance, or schema.
219
+ */
220
+ addTarget(init) {
221
+ if (typeof init === 'string') {
222
+ this.targets.push(init);
223
+ }
224
+ else {
225
+ const { key } = init;
226
+ this.targets.push(key);
227
+ }
228
+ }
229
+ /**
230
+ * Removes a target entity from the targets list.
231
+ *
232
+ * @param init The key of an entity, its instance, or schema.
233
+ */
234
+ removeTarget(init) {
235
+ let key;
236
+ if (typeof init === 'string') {
237
+ key = init;
238
+ }
239
+ else {
240
+ key = init.key;
241
+ }
242
+ const index = this.targets.indexOf(key);
243
+ if (index >= 0) {
244
+ this.targets.splice(index, 1);
245
+ }
246
+ }
247
+ /**
248
+ * Creates a Property Shape of AMF.
249
+ * The property itself is auto-generated. If the `schema` is defined then it is used
250
+ * as the `range` of the property. Otherwise basic shape is generated for the range.
251
+ *
252
+ * This is a preferred way of reading the AMF shape as this synchronizes changed
253
+ * data properties with the shape definition.
254
+ *
255
+ * @returns AMF property shape definition.
256
+ */
257
+ toApiShape() {
258
+ const serializer = new AmfShapeGenerator();
259
+ return serializer.associationProperty(this);
260
+ }
261
+ /**
262
+ * @returns The adapted association, if any
263
+ */
264
+ readAdapted() {
265
+ const { adapts } = this;
266
+ if (!adapts) {
267
+ return undefined;
268
+ }
269
+ return this.root.definitions.associations.find(i => i.key === adapts);
270
+ }
271
+ /**
272
+ * Creates new adapted association and associates it with this association.
273
+ * @returns The instance of the created association.
274
+ */
275
+ createAdapted() {
276
+ const association = new DataAssociation(this.root);
277
+ // disallow defaults as this would influence the schema generation
278
+ association.info.name = undefined;
279
+ this.root.definitions.associations.push(association);
280
+ this.adapts = association.key;
281
+ return association;
282
+ }
150
283
  }
151
284
  //# sourceMappingURL=DataAssociation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataAssociation.js","sourceRoot":"","sources":["../../../../src/models/data/DataAssociation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnC,OAAO,EAAU,KAAK,EAAE,MAAM,aAAa,CAAC;AAK5C,MAAM,CAAC,MAAM,IAAI,GAAG,sBAAsB,CAAC;AA+B3C,MAAM,OAAO,eAAe;IAiDJ;IAhDtB,IAAI,GAAG,IAAI,CAAC;IAEZ,GAAG,GAAG,EAAE,CAAC;IAET;;OAEG;IACH,IAAI,GAAU,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAW;IAEnB;;OAEG;IACH,QAAQ,CAAW;IAEnB;;;OAGG;IACH,MAAM,CAAU;IAEhB;;;;;OAKG;IACH,MAAM,CAA0B;IAEhC,MAAM,CAAC,UAAU,CAAC,IAAmB,EAAE,MAAc;QACnD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAmB,EAAE,IAAY;QAC/C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,YAAsB,IAAmB,EAAE,KAAiC;QAAtD,SAAI,GAAJ,IAAI,CAAe;QACvC,IAAI,IAAsB,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC1B;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,IAAI,GAAG,KAAK,CAAC;SACd;aAAM;YACL,IAAI,GAAG;gBACL,IAAI,EAAE,IAAI;gBACV,GAAG,EAAE,EAAE,EAAE;gBACT,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;aAClC,CAAC;SACH;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,GAAG,CAAC,IAAsB;QACxB,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAChC;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;SACzB;QACD,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC1B;aAAM;YACL,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC3B;QACD,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC1B;aAAM;YACL,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC3B;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;SACzB;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,KAAc;QACrC,MAAM,KAAK,GAAG,KAAyB,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;YACjC,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAqB;YAC/B,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;SACzB,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;SACpC;QACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SACjC;QACD,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SACjC;QACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;YACnC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;SAC7B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS;QACP,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACzF,IAAI,MAAM,EAAE;YACV,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;SAC3C;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;SACxD;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"DataAssociation.js","sourceRoot":"","sources":["../../../../src/models/data/DataAssociation.ts"],"names":[],"mappings":"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"}
@@ -29,4 +29,40 @@ export interface IDataAssociationSchema {
29
29
  * ```
30
30
  */
31
31
  embedded?: boolean;
32
+ /**
33
+ * Describes XML specific serialization.
34
+ */
35
+ xml?: {
36
+ /**
37
+ * The name of the attribute or a wrapped property to use when serializing the property.
38
+ *
39
+ * ```
40
+ * <Person fullName="John Doe"></Person>
41
+ * ```
42
+ */
43
+ name?: string;
44
+ /**
45
+ * When the property is an array (has the `multiple` set to true)
46
+ * then it tells that the list of values should be wrapped with a parent
47
+ * element:
48
+ *
49
+ * ```
50
+ * <Person>
51
+ * <Person fullName="John Doe"></Person>
52
+ * </Person>
53
+ * ```
54
+ *
55
+ * Use this with the combination with `name` to describe the name of the wrapped
56
+ * element
57
+ *
58
+ * ```
59
+ * <people>
60
+ * <Person fullName="John Doe"></Person>
61
+ * </people>
62
+ * ```
63
+ *
64
+ * Note, this is mutually exclusive with `attribute`.
65
+ */
66
+ wrapped?: boolean;
67
+ };
32
68
  }
@@ -4,6 +4,7 @@ import { DataProperty, DataPropertyType } from "./DataProperty.js";
4
4
  import { DataAssociation } from "./DataAssociation.js";
5
5
  import { IBreadcrumb } from "../store/Breadcrumb.js";
6
6
  import { DataModel } from "./DataModel.js";
7
+ import { INodeShape, IShapeUnion } from "../../amf/definitions/Shapes.js";
7
8
  export declare const Kind = "Core#DataEntity";
8
9
  /**
9
10
  * Data entity is the smallest description of a data in the system
@@ -47,13 +48,33 @@ export interface IDataEntity {
47
48
  * with inconsistent definition of a schema because the last read property wins.
48
49
  */
49
50
  parents?: string[];
51
+ /**
52
+ * Whether this entity is deprecated.
53
+ */
54
+ deprecated?: boolean;
55
+ /**
56
+ * The schema allowing to translate the model into a specific format (like JSON, RAML, XML, etc.)
57
+ *
58
+ * Schema limitations:
59
+ *
60
+ * - can only occur on an adapted property. Has no effect on the "main" property.
61
+ */
62
+ schema?: INodeShape;
63
+ /**
64
+ * The key of the entity that is adapted by this entity.
65
+ * Adapted entities can manipulate the shape of the schema for the entity.
66
+ *
67
+ * Each value defined on the adapted entity changes the original value defined on
68
+ * the entity.
69
+ */
70
+ adapts?: string;
50
71
  }
51
72
  /**
52
73
  * Data entity is the smallest description of a data in the system
53
74
  * It contains properties and associations. At least one entity describe a data model.
54
75
  */
55
76
  export declare class DataEntity {
56
- protected root: DataNamespace;
77
+ root: DataNamespace;
57
78
  kind: string;
58
79
  key: string;
59
80
  /**
@@ -88,6 +109,18 @@ export declare class DataEntity {
88
109
  * with inconsistent definition of a schema because the last read property wins.
89
110
  */
90
111
  parents: string[];
112
+ /**
113
+ * Whether this entity is deprecated.
114
+ */
115
+ deprecated?: boolean;
116
+ /**
117
+ * The key of the entity that is adapted by this entity.
118
+ * Adapted entities can manipulate the shape of the schema for the entity.
119
+ *
120
+ * Each value defined on the adapted entity changes the original value defined on
121
+ * the entity.
122
+ */
123
+ adapts?: string;
91
124
  static fromName(root: DataNamespace, name: string): DataEntity;
92
125
  /**
93
126
  * @param input The data entity definition to restore.
@@ -103,7 +136,7 @@ export declare class DataEntity {
103
136
  * @param type The type of the property
104
137
  * @returns The created property
105
138
  */
106
- addTypedProperty(type: DataPropertyType): DataProperty;
139
+ addTypedProperty(type: DataPropertyType, name?: string): DataProperty;
107
140
  /**
108
141
  * Creates a property with a passed type.
109
142
  * @param name The name of the property.
@@ -126,7 +159,7 @@ export declare class DataEntity {
126
159
  * @param target The target entity key of the association
127
160
  * @returns The created association
128
161
  */
129
- addTargetAssociation(target: string): DataAssociation;
162
+ addTargetAssociation(target: string, name?: string): DataAssociation;
130
163
  /**
131
164
  * Removes an association from the entity and namespace definitions.
132
165
  * @param key The key of the association to remove.
@@ -135,8 +168,9 @@ export declare class DataEntity {
135
168
  /**
136
169
  * Reads the list of parents for the entity, inside the root namespace. The computed list contains the list of all
137
170
  * parents in the inheritance chain in no particular order.
171
+ * @param recursive Whether to include parent parents as well.
138
172
  */
139
- getComputedParents(): DataEntity[];
173
+ getComputedParents(recursive?: boolean): DataEntity[];
140
174
  /**
141
175
  * Computes list of all children, inside the root namespace, that extends this entity.
142
176
  * The children are not ordered.
@@ -192,4 +226,42 @@ export declare class DataEntity {
192
226
  * Creates breadcrumbs from this entity to the root namespace.
193
227
  */
194
228
  breadcrumbs(): IBreadcrumb[];
229
+ /**
230
+ * Adds a new tag to the property. It also populates the root namespace's tags when tag is new.
231
+ *
232
+ * Note, it does nothing when the tag is already defined.
233
+ *
234
+ * @param tag The tag to add.
235
+ */
236
+ addTag(tag: string): void;
237
+ /**
238
+ * Removes a tag from the property. Unlike the `addTag()` this won't remove a `tag` from the root namespace.
239
+ *
240
+ * @param tag The tag to remove.
241
+ */
242
+ removeTag(tag: string): void;
243
+ /**
244
+ * Creates a Shape of AMF.
245
+ * The property itself is auto-generated. If the `schema` is defined then it is used
246
+ * as the `range` of the property. Otherwise basic shape is generated for the range.
247
+ *
248
+ * This is a preferred way of reading the AMF shape as this synchronizes changed
249
+ * data properties with the shape definition.
250
+ *
251
+ * @returns AMF property shape definition.
252
+ */
253
+ toApiShape(): IShapeUnion;
254
+ /**
255
+ * Reads the schema of the Entity and generates an example for it.
256
+ */
257
+ toExample(mime: string): string | number | boolean | null | undefined;
258
+ /**
259
+ * @returns The adapted entity, if any
260
+ */
261
+ readAdapted(): DataEntity | undefined;
262
+ /**
263
+ * Creates new adapted entity and associates it with this entity.
264
+ * @returns The instance of the created entity.
265
+ */
266
+ createAdapted(): DataEntity;
195
267
  }
@@ -2,6 +2,8 @@ import { Thing } from "../Thing.js";
2
2
  import v4 from '../../lib/uuid.js';
3
3
  import { DataProperty } from "./DataProperty.js";
4
4
  import { DataAssociation } from "./DataAssociation.js";
5
+ import { AmfShapeGenerator } from "../../amf/AmfShapeGenerator.js";
6
+ import { ApiSchemaGenerator } from "../../amf/ApiSchemaGenerator.js";
5
7
  export const Kind = 'Core#DataEntity';
6
8
  /**
7
9
  * Data entity is the smallest description of a data in the system
@@ -43,6 +45,18 @@ export class DataEntity {
43
45
  * with inconsistent definition of a schema because the last read property wins.
44
46
  */
45
47
  parents = [];
48
+ /**
49
+ * Whether this entity is deprecated.
50
+ */
51
+ deprecated;
52
+ /**
53
+ * The key of the entity that is adapted by this entity.
54
+ * Adapted entities can manipulate the shape of the schema for the entity.
55
+ *
56
+ * Each value defined on the adapted entity changes the original value defined on
57
+ * the entity.
58
+ */
59
+ adapts;
46
60
  static fromName(root, name) {
47
61
  const entity = new DataEntity(root);
48
62
  entity.info = Thing.fromName(name);
@@ -73,7 +87,7 @@ export class DataEntity {
73
87
  if (!DataEntity.isDataEntity(init)) {
74
88
  throw new Error(`Not a data entity.`);
75
89
  }
76
- const { info, key = v4(), kind = Kind, tags, taxonomy, parents, properties, associations } = init;
90
+ const { info, key = v4(), kind = Kind, tags, taxonomy, parents, properties, associations, deprecated, adapts, } = init;
77
91
  this.kind = kind;
78
92
  this.key = key;
79
93
  if (info) {
@@ -118,6 +132,18 @@ export class DataEntity {
118
132
  }
119
133
  });
120
134
  }
135
+ if (typeof deprecated === 'boolean') {
136
+ this.deprecated = deprecated;
137
+ }
138
+ else {
139
+ this.deprecated = undefined;
140
+ }
141
+ if (typeof adapts === 'string') {
142
+ this.adapts = adapts;
143
+ }
144
+ else {
145
+ this.adapts = undefined;
146
+ }
121
147
  }
122
148
  static isDataEntity(input) {
123
149
  const typed = input;
@@ -147,6 +173,12 @@ export class DataEntity {
147
173
  if (Array.isArray(this.associations) && this.associations.length) {
148
174
  result.associations = this.associations.map(i => i.key);
149
175
  }
176
+ if (typeof this.deprecated === 'boolean') {
177
+ result.deprecated = this.deprecated;
178
+ }
179
+ if (this.adapts) {
180
+ result.adapts = this.adapts;
181
+ }
150
182
  return result;
151
183
  }
152
184
  _readAssociation(key) {
@@ -160,8 +192,11 @@ export class DataEntity {
160
192
  * @param type The type of the property
161
193
  * @returns The created property
162
194
  */
163
- addTypedProperty(type) {
195
+ addTypedProperty(type, name) {
164
196
  const property = DataProperty.fromType(this.root, type);
197
+ if (name) {
198
+ property.info.name = name;
199
+ }
165
200
  this.root.definitions.properties.push(property);
166
201
  this.properties.push(property);
167
202
  return property;
@@ -208,8 +243,11 @@ export class DataEntity {
208
243
  * @param target The target entity key of the association
209
244
  * @returns The created association
210
245
  */
211
- addTargetAssociation(target) {
246
+ addTargetAssociation(target, name) {
212
247
  const result = DataAssociation.fromTarget(this.root, target);
248
+ if (name) {
249
+ result.info.name = name;
250
+ }
213
251
  this.root.definitions.associations.push(result);
214
252
  this.associations.push(result);
215
253
  return result;
@@ -232,15 +270,18 @@ export class DataEntity {
232
270
  /**
233
271
  * Reads the list of parents for the entity, inside the root namespace. The computed list contains the list of all
234
272
  * parents in the inheritance chain in no particular order.
273
+ * @param recursive Whether to include parent parents as well.
235
274
  */
236
- getComputedParents() {
275
+ getComputedParents(recursive) {
237
276
  const { entities } = this.root.definitions;
238
277
  let result = [];
239
278
  this.parents.forEach((key) => {
240
279
  const parent = entities.find(i => i.key === key);
241
280
  if (parent) {
242
281
  result.push(parent);
243
- result = result.concat(parent.getComputedParents());
282
+ if (recursive) {
283
+ result = result.concat(parent.getComputedParents());
284
+ }
244
285
  }
245
286
  });
246
287
  return result;
@@ -261,10 +302,10 @@ export class DataEntity {
261
302
  const { entities } = root.definitions;
262
303
  const result = [];
263
304
  associations.forEach((assoc) => {
264
- if (!assoc.target) {
305
+ if (!assoc.targets.length) {
265
306
  return;
266
307
  }
267
- const entity = entities.find(i => i.key === assoc.target);
308
+ const entity = entities.find(i => assoc.targets.includes(i.key));
268
309
  if (entity) {
269
310
  result.push(entity);
270
311
  }
@@ -363,7 +404,7 @@ export class DataEntity {
363
404
  const graph = {};
364
405
  const { associations, entities } = this.root.definitions;
365
406
  for (const assoc of associations) {
366
- if (!assoc.target) {
407
+ if (!assoc.targets.length) {
367
408
  continue;
368
409
  }
369
410
  const srcEntity = entities.find(i => i.associations.some(a => a === assoc));
@@ -373,7 +414,7 @@ export class DataEntity {
373
414
  if (!graph[srcEntity.key]) {
374
415
  graph[srcEntity.key] = [];
375
416
  }
376
- graph[srcEntity.key].push(assoc.target);
417
+ graph[srcEntity.key].splice(0, 0, ...assoc.targets);
377
418
  }
378
419
  return graph;
379
420
  }
@@ -411,5 +452,91 @@ export class DataEntity {
411
452
  });
412
453
  return result.reverse();
413
454
  }
455
+ /**
456
+ * Adds a new tag to the property. It also populates the root namespace's tags when tag is new.
457
+ *
458
+ * Note, it does nothing when the tag is already defined.
459
+ *
460
+ * @param tag The tag to add.
461
+ */
462
+ addTag(tag) {
463
+ if (!tag) {
464
+ return;
465
+ }
466
+ const lower = tag.toLowerCase();
467
+ const { tags } = this;
468
+ if (tags.some(t => t.toLowerCase() === lower)) {
469
+ return;
470
+ }
471
+ tags.push(tag);
472
+ const { definitions } = this.root;
473
+ if (!definitions.tags.some(t => t.toLowerCase() === lower)) {
474
+ definitions.tags.push(tag);
475
+ }
476
+ }
477
+ /**
478
+ * Removes a tag from the property. Unlike the `addTag()` this won't remove a `tag` from the root namespace.
479
+ *
480
+ * @param tag The tag to remove.
481
+ */
482
+ removeTag(tag) {
483
+ if (!tag) {
484
+ return;
485
+ }
486
+ const lower = tag.toLowerCase();
487
+ const { tags } = this;
488
+ const index = tags.findIndex(t => t.toLowerCase() === lower);
489
+ if (index >= 0) {
490
+ tags.splice(index, 1);
491
+ }
492
+ }
493
+ /**
494
+ * Creates a Shape of AMF.
495
+ * The property itself is auto-generated. If the `schema` is defined then it is used
496
+ * as the `range` of the property. Otherwise basic shape is generated for the range.
497
+ *
498
+ * This is a preferred way of reading the AMF shape as this synchronizes changed
499
+ * data properties with the shape definition.
500
+ *
501
+ * @returns AMF property shape definition.
502
+ */
503
+ toApiShape() {
504
+ const serializer = new AmfShapeGenerator();
505
+ return serializer.entity(this);
506
+ }
507
+ /**
508
+ * Reads the schema of the Entity and generates an example for it.
509
+ */
510
+ toExample(mime) {
511
+ const shape = this.toApiShape();
512
+ const generator = new ApiSchemaGenerator(mime, {
513
+ renderExamples: true,
514
+ renderMocked: true,
515
+ renderOptional: true,
516
+ });
517
+ return generator.generate(shape);
518
+ }
519
+ /**
520
+ * @returns The adapted entity, if any
521
+ */
522
+ readAdapted() {
523
+ const { adapts } = this;
524
+ if (!adapts) {
525
+ return undefined;
526
+ }
527
+ return this.root.definitions.entities.find(i => i.key === adapts);
528
+ }
529
+ /**
530
+ * Creates new adapted entity and associates it with this entity.
531
+ * @returns The instance of the created entity.
532
+ */
533
+ createAdapted() {
534
+ const entity = new DataEntity(this.root);
535
+ // disallow defaults as this would influence the schema generation
536
+ entity.info.name = undefined;
537
+ this.root.definitions.entities.push(entity);
538
+ this.adapts = entity.key;
539
+ return entity;
540
+ }
414
541
  }
415
542
  //# sourceMappingURL=DataEntity.js.map