@scayle/storefront-devtools 0.2.0-alpha.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/CHANGELOG.md +15 -0
- package/README.md +222 -0
- package/dist/_chunks/clipboard-DrVHc2QA.mjs +61 -0
- package/dist/_chunks/diff-DzJ5arJj.mjs +169 -0
- package/dist/_chunks/panel-uV5ITqhY.mjs +51 -0
- package/dist/_chunks/redact-DmIF-iyk.mjs +96 -0
- package/dist/_chunks/useStore-Db8RZW8T.mjs +10 -0
- package/dist/group.d.ts +42 -0
- package/dist/group.d.ts.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +178 -0
- package/dist/inertia/client/index.d.mts +13 -0
- package/dist/inertia/client/index.d.ts +7 -0
- package/dist/inertia/client/index.d.ts.map +1 -0
- package/dist/inertia/client/index.mjs +694 -0
- package/dist/inertia/core/capture.d.ts +15 -0
- package/dist/inertia/core/capture.d.ts.map +1 -0
- package/dist/inertia/core/correlator.d.ts +91 -0
- package/dist/inertia/core/correlator.d.ts.map +1 -0
- package/dist/inertia/core/diagnostics.d.ts +10 -0
- package/dist/inertia/core/diagnostics.d.ts.map +1 -0
- package/dist/inertia/core/diff.d.ts +33 -0
- package/dist/inertia/core/diff.d.ts.map +1 -0
- package/dist/inertia/core/events-tab.d.ts +20 -0
- package/dist/inertia/core/events-tab.d.ts.map +1 -0
- package/dist/inertia/core/feature-info.d.ts +14 -0
- package/dist/inertia/core/feature-info.d.ts.map +1 -0
- package/dist/inertia/core/features.d.ts +27 -0
- package/dist/inertia/core/features.d.ts.map +1 -0
- package/dist/inertia/core/history-capture.d.ts +15 -0
- package/dist/inertia/core/history-capture.d.ts.map +1 -0
- package/dist/inertia/core/interceptors.d.ts +69 -0
- package/dist/inertia/core/interceptors.d.ts.map +1 -0
- package/dist/inertia/core/markdown.d.ts +10 -0
- package/dist/inertia/core/markdown.d.ts.map +1 -0
- package/dist/inertia/core/network.d.ts +34 -0
- package/dist/inertia/core/network.d.ts.map +1 -0
- package/dist/inertia/core/protocol.d.ts +38 -0
- package/dist/inertia/core/protocol.d.ts.map +1 -0
- package/dist/inertia/core/request-tree.d.ts +18 -0
- package/dist/inertia/core/request-tree.d.ts.map +1 -0
- package/dist/inertia/core/response.d.ts +39 -0
- package/dist/inertia/core/response.d.ts.map +1 -0
- package/dist/inertia/core/session.d.ts +18 -0
- package/dist/inertia/core/session.d.ts.map +1 -0
- package/dist/inertia/core/store.d.ts +40 -0
- package/dist/inertia/core/store.d.ts.map +1 -0
- package/dist/inertia/core/types.d.ts +112 -0
- package/dist/inertia/core/types.d.ts.map +1 -0
- package/dist/inertia/core/url.d.ts +11 -0
- package/dist/inertia/core/url.d.ts.map +1 -0
- package/dist/inertia/plugin.d.ts +11 -0
- package/dist/inertia/plugin.d.ts.map +1 -0
- package/dist/inertia/renderer/index.d.mts +16 -0
- package/dist/inertia/renderer/index.mjs +771 -0
- package/dist/inject.d.ts +12 -0
- package/dist/inject.d.ts.map +1 -0
- package/dist/orpc/client/index.d.mts +13 -0
- package/dist/orpc/client/index.d.ts +7 -0
- package/dist/orpc/client/index.d.ts.map +1 -0
- package/dist/orpc/client/index.mjs +502 -0
- package/dist/orpc/core/capture.d.ts +32 -0
- package/dist/orpc/core/capture.d.ts.map +1 -0
- package/dist/orpc/core/classify.d.ts +14 -0
- package/dist/orpc/core/classify.d.ts.map +1 -0
- package/dist/orpc/core/curl.d.ts +11 -0
- package/dist/orpc/core/curl.d.ts.map +1 -0
- package/dist/orpc/core/markdown.d.ts +12 -0
- package/dist/orpc/core/markdown.d.ts.map +1 -0
- package/dist/orpc/core/orpc-error.d.ts +18 -0
- package/dist/orpc/core/orpc-error.d.ts.map +1 -0
- package/dist/orpc/core/serialize.d.ts +12 -0
- package/dist/orpc/core/serialize.d.ts.map +1 -0
- package/dist/orpc/core/session.d.ts +15 -0
- package/dist/orpc/core/session.d.ts.map +1 -0
- package/dist/orpc/core/store.d.ts +50 -0
- package/dist/orpc/core/store.d.ts.map +1 -0
- package/dist/orpc/core/types.d.ts +67 -0
- package/dist/orpc/core/types.d.ts.map +1 -0
- package/dist/orpc/core/url.d.ts +12 -0
- package/dist/orpc/core/url.d.ts.map +1 -0
- package/dist/orpc/plugin.d.ts +10 -0
- package/dist/orpc/plugin.d.ts.map +1 -0
- package/dist/orpc/renderer/index.d.mts +16 -0
- package/dist/orpc/renderer/index.mjs +457 -0
- package/dist/resource-center/client/index.mjs +21 -0
- package/dist/resource-center/client.d.ts +3 -0
- package/dist/resource-center/client.d.ts.map +1 -0
- package/dist/resource-center/plugin.d.ts +12 -0
- package/dist/resource-center/plugin.d.ts.map +1 -0
- package/dist/shared/clipboard.d.ts +9 -0
- package/dist/shared/clipboard.d.ts.map +1 -0
- package/dist/shared/redact.d.ts +27 -0
- package/dist/shared/redact.d.ts.map +1 -0
- package/dist/shared/safe-clone.d.ts +46 -0
- package/dist/shared/safe-clone.d.ts.map +1 -0
- package/dist/shared/session-storage.d.ts +18 -0
- package/dist/shared/session-storage.d.ts.map +1 -0
- package/dist/shared/use-window-store.d.ts +18 -0
- package/dist/shared/use-window-store.d.ts.map +1 -0
- package/dist/storefront/plugin.d.ts +9 -0
- package/dist/storefront/plugin.d.ts.map +1 -0
- package/dist/storefront/renderer/index.d.mts +16 -0
- package/dist/storefront/renderer/index.mjs +124 -0
- package/dist/vue-devtools/client/index.mjs +4912 -0
- package/dist/vue-devtools/client.d.ts +2 -0
- package/dist/vue-devtools/client.d.ts.map +1 -0
- package/dist/vue-devtools/plugin.d.ts +14 -0
- package/dist/vue-devtools/plugin.d.ts.map +1 -0
- package/dist/vue-devtools/ui/assets/css-8QJvnqUH.js +1 -0
- package/dist/vue-devtools/ui/assets/css-CaJ9TzKE.js +1 -0
- package/dist/vue-devtools/ui/assets/diff-woXpYk--.js +1 -0
- package/dist/vue-devtools/ui/assets/html-BHDw6EPc.js +1 -0
- package/dist/vue-devtools/ui/assets/html-GueGcY0x.js +1 -0
- package/dist/vue-devtools/ui/assets/index-Dby9TIQH.js +156 -0
- package/dist/vue-devtools/ui/assets/index-sSkqWPzY.css +1 -0
- package/dist/vue-devtools/ui/assets/javascript-BzbQS41l.js +1 -0
- package/dist/vue-devtools/ui/assets/javascript-Yelw-5ZN.js +1 -0
- package/dist/vue-devtools/ui/assets/json-B88Oqtu5.js +1 -0
- package/dist/vue-devtools/ui/assets/json-CaljABEy.js +1 -0
- package/dist/vue-devtools/ui/assets/shellscript-CLZ0U2zV.js +1 -0
- package/dist/vue-devtools/ui/assets/typescript-Utq2Cl8c.js +1 -0
- package/dist/vue-devtools/ui/assets/typescript-j_1H8WHN.js +1 -0
- package/dist/vue-devtools/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/vue-devtools/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/vue-devtools/ui/assets/vue-B1Tf5CHw.js +1 -0
- package/dist/vue-devtools/ui/assets/vue-html-CGMs_6qn.js +1 -0
- package/dist/vue-devtools/ui/assets/yaml-rwi0_p6S.js +1 -0
- package/dist/vue-devtools/ui/index.html +13 -0
- package/package.json +101 -0
package/dist/inject.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Vite plugin that prepends side-effect imports and appends a
|
|
4
|
+
* runtime-built `<script>` tag to the client entry module. This is how the
|
|
5
|
+
* devtools package bootstraps every panel's page-context client and the
|
|
6
|
+
* on-page dock launcher without requiring manual edits to app code.
|
|
7
|
+
*
|
|
8
|
+
* @param specifiers - Module specifiers to import (in order) at the top of the client entry.
|
|
9
|
+
* @returns A dev-server-only Vite plugin.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createInjectPlugin(specifiers: string[]): Plugin;
|
|
12
|
+
//# sourceMappingURL=inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../src/inject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAalC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAqB/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export {}
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
/**
|
|
6
|
+
* The in-page oRPC devtools store, set by the injected client bootstrap.
|
|
7
|
+
* Typed as `unknown` because this side-effect entry exposes no API.
|
|
8
|
+
* Consumers `import '@scayle/storefront-devtools/orpc/client'` only to start
|
|
9
|
+
* capture. The dock renderer reads the concrete store off `window`.
|
|
10
|
+
*/
|
|
11
|
+
__STOREFRONT_DEVTOOLS_ORPC_STORE__?: unknown
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/orpc/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAKzC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,kCAAkC,CAAC,EAAE,SAAS,CAAA;KAC/C;CACF"}
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { i as e, n as t, o as n, r, t as i } from "../../_chunks/redact-DmIF-iyk.mjs";
|
|
2
|
+
//#region src/orpc/core/session.ts
|
|
3
|
+
var a = n("orpc-devtools-session");
|
|
4
|
+
function o(e) {
|
|
5
|
+
return {
|
|
6
|
+
id: e.id,
|
|
7
|
+
procedure: e.procedure,
|
|
8
|
+
method: e.method,
|
|
9
|
+
status: e.status,
|
|
10
|
+
duration: e.duration,
|
|
11
|
+
errorKind: e.errorKind
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function s(e) {
|
|
15
|
+
a.save({
|
|
16
|
+
savedAt: Date.now(),
|
|
17
|
+
calls: e.map(o)
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function c() {
|
|
21
|
+
return a.load();
|
|
22
|
+
}
|
|
23
|
+
function l() {
|
|
24
|
+
a.clear();
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/orpc/core/store.ts
|
|
28
|
+
var u = 200, d = { redactKey: t };
|
|
29
|
+
function f(t) {
|
|
30
|
+
return e(t, d);
|
|
31
|
+
}
|
|
32
|
+
function p(t, n) {
|
|
33
|
+
return e(n, { redactKey: i(t) });
|
|
34
|
+
}
|
|
35
|
+
var m = class {
|
|
36
|
+
ordered = [];
|
|
37
|
+
maxCalls;
|
|
38
|
+
nextId = 1;
|
|
39
|
+
_paused = !1;
|
|
40
|
+
subscribers = /* @__PURE__ */ new Set();
|
|
41
|
+
previousSession = null;
|
|
42
|
+
saveTimer;
|
|
43
|
+
constructor(e = u) {
|
|
44
|
+
this.maxCalls = e, this.previousSession = c();
|
|
45
|
+
}
|
|
46
|
+
get calls() {
|
|
47
|
+
return this.ordered.slice();
|
|
48
|
+
}
|
|
49
|
+
get paused() {
|
|
50
|
+
return this._paused;
|
|
51
|
+
}
|
|
52
|
+
get previousSessionCalls() {
|
|
53
|
+
return this.previousSession?.calls ?? [];
|
|
54
|
+
}
|
|
55
|
+
getState() {
|
|
56
|
+
return {
|
|
57
|
+
calls: this.calls,
|
|
58
|
+
paused: this._paused
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
startCall(e) {
|
|
62
|
+
if (this._paused) return -1;
|
|
63
|
+
let t = this.nextId++, n = {
|
|
64
|
+
id: t,
|
|
65
|
+
procedure: e.procedure,
|
|
66
|
+
method: e.method,
|
|
67
|
+
url: e.url,
|
|
68
|
+
input: p(e.procedure, e.input),
|
|
69
|
+
rawInput: p(e.procedure, e.rawInput),
|
|
70
|
+
headers: e.headers ? r(e.headers) : void 0,
|
|
71
|
+
startedAt: performance.now()
|
|
72
|
+
};
|
|
73
|
+
return this.ordered.push(n), this.ordered.length > this.maxCalls && this.evictOldest(), this.notify(), t;
|
|
74
|
+
}
|
|
75
|
+
finishCall(e, t) {
|
|
76
|
+
let n = this.ordered.find((t) => t.id === e);
|
|
77
|
+
n && (n.finishedAt = performance.now(), n.duration = n.finishedAt - n.startedAt, n.status = t.status, n.ok = t.ok, n.output = f(t.output), n.error = f(t.error), n.errorKind = t.errorKind, n.streaming = t.streaming, n.rawOutput = f(t.rawOutput), n.rawError = f(t.rawError), n.responseHeaders = t.responseHeaders, this.notify());
|
|
78
|
+
}
|
|
79
|
+
getProcedureStats() {
|
|
80
|
+
let e = /* @__PURE__ */ new Map();
|
|
81
|
+
for (let t of this.ordered) {
|
|
82
|
+
let n = e.get(t.procedure) ?? {
|
|
83
|
+
count: 0,
|
|
84
|
+
errors: 0,
|
|
85
|
+
total: 0,
|
|
86
|
+
last: 0,
|
|
87
|
+
durations: 0
|
|
88
|
+
};
|
|
89
|
+
n.count++, t.ok === !1 && n.errors++, t.duration != null && (n.total += t.duration, n.durations++, n.last = t.duration), e.set(t.procedure, n);
|
|
90
|
+
}
|
|
91
|
+
let t = [];
|
|
92
|
+
for (let [n, r] of e) t.push({
|
|
93
|
+
procedure: n,
|
|
94
|
+
count: r.count,
|
|
95
|
+
errorCount: r.errors,
|
|
96
|
+
avgDuration: r.durations > 0 ? r.total / r.durations : 0,
|
|
97
|
+
lastDuration: r.last
|
|
98
|
+
});
|
|
99
|
+
return t;
|
|
100
|
+
}
|
|
101
|
+
subscribe(e) {
|
|
102
|
+
return this.subscribers.add(e), () => {
|
|
103
|
+
this.subscribers.delete(e);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
setPaused(e) {
|
|
107
|
+
this._paused = e, this.notify();
|
|
108
|
+
}
|
|
109
|
+
clear() {
|
|
110
|
+
this.ordered = [], this.nextId = 1, l(), this.previousSession = null, this.notify();
|
|
111
|
+
}
|
|
112
|
+
evictOldest() {
|
|
113
|
+
let e = this.ordered.findIndex((e) => e.finishedAt != null);
|
|
114
|
+
e === -1 && (e = 0), this.ordered.splice(e, 1);
|
|
115
|
+
}
|
|
116
|
+
notify() {
|
|
117
|
+
let e = this.getState();
|
|
118
|
+
for (let t of this.subscribers) try {
|
|
119
|
+
t(e);
|
|
120
|
+
} catch (e) {
|
|
121
|
+
console.warn("[storefront-devtools] oRPC subscriber error:", e);
|
|
122
|
+
}
|
|
123
|
+
clearTimeout(this.saveTimer), this.saveTimer = setTimeout(() => s(this.ordered), 1e3);
|
|
124
|
+
}
|
|
125
|
+
}, h = /^\/+/;
|
|
126
|
+
function g(e, t) {
|
|
127
|
+
let n;
|
|
128
|
+
try {
|
|
129
|
+
n = new URL(e, "http://localhost").pathname;
|
|
130
|
+
} catch {
|
|
131
|
+
n = e;
|
|
132
|
+
}
|
|
133
|
+
let r = _(t);
|
|
134
|
+
return n.startsWith(r) ? _(n.slice(r.length).replace(h, "")) : null;
|
|
135
|
+
}
|
|
136
|
+
function _(e) {
|
|
137
|
+
let t = e.length;
|
|
138
|
+
for (; t > 0 && e[t - 1] === "/";) t--;
|
|
139
|
+
return e.slice(0, t);
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/orpc/core/classify.ts
|
|
143
|
+
function v(e) {
|
|
144
|
+
if (typeof e == "object" && e && "code" in e) {
|
|
145
|
+
let t = e.code;
|
|
146
|
+
return typeof t == "string" ? t : void 0;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function y(e, t, n) {
|
|
150
|
+
return n ? "network" : e === 422 || v(t) === "INPUT_VALIDATION_FAILED" ? "validation" : "server";
|
|
151
|
+
}
|
|
152
|
+
function b(e) {
|
|
153
|
+
if (!e || typeof e != "object") return !1;
|
|
154
|
+
let t = Object.getPrototypeOf(e);
|
|
155
|
+
return t === Object.prototype || !t || !t.constructor;
|
|
156
|
+
}
|
|
157
|
+
function x(e, t, n) {
|
|
158
|
+
t === "__proto__" ? Object.defineProperty(e, t, {
|
|
159
|
+
value: n,
|
|
160
|
+
writable: !0,
|
|
161
|
+
enumerable: !0,
|
|
162
|
+
configurable: !0
|
|
163
|
+
}) : e[t] = n;
|
|
164
|
+
}
|
|
165
|
+
function S(e, t, n) {
|
|
166
|
+
let r = e[t];
|
|
167
|
+
if (r !== n) return r;
|
|
168
|
+
let i;
|
|
169
|
+
if (Array.isArray(r)) i = r.slice();
|
|
170
|
+
else if (b(r)) i = { ...r };
|
|
171
|
+
else return r;
|
|
172
|
+
return x(e, t, i), i;
|
|
173
|
+
}
|
|
174
|
+
var C = /^[dgimsuvy]*$/;
|
|
175
|
+
function w(e) {
|
|
176
|
+
return C.test(e) && new Set(e).size === e.length && !(e.includes("u") && e.includes("v"));
|
|
177
|
+
}
|
|
178
|
+
function T(e, t) {
|
|
179
|
+
let n, r = 0, i = () => (n === void 0 && (n = new RegExp(e, t), n.lastIndex = r), n);
|
|
180
|
+
return new Proxy(Object.create(RegExp.prototype), {
|
|
181
|
+
get(e, t) {
|
|
182
|
+
if (t === Symbol.toStringTag) return "RegExp";
|
|
183
|
+
if (n === void 0) {
|
|
184
|
+
if (t === "lastIndex") return r;
|
|
185
|
+
if (!(t in RegExp.prototype)) return;
|
|
186
|
+
}
|
|
187
|
+
let a = i(), o = Reflect.get(a, t, a);
|
|
188
|
+
return typeof o == "function" && t !== "constructor" ? o.bind(a) : o;
|
|
189
|
+
},
|
|
190
|
+
set(e, t, a) {
|
|
191
|
+
if (n === void 0 && t === "lastIndex") return r = a, !0;
|
|
192
|
+
let o = i();
|
|
193
|
+
return Reflect.set(o, t, a, o);
|
|
194
|
+
},
|
|
195
|
+
has(e, t) {
|
|
196
|
+
return n === void 0 ? t === "lastIndex" || t in RegExp.prototype : Reflect.has(n, t);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region ../../../node_modules/.pnpm/@orpc+client@1.15.3_@opentelemetry+api@1.9.1/node_modules/@orpc/client/dist/shared/client.taWlwxQ4.mjs
|
|
202
|
+
var E = {
|
|
203
|
+
BIGINT: 0,
|
|
204
|
+
DATE: 1,
|
|
205
|
+
NAN: 2,
|
|
206
|
+
UNDEFINED: 3,
|
|
207
|
+
URL: 4,
|
|
208
|
+
REGEXP: 5,
|
|
209
|
+
SET: 6,
|
|
210
|
+
MAP: 7
|
|
211
|
+
}, D = new Set(Object.values(E)), O = /^\/(.*)\/([a-z]*)$/;
|
|
212
|
+
function k(e) {
|
|
213
|
+
return /* @__PURE__ */ TypeError(`Invalid RPC serialized data: ${e}`);
|
|
214
|
+
}
|
|
215
|
+
function A(e, t, n) {
|
|
216
|
+
return k(`type ${e} (${t}) expects ${n}.`);
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/orpc/core/serialize.ts
|
|
220
|
+
var j = new class {
|
|
221
|
+
customSerializers;
|
|
222
|
+
constructor(e = {}) {
|
|
223
|
+
if (this.customSerializers = e.customJsonSerializers ?? [], this.customSerializers.length !== new Set(this.customSerializers.map((e) => e.type)).size) throw Error("Custom serializer type must be unique.");
|
|
224
|
+
}
|
|
225
|
+
serialize(e, t = [], n = [], r = [], i = []) {
|
|
226
|
+
for (let a of this.customSerializers) if (a.condition(e)) {
|
|
227
|
+
let o = this.serialize(a.serialize(e), t, n, r, i);
|
|
228
|
+
return n.push([a.type, ...t]), o;
|
|
229
|
+
}
|
|
230
|
+
if (e instanceof Blob) return r.push(t), i.push(e), [
|
|
231
|
+
e,
|
|
232
|
+
n,
|
|
233
|
+
r,
|
|
234
|
+
i
|
|
235
|
+
];
|
|
236
|
+
if (typeof e == "bigint") return n.push([E.BIGINT, ...t]), [
|
|
237
|
+
e.toString(),
|
|
238
|
+
n,
|
|
239
|
+
r,
|
|
240
|
+
i
|
|
241
|
+
];
|
|
242
|
+
if (e instanceof Date) return n.push([E.DATE, ...t]), Number.isNaN(e.getTime()) ? [
|
|
243
|
+
null,
|
|
244
|
+
n,
|
|
245
|
+
r,
|
|
246
|
+
i
|
|
247
|
+
] : [
|
|
248
|
+
e.toISOString(),
|
|
249
|
+
n,
|
|
250
|
+
r,
|
|
251
|
+
i
|
|
252
|
+
];
|
|
253
|
+
if (Number.isNaN(e)) return n.push([E.NAN, ...t]), [
|
|
254
|
+
null,
|
|
255
|
+
n,
|
|
256
|
+
r,
|
|
257
|
+
i
|
|
258
|
+
];
|
|
259
|
+
if (e instanceof URL) return n.push([E.URL, ...t]), [
|
|
260
|
+
e.toString(),
|
|
261
|
+
n,
|
|
262
|
+
r,
|
|
263
|
+
i
|
|
264
|
+
];
|
|
265
|
+
if (e instanceof RegExp) return n.push([E.REGEXP, ...t]), [
|
|
266
|
+
e.toString(),
|
|
267
|
+
n,
|
|
268
|
+
r,
|
|
269
|
+
i
|
|
270
|
+
];
|
|
271
|
+
if (e instanceof Set) {
|
|
272
|
+
let a = this.serialize(Array.from(e), t, n, r, i);
|
|
273
|
+
return n.push([E.SET, ...t]), a;
|
|
274
|
+
}
|
|
275
|
+
if (e instanceof Map) {
|
|
276
|
+
let a = this.serialize(Array.from(e.entries()), t, n, r, i);
|
|
277
|
+
return n.push([E.MAP, ...t]), a;
|
|
278
|
+
}
|
|
279
|
+
if (Array.isArray(e)) return [
|
|
280
|
+
e.map((e, a) => e === void 0 ? (n.push([
|
|
281
|
+
E.UNDEFINED,
|
|
282
|
+
...t,
|
|
283
|
+
a
|
|
284
|
+
]), null) : this.serialize(e, [...t, a], n, r, i)[0]),
|
|
285
|
+
n,
|
|
286
|
+
r,
|
|
287
|
+
i
|
|
288
|
+
];
|
|
289
|
+
if (b(e)) {
|
|
290
|
+
let a = {};
|
|
291
|
+
for (let o in e) (o !== "toJSON" || typeof e[o] != "function") && (a[o] = this.serialize(e[o], [...t, o], n, r, i)[0]);
|
|
292
|
+
return [
|
|
293
|
+
a,
|
|
294
|
+
n,
|
|
295
|
+
r,
|
|
296
|
+
i
|
|
297
|
+
];
|
|
298
|
+
}
|
|
299
|
+
return [
|
|
300
|
+
e,
|
|
301
|
+
n,
|
|
302
|
+
r,
|
|
303
|
+
i
|
|
304
|
+
];
|
|
305
|
+
}
|
|
306
|
+
deserialize(e, t, n, r) {
|
|
307
|
+
let i = { data: e }, a = { data: e };
|
|
308
|
+
n && r && n.forEach((e, t) => {
|
|
309
|
+
let n = a, o = i, s = "data";
|
|
310
|
+
e.forEach((e) => {
|
|
311
|
+
if (n = n[s], o = S(o, s, n), s = e, !Object.hasOwn(o, s)) throw k(`segment "${s}" does not exist.`);
|
|
312
|
+
}), o[s] = r(t);
|
|
313
|
+
});
|
|
314
|
+
for (let e of t) {
|
|
315
|
+
let t = e[0], n = this.customSerializers.find((e) => e.type === t);
|
|
316
|
+
if (n === void 0 && !D.has(t)) continue;
|
|
317
|
+
let r = a, o = i, s = "data";
|
|
318
|
+
for (let t = 1; t < e.length; t++) if (r = r[s], o = S(o, s, r), s = e[t], !Object.hasOwn(o, s)) throw k(`segment "${s}" does not exist.`);
|
|
319
|
+
if (n !== void 0) {
|
|
320
|
+
o[s] = n.deserialize(o[s]);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
let c = o[s];
|
|
324
|
+
switch (t) {
|
|
325
|
+
case E.BIGINT:
|
|
326
|
+
if (typeof c != "string") throw A(t, "bigint", "a string");
|
|
327
|
+
o[s] = BigInt(c);
|
|
328
|
+
break;
|
|
329
|
+
case E.DATE:
|
|
330
|
+
if (typeof c != "string" && c !== null) throw A(t, "date", "a string or null");
|
|
331
|
+
o[s] = new Date(c ?? NaN);
|
|
332
|
+
break;
|
|
333
|
+
case E.NAN:
|
|
334
|
+
if (c !== null) throw A(t, "nan", "null");
|
|
335
|
+
o[s] = NaN;
|
|
336
|
+
break;
|
|
337
|
+
case E.UNDEFINED:
|
|
338
|
+
if (c !== null) throw A(t, "undefined", "null");
|
|
339
|
+
o[s] = void 0;
|
|
340
|
+
break;
|
|
341
|
+
case E.URL:
|
|
342
|
+
if (typeof c != "string") throw A(t, "url", "a string");
|
|
343
|
+
o[s] = new URL(c);
|
|
344
|
+
break;
|
|
345
|
+
case E.REGEXP: {
|
|
346
|
+
if (typeof c != "string") throw A(t, "regexp", "a string");
|
|
347
|
+
let e = c.match(O);
|
|
348
|
+
if (e === null || !w(e[2])) throw k(`type ${t} (regexp) expects a "/pattern/flags" string.`);
|
|
349
|
+
o[s] = T(e[1], e[2]);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case E.SET:
|
|
353
|
+
if (!Array.isArray(c)) throw A(t, "set", "an array");
|
|
354
|
+
o[s] = new Set(c);
|
|
355
|
+
break;
|
|
356
|
+
case E.MAP:
|
|
357
|
+
if (!Array.isArray(c)) throw A(t, "map", "an array");
|
|
358
|
+
o[s] = new Map(c);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return i.data;
|
|
362
|
+
}
|
|
363
|
+
}();
|
|
364
|
+
function M(e) {
|
|
365
|
+
return typeof e == "object" && !!e && "json" in e && "meta" in e && Array.isArray(e.meta);
|
|
366
|
+
}
|
|
367
|
+
function N(e) {
|
|
368
|
+
if (!M(e)) return e;
|
|
369
|
+
try {
|
|
370
|
+
return j.deserialize(e.json, e.meta);
|
|
371
|
+
} catch {
|
|
372
|
+
return e;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//#endregion
|
|
376
|
+
//#region src/orpc/core/capture.ts
|
|
377
|
+
function P(e, t) {
|
|
378
|
+
return typeof e == "string" ? {
|
|
379
|
+
url: e,
|
|
380
|
+
method: t?.method ?? "GET"
|
|
381
|
+
} : e instanceof URL ? {
|
|
382
|
+
url: e.toString(),
|
|
383
|
+
method: t?.method ?? "GET"
|
|
384
|
+
} : {
|
|
385
|
+
url: e.url,
|
|
386
|
+
method: e.method ?? t?.method ?? "GET"
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function F(e, t) {
|
|
390
|
+
let n = e instanceof Request ? e.headers : t?.headers;
|
|
391
|
+
return Object.fromEntries(Array.from(new Headers(n ?? {}), ([e, t]) => [e.toLowerCase(), t]));
|
|
392
|
+
}
|
|
393
|
+
function I(e) {
|
|
394
|
+
return Object.fromEntries([
|
|
395
|
+
"cache-control",
|
|
396
|
+
"age",
|
|
397
|
+
"x-cache",
|
|
398
|
+
"x-cache-status",
|
|
399
|
+
"etag",
|
|
400
|
+
"last-modified",
|
|
401
|
+
"expires",
|
|
402
|
+
"vary",
|
|
403
|
+
"content-type"
|
|
404
|
+
].map((t) => [t, e.get(t)]).filter((e) => e[1] !== null));
|
|
405
|
+
}
|
|
406
|
+
async function L(e, t) {
|
|
407
|
+
try {
|
|
408
|
+
let n;
|
|
409
|
+
return e instanceof Request ? n = await e.clone().text() : typeof t?.body == "string" && (n = t.body), n ? JSON.parse(n) : void 0;
|
|
410
|
+
} catch {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
async function R(e) {
|
|
415
|
+
if (e.headers.get("content-type")?.includes("text/event-stream")) return {
|
|
416
|
+
body: void 0,
|
|
417
|
+
streaming: !0
|
|
418
|
+
};
|
|
419
|
+
try {
|
|
420
|
+
let t = await e.clone().text();
|
|
421
|
+
try {
|
|
422
|
+
return {
|
|
423
|
+
body: JSON.parse(t),
|
|
424
|
+
streaming: !1
|
|
425
|
+
};
|
|
426
|
+
} catch {
|
|
427
|
+
return {
|
|
428
|
+
body: t,
|
|
429
|
+
streaming: !1
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
} catch {
|
|
433
|
+
return {
|
|
434
|
+
body: void 0,
|
|
435
|
+
streaming: !1
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
async function z(e, t, n, r) {
|
|
440
|
+
try {
|
|
441
|
+
let { url: i, method: a } = P(e, t), o = g(i, r);
|
|
442
|
+
if (o !== null && o !== "spec.json" && o !== "docs") {
|
|
443
|
+
let r = await L(e, t);
|
|
444
|
+
return n.startCall({
|
|
445
|
+
procedure: o,
|
|
446
|
+
method: a,
|
|
447
|
+
url: i,
|
|
448
|
+
input: N(r),
|
|
449
|
+
rawInput: r,
|
|
450
|
+
headers: F(e, t)
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
} catch {}
|
|
454
|
+
return -1;
|
|
455
|
+
}
|
|
456
|
+
function B(e, t, n, r, i) {
|
|
457
|
+
if (e !== -1) try {
|
|
458
|
+
let a = t.ok, o = N(r);
|
|
459
|
+
n.finishCall(e, {
|
|
460
|
+
status: t.status,
|
|
461
|
+
ok: a,
|
|
462
|
+
output: a ? o : void 0,
|
|
463
|
+
rawOutput: a ? r : void 0,
|
|
464
|
+
error: a ? void 0 : o,
|
|
465
|
+
rawError: a ? void 0 : r,
|
|
466
|
+
errorKind: a ? void 0 : y(t.status, o, !1),
|
|
467
|
+
streaming: i,
|
|
468
|
+
responseHeaders: I(t.headers)
|
|
469
|
+
});
|
|
470
|
+
} catch {}
|
|
471
|
+
}
|
|
472
|
+
function V(e, t) {
|
|
473
|
+
if (typeof window > "u") return () => {};
|
|
474
|
+
let n = window.fetch.bind(window);
|
|
475
|
+
return window.fetch = async (r, i) => {
|
|
476
|
+
let a = await z(r, i, e, t);
|
|
477
|
+
try {
|
|
478
|
+
let t = await n(r, i);
|
|
479
|
+
if (a !== -1) {
|
|
480
|
+
let { body: n, streaming: r } = await R(t);
|
|
481
|
+
B(a, t, e, n, r);
|
|
482
|
+
}
|
|
483
|
+
return t;
|
|
484
|
+
} catch (t) {
|
|
485
|
+
throw a !== -1 && e.finishCall(a, {
|
|
486
|
+
ok: !1,
|
|
487
|
+
error: t,
|
|
488
|
+
errorKind: y(void 0, void 0, !0)
|
|
489
|
+
}), t;
|
|
490
|
+
}
|
|
491
|
+
}, () => {
|
|
492
|
+
window.fetch = n;
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
//#endregion
|
|
496
|
+
//#region src/orpc/client/index.ts
|
|
497
|
+
var H = "/api";
|
|
498
|
+
if (typeof window < "u" && typeof document < "u" && !window.__STOREFRONT_DEVTOOLS_ORPC_STORE__) {
|
|
499
|
+
let e = new m();
|
|
500
|
+
window.__STOREFRONT_DEVTOOLS_ORPC_STORE__ = e, V(e, H);
|
|
501
|
+
}
|
|
502
|
+
//#endregion
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { OrpcStore } from './store';
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes fetch request headers to a lowercased record, from a `Headers`
|
|
4
|
+
* instance, a plain object, or an entries array. Records the headers a captured
|
|
5
|
+
* oRPC call sent (for example the shop-country header).
|
|
6
|
+
*
|
|
7
|
+
* @param input - The fetch input; a `Request` carries its own headers.
|
|
8
|
+
* @param init - The fetch init, whose `headers` apply for non-`Request` input.
|
|
9
|
+
* @returns A lowercased header record. Empty when no headers are present.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readHeaders(input: RequestInfo | URL, init: RequestInit | undefined): Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Reads an allowlist of cache-relevant response headers into a lowercased
|
|
14
|
+
* record. Only known non-secret cache headers are kept, so tenant auth or
|
|
15
|
+
* cookie response headers are never captured.
|
|
16
|
+
*
|
|
17
|
+
* @param headers - The response `Headers`.
|
|
18
|
+
* @returns A lowercased record of the allowlisted headers present.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readResponseHeaders(headers: Headers): Record<string, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Patches `window.fetch` to record oRPC calls into the store. Only requests
|
|
23
|
+
* whose path begins with `prefix` are recorded; every other fetch passes
|
|
24
|
+
* through untouched. The original response and any rejection always propagate
|
|
25
|
+
* unchanged, so the devtools can never alter the host app's behavior.
|
|
26
|
+
*
|
|
27
|
+
* @param store - The store that receives captured calls.
|
|
28
|
+
* @param prefix - The oRPC endpoint prefix, for example `/api`.
|
|
29
|
+
* @returns A teardown function that restores the original fetch.
|
|
30
|
+
*/
|
|
31
|
+
export declare function startOrpcCapture(store: OrpcStore, prefix: string): () => void;
|
|
32
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAmBxC;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB5E;AAqGD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAkC7E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OrpcErrorKind } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Classifies an oRPC failure as a validation, server, or network error so the
|
|
4
|
+
* panel can color and label it. A thrown fetch (no response) is a network
|
|
5
|
+
* error; a 422 or an `INPUT_VALIDATION_FAILED` body is a validation error;
|
|
6
|
+
* anything else is a server error.
|
|
7
|
+
*
|
|
8
|
+
* @param status - HTTP status, or undefined when the fetch threw.
|
|
9
|
+
* @param body - Parsed response body, which may carry an ORPCError `code`.
|
|
10
|
+
* @param threw - True when fetch itself rejected before a response arrived.
|
|
11
|
+
* @returns The error classification.
|
|
12
|
+
*/
|
|
13
|
+
export declare function classifyError(status: number | undefined, body: unknown, threw: boolean): OrpcErrorKind;
|
|
14
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/classify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAU5C;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,aAAa,CAQf"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OrpcCall } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a reproducible curl command for an oRPC call, for pasting into a
|
|
4
|
+
* terminal, an issue, or a chat to replay the request.
|
|
5
|
+
*
|
|
6
|
+
* @param call - The captured call.
|
|
7
|
+
* @returns A single-line curl command. The `-d` body is omitted when the call
|
|
8
|
+
* carried no input.
|
|
9
|
+
*/
|
|
10
|
+
export declare function toCurl(call: OrpcCall): string;
|
|
11
|
+
//# sourceMappingURL=curl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curl.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/curl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAOvC;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAO7C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { OrpcCall } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Formats an oRPC call as markdown for pasting into AI chats, issues, or chat.
|
|
4
|
+
* Includes the input, output or error, and captured headers so the exact
|
|
5
|
+
* request and response are inspectable.
|
|
6
|
+
*
|
|
7
|
+
* @param call - The captured call to format.
|
|
8
|
+
* @returns A markdown document with header, input, output/error, and header
|
|
9
|
+
* sections. Sections whose source is absent are omitted.
|
|
10
|
+
*/
|
|
11
|
+
export declare function callToMarkdown(call: OrpcCall): string;
|
|
12
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAuCvC;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAsBrD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** The fields of an oRPC `ORPCError`, pulled out for labeled display. */
|
|
2
|
+
export interface OrpcErrorView {
|
|
3
|
+
code: string;
|
|
4
|
+
status?: number;
|
|
5
|
+
message?: string;
|
|
6
|
+
data?: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extracts the `ORPCError` fields from a decoded error value for labeled
|
|
10
|
+
* display. Returns `null` when the value is not an oRPC error shape (for
|
|
11
|
+
* example a thrown network error or a plain string), so the caller can fall
|
|
12
|
+
* back to the raw error tree.
|
|
13
|
+
*
|
|
14
|
+
* @param error - The decoded error value from a failed call.
|
|
15
|
+
* @returns The error fields, or `null` when the value is not an `ORPCError`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseOrpcError(error: unknown): OrpcErrorView | null;
|
|
18
|
+
//# sourceMappingURL=orpc-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orpc-error.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/orpc-error.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAenE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decodes an oRPC RPC payload, reconstructing the structured types (Date,
|
|
3
|
+
* BigInt, Map, Set, and so on) that the `{ json, meta }` wire envelope encodes.
|
|
4
|
+
* Values that are not an envelope, and envelopes that fail to deserialize, are
|
|
5
|
+
* returned unchanged so capture can never throw.
|
|
6
|
+
*
|
|
7
|
+
* @param value - The parsed request or response body.
|
|
8
|
+
* @returns The decoded value, or the input unchanged when it is not a
|
|
9
|
+
* well-formed RPC envelope.
|
|
10
|
+
*/
|
|
11
|
+
export declare function decodeRpcPayload(value: unknown): unknown;
|
|
12
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/serialize.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYxD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OrpcCall, OrpcCallSummary, OrpcSnapshot } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a full call to its compact session summary.
|
|
4
|
+
*
|
|
5
|
+
* @param call - The captured call to summarize.
|
|
6
|
+
* @returns The call's id, procedure, method, status, duration, and error kind.
|
|
7
|
+
*/
|
|
8
|
+
export declare function summarizeCall(call: OrpcCall): OrpcCallSummary;
|
|
9
|
+
/** Saves the current calls to sessionStorage as compact summaries. */
|
|
10
|
+
export declare function saveSession(calls: OrpcCall[]): void;
|
|
11
|
+
/** Loads the previous session; returns null if expired or missing. */
|
|
12
|
+
export declare function loadSession(): OrpcSnapshot | null;
|
|
13
|
+
/** Clears the persisted session. */
|
|
14
|
+
export declare function clearSession(): void;
|
|
15
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/orpc/core/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAItE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,CAS7D;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAEnD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,IAAI,YAAY,GAAG,IAAI,CAEjD;AAED,oCAAoC;AACpC,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
|