@fibery/schema 8.1.14 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -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,7 @@ class TypeObject {
547
600
  const rawMeta = rawTypeObject["fibery/meta"] || {};
548
601
  this.rawMeta = rawMeta;
549
602
  this.isDomain = rawMeta["fibery/domain?"] || false;
603
+ this.isHighlight = rawMeta["fibery/highlight?"] || false;
550
604
  this.isMixin = rawMeta["app/mixin?"] || false;
551
605
  this.mixinIcon = rawMeta["ui/mixin-icon"] || null;
552
606
  this.isEnum = rawMeta["fibery/enum?"] || false;
@@ -559,6 +613,7 @@ class TypeObject {
559
613
  this.installedMixins = new Set(Object.keys(rawMeta["app/mixins"] || {}));
560
614
  this.syncSource = rawMeta["sync/source"] || null;
561
615
  this.version = version;
616
+ this.isEntityRef = rawTypeObject["fibery/name"] === "fibery/entity-ref";
562
617
  const fieldObjectsByNameOnceGetter = external_lodash_default().once(() => {
563
618
  return factory.makeFieldObjectsByName({
564
619
  type: this.name,
@@ -570,7 +625,8 @@ class TypeObject {
570
625
  rawFieldObject,
571
626
  holderType: this.name,
572
627
  resolveTypeObject,
573
- version
628
+ version,
629
+ resolveMultiRelatedFieldObjects
574
630
  });
575
631
  }));
576
632
  Object.defineProperties(this, {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@fibery/schema",
3
- "version": "8.1.14",
3
+ "version": "8.3.0",
4
4
  "description": "utils for working with fibery schema",
5
5
  "main": "./lib/index.js",
6
6
  "browser": "./index.js",
7
7
  "types": "./types.d.ts",
8
8
  "files": [
9
- "/lib",
9
+ "./lib",
10
10
  "types.d.ts"
11
11
  ],
12
12
  "private": false,
@@ -14,7 +14,7 @@
14
14
  "lodash": "^4.17.21",
15
15
  "memoize-one": "^6.0.0",
16
16
  "pluralize": "^8.0.0",
17
- "@fibery/helpers": "1.1.0"
17
+ "@fibery/helpers": "1.2.0"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@babel/core": "7.20.5",
@@ -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.2.0",
29
- "@fibery/eslint-config": "8.3.0"
28
+ "@fibery/babel-preset": "7.3.0",
29
+ "@fibery/eslint-config": "8.5.0"
30
30
  },
31
31
  "jest": {
32
32
  "testEnvironment": "node",
@@ -52,8 +52,8 @@
52
52
  "scripts": {
53
53
  "build": "BABEL_ENV=production webpack",
54
54
  "test": "node scripts/test.js",
55
- "test:ci": "yarn test --reporters=default --reporters=jest-junit",
56
- "test:coverage": "yarn test --coverage --coverageDirectory=${JEST_COVERAGE_RESULT_DIR:-$(pwd)}/coverage/schema --reporters=default --reporters=jest-junit",
55
+ "test:ci": "pnpm run test --reporters=default --reporters=jest-junit",
56
+ "test:coverage": "pnpm run test --coverage --coverageDirectory=${JEST_COVERAGE_RESULT_DIR:-$(pwd)}/coverage/schema --reporters=default --reporters=jest-junit",
57
57
  "lint": "eslint ."
58
58
  }
59
59
  }
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;
@@ -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 = {