@e280/stz 0.0.0-3 → 0.0.0-30
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 +170 -0
- package/package.json +14 -7
- package/s/clone/clone.test.ts +123 -123
- package/s/coalesce.ts +1 -0
- package/s/data/base-x.ts +170 -0
- package/s/data/base58.ts +15 -5
- package/s/data/base64.ts +15 -6
- package/s/data/base64url.ts +15 -6
- package/s/data/bytename/bytename.test.ts +49 -0
- package/s/data/{barname/barname.ts → bytename/bytename.ts} +38 -10
- package/s/data/bytename/index.ts +4 -0
- package/s/data/bytename/thumbprint.test.ts +53 -0
- package/s/data/bytename/thumbprint.ts +112 -0
- package/s/data/bytes.ts +12 -2
- package/s/data/data.test.ts +98 -0
- package/s/data/hex.ts +15 -5
- package/s/data/txt.ts +14 -4
- package/s/deadline.ts +1 -0
- package/s/debounce/debounce.test.ts +73 -73
- package/s/deep/deep.test.ts +8 -8
- package/s/deep/parts/equal.test.ts +123 -124
- package/s/{defer-promise.ts → defer.ts} +2 -2
- package/s/drill.ts +2 -4
- package/s/ev.ts +20 -0
- package/s/id-counter.ts +9 -0
- package/s/index.ts +16 -2
- package/s/is.ts +10 -4
- package/s/loopy.ts +12 -0
- package/s/map-g.ts +2 -2
- package/s/nap.ts +1 -0
- package/s/once.ts +14 -0
- package/s/pubsub.ts +24 -6
- package/s/queue/queue.test.ts +67 -0
- package/s/queue/queue.ts +21 -0
- package/s/repeat.ts +25 -0
- package/s/tests.test.ts +21 -0
- package/s/time.ts +22 -0
- package/x/clone/clone.test.d.ts +15 -1
- package/x/clone/clone.test.js +106 -124
- package/x/clone/clone.test.js.map +1 -1
- package/x/coalesce.d.ts +1 -0
- package/x/coalesce.js +1 -0
- package/x/coalesce.js.map +1 -1
- package/x/data/base-x.d.ts +47 -0
- package/x/data/base-x.js +147 -0
- package/x/data/base-x.js.map +1 -0
- package/x/data/base58.d.ts +5 -1
- package/x/data/base58.js +13 -5
- package/x/data/base58.js.map +1 -1
- package/x/data/base64.d.ts +7 -3
- package/x/data/base64.js +13 -5
- package/x/data/base64.js.map +1 -1
- package/x/data/base64url.d.ts +5 -1
- package/x/data/base64url.js +13 -5
- package/x/data/base64url.js.map +1 -1
- package/x/data/bytename/bytename.d.ts +19 -0
- package/x/data/{barname/barname.js → bytename/bytename.js} +27 -11
- package/x/data/bytename/bytename.js.map +1 -0
- package/x/data/bytename/bytename.test.d.ts +17 -0
- package/x/data/bytename/bytename.test.js +41 -0
- package/x/data/bytename/bytename.test.js.map +1 -0
- package/x/data/bytename/index.d.ts +2 -0
- package/x/data/bytename/index.js +3 -0
- package/x/data/bytename/index.js.map +1 -0
- package/x/data/bytename/thumbprint.d.ts +36 -0
- package/x/data/bytename/thumbprint.js +79 -0
- package/x/data/bytename/thumbprint.js.map +1 -0
- package/x/data/bytename/thumbprint.test.d.ts +24 -0
- package/x/data/bytename/thumbprint.test.js +45 -0
- package/x/data/bytename/thumbprint.test.js.map +1 -0
- package/x/data/bytename/utils/prefixes.js.map +1 -0
- package/x/data/bytename/utils/suffixes.js.map +1 -0
- package/x/data/bytes.d.ts +3 -2
- package/x/data/bytes.js +11 -2
- package/x/data/bytes.js.map +1 -1
- package/x/data/data.test.d.ts +69 -0
- package/x/data/data.test.js +77 -0
- package/x/data/data.test.js.map +1 -0
- package/x/data/hex.d.ts +8 -4
- package/x/data/hex.js +13 -5
- package/x/data/hex.js.map +1 -1
- package/x/data/txt.d.ts +6 -2
- package/x/data/txt.js +12 -4
- package/x/data/txt.js.map +1 -1
- package/x/debounce/debounce.test.d.ts +8 -1
- package/x/debounce/debounce.test.js +70 -74
- package/x/debounce/debounce.test.js.map +1 -1
- package/x/deep/deep.test.d.ts +21 -1
- package/x/deep/deep.test.js +5 -9
- package/x/deep/deep.test.js.map +1 -1
- package/x/deep/parts/equal.test.d.ts +19 -1
- package/x/deep/parts/equal.test.js +107 -125
- package/x/deep/parts/equal.test.js.map +1 -1
- package/x/{defer-promise.d.ts → defer.d.ts} +2 -2
- package/x/{defer-promise.js → defer.js} +2 -2
- package/x/defer.js.map +1 -0
- package/x/drill.d.ts +1 -3
- package/x/drill.js +2 -4
- package/x/drill.js.map +1 -1
- package/x/ev.d.ts +6 -0
- package/x/ev.js +10 -0
- package/x/ev.js.map +1 -0
- package/x/id-counter.d.ts +5 -0
- package/x/id-counter.js +10 -0
- package/x/id-counter.js.map +1 -0
- package/x/index.d.ts +13 -2
- package/x/index.js +13 -2
- package/x/index.js.map +1 -1
- package/x/is.d.ts +6 -4
- package/x/is.js +6 -4
- package/x/is.js.map +1 -1
- package/x/loopy.d.ts +2 -0
- package/x/loopy.js +10 -0
- package/x/loopy.js.map +1 -0
- package/x/map-g.d.ts +3 -3
- package/x/map-g.js +1 -1
- package/x/map-g.js.map +1 -1
- package/x/nap.d.ts +1 -0
- package/x/nap.js +1 -0
- package/x/nap.js.map +1 -1
- package/x/once.d.ts +1 -0
- package/x/once.js +12 -0
- package/x/once.js.map +1 -0
- package/x/pubsub.d.ts +12 -1
- package/x/pubsub.js +7 -5
- package/x/pubsub.js.map +1 -1
- package/x/queue/queue.d.ts +4 -0
- package/x/queue/queue.js +14 -0
- package/x/queue/queue.js.map +1 -0
- package/x/queue/queue.test.d.ts +8 -0
- package/x/queue/queue.test.js +57 -0
- package/x/queue/queue.test.js.map +1 -0
- package/x/repeat.d.ts +5 -0
- package/x/repeat.js +23 -0
- package/x/repeat.js.map +1 -0
- package/x/tests.test.js +18 -0
- package/x/tests.test.js.map +1 -0
- package/x/time.d.ts +18 -0
- package/x/time.js +19 -0
- package/x/time.js.map +1 -0
- package/readme.md +0 -85
- package/s/data/anka.ts +0 -66
- package/s/data/barname/badge.ts +0 -78
- package/s/data/barname/demo.ts +0 -49
- package/s/data/barname/index.ts +0 -4
- package/x/data/anka.d.ts +0 -5
- package/x/data/anka.js +0 -53
- package/x/data/anka.js.map +0 -1
- package/x/data/barname/badge.d.ts +0 -25
- package/x/data/barname/badge.js +0 -64
- package/x/data/barname/badge.js.map +0 -1
- package/x/data/barname/barname.d.ts +0 -7
- package/x/data/barname/barname.js.map +0 -1
- package/x/data/barname/demo.js +0 -45
- package/x/data/barname/demo.js.map +0 -1
- package/x/data/barname/index.d.ts +0 -2
- package/x/data/barname/index.js +0 -3
- package/x/data/barname/index.js.map +0 -1
- package/x/data/barname/utils/prefixes.js.map +0 -1
- package/x/data/barname/utils/suffixes.js.map +0 -1
- package/x/defer-promise.js.map +0 -1
- /package/{license → LICENSE} +0 -0
- /package/s/data/{barname → bytename}/utils/prefixes.ts +0 -0
- /package/s/data/{barname → bytename}/utils/suffixes.ts +0 -0
- /package/x/data/{barname → bytename}/utils/prefixes.d.ts +0 -0
- /package/x/data/{barname → bytename}/utils/prefixes.js +0 -0
- /package/x/data/{barname → bytename}/utils/suffixes.d.ts +0 -0
- /package/x/data/{barname → bytename}/utils/suffixes.js +0 -0
- /package/x/{data/barname/demo.d.ts → tests.test.d.ts} +0 -0
package/s/pubsub.ts
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
2
|
+
import {defer} from "./defer.js"
|
|
3
3
|
|
|
4
4
|
export type Listener<A extends any[]> = (...a: A) => (void | Promise<void>)
|
|
5
5
|
|
|
6
6
|
export interface Xub<A extends any[] = []> {
|
|
7
|
+
|
|
8
|
+
/** publish to all subscribed listeners. */
|
|
7
9
|
pub(...a: A): Promise<void>
|
|
10
|
+
|
|
11
|
+
/** subscribe a listener function. */
|
|
8
12
|
sub(fn: Listener<A>): () => void
|
|
9
|
-
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* subscribe a listener function.
|
|
16
|
+
* @alias sub
|
|
17
|
+
*/
|
|
18
|
+
on(fn: Listener<A>): () => void
|
|
19
|
+
|
|
20
|
+
/** wait for the next published value */
|
|
21
|
+
next(): Promise<A>
|
|
22
|
+
|
|
23
|
+
/** wipe all listeners attached to this. */
|
|
10
24
|
clear(): void
|
|
11
25
|
}
|
|
12
26
|
|
|
27
|
+
/** subscriber fn that can be published to. */
|
|
13
28
|
export interface Sub<A extends any[] = []> extends Xub<A> {
|
|
14
29
|
(fn: Listener<A>): () => void
|
|
15
30
|
}
|
|
16
31
|
|
|
32
|
+
/** publisher fn that can be published to. */
|
|
17
33
|
export interface Pub<A extends any[] = []> extends Xub<A> {
|
|
18
34
|
(...a: A): Promise<void>
|
|
19
35
|
}
|
|
@@ -30,8 +46,8 @@ export function xub<A extends any[] = []>() {
|
|
|
30
46
|
await Promise.all([...set].map(fn => fn(...a)))
|
|
31
47
|
}
|
|
32
48
|
|
|
33
|
-
async function
|
|
34
|
-
const {promise, resolve} =
|
|
49
|
+
async function next() {
|
|
50
|
+
const {promise, resolve} = defer<A>()
|
|
35
51
|
const unsubscribe = sub((...a) => {
|
|
36
52
|
resolve(a)
|
|
37
53
|
unsubscribe()
|
|
@@ -45,12 +61,14 @@ export function xub<A extends any[] = []>() {
|
|
|
45
61
|
|
|
46
62
|
sub.pub = pub
|
|
47
63
|
sub.sub = sub
|
|
48
|
-
sub.
|
|
64
|
+
sub.on = sub
|
|
65
|
+
sub.next = next
|
|
49
66
|
sub.clear = clear
|
|
50
67
|
|
|
51
68
|
pub.pub = pub
|
|
52
69
|
pub.sub = sub
|
|
53
|
-
pub.
|
|
70
|
+
pub.on = sub
|
|
71
|
+
pub.next = next
|
|
54
72
|
pub.clear = clear
|
|
55
73
|
|
|
56
74
|
return [pub, sub] as [Pub<A>, Sub<A>]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
|
|
2
|
+
import {Science, expect} from "@e280/science"
|
|
3
|
+
|
|
4
|
+
import {nap} from "../nap.js"
|
|
5
|
+
import {queue} from "./queue.js"
|
|
6
|
+
|
|
7
|
+
export default Science.suite({
|
|
8
|
+
"job runs": Science.test(async() => {
|
|
9
|
+
let concurrent = 0
|
|
10
|
+
const job = queue(async() => {
|
|
11
|
+
concurrent++
|
|
12
|
+
await nap(100)
|
|
13
|
+
concurrent--
|
|
14
|
+
})
|
|
15
|
+
const promise1 = job()
|
|
16
|
+
await nap(50)
|
|
17
|
+
expect(concurrent).is(1)
|
|
18
|
+
await promise1
|
|
19
|
+
expect(concurrent).is(0)
|
|
20
|
+
}),
|
|
21
|
+
|
|
22
|
+
"sequencing is enforced": Science.test(async() => {
|
|
23
|
+
let concurrent = 0
|
|
24
|
+
const job = queue(async() => {
|
|
25
|
+
concurrent++
|
|
26
|
+
await nap(100)
|
|
27
|
+
concurrent--
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const promise1 = job()
|
|
31
|
+
const promise2 = job()
|
|
32
|
+
|
|
33
|
+
await nap(50)
|
|
34
|
+
expect(concurrent).is(1)
|
|
35
|
+
|
|
36
|
+
await promise1
|
|
37
|
+
await nap(50)
|
|
38
|
+
expect(concurrent).is(1)
|
|
39
|
+
|
|
40
|
+
await promise2
|
|
41
|
+
expect(concurrent).is(0)
|
|
42
|
+
}),
|
|
43
|
+
|
|
44
|
+
"params and return values seem to work": Science.test(async() => {
|
|
45
|
+
const add = queue(async(a: number, b: number) => {
|
|
46
|
+
await nap(100)
|
|
47
|
+
return a + b
|
|
48
|
+
})
|
|
49
|
+
const promise1 = add(1, 2)
|
|
50
|
+
const promise2 = add(10, 20)
|
|
51
|
+
expect(await promise1).is(3)
|
|
52
|
+
expect(await promise2).is(30)
|
|
53
|
+
}),
|
|
54
|
+
|
|
55
|
+
"first job throws, second job unaffected": Science.test(async() => {
|
|
56
|
+
let run = 0
|
|
57
|
+
const job = queue(async() => {
|
|
58
|
+
run++
|
|
59
|
+
await nap(100)
|
|
60
|
+
if (run === 1)
|
|
61
|
+
throw new Error("first job failed")
|
|
62
|
+
})
|
|
63
|
+
expect(async() => job()).throwsAsync()
|
|
64
|
+
expect(async() => job()).not.throwsAsync()
|
|
65
|
+
}),
|
|
66
|
+
})
|
|
67
|
+
|
package/s/queue/queue.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* create a job queue that ensures the given fn is always called in sequence (not concurrently).
|
|
4
|
+
*/
|
|
5
|
+
export function queue<Args extends any[], Result>(
|
|
6
|
+
fn: (...args: Args) => Promise<Result>
|
|
7
|
+
): (...args: Args) => Promise<Result> {
|
|
8
|
+
|
|
9
|
+
let last: Promise<any> = Promise.resolve()
|
|
10
|
+
|
|
11
|
+
return (...args: Args): Promise<Result> => {
|
|
12
|
+
const job = () => fn(...args)
|
|
13
|
+
const current = last.then(job)
|
|
14
|
+
|
|
15
|
+
// prevent unhandled rejection breaking the chain
|
|
16
|
+
last = current.catch(() => {})
|
|
17
|
+
|
|
18
|
+
return current
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
package/s/repeat.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* repeat the given async function over and over.
|
|
4
|
+
* - consider using `nap` in your fn to create a delay
|
|
5
|
+
*/
|
|
6
|
+
export function repeat(fn: (stop: () => void) => Promise<void>) {
|
|
7
|
+
let timeout: any
|
|
8
|
+
let stopped = false
|
|
9
|
+
|
|
10
|
+
const stop = () => {
|
|
11
|
+
stopped = true
|
|
12
|
+
clearTimeout(timeout)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const tick = async() => {
|
|
16
|
+
if (stopped) return
|
|
17
|
+
await fn(stop)
|
|
18
|
+
if (stopped) return
|
|
19
|
+
timeout = setTimeout(tick, 0)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
tick()
|
|
23
|
+
return stop
|
|
24
|
+
}
|
|
25
|
+
|
package/s/tests.test.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
import {Science} from "@e280/science"
|
|
3
|
+
|
|
4
|
+
import clone from "./clone/clone.test.js"
|
|
5
|
+
import thumbprint from "./data/bytename/thumbprint.test.js"
|
|
6
|
+
import debounce from "./debounce/debounce.test.js"
|
|
7
|
+
import bytename from "./data/bytename/bytename.test.js"
|
|
8
|
+
import deep from "./deep/deep.test.js"
|
|
9
|
+
import data from "./data/data.test.js"
|
|
10
|
+
import queue from "./queue/queue.test.js"
|
|
11
|
+
|
|
12
|
+
await Science.run({
|
|
13
|
+
clone,
|
|
14
|
+
bytename,
|
|
15
|
+
thumbprint,
|
|
16
|
+
debounce,
|
|
17
|
+
deep,
|
|
18
|
+
data,
|
|
19
|
+
queue,
|
|
20
|
+
})
|
|
21
|
+
|
package/s/time.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
export const Time = {
|
|
3
|
+
seconds: (n: number) => (n * 1000),
|
|
4
|
+
minutes: (n: number) => (n * Time.seconds(60)),
|
|
5
|
+
hours: (n: number) => (n * Time.minutes(60)),
|
|
6
|
+
days: (n: number) => (n * Time.hours(24)),
|
|
7
|
+
|
|
8
|
+
future: {
|
|
9
|
+
seconds: (n: number) => (Date.now() + Time.seconds(n)),
|
|
10
|
+
minutes: (n: number) => (Date.now() + Time.minutes(n)),
|
|
11
|
+
hours: (n: number) => (Date.now() + Time.hours(n)),
|
|
12
|
+
days: (n: number) => (Date.now() + Time.days(n)),
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
past: {
|
|
16
|
+
seconds: (n: number) => (Date.now() - Time.seconds(n)),
|
|
17
|
+
minutes: (n: number) => (Date.now() - Time.minutes(n)),
|
|
18
|
+
hours: (n: number) => (Date.now() - Time.hours(n)),
|
|
19
|
+
days: (n: number) => (Date.now() - Time.days(n)),
|
|
20
|
+
},
|
|
21
|
+
}
|
|
22
|
+
|
package/x/clone/clone.test.d.ts
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: {
|
|
2
|
+
"clone primitive types"(): Promise<void>;
|
|
3
|
+
"clone arrays"(): Promise<void>;
|
|
4
|
+
"clone plain objects"(): Promise<void>;
|
|
5
|
+
"clone Map"(): Promise<void>;
|
|
6
|
+
"clone Set"(): Promise<void>;
|
|
7
|
+
"clone Date"(): Promise<void>;
|
|
8
|
+
"clone objects with circular reference"(): Promise<void>;
|
|
9
|
+
"clone nested objects"(): Promise<void>;
|
|
10
|
+
"clone array of objects"(): Promise<void>;
|
|
11
|
+
"clone object with array"(): Promise<void>;
|
|
12
|
+
"clone object with Map"(): Promise<void>;
|
|
13
|
+
"clone object with duplicate sibling references"(): Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
package/x/clone/clone.test.js
CHANGED
|
@@ -1,125 +1,107 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// let clonedData: typeof data = {} as typeof data
|
|
108
|
-
//
|
|
109
|
-
// try {
|
|
110
|
-
// clonedData = clone(data)
|
|
111
|
-
// }
|
|
112
|
-
// catch (error) {
|
|
113
|
-
// didThrow = true
|
|
114
|
-
// }
|
|
115
|
-
//
|
|
116
|
-
// expect(didThrow).not.equals(true)
|
|
117
|
-
// expect(clonedData.obj1).not.equals(clonedData.obj2)
|
|
118
|
-
// expect(clonedData.obj1.id).equals(1)
|
|
119
|
-
// expect(clonedData.obj1.name).equals("H4CK3RM4N")
|
|
120
|
-
// expect(clonedData.obj2.id).equals(1)
|
|
121
|
-
// expect(clonedData.obj2.name).equals("H4CK3RM4N")
|
|
122
|
-
// },
|
|
123
|
-
// }
|
|
124
|
-
export {};
|
|
1
|
+
import { clone } from "./clone.js";
|
|
2
|
+
import { Science, expect } from "@e280/science";
|
|
3
|
+
function checkMapOrSetEquality(original, cloned) {
|
|
4
|
+
const originalEntries = JSON.stringify(Array.from(original));
|
|
5
|
+
const clonedEntries = JSON.stringify(Array.from(cloned));
|
|
6
|
+
expect(clonedEntries).is(originalEntries);
|
|
7
|
+
expect(cloned).not.is(original); // check for deep cloning
|
|
8
|
+
}
|
|
9
|
+
export default Science.suite({
|
|
10
|
+
async "clone primitive types"() {
|
|
11
|
+
expect(clone(123)).is(123);
|
|
12
|
+
expect(clone("abc")).is("abc");
|
|
13
|
+
expect(clone(true)).is(true);
|
|
14
|
+
},
|
|
15
|
+
async "clone arrays"() {
|
|
16
|
+
const array = [1, 2, 3];
|
|
17
|
+
const clonedArray = clone(array);
|
|
18
|
+
expect(JSON.stringify(clonedArray)).is(JSON.stringify(array));
|
|
19
|
+
expect(clonedArray).not.is(array); // check for deep cloning
|
|
20
|
+
},
|
|
21
|
+
async "clone plain objects"() {
|
|
22
|
+
const object = { foo: "bar", baz: 123 };
|
|
23
|
+
const clonedObject = clone(object);
|
|
24
|
+
expect(JSON.stringify(clonedObject)).is(JSON.stringify(object));
|
|
25
|
+
expect(clonedObject).not.is(object); // check for deep cloning
|
|
26
|
+
},
|
|
27
|
+
async "clone Map"() {
|
|
28
|
+
const map = new Map();
|
|
29
|
+
map.set("key", "value");
|
|
30
|
+
const clonedMap = clone(map);
|
|
31
|
+
expect(map.get("key")).is("value");
|
|
32
|
+
expect(clonedMap).not.is(map);
|
|
33
|
+
},
|
|
34
|
+
async "clone Set"() {
|
|
35
|
+
const set = new Set();
|
|
36
|
+
set.add("value");
|
|
37
|
+
const clonedSet = clone(set);
|
|
38
|
+
expect(clonedSet.has("value")).ok();
|
|
39
|
+
expect(clonedSet).not.is(set);
|
|
40
|
+
},
|
|
41
|
+
async "clone Date"() {
|
|
42
|
+
const date = new Date();
|
|
43
|
+
const clonedDate = clone(date);
|
|
44
|
+
expect(clonedDate.getTime()).is(date.getTime());
|
|
45
|
+
expect(clonedDate).not.is(date); // check for deep cloning
|
|
46
|
+
},
|
|
47
|
+
async "clone objects with circular reference"() {
|
|
48
|
+
const object = { foo: "bar" };
|
|
49
|
+
object.self = object; // create circular reference
|
|
50
|
+
let error;
|
|
51
|
+
try {
|
|
52
|
+
clone(object);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
error = e;
|
|
56
|
+
}
|
|
57
|
+
expect(error).not.is(undefined);
|
|
58
|
+
expect(error instanceof Error).ok();
|
|
59
|
+
},
|
|
60
|
+
async "clone nested objects"() {
|
|
61
|
+
const object = { foo: "bar", inner: { baz: 123, deeper: { qux: true } } };
|
|
62
|
+
const clonedObject = clone(object);
|
|
63
|
+
expect(JSON.stringify(clonedObject)).is(JSON.stringify(object));
|
|
64
|
+
expect(clonedObject).not.is(object); // check for deep cloning
|
|
65
|
+
expect(clonedObject.inner).not.is(object.inner); // check for deep cloning
|
|
66
|
+
expect(clonedObject.inner.deeper).not.is(object.inner.deeper); // check for deep cloning
|
|
67
|
+
},
|
|
68
|
+
async "clone array of objects"() {
|
|
69
|
+
const array = [{ foo: "bar" }, { baz: 123 }, { qux: true }];
|
|
70
|
+
const clonedArray = clone(array);
|
|
71
|
+
expect(JSON.stringify(clonedArray)).is(JSON.stringify(array));
|
|
72
|
+
expect(clonedArray).not.is(array); // check for deep cloning
|
|
73
|
+
},
|
|
74
|
+
async "clone object with array"() {
|
|
75
|
+
const object = { foo: "bar", array: [1, 2, 3] };
|
|
76
|
+
const clonedObject = clone(object);
|
|
77
|
+
expect(JSON.stringify(clonedObject)).is(JSON.stringify(object));
|
|
78
|
+
expect(clonedObject).not.is(object); // check for deep cloning
|
|
79
|
+
},
|
|
80
|
+
async "clone object with Map"() {
|
|
81
|
+
const map = new Map();
|
|
82
|
+
map.set("key", "value");
|
|
83
|
+
const object = { foo: "bar", map };
|
|
84
|
+
const clonedObject = clone(object);
|
|
85
|
+
expect(JSON.stringify(clonedObject.foo)).is(JSON.stringify(object.foo));
|
|
86
|
+
checkMapOrSetEquality(object.map, clonedObject.map);
|
|
87
|
+
},
|
|
88
|
+
async "clone object with duplicate sibling references"() {
|
|
89
|
+
const dupeObject = { id: 1, name: "H4CK3RM4N" };
|
|
90
|
+
const data = { obj1: dupeObject, obj2: dupeObject };
|
|
91
|
+
let didThrow = false;
|
|
92
|
+
let clonedData = {};
|
|
93
|
+
try {
|
|
94
|
+
clonedData = clone(data);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
didThrow = true;
|
|
98
|
+
}
|
|
99
|
+
expect(didThrow).not.is(true);
|
|
100
|
+
expect(clonedData.obj1).not.is(clonedData.obj2);
|
|
101
|
+
expect(clonedData.obj1.id).is(1);
|
|
102
|
+
expect(clonedData.obj1.name).is("H4CK3RM4N");
|
|
103
|
+
expect(clonedData.obj2.id).is(1);
|
|
104
|
+
expect(clonedData.obj2.name).is("H4CK3RM4N");
|
|
105
|
+
},
|
|
106
|
+
});
|
|
125
107
|
//# sourceMappingURL=clone.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../s/clone/clone.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../s/clone/clone.test.ts"],"names":[],"mappings":"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"}
|
package/x/coalesce.d.ts
CHANGED
package/x/coalesce.js
CHANGED
package/x/coalesce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coalesce.js","sourceRoot":"","sources":["../s/coalesce.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,QAAQ,CAAuB,GAAG,GAA0B;IAC3E,OAAO,CAAC,GAAG,CAAI,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC"}
|
|
1
|
+
{"version":3,"file":"coalesce.js","sourceRoot":"","sources":["../s/coalesce.ts"],"names":[],"mappings":"AACA,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAuB,GAAG,GAA0B;IAC3E,OAAO,CAAC,GAAG,CAAI,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type Lexicon = {
|
|
2
|
+
characters: string;
|
|
3
|
+
negativePrefix?: string;
|
|
4
|
+
padding?: {
|
|
5
|
+
character: string;
|
|
6
|
+
size: number;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export declare class BaseX {
|
|
10
|
+
lexicon: Lexicon;
|
|
11
|
+
static lexicons: Readonly<{
|
|
12
|
+
base2: {
|
|
13
|
+
characters: string;
|
|
14
|
+
};
|
|
15
|
+
hex: {
|
|
16
|
+
characters: string;
|
|
17
|
+
};
|
|
18
|
+
base36: {
|
|
19
|
+
characters: string;
|
|
20
|
+
};
|
|
21
|
+
base58: {
|
|
22
|
+
characters: string;
|
|
23
|
+
};
|
|
24
|
+
base62: {
|
|
25
|
+
characters: string;
|
|
26
|
+
};
|
|
27
|
+
base64url: {
|
|
28
|
+
negativePrefix: string;
|
|
29
|
+
characters: string;
|
|
30
|
+
};
|
|
31
|
+
base64: {
|
|
32
|
+
characters: string;
|
|
33
|
+
padding: {
|
|
34
|
+
character: string;
|
|
35
|
+
size: number;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
private lookup;
|
|
40
|
+
private negativePrefix;
|
|
41
|
+
constructor(lexicon: Lexicon);
|
|
42
|
+
toBytes(s: string): Uint8Array;
|
|
43
|
+
fromBytes(bytes: Uint8Array): string;
|
|
44
|
+
toInteger(s: string): number;
|
|
45
|
+
fromInteger(n: number): string;
|
|
46
|
+
random(count?: number): string;
|
|
47
|
+
}
|