@rvoh/psychic 3.8.5 → 3.8.6

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.
@@ -8,6 +8,7 @@ import isBlankDescription from './helpers/isBlankDescription.js';
8
8
  import maybeNullOpenapiShorthandToOpenapiShorthand from './helpers/maybeNullOpenapiShorthandToOpenapiShorthand.js';
9
9
  import primitiveOpenapiStatementToOpenapi from './helpers/primitiveOpenapiStatementToOpenapi.js';
10
10
  import schemaToRef from './helpers/schemaToRef.js';
11
+ import serializersAndRefsFromSerializableRef from './helpers/serializersAndRefsFromSerializableRef.js';
11
12
  import SerializerOpenapiRenderer from './SerializerOpenapiRenderer.js';
12
13
  /**
13
14
  * @internal
@@ -494,13 +495,35 @@ The following values will be allowed:
494
495
  serializableStatement(bodySegment) {
495
496
  const serializableRef = bodySegment;
496
497
  const key = serializableRef.$serializableSerializerKey || serializableRef.key || 'default';
497
- const serializer = DreamApp.system.inferSerializerFromDreamOrViewModel(serializableRef.$serializable.prototype, key);
498
- if (!serializer)
499
- throw new Error(`Failed to locate serializers getter from: ${serializableRef.$serializable.name} using key: ${key}`);
500
- return this.serializerStatement({
501
- $serializer: serializer,
502
- ...serializableRef,
498
+ const { serializers, refs } = serializersAndRefsFromSerializableRef(serializableRef, {
499
+ casing: this.casing,
500
+ suppressResponseEnums: this.suppressResponseEnums,
503
501
  });
502
+ if (serializers.length === 0)
503
+ throw new Error(`Failed to locate serializers getter from: ${serializableRef.$serializable.name} using key: ${key}`);
504
+ if (serializers.length === 1) {
505
+ return this.serializerStatement({
506
+ $serializer: serializers[0],
507
+ ...serializableRef,
508
+ });
509
+ }
510
+ const serializerAnyOf = { anyOf: refs };
511
+ if (serializableRef.many) {
512
+ return {
513
+ referencedSerializers: serializers,
514
+ openapi: {
515
+ type: serializableRef.maybeNull ? ['array', 'null'] : 'array',
516
+ items: serializerAnyOf,
517
+ },
518
+ };
519
+ }
520
+ if (serializableRef.maybeNull) {
521
+ return {
522
+ referencedSerializers: serializers,
523
+ openapi: { anyOf: [...refs, { type: 'null' }] },
524
+ };
525
+ }
526
+ return { referencedSerializers: serializers, openapi: serializerAnyOf };
504
527
  }
505
528
  /**
506
529
  * @internal
@@ -1,5 +1,5 @@
1
- import { DreamApp } from '@rvoh/dream';
2
1
  import isObject from '../../helpers/isObject.js';
2
+ import serializersAndRefsFromSerializableRef from './serializersAndRefsFromSerializableRef.js';
3
3
  /**
4
4
  * @internal
5
5
  *
@@ -54,8 +54,7 @@ value, serializers) {
54
54
  //
55
55
  }
56
56
  else if (value.$serializable) {
57
- const foundSerializers = DreamApp.system.inferSerializersFromDreamClassOrViewModelClass(value.$serializable, value.$serializableSerializerKey);
58
- foundSerializers.forEach(serializer => serializers.add(serializer));
57
+ serializersAndRefsFromSerializableRef(value).serializers.forEach(serializer => serializers.add(serializer));
59
58
  //
60
59
  }
61
60
  else if (isObject(value)) {
@@ -1,10 +1,6 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-return */
2
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
3
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
- import { DreamApp } from '@rvoh/dream';
6
1
  import isObject from '../../helpers/isObject.js';
7
2
  import SerializerOpenapiRenderer from '../SerializerOpenapiRenderer.js';
