@fibery/schema 8.2.0 → 8.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 (3) hide show
  1. package/lib/index.js +67 -10
  2. package/package.json +3 -3
  3. package/types.d.ts +5 -1
package/lib/index.js CHANGED
@@ -102,12 +102,12 @@ let traceErrorSubscribers = [console.error.bind(console)];
102
102
  const overridden = false;
103
103
  function subscribeOnTraceError(fn) {
104
104
  if (overridden) {
105
- throw new Error("cannot subscribe while overridden");
105
+ throw new Error("can't subscribe while overridden");
106
106
  }
107
107
  traceErrorSubscribers.push(fn);
108
108
  let unsubscribed = false;
109
109
  return function unsubscribe() {
110
- assert(!unsubscribed, "Cannot unsubscribe more than once");
110
+ assert(!unsubscribed, "Can't unsubscribe more than once");
111
111
  unsubscribed = true;
112
112
  traceErrorSubscribers = traceErrorSubscribers.filter(x => x !== fn);
113
113
  };
@@ -127,7 +127,7 @@ function subscribeOnCaptureMessage(fn) {
127
127
  captureMessageSubscribers.push(fn);
128
128
  let unsubscribed = false;
129
129
  return function unsubscribe() {
130
- assert(!unsubscribed, "Cannot unsubscribe more than once");
130
+ assert(!unsubscribed, "Can't unsubscribe more than once");
131
131
  unsubscribed = true;
132
132
  captureMessageSubscribers = captureMessageSubscribers.filter(x => x !== fn);
133
133
  };
@@ -306,7 +306,8 @@ class FieldObject {
306
306
  rawFieldObject,
307
307
  holderType,
308
308
  resolveTypeObject,
309
- version
309
+ version,
310
+ resolveMultiRelatedFieldObjects
310
311
  } = _ref;
311
312
  if (!external_lodash_default().isPlainObject(rawFieldObject)) {
312
313
  throw new Error("rawFieldObject arg must be plain object");
@@ -317,6 +318,9 @@ class FieldObject {
317
318
  if (!external_lodash_default().isFunction(resolveTypeObject)) {
318
319
  throw new Error("resolveTypeObject arg must be function");
319
320
  }
321
+ if (!external_lodash_default().isFunction(resolveMultiRelatedFieldObjects)) {
322
+ throw new Error("resolveMultiRelationFieldObjects arg must be function");
323
+ }
320
324
  this.name = rawFieldObject["fibery/name"];
321
325
  this.description = rawFieldObject["fibery/description"] || null;
322
326
  this.id = rawFieldObject["fibery/id"];
@@ -346,6 +350,7 @@ class FieldObject {
346
350
  this.isDeleted = rawFieldObject["fibery/deleted?"] || false;
347
351
  this.disableLinkExistingItems = rawMeta["ui/disable-link-existing-items"] || false;
348
352
  this.version = version;
353
+ this.multiRelation = rawMeta["fibery/multi-relation"] || null;
349
354
  Object.defineProperties(this, {
350
355
  typeObject: {
351
356
  configurable: false,
@@ -375,21 +380,49 @@ class FieldObject {
375
380
  configurable: false,
376
381
  enumerable: true,
377
382
  get: external_lodash_default().once(() => toNonEnumTitle(rawFieldObject["fibery/name"]))
383
+ },
384
+ multiRelatedFieldObjects: {
385
+ configurable: false,
386
+ enumerable: true,
387
+ get: external_lodash_default().once(() => {
388
+ const {
389
+ multiRelation,
390
+ typeObject
391
+ } = this;
392
+ if (!multiRelation || !typeObject.isEntityRef) {
393
+ return [];
394
+ }
395
+ return resolveMultiRelatedFieldObjects(multiRelation);
396
+ })
378
397
  }
379
398
  });
380
399
  }
381
400
  get relatedFieldObject() {
382
401
  const {
383
402
  name,
384
- relation
403
+ relation,
404
+ multiRelation,
405
+ typeObject
385
406
  } = this;
386
- if (!relation) {
407
+ if (!relation && !multiRelation) {
387
408
  return null;
388
409
  }
389
- const selector = this.type !== this.holderType ? fieldObject => fieldObject.relation === relation : fieldObject => fieldObject.relation === relation && fieldObject.name !== name;
410
+ if (!relation && multiRelation && typeObject.isEntityRef) {
411
+ return null;
412
+ }
413
+ let relationKey;
414
+ let relationId;
415
+ if (relation) {
416
+ relationKey = "relation";
417
+ relationId = relation;
418
+ } else {
419
+ relationId = multiRelation;
420
+ relationKey = "multiRelation";
421
+ }
422
+ const selector = this.type !== this.holderType ? fieldObject => fieldObject[relationKey] === relationId : fieldObject => fieldObject[relationKey] === relationId && fieldObject.name !== name;
390
423
  const fieldObject = this.typeObject.fieldObjects.find(selector);
391
424
  if (!fieldObject) {
392
- throw new Error(`there no other end for relation ${relation}`);
425
+ throw new Error(`there no other end for ${relationKey} ${relationId}`);
393
426
  }
394
427
  return fieldObject;
395
428
  }
@@ -476,10 +509,29 @@ class Schema {
476
509
  });
477
510
  return typeComponentTypeToFieldObject;
478
511
  });
512
+ let multiRelatedFieldsObjectsMap = null;
513
+ const initMultiRelatedFieldsObjectsMap = () => {
514
+ multiRelatedFieldsObjectsMap = new Map();
515
+ this.typeObjects.forEach(typeObject => {
516
+ typeObject.fieldObjects.forEach(fieldObject => {
517
+ if (fieldObject.multiRelation && !fieldObject.typeObject.isEntityRef) {
518
+ const store = multiRelatedFieldsObjectsMap.get(fieldObject.multiRelation) || [];
519
+ store.push(fieldObject);
520
+ multiRelatedFieldsObjectsMap.set(fieldObject.multiRelation, store);
521
+ }
522
+ });
523
+ });
524
+ };
479
525
  this.typeObjects = rawTypeObjects.map(rawTypeObject => factory.makeTypeObject({
480
526
  rawTypeObject,
481
527
  resolveTypeObject: type => this.typeObjectsByName[type] || null,
482
528
  getTypeComponentTypeToFieldObject: type => getTypeComponentTypeToFieldObject().get(type),
529
+ resolveMultiRelatedFieldObjects: multiRelation => {
530
+ if (!multiRelatedFieldsObjectsMap) {
531
+ initMultiRelatedFieldsObjectsMap();
532
+ }
533
+ return multiRelatedFieldsObjectsMap.get(multiRelation) || [];
534
+ },
483
535
  version
484
536
  }));
485
537
  this.typeObjectsById = factory.makeTypeObjectsById(this.typeObjects);
@@ -505,7 +557,8 @@ class TypeObject {
505
557
  resolveTypeObject,
506
558
  getTypeComponentTypeToFieldObject,
507
559
  version,
508
- factory
560
+ factory,
561
+ resolveMultiRelatedFieldObjects
509
562
  } = _ref;
510
563
  _defineProperty(this, "_getFieldObjectShortcuts", external_lodash_default().once(() => {
511
564
  const hasRank = this.installedMixins.has("fibery/rank-mixin");
@@ -547,6 +600,8 @@ class TypeObject {
547
600
  const rawMeta = rawTypeObject["fibery/meta"] || {};
548
601
  this.rawMeta = rawMeta;
549
602
  this.isDomain = rawMeta["fibery/domain?"] || false;
603
+ this.isPlatform = rawMeta["fibery/platform?"] || false;
604
+ this.isHighlight = rawMeta["fibery/highlight?"] || false;
550
605
  this.isMixin = rawMeta["app/mixin?"] || false;
551
606
  this.mixinIcon = rawMeta["ui/mixin-icon"] || null;
552
607
  this.isEnum = rawMeta["fibery/enum?"] || false;
@@ -559,6 +614,7 @@ class TypeObject {
559
614
  this.installedMixins = new Set(Object.keys(rawMeta["app/mixins"] || {}));
560
615
  this.syncSource = rawMeta["sync/source"] || null;
561
616
  this.version = version;
617
+ this.isEntityRef = rawTypeObject["fibery/name"] === "fibery/entity-ref";
562
618
  const fieldObjectsByNameOnceGetter = external_lodash_default().once(() => {
563
619
  return factory.makeFieldObjectsByName({
564
620
  type: this.name,
@@ -570,7 +626,8 @@ class TypeObject {
570
626
  rawFieldObject,
571
627
  holderType: this.name,
572
628
  resolveTypeObject,
573
- version
629
+ version,
630
+ resolveMultiRelatedFieldObjects
574
631
  });
575
632
  }));
576
633
  Object.defineProperties(this, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/schema",
3
- "version": "8.2.0",
3
+ "version": "8.4.0",
4
4
  "description": "utils for working with fibery schema",
5
5
  "main": "./lib/index.js",
6
6
  "browser": "./index.js",
@@ -25,8 +25,8 @@
25
25
  "jest-junit": "13.0.0",
26
26
  "webpack": "5.87.0",
27
27
  "webpack-cli": "4.10.0",
28
- "@fibery/babel-preset": "7.3.0",
29
- "@fibery/eslint-config": "8.4.0"
28
+ "@fibery/eslint-config": "8.5.0",
29
+ "@fibery/babel-preset": "7.3.0"
30
30
  },
31
31
  "jest": {
32
32
  "testEnvironment": "node",
package/types.d.ts CHANGED
@@ -21,6 +21,7 @@ export type FieldObject = {
21
21
  hasLinkRule: boolean;
22
22
  linkRule: unknown | null;
23
23
  relation: string | null;
24
+ multiRelation: string | null;
24
25
  defaultValue: unknown | null;
25
26
  objectEditorOrder: number;
26
27
  isRequired: boolean;
@@ -40,6 +41,7 @@ export type FieldObject = {
40
41
  relatedFieldObject: FieldObject | null;
41
42
  cardinality: Cardinality;
42
43
  kind: ":field/reference" | ":field/reference-collection" | ":field/basic";
44
+ multiRelatedFieldObjects: Array<FieldObject>;
43
45
  };
44
46
 
45
47
  export type TypeObject = {
@@ -55,6 +57,7 @@ export type TypeObject = {
55
57
  rankField: string | null;
56
58
  rawMeta: Record<string, unknown>;
57
59
  isDomain: boolean;
60
+ isHighlight: boolean;
58
61
  isMixin: boolean;
59
62
  mixinIcon: string | null;
60
63
  isEnum: boolean;
@@ -68,7 +71,7 @@ export type TypeObject = {
68
71
  color: string;
69
72
  units: unknown | null;
70
73
  installedMixins: Set<string>;
71
- syncSource: {appId: string} | null;
74
+ syncSource: {appId: string; appName: string; id: string; state: string; type: string} | null;
72
75
  version: string;
73
76
  installedMixinTypeObjects: unknown;
74
77
  title: string;
@@ -78,6 +81,7 @@ export type TypeObject = {
78
81
  fieldObjectsByName: Record<string, FieldObject>;
79
82
  typeComponentFieldObject: FieldObject | undefined;
80
83
  isDeleted: boolean;
84
+ isEntityRef: boolean;
81
85
  };
82
86
 
83
87
  export type Schema = {