@rvoh/dream 0.36.0 → 0.36.2

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 (157) hide show
  1. package/dist/cjs/src/serializer/decorators/attribute.js +22 -6
  2. package/dist/cjs/src/serializer/index.js +47 -48
  3. package/dist/esm/src/serializer/decorators/attribute.js +23 -7
  4. package/dist/esm/src/serializer/index.js +47 -48
  5. package/dist/types/src/serializer/decorators/attribute.d.ts +2 -2
  6. package/dist/types/src/serializer/index.d.ts +0 -2
  7. package/dist/types/src/types/openapi.d.ts +2 -2
  8. package/docs/classes/Benchmark.html +2 -2
  9. package/docs/classes/CalendarDate.html +2 -2
  10. package/docs/classes/CreateOrFindByFailedToCreateAndFind.html +3 -3
  11. package/docs/classes/Decorators.html +19 -19
  12. package/docs/classes/Dream.html +126 -126
  13. package/docs/classes/DreamApplication.html +4 -4
  14. package/docs/classes/DreamBin.html +2 -2
  15. package/docs/classes/DreamCLI.html +4 -4
  16. package/docs/classes/DreamImporter.html +2 -2
  17. package/docs/classes/DreamLogos.html +2 -2
  18. package/docs/classes/DreamMigrationHelpers.html +7 -7
  19. package/docs/classes/DreamSerializer.html +2 -2
  20. package/docs/classes/DreamTransaction.html +2 -2
  21. package/docs/classes/Encrypt.html +2 -2
  22. package/docs/classes/Env.html +2 -2
  23. package/docs/classes/GlobalNameNotSet.html +3 -3
  24. package/docs/classes/NonLoadedAssociation.html +3 -3
  25. package/docs/classes/Query.html +50 -50
  26. package/docs/classes/Range.html +2 -2
  27. package/docs/classes/RecordNotFound.html +3 -3
  28. package/docs/classes/ValidationError.html +3 -3
  29. package/docs/functions/Attribute.html +1 -1
  30. package/docs/functions/RendersMany.html +1 -1
  31. package/docs/functions/RendersOne.html +1 -1
  32. package/docs/functions/ReplicaSafe.html +1 -1
  33. package/docs/functions/STI.html +1 -1
  34. package/docs/functions/SoftDelete.html +1 -1
  35. package/docs/functions/camelize.html +1 -1
  36. package/docs/functions/capitalize.html +1 -1
  37. package/docs/functions/closeAllDbConnections.html +1 -1
  38. package/docs/functions/compact.html +1 -1
  39. package/docs/functions/debug.html +1 -1
  40. package/docs/functions/dreamDbConnections.html +1 -1
  41. package/docs/functions/dreamPath.html +1 -1
  42. package/docs/functions/generateDream.html +1 -1
  43. package/docs/functions/globalClassNameFromFullyQualifiedModelName.html +1 -1
  44. package/docs/functions/hyphenize.html +1 -1
  45. package/docs/functions/inferSerializerFromDreamClassOrViewModelClass.html +1 -1
  46. package/docs/functions/inferSerializerFromDreamOrViewModel.html +1 -1
  47. package/docs/functions/isEmpty.html +1 -1
  48. package/docs/functions/loadRepl.html +1 -1
  49. package/docs/functions/lookupClassByGlobalName.html +1 -1
  50. package/docs/functions/pascalize.html +1 -1
  51. package/docs/functions/pgErrorType.html +1 -1
  52. package/docs/functions/range-1.html +1 -1
  53. package/docs/functions/relativeDreamPath.html +1 -1
  54. package/docs/functions/round.html +1 -1
  55. package/docs/functions/serializerNameFromFullyQualifiedModelName.html +1 -1
  56. package/docs/functions/sharedPathPrefix.html +1 -1
  57. package/docs/functions/snakeify.html +1 -1
  58. package/docs/functions/sort.html +1 -1
  59. package/docs/functions/sortBy.html +1 -1
  60. package/docs/functions/standardizeFullyQualifiedModelName.html +1 -1
  61. package/docs/functions/uncapitalize.html +1 -1
  62. package/docs/functions/uniq.html +1 -1
  63. package/docs/functions/untypedDb.html +1 -1
  64. package/docs/functions/validateColumn.html +1 -1
  65. package/docs/functions/validateTable.html +1 -1
  66. package/docs/interfaces/AttributeStatement.html +2 -2
  67. package/docs/interfaces/DecoratorContext.html +2 -2
  68. package/docs/interfaces/DreamApplicationInitOptions.html +2 -2
  69. package/docs/interfaces/DreamApplicationOpts.html +2 -2
  70. package/docs/interfaces/DreamSerializerAssociationStatement.html +2 -2
  71. package/docs/interfaces/EncryptOptions.html +2 -2
  72. package/docs/interfaces/OpenapiSchemaProperties.html +1 -1
  73. package/docs/interfaces/OpenapiSchemaPropertiesShorthand.html +1 -1
  74. package/docs/interfaces/OpenapiTypeFieldObject.html +1 -1
  75. package/docs/types/Camelized.html +1 -1
  76. package/docs/types/CommonOpenapiSchemaObjectFields.html +1 -1
  77. package/docs/types/DateTime.html +1 -1
  78. package/docs/types/DbConnectionType.html +1 -1
  79. package/docs/types/DreamAssociationMetadata.html +1 -1
  80. package/docs/types/DreamAttributes.html +1 -1
  81. package/docs/types/DreamClassColumn.html +1 -1
  82. package/docs/types/DreamColumn.html +1 -1
  83. package/docs/types/DreamColumnNames.html +1 -1
  84. package/docs/types/DreamLogLevel.html +1 -1
  85. package/docs/types/DreamLogger.html +1 -1
  86. package/docs/types/DreamOrViewModelSerializerKey.html +1 -1
  87. package/docs/types/DreamParamSafeAttributes.html +1 -1
  88. package/docs/types/DreamParamSafeColumnNames.html +1 -1
  89. package/docs/types/DreamSerializerKey.html +1 -1
  90. package/docs/types/DreamSerializers.html +1 -1
  91. package/docs/types/DreamTableSchema.html +1 -1
  92. package/docs/types/DreamVirtualColumns.html +1 -1
  93. package/docs/types/EncryptAlgorithm.html +1 -1
  94. package/docs/types/Hyphenized.html +1 -1
  95. package/docs/types/IdType.html +1 -1
  96. package/docs/types/OpenapiAllTypes.html +1 -1
  97. package/docs/types/OpenapiFormats.html +1 -1
  98. package/docs/types/OpenapiNumberFormats.html +1 -1
  99. package/docs/types/OpenapiPrimitiveTypes.html +1 -1
  100. package/docs/types/OpenapiSchemaArray.html +1 -1
  101. package/docs/types/OpenapiSchemaArrayShorthand.html +1 -1
  102. package/docs/types/OpenapiSchemaBase.html +1 -1
  103. package/docs/types/OpenapiSchemaBody.html +1 -1
  104. package/docs/types/OpenapiSchemaBodyShorthand.html +1 -1
  105. package/docs/types/OpenapiSchemaCommonFields.html +1 -1
  106. package/docs/types/OpenapiSchemaExpressionAllOf.html +1 -1
  107. package/docs/types/OpenapiSchemaExpressionAnyOf.html +1 -1
  108. package/docs/types/OpenapiSchemaExpressionOneOf.html +1 -1
  109. package/docs/types/OpenapiSchemaExpressionRef.html +1 -1
  110. package/docs/types/OpenapiSchemaExpressionRefSchemaShorthand.html +1 -1
  111. package/docs/types/OpenapiSchemaInteger.html +1 -1
  112. package/docs/types/OpenapiSchemaNull.html +1 -1
  113. package/docs/types/OpenapiSchemaNumber.html +1 -1
  114. package/docs/types/OpenapiSchemaObject.html +1 -1
  115. package/docs/types/OpenapiSchemaObjectAllOf.html +1 -1
  116. package/docs/types/OpenapiSchemaObjectAllOfShorthand.html +1 -1
  117. package/docs/types/OpenapiSchemaObjectAnyOf.html +1 -1
  118. package/docs/types/OpenapiSchemaObjectAnyOfShorthand.html +1 -1
  119. package/docs/types/OpenapiSchemaObjectBase.html +1 -1
  120. package/docs/types/OpenapiSchemaObjectBaseShorthand.html +1 -1
  121. package/docs/types/OpenapiSchemaObjectOneOf.html +1 -1
  122. package/docs/types/OpenapiSchemaObjectOneOfShorthand.html +1 -1
  123. package/docs/types/OpenapiSchemaObjectShorthand.html +1 -1
  124. package/docs/types/OpenapiSchemaPrimitiveGeneric.html +1 -1
  125. package/docs/types/OpenapiSchemaShorthandExpressionAllOf.html +1 -1
  126. package/docs/types/OpenapiSchemaShorthandExpressionAnyOf.html +1 -1
  127. package/docs/types/OpenapiSchemaShorthandExpressionOneOf.html +1 -1
  128. package/docs/types/OpenapiSchemaShorthandExpressionSerializableRef.html +1 -1
  129. package/docs/types/OpenapiSchemaShorthandExpressionSerializerRef.html +1 -1
  130. package/docs/types/OpenapiSchemaShorthandPrimitiveGeneric.html +1 -1
  131. package/docs/types/OpenapiSchemaString.html +1 -1
  132. package/docs/types/OpenapiShorthandAllTypes.html +1 -1
  133. package/docs/types/OpenapiShorthandPrimitiveTypes.html +1 -1
  134. package/docs/types/OpenapiTypeField.html +1 -1
  135. package/docs/types/Pascalized.html +1 -1
  136. package/docs/types/PrimaryKeyType.html +1 -1
  137. package/docs/types/RoundingPrecision.html +1 -1
  138. package/docs/types/SerializableClassOrSerializerCallback.html +1 -1
  139. package/docs/types/SerializableDreamClassOrViewModelClass.html +1 -1
  140. package/docs/types/SerializableDreamOrViewModel.html +1 -1
  141. package/docs/types/SerializableTypes.html +1 -1
  142. package/docs/types/Snakeified.html +1 -1
  143. package/docs/types/Timestamp.html +1 -1
  144. package/docs/types/UpdateableAssociationProperties.html +1 -1
  145. package/docs/types/UpdateableProperties.html +1 -1
  146. package/docs/types/ValidationType.html +1 -1
  147. package/docs/types/ViewModelSerializerKey.html +1 -1
  148. package/docs/types/WhereStatementForDream.html +1 -1
  149. package/docs/types/WhereStatementForDreamClass.html +1 -1
  150. package/docs/variables/DateTime-1.html +1 -1
  151. package/docs/variables/DreamConst.html +1 -1
  152. package/docs/variables/TRIGRAM_OPERATORS.html +1 -1
  153. package/docs/variables/openapiPrimitiveTypes-1.html +1 -1
  154. package/docs/variables/openapiShorthandPrimitiveTypes-1.html +1 -1
  155. package/docs/variables/ops.html +1 -1
  156. package/docs/variables/primaryKeyTypes.html +1 -1
  157. package/package.json +1 -1