3
+ import serializersAndRefsFromSerializableRef from './serializersAndRefsFromSerializableRef.js';
8
4
  /**
9
5
  * @internal
10
6
  *
@@ -69,9 +65,8 @@ function transformValue(value) {
69
65
  //
70
66
  }
71
67
  else if (value.$serializable) {
72
- const { $serializable, $serializableSerializerKey, ...rest } = value;
73
- const foundSerializers = DreamApp.system.inferSerializersFromDreamClassOrViewModelClass($serializable, $serializableSerializerKey);
74
- const refs = foundSerializers.map(serializer => new SerializerOpenapiRenderer(serializer).serializerRef);
68
+ const { $serializable, $serializableSerializerKey, key, ...rest } = value;
69
+ const { refs } = serializersAndRefsFromSerializableRef({ $serializable, $serializableSerializerKey, key });
75
70
  if (refs.length === 0)
76
71
  return rest;
77
72
  if (refs.length === 1) {
@@ -0,0 +1,17 @@
1
+ import { DreamApp } from '@rvoh/dream';
2
+ import { sortBy, uniq } from '@rvoh/dream/utils';
3
+ import SerializerOpenapiRenderer from '../SerializerOpenapiRenderer.js';
4
+ export default function serializersAndRefsFromSerializableRef(serializableRef, { casing = 'camel', suppressResponseEnums = false, } = {}) {
5
+ const key = serializableRef.$serializableSerializerKey || serializableRef.key || 'default';
6
+ const serializerRefs = sortBy(uniq(DreamApp.system.inferSerializersFromDreamClassOrViewModelClass(serializableRef.$serializable, key)).map(serializer => ({
7
+ serializer,
8
+ ref: new SerializerOpenapiRenderer(serializer, {
9
+ casing,
10
+ suppressResponseEnums,
11
+ }).serializerRef,
12
+ })), ({ ref }) => ref.$ref);
13
+ return {
14
+ serializers: serializerRefs.map(({ serializer }) => serializer),
15
+ refs: serializerRefs.map(({ ref }) => ref),
16
+ };
17
+ }
@@ -8,6 +8,7 @@ import isBlankDescription from './helpers/isBlankDescription.js';
8
8
  import maybeNullOpenapiShorthandToOpenapiShorthand from './helpers/maybeNullOpenapiShorthandToOpenapiShorthand.js';
9
9
  import primitiveOpenapiStatementToOpenapi from './helpers/primitiveOpenapiStatementToOpenapi.js';
10
10
  import schemaToRef from './helpers/schemaToRef.js';
11
+ import serializersAndRefsFromSerializableRef from './helpers/serializersAndRefsFromSerializableRef.js';
11
12
  import SerializerOpenapiRenderer from './SerializerOpenapiRenderer.js';
12
13
  /**
13
14
  * @internal
@@ -494,13 +495,35 @@ The following values will be allowed:
494
495
  serializableStatement(bodySegment) {
495
496
  const serializableRef = bodySegment;
496
497
  const key = serializableRef.$serializableSerializerKey || serializableRef.key || 'default';
497
- const serializer = DreamApp.system.inferSerializerFromDreamOrViewModel(serializableRef.$serializable.prototype, key);
498
- if (!serializer)
499
- throw new Error(`Failed to locate serializers getter from: ${serializableRef.$serializable.name} using key: ${key}`);
500
- return this.serializerStatement({
501
- $serializer: serializer,
502
- ...serializableRef,
498
+ const { serializers, refs } = serializersAndRefsFromSerializableRef(serializableRef, {
499
+ casing: this.casing,
500
+ suppressResponseEnums: this.suppressResponseEnums,
503
501
  });
502
+ if (serializers.length === 0)
503
+ throw new Error(`Failed to locate serializers getter from: ${serializableRef.$serializable.name} using key: ${key}`);
504
+ if (serializers.length === 1) {
505
+ return this.serializerStatement({
506
+ $serializer: serializers[0],
507
+ ...serializableRef,
508
+ });
509
+ }
510
+ const serializerAnyOf = { anyOf: refs };
511
+ if (serializableRef.many) {
512
+ return {
513
+ referencedSerializers: serializers,
514
+ openapi: {
515
+ type: serializableRef.maybeNull ? ['array', 'null'] : 'array',
516
+ items: serializerAnyOf,
517
+ },
518
+ };
519
+ }
520
+ if (serializableRef.maybeNull) {
521
+ return {
522
+ referencedSerializers: serializers,
523
+ openapi: { anyOf: [...refs, { type: 'null' }] },
524
+ };
525
+ }
526
+ return { referencedSerializers: serializers, openapi: serializerAnyOf };
504
527
  }
505
528
  /**
506
529
  * @internal
@@ -1,5 +1,5 @@
1
- import { DreamApp } from '@rvoh/dream';
2
1
  import isObject from '../../helpers/isObject.js';
2
+ import serializersAndRefsFromSerializableRef from './serializersAndRefsFromSerializableRef.js';
3
3
  /**
4
4
  * @internal
5
5
  *
@@ -54,8 +54,7 @@ value, serializers) {
54
54
  //
55
55
  }
56
56
  else if (value.$serializable) {
57
- const foundSerializers = DreamApp.system.inferSerializersFromDreamClassOrViewModelClass(value.$serializable, value.$serializableSerializerKey);
58
- foundSerializers.forEach(serializer => serializers.add(serializer));
57
+ serializersAndRefsFromSerializableRef(value).serializers.forEach(serializer => serializers.add(serializer));
59
58
  //
60
59
  }
61
60
  else if (isObject(value)) {
@@ -1,10 +1,6 @@
1
- /* eslint-disable @typescript-eslint/no-unsafe-return */
2
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
3
- /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4
- /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
- import { DreamApp } from '@rvoh/dream';
6
1
  import isObject from '../../helpers/isObject.js';
