functional-models 2.1.5 → 2.1.7

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/README.md CHANGED
@@ -320,4 +320,71 @@ A property that references another property. (Think Foreign Key)
320
320
 
321
321
  #### AdvancedModelReferenceProperty
322
322
 
323
- A more fuller/advanced property for referencing other properties. Useful for typescripting.
323
+ A fuller more advanced property for referencing other properties. Useful for typescripting.
324
+
325
+ #### DenormalizedProperty
326
+
327
+ A value that is calculated and save if it doesn't exist, using other values for a model instance. This property adds a `isDenormalized:true` to the property's config, as well as a `calculate()` function to the property itself.
328
+
329
+ NOTE: If the value is provided as part of the instance, it is not re-calculated. If you want to re-calculate it, you must use either the property's method `calculate()` method to get the value and replace the existing OR pass in undefined for the property.
330
+
331
+ <strong>A Strong Word of Caution</strong>
332
+ Generally, we would recommend not using this as a primary key in a database. However, if you want to use a DenormalizedProperty as primary key in a database and you want to make changes to an instance, you need to delete the previous entry and then recreate it for every update. A dynamic primary key is not tracked between changes.
333
+
334
+ <strong>Example</strong>
335
+
336
+ ```typescript
337
+ import { DenormalizedProperty } from 'functional-models/src/properties'
338
+ import { TypedJsonObj } from 'functional-models/interfaces'
339
+
340
+ // Your base data
341
+ type Greeting = {
342
+ name: 'Dolly',
343
+ greeting: 'Hello',
344
+ displayName?: string
345
+ }
346
+
347
+ // Create your model
348
+ const Greetings = Model<Greeting>('Greetings', {
349
+ properties: {
350
+ name: TextProperty(),
351
+ greeting: TextProperty(),
352
+ displayName: DenormalizedProperty<string>("TextProperty", (modelData: Greeting) => {
353
+ return `${modelData.greeting} ${modelData.name}`
354
+ }),
355
+ }
356
+ })
357
+
358
+ // Create Your Instance
359
+ const instance = Model<Greeting>.create({
360
+ name: 'Dolly',
361
+ greeting: 'Hello',
362
+ })
363
+
364
+ // Let's look at the displayName property
365
+ const value = await instance.get.displayName()
366
+ console.info(value) // Hello Dolly
367
+
368
+ // Here is the object as a whole
369
+ const data = await instance.toObj()
370
+ console.info(data) // { name: 'Dolly', greeting: 'Hello', displayName: 'Hello Dolly' }
371
+
372
+ // DON"T TRY TO CHANGE THE MODEL THIS WAY. It doesn't work.
373
+ const newData = {
374
+ ...data,
375
+ name: 'Fred',
376
+ }
377
+ const instanceBad = Model<Greeting>.create(newData)
378
+ const badValue = await instance.get.displayName()
379
+ console.info(badValue) // Hello Dolly - this does not change!!!
380
+
381
+ // "A better way"
382
+ const newDataGood = {
383
+ ...data,
384
+ name: 'Fred',
385
+ displayName: undefined
386
+ }
387
+ const instanceGood = Model<Greeting>.create(newDataGood)
388
+ const goodValue = await instance.get.displayName()
389
+ console.info(goodValue) // Hello Fred - Expected
390
+ ```
package/interfaces.d.ts CHANGED
@@ -69,6 +69,7 @@ declare type DefaultPropertyValidators = Readonly<{
69
69
  declare type PropertyConfigContents<T extends Arrayable<FunctionalValue>> = Readonly<{
70
70
  type?: string;
71
71
  defaultValue?: T;
72
+ isDenormalized?: boolean;
72
73
  value?: T;
73
74
  choices?: readonly VeryPrimitivesTypes[];
74
75
  lazyLoadMethod?: <TData extends FunctionalModel>(value: T, modelData: TData) => MaybeLazy<T>;
@@ -142,4 +143,5 @@ declare type OptionalModelOptions<T extends FunctionalModel, TModel extends Mode
142
143
  instanceCreatedCallback?: Nullable<Arrayable<(instance: TModelInstance) => void>>;
143
144
  [s: string]: any;
144
145
  }> | undefined;
145
- export { MaybeFunction, Maybe, MaybePromise, Nullable, Arrayable, MaybeLazy, JsonAble, toObj, ModelInstance, Model, PropertyValidatorComponent, PropertyValidatorComponentSync, PropertyValidatorComponentAsync, PropertyValidator, ModelValidatorComponent, PropertyInstance, PropertyConfig, FunctionalValue, ValueGetter, ModelReference, ModelDefinition, ModelOptions, OptionalModelOptions, ModelReferencePropertyInstance, PropertyGetters, PropertyValidators, PropertyValidatorComponentTypeAdvanced, FunctionalModel, ModelReferenceFunctions, ModelErrors, PrimaryKeyType, ModelFactory, ModelFetcher, CreateParams, ValidatorConfiguration, ValuePropertyValidatorComponent, ValueRequired, ValueOptional, PropertyModifier, ValidationErrors, ModelError, IsAsync, TypedJsonObj, JsonObj, ValueRequiredR, ValueOptionalR, };
146
+ declare type CalculateDenormalization<T extends FunctionalValue, TModel extends FunctionalModel> = (modelData: TModel) => MaybePromise<T>;
147
+ export { MaybeFunction, Maybe, MaybePromise, Nullable, Arrayable, MaybeLazy, JsonAble, toObj, ModelInstance, Model, PropertyValidatorComponent, PropertyValidatorComponentSync, PropertyValidatorComponentAsync, PropertyValidator, ModelValidatorComponent, PropertyInstance, PropertyConfig, FunctionalValue, ValueGetter, ModelReference, ModelDefinition, ModelOptions, OptionalModelOptions, ModelReferencePropertyInstance, PropertyGetters, PropertyValidators, PropertyValidatorComponentTypeAdvanced, FunctionalModel, ModelReferenceFunctions, ModelErrors, PrimaryKeyType, ModelFactory, ModelFetcher, CreateParams, ValidatorConfiguration, ValuePropertyValidatorComponent, ValueRequired, ValueOptional, PropertyModifier, ValidationErrors, ModelError, IsAsync, TypedJsonObj, JsonObj, ValueRequiredR, ValueOptionalR, CalculateDenormalization, };
package/interfaces.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;AAgYA,kCAAkC"}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;AAuYA,kCAAkC"}
package/models.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import { ModelFactory } from './interfaces';
1
+ import { Model, ModelFactory } from './interfaces';
2
2
  declare const BaseModel: ModelFactory;
3
- export { BaseModel };
3
+ declare const Model: ModelFactory;
4
+ export { BaseModel, Model };
package/models.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.BaseModel = void 0;
6
+ exports.Model = exports.BaseModel = void 0;
7
7
  const merge_1 = __importDefault(require("lodash/merge"));
8
8
  const serialization_1 = require("./serialization");
9
9
  const validation_1 = require("./validation");
@@ -115,4 +115,6 @@ const BaseModel = (pluralName, modelDefinition, options) => {
115
115
  return model;
116
116
  };
117
117
  exports.BaseModel = BaseModel;
118
+ const Model = BaseModel;
119
+ exports.Model = Model;
118
120
  //# sourceMappingURL=models.js.map
package/models.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functional-models",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "description": "A library for creating JavaScript function based models.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",