@bounded-authority-protocol/verifier 0.2.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.
Files changed (49) hide show
  1. package/LICENSE +190 -0
  2. package/NOTICE +10 -0
  3. package/README.md +183 -0
  4. package/dist/src/base64url.d.ts +2 -0
  5. package/dist/src/base64url.js +115 -0
  6. package/dist/src/base64url.js.map +1 -0
  7. package/dist/src/bounds.d.ts +50 -0
  8. package/dist/src/bounds.js +114 -0
  9. package/dist/src/bounds.js.map +1 -0
  10. package/dist/src/compact.d.ts +19 -0
  11. package/dist/src/compact.js +111 -0
  12. package/dist/src/compact.js.map +1 -0
  13. package/dist/src/digest.d.ts +8 -0
  14. package/dist/src/digest.js +116 -0
  15. package/dist/src/digest.js.map +1 -0
  16. package/dist/src/ed25519.d.ts +7 -0
  17. package/dist/src/ed25519.js +61 -0
  18. package/dist/src/ed25519.js.map +1 -0
  19. package/dist/src/error.d.ts +15 -0
  20. package/dist/src/error.js +34 -0
  21. package/dist/src/error.js.map +1 -0
  22. package/dist/src/facts.d.ts +104 -0
  23. package/dist/src/facts.js +6 -0
  24. package/dist/src/facts.js.map +1 -0
  25. package/dist/src/index.d.ts +16 -0
  26. package/dist/src/index.js +31 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/jcs.d.ts +3 -0
  29. package/dist/src/jcs.js +285 -0
  30. package/dist/src/jcs.js.map +1 -0
  31. package/dist/src/json.d.ts +25 -0
  32. package/dist/src/json.js +473 -0
  33. package/dist/src/json.js.map +1 -0
  34. package/dist/src/jwk.d.ts +14 -0
  35. package/dist/src/jwk.js +77 -0
  36. package/dist/src/jwk.js.map +1 -0
  37. package/dist/src/selector.d.ts +16 -0
  38. package/dist/src/selector.js +142 -0
  39. package/dist/src/selector.js.map +1 -0
  40. package/dist/src/uri.d.ts +4 -0
  41. package/dist/src/uri.js +280 -0
  42. package/dist/src/uri.js.map +1 -0
  43. package/dist/src/v1.d.ts +211 -0
  44. package/dist/src/v1.js +2206 -0
  45. package/dist/src/v1.js.map +1 -0
  46. package/dist/src/v2.d.ts +291 -0
  47. package/dist/src/v2.js +2300 -0
  48. package/dist/src/v2.js.map +1 -0
  49. package/package.json +46 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../src/facts.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,mGAAmG;AACnG,gFAAgF;AAChF,4FAA4F"}
