objectmodel 4.4.3 → 4.4.4

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.
@@ -1,4 +1,4 @@
1
- // ObjectModel v4.4.3 - http://objectmodel.js.org
1
+ // ObjectModel v4.4.4 - http://objectmodel.js.org
2
2
  // MIT License - Sylvain Pollet-Villard
3
3
  const
4
4
  ObjectProto = Object.prototype,
@@ -1,4 +1,4 @@
1
- // ObjectModel v4.4.3 - http://objectmodel.js.org
1
+ // ObjectModel v4.4.4 - http://objectmodel.js.org
2
2
  // MIT License - Sylvain Pollet-Villard
3
3
  const
4
4
  ObjectProto = Object.prototype,
@@ -1,4 +1,4 @@
1
- // ObjectModel v4.4.3 - http://objectmodel.js.org
1
+ // ObjectModel v4.4.4 - http://objectmodel.js.org
2
2
  // MIT License - Sylvain Pollet-Villard
3
3
  const t=Object.prototype,e=Object.getPrototypeOf,r=Object.setPrototypeOf,n=(e,r)=>t.hasOwnProperty.call(e,r),i=(t,e)=>e instanceof t,o=t=>"function"==typeof t,s=t=>t&&"object"==typeof t,a=t=>"string"==typeof t,l=r=>s(r)&&e(r)===t,c=t=>t&&o(t[Symbol.iterator]),f=(t,e)=>new Proxy(t,e),u=(t,e={})=>{for(let r in e)if(l(e[r])){const n={};u(n,t[r]),u(n,e[r]),t[r]=n}else t[r]=e[r];return t},p=(t,e,r,n=!1)=>{Object.defineProperty(t,e,{value:r,enumerable:n,writable:!0,configurable:!0})},h=(t,e,n)=>{t.prototype=Object.assign(Object.create(e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),n),r(t,e)},d=Symbol(),g=Symbol(),y=Symbol(),m=Symbol(),v=(t,e,n,o,s,a)=>{const l=function(t=l.default,e){return a&&!i(l,this)?new l(t):(o&&(t=o(t,l,this)),e===g||x(l,t)?s&&e!==m?f(t,s(l)):t:void 0)};return n&&h(l,n),r(l,e.prototype),l.constructor=e,l.definition=t,l.assertions=[...l.assertions],p(l,"errors",[]),delete l.name,l},b=(t,e,r)=>i(e,t)?t:s(t)||o(t)||void 0===t?(u(r,e.default),e.parentClass&&u(t,new e.parentClass(t)),u(r,t),r):t,$=(t,e,r)=>(h(t,e,r),t.assertions.push(...e.assertions),t),S=(t,e,r,n,i)=>{t.push({expected:e,received:r,path:n,message:i})},w=(e,r=e.errorCollector)=>{const n=e.errors.length;if(n>0){const n=e.errors.map((e=>{var r;return e.message||(e.message="expecting "+(e.path?e.path+" to be ":"")+P(e.expected)+", got "+(null!=e.received?(r=e.received,t.toString.call(r).match(/\s([a-zA-Z]+)/)[1]+" "):"")+k(e.received)),e}));e.errors.length=0,r.call(e,n)}return n},O=t=>t&&e(t)&&i(K,e(t).constructor),j=t=>{if(l(t)){t={};for(let e in t)t[e]=j(t[e])}return Array.isArray(t)?1===t.length?[t[0],void 0,null]:t:[t]},P=(t,e)=>{const r=j(t).map((t=>k(t,e)));return r.length>1?r.join(" or "):r[0]},A=(t,e=[])=>(e.length>0&&(t=[].concat(t,...[].concat(e)).filter(((t,e,r)=>r.indexOf(t)===e))),t),x=(t,e)=>(t[d](e,null,t.errors,[],!0),!w(t)),C=(t,e,r,n,o,s)=>{const a=o.indexOf(e);if(-1!==a&&-1!==o.indexOf(e,a+1))return t;if(Array.isArray(e)&&1===e.length&&null!=t&&(e=e[0]),i(K,e))s&&(t=N(t,e)),e[d](t,r,n,o.concat(e),s);else if(l(e))for(let i in e){const a=t?t[i]:void 0;C(a,e[i],M(r,i),n,o,s)}else{if(j(e).some((e=>R(t,e,r,o,s))))return s?N(t,e):t;S(n,e,t,r)}return t},R=(t,e,r,n,s)=>{if(e===H)return!0;if(null==t)return t===e;if(l(e)||i(K,e)){const i=[];return C(t,e,r,i,n,s),!i.length}return i(RegExp,e)?e.test(t):e===Number||e===Date?t.constructor===e&&!isNaN(t):t===e||o(e)&&i(e,t)||t.constructor===e},F=(t,e,r,n=e.errors)=>{for(let i of e.assertions){let s;try{s=i.call(e,t)}catch(t){s=t}if(!0!==s){const a=o(i.description)?i.description:(t,e)=>`assertion "${i.description}" returned ${k(t)} for ${r?r+" =":"value"} ${k(e)}`;S(n,i,t,r,a.call(e,s,t,r))}}},k=(e,r=[])=>{if(r.length>15||r.includes(e))return"...";if(null==e)return String(e);if(a(e))return`"${e}"`;if(i(K,e))return e.toString(r);if(r.unshift(e),o(e))return e.name||e.toString();if(i(Map,e)||i(Set,e))return k([...e]);if(Array.isArray(e))return`[${e.map((t=>k(t,r))).join(", ")}]`;if(e.toString&&e.toString!==t.toString)return e.toString();if(s(e)){const t=Object.keys(e),n="\t".repeat(r.length);return`{${t.map((t=>`\n${n+t}: ${k(e[t],[...r])}`)).join(", ")} ${t.length?`\n${n.slice(1)}`:""}}`}return String(e)},M=(t,e)=>t?t+"."+e:e,E=(t,e,r,i,o,s,a)=>{const l=M(r,o),c=t.conventionForPrivate(o),f=t.conventionForConstant(o),u=n(i,o),p=u&&Object.getOwnPropertyDescriptor(i,o);o in e&&(c&&!s||f&&void 0!==i[o])&&D(`modify ${c?"private":"constant"} property ${o}`,t),a(),n(e,o)&&C(i[o],e[o],l,t.errors,[]),F(i,t,l);const h=t.errors.length;return h&&(u?Object.defineProperty(i,o,p):delete i[o],w(t)),!h},D=(t,e)=>{e.errors.push({message:"cannot "+t})},N=(t,e=[])=>{if(!t||l(e)||i(_,e)||O(t))return t;const r=j(e),n=[];for(let e of r)i(K,e)&&!i(_,e)&&e.test(t)&&n.push(e);return 1===n.length?new n[0](t,g):(n.length>1&&console.warn(`Ambiguous model for value ${k(t)}, could be ${n.join(" or ")}`),t)},T=(t,e,r,i)=>({get(s,c){if(c===y)return s;if(!a(c))return Reflect.get(s,c);const u=M(r,c),p=n(e,c),h=e[c];if(!i&&p&&t.conventionForPrivate(c))return D(`access to private property ${u}`,t),void w(t);let d=s[c];return p&&d&&n(s,c)&&!l(h)&&!O(d)&&Reflect.set(s,c,d=N(d,h)),o(d)&&"constructor"!==c&&!i?f(d,{apply(t,e,r){i=!0;const n=Reflect.apply(t,e,r);return i=!1,n}}):(l(h)&&!d&&(s[c]=d={}),((t,e,r,n,i)=>l(r)?f(t,T(e,r,n,i)):N(t,r))(d,t,h,u,i))},set:(n,o,s)=>E(t,e,r,n,o,i,(()=>Reflect.set(n,o,N(s,e[o])))),deleteProperty:(n,o)=>E(t,e,r,n,o,i,(()=>Reflect.deleteProperty(n,o))),defineProperty:(n,o,s)=>E(t,e,r,n,o,i,(()=>Reflect.defineProperty(n,o,s))),has:(r,n)=>Reflect.has(r,n)&&Reflect.has(e,n)&&!t.conventionForPrivate(n),ownKeys:r=>Reflect.ownKeys(r).filter((r=>Reflect.has(e,r)&&!t.conventionForPrivate(r))),getOwnPropertyDescriptor(r,n){let i;return t.conventionForPrivate(n)||(i=Object.getOwnPropertyDescriptor(e,n),void 0!==i&&(i.value=r[n])),i}});function K(t){return l(t)?new z(t):new _(t)}function _(t){return v(t,_)}function z(t){return v(t,z,Object,b,(e=>T(e,t)),!0)}Object.assign(K.prototype,{name:"Model",assertions:[],conventionForConstant:t=>t.toUpperCase()===t,conventionForPrivate:t=>"_"===t[0],toString(t){return n(this,"name")?this.name:P(this.definition,t)+((e=this.assertions).length?`(${e.map((t=>t.name||t.description||t))})`:"");var e},as(t){return p(this,"name",t),this},defaultTo(t){return this.default=this(t),this},[d](t,e,r,n,i){C(t,this.definition,e,r,n,i),F(t,this,e,r)},test(t,r){let i=this;for(;!n(i,"errorCollector");)i=e(i);const o=i.errorCollector;let s;return i.errorCollector=t=>{s=!0,r&&r.call(this,t)},new this(t),i.errorCollector=o,!s},errorCollector(t){const e=new TypeError(t.map((t=>t.message)).join("\n"));throw e.stack=e.stack.replace(/\n.*object-model(.|\n)*object-model.*/,""),e},assert(t,e=k(t)){return p(t,"description",e),this.assertions=this.assertions.concat(t),this}}),K.CHECK_ONCE=m,h(_,K,{extend(...t){const e=$(new _(A(this.definition,t)),this);for(let r of t)i(_,r)&&e.assertions.push(...r.assertions);return e}}),h(z,K,{defaultTo(t){const e=this.definition;for(let r in t)n(e,r)&&(t[r]=C(t[r],e[r],r,this.errors,[],!0));return w(this),this.default=t,this},toString(t){return k(this.definition,t)},extend(...t){const r={...this.definition},n={...this.prototype},a={...this.default},l=[];for(let e of t)i(K,e)&&(u(r,e.definition),u(a,e.default),l.push(...e.assertions)),o(e)&&u(n,e.prototype),s(e)&&u(r,e);const c=$(new z(r),this,n).defaultTo(a);return c.assertions=[...this.assertions,...l],e(this)!==z.prototype&&(c.parentClass=this),c},[d](t,e,r,n,i){s(t)?C(t[y]||t,this.definition,e,r,n,i):S(r,this,t,e),F(t,this,e,r)}});const H=f(_(),{apply(t,e,[r]){const n=Object.create(H);return n.definition=r,n}});H.definition=H,H.toString=()=>"Any",H.remaining=function(t){this.definition=t},h(H.remaining,H,{toString(){return"..."+P(this.definition)}}),H[Symbol.iterator]=function*(){yield new H.remaining(this.definition)};const U=(t,e,r,i,s,a,l)=>v(r,e,t,i,(e=>Object.assign({getPrototypeOf:()=>e.prototype,get(r,i){if(i===y)return r;const l=r[i];return o(l)?f(l,{apply(o,l,c){if(n(a,i)){const[n,l=c.length-1,f]=a[i];for(let r=n;r<=l;r++){const n=f?f(r):e.definition;c[r]=C(c[r],n,`${t.name}.${i} arguments[${r}]`,e.errors,[],!0)}if(e.assertions.length>0){const t=s(r);o.apply(t,c),F(t,e,`after ${i} mutation`)}w(e)}return o.apply(r,c)}}):l}},l)));function W(t){const e=U(Array,W,t,(t=>Array.isArray(t)?t.map((t=>N(t,e.definition))):t),(t=>[...t]),{copyWithin:[],fill:[0,0],pop:[],push:[0],reverse:[],shift:[],sort:[],splice:[2],unshift:[0]},{set:(t,r,n)=>Z(e,t,r,n,((t,e)=>t[r]=e),!0),deleteProperty:(t,r)=>Z(e,t,r,void 0,(t=>delete t[r]))});return e}h(W,K,{toString(t){return"Array of "+P(this.definition,t)},[d](t,e,r,n,i){Array.isArray(t)?(t[y]||t).forEach(((t,o)=>C(t,this.definition,`${e||"Array"}[${o}]`,r,n,i))):S(r,this,t,e),F(t,this,e,r)},extend(...t){return $(new W(A(this.definition,t)),this)}});const Z=(t,e,r,n,i,o)=>{const s=`Array[${r}]`;+r>=0&&(o||r in e)&&(n=C(n,t.definition,s,t.errors,[],!0));const a=[...e];i(a),F(a,t,s);const l=!w(t);return l&&i(e,n),l};function q(...t){return v({arguments:t},q,Function,null,(t=>({getPrototypeOf:()=>t.prototype,get:(t,e)=>e===y?t:t[e],apply(e,r,n){const o=t.definition,s=o.arguments.find((t=>i(H.remaining,t))),a=s?Math.max(n.length,o.arguments.length-1):o.arguments.length;for(let e=0;e<a;e++){const r=s&&e>=o.arguments.length-1?s.definition:o.arguments[e];n[e]=C(n[e],r,`arguments[${e}]`,t.errors,[],!0)}let l;return F(n,t,"arguments"),t.errors.length||(l=Reflect.apply(e,r,n),"return"in o&&(l=C(l,o.return,"return value",t.errors,[],!0))),w(t),l}})))}function B(t,e){const r=t=>0===t?n.definition.key:n.definition.value,n=U(Map,B,{key:t,value:e},(t=>c(t)?new Map([...t].map((t=>t.map(((t,e)=>N(t,r(e))))))):t),(t=>new Map(t)),{set:[0,1,r],delete:[],clear:[]});return n}function G(t){const e=U(Set,G,t,(t=>c(t)?new Set([...t].map((t=>N(t,e.definition)))):t),(t=>new Set(t)),{add:[0,0],delete:[],clear:[]});return e}h(q,K,{toString(t=[]){let e=`Function(${this.definition.arguments.map((e=>P(e,[...t]))).join(", ")})`;return"return"in this.definition&&(e+=" => "+P(this.definition.return,t)),e},return(t){return this.definition.return=t,this},[d](t,e,r){o(t)||S(r,"Function",t,e)}}),h(B,K,{toString(t){return`Map of ${P(this.definition.key,t)} : ${P(this.definition.value,t)}`},[d](t,e,r,n,o){if(i(Map,t)){e=e||"Map";for(let[i,s]of t)C(i,this.definition.key,`${e} key`,r,n,o),C(s,this.definition.value,`${e}[${k(i)}]`,r,n,o)}else S(r,this,t,e);F(t,this,e,r)},extend(t,e){return $(new B(A(this.definition.key,t),A(this.definition.value,e)),this)}}),h(G,K,{toString(t){return"Set of "+P(this.definition,t)},[d](t,e,r,n,o){if(i(Set,t))for(let i of t.values())C(i,this.definition,`${e||"Set"} value`,r,n,o);else S(r,this,t,e);F(t,this,e,r)},extend(...t){return $(new G(A(this.definition,t)),this)}});export{H as Any,W as ArrayModel,_ as BasicModel,q as FunctionModel,B as MapModel,K as Model,z as ObjectModel,G as SetModel};