@@ -97,17 +97,21 @@ function Attribute(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions, ope
97
97
  ...(0, dreamAttributeOpenapiShape_js_1.dreamAttributeOpenapiShape)(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions, key),
98
98
  ...openApiOptions,
99
99
  };
100
+ renderAs = openApiShape.format || maybeNullPrimitiveToPrimitive(openApiShape?.type);
100
101
  //
101
102
  }
102
- else if ((0, typechecks_js_1.isString)(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions) ||
103
- Array.isArray(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions)) {
104
- renderAs = dreamClass_or_shorthandAttribute_or_manualOpenapiOptions;
105
- openApiShape = { type: renderAs, ...openApiOptions };
103
+ else if ((0, typechecks_js_1.isString)(maybeNullPrimitiveToPrimitive(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions))) {
104
+ openApiShape = {
105
+ type: dreamClass_or_shorthandAttribute_or_manualOpenapiOptions,
106
+ ...openApiOptions,
107
+ };
108
+ renderAs = maybeNullPrimitiveToPrimitive(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions);
106
109
  //
107
110
  }
108
- else if (typeof dreamClass_or_shorthandAttribute_or_manualOpenapiOptions === 'object') {
111
+ else if ((0, typechecks_js_1.isObject)(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions)) {
109
112
  openApiShape = dreamClass_or_shorthandAttribute_or_manualOpenapiOptions;
110
- renderAs = openApiShape;
113
+ renderAs = openApiShape.format || maybeNullPrimitiveToPrimitive(openApiShape?.type);
114
+ //
111
115
  }
112
116
  else if (dreamClass_or_shorthandAttribute_or_manualOpenapiOptions === undefined) {
113
117
  // no-op
@@ -132,6 +136,18 @@ Attribute: ${key}
132
136
  });
133
137
  };
