UNPKG

immutable-class

Version:

A template for creating immutable classes

142 lines (141 loc) 3.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Car = exports.Driver = void 0; const base_immutable_1 = require("./base-immutable"); class Driver extends base_immutable_1.BaseImmutable { static fromJS(params) { return new Driver(base_immutable_1.BaseImmutable.jsToValue(Driver.PROPERTIES, params)); } constructor(params) { super(params); } } exports.Driver = Driver; Object.defineProperty(Driver, "PROPERTIES", { enumerable: true, configurable: true, writable: true, value: [{ name: 'name', defaultValue: null }] }); base_immutable_1.BaseImmutable.finalize(Driver); Driver.POPE = Driver.fromJS({ name: 'the pope' }); function ensureNonNegative(n) { if (n < 0) throw new Error('must non negative positive'); } class Car extends base_immutable_1.BaseImmutable { static isCar(car) { return car instanceof Car; } static fromJS(properties) { return new Car(base_immutable_1.BaseImmutable.jsToValue(Car.PROPERTIES, properties, Car.BACK_COMPATS)); } constructor(properties) { super(properties); Object.defineProperty(this, "range", { enumerable: true, configurable: true, writable: true, value: void 0 }); if (properties.range != null) this.range = properties.range; if (this.fuel === 'electric' && this.range && this.range < 200) { this.range = 200; } } getSubCar() { const { name, subCar } = this; if (subCar) return subCar; if (name === 'ford') return Car.fromJS({ name: 'pinto', fuel: 'gas' }); if (name === 'toyota') return Car.fromJS({ name: 'prius', fuel: 'electric' }); return null; } changeRange(n) { const value = this.valueOf(); const { fuel } = value; if (fuel === 'electric') { value.range = n > 400 ? 400 : n; return new Car(value); } if (fuel === 'diesel') { value.range = n > 2000 ? 2000 : n; return new Car(value); } value.range = n; return new Car(value); } } exports.Car = Car; Object.defineProperty(Car, "PROPERTIES", { enumerable: true, configurable: true, writable: true, value: [ { name: 'name', validate: (n) => { if (n.toLowerCase() !== n) throw new Error('must be lowercase'); }, }, { name: 'fuel', defaultValue: 'electric', possibleValues: ['gas', 'diesel', 'electric'], }, { name: 'subCar', defaultValue: null, immutableClass: Car, }, { name: 'range', defaultValue: 100, validate: [base_immutable_1.BaseImmutable.ensure.number, ensureNonNegative], }, { name: 'relatedCars', defaultValue: [], immutableClassArray: Car, }, { name: 'createdOn', defaultValue: null, type: base_immutable_1.PropertyType.DATE, }, { name: 'owners', defaultValue: null, emptyArrayIsOk: true, }, { name: 'driver', defaultValue: Driver.POPE, immutableClass: Driver, }, { name: 'passengers', type: base_immutable_1.PropertyType.ARRAY, }, ] }); Object.defineProperty(Car, "BACK_COMPATS", { enumerable: true, configurable: true, writable: true, value: [ { condition: (js) => { return js.fuelType; }, action: (js) => { js.fuel = js.fuelType; }, }, ] }); base_immutable_1.BaseImmutable.finalize(Car);