4
4
  //# sourceMappingURL=object-model.min.js.map
package/index.html CHANGED
@@ -156,7 +156,7 @@
156
156
 
157
157
  <div id="download">
158
158
  <h2>Download</h2>
159
- <h3>Current version: v<span class="version">4.4.3</span></h3>
159
+ <h3>Current version: v<span class="version">4.4.4</span></h3>
160
160
  <ul>
161
161
  <li>
162
162
  From <a href="https://www.npmjs.com/package/objectmodel" target="_blank" rel="noopener">
@@ -171,7 +171,7 @@
171
171
  <a href="dist/object-model.min.js">object-model.min.js</a>
172
172
  </li>
173
173
  <li>Source files :
174
- <a class="link-zip" href="https://github.com/sylvainpolletvillard/ObjectModel/archive/v4.4.3.zip">object-model-4.4.3.zip</a>
174
+ <a class="link-zip" href="https://github.com/sylvainpolletvillard/ObjectModel/archive/v4.4.4.zip">object-model-4.4.4.zip</a>
175
175
  </li>
176
176
  </ul>
177
177
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "objectmodel",
3
- "version": "4.4.3",
3
+ "version": "4.4.4",
4
4
  "description": "Strong Dynamically Typed Object Modeling for JavaScript",
5
5
  "author": "Sylvain Pollet-Villard",
