@e280/stz 0.0.0-10 → 0.0.0-12

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 CHANGED
@@ -2,6 +2,8 @@
2
2
  # `@e280/stz`
3
3
  standard library of environment-agnostic typescript functions we use basically everywhere
4
4
 
5
+ - zero dependencies
6
+
5
7
  <br/>
6
8
 
7
9
  ## the tools
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e280/stz",
3
- "version": "0.0.0-10",
3
+ "version": "0.0.0-12",
4
4
  "description": "everyday ts fns for everything",
5
5
  "license": "MIT",
6
6
  "author": "Chase Moskal <chasemoskal@gmail.com>",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "devDependencies": {
25
25
  "@e280/science": "^0.0.4",
26
- "@types/node": "^22.15.3",
26
+ "@types/node": "^22.15.15",
27
27
  "npm-run-all": "^4.1.5",
28
28
  "typescript": "^5.8.3"
29
29
  },
@@ -1,4 +1,4 @@
1
1
 
2
2
  export * from "./bytename.js"
3
- export * from "./badge.js"
3
+ export * from "./thumbprint.js"
4
4
 
@@ -0,0 +1,53 @@
1
+
2
+ import {Science, test, expect} from "@e280/science"
3
+ import {Hex} from "../hex.js"
4
+ import {Bytes} from "../bytes.js"
5
+ import {Thumbprint} from "./thumbprint.js"
6
+
7
+ const sampleThumbprint = "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
8
+ const sampleHex = "88e8c3fad1028fcf6ce5ac491578850f4d833336feca03b608265501c3019d59"
9
+ const sampleBytes = Hex.bytes(sampleHex)
10
+
11
+ function good(bytes: Uint8Array) {
12
+ expect(Bytes.eq(bytes, sampleBytes)).ok()
13
+ }
14
+
15
+ export default Science.suite({
16
+ "bytes->string->bytes": test(async() => {
17
+ const text = Thumbprint.string(sampleBytes)
18
+ expect(text).is(sampleThumbprint)
19
+ good(Thumbprint.bytes(text))
20
+ }),
21
+
22
+ "zero bytes": test(async() => {
23
+ const text = Thumbprint.string(new Uint8Array([]))
24
+ expect(text).is("")
25
+ expect(Bytes.eq(Thumbprint.bytes(text), new Uint8Array([]))).ok()
26
+ }),
27
+
28
+ "one byte": test(async() => {
29
+ const text = Thumbprint.string(new Uint8Array([0x00]))
30
+ expect(text).is("doz")
31
+ expect(Bytes.eq(Thumbprint.bytes(text), new Uint8Array([0x00]))).ok()
32
+ }),
33
+
34
+ "partially": Science.suite({
35
+ "normal": test(async() => expect(Thumbprint.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
36
+ "nothing": test(async() => expect(Thumbprint.bytes("").length).is(0)),
37
+ "no-bulk": test(async() => expect(Thumbprint.bytes("nodlyn.fasrep").length).ok()),
38
+ "one-byte": test(async() => expect(Thumbprint.bytes("nod").length).is(1)),
39
+ "three-byte": test(async() => expect(Thumbprint.bytes("nodlynfas").length).is(3)),
40
+ "one-byte-sigil": test(async() => expect(Thumbprint.bytes("nod::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
41
+ }),
42
+
43
+ "tolerance": Science.suite({
44
+ "normal": test(async() => good(Thumbprint.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
45
+ "coolio": test(async() => good(Thumbprint.bytes("nodlyn.fasrep..39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
46
+ "spaces": test(async() => good(Thumbprint.bytes("nodlyn fasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
47
+ "dots": test(async() => good(Thumbprint.bytes("nodlyn.fasrep.39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
48
+ "one-space": test(async() => good(Thumbprint.bytes("nodlynfasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
49
+ "one-newline": test(async() => good(Thumbprint.bytes("nodlynfasrep\n39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
50
+ "whitespace": test(async() => good(Thumbprint.bytes("\t\n nodlyn\n fasrep \n\n\t\n 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k\n\t"))),
51
+ }),
52
+ })
53
+
@@ -0,0 +1,80 @@
1
+
2
+ import {Hex} from "../hex.js"
3
+ import {Base58} from "../base58.js"
4
+ import {Bytename} from "./bytename.js"
5
+
6
+ export type ThumbprintOptions = {
7
+ delimiter: string
8
+ sigilDelimiter: string
9
+ sigilByteCount: number
10
+ }
11
+
12
+ export type ThumbprintData = {
13
+ sigil: string
14
+ bulk: string
15
+ bytes: Uint8Array
16
+ }
17
+
18
+ /**
19
+ * Thumbprint is a human-friendly presentation format for arbitrary binary data.
20
+ * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
21
+ * - the first lead bytes are shown in bytename format
22
+ * - the rest of the data is in base58
23
+ * - designed to be a nice way to present 256-bit passport thumbprints
24
+ * - can actually represent any number of bytes
25
+ */
26
+ export const Thumbprint = {
27
+ defaults: (<ThumbprintOptions>{
28
+ delimiter: "::",
29
+ sigilDelimiter: ".",
30
+ sigilByteCount: 4,
31
+ }),
32
+
33
+ string(bytes: Uint8Array, options: Partial<ThumbprintOptions> = {}) {
34
+ const {sigilByteCount, sigilDelimiter, delimiter}
35
+ = {...Thumbprint.defaults, ...options}
36
+
37
+ const sigil = Bytename.string(bytes.slice(0, sigilByteCount), {
38
+ wordSeparator: sigilDelimiter,
39
+ groupSeparator: sigilDelimiter,
40
+ })
41
+
42
+ return (bytes.length > sigilByteCount)
43
+ ? `${sigil}${delimiter}${Base58.string(bytes.slice(sigilByteCount))}`
44
+ : sigil
45
+ },
46
+
47
+ parse(thumbprint: string): ThumbprintData {
48
+ thumbprint = thumbprint.trim()
49
+ const parts = thumbprint.split(/[^a-zA-Z0-9]+/m)
50
+ .filter(Boolean)
51
+ .map(s => s.trim())
52
+
53
+ if (parts.length < 2) {
54
+ const sigil = parts.join(".")
55
+ const bytes = Bytename.bytes(sigil)
56
+ return {sigil, bulk: "", bytes}
57
+ }
58
+
59
+ const bulk = parts.pop()!
60
+ const sigil = parts.join(".")
61
+ const bytes = new Uint8Array([
62
+ ...Bytename.bytes(sigil),
63
+ ...Base58.bytes(bulk),
64
+ ])
65
+ return {sigil, bulk, bytes}
66
+ },
67
+
68
+ bytes(thumbprint: string) {
69
+ return Thumbprint.parse(thumbprint).bytes
70
+ },
71
+
72
+ hex(thumbprint: string) {
73
+ return Hex.string(Thumbprint.bytes(thumbprint))
74
+ },
75
+
76
+ fromHex(hex: string, options?: Partial<ThumbprintOptions>) {
77
+ return Thumbprint.string(Hex.bytes(hex), options)
78
+ },
79
+ }
80
+
package/s/pubsub.ts CHANGED
@@ -6,6 +6,7 @@ export type Listener<A extends any[]> = (...a: A) => (void | Promise<void>)
6
6
  export interface Xub<A extends any[] = []> {
7
7
  pub(...a: A): Promise<void>
8
8
  sub(fn: Listener<A>): () => void
9
+ on(fn: Listener<A>): () => void
9
10
  once(): Promise<A>
10
11
  clear(): void
11
12
  }
@@ -45,11 +46,13 @@ export function xub<A extends any[] = []>() {
45
46
 
46
47
  sub.pub = pub
47
48
  sub.sub = sub
49
+ sub.on = sub
48
50
  sub.once = once
49
51
  sub.clear = clear
50
52
 
51
53
  pub.pub = pub
52
54
  pub.sub = sub
55
+ pub.on = sub
53
56
  pub.once = once
54
57
  pub.clear = clear
55
58
 
package/s/tests.test.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import {Science} from "@e280/science"
3
3
 
4
4
  import cloneTest from "./clone/clone.test.js"
5
- import badgeTest from "./data/bytename/badge.test.js"
5
+ import thumbprintTest from "./data/bytename/thumbprint.test.js"
6
6
  import debounceTest from "./debounce/debounce.test.js"
7
7
  import bytenameTest from "./data/bytename/bytename.test.js"
8
8
  import deepTest from "./deep/deep.test.js"
@@ -10,7 +10,7 @@ import deepTest from "./deep/deep.test.js"
10
10
  await Science.run({
11
11
  clone: cloneTest,
12
12
  bytename: bytenameTest,
13
- badge: badgeTest,
13
+ thumbprint: thumbprintTest,
14
14
  debounce: debounceTest,
15
15
  deep: deepTest,
16
16
  })
@@ -1,2 +1,2 @@
1
1
  export * from "./bytename.js";
2
- export * from "./badge.js";
2
+ export * from "./thumbprint.js";
@@ -1,3 +1,3 @@
1
1
  export * from "./bytename.js";
2
- export * from "./badge.js";
2
+ export * from "./thumbprint.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../s/data/bytename/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
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,26 @@
1
+ export type ThumbprintOptions = {
2
+ delimiter: string;
3
+ sigilDelimiter: string;
4
+ sigilByteCount: number;
5
+ };
6
+ export type ThumbprintData = {
7
+ sigil: string;
8
+ bulk: string;
9
+ bytes: Uint8Array;
10
+ };
11
+ /**
12
+ * Thumbprint is a human-friendly presentation format for arbitrary binary data.
13
+ * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
14
+ * - the first lead bytes are shown in bytename format
15
+ * - the rest of the data is in base58
16
+ * - designed to be a nice way to present 256-bit passport thumbprints
17
+ * - can actually represent any number of bytes
18
+ */
19
+ export declare const Thumbprint: {
20
+ defaults: ThumbprintOptions;
21
+ string(bytes: Uint8Array, options?: Partial<ThumbprintOptions>): string;
22
+ parse(thumbprint: string): ThumbprintData;
23
+ bytes(thumbprint: string): Uint8Array<ArrayBufferLike>;
24
+ hex(thumbprint: string): string;
25
+ fromHex(hex: string, options?: Partial<ThumbprintOptions>): string;
26
+ };
@@ -0,0 +1,56 @@
1
+ import { Hex } from "../hex.js";
2
+ import { Base58 } from "../base58.js";
3
+ import { Bytename } from "./bytename.js";
4
+ /**
5
+ * Thumbprint is a human-friendly presentation format for arbitrary binary data.
6
+ * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
7
+ * - the first lead bytes are shown in bytename format
8
+ * - the rest of the data is in base58
9
+ * - designed to be a nice way to present 256-bit passport thumbprints
10
+ * - can actually represent any number of bytes
11
+ */
12
+ export const Thumbprint = {
13
+ defaults: {
14
+ delimiter: "::",
15
+ sigilDelimiter: ".",
16
+ sigilByteCount: 4,
17
+ },
18
+ string(bytes, options = {}) {
19
+ const { sigilByteCount, sigilDelimiter, delimiter } = { ...Thumbprint.defaults, ...options };
20
+ const sigil = Bytename.string(bytes.slice(0, sigilByteCount), {
21
+ wordSeparator: sigilDelimiter,
22
+ groupSeparator: sigilDelimiter,
23
+ });
24
+ return (bytes.length > sigilByteCount)
25
+ ? `${sigil}${delimiter}${Base58.string(bytes.slice(sigilByteCount))}`
26
+ : sigil;
27
+ },
28
+ parse(thumbprint) {
29
+ thumbprint = thumbprint.trim();
30
+ const parts = thumbprint.split(/[^a-zA-Z0-9]+/m)
31
+ .filter(Boolean)
32
+ .map(s => s.trim());
33
+ if (parts.length < 2) {
34
+ const sigil = parts.join(".");
35
+ const bytes = Bytename.bytes(sigil);
36
+ return { sigil, bulk: "", bytes };
37
+ }
38
+ const bulk = parts.pop();
39
+ const sigil = parts.join(".");
40
+ const bytes = new Uint8Array([
41
+ ...Bytename.bytes(sigil),
42
+ ...Base58.bytes(bulk),
43
+ ]);
44
+ return { sigil, bulk, bytes };
45
+ },
46
+ bytes(thumbprint) {
47
+ return Thumbprint.parse(thumbprint).bytes;
48
+ },
49
+ hex(thumbprint) {
50
+ return Hex.string(Thumbprint.bytes(thumbprint));
51
+ },
52
+ fromHex(hex, options) {
53
+ return Thumbprint.string(Hex.bytes(hex), options);
54
+ },
55
+ };
56
+ //# sourceMappingURL=thumbprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbprint.js","sourceRoot":"","sources":["../../../s/data/bytename/thumbprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AACnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AActC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,QAAQ,EAAsB;QAC7B,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,CAAC;KAChB;IAEF,MAAM,CAAC,KAAiB,EAAE,UAAsC,EAAE;QACjE,MAAM,EAAC,cAAc,EAAE,cAAc,EAAE,SAAS,EAAC,GAC9C,EAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,CAAA;QAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE;YAC7D,aAAa,EAAE,cAAc;YAC7B,cAAc,EAAE,cAAc;SAC9B,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;YACrC,CAAC,CAAC,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE;YACrE,CAAC,CAAC,KAAK,CAAA;IACT,CAAC;IAED,KAAK,CAAC,UAAkB;QACvB,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC;aAC9C,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACnC,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,CAAA;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC;YAC5B,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACrB,CAAC,CAAA;QACF,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,UAAkB;QACvB,OAAO,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAA;IAC1C,CAAC;IAED,GAAG,CAAC,UAAkB;QACrB,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,OAAoC;QACxD,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;CACD,CAAA"}
@@ -6,10 +6,10 @@ declare const _default: {
6
6
  partially: {
7
7
  normal: Science.Test;
8
8
  nothing: Science.Test;
9
- "no-rest": Science.Test;
9
+ "no-bulk": Science.Test;
10
10
  "one-byte": Science.Test;
11
11
  "three-byte": Science.Test;
12
- "one-byte-lead": Science.Test;
12
+ "one-byte-sigil": Science.Test;
13
13
  };
14
14
  tolerance: {
15
15
  normal: Science.Test;
@@ -0,0 +1,45 @@
1
+ import { Science, test, expect } from "@e280/science";
2
+ import { Hex } from "../hex.js";
3
+ import { Bytes } from "../bytes.js";
4
+ import { Thumbprint } from "./thumbprint.js";
5
+ const sampleThumbprint = "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k";
6
+ const sampleHex = "88e8c3fad1028fcf6ce5ac491578850f4d833336feca03b608265501c3019d59";
7
+ const sampleBytes = Hex.bytes(sampleHex);
8
+ function good(bytes) {
9
+ expect(Bytes.eq(bytes, sampleBytes)).ok();
10
+ }
11
+ export default Science.suite({
12
+ "bytes->string->bytes": test(async () => {
13
+ const text = Thumbprint.string(sampleBytes);
14
+ expect(text).is(sampleThumbprint);
15
+ good(Thumbprint.bytes(text));
16
+ }),
17
+ "zero bytes": test(async () => {
18
+ const text = Thumbprint.string(new Uint8Array([]));
19
+ expect(text).is("");
20
+ expect(Bytes.eq(Thumbprint.bytes(text), new Uint8Array([]))).ok();
21
+ }),
22
+ "one byte": test(async () => {
23
+ const text = Thumbprint.string(new Uint8Array([0x00]));
24
+ expect(text).is("doz");
25
+ expect(Bytes.eq(Thumbprint.bytes(text), new Uint8Array([0x00]))).ok();
26
+ }),
27
+ "partially": Science.suite({
28
+ "normal": test(async () => expect(Thumbprint.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
29
+ "nothing": test(async () => expect(Thumbprint.bytes("").length).is(0)),
30
+ "no-bulk": test(async () => expect(Thumbprint.bytes("nodlyn.fasrep").length).ok()),
31
+ "one-byte": test(async () => expect(Thumbprint.bytes("nod").length).is(1)),
32
+ "three-byte": test(async () => expect(Thumbprint.bytes("nodlynfas").length).is(3)),
33
+ "one-byte-sigil": test(async () => expect(Thumbprint.bytes("nod::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
34
+ }),
35
+ "tolerance": Science.suite({
36
+ "normal": test(async () => good(Thumbprint.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
37
+ "coolio": test(async () => good(Thumbprint.bytes("nodlyn.fasrep..39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
38
+ "spaces": test(async () => good(Thumbprint.bytes("nodlyn fasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
39
+ "dots": test(async () => good(Thumbprint.bytes("nodlyn.fasrep.39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
40
+ "one-space": test(async () => good(Thumbprint.bytes("nodlynfasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
41
+ "one-newline": test(async () => good(Thumbprint.bytes("nodlynfasrep\n39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
42
+ "whitespace": test(async () => good(Thumbprint.bytes("\t\n nodlyn\n fasrep \n\n\t\n 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k\n\t"))),
43
+ }),
44
+ });
45
+ //# sourceMappingURL=thumbprint.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbprint.test.js","sourceRoot":"","sources":["../../../s/data/bytename/thumbprint.test.ts"],"names":[],"mappings":"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"}
package/x/pubsub.d.ts CHANGED
@@ -2,6 +2,7 @@ export type Listener<A extends any[]> = (...a: A) => (void | Promise<void>);
2
2
  export interface Xub<A extends any[] = []> {
3
3
  pub(...a: A): Promise<void>;
4
4
  sub(fn: Listener<A>): () => void;
5
+ on(fn: Listener<A>): () => void;
5
6
  once(): Promise<A>;
6
7
  clear(): void;
7
8
  }
package/x/pubsub.js CHANGED
@@ -21,10 +21,12 @@ export function xub() {
21
21
  }
22
22
  sub.pub = pub;
23
23
  sub.sub = sub;
24
+ sub.on = sub;
24
25
  sub.once = once;
25
26
  sub.clear = clear;
26
27
  pub.pub = pub;
27
28
  pub.sub = sub;
29
+ pub.on = sub;
28
30
  pub.once = once;
29
31
  pub.clear = clear;
30
32
  return [pub, sub];
package/x/pubsub.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../s/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAmB/C,MAAM,UAAU,GAAG;IAClB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe,CAAA;IAElC,SAAS,GAAG,CAAC,EAAe;QAC3B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACX,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,GAAG,CAAI;QACzB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,UAAU,IAAI;QAClB,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,YAAY,EAAK,CAAA;QAC5C,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;YAChC,OAAO,CAAC,CAAC,CAAC,CAAA;YACV,WAAW,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IACf,CAAC;IAED,SAAS,KAAK;QACb,GAAG,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;IAED,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;IACf,GAAG,CAAC,KAAK,GAAG,KAAK,CAAA;IAEjB,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;IACf,GAAG,CAAC,KAAK,GAAG,KAAK,CAAA;IAEjB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAqB,CAAA;AACtC,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,GAAG,CAAuB,QAAsB;IAC/D,MAAM,EAAE,GAAG,GAAG,EAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,QAAQ;QACX,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACjB,OAAO,EAAE,CAAA;AACV,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,GAAG,CAAuB,QAAsB;IAC/D,MAAM,EAAE,GAAG,GAAG,EAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,QAAQ;QACX,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACjB,OAAO,EAAE,CAAA;AACV,CAAC"}
1
+ {"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../s/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAoB/C,MAAM,UAAU,GAAG;IAClB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe,CAAA;IAElC,SAAS,GAAG,CAAC,EAAe;QAC3B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACX,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,GAAG,CAAI;QACzB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,UAAU,IAAI;QAClB,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,YAAY,EAAK,CAAA;QAC5C,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;YAChC,OAAO,CAAC,CAAC,CAAC,CAAA;YACV,WAAW,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IACf,CAAC;IAED,SAAS,KAAK;QACb,GAAG,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;IAED,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,EAAE,GAAG,GAAG,CAAA;IACZ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;IACf,GAAG,CAAC,KAAK,GAAG,KAAK,CAAA;IAEjB,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACb,GAAG,CAAC,EAAE,GAAG,GAAG,CAAA;IACZ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAA;IACf,GAAG,CAAC,KAAK,GAAG,KAAK,CAAA;IAEjB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAqB,CAAA;AACtC,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,GAAG,CAAuB,QAAsB;IAC/D,MAAM,EAAE,GAAG,GAAG,EAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,QAAQ;QACX,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACjB,OAAO,EAAE,CAAA;AACV,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,GAAG,CAAuB,QAAsB;IAC/D,MAAM,EAAE,GAAG,GAAG,EAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,QAAQ;QACX,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACjB,OAAO,EAAE,CAAA;AACV,CAAC"}
package/x/tests.test.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import { Science } from "@e280/science";
2
2
  import cloneTest from "./clone/clone.test.js";
3
- import badgeTest from "./data/bytename/badge.test.js";
3
+ import thumbprintTest from "./data/bytename/thumbprint.test.js";
4
4
  import debounceTest from "./debounce/debounce.test.js";
5
5
  import bytenameTest from "./data/bytename/bytename.test.js";
6
6
  import deepTest from "./deep/deep.test.js";
7
7
  await Science.run({
8
8
  clone: cloneTest,
9
9
  bytename: bytenameTest,
10
- badge: badgeTest,
10
+ thumbprint: thumbprintTest,
11
11
  debounce: debounceTest,
12
12
  deep: deepTest,
13
13
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tests.test.js","sourceRoot":"","sources":["../s/tests.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAErC,OAAO,SAAS,MAAM,uBAAuB,CAAA;AAC7C,OAAO,SAAS,MAAM,+BAA+B,CAAA;AACrD,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,YAAY,MAAM,kCAAkC,CAAA;AAC3D,OAAO,QAAQ,MAAM,qBAAqB,CAAA;AAE1C,MAAM,OAAO,CAAC,GAAG,CAAC;IACjB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,YAAY;IACtB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,QAAQ;CACd,CAAC,CAAA"}
1
+ {"version":3,"file":"tests.test.js","sourceRoot":"","sources":["../s/tests.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAErC,OAAO,SAAS,MAAM,uBAAuB,CAAA;AAC7C,OAAO,cAAc,MAAM,oCAAoC,CAAA;AAC/D,OAAO,YAAY,MAAM,6BAA6B,CAAA;AACtD,OAAO,YAAY,MAAM,kCAAkC,CAAA;AAC3D,OAAO,QAAQ,MAAM,qBAAqB,CAAA;AAE1C,MAAM,OAAO,CAAC,GAAG,CAAC;IACjB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,cAAc;IAC1B,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,QAAQ;CACd,CAAC,CAAA"}
@@ -1,53 +0,0 @@
1
-
2
- import {Hex} from "../hex.js"
3
- import {Badge} from "./badge.js"
4
- import {Bytes} from "../bytes.js"
5
- import {Science, test, expect} from "@e280/science"
6
-
7
- const sampleBadge = "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
8
- const sampleHex = "88e8c3fad1028fcf6ce5ac491578850f4d833336feca03b608265501c3019d59"
9
- const sampleBytes = Hex.bytes(sampleHex)
10
-
11
- function good(bytes: Uint8Array) {
12
- expect(Bytes.eq(bytes, sampleBytes)).ok()
13
- }
14
-
15
- export default Science.suite({
16
- "bytes->string->bytes": test(async() => {
17
- const text = Badge.string(sampleBytes)
18
- expect(text).is(sampleBadge)
19
- good(Badge.bytes(text))
20
- }),
21
-
22
- "zero bytes": test(async() => {
23
- const text = Badge.string(new Uint8Array([]))
24
- expect(text).is("")
25
- expect(Bytes.eq(Badge.bytes(text), new Uint8Array([]))).ok()
26
- }),
27
-
28
- "one byte": test(async() => {
29
- const text = Badge.string(new Uint8Array([0x00]))
30
- expect(text).is("doz")
31
- expect(Bytes.eq(Badge.bytes(text), new Uint8Array([0x00]))).ok()
32
- }),
33
-
34
- "partially": Science.suite({
35
- "normal": test(async() => expect(Badge.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
36
- "nothing": test(async() => expect(Badge.bytes("").length).is(0)),
37
- "no-rest": test(async() => expect(Badge.bytes("nodlyn.fasrep").length).ok()),
38
- "one-byte": test(async() => expect(Badge.bytes("nod").length).is(1)),
39
- "three-byte": test(async() => expect(Badge.bytes("nodlynfas").length).is(3)),
40
- "one-byte-lead": test(async() => expect(Badge.bytes("nod::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
41
- }),
42
-
43
- "tolerance": Science.suite({
44
- "normal": test(async() => good(Badge.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
45
- "coolio": test(async() => good(Badge.bytes("nodlyn.fasrep..39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
46
- "spaces": test(async() => good(Badge.bytes("nodlyn fasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
47
- "dots": test(async() => good(Badge.bytes("nodlyn.fasrep.39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
48
- "one-space": test(async() => good(Badge.bytes("nodlynfasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
49
- "one-newline": test(async() => good(Badge.bytes("nodlynfasrep\n39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
50
- "whitespace": test(async() => good(Badge.bytes("\t\n nodlyn\n fasrep \n\n\t\n 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k\n\t"))),
51
- }),
52
- })
53
-
@@ -1,80 +0,0 @@
1
-
2
- import {Hex} from "../hex.js"
3
- import {Base58} from "../base58.js"
4
- import {Bytename} from "./bytename.js"
5
-
6
- export type BadgeOptions = {
7
- leadBytes: number
8
- leadSeparator: string
9
- restSeparator: string
10
- }
11
-
12
- export type ParsedBadge = {
13
- lead: string
14
- rest: string
15
- bytes: Uint8Array
16
- }
17
-
18
- /**
19
- * Badge is a human-friendly presentation format for arbitrary binary data.
20
- * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
21
- * - the first lead bytes are shown in bytename format
22
- * - the rest of the data is in base58
23
- * - designed to be a nice way to present 256-bit passport thumbprints
24
- * - can actually represent any number of bytes
25
- */
26
- export const Badge = {
27
- defaults: (<BadgeOptions>{
28
- leadBytes: 4,
29
- leadSeparator: ".",
30
- restSeparator: "::",
31
- }),
32
-
33
- string(bytes: Uint8Array, options: Partial<BadgeOptions> = {}) {
34
- const {leadBytes, leadSeparator, restSeparator}
35
- = {...Badge.defaults, ...options}
36
-
37
- const appetizer = Bytename.string(bytes.slice(0, leadBytes), {
38
- wordSeparator: leadSeparator,
39
- groupSeparator: leadSeparator,
40
- })
41
-
42
- return (bytes.length > leadBytes)
43
- ? `${appetizer}${restSeparator}${Base58.string(bytes.slice(leadBytes))}`
44
- : appetizer
45
- },
46
-
47
- parse(badge: string): ParsedBadge {
48
- badge = badge.trim()
49
- const parts = badge.split(/[^a-zA-Z0-9]+/m)
50
- .filter(Boolean)
51
- .map(s => s.trim())
52
-
53
- if (parts.length < 2) {
54
- const lead = parts.join(".")
55
- const bytes = Bytename.bytes(lead)
56
- return {lead, rest: "", bytes}
57
- }
58
-
59
- const rest = parts.pop()!
60
- const lead = parts.join(".")
61
- const bytes = new Uint8Array([
62
- ...Bytename.bytes(lead),
63
- ...Base58.bytes(rest),
64
- ])
65
- return {lead, rest, bytes}
66
- },
67
-
68
- bytes(badge: string) {
69
- return Badge.parse(badge).bytes
70
- },
71
-
72
- hex(badge: string) {
73
- return Hex.string(Badge.bytes(badge))
74
- },
75
-
76
- fromHex(hex: string, options?: Partial<BadgeOptions>) {
77
- return Badge.string(Hex.bytes(hex), options)
78
- },
79
- }
80
-
@@ -1,26 +0,0 @@
1
- export type BadgeOptions = {
2
- leadBytes: number;
3
- leadSeparator: string;
4
- restSeparator: string;
5
- };
6
- export type ParsedBadge = {
7
- lead: string;
8
- rest: string;
9
- bytes: Uint8Array;
10
- };
11
- /**
12
- * Badge is a human-friendly presentation format for arbitrary binary data.
13
- * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
14
- * - the first lead bytes are shown in bytename format
15
- * - the rest of the data is in base58
16
- * - designed to be a nice way to present 256-bit passport thumbprints
17
- * - can actually represent any number of bytes
18
- */
19
- export declare const Badge: {
20
- defaults: BadgeOptions;
21
- string(bytes: Uint8Array, options?: Partial<BadgeOptions>): string;
22
- parse(badge: string): ParsedBadge;
23
- bytes(badge: string): Uint8Array<ArrayBufferLike>;
24
- hex(badge: string): string;
25
- fromHex(hex: string, options?: Partial<BadgeOptions>): string;
26
- };
@@ -1,56 +0,0 @@
1
- import { Hex } from "../hex.js";
2
- import { Base58 } from "../base58.js";
3
- import { Bytename } from "./bytename.js";
4
- /**
5
- * Badge is a human-friendly presentation format for arbitrary binary data.
6
- * - looks like "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"
7
- * - the first lead bytes are shown in bytename format
8
- * - the rest of the data is in base58
9
- * - designed to be a nice way to present 256-bit passport thumbprints
10
- * - can actually represent any number of bytes
11
- */
12
- export const Badge = {
13
- defaults: {
14
- leadBytes: 4,
15
- leadSeparator: ".",
16
- restSeparator: "::",
17
- },
18
- string(bytes, options = {}) {
19
- const { leadBytes, leadSeparator, restSeparator } = { ...Badge.defaults, ...options };
20
- const appetizer = Bytename.string(bytes.slice(0, leadBytes), {
21
- wordSeparator: leadSeparator,
22
- groupSeparator: leadSeparator,
23
- });
24
- return (bytes.length > leadBytes)
25
- ? `${appetizer}${restSeparator}${Base58.string(bytes.slice(leadBytes))}`
26
- : appetizer;
27
- },
28
- parse(badge) {
29
- badge = badge.trim();
30
- const parts = badge.split(/[^a-zA-Z0-9]+/m)
31
- .filter(Boolean)
32
- .map(s => s.trim());
33
- if (parts.length < 2) {
34
- const lead = parts.join(".");
35
- const bytes = Bytename.bytes(lead);
36
- return { lead, rest: "", bytes };
37
- }
38
- const rest = parts.pop();
39
- const lead = parts.join(".");
40
- const bytes = new Uint8Array([
41
- ...Bytename.bytes(lead),
42
- ...Base58.bytes(rest),
43
- ]);
44
- return { lead, rest, bytes };
45
- },
46
- bytes(badge) {
47
- return Badge.parse(badge).bytes;
48
- },
49
- hex(badge) {
50
- return Hex.string(Badge.bytes(badge));
51
- },
52
- fromHex(hex, options) {
53
- return Badge.string(Hex.bytes(hex), options);
54
- },
55
- };
56
- //# sourceMappingURL=badge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../s/data/bytename/badge.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AACnC,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AActC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,QAAQ,EAAiB;QACxB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,GAAG;QAClB,aAAa,EAAE,IAAI;KAClB;IAEF,MAAM,CAAC,KAAiB,EAAE,UAAiC,EAAE;QAC5D,MAAM,EAAC,SAAS,EAAE,aAAa,EAAE,aAAa,EAAC,GAC5C,EAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,CAAA;QAElC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE;YAC5D,aAAa,EAAE,aAAa;YAC5B,cAAc,EAAE,aAAa;SAC7B,CAAC,CAAA;QAEF,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YAChC,CAAC,CAAC,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;YACxE,CAAC,CAAC,SAAS,CAAA;IACb,CAAC;IAED,KAAK,CAAC,KAAa;QAClB,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC;aACzC,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,CAAA;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC;YAC5B,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACrB,CAAC,CAAA;QACF,OAAO,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,KAAa;QAClB,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAA;IAChC,CAAC;IAED,GAAG,CAAC,KAAa;QAChB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,OAA+B;QACnD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA"}
@@ -1,45 +0,0 @@
1
- import { Hex } from "../hex.js";
2
- import { Badge } from "./badge.js";
3
- import { Bytes } from "../bytes.js";
4
- import { Science, test, expect } from "@e280/science";
5
- const sampleBadge = "nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k";
6
- const sampleHex = "88e8c3fad1028fcf6ce5ac491578850f4d833336feca03b608265501c3019d59";
7
- const sampleBytes = Hex.bytes(sampleHex);
8
- function good(bytes) {
9
- expect(Bytes.eq(bytes, sampleBytes)).ok();
10
- }
11
- export default Science.suite({
12
- "bytes->string->bytes": test(async () => {
13
- const text = Badge.string(sampleBytes);
14
- expect(text).is(sampleBadge);
15
- good(Badge.bytes(text));
16
- }),
17
- "zero bytes": test(async () => {
18
- const text = Badge.string(new Uint8Array([]));
19
- expect(text).is("");
20
- expect(Bytes.eq(Badge.bytes(text), new Uint8Array([]))).ok();
21
- }),
22
- "one byte": test(async () => {
23
- const text = Badge.string(new Uint8Array([0x00]));
24
- expect(text).is("doz");
25
- expect(Bytes.eq(Badge.bytes(text), new Uint8Array([0x00]))).ok();
26
- }),
27
- "partially": Science.suite({
28
- "normal": test(async () => expect(Badge.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
29
- "nothing": test(async () => expect(Badge.bytes("").length).is(0)),
30
- "no-rest": test(async () => expect(Badge.bytes("nodlyn.fasrep").length).ok()),
31
- "one-byte": test(async () => expect(Badge.bytes("nod").length).is(1)),
32
- "three-byte": test(async () => expect(Badge.bytes("nodlynfas").length).is(3)),
33
- "one-byte-lead": test(async () => expect(Badge.bytes("nod::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k").length).ok()),
34
- }),
35
- "tolerance": Science.suite({
36
- "normal": test(async () => good(Badge.bytes("nodlyn.fasrep::39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
37
- "coolio": test(async () => good(Badge.bytes("nodlyn.fasrep..39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
38
- "spaces": test(async () => good(Badge.bytes("nodlyn fasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
39
- "dots": test(async () => good(Badge.bytes("nodlyn.fasrep.39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
40
- "one-space": test(async () => good(Badge.bytes("nodlynfasrep 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
41
- "one-newline": test(async () => good(Badge.bytes("nodlynfasrep\n39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k"))),
42
- "whitespace": test(async () => good(Badge.bytes("\t\n nodlyn\n fasrep \n\n\t\n 39gfeGFAAnBzH5pkT7EdoETMUMAekG9h1iymk6k\n\t"))),
43
- }),
44
- });
45
- //# sourceMappingURL=badge.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"badge.test.js","sourceRoot":"","sources":["../../../s/data/bytename/badge.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAChC,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AACjC,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,eAAe,CAAA;AAEnD,MAAM,WAAW,GAAG,wDAAwD,CAAA;AAC5E,MAAM,SAAS,GAAG,kEAAkE,CAAA;AACpF,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAExC,SAAS,IAAI,CAAC,KAAiB;IAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAC1C,CAAC;AAED,eAAe,OAAO,CAAC,KAAK,CAAC;IAC5B,sBAAsB,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACxB,CAAC,CAAC;IAEF,YAAY,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACnB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IAC7D,CAAC,CAAC;IAEF,UAAU,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACtB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;IACjE,CAAC,CAAC;IAEF,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;QACpH,SAAS,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,SAAS,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5E,UAAU,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,YAAY,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5E,eAAe,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;KACjH,CAAC;IAEF,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACtG,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACtG,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACrG,MAAM,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACnG,WAAW,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;QACvG,aAAa,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;QAC1G,YAAY,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC,CAAC;KAC7H,CAAC;CACF,CAAC,CAAA"}