prefix-safe-json 0.1.0 → 0.1.1
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/dist/coordinator/coordinator.d.ts +53 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +448 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/diagnostic-codes.d.ts +11 -0
- package/dist/coordinator/diagnostic-codes.d.ts.map +1 -0
- package/dist/coordinator/diagnostic-codes.js +22 -0
- package/dist/coordinator/diagnostic-codes.js.map +1 -0
- package/dist/coordinator/protocol.d.ts +61 -0
- package/dist/coordinator/protocol.d.ts.map +1 -0
- package/dist/coordinator/protocol.js +2 -0
- package/dist/coordinator/protocol.js.map +1 -0
- package/dist/coordinator/types.d.ts +104 -0
- package/dist/coordinator/types.d.ts.map +1 -0
- package/dist/coordinator/types.js +7 -0
- package/dist/coordinator/types.js.map +1 -0
- package/dist/diagnostics/codes.d.ts +24 -0
- package/dist/diagnostics/codes.d.ts.map +1 -0
- package/dist/diagnostics/codes.js +28 -0
- package/dist/diagnostics/codes.js.map +1 -0
- package/dist/diagnostics/factory.d.ts +8 -0
- package/dist/diagnostics/factory.d.ts.map +1 -0
- package/dist/diagnostics/factory.js +17 -0
- package/dist/diagnostics/factory.js.map +1 -0
- package/dist/gate/decide.d.ts +27 -0
- package/dist/gate/decide.d.ts.map +1 -0
- package/dist/gate/decide.js +138 -0
- package/dist/gate/decide.js.map +1 -0
- package/dist/gate/gate.d.ts +25 -0
- package/dist/gate/gate.d.ts.map +1 -0
- package/dist/gate/gate.js +96 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/types.d.ts +184 -0
- package/dist/gate/types.d.ts.map +1 -0
- package/dist/gate/types.js +2 -0
- package/dist/gate/types.js.map +1 -0
- package/dist/grammar/frame.d.ts +58 -0
- package/dist/grammar/frame.d.ts.map +1 -0
- package/dist/grammar/frame.js +87 -0
- package/dist/grammar/frame.js.map +1 -0
- package/dist/grammar/pointer.d.ts +10 -0
- package/dist/grammar/pointer.d.ts.map +1 -0
- package/dist/grammar/pointer.js +20 -0
- package/dist/grammar/pointer.js.map +1 -0
- package/dist/grammar/stack.d.ts +73 -0
- package/dist/grammar/stack.d.ts.map +1 -0
- package/dist/grammar/stack.js +168 -0
- package/dist/grammar/stack.js.map +1 -0
- package/dist/guard/ai-sdk.d.ts +48 -0
- package/dist/guard/ai-sdk.d.ts.map +1 -0
- package/dist/guard/ai-sdk.js +51 -0
- package/dist/guard/ai-sdk.js.map +1 -0
- package/dist/guard/provider-guard.d.ts +4 -0
- package/dist/guard/provider-guard.d.ts.map +1 -0
- package/dist/guard/provider-guard.js +38 -0
- package/dist/guard/provider-guard.js.map +1 -0
- package/dist/guard/types.d.ts +48 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +2 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/scanner.d.ts +106 -0
- package/dist/lexer/scanner.d.ts.map +1 -0
- package/dist/lexer/scanner.js +658 -0
- package/dist/lexer/scanner.js.map +1 -0
- package/dist/lexer/states.d.ts +31 -0
- package/dist/lexer/states.d.ts.map +1 -0
- package/dist/lexer/states.js +35 -0
- package/dist/lexer/states.js.map +1 -0
- package/dist/lexer/tokens.d.ts +22 -0
- package/dist/lexer/tokens.d.ts.map +1 -0
- package/dist/lexer/tokens.js +22 -0
- package/dist/lexer/tokens.js.map +1 -0
- package/dist/limits.d.ts +14 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +23 -0
- package/dist/limits.js.map +1 -0
- package/dist/parser.d.ts +6 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +922 -0
- package/dist/parser.js.map +1 -0
- package/dist/providers/adapter.d.ts +10 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +2 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/ai-sdk.d.ts +58 -0
- package/dist/providers/ai-sdk.d.ts.map +1 -0
- package/dist/providers/ai-sdk.js +212 -0
- package/dist/providers/ai-sdk.js.map +1 -0
- package/dist/providers/anthropic.d.ts +45 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +112 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +31 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +94 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +33 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +160 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai.d.ts +55 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +263 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +35 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +55 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/semantic/builder.d.ts +55 -0
- package/dist/semantic/builder.d.ts.map +1 -0
- package/dist/semantic/builder.js +140 -0
- package/dist/semantic/builder.js.map +1 -0
- package/dist/semantic/events.d.ts +2 -0
- package/dist/semantic/events.d.ts.map +1 -0
- package/dist/semantic/events.js +5 -0
- package/dist/semantic/events.js.map +1 -0
- package/dist/semantic/snapshot.d.ts +56 -0
- package/dist/semantic/snapshot.d.ts.map +1 -0
- package/dist/semantic/snapshot.js +230 -0
- package/dist/semantic/snapshot.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utf8/decoder.d.ts +53 -0
- package/dist/utf8/decoder.d.ts.map +1 -0
- package/dist/utf8/decoder.js +323 -0
- package/dist/utf8/decoder.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProviderName, NormalizedToolStreamEvent, StreamEndReason } from "../coordinator/protocol.js";
|
|
2
|
+
import { ProviderStreamAdapter } from "./adapter.js";
|
|
3
|
+
export interface OpenRouterChoice {
|
|
4
|
+
index?: number;
|
|
5
|
+
delta?: {
|
|
6
|
+
tool_calls?: Array<{
|
|
7
|
+
index?: number;
|
|
8
|
+
id?: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
function?: {
|
|
11
|
+
name?: string;
|
|
12
|
+
arguments?: string;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
reasoning?: string;
|
|
16
|
+
};
|
|
17
|
+
finish_reason?: string | null;
|
|
18
|
+
error?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface OpenRouterEvent {
|
|
21
|
+
choices?: OpenRouterChoice[];
|
|
22
|
+
error?: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare class OpenRouterStreamAdapter implements ProviderStreamAdapter<unknown> {
|
|
25
|
+
readonly provider: ProviderName;
|
|
26
|
+
private sequence;
|
|
27
|
+
private compatibleAdapter;
|
|
28
|
+
private finished;
|
|
29
|
+
push(rawEvent: unknown): readonly NormalizedToolStreamEvent[];
|
|
30
|
+
finish(meta?: {
|
|
31
|
+
reason?: StreamEndReason;
|
|
32
|
+
providerReason?: string;
|
|
33
|
+
}): readonly NormalizedToolStreamEvent[];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAClD,CAAC,CAAC;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,uBAAwB,YAAW,qBAAqB,CAAC,OAAO,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAK;IAGrB,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAS;IAEzB,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,yBAAyB,EAAE;IA4C7D,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,yBAAyB,EAAE;CAO3G"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { OpenAICompatibleStreamAdapter } from "./openai-compatible.js";
|
|
2
|
+
export class OpenRouterStreamAdapter {
|
|
3
|
+
provider = "openrouter";
|
|
4
|
+
sequence = 0;
|
|
5
|
+
// Delegate standard tool_call formats to compatible adapter
|
|
6
|
+
compatibleAdapter = new OpenAICompatibleStreamAdapter();
|
|
7
|
+
finished = false;
|
|
8
|
+
push(rawEvent) {
|
|
9
|
+
if (this.finished)
|
|
10
|
+
return [];
|
|
11
|
+
const events = [];
|
|
12
|
+
if (!rawEvent || typeof rawEvent !== "object") {
|
|
13
|
+
events.push({
|
|
14
|
+
type: "provider_diagnostic",
|
|
15
|
+
sequence: ++this.sequence,
|
|
16
|
+
provider: this.provider,
|
|
17
|
+
code: "E_PROVIDER_EVENT_MALFORMED",
|
|
18
|
+
severity: "error",
|
|
19
|
+
message: "Raw event is not an object",
|
|
20
|
+
});
|
|
21
|
+
return events;
|
|
22
|
+
}
|
|
23
|
+
const chunk = rawEvent;
|
|
24
|
+
// Check for provider-level errors
|
|
25
|
+
if (chunk.error) {
|
|
26
|
+
events.push({
|
|
27
|
+
type: "provider_diagnostic",
|
|
28
|
+
sequence: ++this.sequence,
|
|
29
|
+
provider: this.provider,
|
|
30
|
+
code: "E_PROVIDER_ERROR",
|
|
31
|
+
severity: "error",
|
|
32
|
+
message: typeof chunk.error === "string" ? chunk.error : JSON.stringify(chunk.error)
|
|
33
|
+
});
|
|
34
|
+
const compatibleEvents = this.compatibleAdapter.finish({ reason: "provider_error", providerReason: "error" });
|
|
35
|
+
for (const e of compatibleEvents) {
|
|
36
|
+
events.push({ ...e, provider: this.provider, sequence: ++this.sequence });
|
|
37
|
+
}
|
|
38
|
+
this.finished = true;
|
|
39
|
+
return events;
|
|
40
|
+
}
|
|
41
|
+
const compatibleEvents = this.compatibleAdapter.push(chunk);
|
|
42
|
+
for (const e of compatibleEvents) {
|
|
43
|
+
events.push({ ...e, provider: this.provider, sequence: ++this.sequence });
|
|
44
|
+
}
|
|
45
|
+
return events;
|
|
46
|
+
}
|
|
47
|
+
finish(meta) {
|
|
48
|
+
if (this.finished)
|
|
49
|
+
return [];
|
|
50
|
+
this.finished = true;
|
|
51
|
+
const compatibleEvents = this.compatibleAdapter.finish(meta);
|
|
52
|
+
return compatibleEvents.map(e => ({ ...e, provider: this.provider, sequence: ++this.sequence }));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAsBvE,MAAM,OAAO,uBAAuB;IACzB,QAAQ,GAAiB,YAAY,CAAC;IACvC,QAAQ,GAAG,CAAC,CAAC;IAErB,4DAA4D;IACpD,iBAAiB,GAAG,IAAI,6BAA6B,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC;IAEzB,IAAI,CAAC,QAAiB;QACpB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAgC,EAAE,CAAC;QAE/C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,4BAA4B;gBAClC,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,QAA2B,CAAC;QAE1C,kCAAkC;QAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;aACrF,CAAC,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9G,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,OAAO,MAAM,CAAC;QACjB,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAA4D;QACjE,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ParserEvent, JsonValue, Diagnostic, RepairAction } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages the monotonic event queue.
|
|
4
|
+
* Events are never retracted once emitted.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EventBuilder {
|
|
7
|
+
private queue;
|
|
8
|
+
private sequence;
|
|
9
|
+
private maxQueued;
|
|
10
|
+
private terminal;
|
|
11
|
+
constructor(maxQueuedEvents: number);
|
|
12
|
+
/** Current sequence number. */
|
|
13
|
+
get currentSequence(): number;
|
|
14
|
+
get isTerminal(): boolean;
|
|
15
|
+
/** Number of events in the queue. */
|
|
16
|
+
get queueLength(): number;
|
|
17
|
+
/**
|
|
18
|
+
* Emit a value_committed event.
|
|
19
|
+
*/
|
|
20
|
+
emitValueCommitted(path: string, value: JsonValue, byteRange: readonly [number, number]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Emit a container_closed event.
|
|
23
|
+
*/
|
|
24
|
+
emitContainerClosed(path: string, container: "object" | "array"): void;
|
|
25
|
+
/**
|
|
26
|
+
* Emit a repair_applied event.
|
|
27
|
+
*/
|
|
28
|
+
emitRepairApplied(repair: RepairAction): void;
|
|
29
|
+
/**
|
|
30
|
+
* Emit a diagnostic event.
|
|
31
|
+
*/
|
|
32
|
+
emitDiagnostic(diagnostic: Diagnostic): void;
|
|
33
|
+
/**
|
|
34
|
+
* Emit a document_complete event.
|
|
35
|
+
*/
|
|
36
|
+
emitDocumentComplete(executable: boolean): void;
|
|
37
|
+
/**
|
|
38
|
+
* Emit a stream_finished event.
|
|
39
|
+
*/
|
|
40
|
+
emitStreamFinished(outcome: "valid" | "truncated" | "salvaged" | "invalid"): void;
|
|
41
|
+
/**
|
|
42
|
+
* Drain all pending events and clear the queue.
|
|
43
|
+
* Returns a frozen array.
|
|
44
|
+
*/
|
|
45
|
+
drain(): readonly ParserEvent[];
|
|
46
|
+
/**
|
|
47
|
+
* Get the number of events emitted during the current push cycle.
|
|
48
|
+
* Call resetPushCount() before push processing.
|
|
49
|
+
*/
|
|
50
|
+
private pushEmitCount;
|
|
51
|
+
resetPushCount(): void;
|
|
52
|
+
get emittedDuringPush(): number;
|
|
53
|
+
private enqueue;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/semantic/builder.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,eAAe,EAAE,MAAM;IAInC,+BAA+B;IAC/B,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,qCAAqC;IACrC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,IAAI;IAWP;;OAEG;IACH,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,QAAQ,GAAG,OAAO,GAC5B,IAAI;IASP;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAQ7C;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAQ5C;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAQ/C;;OAEG;IACH,kBAAkB,CAChB,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GACtD,IAAI;IAQP;;;OAGG;IACH,KAAK,IAAI,SAAS,WAAW,EAAE;IAM/B;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAK;IAE1B,cAAc,IAAI,IAAI;IAItB,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,OAAO,CAAC,OAAO;CAwBhB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Semantic Event Builder
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
//
|
|
5
|
+
// Accumulates parser events and manages the event queue.
|
|
6
|
+
// Events are emitted monotonically with increasing sequence numbers.
|
|
7
|
+
// drainEvents() returns pending events and clears the queue.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Manages the monotonic event queue.
|
|
11
|
+
* Events are never retracted once emitted.
|
|
12
|
+
*/
|
|
13
|
+
export class EventBuilder {
|
|
14
|
+
queue = [];
|
|
15
|
+
sequence = 0;
|
|
16
|
+
maxQueued;
|
|
17
|
+
terminal = false;
|
|
18
|
+
constructor(maxQueuedEvents) {
|
|
19
|
+
this.maxQueued = maxQueuedEvents;
|
|
20
|
+
}
|
|
21
|
+
/** Current sequence number. */
|
|
22
|
+
get currentSequence() {
|
|
23
|
+
return this.sequence;
|
|
24
|
+
}
|
|
25
|
+
get isTerminal() {
|
|
26
|
+
return this.terminal;
|
|
27
|
+
}
|
|
28
|
+
/** Number of events in the queue. */
|
|
29
|
+
get queueLength() {
|
|
30
|
+
return this.queue.length;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Emit a value_committed event.
|
|
34
|
+
*/
|
|
35
|
+
emitValueCommitted(path, value, byteRange) {
|
|
36
|
+
this.enqueue({
|
|
37
|
+
type: "value_committed",
|
|
38
|
+
sequence: this.sequence++,
|
|
39
|
+
path,
|
|
40
|
+
operation: "add",
|
|
41
|
+
value,
|
|
42
|
+
byteRange,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Emit a container_closed event.
|
|
47
|
+
*/
|
|
48
|
+
emitContainerClosed(path, container) {
|
|
49
|
+
this.enqueue({
|
|
50
|
+
type: "container_closed",
|
|
51
|
+
sequence: this.sequence++,
|
|
52
|
+
path,
|
|
53
|
+
container,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emit a repair_applied event.
|
|
58
|
+
*/
|
|
59
|
+
emitRepairApplied(repair) {
|
|
60
|
+
this.enqueue({
|
|
61
|
+
type: "repair_applied",
|
|
62
|
+
sequence: this.sequence++,
|
|
63
|
+
repair,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Emit a diagnostic event.
|
|
68
|
+
*/
|
|
69
|
+
emitDiagnostic(diagnostic) {
|
|
70
|
+
this.enqueue({
|
|
71
|
+
type: "diagnostic",
|
|
72
|
+
sequence: this.sequence++,
|
|
73
|
+
diagnostic,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Emit a document_complete event.
|
|
78
|
+
*/
|
|
79
|
+
emitDocumentComplete(executable) {
|
|
80
|
+
this.enqueue({
|
|
81
|
+
type: "document_complete",
|
|
82
|
+
sequence: this.sequence++,
|
|
83
|
+
executable,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Emit a stream_finished event.
|
|
88
|
+
*/
|
|
89
|
+
emitStreamFinished(outcome) {
|
|
90
|
+
this.enqueue({
|
|
91
|
+
type: "stream_finished",
|
|
92
|
+
sequence: this.sequence++,
|
|
93
|
+
outcome,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Drain all pending events and clear the queue.
|
|
98
|
+
* Returns a frozen array.
|
|
99
|
+
*/
|
|
100
|
+
drain() {
|
|
101
|
+
const events = this.queue;
|
|
102
|
+
this.queue = [];
|
|
103
|
+
return Object.freeze(events);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the number of events emitted during the current push cycle.
|
|
107
|
+
* Call resetPushCount() before push processing.
|
|
108
|
+
*/
|
|
109
|
+
pushEmitCount = 0;
|
|
110
|
+
resetPushCount() {
|
|
111
|
+
this.pushEmitCount = 0;
|
|
112
|
+
}
|
|
113
|
+
get emittedDuringPush() {
|
|
114
|
+
return this.pushEmitCount;
|
|
115
|
+
}
|
|
116
|
+
enqueue(event) {
|
|
117
|
+
if (this.terminal)
|
|
118
|
+
return; // Stop accepting semantic progress, don't report as emitted
|
|
119
|
+
if (this.queue.length >= this.maxQueued) {
|
|
120
|
+
this.terminal = true;
|
|
121
|
+
// Emit terminal diagnostic if capacity theoretically permitted (i.e. we just push one more)
|
|
122
|
+
this.queue.push({
|
|
123
|
+
type: "diagnostic",
|
|
124
|
+
sequence: this.sequence++,
|
|
125
|
+
diagnostic: {
|
|
126
|
+
code: "E_LIMIT_EVENT_QUEUE",
|
|
127
|
+
severity: "fatal",
|
|
128
|
+
byteOffset: 0, // Event builder doesn't track exact byte offset
|
|
129
|
+
recoverable: false,
|
|
130
|
+
message: "Event queue capacity exceeded",
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
this.pushEmitCount++;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.queue.push(event);
|
|
137
|
+
this.pushEmitCount++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/semantic/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/semantic/events.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/semantic/events.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { JsonValue } from "../types.js";
|
|
2
|
+
import type { GrammarFrame } from "../grammar/frame.js";
|
|
3
|
+
/**
|
|
4
|
+
* Maintains the stable value by processing committed events.
|
|
5
|
+
* Only committed values appear in the stable value.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SnapshotBuilder {
|
|
8
|
+
private root;
|
|
9
|
+
private hasRoot;
|
|
10
|
+
/**
|
|
11
|
+
* Maps each open container's grammar frame to its corresponding node in
|
|
12
|
+
* the stable-value tree, so a newly-opened child container can attach
|
|
13
|
+
* directly to its parent in O(1) via initContainerForFrame() instead of
|
|
14
|
+
* re-parsing a JSON Pointer path string and re-walking from the root on
|
|
15
|
+
* every single container open (see initContainerForFrame).
|
|
16
|
+
*/
|
|
17
|
+
private frameNodes;
|
|
18
|
+
/**
|
|
19
|
+
* Integrate a committed value into the stable value.
|
|
20
|
+
* Takes just `{ path, value }` rather than a full `ValueCommittedEvent` -
|
|
21
|
+
* the only two fields this method has ever read - so its four call sites
|
|
22
|
+
* in parser.ts don't need to fabricate a `sequence`/`type`/`operation`/
|
|
23
|
+
* `byteRange` (already reported separately via the real event emitted to
|
|
24
|
+
* `drainEvents()`) purely to satisfy a wider parameter type.
|
|
25
|
+
*/
|
|
26
|
+
processEvent(event: {
|
|
27
|
+
path: string;
|
|
28
|
+
value: JsonValue;
|
|
29
|
+
}): void;
|
|
30
|
+
/**
|
|
31
|
+
* Initialize the root as an object container.
|
|
32
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
33
|
+
*/
|
|
34
|
+
initRootObject(frame?: GrammarFrame): void;
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the root as an array container.
|
|
37
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
38
|
+
*/
|
|
39
|
+
initRootArray(frame?: GrammarFrame): void;
|
|
40
|
+
/**
|
|
41
|
+
* Initialize a nested container for the given (already-pushed) grammar
|
|
42
|
+
* frame, attaching it directly to its parent's node.
|
|
43
|
+
*
|
|
44
|
+
* Uses frame._parent/_segment (see grammar/frame.ts) plus the frameNodes
|
|
45
|
+
* map instead of re-parsing frame.path and walking the tree from the
|
|
46
|
+
* root on every call — that walk is O(depth), and calling it once for
|
|
47
|
+
* every one of N nested containers made opening N levels cost O(N^2)
|
|
48
|
+
* total, independent of the grammar-stack path-string fix.
|
|
49
|
+
*/
|
|
50
|
+
initContainerForFrame(frame: GrammarFrame, type: "object" | "array"): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get a deep clone of the current stable value.
|
|
53
|
+
*/
|
|
54
|
+
getStableValue(): JsonValue | undefined;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/semantic/snapshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAA0C;IAE5D;;;;;;;OAOG;IACH,YAAY,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI;IA6C7D;;;OAGG;IACH,cAAc,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAQ1C;;;OAGG;IACH,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAQzC;;;;;;;;;OASG;IACH,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI;IA2B1E;;OAEG;IACH,cAAc,IAAI,SAAS,GAAG,SAAS;CASxC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Snapshot builder — constructs stableValue from committed events
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Maintains the stable value by processing committed events.
|
|
6
|
+
* Only committed values appear in the stable value.
|
|
7
|
+
*/
|
|
8
|
+
export class SnapshotBuilder {
|
|
9
|
+
root = undefined;
|
|
10
|
+
hasRoot = false;
|
|
11
|
+
/**
|
|
12
|
+
* Maps each open container's grammar frame to its corresponding node in
|
|
13
|
+
* the stable-value tree, so a newly-opened child container can attach
|
|
14
|
+
* directly to its parent in O(1) via initContainerForFrame() instead of
|
|
15
|
+
* re-parsing a JSON Pointer path string and re-walking from the root on
|
|
16
|
+
* every single container open (see initContainerForFrame).
|
|
17
|
+
*/
|
|
18
|
+
frameNodes = new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Integrate a committed value into the stable value.
|
|
21
|
+
* Takes just `{ path, value }` rather than a full `ValueCommittedEvent` -
|
|
22
|
+
* the only two fields this method has ever read - so its four call sites
|
|
23
|
+
* in parser.ts don't need to fabricate a `sequence`/`type`/`operation`/
|
|
24
|
+
* `byteRange` (already reported separately via the real event emitted to
|
|
25
|
+
* `drainEvents()`) purely to satisfy a wider parameter type.
|
|
26
|
+
*/
|
|
27
|
+
processEvent(event) {
|
|
28
|
+
const { path, value } = event;
|
|
29
|
+
// Parse the JSON Pointer path to navigate to the parent
|
|
30
|
+
const segments = parsePointer(path);
|
|
31
|
+
if (segments.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
// Ensure root exists
|
|
34
|
+
if (!this.hasRoot) {
|
|
35
|
+
// We need a container at root — determine from the first segment
|
|
36
|
+
// This shouldn't happen if events are emitted correctly,
|
|
37
|
+
// because container events come before child value events.
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const parentSegments = segments.slice(0, -1);
|
|
41
|
+
const lastSegment = segments[segments.length - 1];
|
|
42
|
+
if (lastSegment === undefined)
|
|
43
|
+
return;
|
|
44
|
+
let target = this.root;
|
|
45
|
+
for (const seg of parentSegments) {
|
|
46
|
+
if (target === null || target === undefined)
|
|
47
|
+
return;
|
|
48
|
+
if (typeof target === "object" && !Array.isArray(target)) {
|
|
49
|
+
target = target[seg];
|
|
50
|
+
}
|
|
51
|
+
else if (Array.isArray(target)) {
|
|
52
|
+
const idx = parseInt(seg, 10);
|
|
53
|
+
if (isNaN(idx))
|
|
54
|
+
return;
|
|
55
|
+
target = target[idx];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return; // Can't navigate into scalar
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (target === null || target === undefined)
|
|
62
|
+
return;
|
|
63
|
+
if (typeof target === "object" && !Array.isArray(target)) {
|
|
64
|
+
safeSet(target, lastSegment, value);
|
|
65
|
+
}
|
|
66
|
+
else if (Array.isArray(target)) {
|
|
67
|
+
const idx = parseInt(lastSegment, 10);
|
|
68
|
+
if (!isNaN(idx)) {
|
|
69
|
+
target[idx] = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Initialize the root as an object container.
|
|
75
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
76
|
+
*/
|
|
77
|
+
initRootObject(frame) {
|
|
78
|
+
if (!this.hasRoot) {
|
|
79
|
+
this.root = {};
|
|
80
|
+
this.hasRoot = true;
|
|
81
|
+
}
|
|
82
|
+
if (frame)
|
|
83
|
+
this.frameNodes.set(frame, this.root);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Initialize the root as an array container.
|
|
87
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
88
|
+
*/
|
|
89
|
+
initRootArray(frame) {
|
|
90
|
+
if (!this.hasRoot) {
|
|
91
|
+
this.root = [];
|
|
92
|
+
this.hasRoot = true;
|
|
93
|
+
}
|
|
94
|
+
if (frame)
|
|
95
|
+
this.frameNodes.set(frame, this.root);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Initialize a nested container for the given (already-pushed) grammar
|
|
99
|
+
* frame, attaching it directly to its parent's node.
|
|
100
|
+
*
|
|
101
|
+
* Uses frame._parent/_segment (see grammar/frame.ts) plus the frameNodes
|
|
102
|
+
* map instead of re-parsing frame.path and walking the tree from the
|
|
103
|
+
* root on every call — that walk is O(depth), and calling it once for
|
|
104
|
+
* every one of N nested containers made opening N levels cost O(N^2)
|
|
105
|
+
* total, independent of the grammar-stack path-string fix.
|
|
106
|
+
*/
|
|
107
|
+
initContainerForFrame(frame, type) {
|
|
108
|
+
if (!this.hasRoot)
|
|
109
|
+
return;
|
|
110
|
+
const parent = frame._parent;
|
|
111
|
+
const segment = frame._segment;
|
|
112
|
+
if (!parent || segment === null || segment === undefined)
|
|
113
|
+
return;
|
|
114
|
+
const parentNode = this.frameNodes.get(parent);
|
|
115
|
+
if (parentNode === undefined || parentNode === null)
|
|
116
|
+
return;
|
|
117
|
+
const newContainer = type === "object" ? {} : [];
|
|
118
|
+
if (typeof parentNode === "object" && !Array.isArray(parentNode)) {
|
|
119
|
+
safeSet(parentNode, segment, newContainer);
|
|
120
|
+
}
|
|
121
|
+
else if (Array.isArray(parentNode)) {
|
|
122
|
+
const idx = typeof segment === "number" ? segment : parseInt(segment, 10);
|
|
123
|
+
if (!isNaN(idx)) {
|
|
124
|
+
parentNode[idx] = newContainer;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.frameNodes.set(frame, newContainer);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get a deep clone of the current stable value.
|
|
134
|
+
*/
|
|
135
|
+
getStableValue() {
|
|
136
|
+
if (!this.hasRoot)
|
|
137
|
+
return undefined;
|
|
138
|
+
// `root` is only ever assigned `{}` (initRootObject) or `[]`
|
|
139
|
+
// (initRootArray) - never a bare scalar (a root-level scalar bypasses
|
|
140
|
+
// SnapshotBuilder entirely; see parser.ts's rootScalarValue) - so this
|
|
141
|
+
// is always genuinely a container once hasRoot is true, not just an
|
|
142
|
+
// assertion of convenience.
|
|
143
|
+
return deepClone(this.root);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Parse a JSON Pointer string into segments.
|
|
148
|
+
* Handles ~0 (~) and ~1 (/) unescaping.
|
|
149
|
+
*/
|
|
150
|
+
function parsePointer(pointer) {
|
|
151
|
+
if (pointer === "")
|
|
152
|
+
return [];
|
|
153
|
+
if (!pointer.startsWith("/"))
|
|
154
|
+
return [];
|
|
155
|
+
return pointer
|
|
156
|
+
.slice(1)
|
|
157
|
+
.split("/")
|
|
158
|
+
.map((seg) => seg.replace(/~1/g, "/").replace(/~0/g, "~"));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Assign a JSON-derived key onto a plain object without going through the
|
|
162
|
+
* inherited `__proto__` accessor. Bracket assignment (obj[key] = value) on a
|
|
163
|
+
* plain object silently reassigns the object's prototype instead of creating
|
|
164
|
+
* an own property when key === "__proto__", which makes that field vanish
|
|
165
|
+
* from Object.keys()/JSON.stringify(). defineProperty always creates a real
|
|
166
|
+
* own data property, matching native JSON.parse's behavior for such keys.
|
|
167
|
+
*/
|
|
168
|
+
function safeSet(obj, key, value) {
|
|
169
|
+
Object.defineProperty(obj, key, {
|
|
170
|
+
value,
|
|
171
|
+
writable: true,
|
|
172
|
+
enumerable: true,
|
|
173
|
+
configurable: true,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Deep clone a JSON value.
|
|
178
|
+
* Iterative (explicit work-stack) rather than recursive: a recursive
|
|
179
|
+
* implementation overflows the JS call stack around ~5000 levels of nesting,
|
|
180
|
+
* well below values maxDepth's type otherwise permits.
|
|
181
|
+
*/
|
|
182
|
+
function deepClone(value) {
|
|
183
|
+
const root = Array.isArray(value) ? [] : {};
|
|
184
|
+
const stack = [
|
|
185
|
+
{ src: value, dst: root },
|
|
186
|
+
];
|
|
187
|
+
while (stack.length > 0) {
|
|
188
|
+
const frame = stack.pop();
|
|
189
|
+
if (!frame)
|
|
190
|
+
continue;
|
|
191
|
+
const { src, dst } = frame;
|
|
192
|
+
if (Array.isArray(src)) {
|
|
193
|
+
const dstArr = dst;
|
|
194
|
+
for (let i = 0; i < src.length; i++) {
|
|
195
|
+
const child = src[i];
|
|
196
|
+
if (child !== null && typeof child === "object") {
|
|
197
|
+
const childClone = Array.isArray(child) ? [] : {};
|
|
198
|
+
dstArr[i] = childClone;
|
|
199
|
+
stack.push({
|
|
200
|
+
src: child,
|
|
201
|
+
dst: childClone,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
dstArr[i] = child;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
const srcObj = src;
|
|
211
|
+
const dstObj = dst;
|
|
212
|
+
for (const key of Object.keys(srcObj)) {
|
|
213
|
+
const child = srcObj[key];
|
|
214
|
+
if (child !== null && typeof child === "object") {
|
|
215
|
+
const childClone = Array.isArray(child) ? [] : {};
|
|
216
|
+
safeSet(dstObj, key, childClone);
|
|
217
|
+
stack.push({
|
|
218
|
+
src: child,
|
|
219
|
+
dst: childClone,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
safeSet(dstObj, key, child);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return root;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/semantic/snapshot.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAK9E;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,IAAI,GAA0B,SAAS,CAAC;IACxC,OAAO,GAAG,KAAK,CAAC;IAExB;;;;;;OAMG;IACK,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAC;IAE5D;;;;;;;OAOG;IACH,YAAY,CAAC,KAAyC;QACpD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAE9B,wDAAwD;QACxD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,iEAAiE;YACjE,yDAAyD;YACzD,2DAA2D;YAC3D,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO;QAEtC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO;YACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,MAAM,GAAI,MAAqB,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC;oBAAE,OAAO;gBACvB,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,6BAA6B;YACvC,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QAEpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,OAAO,CAAC,MAAoB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,MAAoB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,KAAoB;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAiB,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,KAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAiB,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;;;;OASG;IACH,qBAAqB,CAAC,KAAmB,EAAE,IAAwB;QACjE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAEjE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO;QAE5D,MAAM,YAAY,GAAc,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5D,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,UAAwB,EAAE,OAAiB,EAAE,YAAY,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,GACP,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,UAAwB,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAChD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACpC,6DAA6D;QAC7D,sEAAsE;QACtE,uEAAuE;QACvE,oEAAoE;QACpE,4BAA4B;QAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,IAA8B,CAAC,CAAC;IACxD,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,OAAO,OAAO;SACX,KAAK,CAAC,CAAC,CAAC;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,OAAO,CAAC,GAAe,EAAE,GAAW,EAAE,KAAgB;IAC7D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;QAC9B,KAAK;QACL,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAA6B;IAC9C,MAAM,IAAI,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,KAAK,GAAwE;QACjF,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAA8B,EAAE;KACpD,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QAE3B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAgB,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAc,CAAC;gBAClC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChD,MAAM,UAAU,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC;wBACT,GAAG,EAAE,KAA+B;wBACpC,GAAG,EAAE,UAAoC;qBAC1C,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,GAAiB,CAAC;YACjC,MAAM,MAAM,GAAG,GAAiB,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAc,CAAC;gBACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAChD,MAAM,UAAU,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC;wBACT,GAAG,EAAE,KAA+B;wBACpC,GAAG,EAAE,UAAoC;qBAC1C,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|