@e280/stz 0.0.0-2 → 0.0.0-20

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.
Files changed (115) hide show
  1. package/{readme.md → README.md} +42 -6
  2. package/package.json +8 -5
  3. package/s/clone/clone.test.ts +123 -123
  4. package/s/coalesce.ts +6 -0
  5. package/s/data/bytename/bytename.test.ts +49 -0
  6. package/s/data/{barname/barname.ts → bytename/bytename.ts} +38 -10
  7. package/s/data/bytename/index.ts +4 -0
  8. package/s/data/bytename/thumbprint.test.ts +53 -0
  9. package/s/data/bytename/thumbprint.ts +112 -0
  10. package/s/data/bytes.ts +10 -0
  11. package/s/deadline.ts +7 -4
  12. package/s/debounce/debounce.test.ts +73 -73
  13. package/s/deep/deep.test.ts +8 -8
  14. package/s/deep/parts/equal.test.ts +123 -124
  15. package/s/{defer-promise.ts → defer.ts} +2 -2
  16. package/s/drill.ts +20 -0
  17. package/s/id-counter.ts +9 -0
  18. package/s/index.ts +11 -2
  19. package/s/is.ts +10 -4
  20. package/s/loopy.ts +12 -0
  21. package/s/map-g.ts +2 -2
  22. package/s/nap.ts +1 -0
  23. package/s/pubsub.ts +20 -2
  24. package/s/tests.test.ts +17 -0
  25. package/x/clone/clone.test.d.ts +15 -1
  26. package/x/clone/clone.test.js +106 -124
  27. package/x/clone/clone.test.js.map +1 -1
  28. package/x/coalesce.d.ts +2 -0
  29. package/x/coalesce.js +5 -0
  30. package/x/coalesce.js.map +1 -0
  31. package/x/data/bytename/bytename.d.ts +19 -0
  32. package/x/data/{barname/barname.js → bytename/bytename.js} +27 -11
  33. package/x/data/bytename/bytename.js.map +1 -0
  34. package/x/data/bytename/bytename.test.d.ts +17 -0
  35. package/x/data/bytename/bytename.test.js +41 -0
  36. package/x/data/bytename/bytename.test.js.map +1 -0
  37. package/x/data/bytename/index.d.ts +2 -0
  38. package/x/data/bytename/index.js +3 -0
  39. package/x/data/bytename/index.js.map +1 -0
  40. package/x/data/bytename/thumbprint.d.ts +36 -0
  41. package/x/data/bytename/thumbprint.js +79 -0
  42. package/x/data/bytename/thumbprint.js.map +1 -0
  43. package/x/data/bytename/thumbprint.test.d.ts +24 -0
  44. package/x/data/bytename/thumbprint.test.js +45 -0
  45. package/x/data/bytename/thumbprint.test.js.map +1 -0
  46. package/x/data/bytename/utils/prefixes.js.map +1 -0
  47. package/x/data/bytename/utils/suffixes.js.map +1 -0
  48. package/x/data/bytes.d.ts +1 -0
  49. package/x/data/bytes.js +9 -0
  50. package/x/data/bytes.js.map +1 -1
  51. package/x/deadline.d.ts +3 -2
  52. package/x/deadline.js +8 -4
  53. package/x/deadline.js.map +1 -1
  54. package/x/debounce/debounce.test.d.ts +8 -1
  55. package/x/debounce/debounce.test.js +70 -74
  56. package/x/debounce/debounce.test.js.map +1 -1
  57. package/x/deep/deep.test.d.ts +21 -1
  58. package/x/deep/deep.test.js +5 -9
  59. package/x/deep/deep.test.js.map +1 -1
  60. package/x/deep/parts/equal.test.d.ts +19 -1
  61. package/x/deep/parts/equal.test.js +107 -125
  62. package/x/deep/parts/equal.test.js.map +1 -1
  63. package/x/{defer-promise.d.ts → defer.d.ts} +2 -2
  64. package/x/{defer-promise.js → defer.js} +2 -2
  65. package/x/defer.js.map +1 -0
  66. package/x/drill.d.ts +4 -0
  67. package/x/drill.js +12 -0
  68. package/x/drill.js.map +1 -0
  69. package/x/id-counter.d.ts +5 -0
  70. package/x/id-counter.js +10 -0
  71. package/x/id-counter.js.map +1 -0
  72. package/x/index.d.ts +9 -2
  73. package/x/index.js +9 -2
  74. package/x/index.js.map +1 -1
  75. package/x/is.d.ts +6 -4
  76. package/x/is.js +6 -4
  77. package/x/is.js.map +1 -1
  78. package/x/loopy.d.ts +2 -0
  79. package/x/loopy.js +10 -0
  80. package/x/loopy.js.map +1 -0
  81. package/x/map-g.d.ts +3 -3
  82. package/x/map-g.js +1 -1
  83. package/x/map-g.js.map +1 -1
  84. package/x/nap.d.ts +1 -0
  85. package/x/nap.js +1 -0
  86. package/x/nap.js.map +1 -1
  87. package/x/pubsub.d.ts +11 -0
  88. package/x/pubsub.js +4 -2
  89. package/x/pubsub.js.map +1 -1
  90. package/x/tests.test.js +14 -0
  91. package/x/tests.test.js.map +1 -0
  92. package/s/data/barname/badge.ts +0 -78
  93. package/s/data/barname/demo.ts +0 -49
  94. package/s/data/barname/index.ts +0 -4
  95. package/x/data/barname/badge.d.ts +0 -25
  96. package/x/data/barname/badge.js +0 -64
  97. package/x/data/barname/badge.js.map +0 -1
  98. package/x/data/barname/barname.d.ts +0 -7
  99. package/x/data/barname/barname.js.map +0 -1
  100. package/x/data/barname/demo.js +0 -45
  101. package/x/data/barname/demo.js.map +0 -1
  102. package/x/data/barname/index.d.ts +0 -2
  103. package/x/data/barname/index.js +0 -3
  104. package/x/data/barname/index.js.map +0 -1
  105. package/x/data/barname/utils/prefixes.js.map +0 -1
  106. package/x/data/barname/utils/suffixes.js.map +0 -1
  107. package/x/defer-promise.js.map +0 -1
  108. /package/{license → LICENSE} +0 -0
  109. /package/s/data/{barname → bytename}/utils/prefixes.ts +0 -0
  110. /package/s/data/{barname → bytename}/utils/suffixes.ts +0 -0
  111. /package/x/data/{barname → bytename}/utils/prefixes.d.ts +0 -0
  112. /package/x/data/{barname → bytename}/utils/prefixes.js +0 -0
  113. /package/x/data/{barname → bytename}/utils/suffixes.d.ts +0 -0
  114. /package/x/data/{barname → bytename}/utils/suffixes.js +0 -0
  115. /package/x/{data/barname/demo.d.ts → tests.test.d.ts} +0 -0