6
6
  "license": "MIT",
@@ -6,6 +6,12 @@ export interface ArrayModel<D> extends Model<D> {
6
6
  new(array: FromDefinition<D>[]): FromDefinition<D>[];
7
7
 
8
8
  extend<E extends ModelDefinition[]>(...extensions: E): ArrayModel<E extends [] ? D : [D, ...E]>
9
+ defaultTo<Default extends FromDefinition<D>>(defaultValue: Default): ArrayModelWithDefault<D, Default>;
10
+ }
11
+
12
+ export interface ArrayModelWithDefault<D, Default> extends ArrayModel<D> {
13
+ (): Default
14
+ new(): Default
9
15
  }
10
16
 
11
17
  export interface ArrayModelConstructor {
@@ -8,6 +8,12 @@ export interface MapModel<Key extends ModelDefinition, Value extends ModelDefini
8
8
  definition: { key: Key, value: Value };
9
9
 
10
10
  extend<Keys extends ModelDefinition[], Values extends ModelDefinition[]>(otherKeys: Keys, otherValues: Values): MapModel<[Key, ...Keys], [Value, ...Values]>
11
+ defaultTo<Default extends Map<FromDefinition<Key>, FromDefinition<Value>>>(defaultValue: Default): MapModelWithDefault<Key, Value, Default>;
12
+ }
13
+
14
+ export interface MapModelWithDefault<Key, Value, Default> extends MapModel<Key, Value> {
15
+ (): Default
16
+ new(): Default
11
17
  }
