@lumjs/core 1.0.0-beta.4 → 1.1.0
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 +7 -3
- package/TODO.md +6 -12
- package/docs/changelogs/1.0-beta.md +33 -3
- package/docs/changelogs/1.x.md +32 -0
- package/lib/arrays.js +19 -7
- package/lib/context.js +46 -9
- package/lib/enum.js +29 -15
- package/lib/flags.js +6 -0
- package/lib/index.js +77 -5
- package/lib/lazy.js +7 -5
- package/lib/meta.js +10 -0
- package/lib/modules.js +27 -3
- package/lib/obj/clone.js +11 -9
- package/lib/obj/copyall.js +3 -0
- package/lib/obj/copyprops.js +1 -0
- package/lib/obj/getproperty.js +38 -0
- package/lib/obj/index.js +6 -4
- package/lib/obj/lock.js +13 -9
- package/lib/obj/merge.js +2 -0
- package/lib/obj/ns.js +71 -18
- package/lib/objectid.js +2 -3
- package/lib/observable.js +23 -9
- package/lib/opt.js +6 -1
- package/lib/strings.js +43 -4
- package/lib/types/basics.js +69 -11
- package/lib/types/def.js +21 -18
- package/lib/types/index.js +21 -2
- package/lib/types/isa.js +5 -12
- package/lib/types/needs.js +6 -1
- package/lib/types/root.js +6 -8
- package/lib/types/stringify.js +142 -0
- package/lib/types/typelist.js +66 -2
- package/package.json +20 -3
- package/test/types.js +102 -13
package/package.json
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lumjs/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
|
+
"exports":
|
|
6
|
+
{
|
|
7
|
+
".": "./lib/index.js",
|
|
8
|
+
"./types": "./lib/types/index.js",
|
|
9
|
+
"./arrays": "./lib/arrays.js",
|
|
10
|
+
"./context": "./lib/context.js",
|
|
11
|
+
"./strings": "./lib/strings.js",
|
|
12
|
+
"./flags": "./lib/flags.js",
|
|
13
|
+
"./obj": "./lib/obj/index.js",
|
|
14
|
+
"./opt": "./lib/opt.js",
|
|
15
|
+
"./modules": "./lib/moduless.js",
|
|
16
|
+
"./meta": "./lib/meta.js",
|
|
17
|
+
"./enum": "./lib/enum.js",
|
|
18
|
+
"./observable": "./lib/observable.js",
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
5
21
|
"license": "MIT",
|
|
6
22
|
"repository":
|
|
7
23
|
{
|
|
@@ -10,11 +26,12 @@
|
|
|
10
26
|
},
|
|
11
27
|
"devDependencies":
|
|
12
28
|
{
|
|
13
|
-
"@lumjs/tests": "^1.
|
|
29
|
+
"@lumjs/tests": "^1.3.0"
|
|
14
30
|
},
|
|
15
31
|
"scripts":
|
|
16
32
|
{
|
|
17
33
|
"-TODO-1": "Use `lumtest` once its available",
|
|
18
|
-
"test": "prove -e node --ext js ./test"
|
|
34
|
+
"test": "prove -e node --ext js ./test",
|
|
35
|
+
"build-docs": "jsdoc -c ./jsdoc.json"
|
|
19
36
|
}
|
|
20
37
|
}
|
package/test/types.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
// Current test count.
|
|
2
|
-
const plan =
|
|
2
|
+
const plan = 120;
|
|
3
3
|
// A new test instance.
|
|
4
4
|
const t = require('@lumjs/tests').new({module, plan});
|
|
5
5
|
// The types core module
|
|
6
6
|
const types = require('../lib/types');
|
|
7
7
|
|
|
8
|
-
//
|
|
8
|
+
// A quick reference to the type names.
|
|
9
9
|
const TYP = types.TYPES;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function stringify (what)
|
|
13
|
-
{
|
|
14
|
-
if (typeof what === TYP.F) return what.toString();
|
|
15
|
-
if (typeof what === TYP.SY) return what.constructor.toString();
|
|
16
|
-
return JSON.stringify(what);
|
|
17
|
-
}
|
|
10
|
+
// And the stringify function.
|
|
11
|
+
const stringify = types.stringify;
|
|
18
12
|
|
|
19
13
|
// Now for some further basics.
|
|
20
14
|
t.ok(types.isObj({}), 'isObj({})');
|
|
@@ -55,10 +49,16 @@ class SubtypeClass extends TypeClass {}
|
|
|
55
49
|
const typesInstance = new TypeClass();
|
|
56
50
|
const subtypeInstance = new SubtypeClass();
|
|
57
51
|
|
|
52
|
+
class DifferentClass {}
|
|
53
|
+
|
|
54
|
+
const differentInstance = new DifferentClass();
|
|
55
|
+
|
|
58
56
|
t.ok(types.isInstance(typesInstance, TypeClass), 'isInstance(typeInstance,TypeClass)');
|
|
59
57
|
t.ok(types.isInstance(subtypeInstance, SubtypeClass), 'isInstance(subtypeInstance, SubtypeClass)');
|
|
60
58
|
t.ok(types.isInstance(subtypeInstance, TypeClass), 'isInstance(subtypeInstance, TypeClass)');
|
|
61
|
-
t.ok(!types.isInstance(typesInstance, SubtypeClass), '!isInstance(typeInstance, SubtypeClass');
|
|
59
|
+
t.ok(!types.isInstance(typesInstance, SubtypeClass), '!isInstance(typeInstance, SubtypeClass)');
|
|
60
|
+
t.ok(!types.isInstance(differentInstance, TypeClass), '!isInstance(differentInstance, TypeClass)');
|
|
61
|
+
t.ok(!types.isInstance(typesInstance, DifferentClass), '!isInstance(typesInstance, DifferentClass)');
|
|
62
62
|
|
|
63
63
|
function doesDesc (tests, not=false)
|
|
64
64
|
{
|
|
@@ -126,7 +126,7 @@ testIsType(
|
|
|
126
126
|
[TYP.SCALAR, true],
|
|
127
127
|
[TYP.SCALAR, 'hi'],
|
|
128
128
|
[TYP.PROP, 'woah'],
|
|
129
|
-
[TYP.PROP, Symbol('woah')
|
|
129
|
+
[TYP.PROP, Symbol('woah')],
|
|
130
130
|
]);
|
|
131
131
|
|
|
132
132
|
testIsType(
|
|
@@ -161,18 +161,107 @@ t.dies(function(){types.needObj(null); return true}, '!needObj(null)');
|
|
|
161
161
|
t.ok((function(){types.needType(TYP.S, 'hi'); return true})(), "needType('string','hi')");
|
|
162
162
|
t.dies(function(){types.needType(TYP.O, null); return true}, "!needType('object',null)");
|
|
163
163
|
|
|
164
|
+
{ // Tests of isa() method.
|
|
165
|
+
let wants = [TYP.S, TYP.N];
|
|
166
|
+
t.ok(types.isa('hi', ...wants), 'isa(val, ...types)');
|
|
167
|
+
t.isa('hello', wants, ' ^ using Test.isa()');
|
|
168
|
+
t.isa(42, wants, ' ^ with second type');
|
|
169
|
+
t.ok(!types.isa({}, ...wants), '!isa(val, ...types)');
|
|
170
|
+
t.nota({}, wants, ' ^ using Test.nota()');
|
|
171
|
+
|
|
172
|
+
wants = [SubtypeClass, DifferentClass];
|
|
173
|
+
t.isa(subtypeInstance, wants, 'isa(val, ...classes)');
|
|
174
|
+
t.isa(differentInstance, wants, ' ^ with second class');
|
|
175
|
+
t.nota(typesInstance, wants, 'nota(val, ...classes)');
|
|
176
|
+
|
|
177
|
+
wants = [TYP.B, TypeClass];
|
|
178
|
+
t.isa(true, wants, 'isa() → with mixed types/classes');
|
|
179
|
+
t.isa(subtypeInstance, wants, ' ^ with second type/class');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
{ // Tests of needs() method.
|
|
183
|
+
let needs = [TYP.S, TYP.N];
|
|
184
|
+
t.lives(() => types.needs('hi', ...needs), 'needs(val, ...types)');
|
|
185
|
+
t.lives(() => types.needs(42, ...needs), ' ^ with second type');
|
|
186
|
+
t.dies(() => types.needs({}, ...needs), ' ^ throws on failure');
|
|
187
|
+
|
|
188
|
+
needs = [SubtypeClass, DifferentClass];
|
|
189
|
+
t.lives(() => types.needs(subtypeInstance, ...needs), 'needs(val, ...classes)');
|
|
190
|
+
t.lives(() => types.needs(differentInstance, ...needs), ' ^ with second class');
|
|
191
|
+
t.dies(() => types.needs(typesInstance, ...needs), ' ^ throws on failure');
|
|
192
|
+
|
|
193
|
+
needs = [TYP.B, TypeClass];
|
|
194
|
+
t.lives(() => types.needs(true, ...needs), 'needs() → with mixed types/classes');
|
|
195
|
+
t.lives(() => types.needs(subtypeInstance, ...needs), ' ^ with second type/class');
|
|
196
|
+
}
|
|
197
|
+
|
|
164
198
|
{ // Try a few versions of 'def'
|
|
165
199
|
const obj = {};
|
|
166
200
|
types.def(obj, 'test1', 'Test 1');
|
|
167
201
|
t.is(obj.test1, 'Test 1', 'def(obj, name, value)');
|
|
168
202
|
types.def(obj)('test2', 'Test 2');
|
|
169
203
|
t.is(obj.test2, 'Test 2', 'def(obj)(name, value)');
|
|
204
|
+
obj.test2 = '2 Test';
|
|
205
|
+
t.is(obj.test2, 'Test 2', 'def() is read-only by default');
|
|
206
|
+
|
|
207
|
+
types.def(obj, true)('test3', 'Test 3');
|
|
208
|
+
t.is(Object.keys(obj).length, 1, 'def(obj, true)(...)');
|
|
209
|
+
|
|
210
|
+
types.def(obj, 'a1', function()
|
|
211
|
+
{ // Returning a different property.
|
|
212
|
+
return this.test2;
|
|
213
|
+
},
|
|
214
|
+
function(val)
|
|
215
|
+
{ // Assigning to a different property.
|
|
216
|
+
this.$$ = val;
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
const gs = 'def(obj, name, getter, setter)';
|
|
220
|
+
t.is(obj.a1, 'Test 2', gs+'~getter');
|
|
221
|
+
obj.a1 = 'A1->$$';
|
|
222
|
+
t.is(obj.$$, 'A1->$$', gs+'~setter');
|
|
223
|
+
|
|
224
|
+
types.def(obj, 'test4', 'Test 4', {writable: true});
|
|
225
|
+
t.is(obj.test4, 'Test 4', 'def(..., {writable}) → added property');
|
|
226
|
+
obj.test4 = '4 Test';
|
|
227
|
+
t.is(obj.test4, '4 Test', ' ^ and it was writable');
|
|
228
|
+
|
|
229
|
+
const td = types.def(obj);
|
|
230
|
+
td('getOnly', {get: function() { return 'GETTER'; }});
|
|
231
|
+
obj.getOnly = 'blah blah blah';
|
|
232
|
+
t.is(obj.getOnly, 'GETTER', 'def(..., {get: getter}) → getter worked');
|
|
233
|
+
td('setOnly', {set: function(val) { this.__ = val; }});
|
|
234
|
+
obj.setOnly = 'SETTER';
|
|
235
|
+
t.is(obj.__, 'SETTER', 'def(..., {set: setter}) → setter worked');
|
|
236
|
+
t.is(obj.setOnly, undefined, ' ^ get is undefined');
|
|
237
|
+
|
|
238
|
+
td('foobar', {value: 'FOO BAR'});
|
|
239
|
+
t.is(obj.foobar, 'FOO BAR', 'def(..., {value})');
|
|
240
|
+
|
|
241
|
+
let anObj = {value: 'BAR FOO'};
|
|
242
|
+
td('barfoo', anObj, false);
|
|
243
|
+
t.is(obj.barfoo, anObj, 'def(..., descriptor, false) → assigned object as value');
|
|
170
244
|
|
|
171
|
-
|
|
245
|
+
td('barfoo2', anObj);
|
|
246
|
+
t.is(anObj.configurable, true, 'def(..., descriptor) → descriptor is a reference');
|
|
247
|
+
|
|
248
|
+
anObj = {value: 'new test'};
|
|
249
|
+
td('barfoo3', anObj, true);
|
|
250
|
+
|
|
251
|
+
t.is(anObj.configurable, undefined, 'def(..., descriptor, true) → cloned descriptor');
|
|
252
|
+
t.is(obj.barfoo3, 'new test', ' ^ value was correct')
|
|
253
|
+
|
|
254
|
+
td(
|
|
255
|
+
{
|
|
256
|
+
hello: 'World',
|
|
257
|
+
goodbye: 'Universe',
|
|
258
|
+
});
|
|
172
259
|
|
|
260
|
+
t.ok((obj.hello === 'World' && obj.goodbye === 'Universe'), 'def(obj, {prop1: value1, prop2: value2})')
|
|
173
261
|
}
|
|
174
262
|
|
|
175
263
|
// TODO: isa() and needs()
|
|
264
|
+
// TODO: stringify()
|
|
176
265
|
|
|
177
266
|
// All done.
|
|
178
267
|
t.output();
|