prefix-safe-json 0.0.1-alpha.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +2 -2
  3. package/package.json +2 -1
  4. package/dist/coordinator/coordinator.d.ts +0 -53
  5. package/dist/coordinator/coordinator.d.ts.map +0 -1
  6. package/dist/coordinator/coordinator.js +0 -448
  7. package/dist/coordinator/coordinator.js.map +0 -1
  8. package/dist/coordinator/diagnostic-codes.d.ts +0 -11
  9. package/dist/coordinator/diagnostic-codes.d.ts.map +0 -1
  10. package/dist/coordinator/diagnostic-codes.js +0 -22
  11. package/dist/coordinator/diagnostic-codes.js.map +0 -1
  12. package/dist/coordinator/protocol.d.ts +0 -61
  13. package/dist/coordinator/protocol.d.ts.map +0 -1
  14. package/dist/coordinator/protocol.js +0 -2
  15. package/dist/coordinator/protocol.js.map +0 -1
  16. package/dist/coordinator/types.d.ts +0 -104
  17. package/dist/coordinator/types.d.ts.map +0 -1
  18. package/dist/coordinator/types.js +0 -7
  19. package/dist/coordinator/types.js.map +0 -1
  20. package/dist/diagnostics/codes.d.ts +0 -24
  21. package/dist/diagnostics/codes.d.ts.map +0 -1
  22. package/dist/diagnostics/codes.js +0 -28
  23. package/dist/diagnostics/codes.js.map +0 -1
  24. package/dist/diagnostics/factory.d.ts +0 -8
  25. package/dist/diagnostics/factory.d.ts.map +0 -1
  26. package/dist/diagnostics/factory.js +0 -17
  27. package/dist/diagnostics/factory.js.map +0 -1
  28. package/dist/gate/decide.d.ts +0 -27
  29. package/dist/gate/decide.d.ts.map +0 -1
  30. package/dist/gate/decide.js +0 -138
  31. package/dist/gate/decide.js.map +0 -1
  32. package/dist/gate/gate.d.ts +0 -25
  33. package/dist/gate/gate.d.ts.map +0 -1
  34. package/dist/gate/gate.js +0 -96
  35. package/dist/gate/gate.js.map +0 -1
  36. package/dist/gate/types.d.ts +0 -184
  37. package/dist/gate/types.d.ts.map +0 -1
  38. package/dist/gate/types.js +0 -2
  39. package/dist/gate/types.js.map +0 -1
  40. package/dist/grammar/frame.d.ts +0 -58
  41. package/dist/grammar/frame.d.ts.map +0 -1
  42. package/dist/grammar/frame.js +0 -87
  43. package/dist/grammar/frame.js.map +0 -1
  44. package/dist/grammar/pointer.d.ts +0 -10
  45. package/dist/grammar/pointer.d.ts.map +0 -1
  46. package/dist/grammar/pointer.js +0 -20
  47. package/dist/grammar/pointer.js.map +0 -1
  48. package/dist/grammar/stack.d.ts +0 -73
  49. package/dist/grammar/stack.d.ts.map +0 -1
  50. package/dist/grammar/stack.js +0 -168
  51. package/dist/grammar/stack.js.map +0 -1
  52. package/dist/guard/ai-sdk.d.ts +0 -48
  53. package/dist/guard/ai-sdk.d.ts.map +0 -1
  54. package/dist/guard/ai-sdk.js +0 -51
  55. package/dist/guard/ai-sdk.js.map +0 -1
  56. package/dist/guard/provider-guard.d.ts +0 -4
  57. package/dist/guard/provider-guard.d.ts.map +0 -1
  58. package/dist/guard/provider-guard.js +0 -38
  59. package/dist/guard/provider-guard.js.map +0 -1
  60. package/dist/guard/types.d.ts +0 -48
  61. package/dist/guard/types.d.ts.map +0 -1
  62. package/dist/guard/types.js +0 -2
  63. package/dist/guard/types.js.map +0 -1
  64. package/dist/index.d.ts +0 -45
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/index.js +0 -45
  67. package/dist/index.js.map +0 -1
  68. package/dist/lexer/scanner.d.ts +0 -106
  69. package/dist/lexer/scanner.d.ts.map +0 -1
  70. package/dist/lexer/scanner.js +0 -658
  71. package/dist/lexer/scanner.js.map +0 -1
  72. package/dist/lexer/states.d.ts +0 -31
  73. package/dist/lexer/states.d.ts.map +0 -1
  74. package/dist/lexer/states.js +0 -35
  75. package/dist/lexer/states.js.map +0 -1
  76. package/dist/lexer/tokens.d.ts +0 -22
  77. package/dist/lexer/tokens.d.ts.map +0 -1
  78. package/dist/lexer/tokens.js +0 -22
  79. package/dist/lexer/tokens.js.map +0 -1
  80. package/dist/limits.d.ts +0 -14
  81. package/dist/limits.d.ts.map +0 -1
  82. package/dist/limits.js +0 -23
  83. package/dist/limits.js.map +0 -1
  84. package/dist/parser.d.ts +0 -6
  85. package/dist/parser.d.ts.map +0 -1
  86. package/dist/parser.js +0 -922
  87. package/dist/parser.js.map +0 -1
  88. package/dist/providers/adapter.d.ts +0 -10
  89. package/dist/providers/adapter.d.ts.map +0 -1
  90. package/dist/providers/adapter.js +0 -2
  91. package/dist/providers/adapter.js.map +0 -1
  92. package/dist/providers/ai-sdk.d.ts +0 -58
  93. package/dist/providers/ai-sdk.d.ts.map +0 -1
  94. package/dist/providers/ai-sdk.js +0 -212
  95. package/dist/providers/ai-sdk.js.map +0 -1
  96. package/dist/providers/anthropic.d.ts +0 -45
  97. package/dist/providers/anthropic.d.ts.map +0 -1
  98. package/dist/providers/anthropic.js +0 -112
  99. package/dist/providers/anthropic.js.map +0 -1
  100. package/dist/providers/gemini.d.ts +0 -31
  101. package/dist/providers/gemini.d.ts.map +0 -1
  102. package/dist/providers/gemini.js +0 -94
  103. package/dist/providers/gemini.js.map +0 -1
  104. package/dist/providers/openai-compatible.d.ts +0 -33
  105. package/dist/providers/openai-compatible.d.ts.map +0 -1
  106. package/dist/providers/openai-compatible.js +0 -160
  107. package/dist/providers/openai-compatible.js.map +0 -1
  108. package/dist/providers/openai.d.ts +0 -55
  109. package/dist/providers/openai.d.ts.map +0 -1
  110. package/dist/providers/openai.js +0 -263
  111. package/dist/providers/openai.js.map +0 -1
  112. package/dist/providers/openrouter.d.ts +0 -35
  113. package/dist/providers/openrouter.d.ts.map +0 -1
  114. package/dist/providers/openrouter.js +0 -55
  115. package/dist/providers/openrouter.js.map +0 -1
  116. package/dist/semantic/builder.d.ts +0 -55
  117. package/dist/semantic/builder.d.ts.map +0 -1
  118. package/dist/semantic/builder.js +0 -140
  119. package/dist/semantic/builder.js.map +0 -1
  120. package/dist/semantic/events.d.ts +0 -2
  121. package/dist/semantic/events.d.ts.map +0 -1
  122. package/dist/semantic/events.js +0 -5
  123. package/dist/semantic/events.js.map +0 -1
  124. package/dist/semantic/snapshot.d.ts +0 -56
  125. package/dist/semantic/snapshot.d.ts.map +0 -1
  126. package/dist/semantic/snapshot.js +0 -230
  127. package/dist/semantic/snapshot.js.map +0 -1
  128. package/dist/types.d.ts +0 -156
  129. package/dist/types.d.ts.map +0 -1
  130. package/dist/types.js +0 -5
  131. package/dist/types.js.map +0 -1
  132. package/dist/utf8/decoder.d.ts +0 -53
  133. package/dist/utf8/decoder.d.ts.map +0 -1
  134. package/dist/utf8/decoder.js +0 -323
  135. package/dist/utf8/decoder.js.map +0 -1