@@ -0,0 +1,17 @@
1
+
2
+ import {Science} from "@e280/science"
3
+
4
+ import cloneTest from "./clone/clone.test.js"
5
+ import thumbprintTest from "./data/bytename/thumbprint.test.js"
6
+ import debounceTest from "./debounce/debounce.test.js"
7
+ import bytenameTest from "./data/bytename/bytename.test.js"
8
+ import deepTest from "./deep/deep.test.js"
9
+
10
+ await Science.run({
11
+ clone: cloneTest,
12
+ bytename: bytenameTest,
13
+ thumbprint: thumbprintTest,
14
+ debounce: debounceTest,
15
+ deep: deepTest,
16
+ })
17
+
@@ -1 +1,15 @@
1
- export {};
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;
@@ -1,125 +1,107 @@
1
- //
2
- // import {Suite, expect} from "cynic"
3
- // import {clone} from "./clone.js"
4
- //
5
- // function checkMapOrSetEquality(original: any, cloned: any) {
6
- // const originalEntries = JSON.stringify(Array.from(original))
7
- // const clonedEntries = JSON.stringify(Array.from(cloned))
8
- // expect(clonedEntries).equals(originalEntries)
9
- // expect(cloned).not.equals(original) // check for deep cloning
10
- // }
11
- //
12
- // export default <Suite>{
13
- //
14
- // async "clone primitive types"() {
15
- // expect(clone(123)).equals(123)
16
- // expect(clone("abc")).equals("abc")
17
- // expect(clone(true)).equals(true)
18
- // },
19
- //
20
- // async "clone arrays"() {
21
- // const array = [1, 2, 3]
22
- // const clonedArray = clone(array)
23
- // expect(JSON.stringify(clonedArray)).equals(JSON.stringify(array))
24
- // expect(clonedArray).not.equals(array) // check for deep cloning
25
- // },
26
- //
27
- // async "clone plain objects"() {
28
- // const object = {foo: "bar", baz: 123}
29
- // const clonedObject = clone(object)
30
- // expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object))
31
- // expect(clonedObject).not.equals(object) // check for deep cloning
32
- // },
33
- //
34
- // async "clone Map"() {
35
- // const map = new Map()
36
- // map.set("key", "value")
37
- // const clonedMap = clone(map)
38
- // expect(map.get("key")).equals("value")
39
- // expect(clonedMap).not.equals(map)
40
- // },
41
- //
42
- // async "clone Set"() {
43
- // const set = new Set()
44
- // set.add("value")
45
- // const clonedSet = clone(set)
46
- // expect(clonedSet.has("value")).ok()
47
- // expect(clonedSet).not.equals(set)
48
- // },
49
- //
50
- // async "clone Date"() {
51
- // const date = new Date()
52
- // const clonedDate = clone(date)
53
- // expect(clonedDate.getTime()).equals(date.getTime())
54
- // expect(clonedDate).not.equals(date) // check for deep cloning
55
- // },
56
- //
57
- // async "clone objects with circular reference"() {
58
- // const object: any = {foo: "bar"}
59
- // object.self = object // create circular reference
60
- // let error: any
61
- // try {
62
- // clone(object)
63
- // } catch (e) {
64
- // error = e
65
- // }
66
- // expect(error).not.equals(undefined)
67
- // expect(error instanceof Error).ok()
68
- // },
69
- //
70
- // async "clone nested objects"() {
71
- // const object = {foo: "bar", inner: {baz: 123, deeper: {qux: true}}}
72
- // const clonedObject = clone(object)
73
- // expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object))
74
- // expect(clonedObject).not.equals(object) // check for deep cloning
75
- // expect(clonedObject.inner).not.equals(object.inner) // check for deep cloning
76
- // expect(clonedObject.inner.deeper).not.equals(object.inner.deeper) // check for deep cloning
77
- // },
78
- //
79
- // async "clone array of objects"() {
80
- // const array = [{foo: "bar"}, {baz: 123}, {qux: true}]
81
- // const clonedArray = clone(array)
82
- // expect(JSON.stringify(clonedArray)).equals(JSON.stringify(array))
83
- // expect(clonedArray).not.equals(array) // check for deep cloning
84
- // },
85
- //
86
- // async "clone object with array"() {
87
- // const object = {foo: "bar", array: [1, 2, 3]}
88
- // const clonedObject = clone(object)
89
- // expect(JSON.stringify(clonedObject)).equals(JSON.stringify(object))
90
- // expect(clonedObject).not.equals(object) // check for deep cloning
91
- // },
92
- //
93
- // async "clone object with Map"() {
94
- // const map = new Map()
95
- // map.set("key", "value")
96
- // const object = {foo: "bar", map}
97
- // const clonedObject = clone(object)
98
- // expect(JSON.stringify(clonedObject.foo)).equals(JSON.stringify(object.foo))
99
- // checkMapOrSetEquality(object.map, clonedObject.map)
100
- // },
101
- //
102
- // async "clone object with duplicate sibling references"() {
103
- // const dupeObject = { id: 1, name: "H4CK3RM4N" }
104
- // const data = { obj1: dupeObject, obj2: dupeObject }
105
- //
106
- // let didThrow = false
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":"AAAA,EAAE;AACF,sCAAsC;AACtC,mCAAmC;AACnC,EAAE;AACF,+DAA+D;AAC/D,gEAAgE;AAChE,4DAA4D;AAC5D,iDAAiD;AACjD,iEAAiE;AACjE,IAAI;AACJ,EAAE;AACF,0BAA0B;AAC1B,EAAE;AACF,qCAAqC;AACrC,mCAAmC;AACnC,uCAAuC;AACvC,qCAAqC;AACrC,MAAM;AACN,EAAE;AACF,4BAA4B;AAC5B,4BAA4B;AAC5B,qCAAqC;AACrC,sEAAsE;AACtE,oEAAoE;AACpE,MAAM;AACN,EAAE;AACF,mCAAmC;AACnC,0CAA0C;AAC1C,uCAAuC;AACvC,wEAAwE;AACxE,sEAAsE;AACtE,MAAM;AACN,EAAE;AACF,yBAAyB;AACzB,0BAA0B;AAC1B,4BAA4B;AAC5B,iCAAiC;AACjC,2CAA2C;AAC3C,sCAAsC;AACtC,MAAM;AACN,EAAE;AACF,yBAAyB;AACzB,0BAA0B;AAC1B,qBAAqB;AACrB,iCAAiC;AACjC,wCAAwC;AACxC,sCAAsC;AACtC,MAAM;AACN,EAAE;AACF,0BAA0B;AAC1B,4BAA4B;AAC5B,mCAAmC;AACnC,wDAAwD;AACxD,kEAAkE;AAClE,MAAM;AACN,EAAE;AACF,qDAAqD;AACrD,qCAAqC;AACrC,sDAAsD;AACtD,mBAAmB;AACnB,UAAU;AACV,mBAAmB;AACnB,kBAAkB;AAClB,eAAe;AACf,MAAM;AACN,wCAAwC;AACxC,wCAAwC;AACxC,MAAM;AACN,EAAE;AACF,oCAAoC;AACpC,wEAAwE;AACxE,uCAAuC;AACvC,wEAAwE;AACxE,sEAAsE;AACtE,kFAAkF;AAClF,gGAAgG;AAChG,MAAM;AACN,EAAE;AACF,sCAAsC;AACtC,0DAA0D;AAC1D,qCAAqC;AACrC,sEAAsE;AACtE,oEAAoE;AACpE,MAAM;AACN,EAAE;AACF,uCAAuC;AACvC,kDAAkD;AAClD,uCAAuC;AACvC,wEAAwE;AACxE,sEAAsE;AACtE,MAAM;AACN,EAAE;AACF,qCAAqC;AACrC,0BAA0B;AAC1B,4BAA4B;AAC5B,qCAAqC;AACrC,uCAAuC;AACvC,gFAAgF;AAChF,wDAAwD;AACxD,MAAM;AACN,EAAE;AACF,8DAA8D;AAC9D,oDAAoD;AACpD,wDAAwD;AACxD,EAAE;AACF,yBAAyB;AACzB,oDAAoD;AACpD,EAAE;AACF,UAAU;AACV,8BAA8B;AAC9B,MAAM;AACN,oBAAoB;AACpB,qBAAqB;AACrB,MAAM;AACN,EAAE;AACF,sCAAsC;AACtC,wDAAwD;AACxD,yCAAyC;AACzC,qDAAqD;AACrD,yCAAyC;AACzC,qDAAqD;AACrD,MAAM;AACN,IAAI"}
1
+ {"version":3,"file":"clone.test.js","sourceRoot":"","sources":["../../s/clone/clone.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** return a single function that calls all the provided functions */
2
+ export declare function coalesce<A extends any[] = []>(...fns: ((...a: A) => void)[]): (...a: A) => void;
package/x/coalesce.js ADDED
@@ -0,0 +1,5 @@
1
+ /** return a single function that calls all the provided functions */
2
+ export function coalesce(...fns) {
3
+ return (...a) => fns.forEach(fn => fn(...a));
4
+ }
5
+ //# sourceMappingURL=coalesce.js.map
@@ -0,0 +1 @@
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,19 @@
1
+ export type BytenameOptions = {
2
+ groupSize: number;
3
+ wordSeparator: string;
4
+ groupSeparator: string;
5
+ };
6
+ /**
7
+ * Bytename is a friendly presentation format for arbitrary binary data.
8
+ * - looks like "midsen.picmyn.widrep.baclut dotreg.filtyp.nosnus.siptev"
9
+ * - each byte maps to a three-letter triplet
10
+ * - all delimiters are just sugar, parser doesn't care
11
+ */
12
+ export declare const Bytename: {
13
+ defaults: BytenameOptions;
14
+ random(byteCount: number, options?: Partial<BytenameOptions>): string;
15
+ fromBytes(bytes: Uint8Array, options?: Partial<BytenameOptions>): string;
16
+ toBytes(bytename: string): Uint8Array<ArrayBuffer>;
17
+ toHex(bytename: string): string;
18
+ fromHex(hex: string, options?: Partial<BytenameOptions>): string;
19
+ };
@@ -1,15 +1,25 @@
1
+ import { Hex } from "../hex.js";
1
2
  import { Bytes } from "../bytes.js";
2
3
  import { prefixes } from "./utils/prefixes.js";
3
4
  import { suffixes } from "./utils/suffixes.js";
4
- const wordSeparator = "_";
5
- const groupSeparator = " ";
6
- const defaultWordsPerGroup = 4;
7
- export const Barname = {
8
- random(byteCount) {
9
- return this.string(Bytes.random(byteCount));
5
+ /**
6
+ * Bytename is a friendly presentation format for arbitrary binary data.
7
+ * - looks like "midsen.picmyn.widrep.baclut dotreg.filtyp.nosnus.siptev"
8
+ * - each byte maps to a three-letter triplet
9
+ * - all delimiters are just sugar, parser doesn't care
10
+ */
11
+ export const Bytename = {
12
+ defaults: {
13
+ groupSize: 4,
14
+ wordSeparator: ".",
15
+ groupSeparator: " ",
10
16
  },
11
- string(bytes, options) {
12
- const groupSize = options?.wordsPerGroup ?? defaultWordsPerGroup;
17
+ random(byteCount, options) {
18
+ const bytes = Bytes.random(byteCount);
19
+ return this.fromBytes(bytes, options);
20
+ },
21
+ fromBytes(bytes, options = {}) {
22
+ const { groupSize = Bytename.defaults.groupSize, wordSeparator = Bytename.defaults.wordSeparator, groupSeparator = Bytename.defaults.groupSeparator, } = options;
13
23
  const words = [];
14
24
  let currentWord = [];
15
25
  bytes.forEach((byte, index) => {
@@ -27,8 +37,8 @@ export const Barname = {
27
37
  grouped.push(words.slice(i, i + groupSize).join(wordSeparator));
28
38
  return grouped.join(groupSeparator);
29
39
  },
30
- bytes(string) {
31
- const letters = string
40
+ toBytes(bytename) {
41
+ const letters = bytename
32
42
  .toLowerCase()
33
43
  .replace(/[^a-z]/g, ""); // strip everything except letters
34
44
  const count = letters.length / 3;
@@ -45,5 +55,11 @@ export const Barname = {
45
55
  return number;
46
56
  }));
47
57
  },
58
+ toHex(bytename) {
59
+ return Hex.string(Bytename.toBytes(bytename));
60
+ },
61
+ fromHex(hex, options) {
62
+ return Bytename.fromBytes(Hex.bytes(hex), options);
63
+ },
48
64
  };
49
- //# sourceMappingURL=barname.js.map
65
+ //# sourceMappingURL=bytename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytename.js","sourceRoot":"","sources":["../../../s/data/bytename/bytename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Science } from "@e280/science";
2
+ declare const _default: {
3
+ "bytes->string->bytes": Science.Test;
4
+ "zero bytes": Science.Test;
5
+ "one byte": Science.Test;
6
+ groupings: Science.Test;
7
+ wordsep: {
8
+ underscore: Science.Test;
9
+ uppercase: Science.Test;
10
+ dots: Science.Test;
11
+ crushed: Science.Test;
12
+ space: Science.Test;
13
+ spaces: Science.Test;
14
+ whitespace: Science.Test;
15
+ };
16
+ };
17
+ export default _default;
@@ -0,0 +1,41 @@
1
+ import { Bytes } from "../bytes.js";
2
+ import { Bytename } from "./bytename.js";
3
+ import { Science, test, expect } from "@e280/science";
4
+ const deadbeef = new Uint8Array([0xDE, 0xAD, 0xBE, 0xEF]);
5
+ function good(bytes) {
6
+ expect(Bytes.eq(bytes, deadbeef)).ok();
7
+ }
8
+ export default Science.suite({
9
+ "bytes->string->bytes": test(async () => {
10
+ const text = Bytename.fromBytes(deadbeef);
11
+ expect(text).is("ribmug.hilmun");
12
+ good(Bytename.toBytes(text));
13
+ }),
14
+ "zero bytes": test(async () => {
15
+ const text = Bytename.fromBytes(new Uint8Array([]));
16
+ expect(text).is("");
17
+ }),
18
+ "one byte": test(async () => {
19
+ const text = Bytename.fromBytes(new Uint8Array([0x00]));
20
+ expect(text).is("doz");
21
+ }),
22
+ "groupings": test(async () => {
23
+ const bytes = new Uint8Array([...deadbeef, ...deadbeef]);
24
+ const text = Bytename.fromBytes(bytes, {
25
+ groupSize: 2,
26
+ groupSeparator: " ",
27
+ wordSeparator: ".",
28
+ });
29
+ expect(text).is("ribmug.hilmun ribmug.hilmun");
30
+ }),
31
+ "wordsep": Science.suite({
32
+ "underscore": test(async () => good(Bytename.toBytes("ribmug_hilmun"))),
33
+ "uppercase": test(async () => good(Bytename.toBytes("RIBMUG_HILMUN"))),
34
+ "dots": test(async () => good(Bytename.toBytes("ribmug.hilmun"))),
35
+ "crushed": test(async () => good(Bytename.toBytes("ribmughilmun"))),
36
+ "space": test(async () => good(Bytename.toBytes("ribmug hilmun"))),
37
+ "spaces": test(async () => good(Bytename.toBytes("ribmug hilmun"))),
38
+ "whitespace": test(async () => good(Bytename.toBytes("\n ribmug \n \t \n hilmun \n"))),
39
+ }),
40
+ });
41
+ //# sourceMappingURL=bytename.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytename.test.js","sourceRoot":"","sources":["../../../s/data/bytename/bytename.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./bytename.js";
2
+ export * from "./thumbprint.js";
@@ -0,0 +1,3 @@
1
+ export * from "./bytename.js";
2
+ export * from "./thumbprint.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../s/data/bytename/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,36 @@
1
+ export type ThumbprintOptions = {
2
+ delimiter: string;
3
+ sigilBytes: number;
4
+ previewBytes: number;
5
+ };
6
+ export type ThumbprintData = {
7
+ bytes: Uint8Array;
8
+ thumbprint: string;
9
+ preview: string;
10
+ bulk: string;
11
+ sigil: string;
12
+ };
13
+ /**
14
+ * Thumbprint is a friendly presentation format for arbitrary binary data.
15
+ * - looks like "nodlyn.fasrep.habbud.ralwel.Avo7gFmdWMRHkwsD149mcaBoZdS69iXuJ"
16
+ * - the preview: "nodlyn.fasrep.habbud.ralwel" (bytename format)
17
+ * - the bulk: "Avo7gFmdWMRHkwsD149mcaBoZdS69iXuJ" (base58 format)
18
+ * - the sigil: "nodlyn.fasrep" (shorter part of the bytename)
19
+ * - originally designed to be a nice way to present 256-bit ids, but can actually represent any number of bytes
20
+ */
21
+ export declare const Thumbprint: {
22
+ defaults: ThumbprintOptions;
23
+ toBytes(thumbprint: string): Uint8Array<ArrayBuffer>;
24
+ parse(thumbprint: string, options?: Partial<ThumbprintOptions>): ThumbprintData;
25
+ build: {
26
+ fromBytes(bytes: Uint8Array, options?: Partial<ThumbprintOptions>): ThumbprintData;
27
+ fromHex(hex: string, options?: Partial<ThumbprintOptions>): ThumbprintData;
28
+ };
29
+ toHex(thumbprint: string): string;
30
+ fromBytes(bytes: Uint8Array, options?: Partial<ThumbprintOptions>): string;
31
+ fromHex(hex: string, options?: Partial<ThumbprintOptions>): string;
32
+ sigil: {
33
+ fromHex(hex: string, options?: Partial<ThumbprintOptions>): string;
34
+ fromBytes(bytes: Uint8Array, options?: Partial<ThumbprintOptions>): string;
35
+ };
36
+ };
@@ -0,0 +1,79 @@
1
+ import { Hex } from "../hex.js";
2
+ import { Base58 } from "../base58.js";
3
+ import { Bytename } from "./bytename.js";
4
+ /**
5
+ * Thumbprint is a friendly presentation format for arbitrary binary data.
6
+ * - looks like "nodlyn.fasrep.habbud.ralwel.Avo7gFmdWMRHkwsD149mcaBoZdS69iXuJ"
7
+ * - the preview: "nodlyn.fasrep.habbud.ralwel" (bytename format)
8
+ * - the bulk: "Avo7gFmdWMRHkwsD149mcaBoZdS69iXuJ" (base58 format)
9
+ * - the sigil: "nodlyn.fasrep" (shorter part of the bytename)
10
+ * - originally designed to be a nice way to present 256-bit ids, but can actually represent any number of bytes
11
+ */
12
+ export const Thumbprint = {
13
+ defaults: {
14
+ delimiter: ".",
15
+ sigilBytes: 4,
16
+ previewBytes: 8,
17
+ },
18
+ toBytes(thumbprint) {
19
+ thumbprint = thumbprint.trim();
20
+ const beans = thumbprint.split(/[^a-zA-Z0-9]+/m)
21
+ .filter(Boolean)
22
+ .map(s => s.trim());
23
+ if (beans.length < 2)
24
+ return Bytename.toBytes(beans.join(""));
25
+ const bulk = beans.pop();
26
+ const preview = beans.join("");
27
+ return new Uint8Array([
28
+ ...Bytename.toBytes(preview),
29
+ ...Base58.bytes(bulk),
30
+ ]);
31
+ },
32
+ parse(thumbprint, options) {
33
+ const bytes = Thumbprint.toBytes(thumbprint);
34
+ return Thumbprint.build.fromBytes(bytes, options);
35
+ },
36
+ build: {
37
+ fromBytes(bytes, options = {}) {
38
+ const { delimiter, previewBytes, sigilBytes } = { ...Thumbprint.defaults, ...options };
39
+ const yoink = (b) => (bytes.length > 0)
40
+ ? Bytename.fromBytes(bytes.slice(0, b), {
41
+ wordSeparator: delimiter,
42
+ groupSeparator: delimiter,
43
+ })
44
+ : "";
45
+ const sigil = yoink(sigilBytes);
46
+ const preview = yoink(previewBytes);
47
+ const bulk = (bytes.length > previewBytes)
48
+ ? Base58.string(bytes.slice(previewBytes))
49
+ : "";
50
+ const thumbprint = [preview, bulk]
51
+ .filter(s => s.length > 0)
52
+ .join(delimiter);
53
+ return { bytes, thumbprint, preview, bulk, sigil };
54
+ },
55
+ fromHex(hex, options) {
56
+ const bytes = Hex.bytes(hex);
57
+ return Thumbprint.build.fromBytes(bytes, options);
58
+ },
59
+ },
60
+ toHex(thumbprint) {
61
+ const bytes = Thumbprint.toBytes(thumbprint);
62
+ return Hex.string(bytes);
63
+ },
64
+ fromBytes(bytes, options) {
65
+ return Thumbprint.build.fromBytes(bytes, options).thumbprint;
66
+ },
67
+ fromHex(hex, options) {
68
+ return Thumbprint.fromBytes(Hex.bytes(hex), options);
69
+ },
70
+ sigil: {
71
+ fromHex(hex, options) {
72
+ return Thumbprint.build.fromHex(hex, options).sigil;
73
+ },
74
+ fromBytes(bytes, options) {
75
+ return Thumbprint.build.fromBytes(bytes, options).sigil;
76
+ },
77
+ },
78
+ };
79
+ //# sourceMappingURL=thumbprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbprint.js","sourceRoot":"","sources":["../../../s/data/bytename/thumbprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Science } from "@e280/science";
2
+ declare const _default: {
3
+ "bytes->string->bytes": Science.Test;
4
+ "zero bytes": Science.Test;
5
+ "one byte": Science.Test;
6
+ partially: {
7
+ normal: Science.Test;
8
+ nothing: Science.Test;
9
+ "no-bulk": Science.Test;
10
+ "one-byte": Science.Test;
11
+ "three-byte": Science.Test;
12
+ "one-byte-sigil": Science.Test;
13
+ };
14
+ tolerance: {
15
+ normal: Science.Test;
16
+ coolio: Science.Test;
17
+ spaces: Science.Test;
18
+ dots: Science.Test;
19
+ "one-space": Science.Test;
20
+ "one-newline": Science.Test;
21
+ whitespace: Science.Test;
22
+ };
23
+ };
24
+ export default _default;