134
138
  }
139
+ function maybeNullPrimitiveToPrimitive(openapiType) {
140
+ if (Array.isArray(openapiType)) {
141
+ if (openapiType[1] === 'null')
142
+ return openapiType[0];
143
+ if (openapiType[0] === 'null')
144
+ return openapiType[1];
145
+ throw new Error(`Expected array with 'null' and an OpenAPI primitive string: ${JSON.stringify(openapiType)}`);
146
+ }
147
+ else {
148
+ return openapiType;
149
+ }
150
+ }
135
151
  function openApiAndRenderOptionsToSeparateOptions(openApiAndRenderOptions) {
136
152
  let openApiOptions;
137
153
  let renderOptions;
@@ -5,6 +5,7 @@ const constants_js_1 = require("../dream/constants.js");
5
5
  const GlobalNameNotSet_js_1 = require("../errors/dream-application/GlobalNameNotSet.js");
6
6
  const MissingSerializersDefinition_js_1 = require("../errors/MissingSerializersDefinition.js");
7
7
  const FailedToRenderThroughAssociationForSerializer_js_1 = require("../errors/serializers/FailedToRenderThroughAssociationForSerializer.js");
8
+ const CalendarDate_js_1 = require("../helpers/CalendarDate.js");
8
9
  const camelize_js_1 = require("../helpers/camelize.js");
9
10
  const compact_js_1 = require("../helpers/compact.js");
10
11
  const DateTime_js_1 = require("../helpers/DateTime.js");
@@ -145,29 +146,34 @@ class DreamSerializer {
145
146
  const fieldWithCasing = this.applyCasingToField(field);
146
147
  let dateValue;
147
148
  let decimalValue;
148
- switch (this.computedRenderAs(renderAs)) {
149
+ switch (renderAs) {
149
150
  case 'date':
151
+ case 'date[]':
150
152
  dateValue = this.getAttributeValue(attributeStatement);
151
- returnObj[fieldWithCasing] = dateValue?.toISODate() || null;
153
+ returnObj[fieldWithCasing] = Array.isArray(dateValue)
154
+ ? dateValue?.map(date => unknownTypeToIsoDateString(date))
155
+ : unknownTypeToIsoDateString(dateValue);
152
156
  break;
153
157
  case 'date-time':
158
+ case 'date-time[]':
154
159
  dateValue = this.getAttributeValue(attributeStatement);
155
- returnObj[fieldWithCasing] = dateValue?.toISO()
156
- ? DateTime_js_1.DateTime.fromISO(dateValue.toISO()).toISO()
157
- : null;
160
+ returnObj[fieldWithCasing] = Array.isArray(dateValue)
161
+ ? dateValue?.map(date => unknownTypeToIsoDatetimeString(date))
162
+ : unknownTypeToIsoDatetimeString(dateValue);
158
163
  break;
159
164
  case 'decimal':
160
- decimalValue = this.numberOrStringToNumber(this.getAttributeValue(attributeStatement));
161
- returnObj[fieldWithCasing] =
162
- decimalValue === null
163
- ? null
164
- : renderOptions?.precision === undefined
165
- ? decimalValue
166
- : (0, round_js_1.default)(decimalValue, renderOptions?.precision);
165
+ case 'decimal[]':
166
+ decimalValue = this.getAttributeValue(attributeStatement);
167
+ returnObj[fieldWithCasing] = Array.isArray(decimalValue)
168
+ ? decimalValue?.map(date => unknownTypeToDecimal(date, renderOptions?.precision))
169
+ : unknownTypeToDecimal(decimalValue, renderOptions?.precision);
167
170
  break;
168
171
  case 'integer':
169
- decimalValue = this.numberOrStringToNumber(this.getAttributeValue(attributeStatement));
170
- returnObj[fieldWithCasing] = decimalValue === null ? null : (0, round_js_1.default)(decimalValue);
172
+ case 'integer[]':
173
+ decimalValue = this.getAttributeValue(attributeStatement);
174
+ returnObj[fieldWithCasing] = Array.isArray(decimalValue)
175
+ ? decimalValue?.map(date => unknownTypeToDecimal(date, 0))
176
+ : unknownTypeToDecimal(decimalValue, 0);
171
177
  break;
172
178
  default:
173
179
  returnObj[fieldWithCasing] = this.getAttributeValue(attributeStatement);
@@ -176,40 +182,6 @@ class DreamSerializer {
176
182
  });
177
183
  return returnObj;
178
184
  }
179
- numberOrStringToNumber(num) {
180
- if (num === undefined)
181
- return null;
182
- if (num === null)
183
- return null;
184
- if (typeof num === 'number')
185
- return num;
186
- return Number(num);
187
- }
188
- computedRenderAs(renderAs) {
189
- if (typeof renderAs === 'object') {
190
- const safeRenderAs = renderAs;
191
- let openApiType = safeRenderAs.type;
192
- if (Array.isArray(openApiType)) {
193
- if (openApiType[1] === 'null') {
194
- openApiType = openApiType[0];
195
- }
196
- else if (openApiType[0] === 'null') {
197
- openApiType = openApiType[1];
198
- }
199
- else {
200
- throw new Error(`Expected array with 'null' and an OpenAPI primitive string: ${JSON.stringify(openApiType)}`);
201
- }
202
- }
203
- if (openApiType === 'string' || openApiType === 'number') {
204
- if (safeRenderAs.format)
205
- return safeRenderAs.format;
206
- return openApiType;
207
- }
208
- if (openApiType)
209
- return openApiType;
210
- }
211
- return renderAs;
212
- }
213
185
  applyAssociation(associationStatement) {
214
186
  const associatedData = this.associatedData(associationStatement);
215
187
  if (associationStatement.type === 'RendersMany' && Array.isArray(associatedData))
@@ -281,3 +253,30 @@ class DreamSerializer {
281
253
  }
282
254
  }
283
255
  exports.default = DreamSerializer;
256
+ function unknownTypeToIsoDateString(dateTime) {
257
+ if (dateTime instanceof CalendarDate_js_1.default || dateTime instanceof DateTime_js_1.DateTime)
258
+ return dateTime.toISODate();
259
+ return null;
260
+ }
261
+ function unknownTypeToIsoDatetimeString(dateTime) {
262
+ if (dateTime instanceof CalendarDate_js_1.default)
263
+ return DateTime_js_1.DateTime.fromISO(dateTime.toISO()).toISO();
264
+ if (dateTime instanceof DateTime_js_1.DateTime)
265
+ return dateTime.toISO();
266
+ return null;
267
+ }
268
+ function numberOrStringToNumber(num) {
269
+ if (num === undefined)
270
+ return null;
271
+ if (num === null)
272
+ return null;
273
+ if (typeof num === 'number')
274
+ return num;
275
+ return Number(num);
276
+ }
277
+ function unknownTypeToDecimal(decimalOrString, precision) {
278
+ const decimalValue = numberOrStringToNumber(decimalOrString);
279
+ if (decimalValue === null)
280
+ return null;
281
+ return precision === undefined ? decimalValue : (0, round_js_1.default)(decimalValue, precision);
282
+ }
@@ -1,4 +1,4 @@
1
- import { isString } from '../../helpers/typechecks.js';
1
+ import { isObject, isString } from '../../helpers/typechecks.js';
2
2
  import { dreamAttributeOpenapiShape } from './helpers/dreamAttributeOpenapiShape.js';
3
3
  /*
4
4
  * Used to indicate which properties or methods on a
@@ -94,17 +94,21 @@ export default function Attribute(dreamClass_or_shorthandAttribute_or_manualOpen
94
94
  ...dreamAttributeOpenapiShape(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions, key),
95
95
  ...openApiOptions,
96
96
  };
97
+ renderAs = openApiShape.format || maybeNullPrimitiveToPrimitive(openApiShape?.type);
97
98
  //
98
99
  }
99
- else if (isString(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions) ||
100
- Array.isArray(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions)) {
101
- renderAs = dreamClass_or_shorthandAttribute_or_manualOpenapiOptions;
102
- openApiShape = { type: renderAs, ...openApiOptions };
100
+ else if (isString(maybeNullPrimitiveToPrimitive(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions))) {
101
+ openApiShape = {
102
+ type: dreamClass_or_shorthandAttribute_or_manualOpenapiOptions,
103
+ ...openApiOptions,
104
+ };
105
+ renderAs = maybeNullPrimitiveToPrimitive(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions);
103
106
  //
104
107
  }
105
- else if (typeof dreamClass_or_shorthandAttribute_or_manualOpenapiOptions === 'object') {
108
+ else if (isObject(dreamClass_or_shorthandAttribute_or_manualOpenapiOptions)) {
106
109
  openApiShape = dreamClass_or_shorthandAttribute_or_manualOpenapiOptions;
107
- renderAs = openApiShape;
110
+ renderAs = openApiShape.format || maybeNullPrimitiveToPrimitive(openApiShape?.type);
111
+ //
108
112
  }
109
113
  else if (dreamClass_or_shorthandAttribute_or_manualOpenapiOptions === undefined) {
110
114
  // no-op
@@ -129,6 +133,18 @@ Attribute: ${key}
129
133
  });
130
134
  };
131
135
  }
136
+ function maybeNullPrimitiveToPrimitive(openapiType) {
137
+ if (Array.isArray(openapiType)) {
138
+ if (openapiType[1] === 'null')
139
+ return openapiType[0];
140
+ if (openapiType[0] === 'null')
141
+ return openapiType[1];
142
+ throw new Error(`Expected array with 'null' and an OpenAPI primitive string: ${JSON.stringify(openapiType)}`);
143
+ }
144
+ else {
145
+ return openapiType;
146
+ }
147
+ }
132
148
  function openApiAndRenderOptionsToSeparateOptions(openApiAndRenderOptions) {
133
149
  let openApiOptions;
134
150
  let renderOptions;
@@ -3,6 +3,7 @@ import { DreamConst } from '../dream/constants.js';
3
3
  import GlobalNameNotSet from '../errors/dream-application/GlobalNameNotSet.js';
4
4
  import MissingSerializer from '../errors/MissingSerializersDefinition.js';
5
5
  import FailedToRenderThroughAssociationForSerializer from '../errors/serializers/FailedToRenderThroughAssociationForSerializer.js';
6
+ import CalendarDate from '../helpers/CalendarDate.js';
6
7
  import camelize from '../helpers/camelize.js';
7
8
  import compact from '../helpers/compact.js';
8
9
  import { DateTime } from '../helpers/DateTime.js';
@@ -143,29 +144,34 @@ export default class DreamSerializer {
143
144
  const fieldWithCasing = this.applyCasingToField(field);
144
145
  let dateValue;
145
146
  let decimalValue;
146
- switch (this.computedRenderAs(renderAs)) {
147
+ switch (renderAs) {
147
148
  case 'date':
149
+ case 'date[]':
148
150
  dateValue = this.getAttributeValue(attributeStatement);
149
- returnObj[fieldWithCasing] = dateValue?.toISODate() || null;
151
+ returnObj[fieldWithCasing] = Array.isArray(dateValue)
152
+ ? dateValue?.map(date => unknownTypeToIsoDateString(date))
153
+ : unknownTypeToIsoDateString(dateValue);
150
154
  break;
151
155
  case 'date-time':
156
+ case 'date-time[]':
152
157
  dateValue = this.getAttributeValue(attributeStatement);
153
- returnObj[fieldWithCasing] = dateValue?.toISO()
154
- ? DateTime.fromISO(dateValue.toISO()).toISO()
155
- : null;
158
+ returnObj[fieldWithCasing] = Array.isArray(dateValue)
159
+ ? dateValue?.map(date => unknownTypeToIsoDatetimeString(date))
160
+ : unknownTypeToIsoDatetimeString(dateValue);
156
161
  break;
157
162
  case 'decimal':
158
- decimalValue = this.numberOrStringToNumber(this.getAttributeValue(attributeStatement));
159
- returnObj[fieldWithCasing] =
160
- decimalValue === null
161
- ? null
162
- : renderOptions?.precision === undefined
163
- ? decimalValue
164
- : round(decimalValue, renderOptions?.precision);
163
+ case 'decimal[]':
164
+ decimalValue = this.getAttributeValue(attributeStatement);
165
+ returnObj[fieldWithCasing] = Array.isArray(decimalValue)
166
+ ? decimalValue?.map(date => unknownTypeToDecimal(date, renderOptions?.precision))
167
+ : unknownTypeToDecimal(decimalValue, renderOptions?.precision);
165
168
  break;
166
169
  case 'integer':
167
- decimalValue = this.numberOrStringToNumber(this.getAttributeValue(attributeStatement));
168
- returnObj[fieldWithCasing] = decimalValue === null ? null : round(decimalValue);
170
+ case 'integer[]':
171
+ decimalValue = this.getAttributeValue(attributeStatement);
172
+ returnObj[fieldWithCasing] = Array.isArray(decimalValue)
173
+ ? decimalValue?.map(date => unknownTypeToDecimal(date, 0))
174
+ : unknownTypeToDecimal(decimalValue, 0);
169
175
  break;
170
176
  default:
171
177
  returnObj[fieldWithCasing] = this.getAttributeValue(attributeStatement);
@@ -174,40 +180,6 @@ export default class DreamSerializer {
174
180
  });
175
181
  return returnObj;
176
182
  }
177
- numberOrStringToNumber(num) {
178
- if (num === undefined)
179
- return null;
180
- if (num === null)
181
- return null;
182
- if (typeof num === 'number')
183
- return num;
184
- return Number(num);
185
- }
186
- computedRenderAs(renderAs) {
187
- if (typeof renderAs === 'object') {
188
- const safeRenderAs = renderAs;
189
- let openApiType = safeRenderAs.type;
190
- if (Array.isArray(openApiType)) {
191
- if (openApiType[1] === 'null') {
192
- openApiType = openApiType[0];
193
- }
194
- else if (openApiType[0] === 'null') {
195
- openApiType = openApiType[1];
196
- }
197
- else {
198
- throw new Error(`Expected array with 'null' and an OpenAPI primitive string: ${JSON.stringify(openApiType)}`);
199
- }
200
- }
201
- if (openApiType === 'string' || openApiType === 'number') {
202
- if (safeRenderAs.format)
203
- return safeRenderAs.format;
204
- return openApiType;
205
- }
206
- if (openApiType)
207
- return openApiType;
208
- }
209
- return renderAs;
210
- }
211
183
  applyAssociation(associationStatement) {
212
184
  const associatedData = this.associatedData(associationStatement);
213
185
  if (associationStatement.type === 'RendersMany' && Array.isArray(associatedData))
@@ -278,3 +250,30 @@ export default class DreamSerializer {
278
250
  }
279
251
  }
280
252
  }
253
+ function unknownTypeToIsoDateString(dateTime) {
254
+ if (dateTime instanceof CalendarDate || dateTime instanceof DateTime)
255
+ return dateTime.toISODate();
256
+ return null;
257
+ }
258
+ function unknownTypeToIsoDatetimeString(dateTime) {
259
+ if (dateTime instanceof CalendarDate)
260
+ return DateTime.fromISO(dateTime.toISO()).toISO();
261
+ if (dateTime instanceof DateTime)
262
+ return dateTime.toISO();
263
+ return null;
264
+ }
265
+ function numberOrStringToNumber(num) {
266
+ if (num === undefined)
267
+ return null;
268
+ if (num === null)
269
+ return null;
270
+ if (typeof num === 'number')
271
+ return num;
272
+ return Number(num);
273
+ }
274
+ function unknownTypeToDecimal(decimalOrString, precision) {
275
+ const decimalValue = numberOrStringToNumber(decimalOrString);
276
+ if (decimalValue === null)
277
+ return null;
278
+ return precision === undefined ? decimalValue : round(decimalValue, precision);
279
+ }
@@ -1,6 +1,6 @@
1
1
  import Dream from '../../Dream.js';
2
2
  import { RoundingPrecision } from '../../helpers/round.js';
3
- import { OpenapiSchemaBodyShorthand, OpenapiShorthandPrimitiveTypes } from '../../types/openapi.js';
3
+ import { OpenapiSchemaBodyShorthand, OpenapiShorthandPrimitiveBaseTypes, OpenapiShorthandPrimitiveTypes } from '../../types/openapi.js';
4
4
  export default function Attribute(): any;
5
5
  export default function Attribute(manualOpenapiOptions: OpenapiSchemaBodyShorthand, renderOptions?: AttributeRenderOptions): any;
6
6
  export default function Attribute<DreamClass extends typeof Dream>(dreamClass: DreamClass, openApiAndRenderOptions?: AutomaticOpenapiAndRenderOptions): any;
@@ -11,7 +11,7 @@ export interface AttributeStatement {
11
11
  field: string;
12
12
  functional: boolean;
13
13
  openApiShape: OpenapiSchemaBodyShorthand;
14
- renderAs?: SerializableTypes;
14
+ renderAs?: OpenapiShorthandPrimitiveBaseTypes;
15
15
  renderOptions?: AttributeRenderOptions;
16
16
  }
17
17
  interface OpenapiOnlyOptions {
@@ -42,8 +42,6 @@ export default class DreamSerializer<DataType = any, PassthroughDataType = any>
42
42
  renderOne(): {
43
43
  [key: string]: any;
44
44
  };
45
- private numberOrStringToNumber;
46
- private computedRenderAs;
47
45
  private applyAssociation;
48
46
  private renderAssociation;
49
47
  private associatedData;
@@ -83,7 +83,7 @@ export type OpenapiSchemaCommonFields<T> = T & {
83
83
 
84
84
  export type OpenapiSchemaString = OpenapiSchemaCommonFields<{
85
85
  type: 'string' | ['string', 'null'] | ['null', 'string']
86
- enum?: string[] | Readonly<string[]>
86
+ enum?: (string | null)[] | Readonly<(string | null)[]>
87
87
  format?: string
88
88
  pattern?: string
89
89
  minLength?: number
@@ -230,7 +230,7 @@ export type OpenapiPrimitiveTypes =
230
230
  | [OpenapiPrimitiveBaseTypes, 'null']
231
231
  | ['null', OpenapiPrimitiveBaseTypes]
232
232
 
233
- type OpenapiShorthandPrimitiveBaseTypes = (typeof openapiShorthandPrimitiveTypes)[number]
233
+ export type OpenapiShorthandPrimitiveBaseTypes = (typeof openapiShorthandPrimitiveTypes)[number]
234
234
  export type OpenapiShorthandPrimitiveTypes =
235
235
  | OpenapiShorthandPrimitiveBaseTypes
236
236
  | [OpenapiShorthandPrimitiveBaseTypes, 'null']
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html class="default" lang="en"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Benchmark | @rvoh/dream</title><meta name="description" content="Documentation for @rvoh/dream"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@rvoh/dream</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@rvoh/dream</a></li><li><a href="Benchmark.html">Benchmark</a></li></ul><h1>Class Benchmark</h1></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/a3cb7a1b45e76100cdc16dc8159f9d68131e4664/src/helpers/benchmark.ts#L6">src/helpers/benchmark.ts:6</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="Benchmark.html#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
1
+ <!DOCTYPE html><html class="default" lang="en"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Benchmark | @rvoh/dream</title><meta name="description" content="Documentation for @rvoh/dream"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@rvoh/dream</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@rvoh/dream</a></li><li><a href="Benchmark.html">Benchmark</a></li></ul><h1>Class Benchmark</h1></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/cf2e5d36cb609cded66b58013751a0cf9ca2e08a/src/helpers/benchmark.ts#L6">src/helpers/benchmark.ts:6</a></li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><h5 class="tsd-index-heading uppercase" role="button" aria-expanded="false" tabIndex="0"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-chevronSmall"></use></svg> Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="Benchmark.html#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
2
2
  </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="Benchmark.html#mark" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>mark</span></a>
3
3
  <a href="Benchmark.html#start" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>start</span></a>
4
- </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Constructors</h2></summary><section><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Benchmark" class="tsd-anchor"></a><span class="tsd-kind-constructor-signature">new <wbr/>Benchmark</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="Benchmark.html" class="tsd-signature-type tsd-kind-class">Benchmark</a><a href="#constructor.new_Benchmark" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="Benchmark.html" class="tsd-signature-type tsd-kind-class">Benchmark</a></h4></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Methods</h2></summary><section><section class="tsd-panel tsd-member"><a id="mark" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>mark</span><a href="#mark" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="mark.mark-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">mark</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">message</span>, <span class="tsd-kind-parameter">level</span><span class="tsd-signature-symbol">?</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#mark.mark-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">message</span>: <span class="tsd-signature-type">string</span></span></li><li><span><span class="tsd-kind-parameter">level</span>: <span class="tsd-signature-type">BenchmarkLogLevel</span><span class="tsd-signature-symbol"> = &#39;log&#39;</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/a3cb7a1b45e76100cdc16dc8159f9d68131e4664/src/helpers/benchmark.ts#L12">src/helpers/benchmark.ts:12</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="start" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>start</span><a href="#start" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="start.start-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">start</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#start.start-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/a3cb7a1b45e76100cdc16dc8159f9d68131e4664/src/helpers/benchmark.ts#L8">src/helpers/benchmark.ts:8</a></li></ul></aside></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="tsd-otp-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="tsd-otp-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#mark" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>mark</span></a><a href="#start" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>start</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@rvoh/dream</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
4
+ </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Constructors</h2></summary><section><section class="tsd-panel tsd-member"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="constructor.new_Benchmark" class="tsd-anchor"></a><span class="tsd-kind-constructor-signature">new <wbr/>Benchmark</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="Benchmark.html" class="tsd-signature-type tsd-kind-class">Benchmark</a><a href="#constructor.new_Benchmark" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="Benchmark.html" class="tsd-signature-type tsd-kind-class">Benchmark</a></h4></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><h2><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg> Methods</h2></summary><section><section class="tsd-panel tsd-member"><a id="mark" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>mark</span><a href="#mark" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="mark.mark-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">mark</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">message</span>, <span class="tsd-kind-parameter">level</span><span class="tsd-signature-symbol">?</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#mark.mark-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">message</span>: <span class="tsd-signature-type">string</span></span></li><li><span><span class="tsd-kind-parameter">level</span>: <span class="tsd-signature-type">BenchmarkLogLevel</span><span class="tsd-signature-symbol"> = &#39;log&#39;</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/cf2e5d36cb609cded66b58013751a0cf9ca2e08a/src/helpers/benchmark.ts#L12">src/helpers/benchmark.ts:12</a></li></ul></aside></li></ul></section><section class="tsd-panel tsd-member"><a id="start" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span>start</span><a href="#start" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class="tsd-signature tsd-anchor-link"><a id="start.start-1" class="tsd-anchor"></a><span class="tsd-kind-call-signature">start</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span><a href="#start.start-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></li><li class="tsd-description"><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/rvohealth/dream/blob/cf2e5d36cb609cded66b58013751a0cf9ca2e08a/src/helpers/benchmark.ts#L8">src/helpers/benchmark.ts:8</a></li></ul></aside></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="tsd-otp-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="tsd-otp-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#mark" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>mark</span></a><a href="#start" class=""><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-2048"></use></svg><span>start</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>@rvoh/dream</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>