12
18
 
13
19
  export interface MapModelConstructor {
@@ -21,8 +21,6 @@ export interface Model<D> {
21
21
 
22
22
  as(name: string): this;
23
23
 
24
- defaultTo<Default>(defaultValue: Default): ModelWithDefault<D,Default>;
25
-
26
24
  test(value: any, errorCollector?: (errors: ModelError[]) => void): boolean;
27
25
 
28
26
  errorCollector(errors: ModelError[]): void;
@@ -31,13 +29,6 @@ export interface Model<D> {
31
29
 
32
30
  }
33
31
 
34
- export interface ModelWithDefault<D,Default> extends Model<D> {
35
- default: Default
36
-
37
- (): Default
38
- new(): Default
39
- }
40
-
41
32
  export interface ModelConstructor {
42
33
  <D>(definition: D): D extends ObjectModelDefinition ? ObjectModel<D> : BasicModel<D>;
43
34
  new<D>(definition: D): D extends ObjectModelDefinition ? ObjectModel<D> : BasicModel<D>;
@@ -49,6 +40,12 @@ export interface BasicModel<D> extends Model<D> {
49
40
  new(value: FromDefinition<D>): FromDefinition<D>
50
41
 
51
42
  extend<E extends ModelDefinition[]>(...extensions: E): BasicModel<E extends [] ? D : [D, ...E]>;
43
+ defaultTo<Default extends FromDefinition<D>>(defaultValue: Default): BasicModelWithDefault<D, Default>;
44
+ }
45
+
46
+ export interface BasicModelWithDefault<D, Default> extends BasicModel<D> {
47
+ (): Default
48
+ new(): Default
52
49
  }
53
50
 
54
51
  export interface BasicModelConstructor {
@@ -61,6 +58,12 @@ export interface ObjectModel<D extends ObjectModelDefinition> extends Model<D> {
61
58
  new(value: Partial<FromObjectModelDefinition<D>>): FromObjectModelDefinition<D>;
62
59
 
63
60
  extend<Extensions extends (ObjectModelDefinition | ObjectModel<any>)[]>(...ext: Extensions) : ObjectModel<ExtendObjectDefinition<D, Extensions>>;
61
+ defaultTo<Default extends Partial<FromObjectModelDefinition<D>>>(defaultValue: Default): ObjectModelWithDefault<D, Default>
62
+ }
63
+
64
+ export interface ObjectModelWithDefault<D extends ObjectModelDefinition, Default> extends ObjectModel<D> {
65
+ (): Default
66
+ new(): Default
64
67
  }
65
68
 
66
69
  export interface ObjectModelConstructor {
@@ -6,6 +6,12 @@ export interface SetModel<D extends ModelDefinition> extends Model<D> {
6
6
  new(set: Set<FromDefinition<D>> | FromDefinition<D>[]): Set<FromDefinition<D>>;
7
7
 
8
8
  extend<E extends ModelDefinition[]>(...extensions: E): SetModel<E extends [] ? D : [D, ...E]>
9
+ defaultTo<Default extends Set<FromDefinition<D>>>(defaultValue: Default): SetModelWithDefault<D, Default>;
10
+ }
11
+
12
+ export interface SetModelWithDefault<D, Default> extends SetModel<D> {
13
+ (): Default
14
+ new(): Default
9
15
  }
10
16
 
11
17
  export interface SetModelConstructor {
@@ -28,3 +28,7 @@ const M2 = M.extend()
28
28
  expectType<Date>(M2(new Date()))
29
29
  const M3 = M2.extend(String)
30
30
  expectType<Date | string>(M3(new Date()))
31
+
32
+ const N = BasicModel(Number).defaultTo(0)
33
+ expectType<0>(N())
34
+ expectError(N("not a number"))
@@ -1,4 +1,4 @@
1
- import {expectType} from 'tsd';
1
+ import {expectError, expectType} from 'tsd';
2
2
  import { ObjectModel } from '../src/object-model';
3
3
  import { MapModel } from '../src/map-model';
4
4
 
@@ -18,4 +18,9 @@ expectType<Map<string | number | { ref: string }, Date | string | { date: Date }
18
18
  ["a", new Date()],
19
19
  [2, "b"],
20
20
  [{ ref: "c"}, { date: new Date() }]
21
- ]))
21
+ ]))
22
+
23
+ const M = MapModel(Number, String).defaultTo(new Map([[1, "first"]]))
24
+ expectType<Map<number, string>>(new M())
25
+ expectError(MapModel(Number, String).defaultTo("not a map"))
26
+ expectError(M("not a map"))
@@ -50,4 +50,33 @@ ann = new ClassMother({ name: "Ann", child: joanna })
50
50
 