@@ -0,0 +1,16 @@
1
+ export { untrustedKeyLocator, decodeGrant, decodeProof, decodeLocalLoopbackHttpProof, verifyGrant, checkEnvelope, checkLocalLoopbackHttpEnvelope, requestDigest, encodeConsumptionEntry, checkChain, grantSigningInput, proofSigningInput, localLoopbackHttpProofSigningInput, assembleCompact, assembleLocalLoopbackHttpCompact, boundaryAnchorSigningInput, keyTransitionSigningInput, encodeAnchoredExport, verifyHistoricalAnchor, verifyKeyTransition, verifyAnchoredExport, jwkEncodePublic, jwkDecodePublic, thumbprint, uriNormalize, boundsNew, boundsMaximum, MAXIMUM_BOUNDS, MAXIMA, REQUEST_PREFIX, ROW_PREFIX, ARCHIVE_PREFIX, } from "./v1.js";
2
+ export { localLoopbackHttpUriNormalize } from "./uri.js";
3
+ export * as v2 from "./v2.js";
4
+ export type { TrustedIssuer, ExpectedGrant, HistoricalPublicKey, ExpectedAnchor, ExpectedKeyTransition, ConsumptionEntry, ChainInput, ExpectedChain, ExpectedRequest, SelectorInput, OperationInput, GrantProducer, ProofProducer, BoundaryAnchorProducer, KeyTransitionProducer, AnchoredExportInput, ExpectedExport, ArchivedObject, HistoricalKeyChain, EncodedConsumptionEntry, EncodedAnchoredExport, Bounds, SigningInput, Selector, MaximaKey, } from "./v1.js";
5
+ export type { GrantFacts, EnvelopeFacts, ChainFacts, AnchorFacts, KeyTransitionFacts, AnchoredExportFacts, GrantDecoded, ProofDecoded, KeyLocator, } from "./facts.js";
6
+ export { InvalidError, ok, err, trying, fail, assert } from "./error.js";
7
+ export type { Result } from "./error.js";
8
+ export { jsonDecode, utf8Str, strUtf8 } from "./json.js";
9
+ export type { Tagged } from "./json.js";
10
+ export { jcsEncode } from "./jcs.js";
11
+ export { thumbprintRaw, thumbprintPreimage, jwkFromPublicKey, publicKeyThumbprintRaw, } from "./jwk.js";
12
+ export type { OkpPublic } from "./jwk.js";
13
+ export { sha256 } from "./ed25519.js";
14
+ export { base64urlDecode, base64urlEncode } from "./base64url.js";
15
+ export { parseSelector, selectorMatches, semanticIdentity } from "./selector.js";
16
+ export { typedProject } from "./digest.js";
@@ -0,0 +1,31 @@
1
+ // The public surface of @bounded-authority-protocol/verifier (the v1 protocol verification façade +
2
+ // versioned primitives). Re-exports the 17 façade functions + the dispatch structs + the primitives
3
+ // the public contract names (spec/bap-v1.md § Public verification contract, L266-309).
4
+ //
5
+ // No `authorized`/`decision` surface (AGENTS rule 1); every function returns Result<T> =
6
+ // Ok | Err, mirroring {:ok,value}|{:error,:invalid}. Facts are value-bearing, redacted, and
7
+ // non-authorizing.
8
+ export {
9
+ // The 17 façade functions.
10
+ untrustedKeyLocator, decodeGrant, decodeProof, decodeLocalLoopbackHttpProof, verifyGrant, checkEnvelope, checkLocalLoopbackHttpEnvelope, requestDigest, encodeConsumptionEntry, checkChain, grantSigningInput, proofSigningInput, localLoopbackHttpProofSigningInput, assembleCompact, assembleLocalLoopbackHttpCompact, boundaryAnchorSigningInput, keyTransitionSigningInput, encodeAnchoredExport, verifyHistoricalAnchor, verifyKeyTransition, verifyAnchoredExport,
11
+ // Versioned primitives the public contract names (spec/bap-v1.md L299-309).
12
+ jwkEncodePublic, jwkDecodePublic, thumbprint, uriNormalize, boundsNew, boundsMaximum, MAXIMUM_BOUNDS, MAXIMA, REQUEST_PREFIX, ROW_PREFIX, ARCHIVE_PREFIX, } from "./v1.js";
13
+ export { localLoopbackHttpUriNormalize } from "./uri.js";
14
+ // The v2 contract-major profile façade (v:2 payloads, BAP2-* domain separators, lte/gte range
15
+ // selectors per ADR 0028). Exported as a namespace: its surface intentionally mirrors the v1
16
+ // façade's names, so the module path (v2) carries the major — v2.checkEnvelope,
17
+ // v2.grantSigningInput, v2.Selector, and so on. It rejects v1 bytes exactly as v1 rejects v2
18
+ // bytes; the two majors share no wire form.
19
+ export * as v2 from "./v2.js";
20
+ // Error + Result primitives (the closed InvalidError + the Result<T> = Ok|Err shape).
21
+ export { InvalidError, ok, err, trying, fail, assert } from "./error.js";
22
+ // The tagged JSON algebra (the public data model requestDigest + selector matching consume).
23
+ export { jsonDecode, utf8Str, strUtf8 } from "./json.js";
24
+ // The bounds + JCS + thumbprint primitives (full set the public contract implies).
25
+ export { jcsEncode } from "./jcs.js";
26
+ export { thumbprintRaw, thumbprintPreimage, jwkFromPublicKey, publicKeyThumbprintRaw, } from "./jwk.js";
27
+ export { sha256 } from "./ed25519.js";
28
+ export { base64urlDecode, base64urlEncode } from "./base64url.js";
29
+ export { parseSelector, selectorMatches, semanticIdentity } from "./selector.js";
30
+ export { typedProject } from "./digest.js";
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,oGAAoG;AACpG,uFAAuF;AACvF,EAAE;AACF,yFAAyF;AACzF,4FAA4F;AAC5F,mBAAmB;AAEnB,OAAO;AACL,2BAA2B;AAC3B,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,4BAA4B,EAC5B,WAAW,EACX,aAAa,EACb,8BAA8B,EAC9B,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kCAAkC,EAClC,eAAe,EACf,gCAAgC,EAChC,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB;AACpB,4EAA4E;AAC5E,eAAe,EACf,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAC;AAEzD,8FAA8F;AAC9F,6FAA6F;AAC7F,gFAAgF;AAChF,6FAA6F;AAC7F,4CAA4C;AAC5C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AA0C9B,sFAAsF;AACtF,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzE,6FAA6F;AAC7F,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzD,mFAAmF;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Bounds } from "./bounds.js";
2
+ import { type Tagged } from "./json.js";
3
+ export declare function jcsEncode(value: Tagged, bounds?: Bounds): Uint8Array;
@@ -0,0 +1,285 @@
1
+ import { fail } from "./error.js";
2
+ import { resolve, coerceBounds, MAXIMUM_BOUNDS } from "./bounds.js";
3
+ import { strUtf8, utf8Str } from "./json.js";
4
+ // RFC 8785 JSON Canonicalization Scheme over the tagged JSON algebra (spec/bap-v1.md,
5
+ // REQ1-JSON-jcs-exact). Accepts only the tagged algebra. Enforces every JSON + output bound while
6
+ // emitting RFC 8785 bytes: exact string escaping, invalid-Unicode rejection, unsigned UTF-16 object-
7
+ // name sorting at every depth, preserved array order, and ECMAScript binary64 number text
8
+ // (-0 as 0, fixed/exponent thresholds, lowercase e).
9
+ //
10
+ // Number formatting: RFC 8785 §3.2.2 mandates the shortest representation. ECMAScript's
11
+ // Number.prototype.toString (and JSON.stringify of a number) IS the shortest round-tripping repr
12
+ // (V8/Node matches this), so integers emit as bare integers and finite floats via their JS string
13
+ // form. The tagged algebra's int/float distinction is preserved (1 → "1" as int; 1.0 → "1" as float
14
+ // would be a Float tag, but JS coerces 1.0 to 1 at the value layer — the TAG carries the distinction,
15
+ // the serialization is byte-identical for equal numeric value, matching the Elixir JCS).
16
+ export function jcsEncode(value, bounds = MAXIMUM_BOUNDS) {
17
+ // Cross-vendor F2: re-validate caller-supplied bounds (Bounds is structural; a hand-crafted override
18
+ // can widen limits past MAXIMA). Mirrors the reference's Bounds.coerce.
19
+ const b = coerceBounds(bounds);
20
+ const parts = [];
21
+ emit(value, parts, b, 0, 0);
22
+ let total = 0;
23
+ for (const p of parts)
24
+ total += p.length;
25
+ if (total > resolve(b, "jcs_bytes"))
26
+ fail("jcs: jcs_bytes bound");
27
+ const out = new Uint8Array(total);
28
+ let off = 0;
29
+ for (const p of parts) {
30
+ out.set(p, off);
31
+ off += p.length;
32
+ }
33
+ return out;
34
+ }
35
+ // Emit one tagged value as RFC 8785 bytes, enforcing every per-node resource bound DURING encode
36
+ // (mirrors jcs.ex:27-101 encode_value). Returns the updated node count. Per-node invariants:
37
+ // scalars: level <= depth (NOT <); int/float magnitude; string byte_size <= string_bytes.
38
+ // array/object: level < depth (children at level+1); length <= array_items/object_members;
39
+ // object key byte_size <= key_bytes. total_nodes incremented + checked at every node.
40
+ function emit(value, parts, bounds, level, nodes) {
41
+ const depth = resolve(bounds, "depth");
42
+ switch (value.t) {
43
+ case "null":
44
+ if (level > depth)
45
+ fail("jcs: depth bound");
46
+ parts.push(STR_NULL);
47
+ return nextNode(nodes, bounds);
48
+ case "bool":
49
+ if (level > depth)
50
+ fail("jcs: depth bound");
51
+ parts.push(value.v ? STR_TRUE : STR_FALSE);
52
+ return nextNode(nodes, bounds);
53
+ case "int":
54
+ // Cross-vendor F3: the reference guard is `when is_integer(value)` (jcs.ex:38); a non-integer
55
+ // int-tag value (1.5, or bool) must fail closed, not canonicalize. Number.isInteger rejects
56
+ // floats and booleans.
57
+ if (!Number.isInteger(value.v) || level > depth || Math.abs(value.v) > resolve(bounds, "integer_magnitude"))
58
+ fail("jcs: integer bound");
59
+ parts.push(strUtf8(formatInt(value.v)));
60
+ return nextNode(nodes, bounds);
61
+ case "float":
62
+ if (level > depth || Math.abs(value.v) > resolve(bounds, "float_magnitude"))
63
+ fail("jcs: float bound");
64
+ parts.push(strUtf8(formatFloat(value.v)));
65
+ return nextNode(nodes, bounds);
66
+ case "string":
67
+ // The decoder already validated UTF-8 + string_bytes; re-check here so a programmatically-built
68
+ // over-bound value (not from the decoder) is rejected at encode, matching jcs.ex:57-59.
69
+ // Cross-vendor (JCS UTF-8): the reference guard is `String.valid?(value)` (jcs.ex:58) which
70
+ // rejects invalid UTF-8. A programmatically-built JString with invalid bytes would otherwise
71
+ // reach escapeString → utf8Str (fatal TextDecoder) and throw TypeError past the closed-Result
72
+ // contract. Validate UTF-8 here and fail closed (Err) instead.
73
+ if (level > depth || value.v.length > resolve(bounds, "string_bytes") || !isValidUtf8(value.v))
74
+ fail("jcs: string bound");
75
+ parts.push(escapeString(value.v, bounds));
76
+ return nextNode(nodes, bounds);
77
+ case "array": {
78
+ if (level >= depth || value.v.length > resolve(bounds, "array_items"))
79
+ fail("jcs: array bound");
80
+ let n = nextNode(nodes, bounds);
81
+ parts.push(LBRACKET);
82
+ for (let i = 0; i < value.v.length; i++) {
83
+ if (i > 0)
84
+ parts.push(COMMA);
85
+ n = emit(value.v[i], parts, bounds, level + 1, n);
86
+ }
87
+ parts.push(RBRACKET);
88
+ return n;
89
+ }
90
+ case "object": {
91
+ if (level >= depth || value.v.size > resolve(bounds, "object_members"))
92
+ fail("jcs: object bound");
93
+ const keyBytes = resolve(bounds, "key_bytes");
94
+ let n = nextNode(nodes, bounds);
95
+ // RFC 8785 §3.2.3: object names sorted by unsigned UTF-16 code unit sequence.
96
+ const names = [...value.v.keys()].sort(utf16Sort);
97
+ for (const name of names) {
98
+ if (strUtf8(name).length > keyBytes)
99
+ fail("jcs: key_bytes bound");
100
+ }
101
+ parts.push(LBRACE);
102
+ for (let i = 0; i < names.length; i++) {
103
+ if (i > 0)
104
+ parts.push(COMMA);
105
+ const name = names[i];
106
+ parts.push(escapeString(strUtf8(name), bounds));
107
+ parts.push(COLON);
108
+ n = emit(value.v.get(name), parts, bounds, level + 1, n);
109
+ }
110
+ parts.push(RBRACE);
111
+ return n;
112
+ }
113
+ default: fail("jcs: unknown tag");
114
+ }
115
+ }
116
+ function nextNode(nodes, bounds) {
117
+ const next = nodes + 1;
118
+ if (next > resolve(bounds, "total_nodes"))
119
+ fail("jcs: total_nodes bound");
120
+ return next;
121
+ }
122
+ const STR_NULL = strUtf8("null");
123
+ const STR_TRUE = strUtf8("true");
124
+ const STR_FALSE = strUtf8("false");
125
+ const LBRACE = strUtf8("{");
126
+ const RBRACE = strUtf8("}");
127
+ const LBRACKET = strUtf8("[");
128
+ const RBRACKET = strUtf8("]");
129
+ const COMMA = strUtf8(",");
130
+ const COLON = strUtf8(":");
131
+ function formatInt(n) {
132
+ return String(n);
133
+ }
134
+ // RFC 8785 §3.2.2: shortest representation. JS Number stringification produces the shortest
135
+ // round-tripping decimal; JSON.stringify emits it without exponent where V8 would. Both match the
136
+ // ECMAScript binary64 text the Elixir JCS produces (which also implements §3.2.2).
137
+ function formatFloat(n) {
138
+ if (!Number.isFinite(n))
139
+ fail("jcs: non-finite float");
140
+ return JSON.stringify(n);
141
+ }
142
+ // RFC 8785 §3.2.2.1 string escaping: mandatory-escape chars (< 0x20, 0x22 ", 0x5c \, 0x7f DEL) +
143
+ // UTF-8 for the rest. The escapeString function below applies this inline.
144
+ // The short escapes per RFC 8785 §3.2.2.1 (b, f, n, r, t + the two structural " \).
145
+ const SHORT_ESCAPES = {
146
+ 0x08: "\\b",
147
+ 0x09: "\\t",
148
+ 0x0a: "\\n",
149
+ 0x0c: "\\f",
150
+ 0x0d: "\\r",
151
+ 0x22: "\\\"",
152
+ 0x5c: "\\\\",
153
+ };
154
+ // UTF-8 validity check that does NOT throw (cross-vendor JCS UTF-8): the reference's String.valid?
155
+ // (jcs.ex:58) rejects invalid UTF-8 at encode. The fatal TextDecoder in utf8Str throws TypeError on
156
+ // invalid bytes, escaping the closed-Result contract; this gate lets jcsEncode fail closed instead.
157
+ // Walks the byte stream validating leading/multi-byte sequences (RFC 3629).
158
+ function isValidUtf8(bytes) {
159
+ let i = 0;
160
+ while (i < bytes.length) {
161
+ const b0 = bytes[i];
162
+ if (b0 < 0x80) {
163
+ i++;
164
+ continue;
165
+ }
166
+ let need;
167
+ let min;
168
+ if ((b0 & 0xe0) === 0xc0) {
169
+ need = 1;
170
+ min = 0x80;
171
+ }
172
+ else if ((b0 & 0xf0) === 0xe0) {
173
+ need = 2;
174
+ min = 0x800;
175
+ }
176
+ else if ((b0 & 0xf8) === 0xf0) {
177
+ need = 3;
178
+ min = 0x10000;
179
+ }
180
+ else
181
+ return false; // invalid leading byte (continuation, or 0xf8+)
182
+ if (i + need >= bytes.length)
183
+ return false; // truncated
184
+ let cp = b0 & (0x1f >> need);
185
+ for (let j = 1; j <= need; j++) {
186
+ const bj = bytes[i + j];
187
+ if ((bj & 0xc0) !== 0x80)
188
+ return false; // not a continuation byte
189
+ cp = (cp << 6) | (bj & 0x3f);
190
+ }
191
+ if (cp < min)
192
+ return false; // over-long encoding
193
+ if (cp >= 0xd800 && cp <= 0xdfff)
194
+ return false; // lone surrogate
195
+ if (cp > 0x10ffff)
196
+ return false; // out of range
197
+ i += 1 + need;
198
+ }
199
+ return true;
200
+ }
201
+ function escapeString(bytes, bounds) {
202
+ const out = [0x22 /* " */];
203
+ // Decode UTF-8 to code points so \uXXXX escaping (for < 0x20 and lone surrogates) is correct.
204
+ const s = utf8Str(bytes);
205
+ for (let i = 0; i < s.length; i++) {
206
+ const cp = s.codePointAt(i);
207
+ if (cp > 0xffff) {
208
+ // Astral — emit the two UTF-16 surrogates as raw UTF-8 bytes (RFC 8785 keeps them, no \u).
209
+ // Actually RFC 8785 emits astral chars as their UTF-8 bytes (not \u escapes). Emit raw.
210
+ appendUtf8Bytes(cp, out);
211
+ i++; // surrogate pair consumed 2 code units
212
+ }
213
+ else if (cp < 0x20) {
214
+ const short = SHORT_ESCAPES[cp];
215
+ if (short !== undefined) {
216
+ for (let j = 0; j < short.length; j++)
217
+ out.push(short.charCodeAt(j));
218
+ }
219
+ else {
220
+ appendU(cp, out);
221
+ }
222
+ }
223
+ else if (cp === 0x22 || cp === 0x5c) {
224
+ const short = SHORT_ESCAPES[cp];
225
+ for (let j = 0; j < short.length; j++)
226
+ out.push(short.charCodeAt(j));
227
+ }
228
+ else if (cp === 0x7f) {
229
+ // DEL (0x7f): RFC 8785 serializes strings per ECMAScript JSON.stringify, which escapes only
230
+ // U+0000–U+001F plus quote (0x22) and backslash (0x5c) — so raw DEL is RFC-COMPLIANT, NOT an
231
+ // RFC deviation. The Elixir reference (the contract per AGENTS rule 7) emits RAW 0x7f here
232
+ // (jcs.ex:147 has no DEL case, so the general codepoint branch passes it through raw), and the
233
+ // SDK matches those bytes for identical signed inputs and request digests. Verified:
234
+ // Jcs.encode("x<DEL>y") -> [34,120,127,121,34].
235
+ out.push(0x7f);
236
+ }
237
+ else {
238
+ appendUtf8Bytes(cp, out);
239
+ }
240
+ }
241
+ out.push(0x22 /* " */);
242
+ const result = new Uint8Array(out);
243
+ // string_bytes bound applies to the decoded value; the escaped form can be longer. We check the
244
+ // raw bytes against string_bytes at decode time, so no re-check here.
245
+ void bounds;
246
+ return result;
247
+ }
248
+ function appendU(cp, out) {
249
+ const hex = "\\u" + cp.toString(16).padStart(4, "0");
250
+ for (let i = 0; i < hex.length; i++)
251
+ out.push(hex.charCodeAt(i));
252
+ }
253
+ function appendUtf8Bytes(cp, out) {
254
+ if (cp < 0x80)
255
+ out.push(cp);
256
+ else if (cp < 0x800) {
257
+ out.push(0xc0 | (cp >> 6));
258
+ out.push(0x80 | (cp & 0x3f));
259
+ }
260
+ else if (cp < 0x10000) {
261
+ out.push(0xe0 | (cp >> 12));
262
+ out.push(0x80 | ((cp >> 6) & 0x3f));
263
+ out.push(0x80 | (cp & 0x3f));
264
+ }
265
+ else {
266
+ // Astral code points (cp >= 0x10000) — 4-byte UTF-8 (RFC 8785 keeps astral chars as their UTF-8
267
+ // bytes, not \u escapes). The prior 3-byte-cap branch produced a malformed sequence for astral.
268
+ out.push(0xf0 | (cp >> 18));
269
+ out.push(0x80 | ((cp >> 12) & 0x3f));
270
+ out.push(0x80 | ((cp >> 6) & 0x3f));
271
+ out.push(0x80 | (cp & 0x3f));
272
+ }
273
+ }
274
+ // Unsigned UTF-16 code-unit comparison (RFC 8785 §3.2.3). Compare by char code of each UTF-16 unit.
275
+ function utf16Sort(a, b) {
276
+ const len = Math.min(a.length, b.length);
277
+ for (let i = 0; i < len; i++) {
278
+ const ca = a.charCodeAt(i);
279
+ const cb = b.charCodeAt(i);
280
+ if (ca !== cb)
281
+ return ca - cb;
282
+ }
283
+ return a.length - b.length;
284
+ }
285
+ //# sourceMappingURL=jcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jcs.js","sourceRoot":"","sources":["../../src/jcs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type Bounds } from "./bounds.js";
2
+ export type Tagged = {
3
+ readonly t: "null";
4
+ } | {
5
+ readonly t: "bool";
6
+ readonly v: boolean;
7
+ } | {
8
+ readonly t: "int";
9
+ readonly v: number;
10
+ } | {
11
+ readonly t: "float";
12
+ readonly v: number;
13
+ } | {
14
+ readonly t: "string";
15
+ readonly v: Uint8Array;
16
+ } | {
17
+ readonly t: "array";
18
+ readonly v: Tagged[];
19
+ } | {
20
+ readonly t: "object";
21
+ readonly v: ReadonlyMap<string, Tagged>;
22
+ };
23
+ export declare function jsonDecode(src: Uint8Array, bounds?: Bounds): Tagged;
24
+ export declare function utf8Str(bytes: Uint8Array): string;
25
+ export declare function strUtf8(s: string): Uint8Array;