7
2
  import SerializerOpenapiRenderer from '../SerializerOpenapiRenderer.js';
3
+ import serializersAndRefsFromSerializableRef from './serializersAndRefsFromSerializableRef.js';
8
4
  /**
9
5
  * @internal
10
6
  *
@@ -69,9 +65,8 @@ function transformValue(value) {
69
65
  //
70
66
  }
71
67
  else if (value.$serializable) {
72
- const { $serializable, $serializableSerializerKey, ...rest } = value;
73
- const foundSerializers = DreamApp.system.inferSerializersFromDreamClassOrViewModelClass($serializable, $serializableSerializerKey);
74
- const refs = foundSerializers.map(serializer => new SerializerOpenapiRenderer(serializer).serializerRef);
68
+ const { $serializable, $serializableSerializerKey, key, ...rest } = value;
69
+ const { refs } = serializersAndRefsFromSerializableRef({ $serializable, $serializableSerializerKey, key });
75
70
  if (refs.length === 0)
76
71
  return rest;
77
72
  if (refs.length === 1) {
@@ -0,0 +1,17 @@
1
+ import { DreamApp } from '@rvoh/dream';
2
+ import { sortBy, uniq } from '@rvoh/dream/utils';
3
+ import SerializerOpenapiRenderer from '../SerializerOpenapiRenderer.js';
4
+ export default function serializersAndRefsFromSerializableRef(serializableRef, { casing = 'camel', suppressResponseEnums = false, } = {}) {
5
+ const key = serializableRef.$serializableSerializerKey || serializableRef.key || 'default';
6
+ const serializerRefs = sortBy(uniq(DreamApp.system.inferSerializersFromDreamClassOrViewModelClass(serializableRef.$serializable, key)).map(serializer => ({
7
+ serializer,
8
+ ref: new SerializerOpenapiRenderer(serializer, {
9
+ casing,
10
+ suppressResponseEnums,
11
+ }).serializerRef,
12
+ })), ({ ref }) => ref.$ref);
13
+ return {
14
+ serializers: serializerRefs.map(({ serializer }) => serializer),
15
+ refs: serializerRefs.map(({ ref }) => ref),
16
+ };
17
+ }
@@ -0,0 +1,9 @@
1
+ import { OpenapiSchemaExpressionRef, OpenapiSchemaShorthandExpressionSerializableRef } from '@rvoh/dream/openapi';
2
+ import { DreamModelSerializerType, SerializerCasing, SimpleObjectSerializerType } from '@rvoh/dream/types';
3
+ export default function serializersAndRefsFromSerializableRef(serializableRef: OpenapiSchemaShorthandExpressionSerializableRef, { casing, suppressResponseEnums, }?: {
4
+ casing?: SerializerCasing;
5
+ suppressResponseEnums?: boolean;
6
+ }): {
7
+ serializers: (DreamModelSerializerType | SimpleObjectSerializerType)[];
8
+ refs: OpenapiSchemaExpressionRef[];
9
+ };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "type": "module",
3
3
  "name": "@rvoh/psychic",
4
4
  "description": "Typescript web framework",
5
- "version": "3.8.5",
5
+ "version": "3.8.6",
6
6
  "author": "RVOHealth",
7
7
  "publishConfig": {
8
8
  "access": "public"