package/dist/types.d.ts DELETED
@@ -1,156 +0,0 @@
1
- /** Standard JSON value type. */
2
- export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
3
- export interface JsonObject {
4
- [key: string]: JsonValue;
5
- }
6
- export type JsonArray = JsonValue[];
7
- /** Why the LLM stream ended. */
8
- export type StreamEndReason = "complete" | "length" | "network_error" | "provider_error" | "cancelled" | "unknown";
9
- /** Returned by `push()` after feeding a chunk. */
10
- export interface PushResult {
11
- /** Number of bytes accepted from this chunk. */
12
- acceptedBytes: number;
13
- /** Number of semantic events emitted during this push. */
14
- emittedEvents: number;
15
- /** Current syntactic status of the document. */
16
- syntax: SyntaxStatus;
17
- /** If true, the parser will not accept further input. */
18
- terminal: boolean;
19
- }
20
- export type SyntaxStatus = "empty" | "incomplete" | "root_complete" | "invalid";
21
- /** Immutable snapshot of parser state. */
22
- export interface ParserSnapshot {
23
- /** Whether we are still collecting or the stream is finished. */
24
- phase: "collecting" | "finished";
25
- /** Current syntactic status. */
26
- syntax: SyntaxStatus;
27
- /** JSON value built from only fully-committed fields. */
28
- stableValue?: JsonValue;
29
- /** Whether the root JSON container has been closed. */
30
- rootComplete: boolean;
31
- /**
32
- * Whether the parsed result is safe for tool execution.
33
- * True only when root is complete, stream finished normally,
34
- * no pending tokens, no fatal diagnostics, no duplicate keys,
35
- * and no structural/lossy repairs.
36
- */
37
- executable: boolean;
38
- /** Tokens still awaiting more data. */
39
- pending: readonly PendingToken[];
40
- /** Repairs applied (populated at finish). */
41
- repairs: readonly RepairAction[];
42
- /** All diagnostics emitted so far. */
43
- diagnostics: readonly Diagnostic[];
44
- /** Total bytes received via push(). */
45
- receivedBytes: number;
46
- /** Bytes successfully consumed by the parser. */
47
- consumedBytes: number;
48
- }
49
- /** A value that is in-progress and not yet committed. */
50
- export interface PendingToken {
51
- type: "string" | "number" | "literal" | "unicode_escape" | "surrogate" | "object_key";
52
- path: string;
53
- buffered: string;
54
- byteOffset: number;
55
- }
56
- /** Describes a deterministic repair applied at stream end. */
57
- export interface RepairAction {
58
- code: string;
59
- byteRange: readonly [number, number];
60
- impact: "representation_preserving" | "root_preserving" | "structural" | "lossy";
61
- description: string;
62
- }
63
- /** Structured parse diagnostic. */
64
- export interface Diagnostic {
65
- code: string;
66
- severity: "info" | "warning" | "error" | "fatal";
67
- byteOffset: number;
68
- path?: string;
69
- recoverable: boolean;
70
- message: string;
71
- }
72
- export type ParserEvent = ValueCommittedEvent | ContainerClosedEvent | RepairAppliedEvent | DiagnosticEvent | DocumentCompleteEvent | StreamFinishedEvent;
73
- export interface ValueCommittedEvent {
74
- type: "value_committed";
75
- sequence: number;
76
- path: string;
77
- operation: "add";
78
- value: JsonValue;
79
- byteRange: readonly [number, number];
80
- }
81
- export interface ContainerClosedEvent {
82
- type: "container_closed";
83
- sequence: number;
84
- path: string;
85
- container: "object" | "array";
86
- }
87
- export interface RepairAppliedEvent {
88
- type: "repair_applied";
89
- sequence: number;
90
- repair: RepairAction;
91
- }
92
- export interface DiagnosticEvent {
93
- type: "diagnostic";
94
- sequence: number;
95
- diagnostic: Diagnostic;
96
- }
97
- export interface DocumentCompleteEvent {
98
- type: "document_complete";
99
- sequence: number;
100
- executable: boolean;
101
- }
102
- export interface StreamFinishedEvent {
103
- type: "stream_finished";
104
- sequence: number;
105
- outcome: "valid" | "truncated" | "salvaged" | "invalid";
106
- }
107
- /** Returned by `finish()`. */
108
- export interface FinalResult {
109
- /** Final syntactic status. */
110
- syntax: SyntaxStatus;
111
- /** Overall parse outcome. */
112
- outcome: "valid" | "truncated" | "salvaged" | "invalid";
113
- /** JSON value from committed fields only. */
114
- stableValue?: JsonValue;
115
- /** Whether the result is safe for tool execution. */
116
- executable: boolean;
117
- /** All repairs applied during finalization. */
118
- repairs: readonly RepairAction[];
119
- /** All diagnostics. */
120
- diagnostics: readonly Diagnostic[];
121
- /** Total received bytes. */
122
- receivedBytes: number;
123
- /** Consumed bytes. */
124
- consumedBytes: number;
125
- }
126
- /** The incremental parser API. */
127
- export interface IncrementalJsonParser {
128
- /** Feed a chunk of data. */
129
- push(chunk: string | Uint8Array): PushResult;
130
- /** Get a snapshot of the current parser state. */
131
- snapshot(): ParserSnapshot;
132
- /** Drain and return all unconsumed events, clearing the queue. */
133
- drainEvents(): readonly ParserEvent[];
134
- /** Signal stream completion. Must be called exactly once. */
135
- finish(meta?: {
136
- reason?: StreamEndReason;
137
- providerReason?: string;
138
- }): FinalResult;
139
- }
140
- export interface RepairOptions {
141
- readonly rawControlCharacters: "reject" | "escape";
142
- readonly trailingData: "reject" | "isolate";
143
- readonly closeContainersAtFinish: "disabled" | "safe-only";
144
- }
145
- export interface ParserOptions {
146
- limits?: Partial<ParserLimits>;
147
- repairs?: Partial<RepairOptions>;
148
- }
149
- export interface ParserLimits {
150
- maxInputBytes: number;
151
- maxDepth: number;
152
- maxStringBytes: number;
153
- maxQueuedEvents: number;
154
- maxTrailingDataBytes: number;
155
- }
156
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js DELETED
@@ -1,5 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Public Types for prefix-safe-json
3
- // ---------------------------------------------------------------------------
4
- export {};
5
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E"}
@@ -1,53 +0,0 @@
1
- /** Result of decoding a chunk of bytes. */
2
- export interface DecodeResult {
3
- /** Decoded code points as a string. */
4
- text: string;
5
- /** Number of bytes consumed (may be less than input if trailing incomplete sequence). */
6
- consumed: number;
7
- /** Errors encountered during decoding. */
8
- errors: Utf8Error[];
9
- /** True if BOM was detected and stripped during this chunk. */
10
- strippedBom: boolean;
11
- }
12
- export interface Utf8Error {
13
- kind: "invalid_start_byte" | "invalid_continuation" | "overlong" | "out_of_range";
14
- byteOffset: number;
15
- }
16
- /**
17
- * Incremental UTF-8 decoder that handles multi-byte characters
18
- * split across chunk boundaries.
19
- */
20
- export declare class Utf8Decoder {
21
- /** Pending bytes from an incomplete multi-byte sequence. */
22
- private pending;
23
- /** Expected total length of the current multi-byte sequence. */
24
- private pendingExpected;
25
- /** Total bytes processed across all push() calls. */
26
- private totalOffset;
27
- private bomBuffer;
28
- private checkedForBom;
29
- /**
30
- * Decode a chunk of bytes, returning decoded text and any errors.
31
- * Incomplete trailing multi-byte sequences are buffered for the next call.
32
- */
33
- decode(bytes: Uint8Array): DecodeResult;
34
- /**
35
- * Check if there are buffered incomplete bytes.
36
- */
37
- hasIncomplete(): boolean;
38
- /**
39
- * Get the byte offset where the incomplete sequence started.
40
- */
41
- incompleteByteOffset(): number;
42
- /**
43
- * Decode a complete multi-byte UTF-8 sequence into a code point.
44
- * Returns an error for invalid continuation, overlong, or out-of-range sequences.
45
- */
46
- private decodeSequence;
47
- }
48
- /**
49
- * Convert a string to its UTF-8 byte representation.
50
- * Utility for tests and string-mode push().
51
- */
52
- export declare function stringToUtf8(str: string): Uint8Array;
53
- //# sourceMappingURL=decoder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/utf8/decoder.ts"],"names":[],"mappings":"AAeA,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EACA,oBAAoB,GACpB,sBAAsB,GACtB,UAAU,GACV,cAAc,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,4DAA4D;IAC5D,OAAO,CAAC,OAAO,CAAgB;IAC/B,gEAAgE;IAChE,OAAO,CAAC,eAAe,CAAK;IAC5B,qDAAqD;IACrD,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAS;IAE9B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY;IAyMvC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAK9B;;;OAGG;IACH,OAAO,CAAC,cAAc;CA6DvB;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAGpD"}
@@ -1,323 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Incremental UTF-8 Decoder
3
- // ---------------------------------------------------------------------------
4
- //
5
- // Processes Uint8Array chunks and yields code points one at a time.
6
- // Handles multi-byte characters split across chunk boundaries by buffering
7
- // incomplete trailing bytes until the next push().
8
- //
9
- // Design decisions:
10
- // - Does NOT silently replace invalid bytes with U+FFFD
11
- // - Rejects overlong encodings
12
- // - Reports invalid continuation bytes
13
- // - Truncated sequences at finish() are reportable
14
- // ---------------------------------------------------------------------------
15
- /**
16
- * Incremental UTF-8 decoder that handles multi-byte characters
17
- * split across chunk boundaries.
18
- */
19
- export class Utf8Decoder {
20
- /** Pending bytes from an incomplete multi-byte sequence. */
21
- pending = [];
22
- /** Expected total length of the current multi-byte sequence. */
23
- pendingExpected = 0;
24
- /** Total bytes processed across all push() calls. */
25
- totalOffset = 0;
26
- bomBuffer = [];
27
- checkedForBom = false;
28
- /**
29
- * Decode a chunk of bytes, returning decoded text and any errors.
30
- * Incomplete trailing multi-byte sequences are buffered for the next call.
31
- */
32
- decode(bytes) {
33
- const errors = [];
34
- const codePoints = [];
35
- let strippedBom = false;
36
- let i = 0;
37
- // Handle BOM check at the very beginning of the stream
38
- if (!this.checkedForBom) {
39
- while (this.bomBuffer.length < 3 && i < bytes.length) {
40
- this.bomBuffer.push(bytes[i]);
41
- i++;
42
- }
43
- const isBomPrefix = (this.bomBuffer[0] === 0xef) &&
44
- (this.bomBuffer.length < 2 || this.bomBuffer[1] === 0xbb) &&
45
- (this.bomBuffer.length < 3 || this.bomBuffer[2] === 0xbf);
46
- if (isBomPrefix && this.bomBuffer.length < 3) {
47
- // Still possibly a BOM, wait for more data
48
- return { text: "", consumed: i, errors, strippedBom: false };
49
- }
50
- this.checkedForBom = true;
51
- let bufferToProcess = new Uint8Array();
52
- if (this.bomBuffer.length >= 3 &&
53
- this.bomBuffer[0] === 0xef &&
54
- this.bomBuffer[1] === 0xbb &&
55
- this.bomBuffer[2] === 0xbf) {
56
- strippedBom = true;
57
- this.totalOffset += 3;
58
- // The remaining bytes in bomBuffer (if any) need to be processed
59
- const remainingInBomBuffer = this.bomBuffer.slice(3);
60
- const remainingInBytes = bytes.slice(i);
61
- bufferToProcess = new Uint8Array(remainingInBomBuffer.length + remainingInBytes.length);
62
- bufferToProcess.set(remainingInBomBuffer);
63
- bufferToProcess.set(remainingInBytes, remainingInBomBuffer.length);
64
- }
65
- else {
66
- // Not a BOM. Process the whole bomBuffer + remaining bytes.
67
- const remainingInBytes = bytes.slice(i);
68
- bufferToProcess = new Uint8Array(this.bomBuffer.length + remainingInBytes.length);
69
- bufferToProcess.set(this.bomBuffer);
70
- bufferToProcess.set(remainingInBytes, this.bomBuffer.length);
71
- }
72
- // Reset i and swap bytes to the reconstructed buffer
73
- i = 0;
74
- bytes = bufferToProcess;
75
- }
76
- const startOffset = this.totalOffset;
77
- // If we have pending bytes from a previous chunk, try to complete the sequence
78
- if (this.pending.length > 0) {
79
- let brokenByInvalidContinuation = false;
80
- while (i < bytes.length && this.pending.length < this.pendingExpected) {
81
- const b = bytes[i];
82
- if ((b & 0xc0) !== 0x80) {
83
- // Not a valid continuation byte — the pending sequence is broken
84
- errors.push({
85
- kind: "invalid_continuation",
86
- byteOffset: startOffset - this.pending.length,
87
- });
88
- this.pending = [];
89
- this.pendingExpected = 0;
90
- brokenByInvalidContinuation = true;
91
- // Don't consume this byte — it might be a valid start byte
92
- break;
93
- }
94
- this.pending.push(b);
95
- i++;
96
- this.totalOffset++;
97
- }
98
- // brokenByInvalidContinuation resets pending.length/pendingExpected to
99
- // the same value (0), which would otherwise make the check below
100
- // read as "0 of 0 bytes needed - sequence complete" and spuriously
101
- // decode an empty byte array, producing a second, bogus diagnostic
102
- // alongside the invalid_continuation one already pushed above.
103
- if (!brokenByInvalidContinuation && this.pending.length === this.pendingExpected) {
104
- // We have a complete sequence — decode it
105
- const result = this.decodeSequence(this.pending, startOffset - (this.pending.length - (i - 0)));
106
- if (result.error) {
107
- errors.push(result.error);
108
- }
109
- else {
110
- codePoints.push(result.codePoint);
111
- }
112
- this.pending = [];
113
- this.pendingExpected = 0;
114
- }
115
- else if (!brokenByInvalidContinuation && i >= bytes.length) {
116
- // Still incomplete — wait for more data
117
- const consumed = this.totalOffset - startOffset;
118
- return { text: "", consumed, errors, strippedBom };
119
- }
120
- }
121
- // Process remaining bytes
122
- while (i < bytes.length) {
123
- const b = bytes[i];
124
- const seqOffset = this.totalOffset;
125
- if (b <= 0x7f) {
126
- // Single-byte ASCII
127
- codePoints.push(b);
128
- i++;
129
- this.totalOffset++;
130
- }
131
- else if ((b & 0xe0) === 0xc0) {
132
- // 2-byte sequence
133
- const needed = 2;
134
- if (i + needed <= bytes.length) {
135
- const seq = [b, bytes[i + 1]];
136
- const result = this.decodeSequence(seq, seqOffset);
137
- if (result.error) {
138
- errors.push(result.error);
139
- i++;
140
- this.totalOffset++;
141
- }
142
- else {
143
- codePoints.push(result.codePoint);
144
- i += needed;
145
- this.totalOffset += needed;
146
- }
147
- }
148
- else {
149
- // Incomplete at end of chunk — buffer it
150
- this.pendingExpected = needed;
151
- this.pending = [];
152
- for (let j = i; j < bytes.length; j++) {
153
- this.pending.push(bytes[j]);
154
- }
155
- this.totalOffset += bytes.length - i;
156
- i = bytes.length;
157
- }
158
- }
159
- else if ((b & 0xf0) === 0xe0) {
160
- // 3-byte sequence
161
- const needed = 3;
162
- if (i + needed <= bytes.length) {
163
- const seq = [b, bytes[i + 1], bytes[i + 2]];
164
- const result = this.decodeSequence(seq, seqOffset);
165
- if (result.error) {
166
- errors.push(result.error);
167
- i++;
168
- this.totalOffset++;
169
- }
170
- else {
171
- codePoints.push(result.codePoint);
172
- i += needed;
173
- this.totalOffset += needed;
174
- }
175
- }
176
- else {
177
- this.pendingExpected = needed;
178
- this.pending = [];
179
- for (let j = i; j < bytes.length; j++) {
180
- this.pending.push(bytes[j]);
181
- }
182
- this.totalOffset += bytes.length - i;
183
- i = bytes.length;
184
- }
185
- }
186
- else if ((b & 0xf8) === 0xf0) {
187
- // 4-byte sequence
188
- const needed = 4;
189
- if (i + needed <= bytes.length) {
190
- const seq = [b, bytes[i + 1], bytes[i + 2], bytes[i + 3]];
191
- const result = this.decodeSequence(seq, seqOffset);
192
- if (result.error) {
193
- errors.push(result.error);
194
- i++;
195
- this.totalOffset++;
196
- }
197
- else {
198
- codePoints.push(result.codePoint);
199
- i += needed;
200
- this.totalOffset += needed;
201
- }
202
- }
203
- else {
204
- this.pendingExpected = needed;
205
- this.pending = [];
206
- for (let j = i; j < bytes.length; j++) {
207
- this.pending.push(bytes[j]);
208
- }
209
- this.totalOffset += bytes.length - i;
210
- i = bytes.length;
211
- }
212
- }
213
- else {
214
- // Invalid start byte (0x80-0xBF or 0xF8+)
215
- errors.push({
216
- kind: "invalid_start_byte",
217
- byteOffset: seqOffset,
218
- });
219
- i++;
220
- this.totalOffset++;
221
- }
222
- }
223
- const text = codePointsToString(codePoints);
224
- const consumed = this.totalOffset - startOffset;
225
- return { text, consumed, errors, strippedBom };
226
- }
227
- /**
228
- * Check if there are buffered incomplete bytes.
229
- */
230
- hasIncomplete() {
231
- return this.pending.length > 0;
232
- }
233
- /**
234
- * Get the byte offset where the incomplete sequence started.
235
- */
236
- incompleteByteOffset() {
237
- return this.totalOffset - this.pending.length;
238
- }
239
- /**
240
- * Decode a complete multi-byte UTF-8 sequence into a code point.
241
- * Returns an error for invalid continuation, overlong, or out-of-range sequences.
242
- */
243
- decodeSequence(seq, offset) {
244
- const len = seq.length;
245
- // Validate continuation bytes
246
- for (let i = 1; i < len; i++) {
247
- if ((seq[i] & 0xc0) !== 0x80) {
248
- return {
249
- codePoint: 0,
250
- error: { kind: "invalid_continuation", byteOffset: offset },
251
- };
252
- }
253
- }
254
- let codePoint;
255
- let minCodePoint;
256
- if (len === 2) {
257
- codePoint = ((seq[0] & 0x1f) << 6) | (seq[1] & 0x3f);
258
- minCodePoint = 0x80;
259
- }
260
- else if (len === 3) {
261
- codePoint =
262
- ((seq[0] & 0x0f) << 12) |
263
- ((seq[1] & 0x3f) << 6) |
264
- (seq[2] & 0x3f);
265
- minCodePoint = 0x800;
266
- }
267
- else {
268
- // len === 4
269
- codePoint =
270
- ((seq[0] & 0x07) << 18) |
271
- ((seq[1] & 0x3f) << 12) |
272
- ((seq[2] & 0x3f) << 6) |
273
- (seq[3] & 0x3f);
274
- minCodePoint = 0x10000;
275
- }
276
- // Check overlong encoding
277
- if (codePoint < minCodePoint) {
278
- return {
279
- codePoint: 0,
280
- error: { kind: "overlong", byteOffset: offset },
281
- };
282
- }
283
- // Check valid Unicode range. Surrogate halves (U+D800-U+DFFF) are not
284
- // valid Unicode scalar values and must never appear directly encoded in
285
- // UTF-8 (RFC 3629) - they exist only as a UTF-16 encoding artifact. A
286
- // 3-byte sequence can arithmetically land in this range (e.g. ED A0 80
287
- // decodes to U+D800) without tripping the overlong or >0x10FFFF checks,
288
- // so it needs its own check.
289
- if (codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)) {
290
- return {
291
- codePoint: 0,
292
- error: { kind: "out_of_range", byteOffset: offset },
293
- };
294
- }
295
- return { codePoint };
296
- }
297
- }
298
- /**
299
- * Build a string from an array of code points without spreading the whole
300
- * array as call arguments — a single-call spread hits engine argument-count
301
- * limits (RangeError: Maximum call stack size exceeded) once codePoints
302
- * grows past roughly 100k entries, which a single large push() can trigger.
303
- */
304
- function codePointsToString(codePoints) {
305
- const CHUNK_SIZE = 8192;
306
- if (codePoints.length <= CHUNK_SIZE) {
307
- return String.fromCodePoint(...codePoints);
308
- }
309
- let text = "";
310
- for (let i = 0; i < codePoints.length; i += CHUNK_SIZE) {
311
- text += String.fromCodePoint(...codePoints.slice(i, i + CHUNK_SIZE));
312
- }
313
- return text;
314
- }
315
- /**
316
- * Convert a string to its UTF-8 byte representation.
317
- * Utility for tests and string-mode push().
318
- */
319
- export function stringToUtf8(str) {
320
- const encoder = new TextEncoder();
321
- return encoder.encode(str);
322
- }
323
- //# sourceMappingURL=decoder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/utf8/decoder.ts"],"names":[],"mappings":"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"}