51
51
  expectType<ClassMother>(ann)
52
52
  expectType<string>(ann.name)
53
- expectType<ClassPerson>(ann.child)
53
+ expectType<ClassPerson>(ann.child)
54
+
55
+ const FileInfo = ObjectModel({
56
+ name: String,
57
+ size: [Number],
58
+ creationDate: [Date],
59
+ writable: Boolean
60
+ }).defaultTo({
61
+ name: "Untitled file",
62
+ size: 0,
63
+ writable: true
64
+ });
65
+
66
+ expectType<{
67
+ name: string,
68
+ size: number,
69
+ writable: true
70
+ }>(new FileInfo())
71
+
72
+ expectType<{
73
+ name: string,
74
+ size: number,
75
+ writable: boolean,
76
+ creationDate: Date
77
+ }>(new FileInfo({
78
+ name: "My file",
79
+ size: 100,
80
+ writable: false,
81
+ creationDate: new Date()
82
+ }))
@@ -1,4 +1,4 @@
1
- import {expectType} from 'tsd';
1
+ import {expectError, expectType} from 'tsd';
2
2
  import { ObjectModel } from '../src/object-model';
3
3
  import { SetModel } from '../src/set-model';
4
4
 
@@ -14,4 +14,9 @@ expectType<Set<{ answer: number } | string | boolean>>(Quiz(new Set()));
14
14
 
15
15
  const SetModel1 = SetModel(String)
16
16
  const SetModel2 = SetModel1.extend(Date, Number)
17
- expectType<Set<string | Date | number>>(SetModel2([1,"2",new Date()]))
17
+ expectType<Set<string | Date | number>>(SetModel2([1,"2",new Date()]))
18
+
19
+ const S = SetModel(Number).defaultTo(new Set([1,2,3]))
20
+ expectType<Set<number>>(S())
21
+ expectError(SetModel(Number).defaultTo("not a set"))
22
+ expectError(S("not a number"))